diff options
author | murphy <murphy@rubychan.de> | 2009-10-19 17:39:28 +0000 |
---|---|---|
committer | murphy <murphy@rubychan.de> | 2009-10-19 17:39:28 +0000 |
commit | 87783c60d93caa75fc8cd117e5d9cb9be0a558f3 (patch) | |
tree | 2476af94630886747d5f93816ec38b5a3c1ab58a | |
parent | 9eba0c7decb383e3ef73a3fee375e725442cde56 (diff) | |
download | coderay-87783c60d93caa75fc8cd117e5d9cb9be0a558f3.tar.gz |
Updating C scanner:
* Ruby 1.9 warnings (yeah, it's really a pain)
* added DIRECTIVES
* fixed a bug that highlighted // as an operator (bah!)
* accept $ in variable names
* accept intLL literals
* recover silently from :include_expected on unexpected tokens
-rw-r--r-- | lib/coderay/scanners/c.rb | 34 | ||||
-rw-r--r-- | test/scanners/c/elvis.expected.raydebug | 1 | ||||
-rw-r--r-- | test/scanners/c/elvis.in.c | 1 | ||||
-rw-r--r-- | test/scanners/c/ruby.expected.raydebug | 96308 | ||||
-rw-r--r-- | test/scanners/c/ruby.in.c | 96308 | ||||
-rw-r--r-- | test/scanners/c/strange.expected.raydebug | 2 |
6 files changed, 192639 insertions, 15 deletions
diff --git a/lib/coderay/scanners/c.rb b/lib/coderay/scanners/c.rb index 9ec81ce..f175204 100644 --- a/lib/coderay/scanners/c.rb +++ b/lib/coderay/scanners/c.rb @@ -9,17 +9,14 @@ module Scanners file_extension 'c' RESERVED_WORDS = [ - 'asm', 'break', 'case', 'continue', 'default', 'do', 'else', - 'for', 'goto', 'if', 'return', 'switch', 'while', - 'struct', 'union', 'enum', 'typedef', - 'static', 'register', 'auto', 'extern', - 'sizeof', - 'volatile', 'const', # C89 - 'inline', 'restrict', # C99 + 'asm', 'break', 'case', 'continue', 'default', 'do', + 'else', 'enum', 'for', 'goto', 'if', 'return', + 'sizeof', 'struct', 'switch', 'typedef', 'union', 'while', + 'restrict', # C99 ] PREDEFINED_TYPES = [ - 'int', 'long', 'short', 'char', 'void', + 'int', 'long', 'short', 'char', 'signed', 'unsigned', 'float', 'double', 'bool', 'complex', # C99 ] @@ -28,13 +25,19 @@ module Scanners 'EOF', 'NULL', 'true', 'false', # C99 ] + DIRECTIVES = [ + 'auto', 'extern', 'register', 'static', 'void', + 'const', 'volatile', # C89 + 'inline', # C99 + ] IDENT_KIND = WordList.new(:ident). add(RESERVED_WORDS, :reserved). add(PREDEFINED_TYPES, :pre_type). + add(DIRECTIVES, :directive). add(PREDEFINED_CONSTANTS, :pre_constant) - ESCAPE = / [rbfnrtv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x + ESCAPE = / [rbfntv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x def scan_tokens tokens, options @@ -60,16 +63,19 @@ module Scanners match << scan_until(/ ^\# (?:elif|else|endif) .*? $ | \z /xm) unless eos? kind = :comment - elsif scan(/ [-+*\/=<>?:;,!&^|()\[\]{}~%]+ | \.(?!\d) /x) + elsif scan(/ [-+*=<>?:;,!&^|()\[\]{}~%]+ | \/=? | \.(?!\d) /x) kind = :operator elsif match = scan(/ [A-Za-z_][A-Za-z_0-9]* /x) kind = IDENT_KIND[match] if kind == :ident and check(/:(?!:)/) - match << scan(/:/) + # FIXME: don't match a?b:c kind = :label end + elsif scan(/\$/) + kind = :ident + elsif match = scan(/L?"/) tokens << [:open, :string] if match[0] == ?L @@ -92,7 +98,7 @@ module Scanners elsif scan(/(?:0[0-7]+)(?![89.eEfF])/) kind = :oct - elsif scan(/(?:\d+)(?![.eEfF])/) + elsif scan(/(?:\d+)(?![.eEfF])L?L?/) kind = :integer elsif scan(/\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/) @@ -132,8 +138,8 @@ module Scanners state = :initial if match.index ?\n else - getch - kind = :error + state = :initial + next end diff --git a/test/scanners/c/elvis.expected.raydebug b/test/scanners/c/elvis.expected.raydebug new file mode 100644 index 0000000..1f4f583 --- /dev/null +++ b/test/scanners/c/elvis.expected.raydebug @@ -0,0 +1 @@ +ident(this)operator(?)ident(is)operator(+)ident(no)operator(:)ident(label) diff --git a/test/scanners/c/elvis.in.c b/test/scanners/c/elvis.in.c new file mode 100644 index 0000000..e23f86e --- /dev/null +++ b/test/scanners/c/elvis.in.c @@ -0,0 +1 @@ +this?is+no:label diff --git a/test/scanners/c/ruby.expected.raydebug b/test/scanners/c/ruby.expected.raydebug new file mode 100644 index 0000000..cccd3e2 --- /dev/null +++ b/test/scanners/c/ruby.expected.raydebug @@ -0,0 +1,96308 @@ +comment(/********************************************************************** + + array.c - + + $Author: shyouhei $ + $Date: 2009-02-05 00:55:01 +0100 (Thu, 05 Feb 2009\) $ + created at: Fri Aug 6 09:46:12 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("util.h") +preprocessor(#include) include("st.h") + +ident(VALUE) ident(rb_cArray)operator(;) +directive(static) ident(ID) ident(id_cmp)operator(;) + +preprocessor(#define) ident(ARY_DEFAULT_SIZE) integer(16) +preprocessor(#define) ident(ARY_MAX_SIZE) operator(()ident(LONG_MAX) operator(/) reserved(sizeof)operator(()ident(VALUE)operator(\)\)) + +directive(void) +ident(rb_mem_clear)operator(()ident(mem)operator(,) ident(size)operator(\)) + directive(register) ident(VALUE) operator(*)ident(mem)operator(;) + directive(register) pre_type(long) ident(size)operator(;) +operator({) + reserved(while) operator(()ident(size)operator(--\)) operator({) + operator(*)ident(mem)operator(++) operator(=) ident(Qnil)operator(;) + operator(}) +operator(}) + +directive(static) directive(inline) directive(void) +ident(memfill)operator(()ident(mem)operator(,) ident(size)operator(,) ident(val)operator(\)) + directive(register) ident(VALUE) operator(*)ident(mem)operator(;) + directive(register) pre_type(long) ident(size)operator(;) + directive(register) ident(VALUE) ident(val)operator(;) +operator({) + reserved(while) operator(()ident(size)operator(--\)) operator({) + operator(*)ident(mem)operator(++) operator(=) ident(val)operator(;) + operator(}) +operator(}) + +preprocessor(#define) ident(ARY_TMPLOCK) ident(FL_USER1) + +directive(static) directive(inline) directive(void) +ident(rb_ary_modify_check)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(ary)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(array)delimiter(")>operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(ary)operator(,) ident(ARY_TMPLOCK)operator(\)\)) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(can't modify array during iteration)delimiter(")>operator(\);) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(ary)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify array)delimiter(")>operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_ary_modify)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) operator(*)ident(ptr)operator(;) + + ident(rb_ary_modify_check)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(ary)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + ident(ptr) operator(=) ident(ALLOC_N)operator(()ident(VALUE)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + ident(FL_UNSET)operator(()ident(ary)operator(,) ident(ELTS_SHARED)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + ident(MEMCPY)operator(()ident(ptr)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(=) ident(ptr)operator(;) + operator(}) +operator(}) + +ident(VALUE) +ident(rb_ary_freeze)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(rb_obj_freeze)operator(()ident(ary)operator(\);) +operator(}) + +comment(/* + * call-seq: + * array.frozen? -> true or false + * + * Return <code>true</code> if this array is frozen (or temporarily frozen + * while being sorted\). + */) + +directive(static) ident(VALUE) +ident(rb_ary_frozen_p)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(ary)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(FL_TEST)operator(()ident(ary)operator(,) ident(ARY_TMPLOCK)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(ary_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(ary_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(ary)operator(,) reserved(struct) ident(RArray)operator(\);) + ident(OBJSETUP)operator(()ident(ary)operator(,) ident(klass)operator(,) ident(T_ARRAY)operator(\);) + + ident(ary)operator(->)ident(len) operator(=) integer(0)operator(;) + ident(ary)operator(->)ident(ptr) operator(=) integer(0)operator(;) + ident(ary)operator(->)ident(aux)operator(.)ident(capa) operator(=) integer(0)operator(;) + + reserved(return) operator(()ident(VALUE)operator(\))ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(ary_new)operator(()ident(klass)operator(,) ident(len)operator(\)) + ident(VALUE) ident(klass)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(ary_alloc)operator(()ident(klass)operator(\);) + + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative array size (or size too big\))delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(len) operator(>) ident(ARY_MAX_SIZE)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(array size too big)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) ident(len)operator(++;) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(=) ident(ALLOC_N)operator(()ident(VALUE)operator(,) ident(len)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(len)operator(;) + + reserved(return) ident(ary)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ary_new2)operator(()ident(len)operator(\)) + pre_type(long) ident(len)operator(;) +operator({) + reserved(return) ident(ary_new)operator(()ident(rb_cArray)operator(,) ident(len)operator(\);) +operator(}) + + +ident(VALUE) +ident(rb_ary_new)operator((\)) +operator({) + reserved(return) ident(rb_ary_new2)operator(()ident(ARY_DEFAULT_SIZE)operator(\);) +operator(}) + +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(#include) include(<stdarg.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(,)ident(b)operator(\)) +preprocessor(#else) +preprocessor(#include) include(<varargs.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(\)) +preprocessor(#endif) + +ident(VALUE) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_ary_new3)operator(()pre_type(long) ident(n)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_ary_new3)operator(()ident(n)operator(,) ident(va_alist)operator(\)) + pre_type(long) ident(n)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(va_list) ident(ar)operator(;) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(i)operator(;) + + ident(ary) operator(=) ident(rb_ary_new2)operator(()ident(n)operator(\);) + + ident(va_init_list)operator(()ident(ar)operator(,) ident(n)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(n)operator(;) ident(i)operator(++\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(va_arg)operator(()ident(ar)operator(,) ident(VALUE)operator(\);) + operator(}) + ident(va_end)operator(()ident(ar)operator(\);) + + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(n)operator(;) + reserved(return) ident(ary)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ary_new4)operator(()ident(n)operator(,) ident(elts)operator(\)) + pre_type(long) ident(n)operator(;) + directive(const) ident(VALUE) operator(*)ident(elts)operator(;) +operator({) + ident(VALUE) ident(ary)operator(;) + + ident(ary) operator(=) ident(rb_ary_new2)operator(()ident(n)operator(\);) + reserved(if) operator(()ident(n) operator(>) integer(0) operator(&&) ident(elts)operator(\)) operator({) + ident(MEMCPY)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(elts)operator(,) ident(VALUE)operator(,) ident(n)operator(\);) + operator(}) + + comment(/* This assignment to len will be moved to the above "if" block in Ruby 1.9 */) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(n)operator(;) + + reserved(return) ident(ary)operator(;) +operator(}) + +ident(VALUE) +ident(rb_assoc_new)operator(()ident(car)operator(,) ident(cdr)operator(\)) + ident(VALUE) ident(car)operator(,) ident(cdr)operator(;) +operator({) + ident(VALUE) ident(ary)operator(;) + + ident(ary) operator(=) ident(rb_ary_new2)operator(()integer(2)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(=) ident(car)operator(;) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)integer(1)operator(]) operator(=) ident(cdr)operator(;) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) integer(2)operator(;) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(to_ary)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(rb_convert_type)operator(()ident(ary)operator(,) ident(T_ARRAY)operator(,) string<delimiter(")content(Array)delimiter(")>operator(,) string<delimiter(")content(to_ary)delimiter(")>operator(\);) +operator(}) + +ident(VALUE) +ident(rb_check_array_type)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(rb_check_convert_type)operator(()ident(ary)operator(,) ident(T_ARRAY)operator(,) string<delimiter(")content(Array)delimiter(")>operator(,) string<delimiter(")content(to_ary)delimiter(")>operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(rb_ary_replace) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) + +comment(/* + * call-seq: + * Array.new(size=0, obj=nil\) + * Array.new(array\) + * Array.new(size\) {|index| block } + * + * Returns a new array. In the first form, the new array is + * empty. In the second it is created with _size_ copies of _obj_ + * (that is, _size_ references to the same + * _obj_\). The third form creates a copy of the array + * passed as a parameter (the array is generated by calling + * to_ary on the parameter\). In the last form, an array + * of the given size is created. Each element in this array is + * calculated by passing the element's index to the given block and + * storing the return value. + * + * Array.new + * Array.new(2\) + * Array.new(5, "A"\) + * + * # only one copy of the object is created + * a = Array.new(2, Hash.new\) + * a[0]['cat'] = 'feline' + * a + * a[1]['cat'] = 'Felix' + * a + * + * # here multiple copies are created + * a = Array.new(2\) { Hash.new } + * a[0]['cat'] = 'feline' + * a + * + * squares = Array.new(5\) {|i| i*i} + * squares + * + * copy = Array.new(squares\) + */) + +directive(static) ident(VALUE) +ident(rb_ary_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(len)operator(;) + ident(VALUE) ident(size)operator(,) ident(val)operator(;) + + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(02)delimiter(")>operator(,) operator(&)ident(size)operator(,) operator(&)ident(val)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(given block not used)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(ary)operator(;) + operator(}) + + reserved(if) operator(()ident(argc) operator(==) integer(1) operator(&&) operator(!)ident(FIXNUM_P)operator(()ident(size)operator(\)\)) operator({) + ident(val) operator(=) ident(rb_check_array_type)operator(()ident(size)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + ident(rb_ary_replace)operator(()ident(ary)operator(,) ident(val)operator(\);) + reserved(return) ident(ary)operator(;) + operator(}) + operator(}) + + ident(len) operator(=) ident(NUM2LONG)operator(()ident(size)operator(\);) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative array size)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(len) operator(>) ident(ARY_MAX_SIZE)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(array size too big)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(len) operator(>) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(\)) operator({) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(len)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(len)operator(;) + operator(}) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(block supersedes default value argument)delimiter(")>operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_store)operator(()ident(ary)operator(,) ident(i)operator(,) ident(rb_yield)operator(()ident(LONG2NUM)operator(()ident(i)operator(\)\)\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(i) operator(+) integer(1)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(memfill)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(len)operator(,) ident(val)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(len)operator(;) + operator(}) + + reserved(return) ident(ary)operator(;) +operator(}) + + +comment(/* +* Returns a new array populated with the given objects. +* +* Array.[]( 1, 'a', /^A/ \) +* Array[ 1, 'a', /^A/ ] +* [ 1, 'a', /^A/ ] +*/) + +directive(static) ident(VALUE) +ident(rb_ary_s_create)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(ary_alloc)operator(()ident(klass)operator(\);) + + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(=) ident(ALLOC_N)operator(()ident(VALUE)operator(,) ident(argc)operator(\);) + ident(MEMCPY)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(argv)operator(,) ident(VALUE)operator(,) ident(argc)operator(\);) + operator(}) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(argc)operator(;) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(void) +ident(rb_ary_store)operator(()ident(ary)operator(,) ident(idx)operator(,) ident(val)operator(\)) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(idx)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(if) operator(()ident(idx) operator(<) integer(0)operator(\)) operator({) + ident(idx) operator(+=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(idx) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %ld out of array)delimiter(")>operator(,) + ident(idx) operator(-) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(idx) operator(>=) ident(ARY_MAX_SIZE)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %ld too big)delimiter(")>operator(,) ident(idx)operator(\);) + operator(}) + + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(idx) operator(>=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(\)) operator({) + pre_type(long) ident(new_capa) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(/) integer(2)operator(;) + + reserved(if) operator(()ident(new_capa) operator(<) ident(ARY_DEFAULT_SIZE)operator(\)) operator({) + ident(new_capa) operator(=) ident(ARY_DEFAULT_SIZE)operator(;) + operator(}) + reserved(if) operator(()ident(new_capa) operator(>=) ident(ARY_MAX_SIZE) operator(-) ident(idx)operator(\)) operator({) + ident(new_capa) operator(=) operator(()ident(ARY_MAX_SIZE) operator(-) ident(idx)operator(\)) operator(/) integer(2)operator(;) + operator(}) + ident(new_capa) operator(+=) ident(idx)operator(;) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(new_capa)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(new_capa)operator(;) + operator(}) + reserved(if) operator(()ident(idx) operator(>) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_mem_clear)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) + ident(idx)operator(-)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(+) integer(1)operator(\);) + operator(}) + + reserved(if) operator(()ident(idx) operator(>=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(idx) operator(+) integer(1)operator(;) + operator(}) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(idx)operator(]) operator(=) ident(val)operator(;) +operator(}) + +comment(/* + * call-seq: + * array << obj -> array + * + * Append---Pushes the given object on to the end of this array. This + * expression returns the array itself, so several appends + * may be chained together. + * + * [ 1, 2 ] << "c" << "d" << [ 3, 4 ] + * #=> [ 1, 2, "c", "d", [ 3, 4 ] ] + * + */) + +ident(VALUE) +ident(rb_ary_push)operator(()ident(ary)operator(,) ident(item)operator(\)) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) ident(item)operator(;) +operator({) + ident(rb_ary_store)operator(()ident(ary)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) ident(item)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.push(obj, ... \) -> array + * + * Append---Pushes the given object(s\) on to the end of this array. This + * expression returns the array itself, so several appends + * may be chained together. + * + * a = [ "a", "b", "c" ] + * a.push("d", "e", "f"\) + * #=> ["a", "b", "c", "d", "e", "f"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_push_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(while) operator(()ident(argc)operator(--\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) operator(*)ident(argv)operator(++\);) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.pop -> obj or nil + * + * Removes the last element from <i>self</i> and returns it, or + * <code>nil</code> if the array is empty. + * + * a = [ "a", "m", "z" ] + * a.pop #=> "z" + * a #=> ["a", "m"] + */) + +ident(VALUE) +ident(rb_ary_pop)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(rb_ary_modify_check)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(ary)operator(,) ident(ELTS_SHARED)operator(\)) operator(&&) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(*) integer(2) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(&&) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(>) ident(ARY_DEFAULT_SIZE)operator(\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(*) integer(2)operator(;) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(\);) + operator(}) + reserved(return) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([--)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(];) +operator(}) + +directive(static) ident(VALUE) +ident(ary_make_shared)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(ary)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + ident(NEWOBJ)operator(()ident(shared)operator(,) reserved(struct) ident(RArray)operator(\);) + ident(OBJSETUP)operator(()ident(shared)operator(,) ident(rb_cArray)operator(,) ident(T_ARRAY)operator(\);) + + ident(shared)operator(->)ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + ident(shared)operator(->)ident(ptr) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(;) + ident(shared)operator(->)ident(aux)operator(.)ident(capa) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(;) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) operator(()ident(VALUE)operator(\))ident(shared)operator(;) + ident(FL_SET)operator(()ident(ary)operator(,) ident(ELTS_SHARED)operator(\);) + ident(OBJ_FREEZE)operator(()ident(shared)operator(\);) + reserved(return) operator(()ident(VALUE)operator(\))ident(shared)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(shared)operator(;) + operator(}) +operator(}) + +comment(/* + * call-seq: + * array.shift -> obj or nil + * + * Returns the first element of <i>self</i> and removes it (shifting all + * other elements down by one\). Returns <code>nil</code> if the array + * is empty. + * + * args = [ "-m", "-q", "filename" ] + * args.shift #=> "-m" + * args #=> ["-q", "filename"] + */) + +ident(VALUE) +ident(rb_ary_shift)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(top)operator(;) + + ident(rb_ary_modify_check)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(top) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + reserved(if) operator(()ident(RARRAY_LEN)operator(()ident(ary)operator(\)) operator(<) ident(ARY_DEFAULT_SIZE) operator(&&) operator(!)ident(FL_TEST)operator(()ident(ary)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + ident(MEMMOVE)operator(()ident(RARRAY_PTR)operator(()ident(ary)operator(\),) ident(RARRAY_PTR)operator(()ident(ary)operator(\)+)integer(1)operator(,) ident(VALUE)operator(,) ident(RARRAY_LEN)operator(()ident(ary)operator(\)-)integer(1)operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(ary)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(=) ident(Qnil)operator(;) + operator(}) + ident(ary_make_shared)operator(()ident(ary)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(++;) comment(/* shift ptr */) + operator(}) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(--;) + + reserved(return) ident(top)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ary_unshift)operator(()ident(ary)operator(,) ident(item)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(item)operator(;) +operator({) + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(\)) operator({) + pre_type(long) ident(capa_inc) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(/) integer(2)operator(;) + reserved(if) operator(()ident(capa_inc) operator(<) ident(ARY_DEFAULT_SIZE)operator(\)) operator({) + ident(capa_inc) operator(=) ident(ARY_DEFAULT_SIZE)operator(;) + operator(}) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(+=) ident(capa_inc)operator(;) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(\);) + operator(}) + + comment(/* sliding items */) + ident(MEMMOVE)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) integer(1)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(++;) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(=) ident(item)operator(;) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.unshift(obj, ...\) -> array + * + * Prepends objects to the front of <i>array</i>. + * other elements up one. + * + * a = [ "b", "c", "d" ] + * a.unshift("a"\) #=> ["a", "b", "c", "d"] + * a.unshift(1, 2\) #=> [ 1, 2, "a", "b", "c", "d"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_unshift_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) reserved(return) ident(ary)operator(;) + + comment(/* make rooms by setting the last item */) + ident(rb_ary_store)operator(()ident(ary)operator(,) ident(len) operator(+) ident(argc) operator(-) integer(1)operator(,) ident(Qnil)operator(\);) + + comment(/* sliding items */) + ident(MEMMOVE)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) ident(argc)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(len)operator(\);) + ident(MEMCPY)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(argv)operator(,) ident(VALUE)operator(,) ident(argc)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* faster version - use this if you don't need to treat negative offset */) +directive(static) directive(inline) ident(VALUE) +ident(rb_ary_elt)operator(()ident(ary)operator(,) ident(offset)operator(\)) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(offset)operator(;) +operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(offset) operator(<) integer(0) operator(||) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(<=) ident(offset)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(offset)operator(];) +operator(}) + +ident(VALUE) +ident(rb_ary_entry)operator(()ident(ary)operator(,) ident(offset)operator(\)) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(offset)operator(;) +operator({) + reserved(if) operator(()ident(offset) operator(<) integer(0)operator(\)) operator({) + ident(offset) operator(+=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + operator(}) + reserved(return) ident(rb_ary_elt)operator(()ident(ary)operator(,) ident(offset)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_ary_subseq)operator(()ident(ary)operator(,) ident(beg)operator(,) ident(len)operator(\)) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(beg)operator(,) ident(len)operator(;) +operator({) + ident(VALUE) ident(klass)operator(,) ident(ary2)operator(,) ident(shared)operator(;) + ident(VALUE) operator(*)ident(ptr)operator(;) + + reserved(if) operator(()ident(beg) operator(>) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(beg) operator(<) integer(0) operator(||) ident(len) operator(<) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(<) ident(len) operator(||) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(<) ident(beg) operator(+) ident(len)operator(\)) operator({) + ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(-) ident(beg)operator(;) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) + ident(len) operator(=) integer(0)operator(;) + operator(}) + ident(klass) operator(=) ident(rb_obj_class)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(ary_new)operator(()ident(klass)operator(,) integer(0)operator(\);) + + ident(shared) operator(=) ident(ary_make_shared)operator(()ident(ary)operator(\);) + ident(ptr) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(;) + ident(ary2) operator(=) ident(ary_alloc)operator(()ident(klass)operator(\);) + ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(ptr) operator(=) ident(ptr) operator(+) ident(beg)operator(;) + ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len) operator(=) ident(len)operator(;) + ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) ident(shared)operator(;) + ident(FL_SET)operator(()ident(ary2)operator(,) ident(ELTS_SHARED)operator(\);) + + reserved(return) ident(ary2)operator(;) +operator(}) + +comment(/* + * call-seq: + * array[index] -> obj or nil + * array[start, length] -> an_array or nil + * array[range] -> an_array or nil + * array.slice(index\) -> obj or nil + * array.slice(start, length\) -> an_array or nil + * array.slice(range\) -> an_array or nil + * + * Element Reference---Returns the element at _index_, + * or returns a subarray starting at _start_ and + * continuing for _length_ elements, or returns a subarray + * specified by _range_. + * Negative indices count backward from the end of the + * array (-1 is the last element\). Returns nil if the index + * (or starting index\) are out of range. + * + * a = [ "a", "b", "c", "d", "e" ] + * a[2] + a[0] + a[1] #=> "cab" + * a[6] #=> nil + * a[1, 2] #=> [ "b", "c" ] + * a[1..3] #=> [ "b", "c", "d" ] + * a[4..7] #=> [ "e" ] + * a[6..10] #=> nil + * a[-3, 3] #=> [ "c", "d", "e" ] + * # special cases + * a[5] #=> nil + * a[5, 1] #=> [] + * a[5..10] #=> [] + * + */) + +ident(VALUE) +ident(rb_ary_aref)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(arg)operator(;) + pre_type(long) ident(beg)operator(,) ident(len)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + reserved(if) operator(()ident(SYMBOL_P)operator(()ident(argv)operator([)integer(0)operator(]\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(Symbol as array index)delimiter(")>operator(\);) + operator(}) + ident(beg) operator(=) ident(NUM2LONG)operator(()ident(argv)operator([)integer(0)operator(]\);) + ident(len) operator(=) ident(NUM2LONG)operator(()ident(argv)operator([)integer(1)operator(]\);) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(+=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + operator(}) + reserved(return) ident(rb_ary_subseq)operator(()ident(ary)operator(,) ident(beg)operator(,) ident(len)operator(\);) + operator(}) + reserved(if) operator(()ident(argc) operator(!=) integer(1)operator(\)) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + ident(arg) operator(=) ident(argv)operator([)integer(0)operator(];) + comment(/* special case - speeding up */) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(arg)operator(\)\)) operator({) + reserved(return) ident(rb_ary_entry)operator(()ident(ary)operator(,) ident(FIX2LONG)operator(()ident(arg)operator(\)\);) + operator(}) + reserved(if) operator(()ident(SYMBOL_P)operator(()ident(arg)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(Symbol as array index)delimiter(")>operator(\);) + operator(}) + comment(/* check if idx is Range */) + reserved(switch) operator(()ident(rb_range_beg_len)operator(()ident(arg)operator(,) operator(&)ident(beg)operator(,) operator(&)ident(len)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) integer(0)operator(\)\)) operator({) + reserved(case) label(Qfalse)operator(:) + reserved(break)operator(;) + reserved(case) label(Qnil)operator(:) + reserved(return) ident(Qnil)operator(;) + reserved(default)operator(:) + reserved(return) ident(rb_ary_subseq)operator(()ident(ary)operator(,) ident(beg)operator(,) ident(len)operator(\);) + operator(}) + reserved(return) ident(rb_ary_entry)operator(()ident(ary)operator(,) ident(NUM2LONG)operator(()ident(arg)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * array.at(index\) -> obj or nil + * + * Returns the element at _index_. A + * negative index counts from the end of _self_. Returns +nil+ + * if the index is out of range. See also <code>Array#[]</code>. + * (<code>Array#at</code> is slightly faster than <code>Array#[]</code>, + * as it does not accept ranges and so on.\) + * + * a = [ "a", "b", "c", "d", "e" ] + * a.at(0\) #=> "a" + * a.at(-1\) #=> "e" + */) + +directive(static) ident(VALUE) +ident(rb_ary_at)operator(()ident(ary)operator(,) ident(pos)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(pos)operator(;) +operator({) + reserved(return) ident(rb_ary_entry)operator(()ident(ary)operator(,) ident(NUM2LONG)operator(()ident(pos)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * array.first -> obj or nil + * array.first(n\) -> an_array + * + * Returns the first element, or the first +n+ elements, of the array. + * If the array is empty, the first form returns <code>nil</code>, and the + * second form returns an empty array. + * + * a = [ "q", "r", "s", "t" ] + * a.first #=> "q" + * a.first(1\) #=> ["q"] + * a.first(3\) #=> ["q", "r", "s"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_first)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(nv)operator(,) ident(result)operator(;) + pre_type(long) ident(n)operator(,) ident(i)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(nv)operator(\);) + ident(n) operator(=) ident(NUM2LONG)operator(()ident(nv)operator(\);) + reserved(if) operator(()ident(n) operator(>) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) ident(n) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + ident(result) operator(=) ident(rb_ary_new2)operator(()ident(n)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(n)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + reserved(return) ident(result)operator(;) + operator(}) +operator(}) + +comment(/* + * call-seq: + * array.last -> obj or nil + * array.last(n\) -> an_array + * + * Returns the last element(s\) of <i>self</i>. If the array is empty, + * the first form returns <code>nil</code>. + * + * [ "w", "x", "y", "z" ].last #=> "z" + */) + +directive(static) ident(VALUE) +ident(rb_ary_last)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(-)integer(1)operator(];) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(nv)operator(,) ident(result)operator(;) + pre_type(long) ident(n)operator(,) ident(i)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(nv)operator(\);) + ident(n) operator(=) ident(NUM2LONG)operator(()ident(nv)operator(\);) + reserved(if) operator(()ident(n) operator(>) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) ident(n) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + ident(result) operator(=) ident(rb_ary_new2)operator(()ident(n)operator(\);) + reserved(for) operator(()ident(i)operator(=)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(-)ident(n)operator(;) ident(n)operator(--;) ident(i)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + reserved(return) ident(result)operator(;) + operator(}) +operator(}) + +comment(/* + * call-seq: + * array.fetch(index\) -> obj + * array.fetch(index, default \) -> obj + * array.fetch(index\) {|index| block } -> obj + * + * Tries to return the element at position <i>index</i>. If the index + * lies outside the array, the first form throws an + * <code>IndexError</code> exception, the second form returns + * <i>default</i>, and the third form returns the value of invoking + * the block, passing in the index. Negative values of <i>index</i> + * count from the end of the array. + * + * a = [ 11, 22, 33, 44 ] + * a.fetch(1\) #=> 22 + * a.fetch(-1\) #=> 44 + * a.fetch(4, 'cat'\) #=> "cat" + * a.fetch(4\) { |i| i*i } #=> 16 + */) + +directive(static) ident(VALUE) +ident(rb_ary_fetch)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(pos)operator(,) ident(ifnone)operator(;) + pre_type(long) ident(block_given)operator(;) + pre_type(long) ident(idx)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(pos)operator(,) operator(&)ident(ifnone)operator(\);) + ident(block_given) operator(=) ident(rb_block_given_p)operator((\);) + reserved(if) operator(()ident(block_given) operator(&&) ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(block supersedes default value argument)delimiter(")>operator(\);) + operator(}) + ident(idx) operator(=) ident(NUM2LONG)operator(()ident(pos)operator(\);) + + reserved(if) operator(()ident(idx) operator(<) integer(0)operator(\)) operator({) + ident(idx) operator(+=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + operator(}) + reserved(if) operator(()ident(idx) operator(<) integer(0) operator(||) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(<=) ident(idx)operator(\)) operator({) + reserved(if) operator(()ident(block_given)operator(\)) reserved(return) ident(rb_yield)operator(()ident(pos)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %ld out of array)delimiter(")>operator(,) ident(idx)operator(\);) + operator(}) + reserved(return) ident(ifnone)operator(;) + operator(}) + reserved(return) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(idx)operator(];) +operator(}) + +comment(/* + * call-seq: + * array.index(obj\) -> int or nil + * + * Returns the index of the first object in <i>self</i> such that is + * <code>==</code> to <i>obj</i>. Returns <code>nil</code> if + * no match is found. + * + * a = [ "a", "b", "c" ] + * a.index("b"\) #=> 1 + * a.index("z"\) #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_ary_index)operator(()ident(ary)operator(,) ident(val)operator(\)) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(rb_equal)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(val)operator(\)\)) + reserved(return) ident(LONG2NUM)operator(()ident(i)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.rindex(obj\) -> int or nil + * + * Returns the index of the last object in <i>array</i> + * <code>==</code> to <i>obj</i>. Returns <code>nil</code> if + * no match is found. + * + * a = [ "a", "b", "b", "b", "c" ] + * a.rindex("b"\) #=> 3 + * a.rindex("z"\) #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_ary_rindex)operator(()ident(ary)operator(,) ident(val)operator(\)) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(long) ident(i) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + + reserved(while) operator(()ident(i)operator(--\)) operator({) + reserved(if) operator(()ident(i) operator(>) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) operator({) + ident(i) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator(()ident(rb_equal)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(val)operator(\)\)) + reserved(return) ident(LONG2NUM)operator(()ident(i)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.indexes( i1, i2, ... iN \) -> an_array + * array.indices( i1, i2, ... iN \) -> an_array + * + * Deprecated; use <code>Array#values_at</code>. + */) + +directive(static) ident(VALUE) +ident(rb_ary_indexes)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(new_ary)operator(;) + pre_type(long) ident(i)operator(;) + + ident(rb_warn)operator(()string<delimiter(")content(Array#%s is deprecated; use Array#values_at)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(rb_frame_last_func)operator((\)\)\);) + ident(new_ary) operator(=) ident(rb_ary_new2)operator(()ident(argc)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(new_ary)operator(,) ident(rb_ary_aref)operator(()integer(1)operator(,) ident(argv)operator(+)ident(i)operator(,) ident(ary)operator(\)\);) + operator(}) + + reserved(return) ident(new_ary)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ary_to_ary)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(obj)operator(\)) operator(==) ident(T_ARRAY)operator(\)) operator({) + reserved(return) ident(obj)operator(;) + operator(}) + reserved(if) operator(()ident(rb_respond_to)operator(()ident(obj)operator(,) ident(rb_intern)operator(()string<delimiter(")content(to_ary)delimiter(")>operator(\)\)\)) operator({) + reserved(return) ident(rb_convert_type)operator(()ident(obj)operator(,) ident(T_ARRAY)operator(,) string<delimiter(")content(Array)delimiter(")>operator(,) string<delimiter(")content(to_ary)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(obj)operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_ary_splice)operator(()ident(ary)operator(,) ident(beg)operator(,) ident(len)operator(,) ident(rpl)operator(\)) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(beg)operator(,) ident(len)operator(;) + ident(VALUE) ident(rpl)operator(;) +operator({) + pre_type(long) ident(rlen)operator(;) + + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(negative length (%ld\))delimiter(")>operator(,) ident(len)operator(\);) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(+=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(-=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %ld out of array)delimiter(")>operator(,) ident(beg)operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(<) ident(len) operator(||) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(<) ident(beg) operator(+) ident(len)operator(\)) operator({) + ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(-) ident(beg)operator(;) + operator(}) + + reserved(if) operator(()ident(NIL_P)operator(()ident(rpl)operator(\)\)) operator({) + ident(rlen) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(rpl) operator(=) ident(rb_ary_to_ary)operator(()ident(rpl)operator(\);) + ident(rlen) operator(=) ident(RARRAY)operator(()ident(rpl)operator(\)->)ident(len)operator(;) + operator(}) + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + + reserved(if) operator(()ident(beg) operator(>=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) operator({) + reserved(if) operator(()ident(beg) operator(>) ident(ARY_MAX_SIZE) operator(-) ident(rlen)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %ld too big)delimiter(")>operator(,) ident(beg)operator(\);) + operator(}) + ident(len) operator(=) ident(beg) operator(+) ident(rlen)operator(;) + reserved(if) operator(()ident(len) operator(>=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(\)) operator({) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(len)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(len)operator(;) + operator(}) + ident(rb_mem_clear)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) ident(beg) operator(-) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + reserved(if) operator(()ident(rlen) operator(>) integer(0)operator(\)) operator({) + ident(MEMCPY)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) ident(beg)operator(,) ident(RARRAY)operator(()ident(rpl)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(rlen)operator(\);) + operator(}) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(len)operator(;) + operator(}) + reserved(else) operator({) + pre_type(long) ident(alen)operator(;) + + reserved(if) operator(()ident(beg) operator(+) ident(len) operator(>) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) operator({) + ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(-) ident(beg)operator(;) + operator(}) + + ident(alen) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(+) ident(rlen) operator(-) ident(len)operator(;) + reserved(if) operator(()ident(alen) operator(>=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(\)) operator({) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(alen)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(alen)operator(;) + operator(}) + + reserved(if) operator(()ident(len) operator(!=) ident(rlen)operator(\)) operator({) + ident(MEMMOVE)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) ident(beg) operator(+) ident(rlen)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) ident(beg) operator(+) ident(len)operator(,) + ident(VALUE)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(-) operator(()ident(beg) operator(+) ident(len)operator(\)\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(alen)operator(;) + operator(}) + reserved(if) operator(()ident(rlen) operator(>) integer(0)operator(\)) operator({) + ident(MEMMOVE)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) ident(beg)operator(,) ident(RARRAY)operator(()ident(rpl)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(rlen)operator(\);) + operator(}) + operator(}) +operator(}) + +comment(/* + * call-seq: + * array[index] = obj -> obj + * array[start, length] = obj or an_array or nil -> obj or an_array or nil + * array[range] = obj or an_array or nil -> obj or an_array or nil + * + * Element Assignment---Sets the element at _index_, + * or replaces a subarray starting at _start_ and + * continuing for _length_ elements, or replaces a subarray + * specified by _range_. If indices are greater than + * the current capacity of the array, the array grows + * automatically. A negative indices will count backward + * from the end of the array. Inserts elements if _length_ is + * zero. If +nil+ is used in the second and third form, + * deletes elements from _self_. An +IndexError+ is raised if a + * negative index points past the beginning of the array. See also + * <code>Array#push</code>, and <code>Array#unshift</code>. + * + * a = Array.new + * a[4] = "4"; #=> [nil, nil, nil, nil, "4"] + * a[0, 3] = [ 'a', 'b', 'c' ] #=> ["a", "b", "c", nil, "4"] + * a[1..2] = [ 1, 2 ] #=> ["a", 1, 2, nil, "4"] + * a[0, 2] = "?" #=> ["?", 2, nil, "4"] + * a[0..2] = "A" #=> ["A", "4"] + * a[-1] = "Z" #=> ["A", "Z"] + * a[1..-1] = nil #=> ["A"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_aset)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(offset)operator(,) ident(beg)operator(,) ident(len)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(3)operator(\)) operator({) + reserved(if) operator(()ident(SYMBOL_P)operator(()ident(argv)operator([)integer(0)operator(]\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(Symbol as array index)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(SYMBOL_P)operator(()ident(argv)operator([)integer(1)operator(]\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(Symbol as subarray length)delimiter(")>operator(\);) + operator(}) + ident(rb_ary_splice)operator(()ident(ary)operator(,) ident(NUM2LONG)operator(()ident(argv)operator([)integer(0)operator(]\),) ident(NUM2LONG)operator(()ident(argv)operator([)integer(1)operator(]\),) ident(argv)operator([)integer(2)operator(]\);) + reserved(return) ident(argv)operator([)integer(2)operator(];) + operator(}) + reserved(if) operator(()ident(argc) operator(!=) integer(2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 2\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(argv)operator([)integer(0)operator(]\)\)) operator({) + ident(offset) operator(=) ident(FIX2LONG)operator(()ident(argv)operator([)integer(0)operator(]\);) + reserved(goto) ident(fixnum)operator(;) + operator(}) + reserved(if) operator(()ident(SYMBOL_P)operator(()ident(argv)operator([)integer(0)operator(]\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(Symbol as array index)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(rb_range_beg_len)operator(()ident(argv)operator([)integer(0)operator(],) operator(&)ident(beg)operator(,) operator(&)ident(len)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) integer(1)operator(\)\)) operator({) + comment(/* check if idx is Range */) + ident(rb_ary_splice)operator(()ident(ary)operator(,) ident(beg)operator(,) ident(len)operator(,) ident(argv)operator([)integer(1)operator(]\);) + reserved(return) ident(argv)operator([)integer(1)operator(];) + operator(}) + + ident(offset) operator(=) ident(NUM2LONG)operator(()ident(argv)operator([)integer(0)operator(]\);) +label(fixnum)operator(:) + ident(rb_ary_store)operator(()ident(ary)operator(,) ident(offset)operator(,) ident(argv)operator([)integer(1)operator(]\);) + reserved(return) ident(argv)operator([)integer(1)operator(];) +operator(}) + +comment(/* + * call-seq: + * array.insert(index, obj...\) -> array + * + * Inserts the given values before the element with the given index + * (which may be negative\). + * + * a = %w{ a b c d } + * a.insert(2, 99\) #=> ["a", "b", 99, "c", "d"] + * a.insert(-2, 1, 2, 3\) #=> ["a", "b", 99, "c", 1, 2, 3, "d"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_insert)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(pos)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) reserved(return) ident(ary)operator(;) + reserved(if) operator(()ident(argc) operator(<) integer(1)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (at least 1\))delimiter(")>operator(\);) + operator(}) + ident(pos) operator(=) ident(NUM2LONG)operator(()ident(argv)operator([)integer(0)operator(]\);) + reserved(if) operator(()ident(pos) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(pos) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + operator(}) + reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(pos)operator(++;) + operator(}) + ident(rb_ary_splice)operator(()ident(ary)operator(,) ident(pos)operator(,) integer(0)operator(,) ident(rb_ary_new4)operator(()ident(argc) operator(-) integer(1)operator(,) ident(argv) operator(+) integer(1)operator(\)\);) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.each {|item| block } -> array + * + * Calls <i>block</i> once for each element in <i>self</i>, passing that + * element as a parameter. + * + * a = [ "a", "b", "c" ] + * a.each {|x| print x, " -- " } + * + * produces: + * + * a -- b -- c -- + */) + +ident(VALUE) +ident(rb_ary_each)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.each_index {|index| block } -> array + * + * Same as <code>Array#each</code>, but passes the index of the element + * instead of the element itself. + * + * a = [ "a", "b", "c" ] + * a.each_index {|x| print x, " -- " } + * + * produces: + * + * 0 -- 1 -- 2 -- + */) + +directive(static) ident(VALUE) +ident(rb_ary_each_index)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(LONG2NUM)operator(()ident(i)operator(\)\);) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.reverse_each {|item| block } + * + * Same as <code>Array#each</code>, but traverses <i>self</i> in reverse + * order. + * + * a = [ "a", "b", "c" ] + * a.reverse_each {|x| print x, " " } + * + * produces: + * + * c b a + */) + +directive(static) ident(VALUE) +ident(rb_ary_reverse_each)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(rb_yield)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(len)operator(]\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(<) ident(len)operator(\)) operator({) + ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + operator(}) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.length -> int + * + * Returns the number of elements in <i>self</i>. May be zero. + * + * [ 1, 2, 3, 4, 5 ].length #=> 5 + */) + +directive(static) ident(VALUE) +ident(rb_ary_length)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(LONG2NUM)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) +operator(}) + +comment(/* + * call-seq: + * array.empty? -> true or false + * + * Returns <code>true</code> if <i>self</i> array contains no elements. + * + * [].empty? #=> true + */) + +directive(static) ident(VALUE) +ident(rb_ary_empty_p)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ary_dup)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(dup) operator(=) ident(rb_ary_new2)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + + ident(DUPSETUP)operator(()ident(dup)operator(,) ident(ary)operator(\);) + ident(MEMCPY)operator(()ident(RARRAY)operator(()ident(dup)operator(\)->)ident(ptr)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + ident(RARRAY)operator(()ident(dup)operator(\)->)ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + reserved(return) ident(dup)operator(;) +operator(}) + +directive(extern) ident(VALUE) ident(rb_output_fs)operator(;) + +directive(static) ident(VALUE) +ident(inspect_join)operator(()ident(ary)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) operator(*)ident(arg)operator(;) +operator({) + reserved(return) ident(rb_ary_join)operator(()ident(arg)operator([)integer(0)operator(],) ident(arg)operator([)integer(1)operator(]\);) +operator(}) + +ident(VALUE) +ident(rb_ary_join)operator(()ident(ary)operator(,) ident(sep)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(sep)operator(;) +operator({) + pre_type(long) ident(len) operator(=) integer(1)operator(,) ident(i)operator(;) + pre_type(int) ident(taint) operator(=) ident(Qfalse)operator(;) + ident(VALUE) ident(result)operator(,) ident(tmp)operator(;) + + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(ary)operator(\)) operator(||) ident(OBJ_TAINTED)operator(()ident(sep)operator(\)\)) ident(taint) operator(=) ident(Qtrue)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(tmp) operator(=) ident(rb_check_string_type)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + ident(len) operator(+=) ident(NIL_P)operator(()ident(tmp)operator(\)) operator(?) integer(10) operator(:) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(len)operator(;) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(sep)operator(\)\)) operator({) + ident(StringValue)operator(()ident(sep)operator(\);) + ident(len) operator(+=) ident(RSTRING)operator(()ident(sep)operator(\)->)ident(len) operator(*) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(-) integer(1)operator(\);) + operator(}) + ident(result) operator(=) ident(rb_str_buf_new)operator(()ident(len)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(tmp) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + reserved(switch) operator(()ident(TYPE)operator(()ident(tmp)operator(\)\)) operator({) + reserved(case) label(T_STRING)operator(:) + reserved(break)operator(;) + reserved(case) label(T_ARRAY)operator(:) + reserved(if) operator(()ident(tmp) operator(==) ident(ary) operator(||) ident(rb_inspecting_p)operator(()ident(tmp)operator(\)\)) operator({) + ident(tmp) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content([...])delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(args)operator([)integer(2)operator(];) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(tmp)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(sep)operator(;) + ident(tmp) operator(=) ident(rb_protect_inspect)operator(()ident(inspect_join)operator(,) ident(ary)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(\);) + operator(}) + reserved(break)operator(;) + reserved(default)operator(:) + ident(tmp) operator(=) ident(rb_obj_as_string)operator(()ident(tmp)operator(\);) + operator(}) + reserved(if) operator(()ident(i) operator(>) integer(0) operator(&&) operator(!)ident(NIL_P)operator(()ident(sep)operator(\)\)) + ident(rb_str_buf_append)operator(()ident(result)operator(,) ident(sep)operator(\);) + ident(rb_str_buf_append)operator(()ident(result)operator(,) ident(tmp)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(tmp)operator(\)\)) ident(taint) operator(=) ident(Qtrue)operator(;) + operator(}) + + reserved(if) operator(()ident(taint)operator(\)) ident(OBJ_TAINT)operator(()ident(result)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.join(sep=$,\) -> str + * + * Returns a string created by converting each element of the array to + * a string, separated by <i>sep</i>. + * + * [ "a", "b", "c" ].join #=> "abc" + * [ "a", "b", "c" ].join("-"\) #=> "a-b-c" + */) + +directive(static) ident(VALUE) +ident(rb_ary_join_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(sep)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(sep)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(sep)operator(\)\)) ident(sep) operator(=) ident(rb_output_fs)operator(;) + + reserved(return) ident(rb_ary_join)operator(()ident(ary)operator(,) ident(sep)operator(\);) +operator(}) + +comment(/* + * call-seq: + * array.to_s -> string + * + * Returns _self_<code>.join</code>. + * + * [ "a", "e", "i", "o" ].to_s #=> "aeio" + * + */) + +ident(VALUE) +ident(rb_ary_to_s)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\);) + + reserved(return) ident(rb_ary_join)operator(()ident(ary)operator(,) ident(rb_output_fs)operator(\);) +operator(}) + +directive(static) ident(ID) ident(inspect_key)operator(;) + +reserved(struct) ident(inspect_arg) operator({) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + ident(VALUE) ident(arg1)operator(,) ident(arg2)operator(;) +operator(};) + +directive(static) ident(VALUE) +ident(inspect_call)operator(()ident(arg)operator(\)) + reserved(struct) ident(inspect_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(return) operator((*)ident(arg)operator(->)ident(func)operator(\)()ident(arg)operator(->)ident(arg1)operator(,) ident(arg)operator(->)ident(arg2)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(get_inspect_tbl)operator(()ident(create)operator(\)) + pre_type(int) ident(create)operator(;) +operator({) + ident(VALUE) ident(inspect_tbl) operator(=) ident(rb_thread_local_aref)operator(()ident(rb_thread_current)operator((\),) ident(inspect_key)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(inspect_tbl)operator(\)\)) operator({) + reserved(if) operator(()ident(create)operator(\)) operator({) + label(tbl_init)operator(:) + ident(inspect_tbl) operator(=) ident(rb_ary_new)operator((\);) + ident(rb_thread_local_aset)operator(()ident(rb_thread_current)operator((\),) ident(inspect_key)operator(,) ident(inspect_tbl)operator(\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(TYPE)operator(()ident(inspect_tbl)operator(\)) operator(!=) ident(T_ARRAY)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(invalid inspect_tbl value)delimiter(")>operator(\);) + reserved(if) operator(()ident(create)operator(\)) reserved(goto) ident(tbl_init)operator(;) + ident(rb_thread_local_aset)operator(()ident(rb_thread_current)operator((\),) ident(inspect_key)operator(,) ident(Qnil)operator(\);) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(inspect_tbl)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(inspect_ensure)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(inspect_tbl)operator(;) + + ident(inspect_tbl) operator(=) ident(get_inspect_tbl)operator(()ident(Qfalse)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(inspect_tbl)operator(\)\)) operator({) + ident(rb_ary_pop)operator(()ident(inspect_tbl)operator(\);) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +ident(VALUE) +ident(rb_protect_inspect)operator(()ident(func)operator(,) ident(obj)operator(,) ident(arg)operator(\)) + ident(VALUE) operator((*)ident(func)operator(\)()ident(ANYARGS)operator(\);) + ident(VALUE) ident(obj)operator(,) ident(arg)operator(;) +operator({) + reserved(struct) ident(inspect_arg) ident(iarg)operator(;) + ident(VALUE) ident(inspect_tbl)operator(;) + ident(VALUE) ident(id)operator(;) + + ident(inspect_tbl) operator(=) ident(get_inspect_tbl)operator(()ident(Qtrue)operator(\);) + ident(id) operator(=) ident(rb_obj_id)operator(()ident(obj)operator(\);) + reserved(if) operator(()ident(rb_ary_includes)operator(()ident(inspect_tbl)operator(,) ident(id)operator(\)\)) operator({) + reserved(return) operator((*)ident(func)operator(\)()ident(obj)operator(,) ident(arg)operator(\);) + operator(}) + ident(rb_ary_push)operator(()ident(inspect_tbl)operator(,) ident(id)operator(\);) + ident(iarg)operator(.)ident(func) operator(=) ident(func)operator(;) + ident(iarg)operator(.)ident(arg1) operator(=) ident(obj)operator(;) + ident(iarg)operator(.)ident(arg2) operator(=) ident(arg)operator(;) + + reserved(return) ident(rb_ensure)operator(()ident(inspect_call)operator(,) operator(()ident(VALUE)operator(\)&)ident(iarg)operator(,) ident(inspect_ensure)operator(,) ident(obj)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_inspecting_p)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(inspect_tbl)operator(;) + + ident(inspect_tbl) operator(=) ident(get_inspect_tbl)operator(()ident(Qfalse)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(inspect_tbl)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(rb_ary_includes)operator(()ident(inspect_tbl)operator(,) ident(rb_obj_id)operator(()ident(obj)operator(\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(inspect_ary)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(int) ident(tainted) operator(=) ident(OBJ_TAINTED)operator(()ident(ary)operator(\);) + pre_type(long) ident(i)operator(;) + ident(VALUE) ident(s)operator(,) ident(str)operator(;) + + ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content([)delimiter(")>operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(s) operator(=) ident(rb_inspect)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(s)operator(\)\)) ident(tainted) operator(=) ident(Qtrue)operator(;) + reserved(if) operator(()ident(i) operator(>) integer(0)operator(\)) ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(, )delimiter(")>operator(\);) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(s)operator(\);) + operator(}) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(])delimiter(")>operator(\);) + reserved(if) operator(()ident(tainted)operator(\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.inspect -> string + * + * Create a printable version of <i>array</i>. + */) + +directive(static) ident(VALUE) +ident(rb_ary_inspect)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content([])delimiter(")>operator(\);) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(ary)operator(\)\)) reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content([...])delimiter(")>operator(\);) + reserved(return) ident(rb_protect_inspect)operator(()ident(inspect_ary)operator(,) ident(ary)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * array.to_a -> array + * + * Returns _self_. If called on a subclass of Array, converts + * the receiver to an Array object. + */) + +directive(static) ident(VALUE) +ident(rb_ary_to_a)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(rb_obj_class)operator(()ident(ary)operator(\)) operator(!=) ident(rb_cArray)operator(\)) operator({) + ident(VALUE) ident(dup) operator(=) ident(rb_ary_new2)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + ident(rb_ary_replace)operator(()ident(dup)operator(,) ident(ary)operator(\);) + reserved(return) ident(dup)operator(;) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.to_ary -> array + * + * Returns _self_. + */) + +directive(static) ident(VALUE) +ident(rb_ary_to_ary_m)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(ary)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ary_reverse)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) operator(*)ident(p1)operator(,) operator(*)ident(p2)operator(;) + ident(VALUE) ident(tmp)operator(;) + + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(>) integer(1)operator(\)) operator({) + ident(p1) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(;) + ident(p2) operator(=) ident(p1) operator(+) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(-) integer(1)operator(;) comment(/* points last item */) + + reserved(while) operator(()ident(p1) operator(<) ident(p2)operator(\)) operator({) + ident(tmp) operator(=) operator(*)ident(p1)operator(;) + operator(*)ident(p1)operator(++) operator(=) operator(*)ident(p2)operator(;) + operator(*)ident(p2)operator(--) operator(=) ident(tmp)operator(;) + operator(}) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.reverse! -> array + * + * Reverses _self_ in place. + * + * a = [ "a", "b", "c" ] + * a.reverse! #=> ["c", "b", "a"] + * a #=> ["c", "b", "a"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_reverse_bang)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(rb_ary_reverse)operator(()ident(ary)operator(\);) +operator(}) + +comment(/* + * call-seq: + * array.reverse -> an_array + * + * Returns a new array containing <i>self</i>'s elements in reverse order. + * + * [ "a", "b", "c" ].reverse #=> ["c", "b", "a"] + * [ 1 ].reverse #=> [1] + */) + +directive(static) ident(VALUE) +ident(rb_ary_reverse_m)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(rb_ary_reverse)operator(()ident(rb_ary_dup)operator(()ident(ary)operator(\)\);) +operator(}) + +reserved(struct) ident(ary_sort_data) operator({) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator(};) + +directive(static) directive(void) +ident(ary_sort_check)operator(()ident(data)operator(\)) + reserved(struct) ident(ary_sort_data) operator(*)ident(data)operator(;) +operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(data)operator(->)ident(ary)operator(\)->)ident(ptr) operator(!=) ident(data)operator(->)ident(ptr) operator(||) ident(RARRAY)operator(()ident(data)operator(->)ident(ary)operator(\)->)ident(len) operator(!=) ident(data)operator(->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(array modified during sort)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(sort_1)operator(()ident(a)operator(,) ident(b)operator(,) ident(data)operator(\)) + ident(VALUE) operator(*)ident(a)operator(,) operator(*)ident(b)operator(;) + reserved(struct) ident(ary_sort_data) operator(*)ident(data)operator(;) +operator({) + ident(VALUE) ident(retval) operator(=) ident(rb_yield_values)operator(()integer(2)operator(,) operator(*)ident(a)operator(,) operator(*)ident(b)operator(\);) + pre_type(int) ident(n)operator(;) + + ident(n) operator(=) ident(rb_cmpint)operator(()ident(retval)operator(,) operator(*)ident(a)operator(,) operator(*)ident(b)operator(\);) + ident(ary_sort_check)operator(()ident(data)operator(\);) + reserved(return) ident(n)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(sort_2)operator(()ident(ap)operator(,) ident(bp)operator(,) ident(data)operator(\)) + ident(VALUE) operator(*)ident(ap)operator(,) operator(*)ident(bp)operator(;) + reserved(struct) ident(ary_sort_data) operator(*)ident(data)operator(;) +operator({) + ident(VALUE) ident(retval)operator(;) + ident(VALUE) ident(a) operator(=) operator(*)ident(ap)operator(,) ident(b) operator(=) operator(*)ident(bp)operator(;) + pre_type(int) ident(n)operator(;) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(a)operator(\)) operator(&&) ident(FIXNUM_P)operator(()ident(b)operator(\)\)) operator({) + reserved(if) operator((()pre_type(long)operator(\))ident(a) operator(>) operator(()pre_type(long)operator(\))ident(b)operator(\)) reserved(return) integer(1)operator(;) + reserved(if) operator((()pre_type(long)operator(\))ident(a) operator(<) operator(()pre_type(long)operator(\))ident(b)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(return) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(a)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(b)operator(\)) operator(==) ident(T_STRING)operator(\)) reserved(return) ident(rb_str_cmp)operator(()ident(a)operator(,) ident(b)operator(\);) + operator(}) + + ident(retval) operator(=) ident(rb_funcall)operator(()ident(a)operator(,) ident(id_cmp)operator(,) integer(1)operator(,) ident(b)operator(\);) + ident(n) operator(=) ident(rb_cmpint)operator(()ident(retval)operator(,) ident(a)operator(,) ident(b)operator(\);) + ident(ary_sort_check)operator(()ident(data)operator(\);) + + reserved(return) ident(n)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(sort_internal)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(struct) ident(ary_sort_data) ident(data)operator(;) + + ident(data)operator(.)ident(ary) operator(=) ident(ary)operator(;) + ident(data)operator(.)ident(ptr) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(;) ident(data)operator(.)ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + ident(qsort)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) reserved(sizeof)operator(()ident(VALUE)operator(\),) + ident(rb_block_given_p)operator((\)?)label(sort_1)operator(:)ident(sort_2)operator(,) operator(&)ident(data)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(sort_unlock)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(FL_UNSET)operator(()ident(ary)operator(,) ident(ARY_TMPLOCK)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.sort! -> array + * array.sort! {| a,b | block } -> array + * + * Sorts _self_. Comparisons for + * the sort will be done using the <code><=></code> operator or using + * an optional code block. The block implements a comparison between + * <i>a</i> and <i>b</i>, returning -1, 0, or +1. See also + * <code>Enumerable#sort_by</code>. + * + * a = [ "d", "a", "e", "c", "b" ] + * a.sort #=> ["a", "b", "c", "d", "e"] + * a.sort {|x,y| y <=> x } #=> ["e", "d", "c", "b", "a"] + */) + +ident(VALUE) +ident(rb_ary_sort_bang)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(>) integer(1)operator(\)) operator({) + ident(FL_SET)operator(()ident(ary)operator(,) ident(ARY_TMPLOCK)operator(\);) comment(/* prohibit modification during sort */) + ident(rb_ensure)operator(()ident(sort_internal)operator(,) ident(ary)operator(,) ident(sort_unlock)operator(,) ident(ary)operator(\);) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.sort -> an_array + * array.sort {| a,b | block } -> an_array + * + * Returns a new array created by sorting <i>self</i>. Comparisons for + * the sort will be done using the <code><=></code> operator or using + * an optional code block. The block implements a comparison between + * <i>a</i> and <i>b</i>, returning -1, 0, or +1. See also + * <code>Enumerable#sort_by</code>. + * + * a = [ "d", "a", "e", "c", "b" ] + * a.sort #=> ["a", "b", "c", "d", "e"] + * a.sort {|x,y| y <=> x } #=> ["e", "d", "c", "b", "a"] + */) + +ident(VALUE) +ident(rb_ary_sort)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(ary) operator(=) ident(rb_ary_dup)operator(()ident(ary)operator(\);) + ident(rb_ary_sort_bang)operator(()ident(ary)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.collect {|item| block } -> an_array + * array.map {|item| block } -> an_array + * + * Invokes <i>block</i> once for each element of <i>self</i>. Creates a + * new array containing the values returned by the block. + * See also <code>Enumerable#collect</code>. + * + * a = [ "a", "b", "c", "d" ] + * a.collect {|x| x + "!" } #=> ["a!", "b!", "c!", "d!"] + * a #=> ["a", "b", "c", "d"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_collect)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + ident(VALUE) ident(collect)operator(;) + + reserved(if) operator((!)ident(rb_block_given_p)operator((\)\)) operator({) + reserved(return) ident(rb_ary_new4)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(\);) + operator(}) + + ident(collect) operator(=) ident(rb_ary_new2)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(collect)operator(,) ident(rb_yield)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)\);) + operator(}) + reserved(return) ident(collect)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.collect! {|item| block } -> array + * array.map! {|item| block } -> array + * + * Invokes the block once for each element of _self_, replacing the + * element with the value returned by _block_. + * See also <code>Enumerable#collect</code>. + * + * a = [ "a", "b", "c", "d" ] + * a.collect! {|x| x + "!" } + * a #=> [ "a!", "b!", "c!", "d!" ] + */) + +directive(static) ident(VALUE) +ident(rb_ary_collect_bang)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_store)operator(()ident(ary)operator(,) ident(i)operator(,) ident(rb_yield)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)\);) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +ident(VALUE) +ident(rb_values_at)operator(()ident(obj)operator(,) ident(olen)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(func)operator(\)) + ident(VALUE) ident(obj)operator(;) + pre_type(long) ident(olen)operator(;) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)) ident(_)operator((()ident(VALUE)operator(,)pre_type(long)operator(\)\);) +operator({) + ident(VALUE) ident(result) operator(=) ident(rb_ary_new2)operator(()ident(argc)operator(\);) + pre_type(long) ident(beg)operator(,) ident(len)operator(,) ident(i)operator(,) ident(j)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(argv)operator([)ident(i)operator(]\)\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) operator((*)ident(func)operator(\)()ident(obj)operator(,) ident(FIX2LONG)operator(()ident(argv)operator([)ident(i)operator(]\)\)\);) + reserved(continue)operator(;) + operator(}) + comment(/* check if idx is Range */) + reserved(switch) operator(()ident(rb_range_beg_len)operator(()ident(argv)operator([)ident(i)operator(],) operator(&)ident(beg)operator(,) operator(&)ident(len)operator(,) ident(olen)operator(,) integer(0)operator(\)\)) operator({) + reserved(case) label(Qfalse)operator(:) + reserved(break)operator(;) + reserved(case) label(Qnil)operator(:) + reserved(continue)operator(;) + reserved(default)operator(:) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(j)operator(<)ident(len)operator(;) ident(j)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) operator((*)ident(func)operator(\)()ident(obj)operator(,) ident(j)operator(+)ident(beg)operator(\)\);) + operator(}) + reserved(continue)operator(;) + operator(}) + ident(rb_ary_push)operator(()ident(result)operator(,) operator((*)ident(func)operator(\)()ident(obj)operator(,) ident(NUM2LONG)operator(()ident(argv)operator([)ident(i)operator(]\)\)\);) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.values_at(selector,... \) -> an_array + * + * Returns an array containing the elements in + * _self_ corresponding to the given selector(s\). The selectors + * may be either integer indices or ranges. + * See also <code>Array#select</code>. + * + * a = %w{ a b c d e f } + * a.values_at(1, 3, 5\) + * a.values_at(1, 3, 5, 7\) + * a.values_at(-1, -3, -5, -7\) + * a.values_at(1..3, 2...5\) + */) + +directive(static) ident(VALUE) +ident(rb_ary_values_at)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(rb_values_at)operator(()ident(ary)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(rb_ary_entry)operator(\);) +operator(}) + +comment(/* + * call-seq: + * array.select {|item| block } -> an_array + * + * Invokes the block passing in successive elements from <i>array</i>, + * returning an array containing those elements for which the block + * returns a true value (equivalent to <code>Enumerable#select</code>\). + * + * a = %w{ a b c d e f } + * a.select {|v| v =~ /[aeiou]/} #=> ["a", "e"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_select)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(result)operator(;) + pre_type(long) ident(i)operator(;) + + ident(result) operator(=) ident(rb_ary_new2)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_ary_elt)operator(()ident(ary)operator(,) ident(i)operator(\)\);) + operator(}) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.delete(obj\) -> obj or nil + * array.delete(obj\) { block } -> obj or nil + * + * Deletes items from <i>self</i> that are equal to <i>obj</i>. If + * the item is not found, returns <code>nil</code>. If the optional + * code block is given, returns the result of <i>block</i> if the item + * is not found. + * + * a = [ "a", "b", "b", "b", "c" ] + * a.delete("b"\) #=> "b" + * a #=> ["a", "c"] + * a.delete("z"\) #=> nil + * a.delete("z"\) { "not found" } #=> "not found" + */) + +ident(VALUE) +ident(rb_ary_delete)operator(()ident(ary)operator(,) ident(item)operator(\)) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) ident(item)operator(;) +operator({) + pre_type(long) ident(i1)operator(,) ident(i2)operator(;) + + reserved(for) operator(()ident(i1) operator(=) ident(i2) operator(=) integer(0)operator(;) ident(i1) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i1)operator(++\)) operator({) + ident(VALUE) ident(e) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i1)operator(];) + + reserved(if) operator(()ident(rb_equal)operator(()ident(e)operator(,) ident(item)operator(\)\)) reserved(continue)operator(;) + reserved(if) operator(()ident(i1) operator(!=) ident(i2)operator(\)) operator({) + ident(rb_ary_store)operator(()ident(ary)operator(,) ident(i2)operator(,) ident(e)operator(\);) + operator(}) + ident(i2)operator(++;) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) ident(i2)operator(\)) operator({) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(return) ident(rb_yield)operator(()ident(item)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) + operator(}) + + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(>) ident(i2)operator(\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(i2)operator(;) + reserved(if) operator(()ident(i2) operator(*) integer(2) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(&&) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(>) ident(ARY_DEFAULT_SIZE)operator(\)) operator({) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(i2) operator(*) integer(2)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(i2) operator(*) integer(2)operator(;) + operator(}) + operator(}) + + reserved(return) ident(item)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ary_delete_at)operator(()ident(ary)operator(,) ident(pos)operator(\)) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(pos)operator(;) +operator({) + pre_type(long) ident(i)operator(,) ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + ident(VALUE) ident(del)operator(;) + + reserved(if) operator(()ident(pos) operator(>=) ident(len)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(pos) operator(+=) ident(len)operator(;) + reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + operator(}) + + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + ident(del) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(pos)operator(];) + reserved(for) operator(()ident(i) operator(=) ident(pos) operator(+) integer(1)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++,) ident(pos)operator(++\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(pos)operator(]) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + operator(}) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(pos)operator(;) + + reserved(return) ident(del)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.delete_at(index\) -> obj or nil + * + * Deletes the element at the specified index, returning that element, + * or <code>nil</code> if the index is out of range. See also + * <code>Array#slice!</code>. + * + * a = %w( ant bat cat dog \) + * a.delete_at(2\) #=> "cat" + * a #=> ["ant", "bat", "dog"] + * a.delete_at(99\) #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_ary_delete_at_m)operator(()ident(ary)operator(,) ident(pos)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(pos)operator(;) +operator({) + reserved(return) ident(rb_ary_delete_at)operator(()ident(ary)operator(,) ident(NUM2LONG)operator(()ident(pos)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * array.slice!(index\) -> obj or nil + * array.slice!(start, length\) -> sub_array or nil + * array.slice!(range\) -> sub_array or nil + * + * Deletes the element(s\) given by an index (optionally with a length\) + * or by a range. Returns the deleted object, subarray, or + * <code>nil</code> if the index is out of range. Equivalent to: + * + * def slice!(*args\) + * result = self[*args] + * self[*args] = nil + * result + * end + * + * a = [ "a", "b", "c" ] + * a.slice!(1\) #=> "b" + * a #=> ["a", "c"] + * a.slice!(-1\) #=> "c" + * a #=> ["a"] + * a.slice!(100\) #=> nil + * a #=> ["a"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_slice_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(arg1)operator(,) ident(arg2)operator(;) + pre_type(long) ident(pos)operator(,) ident(len)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(arg1)operator(,) operator(&)ident(arg2)operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(pos) operator(=) ident(NUM2LONG)operator(()ident(arg1)operator(\);) + ident(len) operator(=) ident(NUM2LONG)operator(()ident(arg2)operator(\);) + label(delete_pos_len)operator(:) + reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(pos) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(+) ident(pos)operator(;) + operator(}) + ident(arg2) operator(=) ident(rb_ary_subseq)operator(()ident(ary)operator(,) ident(pos)operator(,) ident(len)operator(\);) + ident(rb_ary_splice)operator(()ident(ary)operator(,) ident(pos)operator(,) ident(len)operator(,) ident(Qnil)operator(\);) comment(/* Qnil/rb_ary_new2(0\) */) + reserved(return) ident(arg2)operator(;) + operator(}) + + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(arg1)operator(\)) operator(&&) ident(rb_range_beg_len)operator(()ident(arg1)operator(,) operator(&)ident(pos)operator(,) operator(&)ident(len)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) integer(1)operator(\)\)) operator({) + reserved(goto) ident(delete_pos_len)operator(;) + operator(}) + + reserved(return) ident(rb_ary_delete_at)operator(()ident(ary)operator(,) ident(NUM2LONG)operator(()ident(arg1)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * array.reject! {|item| block } -> array or nil + * + * Equivalent to <code>Array#delete_if</code>, deleting elements from + * _self_ for which the block evaluates to true, but returns + * <code>nil</code> if no changes were made. Also see + * <code>Enumerable#reject</code>. + */) + +directive(static) ident(VALUE) +ident(rb_ary_reject_bang)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(i1)operator(,) ident(i2)operator(;) + + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + reserved(for) operator(()ident(i1) operator(=) ident(i2) operator(=) integer(0)operator(;) ident(i1) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i1)operator(++\)) operator({) + ident(VALUE) ident(v) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i1)operator(];) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield)operator(()ident(v)operator(\)\)\)) reserved(continue)operator(;) + reserved(if) operator(()ident(i1) operator(!=) ident(i2)operator(\)) operator({) + ident(rb_ary_store)operator(()ident(ary)operator(,) ident(i2)operator(,) ident(v)operator(\);) + operator(}) + ident(i2)operator(++;) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) ident(i2)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(i2) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(i2)operator(;) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.reject {|item| block } -> an_array + * + * Returns a new array containing the items in _self_ + * for which the block is not true. + */) + +directive(static) ident(VALUE) +ident(rb_ary_reject)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(ary) operator(=) ident(rb_ary_dup)operator(()ident(ary)operator(\);) + ident(rb_ary_reject_bang)operator(()ident(ary)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.delete_if {|item| block } -> array + * + * Deletes every element of <i>self</i> for which <i>block</i> evaluates + * to <code>true</code>. + * + * a = [ "a", "b", "c" ] + * a.delete_if {|x| x >= "b" } #=> ["a"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_delete_if)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(rb_ary_reject_bang)operator(()ident(ary)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.zip(arg, ...\) -> an_array + * array.zip(arg, ...\) {| arr | block } -> nil + * + * Converts any arguments to arrays, then merges elements of + * <i>self</i> with corresponding elements from each argument. This + * generates a sequence of <code>self.size</code> <em>n</em>-element + * arrays, where <em>n</em> is one more that the count of arguments. If + * the size of any argument is less than <code>enumObj.size</code>, + * <code>nil</code> values are supplied. If a block given, it is + * invoked for each output array, otherwise an array of arrays is + * returned. + * + * a = [ 4, 5, 6 ] + * b = [ 7, 8, 9 ] + * + * [1,2,3].zip(a, b\) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] + * [1,2].zip(a,b\) #=> [[1, 4, 7], [2, 5, 8]] + * a.zip([1,2],[8]\) #=> [[4,1,8], [5,2,nil], [6,nil,nil]] + */) + +directive(static) ident(VALUE) +ident(rb_ary_zip)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(int) ident(i)operator(,) ident(j)operator(;) + pre_type(long) ident(len)operator(;) + ident(VALUE) ident(result)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(argv)operator([)ident(i)operator(]) operator(=) ident(to_ary)operator(()ident(argv)operator([)ident(i)operator(]\);) + operator(}) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_ary_new2)operator(()ident(argc)operator(+)integer(1)operator(\);) + + ident(rb_ary_push)operator(()ident(tmp)operator(,) ident(rb_ary_elt)operator(()ident(ary)operator(,) ident(i)operator(\)\);) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(j)operator(<)ident(argc)operator(;) ident(j)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(tmp)operator(,) ident(rb_ary_elt)operator(()ident(argv)operator([)ident(j)operator(],) ident(i)operator(\)\);) + operator(}) + ident(rb_yield)operator(()ident(tmp)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) + operator(}) + ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + ident(result) operator(=) ident(rb_ary_new2)operator(()ident(len)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_ary_new2)operator(()ident(argc)operator(+)integer(1)operator(\);) + + ident(rb_ary_push)operator(()ident(tmp)operator(,) ident(rb_ary_elt)operator(()ident(ary)operator(,) ident(i)operator(\)\);) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(j)operator(<)ident(argc)operator(;) ident(j)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(tmp)operator(,) ident(rb_ary_elt)operator(()ident(argv)operator([)ident(j)operator(],) ident(i)operator(\)\);) + operator(}) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(tmp)operator(\);) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.transpose -> an_array + * + * Assumes that <i>self</i> is an array of arrays and transposes the + * rows and columns. + * + * a = [[1,2], [3,4], [5,6]] + * a.transpose #=> [[1, 3, 5], [2, 4, 6]] + */) + +directive(static) ident(VALUE) +ident(rb_ary_transpose)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(elen) operator(=) operator(-)integer(1)operator(,) ident(alen)operator(,) ident(i)operator(,) ident(j)operator(;) + ident(VALUE) ident(tmp)operator(,) ident(result) operator(=) integer(0)operator(;) + + ident(alen) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(alen) operator(==) integer(0)operator(\)) reserved(return) ident(rb_ary_dup)operator(()ident(ary)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(alen)operator(;) ident(i)operator(++\)) operator({) + ident(tmp) operator(=) ident(to_ary)operator(()ident(rb_ary_elt)operator(()ident(ary)operator(,) ident(i)operator(\)\);) + reserved(if) operator(()ident(elen) operator(<) integer(0)operator(\)) operator({) comment(/* first element */) + ident(elen) operator(=) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len)operator(;) + ident(result) operator(=) ident(rb_ary_new2)operator(()ident(elen)operator(\);) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(j)operator(<)ident(elen)operator(;) ident(j)operator(++\)) operator({) + ident(rb_ary_store)operator(()ident(result)operator(,) ident(j)operator(,) ident(rb_ary_new2)operator(()ident(alen)operator(\)\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(elen) operator(!=) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(element size differs (%d should be %d\))delimiter(")>operator(,) + ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len)operator(,) ident(elen)operator(\);) + operator(}) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(j)operator(<)ident(elen)operator(;) ident(j)operator(++\)) operator({) + ident(rb_ary_store)operator(()ident(rb_ary_elt)operator(()ident(result)operator(,) ident(j)operator(\),) ident(i)operator(,) ident(rb_ary_elt)operator(()ident(tmp)operator(,) ident(j)operator(\)\);) + operator(}) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.replace(other_array\) -> array + * + * Replaces the contents of <i>self</i> with the contents of + * <i>other_array</i>, truncating or expanding if necessary. + * + * a = [ "a", "b", "c", "d", "e" ] + * a.replace([ "x", "y", "z" ]\) #=> ["x", "y", "z"] + * a #=> ["x", "y", "z"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_replace)operator(()ident(copy)operator(,) ident(orig)operator(\)) + ident(VALUE) ident(copy)operator(,) ident(orig)operator(;) +operator({) + ident(VALUE) ident(shared)operator(;) + + ident(rb_ary_modify)operator(()ident(copy)operator(\);) + ident(orig) operator(=) ident(to_ary)operator(()ident(orig)operator(\);) + reserved(if) operator(()ident(copy) operator(==) ident(orig)operator(\)) reserved(return) ident(copy)operator(;) + ident(shared) operator(=) ident(ary_make_shared)operator(()ident(orig)operator(\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(copy)operator(\)->)ident(ptr) operator(&&) operator(!)ident(FL_TEST)operator(()ident(copy)operator(,) ident(ELTS_SHARED)operator(\)\)) + ident(free)operator(()ident(RARRAY)operator(()ident(copy)operator(\)->)ident(ptr)operator(\);) + ident(RARRAY)operator(()ident(copy)operator(\)->)ident(ptr) operator(=) ident(RARRAY)operator(()ident(orig)operator(\)->)ident(ptr)operator(;) + ident(RARRAY)operator(()ident(copy)operator(\)->)ident(len) operator(=) ident(RARRAY)operator(()ident(orig)operator(\)->)ident(len)operator(;) + ident(RARRAY)operator(()ident(copy)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) ident(shared)operator(;) + ident(FL_SET)operator(()ident(copy)operator(,) ident(ELTS_SHARED)operator(\);) + + reserved(return) ident(copy)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.clear -> array + * + * Removes all elements from _self_. + * + * a = [ "a", "b", "c", "d", "e" ] + * a.clear #=> [ ] + */) + +ident(VALUE) +ident(rb_ary_clear)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(ARY_DEFAULT_SIZE) operator(*) integer(2) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(\)) operator({) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(ARY_DEFAULT_SIZE) operator(*) integer(2)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(ARY_DEFAULT_SIZE) operator(*) integer(2)operator(;) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.fill(obj\) -> array + * array.fill(obj, start [, length]\) -> array + * array.fill(obj, range \) -> array + * array.fill {|index| block } -> array + * array.fill(start [, length] \) {|index| block } -> array + * array.fill(range\) {|index| block } -> array + * + * The first three forms set the selected elements of <i>self</i> (which + * may be the entire array\) to <i>obj</i>. A <i>start</i> of + * <code>nil</code> is equivalent to zero. A <i>length</i> of + * <code>nil</code> is equivalent to <i>self.length</i>. The last three + * forms fill the array with the value of the block. The block is + * passed the absolute index of each element to be filled. + * + * a = [ "a", "b", "c", "d" ] + * a.fill("x"\) #=> ["x", "x", "x", "x"] + * a.fill("z", 2, 2\) #=> ["x", "x", "z", "z"] + * a.fill("y", 0..1\) #=> ["y", "y", "z", "z"] + * a.fill {|i| i*i} #=> [0, 1, 4, 9] + * a.fill(-2\) {|i| i*i*i} #=> [0, 1, 8, 27] + */) + +directive(static) ident(VALUE) +ident(rb_ary_fill)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ary)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(item)operator(,) ident(arg1)operator(,) ident(arg2)operator(;) + pre_type(long) ident(beg) operator(=) integer(0)operator(,) ident(end) operator(=) integer(0)operator(,) ident(len) operator(=) integer(0)operator(;) + ident(VALUE) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + pre_type(int) ident(block_p) operator(=) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(block_p) operator(=) ident(Qtrue)operator(;) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(02)delimiter(")>operator(,) operator(&)ident(arg1)operator(,) operator(&)ident(arg2)operator(\);) + ident(argc) operator(+=) integer(1)operator(;) comment(/* hackish */) + operator(}) + reserved(else) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(12)delimiter(")>operator(,) operator(&)ident(item)operator(,) operator(&)ident(arg1)operator(,) operator(&)ident(arg2)operator(\);) + operator(}) + reserved(switch) operator(()ident(argc)operator(\)) operator({) + reserved(case) integer(1)operator(:) + ident(beg) operator(=) integer(0)operator(;) + ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + reserved(break)operator(;) + reserved(case) integer(2)operator(:) + reserved(if) operator(()ident(rb_range_beg_len)operator(()ident(arg1)operator(,) operator(&)ident(beg)operator(,) operator(&)ident(len)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) integer(1)operator(\)\)) operator({) + reserved(break)operator(;) + operator(}) + comment(/* fall through */) + reserved(case) integer(3)operator(:) + ident(beg) operator(=) ident(NIL_P)operator(()ident(arg1)operator(\)) operator(?) integer(0) operator(:) ident(NUM2LONG)operator(()ident(arg1)operator(\);) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(+) ident(beg)operator(;) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) ident(beg) operator(=) integer(0)operator(;) + operator(}) + ident(len) operator(=) ident(NIL_P)operator(()ident(arg2)operator(\)) operator(?) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(-) ident(beg) operator(:) ident(NUM2LONG)operator(()ident(arg2)operator(\);) + reserved(break)operator(;) + operator(}) + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + reserved(return) ident(ary)operator(;) + operator(}) + reserved(if) operator(()ident(beg) operator(>=) ident(ARY_MAX_SIZE) operator(||) ident(len) operator(>) ident(ARY_MAX_SIZE) operator(-) ident(beg)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(argument too big)delimiter(")>operator(\);) + operator(}) + ident(end) operator(=) ident(beg) operator(+) ident(len)operator(;) + reserved(if) operator(()ident(end) operator(>) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) operator({) + reserved(if) operator(()ident(end) operator(>=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa)operator(\)) operator({) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(end)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(end)operator(;) + operator(}) + ident(rb_mem_clear)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) ident(end) operator(-) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(end)operator(;) + operator(}) + + reserved(if) operator(()ident(block_p)operator(\)) operator({) + ident(VALUE) ident(v)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)ident(beg)operator(;) ident(i)operator(<)ident(end)operator(;) ident(i)operator(++\)) operator({) + ident(v) operator(=) ident(rb_yield)operator(()ident(LONG2NUM)operator(()ident(i)operator(\)\);) + reserved(if) operator(()ident(i)operator(>=)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) reserved(break)operator(;) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(v)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(p) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr) operator(+) ident(beg)operator(;) + ident(pend) operator(=) ident(p) operator(+) ident(len)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + operator(*)ident(p)operator(++) operator(=) ident(item)operator(;) + operator(}) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array + other_array -> an_array + * + * Concatenation---Returns a new array built by concatenating the + * two arrays together to produce a third array. + * + * [ 1, 2, 3 ] + [ 4, 5 ] #=> [ 1, 2, 3, 4, 5 ] + */) + +ident(VALUE) +ident(rb_ary_plus)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(z)operator(;) + pre_type(long) ident(len)operator(;) + + ident(y) operator(=) ident(to_ary)operator(()ident(y)operator(\);) + ident(len) operator(=) ident(RARRAY)operator(()ident(x)operator(\)->)ident(len) operator(+) ident(RARRAY)operator(()ident(y)operator(\)->)ident(len)operator(;) + ident(z) operator(=) ident(rb_ary_new2)operator(()ident(len)operator(\);) + ident(MEMCPY)operator(()ident(RARRAY)operator(()ident(z)operator(\)->)ident(ptr)operator(,) ident(RARRAY)operator(()ident(x)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(x)operator(\)->)ident(len)operator(\);) + ident(MEMCPY)operator(()ident(RARRAY)operator(()ident(z)operator(\)->)ident(ptr) operator(+) ident(RARRAY)operator(()ident(x)operator(\)->)ident(len)operator(,) ident(RARRAY)operator(()ident(y)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(y)operator(\)->)ident(len)operator(\);) + ident(RARRAY)operator(()ident(z)operator(\)->)ident(len) operator(=) ident(len)operator(;) + reserved(return) ident(z)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.concat(other_array\) -> array + * + * Appends the elements in other_array to _self_. + * + * [ "a", "b" ].concat( ["c", "d"] \) #=> [ "a", "b", "c", "d" ] + */) + + +ident(VALUE) +ident(rb_ary_concat)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(y) operator(=) ident(to_ary)operator(()ident(y)operator(\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(y)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(rb_ary_splice)operator(()ident(x)operator(,) ident(RARRAY)operator(()ident(x)operator(\)->)ident(len)operator(,) integer(0)operator(,) ident(y)operator(\);) + operator(}) + reserved(return) ident(x)operator(;) +operator(}) + + +comment(/* + * call-seq: + * array * int -> an_array + * array * str -> a_string + * + * Repetition---With a String argument, equivalent to + * self.join(str\). Otherwise, returns a new array + * built by concatenating the _int_ copies of _self_. + * + * + * [ 1, 2, 3 ] * 3 #=> [ 1, 2, 3, 1, 2, 3, 1, 2, 3 ] + * [ 1, 2, 3 ] * "," #=> "1,2,3" + * + */) + +directive(static) ident(VALUE) +ident(rb_ary_times)operator(()ident(ary)operator(,) ident(times)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(times)operator(;) +operator({) + ident(VALUE) ident(ary2)operator(,) ident(tmp)operator(;) + pre_type(long) ident(i)operator(,) ident(len)operator(;) + + ident(tmp) operator(=) ident(rb_check_string_type)operator(()ident(times)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(return) ident(rb_ary_join)operator(()ident(ary)operator(,) ident(tmp)operator(\);) + operator(}) + + ident(len) operator(=) ident(NUM2LONG)operator(()ident(times)operator(\);) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(ary_new)operator(()ident(rb_obj_class)operator(()ident(ary)operator(\),) integer(0)operator(\);) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative argument)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(ARY_MAX_SIZE)operator(/)ident(len) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(argument too big)delimiter(")>operator(\);) + operator(}) + ident(len) operator(*=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + + ident(ary2) operator(=) ident(ary_new)operator(()ident(rb_obj_class)operator(()ident(ary)operator(\),) ident(len)operator(\);) + ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len) operator(=) ident(len)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(+=)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) operator({) + ident(MEMCPY)operator(()ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(ptr)operator(+)ident(i)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + operator(}) + ident(OBJ_INFECT)operator(()ident(ary2)operator(,) ident(ary)operator(\);) + + reserved(return) ident(ary2)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.assoc(obj\) -> an_array or nil + * + * Searches through an array whose elements are also arrays + * comparing _obj_ with the first element of each contained array + * using obj.==. + * Returns the first contained array that matches (that + * is, the first associated array\), + * or +nil+ if no match is found. + * See also <code>Array#rassoc</code>. + * + * s1 = [ "colors", "red", "blue", "green" ] + * s2 = [ "letters", "a", "b", "c" ] + * s3 = "foo" + * a = [ s1, s2, s3 ] + * a.assoc("letters"\) #=> [ "letters", "a", "b", "c" ] + * a.assoc("foo"\) #=> nil + */) + +ident(VALUE) +ident(rb_ary_assoc)operator(()ident(ary)operator(,) ident(key)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(key)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + ident(VALUE) ident(v)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) operator(++)ident(i)operator(\)) operator({) + ident(v) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(==) ident(T_ARRAY) operator(&&) + ident(RARRAY)operator(()ident(v)operator(\)->)ident(len) operator(>) integer(0) operator(&&) + ident(rb_equal)operator(()ident(RARRAY)operator(()ident(v)operator(\)->)ident(ptr)operator([)integer(0)operator(],) ident(key)operator(\)\)) + reserved(return) ident(v)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.rassoc(key\) -> an_array or nil + * + * Searches through the array whose elements are also arrays. Compares + * <em>key</em> with the second element of each contained array using + * <code>==</code>. Returns the first contained array that matches. See + * also <code>Array#assoc</code>. + * + * a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ] + * a.rassoc("two"\) #=> [2, "two"] + * a.rassoc("four"\) #=> nil + */) + +ident(VALUE) +ident(rb_ary_rassoc)operator(()ident(ary)operator(,) ident(value)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(value)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + ident(VALUE) ident(v)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) operator(++)ident(i)operator(\)) operator({) + ident(v) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(==) ident(T_ARRAY) operator(&&) + ident(RARRAY)operator(()ident(v)operator(\)->)ident(len) operator(>) integer(1) operator(&&) + ident(rb_equal)operator(()ident(RARRAY)operator(()ident(v)operator(\)->)ident(ptr)operator([)integer(1)operator(],) ident(value)operator(\)\)) + reserved(return) ident(v)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(recursive_equal)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator((!)ident(rb_equal)operator(()ident(rb_ary_elt)operator(()ident(ary1)operator(,) ident(i)operator(\),) ident(rb_ary_elt)operator(()ident(ary2)operator(,) ident(i)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * array == other_array -> bool + * + * Equality---Two arrays are equal if they contain the same number + * of elements and if each element is equal to (according to + * Object.==\) the corresponding element in the other array. + * + * [ "a", "c" ] == [ "a", "c", 7 ] #=> false + * [ "a", "c", 7 ] == [ "a", "c", 7 ] #=> true + * [ "a", "c", 7 ] == [ "a", "d", "f" ] #=> false + * + */) + +directive(static) ident(VALUE) +ident(rb_ary_equal)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + reserved(if) operator(()ident(ary1) operator(==) ident(ary2)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(ary2)operator(\)) operator(!=) ident(T_ARRAY)operator(\)) operator({) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(ary2)operator(,) ident(rb_intern)operator(()string<delimiter(")content(to_ary)delimiter(")>operator(\)\)\)) operator({) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(rb_equal)operator(()ident(ary2)operator(,) ident(ary1)operator(\);) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len) operator(!=) ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(ary1)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(rb_protect_inspect)operator(()ident(recursive_equal)operator(,) ident(ary1)operator(,) ident(ary2)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(recursive_eql)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator((!)ident(rb_eql)operator(()ident(rb_ary_elt)operator(()ident(ary1)operator(,) ident(i)operator(\),) ident(rb_ary_elt)operator(()ident(ary2)operator(,) ident(i)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.eql?(other\) -> true or false + * + * Returns <code>true</code> if _array_ and _other_ are the same object, + * or are both arrays with the same content. + */) + +directive(static) ident(VALUE) +ident(rb_ary_eql)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + reserved(if) operator(()ident(ary1) operator(==) ident(ary2)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(ary2)operator(\)) operator(!=) ident(T_ARRAY)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len) operator(!=) ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(ary1)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(rb_protect_inspect)operator(()ident(recursive_eql)operator(,) ident(ary1)operator(,) ident(ary2)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(recursive_hash) ident(_)operator((()ident(VALUE) ident(ary)operator(\)\);) + +directive(static) ident(VALUE) +ident(recursive_hash)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(i)operator(,) ident(h)operator(;) + ident(VALUE) ident(n)operator(;) + + ident(h) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(h) operator(=) operator(()ident(h) operator(<<) integer(1)operator(\)) operator(|) operator(()ident(h)operator(<)integer(0) operator(?) integer(1) operator(:) integer(0)operator(\);) + ident(n) operator(=) ident(rb_hash)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + ident(h) operator(^=) ident(NUM2LONG)operator(()ident(n)operator(\);) + operator(}) + reserved(return) ident(LONG2FIX)operator(()ident(h)operator(\);) +operator(}) + +comment(/* + * call-seq: + * array.hash -> fixnum + * + * Compute a hash-code for this array. Two arrays with the same content + * will have the same hash code (and will compare using <code>eql?</code>\). + */) + +directive(static) ident(VALUE) +ident(rb_ary_hash)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(ary)operator(\)\)) operator({) + reserved(return) ident(LONG2FIX)operator(()integer(0)operator(\);) + operator(}) + reserved(return) ident(rb_protect_inspect)operator(()ident(recursive_hash)operator(,) ident(ary)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * array.include?(obj\) -> true or false + * + * Returns <code>true</code> if the given object is present in + * <i>self</i> (that is, if any object <code>==</code> <i>anObject</i>\), + * <code>false</code> otherwise. + * + * a = [ "a", "b", "c" ] + * a.include?("b"\) #=> true + * a.include?("z"\) #=> false + */) + +ident(VALUE) +ident(rb_ary_includes)operator(()ident(ary)operator(,) ident(item)operator(\)) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) ident(item)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(rb_equal)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(item)operator(\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +ident(VALUE) +ident(recursive_cmp)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + pre_type(long) ident(i)operator(,) ident(len)operator(;) + + ident(len) operator(=) ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(len) operator(>) ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(\)) operator({) + ident(len) operator(=) ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(v) operator(=) ident(rb_funcall)operator(()ident(rb_ary_elt)operator(()ident(ary1)operator(,) ident(i)operator(\),) ident(id_cmp)operator(,) integer(1)operator(,) ident(rb_ary_elt)operator(()ident(ary2)operator(,) ident(i)operator(\)\);) + reserved(if) operator(()ident(v) operator(!=) ident(INT2FIX)operator(()integer(0)operator(\)\)) operator({) + reserved(return) ident(v)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qundef)operator(;) +operator(}) + +comment(/* + * call-seq: + * array <=> other_array -> -1, 0, +1 + * + * Comparison---Returns an integer (-1, 0, + * or +1\) if this array is less than, equal to, or greater than + * other_array. Each object in each array is compared + * (using <=>\). If any value isn't + * equal, then that inequality is the return value. If all the + * values found are equal, then the return is based on a + * comparison of the array lengths. Thus, two arrays are + * ``equal'' according to <code>Array#<=></code> if and only if they have + * the same length and the value of each element is equal to the + * value of the corresponding element in the other array. + * + * [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1 + * [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1 + * + */) + +ident(VALUE) +ident(rb_ary_cmp)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + pre_type(long) ident(len)operator(;) + ident(VALUE) ident(v)operator(;) + + ident(ary2) operator(=) ident(to_ary)operator(()ident(ary2)operator(\);) + reserved(if) operator(()ident(ary1) operator(==) ident(ary2)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(ary1)operator(\)\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + ident(v) operator(=) ident(rb_protect_inspect)operator(()ident(recursive_cmp)operator(,) ident(ary1)operator(,) ident(ary2)operator(\);) + reserved(if) operator(()ident(v) operator(!=) ident(Qundef)operator(\)) reserved(return) ident(v)operator(;) + ident(len) operator(=) ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len) operator(-) ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(len) operator(>) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(ary_make_hash)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + ident(VALUE) ident(hash) operator(=) ident(rb_hash_new)operator((\);) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(Qtrue)operator(\);) + operator(}) + reserved(if) operator(()ident(ary2)operator(\)) operator({) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(Qtrue)operator(\);) + operator(}) + operator(}) + reserved(return) ident(hash)operator(;) +operator(}) + +comment(/* + * call-seq: + * array - other_array -> an_array + * + * Array Difference---Returns a new array that is a copy of + * the original array, removing any items that also appear in + * other_array. (If you need set-like behavior, see the + * library class Set.\) + * + * [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ] + */) + +directive(static) ident(VALUE) +ident(rb_ary_diff)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + ident(VALUE) ident(ary3)operator(;) + directive(volatile) ident(VALUE) ident(hash)operator(;) + pre_type(long) ident(i)operator(;) + + ident(hash) operator(=) ident(ary_make_hash)operator(()ident(to_ary)operator(()ident(ary2)operator(\),) integer(0)operator(\);) + ident(ary3) operator(=) ident(rb_ary_new)operator((\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(st_lookup)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(ptr)operator([)ident(i)operator(],) integer(0)operator(\)\)) reserved(continue)operator(;) + ident(rb_ary_push)operator(()ident(ary3)operator(,) ident(rb_ary_elt)operator(()ident(ary1)operator(,) ident(i)operator(\)\);) + operator(}) + reserved(return) ident(ary3)operator(;) +operator(}) + +comment(/* + * call-seq: + * array & other_array + * + * Set Intersection---Returns a new array + * containing elements common to the two arrays, with no duplicates. + * + * [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ] + */) + + +directive(static) ident(VALUE) +ident(rb_ary_and)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + ident(VALUE) ident(hash)operator(,) ident(ary3)operator(,) ident(v)operator(,) ident(vv)operator(;) + pre_type(long) ident(i)operator(;) + + ident(ary2) operator(=) ident(to_ary)operator(()ident(ary2)operator(\);) + ident(ary3) operator(=) ident(rb_ary_new2)operator(()ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len) operator(<) ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len) operator(?) + ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len) operator(:) ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(\);) + ident(hash) operator(=) ident(ary_make_hash)operator(()ident(ary2)operator(,) integer(0)operator(\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(v) operator(=) ident(vv) operator(=) ident(rb_ary_elt)operator(()ident(ary1)operator(,) ident(i)operator(\);) + reserved(if) operator(()ident(st_delete)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(vv)operator(,) integer(0)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary3)operator(,) ident(v)operator(\);) + operator(}) + operator(}) + + reserved(return) ident(ary3)operator(;) +operator(}) + +comment(/* + * call-seq: + * array | other_array -> an_array + * + * Set Union---Returns a new array by joining this array with + * other_array, removing duplicates. + * + * [ "a", "b", "c" ] | [ "c", "d", "a" ] + * #=> [ "a", "b", "c", "d" ] + */) + +directive(static) ident(VALUE) +ident(rb_ary_or)operator(()ident(ary1)operator(,) ident(ary2)operator(\)) + ident(VALUE) ident(ary1)operator(,) ident(ary2)operator(;) +operator({) + ident(VALUE) ident(hash)operator(,) ident(ary3)operator(;) + ident(VALUE) ident(v)operator(,) ident(vv)operator(;) + pre_type(long) ident(i)operator(;) + + ident(ary2) operator(=) ident(to_ary)operator(()ident(ary2)operator(\);) + ident(ary3) operator(=) ident(rb_ary_new2)operator(()ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len)operator(+)ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(\);) + ident(hash) operator(=) ident(ary_make_hash)operator(()ident(ary1)operator(,) ident(ary2)operator(\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary1)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(v) operator(=) ident(vv) operator(=) ident(rb_ary_elt)operator(()ident(ary1)operator(,) ident(i)operator(\);) + reserved(if) operator(()ident(st_delete)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(vv)operator(,) integer(0)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary3)operator(,) ident(v)operator(\);) + operator(}) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(v) operator(=) ident(vv) operator(=) ident(rb_ary_elt)operator(()ident(ary2)operator(,) ident(i)operator(\);) + reserved(if) operator(()ident(st_delete)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(vv)operator(,) integer(0)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary3)operator(,) ident(v)operator(\);) + operator(}) + operator(}) + reserved(return) ident(ary3)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.uniq! -> array or nil + * + * Removes duplicate elements from _self_. + * Returns <code>nil</code> if no changes are made (that is, no + * duplicates are found\). + * + * a = [ "a", "a", "b", "b", "c" ] + * a.uniq! #=> ["a", "b", "c"] + * b = [ "a", "b", "c" ] + * b.uniq! #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_ary_uniq_bang)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) ident(hash)operator(,) ident(v)operator(,) ident(vv)operator(;) + pre_type(long) ident(i)operator(,) ident(j)operator(;) + + ident(hash) operator(=) ident(ary_make_hash)operator(()ident(ary)operator(,) integer(0)operator(\);) + + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(->)ident(num_entries)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)ident(j)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(v) operator(=) ident(vv) operator(=) ident(rb_ary_elt)operator(()ident(ary)operator(,) ident(i)operator(\);) + reserved(if) operator(()ident(st_delete)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(vv)operator(,) integer(0)operator(\)\)) operator({) + ident(rb_ary_store)operator(()ident(ary)operator(,) ident(j)operator(++,) ident(v)operator(\);) + operator(}) + operator(}) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(j)operator(;) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.uniq -> an_array + * + * Returns a new array by removing duplicate values in <i>self</i>. + * + * a = [ "a", "a", "b", "b", "c" ] + * a.uniq #=> ["a", "b", "c"] + */) + +directive(static) ident(VALUE) +ident(rb_ary_uniq)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(ary) operator(=) ident(rb_ary_dup)operator(()ident(ary)operator(\);) + ident(rb_ary_uniq_bang)operator(()ident(ary)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.compact! -> array or nil + * + * Removes +nil+ elements from array. + * Returns +nil+ if no changes were made. + * + * [ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ] + * [ "a", "b", "c" ].compact! #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_ary_compact_bang)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(VALUE) operator(*)ident(p)operator(,) operator(*)ident(t)operator(,) operator(*)ident(end)operator(;) + + ident(rb_ary_modify)operator(()ident(ary)operator(\);) + ident(p) operator(=) ident(t) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(;) + ident(end) operator(=) ident(p) operator(+) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + + reserved(while) operator(()ident(t) operator(<) ident(end)operator(\)) operator({) + reserved(if) operator(()ident(NIL_P)operator((*)ident(t)operator(\)\)) ident(t)operator(++;) + reserved(else) operator(*)ident(p)operator(++) operator(=) operator(*)ident(t)operator(++;) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) operator(()ident(p) operator(-) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(\)\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) operator(()ident(p) operator(-) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(\);) + ident(REALLOC_N)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.compact -> an_array + * + * Returns a copy of _self_ with all +nil+ elements removed. + * + * [ "a", nil, "b", nil, "c", nil ].compact + * #=> [ "a", "b", "c" ] + */) + +directive(static) ident(VALUE) +ident(rb_ary_compact)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(ary) operator(=) ident(rb_ary_dup)operator(()ident(ary)operator(\);) + ident(rb_ary_compact_bang)operator(()ident(ary)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.nitems -> int + * + * Returns the number of non-<code>nil</code> elements in _self_. + * May be zero. + * + * [ 1, nil, 3, nil, 5 ].nitems #=> 3 + */) + +directive(static) ident(VALUE) +ident(rb_ary_nitems)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(n) operator(=) integer(0)operator(;) + ident(VALUE) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + + ident(p) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(;) + ident(pend) operator(=) ident(p) operator(+) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator((*)ident(p)operator(\)\)) ident(n)operator(++;) + ident(p)operator(++;) + operator(}) + reserved(return) ident(LONG2NUM)operator(()ident(n)operator(\);) +operator(}) + +directive(static) pre_type(long) +ident(flatten)operator(()ident(ary)operator(,) ident(idx)operator(,) ident(ary2)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(idx)operator(;) + ident(VALUE) ident(ary2)operator(,) ident(memo)operator(;) +operator({) + ident(VALUE) ident(id)operator(;) + pre_type(long) ident(i) operator(=) ident(idx)operator(;) + pre_type(long) ident(n)operator(,) ident(lim) operator(=) ident(idx) operator(+) ident(RARRAY)operator(()ident(ary2)operator(\)->)ident(len)operator(;) + + ident(id) operator(=) ident(rb_obj_id)operator(()ident(ary2)operator(\);) + reserved(if) operator(()ident(rb_ary_includes)operator(()ident(memo)operator(,) ident(id)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(tried to flatten recursive array)delimiter(")>operator(\);) + operator(}) + ident(rb_ary_push)operator(()ident(memo)operator(,) ident(id)operator(\);) + ident(rb_ary_splice)operator(()ident(ary)operator(,) ident(idx)operator(,) integer(1)operator(,) ident(ary2)operator(\);) + reserved(while) operator(()ident(i) operator(<) ident(lim)operator(\)) operator({) + ident(VALUE) ident(tmp)operator(;) + + ident(tmp) operator(=) ident(rb_check_array_type)operator(()ident(rb_ary_elt)operator(()ident(ary)operator(,) ident(i)operator(\)\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + ident(n) operator(=) ident(flatten)operator(()ident(ary)operator(,) ident(i)operator(,) ident(tmp)operator(,) ident(memo)operator(\);) + ident(i) operator(+=) ident(n)operator(;) ident(lim) operator(+=) ident(n)operator(;) + operator(}) + ident(i)operator(++;) + operator(}) + ident(rb_ary_pop)operator(()ident(memo)operator(\);) + + reserved(return) ident(lim) operator(-) ident(idx) operator(-) integer(1)operator(;) comment(/* returns number of increased items */) +operator(}) + +comment(/* + * call-seq: + * array.flatten! -> array or nil + * + * Flattens _self_ in place. + * Returns <code>nil</code> if no modifications were made (i.e., + * <i>array</i> contains no subarrays.\) + * + * a = [ 1, 2, [3, [4, 5] ] ] + * a.flatten! #=> [1, 2, 3, 4, 5] + * a.flatten! #=> nil + * a #=> [1, 2, 3, 4, 5] + */) + +directive(static) ident(VALUE) +ident(rb_ary_flatten_bang)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + pre_type(long) ident(i) operator(=) integer(0)operator(;) + pre_type(int) ident(mod) operator(=) integer(0)operator(;) + ident(VALUE) ident(memo) operator(=) ident(Qnil)operator(;) + + reserved(while) operator(()ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(\)) operator({) + ident(VALUE) ident(ary2) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + ident(VALUE) ident(tmp)operator(;) + + ident(tmp) operator(=) ident(rb_check_array_type)operator(()ident(ary2)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(memo)operator(\)\)) operator({) + ident(memo) operator(=) ident(rb_ary_new)operator((\);) + operator(}) + ident(i) operator(+=) ident(flatten)operator(()ident(ary)operator(,) ident(i)operator(,) ident(tmp)operator(,) ident(memo)operator(\);) + ident(mod) operator(=) integer(1)operator(;) + operator(}) + ident(i)operator(++;) + operator(}) + reserved(if) operator(()ident(mod) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * array.flatten -> an_array + * + * Returns a new array that is a one-dimensional flattening of this + * array (recursively\). That is, for every element that is an array, + * extract its elements into the new array. + * + * s = [ 1, 2, 3 ] #=> [1, 2, 3] + * t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]] + * a = [ s, t, 9, 10 ] #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10] + * a.flatten #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + */) + +directive(static) ident(VALUE) +ident(rb_ary_flatten)operator(()ident(ary)operator(\)) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(ary) operator(=) ident(rb_ary_dup)operator(()ident(ary)operator(\);) + ident(rb_ary_flatten_bang)operator(()ident(ary)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + + +comment(/* Arrays are ordered, integer-indexed collections of any object. + * Array indexing starts at 0, as in C or Java. A negative index is + * assumed to be relative to the end of the array---that is, an index of -1 + * indicates the last element of the array, -2 is the next to last + * element in the array, and so on. + */) + +directive(void) +ident(Init_Array)operator((\)) +operator({) + ident(rb_cArray) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Array)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_include_module)operator(()ident(rb_cArray)operator(,) ident(rb_mEnumerable)operator(\);) + + ident(rb_define_alloc_func)operator(()ident(rb_cArray)operator(,) ident(ary_alloc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(rb_ary_s_create)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_ary_initialize)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_ary_replace)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(rb_ary_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_ary_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(to_a)delimiter(")>operator(,) ident(rb_ary_to_a)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(to_ary)delimiter(")>operator(,) ident(rb_ary_to_ary_m)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(frozen?)delimiter(")>operator(,) ident(rb_ary_frozen_p)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(rb_ary_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(rb_ary_eql)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(hash)delimiter(")>operator(,) ident(rb_ary_hash)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(rb_ary_aref)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content([]=)delimiter(")>operator(,) ident(rb_ary_aset)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(at)delimiter(")>operator(,) ident(rb_ary_at)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(fetch)delimiter(")>operator(,) ident(rb_ary_fetch)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(first)delimiter(")>operator(,) ident(rb_ary_first)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(last)delimiter(")>operator(,) ident(rb_ary_last)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(concat)delimiter(")>operator(,) ident(rb_ary_concat)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(<<)delimiter(")>operator(,) ident(rb_ary_push)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(push)delimiter(")>operator(,) ident(rb_ary_push_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(pop)delimiter(")>operator(,) ident(rb_ary_pop)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(shift)delimiter(")>operator(,) ident(rb_ary_shift)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(unshift)delimiter(")>operator(,) ident(rb_ary_unshift_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(insert)delimiter(")>operator(,) ident(rb_ary_insert)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(each)delimiter(")>operator(,) ident(rb_ary_each)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(each_index)delimiter(")>operator(,) ident(rb_ary_each_index)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(reverse_each)delimiter(")>operator(,) ident(rb_ary_reverse_each)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(length)delimiter(")>operator(,) ident(rb_ary_length)operator(,) integer(0)operator(\);) + ident(rb_define_alias)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(size)delimiter(")>operator(,) string<delimiter(")content(length)delimiter(")>operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(empty?)delimiter(")>operator(,) ident(rb_ary_empty_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(index)delimiter(")>operator(,) ident(rb_ary_index)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(rindex)delimiter(")>operator(,) ident(rb_ary_rindex)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(indexes)delimiter(")>operator(,) ident(rb_ary_indexes)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(indices)delimiter(")>operator(,) ident(rb_ary_indexes)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(join)delimiter(")>operator(,) ident(rb_ary_join_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(reverse)delimiter(")>operator(,) ident(rb_ary_reverse_m)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(reverse!)delimiter(")>operator(,) ident(rb_ary_reverse_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(sort)delimiter(")>operator(,) ident(rb_ary_sort)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(sort!)delimiter(")>operator(,) ident(rb_ary_sort_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(collect)delimiter(")>operator(,) ident(rb_ary_collect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(collect!)delimiter(")>operator(,) ident(rb_ary_collect_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(map)delimiter(")>operator(,) ident(rb_ary_collect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(map!)delimiter(")>operator(,) ident(rb_ary_collect_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(select)delimiter(")>operator(,) ident(rb_ary_select)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(values_at)delimiter(")>operator(,) ident(rb_ary_values_at)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(delete)delimiter(")>operator(,) ident(rb_ary_delete)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(delete_at)delimiter(")>operator(,) ident(rb_ary_delete_at_m)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(delete_if)delimiter(")>operator(,) ident(rb_ary_delete_if)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(reject)delimiter(")>operator(,) ident(rb_ary_reject)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(reject!)delimiter(")>operator(,) ident(rb_ary_reject_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(zip)delimiter(")>operator(,) ident(rb_ary_zip)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(transpose)delimiter(")>operator(,) ident(rb_ary_transpose)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(replace)delimiter(")>operator(,) ident(rb_ary_replace)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(clear)delimiter(")>operator(,) ident(rb_ary_clear)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(fill)delimiter(")>operator(,) ident(rb_ary_fill)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(include?)delimiter(")>operator(,) ident(rb_ary_includes)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(rb_ary_cmp)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(slice)delimiter(")>operator(,) ident(rb_ary_aref)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(slice!)delimiter(")>operator(,) ident(rb_ary_slice_bang)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(assoc)delimiter(")>operator(,) ident(rb_ary_assoc)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(rassoc)delimiter(")>operator(,) ident(rb_ary_rassoc)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(rb_ary_plus)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(rb_ary_times)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(rb_ary_diff)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) ident(rb_ary_and)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(|)delimiter(")>operator(,) ident(rb_ary_or)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(uniq)delimiter(")>operator(,) ident(rb_ary_uniq)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(uniq!)delimiter(")>operator(,) ident(rb_ary_uniq_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(compact)delimiter(")>operator(,) ident(rb_ary_compact)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(compact!)delimiter(")>operator(,) ident(rb_ary_compact_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(flatten)delimiter(")>operator(,) ident(rb_ary_flatten)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(flatten!)delimiter(")>operator(,) ident(rb_ary_flatten_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(nitems)delimiter(")>operator(,) ident(rb_ary_nitems)operator(,) integer(0)operator(\);) + + ident(id_cmp) operator(=) ident(rb_intern)operator(()string<delimiter(")content(<=>)delimiter(")>operator(\);) + ident(inspect_key) operator(=) ident(rb_intern)operator(()string<delimiter(")content(__inspect_key__)delimiter(")>operator(\);) +operator(}) +comment(/********************************************************************** + + bignum.c - + + $Author: wyhaines $ + $Date: 2009-07-14 17:05:27 +0200 (Tue, 14 Jul 2009\) $ + created at: Fri Jun 10 00:48:55 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("rubysig.h") + +preprocessor(#include) include(<math.h>) +preprocessor(#include) include(<ctype.h>) +preprocessor(#ifdef) ident(HAVE_IEEEFP_H) +preprocessor(#include) include(<ieeefp.h>) +preprocessor(#endif) + +ident(VALUE) ident(rb_cBignum)operator(;) + +preprocessor(#if) ident(defined) ident(__MINGW32__) +preprocessor(#define) ident(USHORT) ident(_USHORT) +preprocessor(#endif) + +preprocessor(#define) ident(BDIGITS)operator(()ident(x)operator(\)) operator((()ident(BDIGIT)operator(*\))ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(digits)operator(\)) +preprocessor(#define) ident(BITSPERDIG) operator(()ident(SIZEOF_BDIGITS)operator(*)ident(CHAR_BIT)operator(\)) +preprocessor(#define) ident(BIGRAD) operator((()ident(BDIGIT_DBL)operator(\))integer(1) operator(<<) ident(BITSPERDIG)operator(\)) +preprocessor(#define) ident(DIGSPERLONG) operator((()pre_type(unsigned) pre_type(int)operator(\)()ident(SIZEOF_LONG)operator(/)ident(SIZEOF_BDIGITS)operator(\)\)) +preprocessor(#if) ident(HAVE_LONG_LONG) +preprocessor(# define) ident(DIGSPERLL) operator((()pre_type(unsigned) pre_type(int)operator(\)()ident(SIZEOF_LONG_LONG)operator(/)ident(SIZEOF_BDIGITS)operator(\)\)) +preprocessor(#endif) +preprocessor(#define) ident(BIGUP)operator(()ident(x)operator(\)) operator((()ident(BDIGIT_DBL)operator(\)()ident(x)operator(\)) operator(<<) ident(BITSPERDIG)operator(\)) +preprocessor(#define) ident(BIGDN)operator(()ident(x)operator(\)) ident(RSHIFT)operator(()ident(x)operator(,)ident(BITSPERDIG)operator(\)) +preprocessor(#define) ident(BIGLO)operator(()ident(x)operator(\)) operator((()ident(BDIGIT)operator(\)(()ident(x)operator(\)) operator(&) operator(()ident(BIGRAD)operator(-)integer(1)operator(\)\)\)) +preprocessor(#define) ident(BDIGMAX) operator((()ident(BDIGIT)operator(\)-)integer(1)operator(\)) + +preprocessor(#define) ident(BIGZEROP)operator(()ident(x)operator(\)) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(==) integer(0) operator(||) \ + operator(()ident(BDIGITS)operator(()ident(x)operator(\)[)integer(0)operator(]) operator(==) integer(0) operator(&&) \ + operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(==) integer(1) operator(||) ident(bigzero_p)operator(()ident(x)operator(\)\)\)\)) + +directive(static) pre_type(int) ident(bigzero_p)operator(()ident(VALUE)operator(\);) +directive(static) pre_type(int) +ident(bigzero_p)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) operator(++)ident(i)operator(\)) operator({) + reserved(if) operator(()ident(BDIGITS)operator(()ident(x)operator(\)[)ident(i)operator(]\)) reserved(return) integer(0)operator(;) + operator(}) + reserved(return) integer(1)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(bignew_1)operator(()ident(klass)operator(,) ident(len)operator(,) ident(sign)operator(\)) + ident(VALUE) ident(klass)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(sign)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(big)operator(,) reserved(struct) ident(RBignum)operator(\);) + ident(OBJSETUP)operator(()ident(big)operator(,) ident(klass)operator(,) ident(T_BIGNUM)operator(\);) + ident(big)operator(->)ident(sign) operator(=) ident(sign)operator(?)integer(1)operator(:)integer(0)operator(;) + ident(big)operator(->)ident(len) operator(=) ident(len)operator(;) + ident(big)operator(->)ident(digits) operator(=) ident(ALLOC_N)operator(()ident(BDIGIT)operator(,) ident(len)operator(\);) + + reserved(return) operator(()ident(VALUE)operator(\))ident(big)operator(;) +operator(}) + +preprocessor(#define) ident(bignew)operator(()ident(len)operator(,)ident(sign)operator(\)) ident(bignew_1)operator(()ident(rb_cBignum)operator(,)ident(len)operator(,)ident(sign)operator(\)) + +ident(VALUE) +ident(rb_big_clone)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + ident(VALUE) ident(z) operator(=) ident(bignew_1)operator(()ident(CLASS_OF)operator(()ident(x)operator(\),) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(,) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\);) + + ident(MEMCPY)operator(()ident(BDIGITS)operator(()ident(z)operator(\),) ident(BDIGITS)operator(()ident(x)operator(\),) ident(BDIGIT)operator(,) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(\);) + reserved(return) ident(z)operator(;) +operator(}) + +comment(/* modify a bignum by 2's complement */) +directive(static) directive(void) +ident(get2comp)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(long) ident(i) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(BDIGIT) operator(*)ident(ds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(BDIGIT_DBL) ident(num)operator(;) + + reserved(if) operator((!)ident(i)operator(\)) reserved(return)operator(;) + reserved(while) operator(()ident(i)operator(--\)) ident(ds)operator([)ident(i)operator(]) operator(=) operator(~)ident(ds)operator([)ident(i)operator(];) + ident(i) operator(=) integer(0)operator(;) ident(num) operator(=) integer(1)operator(;) + reserved(do) operator({) + ident(num) operator(+=) ident(ds)operator([)ident(i)operator(];) + ident(ds)operator([)ident(i)operator(++]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) reserved(while) operator(()ident(i) operator(<) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(\);) + reserved(if) operator(()ident(num) operator(!=) integer(0)operator(\)) operator({) + ident(REALLOC_N)operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(digits)operator(,) ident(BDIGIT)operator(,) operator(++)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(\);) + ident(ds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(ds)operator([)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(-)integer(1)operator(]) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(?) operator(~)integer(0) operator(:) integer(1)operator(;) + operator(}) +operator(}) + +directive(void) +ident(rb_big_2comp)operator(()ident(x)operator(\)) comment(/* get 2's complement */) + ident(VALUE) ident(x)operator(;) +operator({) + ident(get2comp)operator(()ident(x)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(bigtrunc)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(long) ident(len) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(BDIGIT) operator(*)ident(ds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(x)operator(;) + reserved(while) operator((--)ident(len) operator(&&) operator(!)ident(ds)operator([)ident(len)operator(]\);) + ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(=) operator(++)ident(len)operator(;) + reserved(return) ident(x)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(bigfixize)operator(()ident(VALUE) ident(x)operator(\)) +operator({) + pre_type(long) ident(len) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(BDIGIT) operator(*)ident(ds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + + reserved(if) operator(()ident(len)operator(*)ident(SIZEOF_BDIGITS) operator(<=) reserved(sizeof)operator(()ident(VALUE)operator(\)\)) operator({) + pre_type(long) ident(num) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(num) operator(=) ident(BIGUP)operator(()ident(num)operator(\)) operator(+) ident(ds)operator([)ident(len)operator(];) + operator(}) + reserved(if) operator(()ident(num) operator(>=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + reserved(if) operator(()ident(POSFIXABLE)operator(()ident(num)operator(\)\)) reserved(return) ident(LONG2FIX)operator(()ident(num)operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(NEGFIXABLE)operator((-()pre_type(long)operator(\))ident(num)operator(\)\)) reserved(return) ident(LONG2FIX)operator((-()pre_type(long)operator(\))ident(num)operator(\);) + operator(}) + operator(}) + operator(}) + reserved(return) ident(x)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(bignorm)operator(()ident(VALUE) ident(x)operator(\)) +operator({) + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(x)operator(\)) operator(&&) ident(TYPE)operator(()ident(x)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + ident(x) operator(=) ident(bigfixize)operator(()ident(bigtrunc)operator(()ident(x)operator(\)\);) + operator(}) + reserved(return) ident(x)operator(;) +operator(}) + +ident(VALUE) +ident(rb_big_norm)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + reserved(return) ident(bignorm)operator(()ident(x)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_uint2big)operator(()ident(n)operator(\)) + pre_type(unsigned) pre_type(long) ident(n)operator(;) +operator({) + ident(BDIGIT_DBL) ident(num) operator(=) ident(n)operator(;) + pre_type(long) ident(i) operator(=) integer(0)operator(;) + ident(BDIGIT) operator(*)ident(digits)operator(;) + ident(VALUE) ident(big)operator(;) + + ident(big) operator(=) ident(bignew)operator(()ident(DIGSPERLONG)operator(,) integer(1)operator(\);) + ident(digits) operator(=) ident(BDIGITS)operator(()ident(big)operator(\);) + reserved(while) operator(()ident(i) operator(<) ident(DIGSPERLONG)operator(\)) operator({) + ident(digits)operator([)ident(i)operator(++]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) + + ident(i) operator(=) ident(DIGSPERLONG)operator(;) + reserved(while) operator((--)ident(i) operator(&&) operator(!)ident(digits)operator([)ident(i)operator(]\)) operator(;) + ident(RBIGNUM)operator(()ident(big)operator(\)->)ident(len) operator(=) ident(i)operator(+)integer(1)operator(;) + reserved(return) ident(big)operator(;) +operator(}) + +ident(VALUE) +ident(rb_int2big)operator(()ident(n)operator(\)) + pre_type(long) ident(n)operator(;) +operator({) + pre_type(long) ident(neg) operator(=) integer(0)operator(;) + ident(VALUE) ident(big)operator(;) + + reserved(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + ident(n) operator(=) operator(-)ident(n)operator(;) + ident(neg) operator(=) integer(1)operator(;) + operator(}) + ident(big) operator(=) ident(rb_uint2big)operator(()ident(n)operator(\);) + reserved(if) operator(()ident(neg)operator(\)) operator({) + ident(RBIGNUM)operator(()ident(big)operator(\)->)ident(sign) operator(=) integer(0)operator(;) + operator(}) + reserved(return) ident(big)operator(;) +operator(}) + +ident(VALUE) +ident(rb_uint2inum)operator(()ident(n)operator(\)) + pre_type(unsigned) pre_type(long) ident(n)operator(;) +operator({) + reserved(if) operator(()ident(POSFIXABLE)operator(()ident(n)operator(\)\)) reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) + reserved(return) ident(rb_uint2big)operator(()ident(n)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_int2inum)operator(()ident(n)operator(\)) + pre_type(long) ident(n)operator(;) +operator({) + reserved(if) operator(()ident(FIXABLE)operator(()ident(n)operator(\)\)) reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) + reserved(return) ident(rb_int2big)operator(()ident(n)operator(\);) +operator(}) + +preprocessor(#ifdef) ident(HAVE_LONG_LONG) + +directive(void) +ident(rb_quad_pack)operator(()ident(buf)operator(,) ident(val)operator(\)) + pre_type(char) operator(*)ident(buf)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(LONG_LONG) ident(q)operator(;) + + ident(val) operator(=) ident(rb_to_int)operator(()ident(val)operator(\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(val)operator(\)\)) operator({) + ident(q) operator(=) ident(FIX2LONG)operator(()ident(val)operator(\);) + operator(}) + reserved(else) operator({) + pre_type(long) ident(len) operator(=) ident(RBIGNUM)operator(()ident(val)operator(\)->)ident(len)operator(;) + ident(BDIGIT) operator(*)ident(ds)operator(;) + + reserved(if) operator(()ident(len) operator(>) ident(SIZEOF_LONG_LONG)operator(/)ident(SIZEOF_BDIGITS)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(bignum too big to convert into `quad int')delimiter(")>operator(\);) + ident(ds) operator(=) ident(BDIGITS)operator(()ident(val)operator(\);) + ident(q) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(q) operator(=) ident(BIGUP)operator(()ident(q)operator(\);) + ident(q) operator(+=) ident(ds)operator([)ident(len)operator(];) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(val)operator(\)->)ident(sign)operator(\)) ident(q) operator(=) operator(-)ident(q)operator(;) + operator(}) + ident(memcpy)operator(()ident(buf)operator(,) operator(()pre_type(char)operator(*\)&)ident(q)operator(,) ident(SIZEOF_LONG_LONG)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_quad_unpack)operator(()ident(buf)operator(,) ident(sign)operator(\)) + directive(const) pre_type(char) operator(*)ident(buf)operator(;) + pre_type(int) ident(sign)operator(;) +operator({) + pre_type(unsigned) ident(LONG_LONG) ident(q)operator(;) + pre_type(long) ident(neg) operator(=) integer(0)operator(;) + pre_type(long) ident(i)operator(;) + ident(BDIGIT) operator(*)ident(digits)operator(;) + ident(VALUE) ident(big)operator(;) + + ident(memcpy)operator((&)ident(q)operator(,) ident(buf)operator(,) ident(SIZEOF_LONG_LONG)operator(\);) + reserved(if) operator(()ident(sign)operator(\)) operator({) + reserved(if) operator(()ident(FIXABLE)operator((()ident(LONG_LONG)operator(\))ident(q)operator(\)\)) reserved(return) ident(LONG2FIX)operator((()ident(LONG_LONG)operator(\))ident(q)operator(\);) + reserved(if) operator((()ident(LONG_LONG)operator(\))ident(q) operator(<) integer(0)operator(\)) operator({) + ident(q) operator(=) operator(-()ident(LONG_LONG)operator(\))ident(q)operator(;) + ident(neg) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(POSFIXABLE)operator(()ident(q)operator(\)\)) reserved(return) ident(LONG2FIX)operator(()ident(q)operator(\);) + operator(}) + + ident(i) operator(=) integer(0)operator(;) + ident(big) operator(=) ident(bignew)operator(()ident(DIGSPERLL)operator(,) integer(1)operator(\);) + ident(digits) operator(=) ident(BDIGITS)operator(()ident(big)operator(\);) + reserved(while) operator(()ident(i) operator(<) ident(DIGSPERLL)operator(\)) operator({) + ident(digits)operator([)ident(i)operator(++]) operator(=) ident(BIGLO)operator(()ident(q)operator(\);) + ident(q) operator(=) ident(BIGDN)operator(()ident(q)operator(\);) + operator(}) + + ident(i) operator(=) ident(DIGSPERLL)operator(;) + reserved(while) operator(()ident(i)operator(--) operator(&&) operator(!)ident(digits)operator([)ident(i)operator(]\)) operator(;) + ident(RBIGNUM)operator(()ident(big)operator(\)->)ident(len) operator(=) ident(i)operator(+)integer(1)operator(;) + + reserved(if) operator(()ident(neg)operator(\)) operator({) + ident(RBIGNUM)operator(()ident(big)operator(\)->)ident(sign) operator(=) integer(0)operator(;) + operator(}) + reserved(return) ident(bignorm)operator(()ident(big)operator(\);) +operator(}) + +preprocessor(#else) + +preprocessor(#define) ident(QUAD_SIZE) integer(8) + +directive(void) +ident(rb_quad_pack)operator(()ident(buf)operator(,) ident(val)operator(\)) + pre_type(char) operator(*)ident(buf)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(long) ident(len)operator(;) + + ident(memset)operator(()ident(buf)operator(,) integer(0)operator(,) ident(QUAD_SIZE)operator(\);) + ident(val) operator(=) ident(rb_to_int)operator(()ident(val)operator(\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(val)operator(\)\)) operator({) + ident(val) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(val)operator(\)\);) + operator(}) + ident(len) operator(=) ident(RBIGNUM)operator(()ident(val)operator(\)->)ident(len) operator(*) ident(SIZEOF_BDIGITS)operator(;) + reserved(if) operator(()ident(len) operator(>) ident(QUAD_SIZE)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(bignum too big to convert into `quad int')delimiter(")>operator(\);) + operator(}) + ident(memcpy)operator(()ident(buf)operator(,) operator(()pre_type(char)operator(*\))ident(BDIGITS)operator(()ident(val)operator(\),) ident(len)operator(\);) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(val)operator(\)->)ident(sign)operator(\)) operator({) + ident(len) operator(=) ident(QUAD_SIZE)operator(;) + reserved(while) operator(()ident(len)operator(--\)) operator({) + operator(*)ident(buf) operator(=) operator(~*)ident(buf)operator(;) + ident(buf)operator(++;) + operator(}) + operator(}) +operator(}) + +preprocessor(#define) ident(BNEG)operator(()ident(b)operator(\)) operator(()ident(RSHIFT)operator(((()ident(BDIGIT)operator(*\))ident(b)operator(\)[)ident(QUAD_SIZE)operator(/)ident(SIZEOF_BDIGITS)operator(-)integer(1)operator(],)ident(BITSPERDIG)operator(-)integer(1)operator(\)) operator(!=) integer(0)operator(\)) + +ident(VALUE) +ident(rb_quad_unpack)operator(()ident(buf)operator(,) ident(sign)operator(\)) + directive(const) pre_type(char) operator(*)ident(buf)operator(;) + pre_type(int) ident(sign)operator(;) +operator({) + ident(VALUE) ident(big) operator(=) ident(bignew)operator(()ident(QUAD_SIZE)operator(/)ident(SIZEOF_BDIGITS)operator(,) integer(1)operator(\);) + + ident(memcpy)operator((()pre_type(char)operator(*\))ident(BDIGITS)operator(()ident(big)operator(\),) ident(buf)operator(,) ident(QUAD_SIZE)operator(\);) + reserved(if) operator(()ident(sign) operator(&&) ident(BNEG)operator(()ident(buf)operator(\)\)) operator({) + pre_type(long) ident(len) operator(=) ident(QUAD_SIZE)operator(;) + pre_type(char) operator(*)ident(tmp) operator(=) operator(()pre_type(char)operator(*\))ident(BDIGITS)operator(()ident(big)operator(\);) + + ident(RBIGNUM)operator(()ident(big)operator(\)->)ident(sign) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(len)operator(--\)) operator({) + operator(*)ident(tmp) operator(=) operator(~*)ident(tmp)operator(;) + ident(tmp)operator(++;) + operator(}) + operator(}) + + reserved(return) ident(bignorm)operator(()ident(big)operator(\);) +operator(}) + +preprocessor(#endif) + +ident(VALUE) +ident(rb_cstr_to_inum)operator(()ident(str)operator(,) ident(base)operator(,) ident(badcheck)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) + pre_type(int) ident(base)operator(;) + pre_type(int) ident(badcheck)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(s) operator(=) ident(str)operator(;) + pre_type(char) operator(*)ident(end)operator(;) + pre_type(char) ident(sign) operator(=) integer(1)operator(,) ident(nondigit) operator(=) integer(0)operator(;) + pre_type(int) ident(c)operator(;) + ident(BDIGIT_DBL) ident(num)operator(;) + pre_type(long) ident(len)operator(,) ident(blen) operator(=) integer(1)operator(;) + pre_type(long) ident(i)operator(;) + ident(VALUE) ident(z)operator(;) + ident(BDIGIT) operator(*)ident(zds)operator(;) + +preprocessor(#define) ident(conv_digit)operator(()ident(c)operator(\)) \ + operator((!)ident(ISASCII)operator(()ident(c)operator(\)) operator(?) operator(-)integer(1) operator(:) \ + ident(isdigit)operator(()ident(c)operator(\)) operator(?) operator((()ident(c)operator(\)) operator(-) char('0')operator(\)) operator(:) \ + ident(islower)operator(()ident(c)operator(\)) operator(?) operator((()ident(c)operator(\)) operator(-) char('a') operator(+) integer(10)operator(\)) operator(:) \ + ident(isupper)operator(()ident(c)operator(\)) operator(?) operator((()ident(c)operator(\)) operator(-) char('A') operator(+) integer(10)operator(\)) operator(:) \ + operator(-)integer(1)operator(\)) + + reserved(if) operator((!)ident(str)operator(\)) operator({) + reserved(if) operator(()ident(badcheck)operator(\)) reserved(goto) ident(bad)operator(;) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(badcheck)operator(\)) operator({) + reserved(while) operator(()ident(ISSPACE)operator((*)ident(str)operator(\)\)) ident(str)operator(++;) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(ISSPACE)operator((*)ident(str)operator(\)) operator(||) operator(*)ident(str) operator(==) char('_')operator(\)) ident(str)operator(++;) + operator(}) + + reserved(if) operator(()ident(str)operator([)integer(0)operator(]) operator(==) char('+')operator(\)) operator({) + ident(str)operator(++;) + operator(}) + reserved(else) reserved(if) operator(()ident(str)operator([)integer(0)operator(]) operator(==) char('-')operator(\)) operator({) + ident(str)operator(++;) + ident(sign) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(str)operator([)integer(0)operator(]) operator(==) char('+') operator(||) ident(str)operator([)integer(0)operator(]) operator(==) char('-')operator(\)) operator({) + reserved(if) operator(()ident(badcheck)operator(\)) reserved(goto) ident(bad)operator(;) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(base) operator(<=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(str)operator([)integer(0)operator(]) operator(==) char('0')operator(\)) operator({) + reserved(switch) operator(()ident(str)operator([)integer(1)operator(]\)) operator({) + reserved(case) char('x')operator(:) reserved(case) char('X')operator(:) + ident(base) operator(=) integer(16)operator(;) + reserved(break)operator(;) + reserved(case) char('b')operator(:) reserved(case) char('B')operator(:) + ident(base) operator(=) integer(2)operator(;) + reserved(break)operator(;) + reserved(case) char('o')operator(:) reserved(case) char('O')operator(:) + ident(base) operator(=) integer(8)operator(;) + reserved(break)operator(;) + reserved(case) char('d')operator(:) reserved(case) char('D')operator(:) + ident(base) operator(=) integer(10)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(base) operator(=) integer(8)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(base) operator(<) operator(-)integer(1)operator(\)) operator({) + ident(base) operator(=) operator(-)ident(base)operator(;) + operator(}) + reserved(else) operator({) + ident(base) operator(=) integer(10)operator(;) + operator(}) + operator(}) + reserved(switch) operator(()ident(base)operator(\)) operator({) + reserved(case) integer(2)operator(:) + ident(len) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(str)operator([)integer(0)operator(]) operator(==) char('0') operator(&&) operator(()ident(str)operator([)integer(1)operator(]) operator(==) char('b')operator(||)ident(str)operator([)integer(1)operator(]) operator(==) char('B')operator(\)\)) operator({) + ident(str) operator(+=) integer(2)operator(;) + operator(}) + reserved(break)operator(;) + reserved(case) integer(3)operator(:) + ident(len) operator(=) integer(2)operator(;) + reserved(break)operator(;) + reserved(case) integer(8)operator(:) + reserved(if) operator(()ident(str)operator([)integer(0)operator(]) operator(==) char('0') operator(&&) operator(()ident(str)operator([)integer(1)operator(]) operator(==) char('o')operator(||)ident(str)operator([)integer(1)operator(]) operator(==) char('O')operator(\)\)) operator({) + ident(str) operator(+=) integer(2)operator(;) + operator(}) + reserved(case) integer(4)operator(:) reserved(case) integer(5)operator(:) reserved(case) integer(6)operator(:) reserved(case) integer(7)operator(:) + ident(len) operator(=) integer(3)operator(;) + reserved(break)operator(;) + reserved(case) integer(10)operator(:) + reserved(if) operator(()ident(str)operator([)integer(0)operator(]) operator(==) char('0') operator(&&) operator(()ident(str)operator([)integer(1)operator(]) operator(==) char('d')operator(||)ident(str)operator([)integer(1)operator(]) operator(==) char('D')operator(\)\)) operator({) + ident(str) operator(+=) integer(2)operator(;) + operator(}) + reserved(case) integer(9)operator(:) reserved(case) integer(11)operator(:) reserved(case) integer(12)operator(:) reserved(case) integer(13)operator(:) reserved(case) integer(14)operator(:) reserved(case) integer(15)operator(:) + ident(len) operator(=) integer(4)operator(;) + reserved(break)operator(;) + reserved(case) integer(16)operator(:) + ident(len) operator(=) integer(4)operator(;) + reserved(if) operator(()ident(str)operator([)integer(0)operator(]) operator(==) char('0') operator(&&) operator(()ident(str)operator([)integer(1)operator(]) operator(==) char('x')operator(||)ident(str)operator([)integer(1)operator(]) operator(==) char('X')operator(\)\)) operator({) + ident(str) operator(+=) integer(2)operator(;) + operator(}) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(if) operator(()ident(base) operator(<) integer(2) operator(||) integer(36) operator(<) ident(base)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(illegal radix %d)delimiter(")>operator(,) ident(base)operator(\);) + operator(}) + reserved(if) operator(()ident(base) operator(<=) integer(32)operator(\)) operator({) + ident(len) operator(=) integer(5)operator(;) + operator(}) + reserved(else) operator({) + ident(len) operator(=) integer(6)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(if) operator((*)ident(str) operator(==) char('0')operator(\)) operator({) comment(/* squeeze preceeding 0s */) + reserved(while) operator((*++)ident(str) operator(==) char('0')operator(\);) + reserved(if) operator((!()ident(c) operator(=) operator(*)ident(str)operator(\)) operator(||) ident(ISSPACE)operator(()ident(c)operator(\)\)) operator(--)ident(str)operator(;) + operator(}) + ident(c) operator(=) operator(*)ident(str)operator(;) + ident(c) operator(=) ident(conv_digit)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(c) operator(<) integer(0) operator(||) ident(c) operator(>=) ident(base)operator(\)) operator({) + reserved(if) operator(()ident(badcheck)operator(\)) reserved(goto) ident(bad)operator(;) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + operator(}) + ident(len) operator(*=) ident(strlen)operator(()ident(str)operator(\)*)reserved(sizeof)operator(()pre_type(char)operator(\);) + + reserved(if) operator(()ident(len) operator(<=) operator(()reserved(sizeof)operator(()ident(VALUE)operator(\)*)ident(CHAR_BIT)operator(\)\)) operator({) + pre_type(unsigned) pre_type(long) ident(val) operator(=) ident(strtoul)operator((()pre_type(char)operator(*\))ident(str)operator(,) operator(&)ident(end)operator(,) ident(base)operator(\);) + + reserved(if) operator((*)ident(end) operator(==) char('_')operator(\)) reserved(goto) ident(bigparse)operator(;) + reserved(if) operator(()ident(badcheck)operator(\)) operator({) + reserved(if) operator(()ident(end) operator(==) ident(str)operator(\)) reserved(goto) ident(bad)operator(;) comment(/* no number */) + reserved(while) operator((*)ident(end) operator(&&) ident(ISSPACE)operator((*)ident(end)operator(\)\)) ident(end)operator(++;) + reserved(if) operator((*)ident(end)operator(\)) reserved(goto) ident(bad)operator(;) comment(/* trailing garbage */) + operator(}) + + reserved(if) operator(()ident(POSFIXABLE)operator(()ident(val)operator(\)\)) operator({) + reserved(if) operator(()ident(sign)operator(\)) reserved(return) ident(LONG2FIX)operator(()ident(val)operator(\);) + reserved(else) operator({) + pre_type(long) ident(result) operator(=) operator(-()pre_type(long)operator(\))ident(val)operator(;) + reserved(return) ident(LONG2FIX)operator(()ident(result)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(big) operator(=) ident(rb_uint2big)operator(()ident(val)operator(\);) + ident(RBIGNUM)operator(()ident(big)operator(\)->)ident(sign) operator(=) ident(sign)operator(;) + reserved(return) ident(bignorm)operator(()ident(big)operator(\);) + operator(}) + operator(}) + label(bigparse)operator(:) + ident(len) operator(=) operator(()ident(len)operator(/)ident(BITSPERDIG)operator(\)+)integer(1)operator(;) + reserved(if) operator(()ident(badcheck) operator(&&) operator(*)ident(str) operator(==) char('_')operator(\)) reserved(goto) ident(bad)operator(;) + + ident(z) operator(=) ident(bignew)operator(()ident(len)operator(,) ident(sign)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + reserved(for) operator(()ident(i)operator(=)ident(len)operator(;)ident(i)operator(--;\)) ident(zds)operator([)ident(i)operator(]=)integer(0)operator(;) + reserved(while) operator((()ident(c) operator(=) operator(*)ident(str)operator(++\)) operator(!=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(c) operator(==) char('_')operator(\)) operator({) + reserved(if) operator(()ident(badcheck)operator(\)) operator({) + reserved(if) operator(()ident(nondigit)operator(\)) reserved(goto) ident(bad)operator(;) + ident(nondigit) operator(=) ident(c)operator(;) + operator(}) + reserved(continue)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(c) operator(=) ident(conv_digit)operator(()ident(c)operator(\)\)) operator(<) integer(0)operator(\)) operator({) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(>=) ident(base)operator(\)) reserved(break)operator(;) + ident(nondigit) operator(=) integer(0)operator(;) + ident(i) operator(=) integer(0)operator(;) + ident(num) operator(=) ident(c)operator(;) + reserved(for) operator((;;\)) operator({) + reserved(while) operator(()ident(i)operator(<)ident(blen)operator(\)) operator({) + ident(num) operator(+=) operator(()ident(BDIGIT_DBL)operator(\))ident(zds)operator([)ident(i)operator(]*)ident(base)operator(;) + ident(zds)operator([)ident(i)operator(++]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) + reserved(if) operator(()ident(num)operator(\)) operator({) + ident(blen)operator(++;) + reserved(continue)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(badcheck)operator(\)) operator({) + ident(str)operator(--;) + reserved(if) operator(()ident(s)operator(+)integer(1) operator(<) ident(str) operator(&&) ident(str)operator([-)integer(1)operator(]) operator(==) char('_')operator(\)) reserved(goto) ident(bad)operator(;) + reserved(while) operator((*)ident(str) operator(&&) ident(ISSPACE)operator((*)ident(str)operator(\)\)) ident(str)operator(++;) + reserved(if) operator((*)ident(str)operator(\)) operator({) + label(bad)operator(:) + ident(rb_invalid_str)operator(()ident(s)operator(,) string<delimiter(")content(Integer)delimiter(")>operator(\);) + operator(}) + operator(}) + + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_str_to_inum)operator(()ident(str)operator(,) ident(base)operator(,) ident(badcheck)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(int) ident(base)operator(;) + pre_type(int) ident(badcheck)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) + + ident(StringValue)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(badcheck)operator(\)) operator({) + ident(s) operator(=) ident(StringValueCStr)operator(()ident(str)operator(\);) + operator(}) + reserved(else) operator({) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + operator(}) + reserved(if) operator(()ident(s)operator(\)) operator({) + ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(s)operator([)ident(len)operator(]\)) operator({) comment(/* no sentinel somehow */) + pre_type(char) operator(*)ident(p) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(len)operator(+)integer(1)operator(\);) + + ident(MEMCPY)operator(()ident(p)operator(,) ident(s)operator(,) pre_type(char)operator(,) ident(len)operator(\);) + ident(p)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) + ident(s) operator(=) ident(p)operator(;) + operator(}) + operator(}) + reserved(return) ident(rb_cstr_to_inum)operator(()ident(s)operator(,) ident(base)operator(,) ident(badcheck)operator(\);) +operator(}) + +preprocessor(#if) ident(HAVE_LONG_LONG) + +ident(VALUE) +ident(rb_ull2big)operator(()ident(n)operator(\)) + pre_type(unsigned) ident(LONG_LONG) ident(n)operator(;) +operator({) + ident(BDIGIT_DBL) ident(num) operator(=) ident(n)operator(;) + pre_type(long) ident(i) operator(=) integer(0)operator(;) + ident(BDIGIT) operator(*)ident(digits)operator(;) + ident(VALUE) ident(big)operator(;) + + ident(big) operator(=) ident(bignew)operator(()ident(DIGSPERLL)operator(,) integer(1)operator(\);) + ident(digits) operator(=) ident(BDIGITS)operator(()ident(big)operator(\);) + reserved(while) operator(()ident(i) operator(<) ident(DIGSPERLL)operator(\)) operator({) + ident(digits)operator([)ident(i)operator(++]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) + + ident(i) operator(=) ident(DIGSPERLL)operator(;) + reserved(while) operator(()ident(i)operator(--) operator(&&) operator(!)ident(digits)operator([)ident(i)operator(]\)) operator(;) + ident(RBIGNUM)operator(()ident(big)operator(\)->)ident(len) operator(=) ident(i)operator(+)integer(1)operator(;) + reserved(return) ident(big)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ll2big)operator(()ident(n)operator(\)) + ident(LONG_LONG) ident(n)operator(;) +operator({) + pre_type(long) ident(neg) operator(=) integer(0)operator(;) + ident(VALUE) ident(big)operator(;) + + reserved(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + ident(n) operator(=) operator(-)ident(n)operator(;) + ident(neg) operator(=) integer(1)operator(;) + operator(}) + ident(big) operator(=) ident(rb_ull2big)operator(()ident(n)operator(\);) + reserved(if) operator(()ident(neg)operator(\)) operator({) + ident(RBIGNUM)operator(()ident(big)operator(\)->)ident(sign) operator(=) integer(0)operator(;) + operator(}) + reserved(return) ident(big)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ull2inum)operator(()ident(n)operator(\)) + pre_type(unsigned) ident(LONG_LONG) ident(n)operator(;) +operator({) + reserved(if) operator(()ident(POSFIXABLE)operator(()ident(n)operator(\)\)) reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) + reserved(return) ident(rb_ull2big)operator(()ident(n)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_ll2inum)operator(()ident(n)operator(\)) + ident(LONG_LONG) ident(n)operator(;) +operator({) + reserved(if) operator(()ident(FIXABLE)operator(()ident(n)operator(\)\)) reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) + reserved(return) ident(rb_ll2big)operator(()ident(n)operator(\);) +operator(}) + +preprocessor(#endif) comment(/* HAVE_LONG_LONG */) + +ident(VALUE) +ident(rb_cstr2inum)operator(()ident(str)operator(,) ident(base)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) + pre_type(int) ident(base)operator(;) +operator({) + reserved(return) ident(rb_cstr_to_inum)operator(()ident(str)operator(,) ident(base)operator(,) ident(base)operator(==)integer(0)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_str2inum)operator(()ident(str)operator(,) ident(base)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(int) ident(base)operator(;) +operator({) + reserved(return) ident(rb_str_to_inum)operator(()ident(str)operator(,) ident(base)operator(,) ident(base)operator(==)integer(0)operator(\);) +operator(}) + +directive(const) pre_type(char) ident(ruby_digitmap)operator([]) operator(=) string<delimiter(")content(0123456789abcdefghijklmnopqrstuvwxyz)delimiter(")>operator(;) +ident(VALUE) +ident(rb_big2str0)operator(()ident(x)operator(,) ident(base)operator(,) ident(trim)operator(\)) + ident(VALUE) ident(x)operator(;) + pre_type(int) ident(base)operator(;) + pre_type(int) ident(trim)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(t)operator(;) + ident(BDIGIT) operator(*)ident(ds)operator(;) + pre_type(long) ident(i)operator(,) ident(j)operator(,) ident(hbase)operator(;) + ident(VALUE) ident(ss)operator(;) + pre_type(char) operator(*)ident(s)operator(;) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(x)operator(\)\)) operator({) + reserved(return) ident(rb_fix2str)operator(()ident(x)operator(,) ident(base)operator(\);) + operator(}) + ident(i) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(BIGZEROP)operator(()ident(x)operator(\)\)) operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(0)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(i) operator(>=) ident(LONG_MAX)operator(/)ident(SIZEOF_BDIGITS)operator(/)ident(CHAR_BIT)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(bignum too big to convert into `string')delimiter(")>operator(\);) + operator(}) + ident(j) operator(=) ident(SIZEOF_BDIGITS)operator(*)ident(CHAR_BIT)operator(*)ident(i)operator(;) + reserved(switch) operator(()ident(base)operator(\)) operator({) + reserved(case) integer(2)operator(:) reserved(break)operator(;) + reserved(case) integer(3)operator(:) + ident(j) operator(=) ident(j) operator(*) integer(53L) operator(/) integer(84) operator(+) integer(1)operator(;) + reserved(break)operator(;) + reserved(case) integer(4)operator(:) reserved(case) integer(5)operator(:) reserved(case) integer(6)operator(:) reserved(case) integer(7)operator(:) + ident(j) operator(=) operator(()ident(j) operator(+) integer(1)operator(\)) operator(/) integer(2)operator(;) + reserved(break)operator(;) + reserved(case) integer(8)operator(:) reserved(case) integer(9)operator(:) + ident(j) operator(=) operator(()ident(j) operator(+) integer(2)operator(\)) operator(/) integer(3)operator(;) + reserved(break)operator(;) + reserved(case) integer(10)operator(:) reserved(case) integer(11)operator(:) reserved(case) integer(12)operator(:) reserved(case) integer(13)operator(:) reserved(case) integer(14)operator(:) reserved(case) integer(15)operator(:) + ident(j) operator(=) ident(j) operator(*) integer(28L) operator(/) integer(93) operator(+) integer(1)operator(;) + reserved(break)operator(;) + reserved(case) integer(16)operator(:) reserved(case) integer(17)operator(:) reserved(case) integer(18)operator(:) reserved(case) integer(19)operator(:) reserved(case) integer(20)operator(:) reserved(case) integer(21)operator(:) + reserved(case) integer(22)operator(:) reserved(case) integer(23)operator(:) reserved(case) integer(24)operator(:) reserved(case) integer(25)operator(:) reserved(case) integer(26)operator(:) reserved(case) integer(27)operator(:) + reserved(case) integer(28)operator(:) reserved(case) integer(29)operator(:) reserved(case) integer(30)operator(:) reserved(case) integer(31)operator(:) + ident(j) operator(=) operator(()ident(j) operator(+) integer(3)operator(\)) operator(/) integer(4)operator(;) + reserved(break)operator(;) + reserved(case) integer(32)operator(:) reserved(case) integer(33)operator(:) reserved(case) integer(34)operator(:) reserved(case) integer(35)operator(:) reserved(case) integer(36)operator(:) + ident(j) operator(=) operator(()ident(j) operator(+) integer(4)operator(\)) operator(/) integer(5)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(illegal radix %d)delimiter(")>operator(,) ident(base)operator(\);) + reserved(break)operator(;) + operator(}) + ident(j)operator(++;) comment(/* space for sign */) + + ident(hbase) operator(=) ident(base) operator(*) ident(base)operator(;) +preprocessor(#if) ident(SIZEOF_BDIGITS) operator(>) integer(2) + ident(hbase) operator(*=) ident(hbase)operator(;) +preprocessor(#endif) + + ident(t) operator(=) ident(rb_big_clone)operator(()ident(x)operator(\);) + ident(ds) operator(=) ident(BDIGITS)operator(()ident(t)operator(\);) + ident(ss) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(j)operator(+)integer(1)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(ss)operator(\)->)ident(ptr)operator(;) + + ident(s)operator([)integer(0)operator(]) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(?) char('+') operator(:) char('-')operator(;) + ident(TRAP_BEG)operator(;) + reserved(while) operator(()ident(i) operator(&&) ident(j) operator(>) integer(1)operator(\)) operator({) + pre_type(long) ident(k) operator(=) ident(i)operator(;) + ident(BDIGIT_DBL) ident(num) operator(=) integer(0)operator(;) + + reserved(while) operator(()ident(k)operator(--\)) operator({) + ident(num) operator(=) ident(BIGUP)operator(()ident(num)operator(\)) operator(+) ident(ds)operator([)ident(k)operator(];) + ident(ds)operator([)ident(k)operator(]) operator(=) operator(()ident(BDIGIT)operator(\)()ident(num) operator(/) ident(hbase)operator(\);) + ident(num) operator(%=) ident(hbase)operator(;) + operator(}) + reserved(if) operator(()ident(trim) operator(&&) ident(ds)operator([)ident(i)operator(-)integer(1)operator(]) operator(==) integer(0)operator(\)) ident(i)operator(--;) + ident(k) operator(=) ident(SIZEOF_BDIGITS)operator(;) + reserved(while) operator(()ident(k)operator(--\)) operator({) + ident(s)operator([--)ident(j)operator(]) operator(=) ident(ruby_digitmap)operator([)ident(num) operator(%) ident(base)operator(];) + ident(num) operator(/=) ident(base)operator(;) + reserved(if) operator((!)ident(trim) operator(&&) ident(j) operator(<=) integer(1)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(trim) operator(&&) ident(i) operator(==) integer(0) operator(&&) ident(num) operator(==) integer(0)operator(\)) reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(trim)operator(\)) operator({)reserved(while) operator(()ident(s)operator([)ident(j)operator(]) operator(==) char('0')operator(\)) ident(j)operator(++;}) + ident(i) operator(=) ident(RSTRING)operator(()ident(ss)operator(\)->)ident(len) operator(-) ident(j)operator(;) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + ident(memmove)operator(()ident(s)operator(,) ident(s)operator(+)ident(j)operator(,) ident(i)operator(\);) + ident(RSTRING)operator(()ident(ss)operator(\)->)ident(len) operator(=) ident(i)operator(-)integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(memmove)operator(()ident(s)operator(+)integer(1)operator(,) ident(s)operator(+)ident(j)operator(,) ident(i)operator(\);) + ident(RSTRING)operator(()ident(ss)operator(\)->)ident(len) operator(=) ident(i)operator(;) + operator(}) + ident(s)operator([)ident(RSTRING)operator(()ident(ss)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + ident(TRAP_END)operator(;) + + reserved(return) ident(ss)operator(;) +operator(}) + +ident(VALUE) +ident(rb_big2str)operator(()ident(VALUE) ident(x)operator(,) pre_type(int) ident(base)operator(\)) +operator({) + reserved(return) ident(rb_big2str0)operator(()ident(x)operator(,) ident(base)operator(,) ident(Qtrue)operator(\);) +operator(}) + +comment(/* + * call-seq: + * big.to_s(base=10\) => string + * + * Returns a string containing the representation of <i>big</i> radix + * <i>base</i> (2 through 36\). + * + * 12345654321.to_s #=> "12345654321" + * 12345654321.to_s(2\) #=> "1011011111110110111011110000110001" + * 12345654321.to_s(8\) #=> "133766736061" + * 12345654321.to_s(16\) #=> "2dfdbbc31" + * 78546939656932.to_s(36\) #=> "rubyrules" + */) + +directive(static) ident(VALUE) +ident(rb_big_to_s)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(x)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(x)operator(;) +operator({) + ident(VALUE) ident(b)operator(;) + pre_type(int) ident(base)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(b)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) ident(base) operator(=) integer(10)operator(;) + reserved(else) ident(base) operator(=) ident(NUM2INT)operator(()ident(b)operator(\);) + reserved(return) ident(rb_big2str)operator(()ident(x)operator(,) ident(base)operator(\);) +operator(}) + +directive(static) pre_type(unsigned) pre_type(long) +ident(big2ulong)operator(()ident(x)operator(,) ident(type)operator(\)) + ident(VALUE) ident(x)operator(;) + pre_type(char) operator(*)ident(type)operator(;) +operator({) + pre_type(long) ident(len) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(BDIGIT_DBL) ident(num)operator(;) + ident(BDIGIT) operator(*)ident(ds)operator(;) + + reserved(if) operator(()ident(len) operator(>) ident(SIZEOF_LONG)operator(/)ident(SIZEOF_BDIGITS)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(bignum too big to convert into `%s')delimiter(")>operator(,) ident(type)operator(\);) + ident(ds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(num) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(num) operator(=) ident(BIGUP)operator(()ident(num)operator(\);) + ident(num) operator(+=) ident(ds)operator([)ident(len)operator(];) + operator(}) + reserved(return) ident(num)operator(;) +operator(}) + +pre_type(unsigned) pre_type(long) +ident(rb_big2ulong_pack)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(unsigned) pre_type(long) ident(num) operator(=) ident(big2ulong)operator(()ident(x)operator(,) string<delimiter(")content(unsigned long)delimiter(")>operator(\);) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + reserved(return) operator(-)ident(num)operator(;) + operator(}) + reserved(return) ident(num)operator(;) +operator(}) + +pre_type(unsigned) pre_type(long) +ident(rb_big2ulong)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(unsigned) pre_type(long) ident(num) operator(=) ident(big2ulong)operator(()ident(x)operator(,) string<delimiter(")content(unsigned long)delimiter(")>operator(\);) + + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + reserved(if) operator((()pre_type(long)operator(\))ident(num) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(bignum out of range of unsigned long)delimiter(")>operator(\);) + operator(}) + reserved(return) operator(-)ident(num)operator(;) + operator(}) + reserved(return) ident(num)operator(;) +operator(}) + +pre_type(long) +ident(rb_big2long)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(unsigned) pre_type(long) ident(num) operator(=) ident(big2ulong)operator(()ident(x)operator(,) string<delimiter(")content(long)delimiter(")>operator(\);) + + reserved(if) operator((()pre_type(long)operator(\))ident(num) operator(<) integer(0) operator(&&) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(||) operator(()pre_type(long)operator(\))ident(num) operator(!=) ident(LONG_MIN)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(bignum too big to convert into `long')delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) reserved(return) operator(-()pre_type(long)operator(\))ident(num)operator(;) + reserved(return) ident(num)operator(;) +operator(}) + +preprocessor(#if) ident(HAVE_LONG_LONG) + +directive(static) pre_type(unsigned) ident(LONG_LONG) +ident(big2ull)operator(()ident(x)operator(,) ident(type)operator(\)) + ident(VALUE) ident(x)operator(;) + pre_type(char) operator(*)ident(type)operator(;) +operator({) + pre_type(long) ident(len) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(BDIGIT_DBL) ident(num)operator(;) + ident(BDIGIT) operator(*)ident(ds)operator(;) + + reserved(if) operator(()ident(len) operator(>) ident(SIZEOF_LONG_LONG)operator(/)ident(SIZEOF_BDIGITS)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(bignum too big to convert into `%s')delimiter(")>operator(,) ident(type)operator(\);) + ident(ds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(num) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(num) operator(=) ident(BIGUP)operator(()ident(num)operator(\);) + ident(num) operator(+=) ident(ds)operator([)ident(len)operator(];) + operator(}) + reserved(return) ident(num)operator(;) +operator(}) + +pre_type(unsigned) ident(LONG_LONG) +ident(rb_big2ull)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(unsigned) ident(LONG_LONG) ident(num) operator(=) ident(big2ull)operator(()ident(x)operator(,) string<delimiter(")content(unsigned long long)delimiter(")>operator(\);) + + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) reserved(return) operator(-)ident(num)operator(;) + reserved(return) ident(num)operator(;) +operator(}) + +ident(LONG_LONG) +ident(rb_big2ll)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(unsigned) ident(LONG_LONG) ident(num) operator(=) ident(big2ull)operator(()ident(x)operator(,) string<delimiter(")content(long long)delimiter(")>operator(\);) + + reserved(if) operator((()ident(LONG_LONG)operator(\))ident(num) operator(<) integer(0) operator(&&) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) + operator(||) operator(()ident(LONG_LONG)operator(\))ident(num) operator(!=) ident(LLONG_MIN)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(bignum too big to convert into `long long')delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) reserved(return) operator(-()ident(LONG_LONG)operator(\))ident(num)operator(;) + reserved(return) ident(num)operator(;) +operator(}) + +preprocessor(#endif) comment(/* HAVE_LONG_LONG */) + +directive(static) ident(VALUE) +ident(dbl2big)operator(()ident(d)operator(\)) + pre_type(double) ident(d)operator(;) +operator({) + pre_type(long) ident(i) operator(=) integer(0)operator(;) + ident(BDIGIT) ident(c)operator(;) + ident(BDIGIT) operator(*)ident(digits)operator(;) + ident(VALUE) ident(z)operator(;) + pre_type(double) ident(u) operator(=) operator(()ident(d) operator(<) integer(0)operator(\)?-)label(d)operator(:)ident(d)operator(;) + + reserved(if) operator(()ident(isinf)operator(()ident(d)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eFloatDomainError)operator(,) ident(d) operator(<) integer(0) operator(?) string<delimiter(")content(-Infinity)delimiter(")> operator(:) string<delimiter(")content(Infinity)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(isnan)operator(()ident(d)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eFloatDomainError)operator(,) string<delimiter(")content(NaN)delimiter(")>operator(\);) + operator(}) + + reserved(while) operator((!)ident(POSFIXABLE)operator(()ident(u)operator(\)) operator(||) integer(0) operator(!=) operator(()pre_type(long)operator(\))ident(u)operator(\)) operator({) + ident(u) operator(/=) operator(()pre_type(double)operator(\)()ident(BIGRAD)operator(\);) + ident(i)operator(++;) + operator(}) + ident(z) operator(=) ident(bignew)operator(()ident(i)operator(,) ident(d)operator(>=)integer(0)operator(\);) + ident(digits) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + reserved(while) operator(()ident(i)operator(--\)) operator({) + ident(u) operator(*=) ident(BIGRAD)operator(;) + ident(c) operator(=) operator(()ident(BDIGIT)operator(\))ident(u)operator(;) + ident(u) operator(-=) ident(c)operator(;) + ident(digits)operator([)ident(i)operator(]) operator(=) ident(c)operator(;) + operator(}) + + reserved(return) ident(z)operator(;) +operator(}) + +ident(VALUE) +ident(rb_dbl2big)operator(()ident(d)operator(\)) + pre_type(double) ident(d)operator(;) +operator({) + reserved(return) ident(bignorm)operator(()ident(dbl2big)operator(()ident(d)operator(\)\);) +operator(}) + +pre_type(double) +ident(rb_big2dbl)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(double) ident(d) operator(=) float(0)float(.0)operator(;) + pre_type(long) ident(i) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(BDIGIT) operator(*)ident(ds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + + reserved(while) operator(()ident(i)operator(--\)) operator({) + ident(d) operator(=) ident(ds)operator([)ident(i)operator(]) operator(+) ident(BIGRAD)operator(*)ident(d)operator(;) + operator(}) + reserved(if) operator(()ident(isinf)operator(()ident(d)operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(Bignum out of Float range)delimiter(")>operator(\);) + ident(d) operator(=) ident(HUGE_VAL)operator(;) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) ident(d) operator(=) operator(-)ident(d)operator(;) + reserved(return) ident(d)operator(;) +operator(}) + +comment(/* + * call-seq: + * big.to_f -> float + * + * Converts <i>big</i> to a <code>Float</code>. If <i>big</i> doesn't + * fit in a <code>Float</code>, the result is infinity. + * + */) + +directive(static) ident(VALUE) +ident(rb_big_to_f)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + reserved(return) ident(rb_float_new)operator(()ident(rb_big2dbl)operator(()ident(x)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * big <=> numeric => -1, 0, +1 + * + * Comparison---Returns -1, 0, or +1 depending on whether <i>big</i> is + * less than, equal to, or greater than <i>numeric</i>. This is the + * basis for the tests in <code>Comparable</code>. + * + */) + +directive(static) ident(VALUE) +ident(rb_big_cmp)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(xlen) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + operator({) + pre_type(double) ident(a) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + + reserved(if) operator(()ident(isinf)operator(()ident(a)operator(\)\)) operator({) + reserved(if) operator(()ident(a) operator(>) float(0)float(.0)operator(\)) reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + reserved(else) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + operator(}) + reserved(return) ident(rb_dbl_cmp)operator(()ident(rb_big2dbl)operator(()ident(x)operator(\),) ident(a)operator(\);) + operator(}) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_cmp)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(>) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(<) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + reserved(if) operator(()ident(xlen) operator(<) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) + reserved(return) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator(?) ident(INT2FIX)operator((-)integer(1)operator(\)) operator(:) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(xlen) operator(>) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) + reserved(return) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator(?) ident(INT2FIX)operator(()integer(1)operator(\)) operator(:) ident(INT2FIX)operator((-)integer(1)operator(\);) + + reserved(while)operator(()ident(xlen)operator(--) operator(&&) operator(()ident(BDIGITS)operator(()ident(x)operator(\)[)ident(xlen)operator(]==)ident(BDIGITS)operator(()ident(y)operator(\)[)ident(xlen)operator(]\)\);) + reserved(if) operator((-)integer(1) operator(==) ident(xlen)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(return) operator(()ident(BDIGITS)operator(()ident(x)operator(\)[)ident(xlen)operator(]) operator(>) ident(BDIGITS)operator(()ident(y)operator(\)[)ident(xlen)operator(]\)) operator(?) + operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(?) ident(INT2FIX)operator(()integer(1)operator(\)) operator(:) ident(INT2FIX)operator((-)integer(1)operator(\)\)) operator(:) + operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(?) ident(INT2FIX)operator((-)integer(1)operator(\)) operator(:) ident(INT2FIX)operator(()integer(1)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * big == obj => true or false + * + * Returns <code>true</code> only if <i>obj</i> has the same value + * as <i>big</i>. Contrast this with <code>Bignum#eql?</code>, which + * requires <i>obj</i> to be a <code>Bignum</code>. + * + * 68719476736 == 68719476736.0 #=> true + */) + +directive(static) ident(VALUE) +ident(rb_big_eq)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(break)operator(;) + reserved(case) label(T_BIGNUM)operator(:) + reserved(break)operator(;) + reserved(case) label(T_FLOAT)operator(:) + operator({) + directive(volatile) pre_type(double) ident(a)operator(,) ident(b)operator(;) + + ident(a) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(if) operator(()ident(isnan)operator(()ident(a)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + ident(b) operator(=) ident(rb_big2dbl)operator(()ident(x)operator(\);) + reserved(return) operator(()ident(a) operator(==) ident(b)operator(\)?)label(Qtrue)operator(:)ident(Qfalse)operator(;) + operator(}) + reserved(default)operator(:) + reserved(return) ident(rb_equal)operator(()ident(y)operator(,) ident(x)operator(\);) + operator(}) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(!=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(!=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(MEMCMP)operator(()ident(BDIGITS)operator(()ident(x)operator(\),)ident(BDIGITS)operator(()ident(y)operator(\),)ident(BDIGIT)operator(,)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) operator(!=) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * big.eql?(obj\) => true or false + * + * Returns <code>true</code> only if <i>obj</i> is a + * <code>Bignum</code> with the same value as <i>big</i>. Contrast this + * with <code>Bignum#==</code>, which performs type conversions. + * + * 68719476736.eql?(68719476736.0\) #=> false + */) + +directive(static) ident(VALUE) +ident(rb_big_eql)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(y)operator(\)) operator(!=) ident(T_BIGNUM)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(!=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(!=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(MEMCMP)operator(()ident(BDIGITS)operator(()ident(x)operator(\),)ident(BDIGITS)operator(()ident(y)operator(\),)ident(BDIGIT)operator(,)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) operator(!=) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * -big => other_big + * + * Unary minus (returns a new Bignum whose value is 0-big\) + */) + +directive(static) ident(VALUE) +ident(rb_big_uminus)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + ident(VALUE) ident(z) operator(=) ident(rb_big_clone)operator(()ident(x)operator(\);) + + ident(RBIGNUM)operator(()ident(z)operator(\)->)ident(sign) operator(=) operator(!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(;) + + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ~big => integer + * + * Inverts the bits in big. As Bignums are conceptually infinite + * length, the result acts as if it had an infinite number of one + * bits to the left. In hex representations, this is displayed + * as two periods to the left of the digits. + * + * sprintf("%X", ~0x1122334455\) #=> "..FEEDDCCBBAA" + */) + +directive(static) ident(VALUE) +ident(rb_big_neg)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + ident(VALUE) ident(z) operator(=) ident(rb_big_clone)operator(()ident(x)operator(\);) + pre_type(long) ident(i)operator(;) + ident(BDIGIT) operator(*)ident(ds)operator(;) + + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) ident(get2comp)operator(()ident(z)operator(\);) + ident(ds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + ident(i) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + reserved(if) operator((!)ident(i)operator(\)) reserved(return) ident(INT2FIX)operator((~)integer(0)operator(\);) + reserved(while) operator(()ident(i)operator(--\)) ident(ds)operator([)ident(i)operator(]) operator(=) operator(~)ident(ds)operator([)ident(i)operator(];) + ident(RBIGNUM)operator(()ident(z)operator(\)->)ident(sign) operator(=) operator(!)ident(RBIGNUM)operator(()ident(z)operator(\)->)ident(sign)operator(;) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) ident(get2comp)operator(()ident(z)operator(\);) + + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(bigsub)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(z) operator(=) integer(0)operator(;) + ident(BDIGIT) operator(*)ident(zds)operator(;) + ident(BDIGIT_DBL_SIGNED) ident(num)operator(;) + pre_type(long) ident(i) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + + comment(/* if x is larger than y, swap */) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(<) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) operator({) + ident(z) operator(=) ident(x)operator(;) ident(x) operator(=) ident(y)operator(;) ident(y) operator(=) ident(z)operator(;) comment(/* swap x y */) + operator(}) + reserved(else) reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(==) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) operator({) + reserved(while) operator(()ident(i) operator(>) integer(0)operator(\)) operator({) + ident(i)operator(--;) + reserved(if) operator(()ident(BDIGITS)operator(()ident(x)operator(\)[)ident(i)operator(]) operator(>) ident(BDIGITS)operator(()ident(y)operator(\)[)ident(i)operator(]\)) operator({) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(BDIGITS)operator(()ident(x)operator(\)[)ident(i)operator(]) operator(<) ident(BDIGITS)operator(()ident(y)operator(\)[)ident(i)operator(]\)) operator({) + ident(z) operator(=) ident(x)operator(;) ident(x) operator(=) ident(y)operator(;) ident(y) operator(=) ident(z)operator(;) comment(/* swap x y */) + reserved(break)operator(;) + operator(}) + operator(}) + operator(}) + + ident(z) operator(=) ident(bignew)operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(,) ident(z)operator(==)integer(0)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(,) ident(num) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(num) operator(+=) operator(()ident(BDIGIT_DBL_SIGNED)operator(\))ident(BDIGITS)operator(()ident(x)operator(\)[)ident(i)operator(]) operator(-) ident(BDIGITS)operator(()ident(y)operator(\)[)ident(i)operator(];) + ident(zds)operator([)ident(i)operator(]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) + reserved(while) operator(()ident(num) operator(&&) ident(i) operator(<) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(\)) operator({) + ident(num) operator(+=) ident(BDIGITS)operator(()ident(x)operator(\)[)ident(i)operator(];) + ident(zds)operator([)ident(i)operator(++]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) + reserved(while) operator(()ident(i) operator(<) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(\)) operator({) + ident(zds)operator([)ident(i)operator(]) operator(=) ident(BDIGITS)operator(()ident(x)operator(\)[)ident(i)operator(];) + ident(i)operator(++;) + operator(}) + + reserved(return) ident(z)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(bigadd)operator(()ident(x)operator(,) ident(y)operator(,) ident(sign)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) + pre_type(int) ident(sign)operator(;) +operator({) + ident(VALUE) ident(z)operator(;) + ident(BDIGIT_DBL) ident(num)operator(;) + pre_type(long) ident(i)operator(,) ident(len)operator(;) + + ident(sign) operator(=) operator(()ident(sign) operator(==) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\);) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(!=) ident(sign)operator(\)) operator({) + reserved(if) operator(()ident(sign)operator(\)) reserved(return) ident(bigsub)operator(()ident(y)operator(,) ident(x)operator(\);) + reserved(return) ident(bigsub)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(>) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) operator({) + ident(len) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(+) integer(1)operator(;) + ident(z) operator(=) ident(x)operator(;) ident(x) operator(=) ident(y)operator(;) ident(y) operator(=) ident(z)operator(;) + operator(}) + reserved(else) operator({) + ident(len) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len) operator(+) integer(1)operator(;) + operator(}) + ident(z) operator(=) ident(bignew)operator(()ident(len)operator(,) ident(sign)operator(\);) + + ident(len) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(,) ident(num) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(num) operator(+=) operator(()ident(BDIGIT_DBL)operator(\))ident(BDIGITS)operator(()ident(x)operator(\)[)ident(i)operator(]) operator(+) ident(BDIGITS)operator(()ident(y)operator(\)[)ident(i)operator(];) + ident(BDIGITS)operator(()ident(z)operator(\)[)ident(i)operator(]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) + ident(len) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(num) operator(&&) ident(i) operator(<) ident(len)operator(\)) operator({) + ident(num) operator(+=) ident(BDIGITS)operator(()ident(y)operator(\)[)ident(i)operator(];) + ident(BDIGITS)operator(()ident(z)operator(\)[)ident(i)operator(++]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) + reserved(while) operator(()ident(i) operator(<) ident(len)operator(\)) operator({) + ident(BDIGITS)operator(()ident(z)operator(\)[)ident(i)operator(]) operator(=) ident(BDIGITS)operator(()ident(y)operator(\)[)ident(i)operator(];) + ident(i)operator(++;) + operator(}) + ident(BDIGITS)operator(()ident(z)operator(\)[)ident(i)operator(]) operator(=) operator(()ident(BDIGIT)operator(\))ident(num)operator(;) + + reserved(return) ident(z)operator(;) +operator(}) + +comment(/* + * call-seq: + * big + other => Numeric + * + * Adds big and other, returning the result. + */) + +ident(VALUE) +ident(rb_big_plus)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + comment(/* fall through */) + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(bignorm)operator(()ident(bigadd)operator(()ident(x)operator(,) ident(y)operator(,) integer(1)operator(\)\);) + + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(rb_big2dbl)operator(()ident(x)operator(\)) operator(+) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * big - other => Numeric + * + * Subtracts other from big, returning the result. + */) + +ident(VALUE) +ident(rb_big_minus)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + comment(/* fall through */) + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(bignorm)operator(()ident(bigadd)operator(()ident(x)operator(,) ident(y)operator(,) integer(0)operator(\)\);) + + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(rb_big2dbl)operator(()ident(x)operator(\)) operator(-) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +ident(VALUE) +ident(rb_big_mul0)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(i)operator(,) ident(j)operator(;) + ident(BDIGIT_DBL) ident(n) operator(=) integer(0)operator(;) + ident(VALUE) ident(z)operator(;) + ident(BDIGIT) operator(*)ident(zds)operator(;) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(x)operator(\)\)) ident(x) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(x)operator(\)\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(rb_big2dbl)operator(()ident(x)operator(\)) operator(*) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + + ident(j) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(+) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len) operator(+) integer(1)operator(;) + ident(z) operator(=) ident(bignew)operator(()ident(j)operator(,) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(==)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + reserved(while) operator(()ident(j)operator(--\)) ident(zds)operator([)ident(j)operator(]) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(BDIGIT_DBL) ident(dd) operator(=) ident(BDIGITS)operator(()ident(x)operator(\)[)ident(i)operator(];) + reserved(if) operator(()ident(dd) operator(==) integer(0)operator(\)) reserved(continue)operator(;) + ident(n) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) ident(j)operator(++\)) operator({) + ident(BDIGIT_DBL) ident(ee) operator(=) ident(n) operator(+) operator(()ident(BDIGIT_DBL)operator(\))ident(dd) operator(*) ident(BDIGITS)operator(()ident(y)operator(\)[)ident(j)operator(];) + ident(n) operator(=) ident(zds)operator([)ident(i) operator(+) ident(j)operator(]) operator(+) ident(ee)operator(;) + reserved(if) operator(()ident(ee)operator(\)) ident(zds)operator([)ident(i) operator(+) ident(j)operator(]) operator(=) ident(BIGLO)operator(()ident(n)operator(\);) + ident(n) operator(=) ident(BIGDN)operator(()ident(n)operator(\);) + operator(}) + reserved(if) operator(()ident(n)operator(\)) operator({) + ident(zds)operator([)ident(i) operator(+) ident(j)operator(]) operator(=) ident(n)operator(;) + operator(}) + operator(}) + + reserved(return) ident(z)operator(;) +operator(}) + +comment(/* + * call-seq: + * big * other => Numeric + * + * Multiplies big and other, returning the result. + */) + +ident(VALUE) +ident(rb_big_mul)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(return) ident(bignorm)operator(()ident(rb_big_mul0)operator(()ident(x)operator(,) ident(y)operator(\)\);) +operator(}) + +directive(static) directive(void) +ident(bigdivrem)operator(()ident(x)operator(,) ident(y)operator(,) ident(divp)operator(,) ident(modp)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) + ident(VALUE) operator(*)ident(divp)operator(,) operator(*)ident(modp)operator(;) +operator({) + pre_type(long) ident(nx) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(,) ident(ny) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) + pre_type(long) ident(i)operator(,) ident(j)operator(;) + ident(VALUE) ident(yy)operator(,) ident(z)operator(;) + ident(BDIGIT) operator(*)ident(xds)operator(,) operator(*)ident(yds)operator(,) operator(*)ident(zds)operator(,) operator(*)ident(tds)operator(;) + ident(BDIGIT_DBL) ident(t2)operator(;) + ident(BDIGIT_DBL_SIGNED) ident(num)operator(;) + ident(BDIGIT) ident(dd)operator(,) ident(q)operator(;) + + reserved(if) operator(()ident(BIGZEROP)operator(()ident(y)operator(\)\)) ident(rb_num_zerodiv)operator((\);) + ident(yds) operator(=) ident(BDIGITS)operator(()ident(y)operator(\);) + reserved(if) operator(()ident(nx) operator(<) ident(ny) operator(||) operator(()ident(nx) operator(==) ident(ny) operator(&&) ident(BDIGITS)operator(()ident(x)operator(\)[)ident(nx) operator(-) integer(1)operator(]) operator(<) ident(BDIGITS)operator(()ident(y)operator(\)[)ident(ny) operator(-) integer(1)operator(]\)\)) operator({) + reserved(if) operator(()ident(divp)operator(\)) operator(*)ident(divp) operator(=) ident(rb_int2big)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(modp)operator(\)) operator(*)ident(modp) operator(=) ident(x)operator(;) + reserved(return)operator(;) + operator(}) + ident(xds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + reserved(if) operator(()ident(ny) operator(==) integer(1)operator(\)) operator({) + ident(dd) operator(=) ident(yds)operator([)integer(0)operator(];) + ident(z) operator(=) ident(rb_big_clone)operator(()ident(x)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + ident(t2) operator(=) integer(0)operator(;) ident(i) operator(=) ident(nx)operator(;) + reserved(while) operator(()ident(i)operator(--\)) operator({) + ident(t2) operator(=) ident(BIGUP)operator(()ident(t2)operator(\)) operator(+) ident(zds)operator([)ident(i)operator(];) + ident(zds)operator([)ident(i)operator(]) operator(=) operator(()ident(BDIGIT)operator(\)()ident(t2) operator(/) ident(dd)operator(\);) + ident(t2) operator(%=) ident(dd)operator(;) + operator(}) + ident(RBIGNUM)operator(()ident(z)operator(\)->)ident(sign) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(==)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(;) + reserved(if) operator(()ident(modp)operator(\)) operator({) + operator(*)ident(modp) operator(=) ident(rb_uint2big)operator((()pre_type(unsigned) pre_type(long)operator(\))ident(t2)operator(\);) + ident(RBIGNUM)operator((*)ident(modp)operator(\)->)ident(sign) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(;) + operator(}) + reserved(if) operator(()ident(divp)operator(\)) operator(*)ident(divp) operator(=) ident(z)operator(;) + reserved(return)operator(;) + operator(}) + ident(z) operator(=) ident(bignew)operator(()ident(nx)operator(==)ident(ny)operator(?)ident(nx)operator(+)integer(2)operator(:)ident(nx)operator(+)integer(1)operator(,) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(==)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + reserved(if) operator(()ident(nx)operator(==)ident(ny)operator(\)) ident(zds)operator([)ident(nx)operator(+)integer(1)operator(]) operator(=) integer(0)operator(;) + reserved(while) operator((!)ident(yds)operator([)ident(ny)operator(-)integer(1)operator(]\)) ident(ny)operator(--;) + + ident(dd) operator(=) integer(0)operator(;) + ident(q) operator(=) ident(yds)operator([)ident(ny)operator(-)integer(1)operator(];) + reserved(while) operator((()ident(q) operator(&) operator(()integer(1)operator(<<()ident(BITSPERDIG)operator(-)integer(1)operator(\)\)\)) operator(==) integer(0)operator(\)) operator({) + ident(q) operator(<<=) integer(1)operator(;) + ident(dd)operator(++;) + operator(}) + reserved(if) operator(()ident(dd)operator(\)) operator({) + ident(yy) operator(=) ident(rb_big_clone)operator(()ident(y)operator(\);) + ident(tds) operator(=) ident(BDIGITS)operator(()ident(yy)operator(\);) + ident(j) operator(=) integer(0)operator(;) + ident(t2) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(j)operator(<)ident(ny)operator(\)) operator({) + ident(t2) operator(+=) operator(()ident(BDIGIT_DBL)operator(\))ident(yds)operator([)ident(j)operator(]<<)ident(dd)operator(;) + ident(tds)operator([)ident(j)operator(++]) operator(=) ident(BIGLO)operator(()ident(t2)operator(\);) + ident(t2) operator(=) ident(BIGDN)operator(()ident(t2)operator(\);) + operator(}) + ident(yds) operator(=) ident(tds)operator(;) + ident(j) operator(=) integer(0)operator(;) + ident(t2) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(j)operator(<)ident(nx)operator(\)) operator({) + ident(t2) operator(+=) operator(()ident(BDIGIT_DBL)operator(\))ident(xds)operator([)ident(j)operator(]<<)ident(dd)operator(;) + ident(zds)operator([)ident(j)operator(++]) operator(=) ident(BIGLO)operator(()ident(t2)operator(\);) + ident(t2) operator(=) ident(BIGDN)operator(()ident(t2)operator(\);) + operator(}) + ident(zds)operator([)ident(j)operator(]) operator(=) operator(()ident(BDIGIT)operator(\))ident(t2)operator(;) + operator(}) + reserved(else) operator({) + ident(zds)operator([)ident(nx)operator(]) operator(=) integer(0)operator(;) + ident(j) operator(=) ident(nx)operator(;) + reserved(while) operator(()ident(j)operator(--\)) ident(zds)operator([)ident(j)operator(]) operator(=) ident(xds)operator([)ident(j)operator(];) + operator(}) + + ident(j) operator(=) ident(nx)operator(==)ident(ny)operator(?)ident(nx)operator(+)integer(1)operator(:)ident(nx)operator(;) + reserved(do) operator({) + reserved(if) operator(()ident(zds)operator([)ident(j)operator(]) operator(==) ident(yds)operator([)ident(ny)operator(-)integer(1)operator(]\)) ident(q) operator(=) ident(BIGRAD)operator(-)integer(1)operator(;) + reserved(else) ident(q) operator(=) operator(()ident(BDIGIT)operator(\)(()ident(BIGUP)operator(()ident(zds)operator([)ident(j)operator(]\)) operator(+) ident(zds)operator([)ident(j)operator(-)integer(1)operator(]\))operator(/)ident(yds)operator([)ident(ny)operator(-)integer(1)operator(]\);) + reserved(if) operator(()ident(q)operator(\)) operator({) + ident(i) operator(=) integer(0)operator(;) ident(num) operator(=) integer(0)operator(;) ident(t2) operator(=) integer(0)operator(;) + reserved(do) operator({) comment(/* multiply and subtract */) + ident(BDIGIT_DBL) ident(ee)operator(;) + ident(t2) operator(+=) operator(()ident(BDIGIT_DBL)operator(\))ident(yds)operator([)ident(i)operator(]) operator(*) ident(q)operator(;) + ident(ee) operator(=) ident(num) operator(-) ident(BIGLO)operator(()ident(t2)operator(\);) + ident(num) operator(=) operator(()ident(BDIGIT_DBL)operator(\))ident(zds)operator([)ident(j) operator(-) ident(ny) operator(+) ident(i)operator(]) operator(+) ident(ee)operator(;) + reserved(if) operator(()ident(ee)operator(\)) ident(zds)operator([)ident(j) operator(-) ident(ny) operator(+) ident(i)operator(]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + ident(t2) operator(=) ident(BIGDN)operator(()ident(t2)operator(\);) + operator(}) reserved(while) operator((++)ident(i) operator(<) ident(ny)operator(\);) + ident(num) operator(+=) ident(zds)operator([)ident(j) operator(-) ident(ny) operator(+) ident(i)operator(]) operator(-) ident(t2)operator(;)comment(/* borrow from high digit; don't update */) + reserved(while) operator(()ident(num)operator(\)) operator({) comment(/* "add back" required */) + ident(i) operator(=) integer(0)operator(;) ident(num) operator(=) integer(0)operator(;) ident(q)operator(--;) + reserved(do) operator({) + ident(BDIGIT_DBL) ident(ee) operator(=) ident(num) operator(+) ident(yds)operator([)ident(i)operator(];) + ident(num) operator(=) operator(()ident(BDIGIT_DBL)operator(\))ident(zds)operator([)ident(j) operator(-) ident(ny) operator(+) ident(i)operator(]) operator(+) ident(ee)operator(;) + reserved(if) operator(()ident(ee)operator(\)) ident(zds)operator([)ident(j) operator(-) ident(ny) operator(+) ident(i)operator(]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) reserved(while) operator((++)ident(i) operator(<) ident(ny)operator(\);) + ident(num)operator(--;) + operator(}) + operator(}) + ident(zds)operator([)ident(j)operator(]) operator(=) ident(q)operator(;) + operator(}) reserved(while) operator((--)ident(j) operator(>=) ident(ny)operator(\);) + reserved(if) operator(()ident(divp)operator(\)) operator({) comment(/* move quotient down in z */) + operator(*)ident(divp) operator(=) ident(rb_big_clone)operator(()ident(z)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator((*)ident(divp)operator(\);) + ident(j) operator(=) operator(()ident(nx)operator(==)ident(ny) operator(?) ident(nx)operator(+)integer(2) operator(:) ident(nx)operator(+)integer(1)operator(\)) operator(-) ident(ny)operator(;) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;)ident(i) operator(<) ident(j)operator(;)ident(i)operator(++\)) ident(zds)operator([)ident(i)operator(]) operator(=) ident(zds)operator([)ident(i)operator(+)ident(ny)operator(];) + ident(RBIGNUM)operator((*)ident(divp)operator(\)->)ident(len) operator(=) ident(i)operator(;) + operator(}) + reserved(if) operator(()ident(modp)operator(\)) operator({) comment(/* normalize remainder */) + operator(*)ident(modp) operator(=) ident(rb_big_clone)operator(()ident(z)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator((*)ident(modp)operator(\);) + reserved(while) operator((--)ident(ny) operator(&&) operator(!)ident(zds)operator([)ident(ny)operator(]\);) operator(++)ident(ny)operator(;) + reserved(if) operator(()ident(dd)operator(\)) operator({) + ident(t2) operator(=) integer(0)operator(;) ident(i) operator(=) ident(ny)operator(;) + reserved(while)operator(()ident(i)operator(--\)) operator({) + ident(t2) operator(=) operator(()ident(t2) operator(|) ident(zds)operator([)ident(i)operator(]\)) operator(>>) ident(dd)operator(;) + ident(q) operator(=) ident(zds)operator([)ident(i)operator(];) + ident(zds)operator([)ident(i)operator(]) operator(=) ident(BIGLO)operator(()ident(t2)operator(\);) + ident(t2) operator(=) ident(BIGUP)operator(()ident(q)operator(\);) + operator(}) + operator(}) + ident(RBIGNUM)operator((*)ident(modp)operator(\)->)ident(len) operator(=) ident(ny)operator(;) + ident(RBIGNUM)operator((*)ident(modp)operator(\)->)ident(sign) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(bigdivmod)operator(()ident(x)operator(,) ident(y)operator(,) ident(divp)operator(,) ident(modp)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) + ident(VALUE) operator(*)ident(divp)operator(,) operator(*)ident(modp)operator(;) +operator({) + ident(VALUE) ident(mod)operator(;) + + ident(bigdivrem)operator(()ident(x)operator(,) ident(y)operator(,) ident(divp)operator(,) operator(&)ident(mod)operator(\);) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(!=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign) operator(&&) operator(!)ident(BIGZEROP)operator(()ident(mod)operator(\)\)) operator({) + reserved(if) operator(()ident(divp)operator(\)) operator(*)ident(divp) operator(=) ident(bigadd)operator((*)ident(divp)operator(,) ident(rb_int2big)operator(()integer(1)operator(\),) integer(0)operator(\);) + reserved(if) operator(()ident(modp)operator(\)) operator(*)ident(modp) operator(=) ident(bigadd)operator(()ident(mod)operator(,) ident(y)operator(,) integer(1)operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(divp)operator(\)) operator(*)ident(divp) operator(=) operator(*)ident(divp)operator(;) + reserved(if) operator(()ident(modp)operator(\)) operator(*)ident(modp) operator(=) ident(mod)operator(;) + operator(}) +operator(}) + +comment(/* + * call-seq: + * big / other => Numeric + * big.div(other\) => Numeric + * + * Divides big by other, returning the result. + */) + +directive(static) ident(VALUE) +ident(rb_big_div)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(z)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(rb_big2dbl)operator(()ident(x)operator(\)) operator(/) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + ident(bigdivmod)operator(()ident(x)operator(,) ident(y)operator(,) operator(&)ident(z)operator(,) integer(0)operator(\);) + + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +comment(/* + * call-seq: + * big % other => Numeric + * big.modulo(other\) => Numeric + * + * Returns big modulo other. See Numeric.divmod for more + * information. + */) + +directive(static) ident(VALUE) +ident(rb_big_modulo)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(z)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + ident(bigdivmod)operator(()ident(x)operator(,) ident(y)operator(,) integer(0)operator(,) operator(&)ident(z)operator(\);) + + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +comment(/* + * call-seq: + * big.remainder(numeric\) => number + * + * Returns the remainder after dividing <i>big</i> by <i>numeric</i>. + * + * -1234567890987654321.remainder(13731\) #=> -6966 + * -1234567890987654321.remainder(13731.24\) #=> -9906.22531493148 + */) +directive(static) ident(VALUE) +ident(rb_big_remainder)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(z)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + ident(bigdivrem)operator(()ident(x)operator(,) ident(y)operator(,) integer(0)operator(,) operator(&)ident(z)operator(\);) + + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(big_lshift) ident(_)operator((()ident(VALUE)operator(,) pre_type(unsigned) pre_type(long)operator(\)\);) +directive(static) ident(VALUE) ident(big_rshift) ident(_)operator((()ident(VALUE)operator(,) pre_type(unsigned) pre_type(long)operator(\)\);) + +directive(static) ident(VALUE) ident(big_shift)operator(()ident(x)operator(,) ident(n)operator(\)) + ident(VALUE) ident(x)operator(;) + pre_type(int) ident(n)operator(;) +operator({) + reserved(if) operator(()ident(n) operator(<) integer(0)operator(\)) + reserved(return) ident(big_lshift)operator(()ident(x)operator(,) operator(()pre_type(unsigned) pre_type(int)operator(\))ident(n)operator(\);) + reserved(else) reserved(if) operator(()ident(n) operator(>) integer(0)operator(\)) + reserved(return) ident(big_rshift)operator(()ident(x)operator(,) operator(()pre_type(unsigned) pre_type(int)operator(\))ident(n)operator(\);) + reserved(return) ident(x)operator(;) +operator(}) + +comment(/* + * call-seq: + * big.divmod(numeric\) => array + * + * See <code>Numeric#divmod</code>. + * + */) +ident(VALUE) +ident(rb_big_divmod)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(div)operator(,) ident(mod)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + ident(bigdivmod)operator(()ident(x)operator(,) ident(y)operator(,) operator(&)ident(div)operator(,) operator(&)ident(mod)operator(\);) + + reserved(return) ident(rb_assoc_new)operator(()ident(bignorm)operator(()ident(div)operator(\),) ident(bignorm)operator(()ident(mod)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * big.quo(numeric\) -> float + * + * Returns the floating point result of dividing <i>big</i> by + * <i>numeric</i>. + * + * -1234567890987654321.quo(13731\) #=> -89910996357705.5 + * -1234567890987654321.quo(13731.24\) #=> -89909424858035.7 + * + */) + +directive(static) ident(VALUE) +ident(rb_big_quo)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(double) ident(dx) operator(=) ident(rb_big2dbl)operator(()ident(x)operator(\);) + pre_type(double) ident(dy)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(dy) operator(=) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + ident(dy) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + ident(dy) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + reserved(return) ident(rb_float_new)operator(()ident(dx) operator(/) ident(dy)operator(\);) +operator(}) + +comment(/* + * call-seq: + * big ** exponent #=> numeric + * + * Raises _big_ to the _exponent_ power (which may be an integer, float, + * or anything that will coerce to a number\). The result may be + * a Fixnum, Bignum, or Float + * + * 123456789 ** 2 #=> 15241578750190521 + * 123456789 ** 1.2 #=> 5126464716.09932 + * 123456789 ** -2 #=> 6.5610001194102e-17 + */) + +ident(VALUE) +ident(rb_big_pow)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + pre_type(long) ident(yy)operator(;) + + reserved(if) operator(()ident(y) operator(==) ident(INT2FIX)operator(()integer(0)operator(\)\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FLOAT)operator(:) + ident(d) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + ident(rb_warn)operator(()string<delimiter(")content(in a**b, b may be too big)delimiter(")>operator(\);) + ident(d) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FIXNUM)operator(:) + ident(yy) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(if) operator(()ident(yy) operator(>) integer(0)operator(\)) operator({) + ident(VALUE) ident(z) operator(=) ident(x)operator(;) + directive(const) pre_type(long) ident(BIGLEN_LIMIT) operator(=) integer(1024)operator(*)integer(1024) operator(/) ident(SIZEOF_BDIGITS)operator(;) + + reserved(if) operator((()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(>) ident(BIGLEN_LIMIT)operator(\)) operator(||) + operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(>) ident(BIGLEN_LIMIT) operator(/) ident(yy)operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(in a**b, b may be too big)delimiter(")>operator(\);) + ident(d) operator(=) operator(()pre_type(double)operator(\))ident(yy)operator(;) + reserved(break)operator(;) + operator(}) + reserved(for) operator((;;\)) operator({) + ident(yy) operator(-=) integer(1)operator(;) + reserved(if) operator(()ident(yy) operator(==) integer(0)operator(\)) reserved(break)operator(;) + reserved(while) operator(()ident(yy) operator(%) integer(2) operator(==) integer(0)operator(\)) operator({) + ident(yy) operator(/=) integer(2)operator(;) + ident(x) operator(=) ident(rb_big_mul0)operator(()ident(x)operator(,) ident(x)operator(\);) + ident(bigtrunc)operator(()ident(x)operator(\);) + operator(}) + ident(z) operator(=) ident(rb_big_mul0)operator(()ident(z)operator(,) ident(x)operator(\);) + ident(bigtrunc)operator(()ident(z)operator(\);) + operator(}) + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) + operator(}) + ident(d) operator(=) operator(()pre_type(double)operator(\))ident(yy)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + reserved(return) ident(rb_float_new)operator(()ident(pow)operator(()ident(rb_big2dbl)operator(()ident(x)operator(\),) ident(d)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * big & numeric => integer + * + * Performs bitwise +and+ between _big_ and _numeric_. + */) + +ident(VALUE) +ident(rb_big_and)operator(()ident(xx)operator(,) ident(yy)operator(\)) + ident(VALUE) ident(xx)operator(,) ident(yy)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(x)operator(,) ident(y)operator(,) ident(z)operator(;) + ident(BDIGIT) operator(*)ident(ds1)operator(,) operator(*)ident(ds2)operator(,) operator(*)ident(zds)operator(;) + pre_type(long) ident(i)operator(,) ident(l1)operator(,) ident(l2)operator(;) + pre_type(char) ident(sign)operator(;) + + ident(x) operator(=) ident(xx)operator(;) + ident(y) operator(=) ident(rb_to_int)operator(()ident(yy)operator(\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) operator({) + ident(y) operator(=) ident(rb_big_clone)operator(()ident(y)operator(\);) + ident(get2comp)operator(()ident(y)operator(\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + ident(x) operator(=) ident(rb_big_clone)operator(()ident(x)operator(\);) + ident(get2comp)operator(()ident(x)operator(\);) + operator(}) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(>) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) operator({) + ident(l1) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) + ident(l2) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(ds1) operator(=) ident(BDIGITS)operator(()ident(y)operator(\);) + ident(ds2) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(sign) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(;) + operator(}) + reserved(else) operator({) + ident(l1) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(l2) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) + ident(ds1) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(ds2) operator(=) ident(BDIGITS)operator(()ident(y)operator(\);) + ident(sign) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(;) + operator(}) + ident(z) operator(=) ident(bignew)operator(()ident(l2)operator(,) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(||) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(l1)operator(;) ident(i)operator(++\)) operator({) + ident(zds)operator([)ident(i)operator(]) operator(=) ident(ds1)operator([)ident(i)operator(]) operator(&) ident(ds2)operator([)ident(i)operator(];) + operator(}) + reserved(for) operator((;) ident(i)operator(<)ident(l2)operator(;) ident(i)operator(++\)) operator({) + ident(zds)operator([)ident(i)operator(]) operator(=) ident(sign)operator(?)integer(0)operator(:)ident(ds2)operator([)ident(i)operator(];) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(z)operator(\)->)ident(sign)operator(\)) ident(get2comp)operator(()ident(z)operator(\);) + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +comment(/* + * call-seq: + * big | numeric => integer + * + * Performs bitwise +or+ between _big_ and _numeric_. + */) + +ident(VALUE) +ident(rb_big_or)operator(()ident(xx)operator(,) ident(yy)operator(\)) + ident(VALUE) ident(xx)operator(,) ident(yy)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(x)operator(,) ident(y)operator(,) ident(z)operator(;) + ident(BDIGIT) operator(*)ident(ds1)operator(,) operator(*)ident(ds2)operator(,) operator(*)ident(zds)operator(;) + pre_type(long) ident(i)operator(,) ident(l1)operator(,) ident(l2)operator(;) + pre_type(char) ident(sign)operator(;) + + ident(x) operator(=) ident(xx)operator(;) + ident(y) operator(=) ident(rb_to_int)operator(()ident(yy)operator(\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) operator({) + ident(y) operator(=) ident(rb_big_clone)operator(()ident(y)operator(\);) + ident(get2comp)operator(()ident(y)operator(\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + ident(x) operator(=) ident(rb_big_clone)operator(()ident(x)operator(\);) + ident(get2comp)operator(()ident(x)operator(\);) + operator(}) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(>) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) operator({) + ident(l1) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) + ident(l2) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(ds1) operator(=) ident(BDIGITS)operator(()ident(y)operator(\);) + ident(ds2) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(sign) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(;) + operator(}) + reserved(else) operator({) + ident(l1) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(l2) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) + ident(ds1) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(ds2) operator(=) ident(BDIGITS)operator(()ident(y)operator(\);) + ident(sign) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(;) + operator(}) + ident(z) operator(=) ident(bignew)operator(()ident(l2)operator(,) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(&&) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(l1)operator(;) ident(i)operator(++\)) operator({) + ident(zds)operator([)ident(i)operator(]) operator(=) ident(ds1)operator([)ident(i)operator(]) operator(|) ident(ds2)operator([)ident(i)operator(];) + operator(}) + reserved(for) operator((;) ident(i)operator(<)ident(l2)operator(;) ident(i)operator(++\)) operator({) + ident(zds)operator([)ident(i)operator(]) operator(=) ident(sign)operator(?)ident(ds2)operator([)ident(i)operator(]:()ident(BIGRAD)operator(-)integer(1)operator(\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(z)operator(\)->)ident(sign)operator(\)) ident(get2comp)operator(()ident(z)operator(\);) + + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +comment(/* + * call-seq: + * big ^ numeric => integer + * + * Performs bitwise +exclusive or+ between _big_ and _numeric_. + */) + +ident(VALUE) +ident(rb_big_xor)operator(()ident(xx)operator(,) ident(yy)operator(\)) + ident(VALUE) ident(xx)operator(,) ident(yy)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(x)operator(,) ident(y)operator(;) + ident(VALUE) ident(z)operator(;) + ident(BDIGIT) operator(*)ident(ds1)operator(,) operator(*)ident(ds2)operator(,) operator(*)ident(zds)operator(;) + pre_type(long) ident(i)operator(,) ident(l1)operator(,) ident(l2)operator(;) + pre_type(char) ident(sign)operator(;) + + ident(x) operator(=) ident(xx)operator(;) + ident(y) operator(=) ident(rb_to_int)operator(()ident(yy)operator(\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + ident(y) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) operator({) + ident(y) operator(=) ident(rb_big_clone)operator(()ident(y)operator(\);) + ident(get2comp)operator(()ident(y)operator(\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + ident(x) operator(=) ident(rb_big_clone)operator(()ident(x)operator(\);) + ident(get2comp)operator(()ident(x)operator(\);) + operator(}) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len) operator(>) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(\)) operator({) + ident(l1) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) + ident(l2) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(ds1) operator(=) ident(BDIGITS)operator(()ident(y)operator(\);) + ident(ds2) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(sign) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(;) + operator(}) + reserved(else) operator({) + ident(l1) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(l2) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len)operator(;) + ident(ds1) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(ds2) operator(=) ident(BDIGITS)operator(()ident(y)operator(\);) + ident(sign) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(;) + operator(}) + ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(?)integer(1)operator(:)integer(0)operator(;) + ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign) operator(=) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(?)integer(1)operator(:)integer(0)operator(;) + ident(z) operator(=) ident(bignew)operator(()ident(l2)operator(,) operator(!()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(^) ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)\);) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(l1)operator(;) ident(i)operator(++\)) operator({) + ident(zds)operator([)ident(i)operator(]) operator(=) ident(ds1)operator([)ident(i)operator(]) operator(^) ident(ds2)operator([)ident(i)operator(];) + operator(}) + reserved(for) operator((;) ident(i)operator(<)ident(l2)operator(;) ident(i)operator(++\)) operator({) + ident(zds)operator([)ident(i)operator(]) operator(=) ident(sign)operator(?)ident(ds2)operator([)ident(i)operator(]:~)ident(ds2)operator([)ident(i)operator(];) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(z)operator(\)->)ident(sign)operator(\)) ident(get2comp)operator(()ident(z)operator(\);) + + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(check_shiftdown)operator(()ident(VALUE) ident(y)operator(,) ident(VALUE) ident(x)operator(\)) +operator({) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(len) operator(>) ident(SIZEOF_LONG) operator(/) ident(SIZEOF_BDIGITS)operator(\)) operator({) + reserved(return) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(?) ident(INT2FIX)operator(()integer(0)operator(\)) operator(:) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * big << numeric => integer + * + * Shifts big left _numeric_ positions (right if _numeric_ is negative\). + */) + +ident(VALUE) +ident(rb_big_lshift)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(shift)operator(;) + pre_type(int) ident(neg) operator(=) integer(0)operator(;) + + reserved(for) operator((;;\)) operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + ident(shift) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(if) operator(()ident(shift) operator(<) integer(0)operator(\)) operator({) + ident(neg) operator(=) integer(1)operator(;) + ident(shift) operator(=) operator(-)ident(shift)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(TYPE)operator(()ident(y)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) operator({) + ident(VALUE) ident(t) operator(=) ident(check_shiftdown)operator(()ident(y)operator(,) ident(x)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(t)operator(\)\)) reserved(return) ident(t)operator(;) + ident(neg) operator(=) integer(1)operator(;) + operator(}) + ident(shift) operator(=) ident(big2ulong)operator(()ident(y)operator(,) string<delimiter(")content(long)delimiter(")>operator(,) ident(Qtrue)operator(\);) + reserved(break)operator(;) + operator(}) + ident(y) operator(=) ident(rb_to_int)operator(()ident(y)operator(\);) + operator(}) + + reserved(if) operator(()ident(neg)operator(\)) reserved(return) ident(big_rshift)operator(()ident(x)operator(,) ident(shift)operator(\);) + reserved(return) ident(big_lshift)operator(()ident(x)operator(,) ident(shift)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(big_lshift)operator(()ident(x)operator(,) ident(shift)operator(\)) + ident(VALUE) ident(x)operator(;) + pre_type(unsigned) pre_type(long) ident(shift)operator(;) +operator({) + ident(BDIGIT) operator(*)ident(xds)operator(,) operator(*)ident(zds)operator(;) + pre_type(long) ident(s1) operator(=) ident(shift)operator(/)ident(BITSPERDIG)operator(;) + pre_type(int) ident(s2) operator(=) ident(shift)operator(%)ident(BITSPERDIG)operator(;) + ident(VALUE) ident(z)operator(;) + ident(BDIGIT_DBL) ident(num) operator(=) integer(0)operator(;) + pre_type(long) ident(len)operator(,) ident(i)operator(;) + + ident(len) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + ident(z) operator(=) ident(bignew)operator(()ident(len)operator(+)ident(s1)operator(+)integer(1)operator(,) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\);) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(s1)operator(;) ident(i)operator(++\)) operator({) + operator(*)ident(zds)operator(++) operator(=) integer(0)operator(;) + operator(}) + ident(xds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(num) operator(=) ident(num) operator(|) operator(()ident(BDIGIT_DBL)operator(\)*)ident(xds)operator(++<<)ident(s2)operator(;) + operator(*)ident(zds)operator(++) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) + operator(*)ident(zds) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +comment(/* + * call-seq: + * big >> numeric => integer + * + * Shifts big right _numeric_ positions (left if _numeric_ is negative\). + */) + +ident(VALUE) +ident(rb_big_rshift)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(shift)operator(;) + pre_type(int) ident(neg) operator(=) integer(0)operator(;) + + reserved(for) operator((;;\)) operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + ident(shift) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(if) operator(()ident(shift) operator(<) integer(0)operator(\)) operator({) + ident(neg) operator(=) integer(1)operator(;) + ident(shift) operator(=) operator(-)ident(shift)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(TYPE)operator(()ident(y)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) operator({) + ident(VALUE) ident(t) operator(=) ident(check_shiftdown)operator(()ident(y)operator(,) ident(x)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(t)operator(\)\)) reserved(return) ident(t)operator(;) + operator(}) + reserved(else) operator({) + ident(neg) operator(=) integer(1)operator(;) + operator(}) + ident(shift) operator(=) ident(big2ulong)operator(()ident(y)operator(,) string<delimiter(")content(long)delimiter(")>operator(,) ident(Qtrue)operator(\);) + reserved(break)operator(;) + operator(}) + ident(y) operator(=) ident(rb_to_int)operator(()ident(y)operator(\);) + operator(}) + + reserved(if) operator(()ident(neg)operator(\)) reserved(return) ident(big_lshift)operator(()ident(x)operator(,) ident(shift)operator(\);) + reserved(return) ident(big_rshift)operator(()ident(x)operator(,) ident(shift)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(big_rshift)operator(()ident(x)operator(,) ident(shift)operator(\)) + ident(VALUE) ident(x)operator(;) + pre_type(unsigned) pre_type(long) ident(shift)operator(;) +operator({) + ident(BDIGIT) operator(*)ident(xds)operator(,) operator(*)ident(zds)operator(;) + pre_type(long) ident(s1) operator(=) ident(shift)operator(/)ident(BITSPERDIG)operator(;) + pre_type(int) ident(s2) operator(=) ident(shift)operator(%)ident(BITSPERDIG)operator(;) + ident(VALUE) ident(z)operator(;) + ident(BDIGIT_DBL) ident(num) operator(=) integer(0)operator(;) + pre_type(long) ident(i)operator(,) ident(j)operator(;) + directive(volatile) ident(VALUE) ident(save_x)operator(;) + + reserved(if) operator(()ident(s1) operator(>) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(\)) operator({) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(else) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + ident(save_x) operator(=) ident(x) operator(=) ident(rb_big_clone)operator(()ident(x)operator(\);) + ident(get2comp)operator(()ident(x)operator(\);) + operator(}) + ident(xds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(i) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) ident(j) operator(=) ident(i) operator(-) ident(s1)operator(;) + reserved(if) operator(()ident(j) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(else) reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + ident(z) operator(=) ident(bignew)operator(()ident(j)operator(,) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\);) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + ident(num) operator(=) operator((()ident(BDIGIT_DBL)operator(\)~)integer(0)operator(\)) operator(<<) ident(BITSPERDIG)operator(;) + operator(}) + ident(zds) operator(=) ident(BDIGITS)operator(()ident(z)operator(\);) + reserved(while) operator(()ident(i)operator(--,) ident(j)operator(--\)) operator({) + ident(num) operator(=) operator(()ident(num) operator(|) ident(xds)operator([)ident(i)operator(]\)) operator(>>) ident(s2)operator(;) + ident(zds)operator([)ident(j)operator(]) operator(=) ident(BIGLO)operator(()ident(num)operator(\);) + ident(num) operator(=) ident(BIGUP)operator(()ident(xds)operator([)ident(i)operator(]\);) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + ident(get2comp)operator(()ident(z)operator(\);) + operator(}) + reserved(return) ident(bignorm)operator(()ident(z)operator(\);) +operator(}) + +comment(/* + * call-seq: + * big[n] -> 0, 1 + * + * Bit Reference---Returns the <em>n</em>th bit in the (assumed\) binary + * representation of <i>big</i>, where <i>big</i>[0] is the least + * significant bit. + * + * a = 9**15 + * 50.downto(0\) do |n| + * print a[n] + * end + * + * <em>produces:</em> + * + * 000101110110100000111000011110010100111100010111001 + * + */) + +directive(static) ident(VALUE) +ident(rb_big_aref)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(BDIGIT) operator(*)ident(xds)operator(;) + ident(BDIGIT_DBL) ident(num)operator(;) + pre_type(unsigned) pre_type(long) ident(shift)operator(;) + pre_type(long) ident(i)operator(,) ident(s1)operator(,) ident(s2)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(y)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(y)operator(\)->)ident(sign)operator(\)) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(bigtrunc)operator(()ident(y)operator(\)\)->)ident(len) operator(>) ident(SIZEOF_LONG)operator(/)ident(SIZEOF_BDIGITS)operator(\)) operator({) + label(out_of_range)operator(:) + reserved(return) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(?) ident(INT2FIX)operator(()integer(0)operator(\)) operator(:) ident(INT2FIX)operator(()integer(1)operator(\);) + operator(}) + ident(shift) operator(=) ident(big2ulong)operator(()ident(y)operator(,) string<delimiter(")content(long)delimiter(")>operator(,) ident(Qfalse)operator(\);) + operator(}) + reserved(else) operator({) + ident(i) operator(=) ident(NUM2LONG)operator(()ident(y)operator(\);) + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + ident(shift) operator(=) operator(()ident(VALUE)operator(\))ident(i)operator(;) + operator(}) + ident(s1) operator(=) ident(shift)operator(/)ident(BITSPERDIG)operator(;) + ident(s2) operator(=) ident(shift)operator(%)ident(BITSPERDIG)operator(;) + + reserved(if) operator(()ident(s1) operator(>=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(\)) reserved(goto) ident(out_of_range)operator(;) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + ident(xds) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) + ident(i) operator(=) integer(0)operator(;) ident(num) operator(=) integer(1)operator(;) + reserved(while) operator(()ident(num) operator(+=) operator(~)ident(xds)operator([)ident(i)operator(],) operator(++)ident(i) operator(<=) ident(s1)operator(\)) operator({) + ident(num) operator(=) ident(BIGDN)operator(()ident(num)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(num) operator(=) ident(BDIGITS)operator(()ident(x)operator(\)[)ident(s1)operator(];) + operator(}) + reserved(if) operator(()ident(num) operator(&) operator((()ident(BDIGIT_DBL)operator(\))integer(1)operator(<<)ident(s2)operator(\)\)) + reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * big.hash => fixnum + * + * Compute a hash based on the value of _big_. + */) + +directive(static) ident(VALUE) +ident(rb_big_hash)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + pre_type(long) ident(i)operator(,) ident(len)operator(,) ident(key)operator(;) + ident(BDIGIT) operator(*)ident(digits)operator(;) + + ident(key) operator(=) integer(0)operator(;) ident(digits) operator(=) ident(BDIGITS)operator(()ident(x)operator(\);) ident(len) operator(=) ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(len)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(key) operator(^=) operator(*)ident(digits)operator(++;) + operator(}) + reserved(return) ident(LONG2FIX)operator(()ident(key)operator(\);) +operator(}) + +comment(/* + * MISSING: documentation + */) + +directive(static) ident(VALUE) +ident(rb_big_coerce)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + reserved(return) ident(rb_assoc_new)operator(()ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(y)operator(\)\),) ident(x)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(TYPE)operator(()ident(y)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + reserved(return) ident(rb_assoc_new)operator(()ident(y)operator(,) ident(x)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't coerce %s to Bignum)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(y)operator(\)\);) + operator(}) + comment(/* not reached */) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * big.abs -> aBignum + * + * Returns the absolute value of <i>big</i>. + * + * -1234567890987654321.abs #=> 1234567890987654321 + */) + +directive(static) ident(VALUE) +ident(rb_big_abs)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign)operator(\)) operator({) + ident(x) operator(=) ident(rb_big_clone)operator(()ident(x)operator(\);) + ident(RBIGNUM)operator(()ident(x)operator(\)->)ident(sign) operator(=) integer(1)operator(;) + operator(}) + reserved(return) ident(x)operator(;) +operator(}) + +ident(VALUE) +ident(rb_big_rand)operator(()ident(max)operator(,) ident(rand_buf)operator(\)) + ident(VALUE) ident(max)operator(;) + pre_type(double) operator(*)ident(rand_buf)operator(;) +operator({) + ident(VALUE) ident(v)operator(;) + pre_type(long) ident(len) operator(=) ident(RBIGNUM)operator(()ident(max)operator(\)->)ident(len)operator(;) + + reserved(if) operator(()ident(BIGZEROP)operator(()ident(max)operator(\)\)) operator({) + reserved(return) ident(rb_float_new)operator(()ident(rand_buf)operator([)integer(0)operator(]\);) + operator(}) + ident(v) operator(=) ident(bignew)operator(()ident(len)operator(,)integer(1)operator(\);) + ident(len)operator(--;) + ident(BDIGITS)operator(()ident(v)operator(\)[)ident(len)operator(]) operator(=) ident(BDIGITS)operator(()ident(max)operator(\)[)ident(len)operator(]) operator(*) ident(rand_buf)operator([)ident(len)operator(];) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(BDIGITS)operator(()ident(v)operator(\)[)ident(len)operator(]) operator(=) operator((()ident(BDIGIT)operator(\)~)integer(0)operator(\)) operator(*) ident(rand_buf)operator([)ident(len)operator(];) + operator(}) + + reserved(return) ident(v)operator(;) +operator(}) + +comment(/* + * call-seq: + * big.size -> integer + * + * Returns the number of bytes in the machine representation of + * <i>big</i>. + * + * (256**10 - 1\).size #=> 12 + * (256**20 - 1\).size #=> 20 + * (256**40 - 1\).size #=> 40 + */) + +directive(static) ident(VALUE) +ident(rb_big_size)operator(()ident(big)operator(\)) + ident(VALUE) ident(big)operator(;) +operator({) + reserved(return) ident(LONG2FIX)operator(()ident(RBIGNUM)operator(()ident(big)operator(\)->)ident(len)operator(*)ident(SIZEOF_BDIGITS)operator(\);) +operator(}) + +comment(/* + * Bignum objects hold integers outside the range of + * Fixnum. Bignum objects are created + * automatically when integer calculations would otherwise overflow a + * Fixnum. When a calculation involving + * Bignum objects returns a result that will fit in a + * Fixnum, the result is automatically converted. + * + * For the purposes of the bitwise operations and <code>[]</code>, a + * Bignum is treated as if it were an infinite-length + * bitstring with 2's complement representation. + * + * While Fixnum values are immediate, Bignum + * objects are not---assignment and parameter passing work with + * references to objects, not the objects themselves. + * + */) + +directive(void) +ident(Init_Bignum)operator((\)) +operator({) + ident(rb_cBignum) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Bignum)delimiter(")>operator(,) ident(rb_cInteger)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(rb_big_to_s)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(coerce)delimiter(")>operator(,) ident(rb_big_coerce)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(-@)delimiter(")>operator(,) ident(rb_big_uminus)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(rb_big_plus)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(rb_big_minus)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(rb_big_mul)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(rb_big_div)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(rb_big_modulo)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(div)delimiter(")>operator(,) ident(rb_big_div)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(rb_big_divmod)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(modulo)delimiter(")>operator(,) ident(rb_big_modulo)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(remainder)delimiter(")>operator(,) ident(rb_big_remainder)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(quo)delimiter(")>operator(,) ident(rb_big_quo)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(rb_big_pow)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) ident(rb_big_and)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(|)delimiter(")>operator(,) ident(rb_big_or)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(^)delimiter(")>operator(,) ident(rb_big_xor)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(~)delimiter(")>operator(,) ident(rb_big_neg)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(<<)delimiter(")>operator(,) ident(rb_big_lshift)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(>>)delimiter(")>operator(,) ident(rb_big_rshift)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(rb_big_aref)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(rb_big_cmp)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(rb_big_eq)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(rb_big_eql)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(hash)delimiter(")>operator(,) ident(rb_big_hash)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(to_f)delimiter(")>operator(,) ident(rb_big_to_f)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(abs)delimiter(")>operator(,) ident(rb_big_abs)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBignum)operator(,) string<delimiter(")content(size)delimiter(")>operator(,) ident(rb_big_size)operator(,) integer(0)operator(\);) +operator(}) +comment(/********************************************************************** + + class.c - + + $Author: shyouhei $ + $Date: 2009-01-16 02:58:45 +0100 (Fri, 16 Jan 2009\) $ + created at: Tue Aug 10 15:05:44 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("rubysig.h") +preprocessor(#include) include("node.h") +preprocessor(#include) include("st.h") +preprocessor(#include) include(<ctype.h>) + +directive(extern) ident(st_table) operator(*)ident(rb_class_tbl)operator(;) + +ident(VALUE) +ident(rb_class_boot)operator(()ident(super)operator(\)) + ident(VALUE) ident(super)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(klass)operator(,) reserved(struct) ident(RClass)operator(\);) + ident(OBJSETUP)operator(()ident(klass)operator(,) ident(rb_cClass)operator(,) ident(T_CLASS)operator(\);) + + ident(klass)operator(->)ident(super) operator(=) ident(super)operator(;) + ident(klass)operator(->)ident(iv_tbl) operator(=) integer(0)operator(;) + ident(klass)operator(->)ident(m_tbl) operator(=) integer(0)operator(;) comment(/* safe GC */) + ident(klass)operator(->)ident(m_tbl) operator(=) ident(st_init_numtable)operator((\);) + + ident(OBJ_INFECT)operator(()ident(klass)operator(,) ident(super)operator(\);) + reserved(return) operator(()ident(VALUE)operator(\))ident(klass)operator(;) +operator(}) + +ident(VALUE) +ident(rb_class_new)operator(()ident(super)operator(\)) + ident(VALUE) ident(super)operator(;) +operator({) + ident(Check_Type)operator(()ident(super)operator(,) ident(T_CLASS)operator(\);) + reserved(if) operator(()ident(super) operator(==) ident(rb_cClass)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't make subclass of Class)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(FL_TEST)operator(()ident(super)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't make subclass of virtual class)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(rb_class_boot)operator(()ident(super)operator(\);) +operator(}) + +reserved(struct) ident(clone_method_data) operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + ident(VALUE) ident(klass)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(clone_method)operator(()ident(mid)operator(,) ident(body)operator(,) ident(data)operator(\)) + ident(ID) ident(mid)operator(;) + ident(NODE) operator(*)ident(body)operator(;) + reserved(struct) ident(clone_method_data) operator(*)ident(data)operator(;) +operator({) + ident(NODE) operator(*)ident(fbody) operator(=) ident(body)operator(->)ident(nd_body)operator(;) + + reserved(if) operator(()ident(fbody) operator(&&) ident(nd_type)operator(()ident(fbody)operator(\)) operator(==) ident(NODE_SCOPE)operator(\)) operator({) + ident(NODE) operator(*)ident(cref) operator(=) operator(()ident(NODE)operator(*\))ident(fbody)operator(->)ident(nd_rval)operator(;) + + reserved(if) operator(()ident(cref)operator(\)) ident(cref) operator(=) ident(cref)operator(->)ident(nd_next)operator(;) + ident(fbody) operator(=) ident(rb_copy_node_scope)operator(()ident(fbody)operator(,) ident(NEW_CREF)operator(()ident(data)operator(->)ident(klass)operator(,) ident(cref)operator(\)\);) + operator(}) + ident(st_insert)operator(()ident(data)operator(->)ident(tbl)operator(,) ident(mid)operator(,) operator(()ident(st_data_t)operator(\))ident(NEW_METHOD)operator(()ident(fbody)operator(,) ident(body)operator(->)ident(nd_noex)operator(\)\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* :nodoc: */) +ident(VALUE) +ident(rb_mod_init_copy)operator(()ident(clone)operator(,) ident(orig)operator(\)) + ident(VALUE) ident(clone)operator(,) ident(orig)operator(;) +operator({) + ident(rb_obj_init_copy)operator(()ident(clone)operator(,) ident(orig)operator(\);) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(CLASS_OF)operator(()ident(clone)operator(\),) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(RBASIC)operator(()ident(clone)operator(\)->)ident(klass) operator(=) ident(RBASIC)operator(()ident(orig)operator(\)->)ident(klass)operator(;) + ident(RBASIC)operator(()ident(clone)operator(\)->)ident(klass) operator(=) ident(rb_singleton_class_clone)operator(()ident(clone)operator(\);) + operator(}) + ident(RCLASS)operator(()ident(clone)operator(\)->)ident(super) operator(=) ident(RCLASS)operator(()ident(orig)operator(\)->)ident(super)operator(;) + reserved(if) operator(()ident(RCLASS)operator(()ident(orig)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(ID) ident(id)operator(;) + + ident(RCLASS)operator(()ident(clone)operator(\)->)ident(iv_tbl) operator(=) ident(st_copy)operator(()ident(RCLASS)operator(()ident(orig)operator(\)->)ident(iv_tbl)operator(\);) + ident(id) operator(=) ident(rb_intern)operator(()string<delimiter(")content(__classpath__)delimiter(")>operator(\);) + ident(st_delete)operator(()ident(RCLASS)operator(()ident(clone)operator(\)->)ident(iv_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) integer(0)operator(\);) + ident(id) operator(=) ident(rb_intern)operator(()string<delimiter(")content(__classid__)delimiter(")>operator(\);) + ident(st_delete)operator(()ident(RCLASS)operator(()ident(clone)operator(\)->)ident(iv_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(RCLASS)operator(()ident(orig)operator(\)->)ident(m_tbl)operator(\)) operator({) + reserved(struct) ident(clone_method_data) ident(data)operator(;) + + ident(data)operator(.)ident(tbl) operator(=) ident(RCLASS)operator(()ident(clone)operator(\)->)ident(m_tbl) operator(=) ident(st_init_numtable)operator((\);) + ident(data)operator(.)ident(klass) operator(=) operator(()ident(VALUE)operator(\))ident(clone)operator(;) + + ident(st_foreach)operator(()ident(RCLASS)operator(()ident(orig)operator(\)->)ident(m_tbl)operator(,) ident(clone_method)operator(,) operator(()ident(st_data_t)operator(\)&)ident(data)operator(\);) + operator(}) + + reserved(return) ident(clone)operator(;) +operator(}) + +comment(/* :nodoc: */) +ident(VALUE) +ident(rb_class_init_copy)operator(()ident(clone)operator(,) ident(orig)operator(\)) + ident(VALUE) ident(clone)operator(,) ident(orig)operator(;) +operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(clone)operator(\)->)ident(super) operator(!=) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(already initialized class)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(FL_TEST)operator(()ident(orig)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't copy singleton class)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(rb_mod_init_copy)operator(()ident(clone)operator(,) ident(orig)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_singleton_class_clone)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(klass) operator(=) ident(RBASIC)operator(()ident(obj)operator(\)->)ident(klass)operator(;) + + reserved(if) operator((!)ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) + reserved(return) ident(klass)operator(;) + reserved(else) operator({) + comment(/* copy singleton(unnamed\) class */) + ident(NEWOBJ)operator(()ident(clone)operator(,) reserved(struct) ident(RClass)operator(\);) + ident(OBJSETUP)operator(()ident(clone)operator(,) integer(0)operator(,) ident(RBASIC)operator(()ident(klass)operator(\)->)ident(flags)operator(\);) + + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(obj)operator(\)) operator(==) ident(T_CLASS)operator(\)) operator({) + ident(RBASIC)operator(()ident(clone)operator(\)->)ident(klass) operator(=) operator(()ident(VALUE)operator(\))ident(clone)operator(;) + operator(}) + reserved(else) operator({) + ident(RBASIC)operator(()ident(clone)operator(\)->)ident(klass) operator(=) ident(rb_singleton_class_clone)operator(()ident(klass)operator(\);) + operator(}) + + ident(clone)operator(->)ident(super) operator(=) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) + ident(clone)operator(->)ident(iv_tbl) operator(=) integer(0)operator(;) + ident(clone)operator(->)ident(m_tbl) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(clone)operator(->)ident(iv_tbl) operator(=) ident(st_copy)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(\);) + operator(}) + operator({) + reserved(struct) ident(clone_method_data) ident(data)operator(;) + + ident(data)operator(.)ident(tbl) operator(=) ident(clone)operator(->)ident(m_tbl) operator(=) ident(st_init_numtable)operator((\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + ident(data)operator(.)ident(klass) operator(=) ident(obj)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(data)operator(.)ident(klass) operator(=) integer(0)operator(;) + reserved(break)operator(;) + operator(}) + + ident(st_foreach)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) ident(clone_method)operator(,) operator(()ident(st_data_t)operator(\)&)ident(data)operator(\);) + operator(}) + ident(rb_singleton_class_attached)operator(()ident(RBASIC)operator(()ident(clone)operator(\)->)ident(klass)operator(,) operator(()ident(VALUE)operator(\))ident(clone)operator(\);) + ident(FL_SET)operator(()ident(clone)operator(,) ident(FL_SINGLETON)operator(\);) + reserved(return) operator(()ident(VALUE)operator(\))ident(clone)operator(;) + operator(}) +operator(}) + +directive(void) +ident(rb_singleton_class_attached)operator(()ident(klass)operator(,) ident(obj)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + reserved(if) operator((!)ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + ident(st_insert)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) ident(rb_intern)operator(()string<delimiter(")content(__attached__)delimiter(")>operator(\),) ident(obj)operator(\);) + operator(}) +operator(}) + +ident(VALUE) +ident(rb_make_metaclass)operator(()ident(obj)operator(,) ident(super)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(super)operator(;) +operator({) + ident(VALUE) ident(klass) operator(=) ident(rb_class_boot)operator(()ident(super)operator(\);) + ident(FL_SET)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\);) + ident(RBASIC)operator(()ident(obj)operator(\)->)ident(klass) operator(=) ident(klass)operator(;) + ident(rb_singleton_class_attached)operator(()ident(klass)operator(,) ident(obj)operator(\);) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(obj)operator(\)) operator(==) ident(T_CLASS) operator(&&) ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass) operator(=) ident(klass)operator(;) + ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super) operator(=) ident(RBASIC)operator(()ident(rb_class_real)operator(()ident(RCLASS)operator(()ident(obj)operator(\)->)ident(super)operator(\)\)->)ident(klass)operator(;) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(metasuper) operator(=) ident(RBASIC)operator(()ident(rb_class_real)operator(()ident(super)operator(\)\)->)ident(klass)operator(;) + + comment(/* metaclass of a superclass may be NULL at boot time */) + reserved(if) operator(()ident(metasuper)operator(\)) operator({) + ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass) operator(=) ident(metasuper)operator(;) + operator(}) + operator(}) + + reserved(return) ident(klass)operator(;) +operator(}) + +ident(VALUE) +ident(rb_define_class_id)operator(()ident(id)operator(,) ident(super)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(super)operator(;) +operator({) + ident(VALUE) ident(klass)operator(;) + + reserved(if) operator((!)ident(super)operator(\)) ident(super) operator(=) ident(rb_cObject)operator(;) + ident(klass) operator(=) ident(rb_class_new)operator(()ident(super)operator(\);) + ident(rb_make_metaclass)operator(()ident(klass)operator(,) ident(RBASIC)operator(()ident(super)operator(\)->)ident(klass)operator(\);) + + reserved(return) ident(klass)operator(;) +operator(}) + +directive(void) +ident(rb_check_inheritable)operator(()ident(super)operator(\)) + ident(VALUE) ident(super)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(super)operator(\)) operator(!=) ident(T_CLASS)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(superclass must be a Class (%s given\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(super)operator(\)\);) + operator(}) + reserved(if) operator(()ident(RBASIC)operator(()ident(super)operator(\)->)ident(flags) operator(&) ident(FL_SINGLETON)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't make subclass of virtual class)delimiter(")>operator(\);) + operator(}) +operator(}) + +ident(VALUE) +ident(rb_class_inherited)operator(()ident(super)operator(,) ident(klass)operator(\)) + ident(VALUE) ident(super)operator(,) ident(klass)operator(;) +operator({) + reserved(if) operator((!)ident(super)operator(\)) ident(super) operator(=) ident(rb_cObject)operator(;) + reserved(return) ident(rb_funcall)operator(()ident(super)operator(,) ident(rb_intern)operator(()string<delimiter(")content(inherited)delimiter(")>operator(\),) integer(1)operator(,) ident(klass)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_define_class)operator(()ident(name)operator(,) ident(super)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(super)operator(;) +operator({) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) + + ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + reserved(if) operator(()ident(rb_const_defined)operator(()ident(rb_cObject)operator(,) ident(id)operator(\)\)) operator({) + ident(klass) operator(=) ident(rb_const_get)operator(()ident(rb_cObject)operator(,) ident(id)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(!=) ident(T_CLASS)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s is not a class)delimiter(")>operator(,) ident(name)operator(\);) + operator(}) + reserved(if) operator(()ident(rb_class_real)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(\)) operator(!=) ident(super)operator(\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(%s is already defined)delimiter(")>operator(,) ident(name)operator(\);) + operator(}) + reserved(return) ident(klass)operator(;) + operator(}) + reserved(if) operator((!)ident(super)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(no super class for `%s', Object assumed)delimiter(")>operator(,) ident(name)operator(\);) + operator(}) + ident(klass) operator(=) ident(rb_define_class_id)operator(()ident(id)operator(,) ident(super)operator(\);) + ident(st_add_direct)operator(()ident(rb_class_tbl)operator(,) ident(id)operator(,) ident(klass)operator(\);) + ident(rb_name_class)operator(()ident(klass)operator(,) ident(id)operator(\);) + ident(rb_const_set)operator(()ident(rb_cObject)operator(,) ident(id)operator(,) ident(klass)operator(\);) + ident(rb_class_inherited)operator(()ident(super)operator(,) ident(klass)operator(\);) + + reserved(return) ident(klass)operator(;) +operator(}) + +ident(VALUE) +ident(rb_define_class_under)operator(()ident(outer)operator(,) ident(name)operator(,) ident(super)operator(\)) + ident(VALUE) ident(outer)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(super)operator(;) +operator({) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) + + ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + reserved(if) operator(()ident(rb_const_defined_at)operator(()ident(outer)operator(,) ident(id)operator(\)\)) operator({) + ident(klass) operator(=) ident(rb_const_get_at)operator(()ident(outer)operator(,) ident(id)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(!=) ident(T_CLASS)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s is not a class)delimiter(")>operator(,) ident(name)operator(\);) + operator(}) + reserved(if) operator(()ident(rb_class_real)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(\)) operator(!=) ident(super)operator(\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(%s is already defined)delimiter(")>operator(,) ident(name)operator(\);) + operator(}) + reserved(return) ident(klass)operator(;) + operator(}) + reserved(if) operator((!)ident(super)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(no super class for `%s::%s', Object assumed)delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(outer)operator(\),) ident(name)operator(\);) + operator(}) + ident(klass) operator(=) ident(rb_define_class_id)operator(()ident(id)operator(,) ident(super)operator(\);) + ident(rb_set_class_path)operator(()ident(klass)operator(,) ident(outer)operator(,) ident(name)operator(\);) + ident(rb_const_set)operator(()ident(outer)operator(,) ident(id)operator(,) ident(klass)operator(\);) + ident(rb_class_inherited)operator(()ident(super)operator(,) ident(klass)operator(\);) + + reserved(return) ident(klass)operator(;) +operator(}) + +ident(VALUE) +ident(rb_module_new)operator((\)) +operator({) + ident(NEWOBJ)operator(()ident(mdl)operator(,) reserved(struct) ident(RClass)operator(\);) + ident(OBJSETUP)operator(()ident(mdl)operator(,) ident(rb_cModule)operator(,) ident(T_MODULE)operator(\);) + + ident(mdl)operator(->)ident(super) operator(=) integer(0)operator(;) + ident(mdl)operator(->)ident(iv_tbl) operator(=) integer(0)operator(;) + ident(mdl)operator(->)ident(m_tbl) operator(=) integer(0)operator(;) + ident(mdl)operator(->)ident(m_tbl) operator(=) ident(st_init_numtable)operator((\);) + + reserved(return) operator(()ident(VALUE)operator(\))ident(mdl)operator(;) +operator(}) + +ident(VALUE) +ident(rb_define_module_id)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(mdl)operator(;) + + ident(mdl) operator(=) ident(rb_module_new)operator((\);) + ident(rb_name_class)operator(()ident(mdl)operator(,) ident(id)operator(\);) + + reserved(return) ident(mdl)operator(;) +operator(}) + +ident(VALUE) +ident(rb_define_module)operator(()ident(name)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(VALUE) ident(module)operator(;) + ident(ID) ident(id)operator(;) + + ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + reserved(if) operator(()ident(rb_const_defined)operator(()ident(rb_cObject)operator(,) ident(id)operator(\)\)) operator({) + ident(module) operator(=) ident(rb_const_get)operator(()ident(rb_cObject)operator(,) ident(id)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(module)operator(\)) operator(==) ident(T_MODULE)operator(\)) + reserved(return) ident(module)operator(;) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s is not a module)delimiter(")>operator(,) ident(rb_obj_classname)operator(()ident(module)operator(\)\);) + operator(}) + ident(module) operator(=) ident(rb_define_module_id)operator(()ident(id)operator(\);) + ident(st_add_direct)operator(()ident(rb_class_tbl)operator(,) ident(id)operator(,) ident(module)operator(\);) + ident(rb_const_set)operator(()ident(rb_cObject)operator(,) ident(id)operator(,) ident(module)operator(\);) + + reserved(return) ident(module)operator(;) +operator(}) + +ident(VALUE) +ident(rb_define_module_under)operator(()ident(outer)operator(,) ident(name)operator(\)) + ident(VALUE) ident(outer)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(VALUE) ident(module)operator(;) + ident(ID) ident(id)operator(;) + + ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + reserved(if) operator(()ident(rb_const_defined_at)operator(()ident(outer)operator(,) ident(id)operator(\)\)) operator({) + ident(module) operator(=) ident(rb_const_get_at)operator(()ident(outer)operator(,) ident(id)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(module)operator(\)) operator(==) ident(T_MODULE)operator(\)) + reserved(return) ident(module)operator(;) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s::%s is not a module)delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(outer)operator(\),) ident(rb_obj_classname)operator(()ident(module)operator(\)\);) + operator(}) + ident(module) operator(=) ident(rb_define_module_id)operator(()ident(id)operator(\);) + ident(rb_const_set)operator(()ident(outer)operator(,) ident(id)operator(,) ident(module)operator(\);) + ident(rb_set_class_path)operator(()ident(module)operator(,) ident(outer)operator(,) ident(name)operator(\);) + + reserved(return) ident(module)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(include_class_new)operator(()ident(module)operator(,) ident(super)operator(\)) + ident(VALUE) ident(module)operator(,) ident(super)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(klass)operator(,) reserved(struct) ident(RClass)operator(\);) + ident(OBJSETUP)operator(()ident(klass)operator(,) ident(rb_cClass)operator(,) ident(T_ICLASS)operator(\);) + + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(module)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(module) operator(=) ident(RBASIC)operator(()ident(module)operator(\)->)ident(klass)operator(;) + operator(}) + reserved(if) operator((!)ident(RCLASS)operator(()ident(module)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(RCLASS)operator(()ident(module)operator(\)->)ident(iv_tbl) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + ident(klass)operator(->)ident(iv_tbl) operator(=) ident(RCLASS)operator(()ident(module)operator(\)->)ident(iv_tbl)operator(;) + ident(klass)operator(->)ident(m_tbl) operator(=) ident(RCLASS)operator(()ident(module)operator(\)->)ident(m_tbl)operator(;) + ident(klass)operator(->)ident(super) operator(=) ident(super)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(module)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass) operator(=) ident(RBASIC)operator(()ident(module)operator(\)->)ident(klass)operator(;) + operator(}) + reserved(else) operator({) + ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass) operator(=) ident(module)operator(;) + operator(}) + ident(OBJ_INFECT)operator(()ident(klass)operator(,) ident(module)operator(\);) + ident(OBJ_INFECT)operator(()ident(klass)operator(,) ident(super)operator(\);) + + reserved(return) operator(()ident(VALUE)operator(\))ident(klass)operator(;) +operator(}) + +directive(void) +ident(rb_include_module)operator(()ident(klass)operator(,) ident(module)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(module)operator(;) +operator({) + ident(VALUE) ident(p)operator(,) ident(c)operator(;) + pre_type(int) ident(changed) operator(=) integer(0)operator(;) + + ident(rb_frozen_class_p)operator(()ident(klass)operator(\);) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(klass)operator(\)\)) operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + operator(}) + + reserved(if) operator(()ident(TYPE)operator(()ident(module)operator(\)) operator(!=) ident(T_MODULE)operator(\)) operator({) + ident(Check_Type)operator(()ident(module)operator(,) ident(T_MODULE)operator(\);) + operator(}) + + ident(OBJ_INFECT)operator(()ident(klass)operator(,) ident(module)operator(\);) + ident(c) operator(=) ident(klass)operator(;) + reserved(while) operator(()ident(module)operator(\)) operator({) + pre_type(int) ident(superclass_seen) operator(=) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl) operator(==) ident(RCLASS)operator(()ident(module)operator(\)->)ident(m_tbl)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(cyclic include detected)delimiter(")>operator(\);) + comment(/* ignore if the module included already in superclasses */) + reserved(for) operator(()ident(p) operator(=) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) ident(p)operator(;) ident(p) operator(=) ident(RCLASS)operator(()ident(p)operator(\)->)ident(super)operator(\)) operator({) + reserved(switch) operator(()ident(BUILTIN_TYPE)operator(()ident(p)operator(\)\)) operator({) + reserved(case) label(T_ICLASS)operator(:) + reserved(if) operator(()ident(RCLASS)operator(()ident(p)operator(\)->)ident(m_tbl) operator(==) ident(RCLASS)operator(()ident(module)operator(\)->)ident(m_tbl)operator(\)) operator({) + reserved(if) operator((!)ident(superclass_seen)operator(\)) operator({) + ident(c) operator(=) ident(p)operator(;) comment(/* move insertion point */) + operator(}) + reserved(goto) ident(skip)operator(;) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_CLASS)operator(:) + ident(superclass_seen) operator(=) ident(Qtrue)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + ident(c) operator(=) ident(RCLASS)operator(()ident(c)operator(\)->)ident(super) operator(=) ident(include_class_new)operator(()ident(module)operator(,) ident(RCLASS)operator(()ident(c)operator(\)->)ident(super)operator(\);) + ident(changed) operator(=) integer(1)operator(;) + label(skip)operator(:) + ident(module) operator(=) ident(RCLASS)operator(()ident(module)operator(\)->)ident(super)operator(;) + operator(}) + reserved(if) operator(()ident(changed)operator(\)) ident(rb_clear_cache)operator((\);) +operator(}) + +comment(/* + * call-seq: + * mod.included_modules -> array + * + * Returns the list of modules included in <i>mod</i>. + * + * module Mixin + * end + * + * module Outer + * include Mixin + * end + * + * Mixin.included_modules #=> [] + * Outer.included_modules #=> [Mixin] + */) + +ident(VALUE) +ident(rb_mod_included_modules)operator(()ident(mod)operator(\)) + ident(VALUE) ident(mod)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + ident(VALUE) ident(p)operator(;) + + reserved(for) operator(()ident(p) operator(=) ident(RCLASS)operator(()ident(mod)operator(\)->)ident(super)operator(;) ident(p)operator(;) ident(p) operator(=) ident(RCLASS)operator(()ident(p)operator(\)->)ident(super)operator(\)) operator({) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(p)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(RBASIC)operator(()ident(p)operator(\)->)ident(klass)operator(\);) + operator(}) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.include?(module\) => true or false + * + * Returns <code>true</code> if <i>module</i> is included in + * <i>mod</i> or one of <i>mod</i>'s ancestors. + * + * module A + * end + * class B + * include A + * end + * class C < B + * end + * B.include?(A\) #=> true + * C.include?(A\) #=> true + * A.include?(A\) #=> false + */) + +ident(VALUE) +ident(rb_mod_include_p)operator(()ident(mod)operator(,) ident(mod2)operator(\)) + ident(VALUE) ident(mod)operator(;) + ident(VALUE) ident(mod2)operator(;) +operator({) + ident(VALUE) ident(p)operator(;) + + ident(Check_Type)operator(()ident(mod2)operator(,) ident(T_MODULE)operator(\);) + reserved(for) operator(()ident(p) operator(=) ident(RCLASS)operator(()ident(mod)operator(\)->)ident(super)operator(;) ident(p)operator(;) ident(p) operator(=) ident(RCLASS)operator(()ident(p)operator(\)->)ident(super)operator(\)) operator({) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(p)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + reserved(if) operator(()ident(RBASIC)operator(()ident(p)operator(\)->)ident(klass) operator(==) ident(mod2)operator(\)) reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.ancestors -> array + * + * Returns a list of modules included in <i>mod</i> (including + * <i>mod</i> itself\). + * + * module Mod + * include Math + * include Comparable + * end + * + * Mod.ancestors #=> [Mod, Comparable, Math] + * Math.ancestors #=> [Math] + */) + +ident(VALUE) +ident(rb_mod_ancestors)operator(()ident(mod)operator(\)) + ident(VALUE) ident(mod)operator(;) +operator({) + ident(VALUE) ident(p)operator(,) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + reserved(for) operator(()ident(p) operator(=) ident(mod)operator(;) ident(p)operator(;) ident(p) operator(=) ident(RCLASS)operator(()ident(p)operator(\)->)ident(super)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(p)operator(,) ident(FL_SINGLETON)operator(\)\)) + reserved(continue)operator(;) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(p)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(RBASIC)operator(()ident(p)operator(\)->)ident(klass)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(p)operator(\);) + operator(}) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +preprocessor(#define) ident(VISI)operator(()ident(x)operator(\)) operator((()ident(x)operator(\)&)ident(NOEX_MASK)operator(\)) +preprocessor(#define) ident(VISI_CHECK)operator(()ident(x)operator(,)ident(f)operator(\)) operator(()ident(VISI)operator(()ident(x)operator(\)) operator(==) operator(()ident(f)operator(\)\)) + +directive(static) pre_type(int) +ident(ins_methods_push)operator(()ident(name)operator(,) ident(type)operator(,) ident(ary)operator(,) ident(visi)operator(\)) + ident(ID) ident(name)operator(;) + pre_type(long) ident(type)operator(;) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(visi)operator(;) +operator({) + reserved(if) operator(()ident(type) operator(==) operator(-)integer(1)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(switch) operator(()ident(visi)operator(\)) operator({) + reserved(case) label(NOEX_PRIVATE)operator(:) + reserved(case) label(NOEX_PROTECTED)operator(:) + reserved(case) label(NOEX_PUBLIC)operator(:) + ident(visi) operator(=) operator(()ident(type) operator(==) ident(visi)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(visi) operator(=) operator(()ident(type) operator(!=) ident(NOEX_PRIVATE)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(visi)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(name)operator(\)\)\);) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(ins_methods_i)operator(()ident(name)operator(,) ident(type)operator(,) ident(ary)operator(\)) + ident(ID) ident(name)operator(;) + pre_type(long) ident(type)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(ins_methods_push)operator(()ident(name)operator(,) ident(type)operator(,) ident(ary)operator(,) operator(-)integer(1)operator(\);) comment(/* everything but private */) +operator(}) + +directive(static) pre_type(int) +ident(ins_methods_prot_i)operator(()ident(name)operator(,) ident(type)operator(,) ident(ary)operator(\)) + ident(ID) ident(name)operator(;) + pre_type(long) ident(type)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(ins_methods_push)operator(()ident(name)operator(,) ident(type)operator(,) ident(ary)operator(,) ident(NOEX_PROTECTED)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(ins_methods_priv_i)operator(()ident(name)operator(,) ident(type)operator(,) ident(ary)operator(\)) + ident(ID) ident(name)operator(;) + pre_type(long) ident(type)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(ins_methods_push)operator(()ident(name)operator(,) ident(type)operator(,) ident(ary)operator(,) ident(NOEX_PRIVATE)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(ins_methods_pub_i)operator(()ident(name)operator(,) ident(type)operator(,) ident(ary)operator(\)) + ident(ID) ident(name)operator(;) + pre_type(long) ident(type)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(return) ident(ins_methods_push)operator(()ident(name)operator(,) ident(type)operator(,) ident(ary)operator(,) ident(NOEX_PUBLIC)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(method_entry)operator(()ident(key)operator(,) ident(body)operator(,) ident(list)operator(\)) + ident(ID) ident(key)operator(;) + ident(NODE) operator(*)ident(body)operator(;) + ident(st_table) operator(*)ident(list)operator(;) +operator({) + pre_type(long) ident(type)operator(;) + + reserved(if) operator(()ident(key) operator(==) ident(ID_ALLOCATOR)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator((!)ident(st_lookup)operator(()ident(list)operator(,) ident(key)operator(,) integer(0)operator(\)\)) operator({) + reserved(if) operator((!)ident(body)operator(->)ident(nd_body)operator(\)) ident(type) operator(=) operator(-)integer(1)operator(;) comment(/* none */) + reserved(else) ident(type) operator(=) ident(VISI)operator(()ident(body)operator(->)ident(nd_noex)operator(\);) + ident(st_add_direct)operator(()ident(list)operator(,) ident(key)operator(,) ident(type)operator(\);) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(class_instance_method_list)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(,) ident(func)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(mod)operator(;) + pre_type(int) operator((*)ident(func)operator(\)) ident(_)operator((()ident(ID)operator(,) pre_type(long)operator(,) ident(VALUE)operator(\)\);) +operator({) + ident(VALUE) ident(ary)operator(;) + pre_type(int) ident(recur)operator(;) + ident(st_table) operator(*)ident(list)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(recur) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(r)operator(;) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(r)operator(\);) + ident(recur) operator(=) ident(RTEST)operator(()ident(r)operator(\);) + operator(}) + + ident(list) operator(=) ident(st_init_numtable)operator((\);) + reserved(for) operator((;) ident(mod)operator(;) ident(mod) operator(=) ident(RCLASS)operator(()ident(mod)operator(\)->)ident(super)operator(\)) operator({) + ident(st_foreach)operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(m_tbl)operator(,) ident(method_entry)operator(,) operator(()ident(st_data_t)operator(\))ident(list)operator(\);) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(mod)operator(\)) operator(==) ident(T_ICLASS)operator(\)) reserved(continue)operator(;) + reserved(if) operator(()ident(FL_TEST)operator(()ident(mod)operator(,) ident(FL_SINGLETON)operator(\)\)) reserved(continue)operator(;) + reserved(if) operator((!)ident(recur)operator(\)) reserved(break)operator(;) + operator(}) + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + ident(st_foreach)operator(()ident(list)operator(,) ident(func)operator(,) ident(ary)operator(\);) + ident(st_free_table)operator(()ident(list)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.instance_methods(include_super=true\) => array + * + * Returns an array containing the names of public instance methods in + * the receiver. For a module, these are the public methods; for a + * class, they are the instance (not singleton\) methods. With no + * argument, or with an argument that is <code>false</code>, the + * instance methods in <i>mod</i> are returned, otherwise the methods + * in <i>mod</i> and <i>mod</i>'s superclasses are returned. + * + * module A + * def method1(\) end + * end + * class B + * def method2(\) end + * end + * class C < B + * def method3(\) end + * end + * + * A.instance_methods #=> ["method1"] + * B.instance_methods(false\) #=> ["method2"] + * C.instance_methods(false\) #=> ["method3"] + * C.instance_methods(true\).length #=> 43 + */) + +ident(VALUE) +ident(rb_class_instance_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(mod)operator(;) +operator({) + reserved(return) ident(class_instance_method_list)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(,) ident(ins_methods_i)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod.protected_instance_methods(include_super=true\) => array + * + * Returns a list of the protected instance methods defined in + * <i>mod</i>. If the optional parameter is not <code>false</code>, the + * methods of any ancestors are included. + */) + +ident(VALUE) +ident(rb_class_protected_instance_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(mod)operator(;) +operator({) + reserved(return) ident(class_instance_method_list)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(,) ident(ins_methods_prot_i)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod.private_instance_methods(include_super=true\) => array + * + * Returns a list of the private instance methods defined in + * <i>mod</i>. If the optional parameter is not <code>false</code>, the + * methods of any ancestors are included. + * + * module Mod + * def method1(\) end + * private :method1 + * def method2(\) end + * end + * Mod.instance_methods #=> ["method2"] + * Mod.private_instance_methods #=> ["method1"] + */) + +ident(VALUE) +ident(rb_class_private_instance_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(mod)operator(;) +operator({) + reserved(return) ident(class_instance_method_list)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(,) ident(ins_methods_priv_i)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod.public_instance_methods(include_super=true\) => array + * + * Returns a list of the public instance methods defined in <i>mod</i>. + * If the optional parameter is not <code>false</code>, the methods of + * any ancestors are included. + */) + +ident(VALUE) +ident(rb_class_public_instance_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(mod)operator(;) +operator({) + reserved(return) ident(class_instance_method_list)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(,) ident(ins_methods_pub_i)operator(\);) +operator(}) + +comment(/* + * call-seq: + * obj.singleton_methods(all=true\) => array + * + * Returns an array of the names of singleton methods for <i>obj</i>. + * If the optional <i>all</i> parameter is true, the list will include + * methods in modules included in <i>obj</i>. + * + * module Other + * def three(\) end + * end + * + * class Single + * def Single.four(\) end + * end + * + * a = Single.new + * + * def a.one(\) + * end + * + * class << a + * include Other + * def two(\) + * end + * end + * + * Single.singleton_methods #=> ["four"] + * a.singleton_methods(false\) #=> ["two", "one"] + * a.singleton_methods #=> ["two", "one", "three"] + */) + +ident(VALUE) +ident(rb_obj_singleton_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(recur)operator(,) ident(ary)operator(,) ident(klass)operator(;) + ident(st_table) operator(*)ident(list)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(recur)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(recur) operator(=) ident(Qtrue)operator(;) + operator(}) + ident(klass) operator(=) ident(CLASS_OF)operator(()ident(obj)operator(\);) + ident(list) operator(=) ident(st_init_numtable)operator((\);) + reserved(if) operator(()ident(klass) operator(&&) ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(st_foreach)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) ident(method_entry)operator(,) operator(()ident(st_data_t)operator(\))ident(list)operator(\);) + ident(klass) operator(=) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) + operator(}) + reserved(if) operator(()ident(RTEST)operator(()ident(recur)operator(\)\)) operator({) + reserved(while) operator(()ident(klass) operator(&&) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)) operator(||) ident(TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_ICLASS)operator(\)\)) operator({) + ident(st_foreach)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) ident(method_entry)operator(,) operator(()ident(st_data_t)operator(\))ident(list)operator(\);) + ident(klass) operator(=) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) + operator(}) + operator(}) + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + ident(st_foreach)operator(()ident(list)operator(,) ident(ins_methods_i)operator(,) ident(ary)operator(\);) + ident(st_free_table)operator(()ident(list)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(void) +ident(rb_define_method_id)operator(()ident(klass)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(name)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + pre_type(int) ident(argc)operator(;) +operator({) + ident(rb_add_method)operator(()ident(klass)operator(,) ident(name)operator(,) ident(NEW_CFUNC)operator(()ident(func)operator(,)ident(argc)operator(\),) ident(NOEX_PUBLIC)operator(\);) +operator(}) + +directive(void) +ident(rb_define_method)operator(()ident(klass)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + pre_type(int) ident(argc)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + pre_type(int) ident(ex) operator(=) ident(NOEX_PUBLIC)operator(;) + + + ident(rb_add_method)operator(()ident(klass)operator(,) ident(id)operator(,) ident(NEW_CFUNC)operator(()ident(func)operator(,) ident(argc)operator(\),) ident(ex)operator(\);) +operator(}) + +directive(void) +ident(rb_define_protected_method)operator(()ident(klass)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + pre_type(int) ident(argc)operator(;) +operator({) + ident(rb_add_method)operator(()ident(klass)operator(,) ident(rb_intern)operator(()ident(name)operator(\),) ident(NEW_CFUNC)operator(()ident(func)operator(,) ident(argc)operator(\),) ident(NOEX_PROTECTED)operator(\);) +operator(}) + +directive(void) +ident(rb_define_private_method)operator(()ident(klass)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + pre_type(int) ident(argc)operator(;) +operator({) + ident(rb_add_method)operator(()ident(klass)operator(,) ident(rb_intern)operator(()ident(name)operator(\),) ident(NEW_CFUNC)operator(()ident(func)operator(,) ident(argc)operator(\),) ident(NOEX_PRIVATE)operator(\);) +operator(}) + +directive(void) +ident(rb_undef_method)operator(()ident(klass)operator(,) ident(name)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(rb_add_method)operator(()ident(klass)operator(,) ident(rb_intern)operator(()ident(name)operator(\),) integer(0)operator(,) ident(NOEX_UNDEF)operator(\);) +operator(}) + +preprocessor(#define) ident(SPECIAL_SINGLETON)operator(()ident(x)operator(,)ident(c)operator(\)) reserved(do) operator({)\ + reserved(if) operator(()ident(obj) operator(==) operator(()ident(x)operator(\)\)) operator({)\ + reserved(return) ident(c)operator(;)\ + operator(})\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +ident(VALUE) +ident(rb_singleton_class)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(klass)operator(;) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(obj)operator(\)) operator(||) ident(SYMBOL_P)operator(()ident(obj)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't define singleton)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(rb_special_const_p)operator(()ident(obj)operator(\)\)) operator({) + ident(SPECIAL_SINGLETON)operator(()ident(Qnil)operator(,) ident(rb_cNilClass)operator(\);) + ident(SPECIAL_SINGLETON)operator(()ident(Qfalse)operator(,) ident(rb_cFalseClass)operator(\);) + ident(SPECIAL_SINGLETON)operator(()ident(Qtrue)operator(,) ident(rb_cTrueClass)operator(\);) + ident(rb_bug)operator(()string<delimiter(")content(unknown immediate %ld)delimiter(")>operator(,) ident(obj)operator(\);) + operator(}) + + ident(DEFER_INTS)operator(;) + reserved(if) operator(()ident(FL_TEST)operator(()ident(RBASIC)operator(()ident(obj)operator(\)->)ident(klass)operator(,) ident(FL_SINGLETON)operator(\)) operator(&&) + ident(rb_iv_get)operator(()ident(RBASIC)operator(()ident(obj)operator(\)->)ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\)) operator(==) ident(obj)operator(\)) operator({) + ident(klass) operator(=) ident(RBASIC)operator(()ident(obj)operator(\)->)ident(klass)operator(;) + operator(}) + reserved(else) operator({) + ident(klass) operator(=) ident(rb_make_metaclass)operator(()ident(obj)operator(,) ident(RBASIC)operator(()ident(obj)operator(\)->)ident(klass)operator(\);) + operator(}) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) operator({) + ident(OBJ_TAINT)operator(()ident(klass)operator(\);) + operator(}) + reserved(else) operator({) + ident(FL_UNSET)operator(()ident(klass)operator(,) ident(FL_TAINT)operator(\);) + operator(}) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(obj)operator(\)\)) ident(OBJ_FREEZE)operator(()ident(klass)operator(\);) + ident(ALLOW_INTS)operator(;) + + reserved(return) ident(klass)operator(;) +operator(}) + +directive(void) +ident(rb_define_singleton_method)operator(()ident(obj)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\)) + ident(VALUE) ident(obj)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + pre_type(int) ident(argc)operator(;) +operator({) + ident(rb_define_method)operator(()ident(rb_singleton_class)operator(()ident(obj)operator(\),) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\);) +operator(}) + +directive(void) +ident(rb_define_module_function)operator(()ident(module)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\)) + ident(VALUE) ident(module)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + pre_type(int) ident(argc)operator(;) +operator({) + ident(rb_define_private_method)operator(()ident(module)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(module)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\);) +operator(}) + +directive(void) +ident(rb_define_global_function)operator(()ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + pre_type(int) ident(argc)operator(;) +operator({) + ident(rb_define_module_function)operator(()ident(rb_mKernel)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\);) +operator(}) + +directive(void) +ident(rb_define_alias)operator(()ident(klass)operator(,) ident(name1)operator(,) ident(name2)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name1)operator(,) operator(*)ident(name2)operator(;) +operator({) + ident(rb_alias)operator(()ident(klass)operator(,) ident(rb_intern)operator(()ident(name1)operator(\),) ident(rb_intern)operator(()ident(name2)operator(\)\);) +operator(}) + +directive(void) +ident(rb_define_attr)operator(()ident(klass)operator(,) ident(name)operator(,) ident(read)operator(,) ident(write)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + pre_type(int) ident(read)operator(,) ident(write)operator(;) +operator({) + ident(rb_attr)operator(()ident(klass)operator(,) ident(rb_intern)operator(()ident(name)operator(\),) ident(read)operator(,) ident(write)operator(,) ident(Qfalse)operator(\);) +operator(}) + +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(#include) include(<stdarg.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(,)ident(b)operator(\)) +preprocessor(#else) +preprocessor(#include) include(<varargs.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(\)) +preprocessor(#endif) + +pre_type(int) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_scan_args)operator(()pre_type(int) ident(argc)operator(,) directive(const) ident(VALUE) operator(*)ident(argv)operator(,) directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(fmt)operator(,) ident(va_alist)operator(\)) + pre_type(int) ident(argc)operator(;) + directive(const) ident(VALUE) operator(*)ident(argv)operator(;) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + pre_type(int) ident(n)operator(,) ident(i) operator(=) integer(0)operator(;) + directive(const) pre_type(char) operator(*)ident(p) operator(=) ident(fmt)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) + ident(va_list) ident(vargs)operator(;) + + ident(va_init_list)operator(()ident(vargs)operator(,) ident(fmt)operator(\);) + + reserved(if) operator((*)ident(p) operator(==) char('*')operator(\)) reserved(goto) ident(rest_arg)operator(;) + + reserved(if) operator(()ident(ISDIGIT)operator((*)ident(p)operator(\)\)) operator({) + ident(n) operator(=) operator(*)ident(p) operator(-) char('0')operator(;) + reserved(if) operator(()ident(n) operator(>) ident(argc)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for %d\))delimiter(")>operator(,) ident(argc)operator(,) ident(n)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(n)operator(;) ident(i)operator(++\)) operator({) + ident(var) operator(=) ident(va_arg)operator(()ident(vargs)operator(,) ident(VALUE)operator(*\);) + reserved(if) operator(()ident(var)operator(\)) operator(*)ident(var) operator(=) ident(argv)operator([)ident(i)operator(];) + operator(}) + ident(p)operator(++;) + operator(}) + reserved(else) operator({) + reserved(goto) ident(error)operator(;) + operator(}) + + reserved(if) operator(()ident(ISDIGIT)operator((*)ident(p)operator(\)\)) operator({) + ident(n) operator(=) ident(i) operator(+) operator(*)ident(p) operator(-) char('0')operator(;) + reserved(for) operator((;) ident(i)operator(<)ident(n)operator(;) ident(i)operator(++\)) operator({) + ident(var) operator(=) ident(va_arg)operator(()ident(vargs)operator(,) ident(VALUE)operator(*\);) + reserved(if) operator(()ident(argc) operator(>) ident(i)operator(\)) operator({) + reserved(if) operator(()ident(var)operator(\)) operator(*)ident(var) operator(=) ident(argv)operator([)ident(i)operator(];) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(var)operator(\)) operator(*)ident(var) operator(=) ident(Qnil)operator(;) + operator(}) + operator(}) + ident(p)operator(++;) + operator(}) + + reserved(if)operator((*)ident(p) operator(==) char('*')operator(\)) operator({) + label(rest_arg)operator(:) + ident(var) operator(=) ident(va_arg)operator(()ident(vargs)operator(,) ident(VALUE)operator(*\);) + reserved(if) operator(()ident(argc) operator(>) ident(i)operator(\)) operator({) + reserved(if) operator(()ident(var)operator(\)) operator(*)ident(var) operator(=) ident(rb_ary_new4)operator(()ident(argc)operator(-)ident(i)operator(,) ident(argv)operator(+)ident(i)operator(\);) + ident(i) operator(=) ident(argc)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(var)operator(\)) operator(*)ident(var) operator(=) ident(rb_ary_new)operator((\);) + operator(}) + ident(p)operator(++;) + operator(}) + + reserved(if) operator((*)ident(p) operator(==) char('&')operator(\)) operator({) + ident(var) operator(=) ident(va_arg)operator(()ident(vargs)operator(,) ident(VALUE)operator(*\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + operator(*)ident(var) operator(=) ident(rb_block_proc)operator((\);) + operator(}) + reserved(else) operator({) + operator(*)ident(var) operator(=) ident(Qnil)operator(;) + operator(}) + ident(p)operator(++;) + operator(}) + ident(va_end)operator(()ident(vargs)operator(\);) + + reserved(if) operator((*)ident(p) operator(!=) char('\\0')operator(\)) operator({) + reserved(goto) ident(error)operator(;) + operator(}) + + reserved(if) operator(()ident(argc) operator(>) ident(i)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for %d\))delimiter(")>operator(,) ident(argc)operator(,) ident(i)operator(\);) + operator(}) + + reserved(return) ident(argc)operator(;) + + label(error)operator(:) + ident(rb_fatal)operator(()string<delimiter(")content(bad scan arg format: %s)delimiter(")>operator(,) ident(fmt)operator(\);) + reserved(return) integer(0)operator(;) +operator(}) +comment(/********************************************************************** + + compar.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Thu Aug 26 14:39:48 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") + +ident(VALUE) ident(rb_mComparable)operator(;) + +directive(static) ident(ID) ident(cmp)operator(;) + +pre_type(int) +ident(rb_cmpint)operator(()ident(val)operator(,) ident(a)operator(,) ident(b)operator(\)) + ident(VALUE) ident(val)operator(,) ident(a)operator(,) ident(b)operator(;) +operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + ident(rb_cmperr)operator(()ident(a)operator(,) ident(b)operator(\);) + operator(}) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(val)operator(\)\)) reserved(return) ident(FIX2INT)operator(()ident(val)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(val)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + reserved(if) operator(()ident(RBIGNUM)operator(()ident(val)operator(\)->)ident(sign)operator(\)) reserved(return) integer(1)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(val)operator(,) char('>')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)\)) reserved(return) integer(1)operator(;) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(val)operator(,) char('<')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)\)) reserved(return) operator(-)integer(1)operator(;) + reserved(return) integer(0)operator(;) +operator(}) + +directive(void) +ident(rb_cmperr)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(classname)operator(;) + + reserved(if) operator(()ident(SPECIAL_CONST_P)operator(()ident(y)operator(\)\)) operator({) + ident(y) operator(=) ident(rb_inspect)operator(()ident(y)operator(\);) + ident(classname) operator(=) ident(StringValuePtr)operator(()ident(y)operator(\);) + operator(}) + reserved(else) operator({) + ident(classname) operator(=) ident(rb_obj_classname)operator(()ident(y)operator(\);) + operator(}) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(comparison of %s with %s failed)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(x)operator(\),) ident(classname)operator(\);) +operator(}) + +preprocessor(#define) ident(cmperr)operator((\)) operator(()ident(rb_cmperr)operator(()ident(x)operator(,) ident(y)operator(\),) ident(Qnil)operator(\)) + +directive(static) ident(VALUE) +ident(cmp_eq)operator(()ident(a)operator(\)) + ident(VALUE) operator(*)ident(a)operator(;) +operator({) + ident(VALUE) ident(c) operator(=) ident(rb_funcall)operator(()ident(a)operator([)integer(0)operator(],) ident(cmp)operator(,) integer(1)operator(,) ident(a)operator([)integer(1)operator(]\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(c)operator(,) ident(a)operator([)integer(0)operator(],) ident(a)operator([)integer(1)operator(]\)) operator(==) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(cmp_failed)operator((\)) +operator({) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj == other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns 0. Also returns true if + * _obj_ and _other_ are the same object. + */) + +directive(static) ident(VALUE) +ident(cmp_equal)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(a)operator([)integer(2)operator(];) + + reserved(if) operator(()ident(x) operator(==) ident(y)operator(\)) reserved(return) ident(Qtrue)operator(;) + + ident(a)operator([)integer(0)operator(]) operator(=) ident(x)operator(;) ident(a)operator([)integer(1)operator(]) operator(=) ident(y)operator(;) + reserved(return) ident(rb_rescue)operator(()ident(cmp_eq)operator(,) operator(()ident(VALUE)operator(\))ident(a)operator(,) ident(cmp_failed)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * obj > other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns 1. + */) + +directive(static) ident(VALUE) +ident(cmp_gt)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(c) operator(=) ident(rb_funcall)operator(()ident(x)operator(,) ident(cmp)operator(,) integer(1)operator(,) ident(y)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) reserved(return) ident(cmperr)operator((\);) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(c)operator(,) ident(x)operator(,) ident(y)operator(\)) operator(>) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj >= other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns 0 or 1. + */) + +directive(static) ident(VALUE) +ident(cmp_ge)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(c) operator(=) ident(rb_funcall)operator(()ident(x)operator(,) ident(cmp)operator(,) integer(1)operator(,) ident(y)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) reserved(return) ident(cmperr)operator((\);) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(c)operator(,) ident(x)operator(,) ident(y)operator(\)) operator(>=) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj < other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns -1. + */) + +directive(static) ident(VALUE) +ident(cmp_lt)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(c) operator(=) ident(rb_funcall)operator(()ident(x)operator(,) ident(cmp)operator(,) integer(1)operator(,) ident(y)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) reserved(return) ident(cmperr)operator((\);) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(c)operator(,) ident(x)operator(,) ident(y)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * obj <= other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns -1 or 0. + */) + +directive(static) ident(VALUE) +ident(cmp_le)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(c) operator(=) ident(rb_funcall)operator(()ident(x)operator(,) ident(cmp)operator(,) integer(1)operator(,) ident(y)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) reserved(return) ident(cmperr)operator((\);) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(c)operator(,) ident(x)operator(,) ident(y)operator(\)) operator(<=) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.between?(min, max\) => true or false + * + * Returns <code>false</code> if <i>obj</i> <code><=></code> + * <i>min</i> is less than zero or if <i>anObject</i> <code><=></code> + * <i>max</i> is greater than zero, <code>true</code> otherwise. + * + * 3.between?(1, 5\) #=> true + * 6.between?(1, 5\) #=> false + * 'cat'.between?('ant', 'dog'\) #=> true + * 'gnu'.between?('ant', 'dog'\) #=> false + * + */) + +directive(static) ident(VALUE) +ident(cmp_between)operator(()ident(x)operator(,) ident(min)operator(,) ident(max)operator(\)) + ident(VALUE) ident(x)operator(,) ident(min)operator(,) ident(max)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(cmp_lt)operator(()ident(x)operator(,) ident(min)operator(\)\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(RTEST)operator(()ident(cmp_gt)operator(()ident(x)operator(,) ident(max)operator(\)\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * The <code>Comparable</code> mixin is used by classes whose objects + * may be ordered. The class must define the <code><=></code> operator, + * which compares the receiver against another object, returning -1, 0, + * or +1 depending on whether the receiver is less than, equal to, or + * greater than the other object. <code>Comparable</code> uses + * <code><=></code> to implement the conventional comparison operators + * (<code><</code>, <code><=</code>, <code>==</code>, <code>>=</code>, + * and <code>></code>\) and the method <code>between?</code>. + * + * class SizeMatters + * include Comparable + * attr :str + * def <=>(anOther\) + * str.size <=> anOther.str.size + * end + * def initialize(str\) + * @str = str + * end + * def inspect + * @str + * end + * end + * + * s1 = SizeMatters.new("Z"\) + * s2 = SizeMatters.new("YY"\) + * s3 = SizeMatters.new("XXX"\) + * s4 = SizeMatters.new("WWWW"\) + * s5 = SizeMatters.new("VVVVV"\) + * + * s1 < s2 #=> true + * s4.between?(s1, s3\) #=> false + * s4.between?(s3, s5\) #=> true + * [ s3, s2, s5, s4, s1 ].sort #=> [Z, YY, XXX, WWWW, VVVVV] + * + */) + +directive(void) +ident(Init_Comparable)operator((\)) +operator({) + ident(rb_mComparable) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(Comparable)delimiter(")>operator(\);) + ident(rb_define_method)operator(()ident(rb_mComparable)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(cmp_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mComparable)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(cmp_gt)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mComparable)operator(,) string<delimiter(")content(>=)delimiter(")>operator(,) ident(cmp_ge)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mComparable)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(cmp_lt)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mComparable)operator(,) string<delimiter(")content(<=)delimiter(")>operator(,) ident(cmp_le)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mComparable)operator(,) string<delimiter(")content(between?)delimiter(")>operator(,) ident(cmp_between)operator(,) integer(2)operator(\);) + + ident(cmp) operator(=) ident(rb_intern)operator(()string<delimiter(")content(<=>)delimiter(")>operator(\);) +operator(}) +comment(/********************************************************************** + + dir.c - + + $Author: shyouhei $ + $Date: 2009-02-04 06:26:31 +0100 (Wed, 04 Feb 2009\) $ + created at: Wed Jan 5 09:51:01 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") + +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<sys/stat.h>) + +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(HAVE_DIRENT_H) operator(&&) operator(!)ident(defined) ident(_WIN32) +preprocessor(# include) include(<dirent.h>) +preprocessor(# define) ident(NAMLEN)operator(()ident(dirent)operator(\)) ident(strlen)operator((()ident(dirent)operator(\)->)ident(d_name)operator(\)) +preprocessor(#elif) ident(defined) ident(HAVE_DIRECT_H) operator(&&) operator(!)ident(defined) ident(_WIN32) +preprocessor(# include) include(<direct.h>) +preprocessor(# define) ident(NAMLEN)operator(()ident(dirent)operator(\)) ident(strlen)operator((()ident(dirent)operator(\)->)ident(d_name)operator(\)) +preprocessor(#else) +preprocessor(# define) ident(dirent) ident(direct) +preprocessor(# if) operator(!)ident(defined) ident(__NeXT__) +preprocessor(# define) ident(NAMLEN)operator(()ident(dirent)operator(\)) operator(()ident(dirent)operator(\)->)ident(d_namlen) +preprocessor(# else) +preprocessor(# )comment(/* On some versions of NextStep, d_namlen is always zero, so avoid it. */) +preprocessor(# define) ident(NAMLEN)operator(()ident(dirent)operator(\)) ident(strlen)operator((()ident(dirent)operator(\)->)ident(d_name)operator(\)) +preprocessor(# endif) +preprocessor(# if) ident(HAVE_SYS_NDIR_H) +preprocessor(# include) include(<sys/ndir.h>) +preprocessor(# endif) +preprocessor(# if) ident(HAVE_SYS_DIR_H) +preprocessor(# include) include(<sys/dir.h>) +preprocessor(# endif) +preprocessor(# if) ident(HAVE_NDIR_H) +preprocessor(# include) include(<ndir.h>) +preprocessor(# endif) +preprocessor(# ifdef) ident(_WIN32) +preprocessor(# include) include("win32/dir.h") +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#include) include(<errno.h>) + +preprocessor(#ifndef) ident(HAVE_STDLIB_H) +pre_type(char) operator(*)ident(getenv)operator((\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_STRING_H) +pre_type(char) operator(*)ident(strchr) ident(_)operator((()pre_type(char)operator(*,)pre_type(char)operator(\)\);) +preprocessor(#endif) + +preprocessor(#include) include(<ctype.h>) + +preprocessor(#include) include("util.h") + +preprocessor(#if) operator(!)ident(defined) ident(HAVE_LSTAT) operator(&&) operator(!)ident(defined) ident(lstat) +preprocessor(#define) ident(lstat) ident(stat) +preprocessor(#endif) + +preprocessor(#ifndef) ident(CASEFOLD_FILESYSTEM) +preprocessor(# if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__VMS) +preprocessor(# define) ident(CASEFOLD_FILESYSTEM) integer(1) +preprocessor(# else) +preprocessor(# define) ident(CASEFOLD_FILESYSTEM) integer(0) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#define) ident(FNM_NOESCAPE) hex(0x01) +preprocessor(#define) ident(FNM_PATHNAME) hex(0x02) +preprocessor(#define) ident(FNM_DOTMATCH) hex(0x04) +preprocessor(#define) ident(FNM_CASEFOLD) hex(0x08) +preprocessor(#if) ident(CASEFOLD_FILESYSTEM) +preprocessor(#define) ident(FNM_SYSCASE) ident(FNM_CASEFOLD) +preprocessor(#else) +preprocessor(#define) ident(FNM_SYSCASE) integer(0) +preprocessor(#endif) + +preprocessor(#define) ident(FNM_NOMATCH) integer(1) +preprocessor(#define) ident(FNM_ERROR) integer(2) + +preprocessor(#define) ident(downcase)operator(()ident(c)operator(\)) operator(()ident(nocase) operator(&&) ident(ISUPPER)operator(()ident(c)operator(\)) operator(?) ident(tolower)operator(()ident(c)operator(\)) operator(:) operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(compare)operator(()ident(c1)operator(,) ident(c2)operator(\)) operator(((()pre_type(unsigned) pre_type(char)operator(\)()ident(c1)operator(\)\)) operator(-) operator((()pre_type(unsigned) pre_type(char)operator(\)()ident(c2)operator(\)\)\)) + +comment(/* caution: in case *p == '\\0' + Next(p\) == p + 1 in single byte environment + Next(p\) == p in multi byte environment +*/) +preprocessor(#if) ident(defined)operator(()ident(CharNext)operator(\)) +preprocessor(# define) ident(Next)operator(()ident(p)operator(\)) ident(CharNext)operator(()ident(p)operator(\)) +preprocessor(#elif) ident(defined)operator(()ident(DJGPP)operator(\)) +preprocessor(# define) ident(Next)operator(()ident(p)operator(\)) operator((()ident(p)operator(\)) operator(+) ident(mblen)operator(()ident(p)operator(,) ident(RUBY_MBCHAR_MAXSIZE)operator(\)\)) +preprocessor(#elif) ident(defined)operator(()ident(__EMX__)operator(\)) +preprocessor(# define) ident(Next)operator(()ident(p)operator(\)) operator((()ident(p)operator(\)) operator(+) ident(emx_mblen)operator(()ident(p)operator(\)\)) +directive(static) directive(inline) pre_type(int) +ident(emx_mblen)operator(()directive(const) pre_type(char) operator(*)ident(p)operator(\)) +operator({) + pre_type(int) ident(n) operator(=) ident(mblen)operator(()ident(p)operator(,) ident(RUBY_MBCHAR_MAXSIZE)operator(\);) + reserved(return) operator(()ident(n) operator(<) integer(0)operator(\)) operator(?) integer(1) operator(:) ident(n)operator(;) +operator(}) +preprocessor(#endif) + +preprocessor(#ifndef) ident(Next) comment(/* single byte environment */) +preprocessor(# define) ident(Next)operator(()ident(p)operator(\)) operator((()ident(p)operator(\)) operator(+) integer(1)operator(\)) +preprocessor(# define) ident(Inc)operator(()ident(p)operator(\)) operator((++()ident(p)operator(\)\)) +preprocessor(# define) ident(Compare)operator(()ident(p1)operator(,) ident(p2)operator(\)) operator(()ident(compare)operator(()ident(downcase)operator((*()ident(p1)operator(\)\),) ident(downcase)operator((*()ident(p2)operator(\)\)\)\)) +preprocessor(#else) comment(/* multi byte environment */) +preprocessor(# define) ident(Inc)operator(()ident(p)operator(\)) operator((()ident(p)operator(\)) operator(=) ident(Next)operator(()ident(p)operator(\)\)) +preprocessor(# define) ident(Compare)operator(()ident(p1)operator(,) ident(p2)operator(\)) operator(()ident(CompareImpl)operator(()ident(p1)operator(,) ident(p2)operator(,) ident(nocase)operator(\)\)) +directive(static) pre_type(int) +ident(CompareImpl)operator(()directive(const) pre_type(char) operator(*)ident(p1)operator(,) directive(const) pre_type(char) operator(*)ident(p2)operator(,) pre_type(int) ident(nocase)operator(\)) +operator({) + directive(const) pre_type(int) ident(len1) operator(=) ident(Next)operator(()ident(p1)operator(\)) operator(-) ident(p1)operator(;) + directive(const) pre_type(int) ident(len2) operator(=) ident(Next)operator(()ident(p2)operator(\)) operator(-) ident(p2)operator(;) +preprocessor(#ifdef) ident(_WIN32) + pre_type(char) ident(buf1)operator([)integer(10)operator(],) ident(buf2)operator([)integer(10)operator(];) comment(/* large enough? */) +preprocessor(#endif) + + reserved(if) operator(()ident(len1) operator(<) integer(0) operator(||) ident(len2) operator(<) integer(0)operator(\)) operator({) + ident(rb_fatal)operator(()string<delimiter(")content(CompareImpl: negative len)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(len1) operator(==) integer(0)operator(\)) reserved(return) ident(len2)operator(;) + reserved(if) operator(()ident(len2) operator(==) integer(0)operator(\)) reserved(return) operator(-)ident(len1)operator(;) + +preprocessor(#ifdef) ident(_WIN32) + reserved(if) operator(()ident(nocase) operator(&&) ident(rb_w32_iswinnt)operator((\)\)) operator({) + reserved(if) operator(()ident(len1) operator(>) integer(1)operator(\)) operator({) + reserved(if) operator(()ident(len1) operator(>=) reserved(sizeof)operator(()ident(buf1)operator(\)\)) operator({) + ident(rb_fatal)operator(()string<delimiter(")content(CompareImpl: too large len)delimiter(")>operator(\);) + operator(}) + ident(memcpy)operator(()ident(buf1)operator(,) ident(p1)operator(,) ident(len1)operator(\);) + ident(buf1)operator([)ident(len1)operator(]) operator(=) char('\\0')operator(;) + ident(CharLower)operator(()ident(buf1)operator(\);) + ident(p1) operator(=) ident(buf1)operator(;) comment(/* trick */) + operator(}) + reserved(if) operator(()ident(len2) operator(>) integer(1)operator(\)) operator({) + reserved(if) operator(()ident(len2) operator(>=) reserved(sizeof)operator(()ident(buf2)operator(\)\)) operator({) + ident(rb_fatal)operator(()string<delimiter(")content(CompareImpl: too large len)delimiter(")>operator(\);) + operator(}) + ident(memcpy)operator(()ident(buf2)operator(,) ident(p2)operator(,) ident(len2)operator(\);) + ident(buf2)operator([)ident(len2)operator(]) operator(=) char('\\0')operator(;) + ident(CharLower)operator(()ident(buf2)operator(\);) + ident(p2) operator(=) ident(buf2)operator(;) comment(/* trick */) + operator(}) + operator(}) +preprocessor(#endif) + reserved(if) operator(()ident(len1) operator(==) integer(1)operator(\)) + reserved(if) operator(()ident(len2) operator(==) integer(1)operator(\)) + reserved(return) ident(compare)operator(()ident(downcase)operator((*)ident(p1)operator(\),) ident(downcase)operator((*)ident(p2)operator(\)\);) + reserved(else) operator({) + directive(const) pre_type(int) ident(ret) operator(=) ident(compare)operator(()ident(downcase)operator((*)ident(p1)operator(\),) operator(*)ident(p2)operator(\);) + reserved(return) ident(ret) operator(?) ident(ret) operator(:) operator(-)integer(1)operator(;) + operator(}) + reserved(else) + reserved(if) operator(()ident(len2) operator(==) integer(1)operator(\)) operator({) + directive(const) pre_type(int) ident(ret) operator(=) ident(compare)operator((*)ident(p1)operator(,) ident(downcase)operator((*)ident(p2)operator(\)\);) + reserved(return) ident(ret) operator(?) ident(ret) operator(:) integer(1)operator(;) + operator(}) + reserved(else) operator({) + directive(const) pre_type(int) ident(ret) operator(=) ident(memcmp)operator(()ident(p1)operator(,) ident(p2)operator(,) ident(len1) operator(<) ident(len2) operator(?) ident(len1) operator(:) ident(len2)operator(\);) + reserved(return) ident(ret) operator(?) ident(ret) operator(:) ident(len1) operator(-) ident(len2)operator(;) + operator(}) +operator(}) +preprocessor(#endif) comment(/* environment */) + +directive(static) pre_type(char) operator(*) +ident(bracket)operator(()ident(p)operator(,) ident(s)operator(,) ident(flags)operator(\)) + directive(const) pre_type(char) operator(*)ident(p)operator(;) comment(/* pattern (next to '['\) */) + directive(const) pre_type(char) operator(*)ident(s)operator(;) comment(/* string */) + pre_type(int) ident(flags)operator(;) +operator({) + directive(const) pre_type(int) ident(nocase) operator(=) ident(flags) operator(&) ident(FNM_CASEFOLD)operator(;) + directive(const) pre_type(int) ident(escape) operator(=) operator(!()ident(flags) operator(&) ident(FNM_NOESCAPE)operator(\);) + + pre_type(int) ident(ok) operator(=) integer(0)operator(,) ident(not) operator(=) integer(0)operator(;) + + reserved(if) operator((*)ident(p) operator(==) char('!') operator(||) operator(*)ident(p) operator(==) char('^')operator(\)) operator({) + ident(not) operator(=) integer(1)operator(;) + ident(p)operator(++;) + operator(}) + + reserved(while) operator((*)ident(p) operator(!=) char(']')operator(\)) operator({) + directive(const) pre_type(char) operator(*)ident(t1) operator(=) ident(p)operator(;) + reserved(if) operator(()ident(escape) operator(&&) operator(*)ident(t1) operator(==) char('\\\\')operator(\)) + ident(t1)operator(++;) + reserved(if) operator((!*)ident(t1)operator(\)) + reserved(return) pre_constant(NULL)operator(;) + ident(p) operator(=) ident(Next)operator(()ident(t1)operator(\);) + reserved(if) operator(()ident(p)operator([)integer(0)operator(]) operator(==) char('-') operator(&&) ident(p)operator([)integer(1)operator(]) operator(!=) char(']')operator(\)) operator({) + directive(const) pre_type(char) operator(*)ident(t2) operator(=) ident(p) operator(+) integer(1)operator(;) + reserved(if) operator(()ident(escape) operator(&&) operator(*)ident(t2) operator(==) char('\\\\')operator(\)) + ident(t2)operator(++;) + reserved(if) operator((!*)ident(t2)operator(\)) + reserved(return) pre_constant(NULL)operator(;) + ident(p) operator(=) ident(Next)operator(()ident(t2)operator(\);) + reserved(if) operator((!)ident(ok) operator(&&) ident(Compare)operator(()ident(t1)operator(,) ident(s)operator(\)) operator(<=) integer(0) operator(&&) ident(Compare)operator(()ident(s)operator(,) ident(t2)operator(\)) operator(<=) integer(0)operator(\)) + ident(ok) operator(=) integer(1)operator(;) + operator(}) + reserved(else) + reserved(if) operator((!)ident(ok) operator(&&) ident(Compare)operator(()ident(t1)operator(,) ident(s)operator(\)) operator(==) integer(0)operator(\)) + ident(ok) operator(=) integer(1)operator(;) + operator(}) + + reserved(return) ident(ok) operator(==) ident(not) operator(?) pre_constant(NULL) operator(:) operator(()pre_type(char) operator(*\))ident(p) operator(+) integer(1)operator(;) +operator(}) + +comment(/* If FNM_PATHNAME is set, only path element will be matched. (upto '/' or '\\0'\) + Otherwise, entire string will be matched. + End marker itself won't be compared. + And if function succeeds, *pcur reaches end marker. +*/) +preprocessor(#define) ident(UNESCAPE)operator(()ident(p)operator(\)) operator(()ident(escape) operator(&&) operator(*()ident(p)operator(\)) operator(==) char('\\\\') operator(?) operator(()ident(p)operator(\)) operator(+) integer(1) operator(:) operator(()ident(p)operator(\)\)) +preprocessor(#define) ident(ISEND)operator(()ident(p)operator(\)) operator((!*()ident(p)operator(\)) operator(||) operator(()ident(pathname) operator(&&) operator(*()ident(p)operator(\)) operator(==) char('/')operator(\)\)) +preprocessor(#define) ident(RETURN)operator(()ident(val)operator(\)) reserved(return) operator(*)ident(pcur) operator(=) ident(p)operator(,) operator(*)ident(scur) operator(=) ident(s)operator(,) operator(()ident(val)operator(\);) + +directive(static) pre_type(int) +ident(fnmatch_helper)operator(()ident(pcur)operator(,) ident(scur)operator(,) ident(flags)operator(\)) + directive(const) pre_type(char) operator(**)ident(pcur)operator(;) comment(/* pattern */) + directive(const) pre_type(char) operator(**)ident(scur)operator(;) comment(/* string */) + pre_type(int) ident(flags)operator(;) +operator({) + directive(const) pre_type(int) ident(period) operator(=) operator(!()ident(flags) operator(&) ident(FNM_DOTMATCH)operator(\);) + directive(const) pre_type(int) ident(pathname) operator(=) ident(flags) operator(&) ident(FNM_PATHNAME)operator(;) + directive(const) pre_type(int) ident(escape) operator(=) operator(!()ident(flags) operator(&) ident(FNM_NOESCAPE)operator(\);) + directive(const) pre_type(int) ident(nocase) operator(=) ident(flags) operator(&) ident(FNM_CASEFOLD)operator(;) + + directive(const) pre_type(char) operator(*)ident(ptmp) operator(=) integer(0)operator(;) + directive(const) pre_type(char) operator(*)ident(stmp) operator(=) integer(0)operator(;) + + directive(const) pre_type(char) operator(*)ident(p) operator(=) operator(*)ident(pcur)operator(;) + directive(const) pre_type(char) operator(*)ident(s) operator(=) operator(*)ident(scur)operator(;) + + reserved(if) operator(()ident(period) operator(&&) operator(*)ident(s) operator(==) char('.') operator(&&) operator(*)ident(UNESCAPE)operator(()ident(p)operator(\)) operator(!=) char('.')operator(\)) comment(/* leading period */) + ident(RETURN)operator(()ident(FNM_NOMATCH)operator(\);) + + reserved(while) operator(()integer(1)operator(\)) operator({) + reserved(switch) operator((*)ident(p)operator(\)) operator({) + reserved(case) char('*')operator(:) + reserved(do) operator({) ident(p)operator(++;) operator(}) reserved(while) operator((*)ident(p) operator(==) char('*')operator(\);) + reserved(if) operator(()ident(ISEND)operator(()ident(UNESCAPE)operator(()ident(p)operator(\)\)\)) operator({) + ident(p) operator(=) ident(UNESCAPE)operator(()ident(p)operator(\);) + ident(RETURN)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(ISEND)operator(()ident(s)operator(\)\)) + ident(RETURN)operator(()ident(FNM_NOMATCH)operator(\);) + ident(ptmp) operator(=) ident(p)operator(;) + ident(stmp) operator(=) ident(s)operator(;) + reserved(continue)operator(;) + + reserved(case) char('?')operator(:) + reserved(if) operator(()ident(ISEND)operator(()ident(s)operator(\)\)) + ident(RETURN)operator(()ident(FNM_NOMATCH)operator(\);) + ident(p)operator(++;) + ident(Inc)operator(()ident(s)operator(\);) + reserved(continue)operator(;) + + reserved(case) char('[')operator(:) operator({) + directive(const) pre_type(char) operator(*)ident(t)operator(;) + reserved(if) operator(()ident(ISEND)operator(()ident(s)operator(\)\)) + ident(RETURN)operator(()ident(FNM_NOMATCH)operator(\);) + reserved(if) operator(()ident(t) operator(=) ident(bracket)operator(()ident(p) operator(+) integer(1)operator(,) ident(s)operator(,) ident(flags)operator(\)\)) operator({) + ident(p) operator(=) ident(t)operator(;) + ident(Inc)operator(()ident(s)operator(\);) + reserved(continue)operator(;) + operator(}) + reserved(goto) ident(failed)operator(;) + operator(}) + operator(}) + + comment(/* ordinary */) + ident(p) operator(=) ident(UNESCAPE)operator(()ident(p)operator(\);) + reserved(if) operator(()ident(ISEND)operator(()ident(s)operator(\)\)) + ident(RETURN)operator(()ident(ISEND)operator(()ident(p)operator(\)) operator(?) integer(0) operator(:) ident(FNM_NOMATCH)operator(\);) + reserved(if) operator(()ident(ISEND)operator(()ident(p)operator(\)\)) + reserved(goto) ident(failed)operator(;) + reserved(if) operator(()ident(Compare)operator(()ident(p)operator(,) ident(s)operator(\)) operator(!=) integer(0)operator(\)) + reserved(goto) ident(failed)operator(;) + ident(Inc)operator(()ident(p)operator(\);) + ident(Inc)operator(()ident(s)operator(\);) + reserved(continue)operator(;) + + label(failed)operator(:) comment(/* try next '*' position */) + reserved(if) operator(()ident(ptmp) operator(&&) ident(stmp)operator(\)) operator({) + ident(p) operator(=) ident(ptmp)operator(;) + ident(Inc)operator(()ident(stmp)operator(\);) comment(/* !ISEND(*stmp\) */) + ident(s) operator(=) ident(stmp)operator(;) + reserved(continue)operator(;) + operator(}) + ident(RETURN)operator(()ident(FNM_NOMATCH)operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(fnmatch)operator(()ident(p)operator(,) ident(s)operator(,) ident(flags)operator(\)) + directive(const) pre_type(char) operator(*)ident(p)operator(;) comment(/* pattern */) + directive(const) pre_type(char) operator(*)ident(s)operator(;) comment(/* string */) + pre_type(int) ident(flags)operator(;) +operator({) + directive(const) pre_type(int) ident(period) operator(=) operator(!()ident(flags) operator(&) ident(FNM_DOTMATCH)operator(\);) + directive(const) pre_type(int) ident(pathname) operator(=) ident(flags) operator(&) ident(FNM_PATHNAME)operator(;) + + directive(const) pre_type(char) operator(*)ident(ptmp) operator(=) integer(0)operator(;) + directive(const) pre_type(char) operator(*)ident(stmp) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(pathname)operator(\)) operator({) + reserved(while) operator(()integer(1)operator(\)) operator({) + reserved(if) operator(()ident(p)operator([)integer(0)operator(]) operator(==) char('*') operator(&&) ident(p)operator([)integer(1)operator(]) operator(==) char('*') operator(&&) ident(p)operator([)integer(2)operator(]) operator(==) char('/')operator(\)) operator({) + reserved(do) operator({) ident(p) operator(+=) integer(3)operator(;) operator(}) reserved(while) operator(()ident(p)operator([)integer(0)operator(]) operator(==) char('*') operator(&&) ident(p)operator([)integer(1)operator(]) operator(==) char('*') operator(&&) ident(p)operator([)integer(2)operator(]) operator(==) char('/')operator(\);) + ident(ptmp) operator(=) ident(p)operator(;) + ident(stmp) operator(=) ident(s)operator(;) + operator(}) + reserved(if) operator(()ident(fnmatch_helper)operator((&)ident(p)operator(,) operator(&)ident(s)operator(,) ident(flags)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(while) operator((*)ident(s) operator(&&) operator(*)ident(s) operator(!=) char('/')operator(\)) ident(Inc)operator(()ident(s)operator(\);) + reserved(if) operator((*)ident(p) operator(&&) operator(*)ident(s)operator(\)) operator({) + ident(p)operator(++;) + ident(s)operator(++;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator((!*)ident(p) operator(&&) operator(!*)ident(s)operator(\)) + reserved(return) integer(0)operator(;) + operator(}) + comment(/* failed : try next recursion */) + reserved(if) operator(()ident(ptmp) operator(&&) ident(stmp) operator(&&) operator(!()ident(period) operator(&&) operator(*)ident(stmp) operator(==) char('.')operator(\)\)) operator({) + reserved(while) operator((*)ident(stmp) operator(&&) operator(*)ident(stmp) operator(!=) char('/')operator(\)) ident(Inc)operator(()ident(stmp)operator(\);) + reserved(if) operator((*)ident(stmp)operator(\)) operator({) + ident(p) operator(=) ident(ptmp)operator(;) + ident(stmp)operator(++;) + ident(s) operator(=) ident(stmp)operator(;) + reserved(continue)operator(;) + operator(}) + operator(}) + reserved(return) ident(FNM_NOMATCH)operator(;) + operator(}) + operator(}) + reserved(else) + reserved(return) ident(fnmatch_helper)operator((&)ident(p)operator(,) operator(&)ident(s)operator(,) ident(flags)operator(\);) +operator(}) + +ident(VALUE) ident(rb_cDir)operator(;) + +reserved(struct) ident(dir_data) operator({) + ident(DIR) operator(*)ident(dir)operator(;) + pre_type(char) operator(*)ident(path)operator(;) +operator(};) + +directive(static) directive(void) +ident(free_dir)operator(()ident(dir)operator(\)) + reserved(struct) ident(dir_data) operator(*)ident(dir)operator(;) +operator({) + reserved(if) operator(()ident(dir)operator(\)) operator({) + reserved(if) operator(()ident(dir)operator(->)ident(dir)operator(\)) ident(closedir)operator(()ident(dir)operator(->)ident(dir)operator(\);) + reserved(if) operator(()ident(dir)operator(->)ident(path)operator(\)) ident(free)operator(()ident(dir)operator(->)ident(path)operator(\);) + operator(}) + ident(free)operator(()ident(dir)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(dir_close) ident(_)operator((()ident(VALUE)operator(\)\);) + +directive(static) ident(VALUE) ident(dir_s_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(dir_s_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dirp)operator(;) + ident(VALUE) ident(obj) operator(=) ident(Data_Make_Struct)operator(()ident(klass)operator(,) reserved(struct) ident(dir_data)operator(,) integer(0)operator(,) ident(free_dir)operator(,) ident(dirp)operator(\);) + + ident(dirp)operator(->)ident(dir) operator(=) pre_constant(NULL)operator(;) + ident(dirp)operator(->)ident(path) operator(=) pre_constant(NULL)operator(;) + + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * Dir.new( string \) -> aDir + * + * Returns a new directory object for the named directory. + */) +directive(static) ident(VALUE) +ident(dir_initialize)operator(()ident(dir)operator(,) ident(dirname)operator(\)) + ident(VALUE) ident(dir)operator(,) ident(dirname)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dp)operator(;) + + ident(SafeStringValue)operator(()ident(dirname)operator(\);) + ident(Data_Get_Struct)operator(()ident(dir)operator(,) reserved(struct) ident(dir_data)operator(,) ident(dp)operator(\);) + reserved(if) operator(()ident(dp)operator(->)ident(dir)operator(\)) ident(closedir)operator(()ident(dp)operator(->)ident(dir)operator(\);) + reserved(if) operator(()ident(dp)operator(->)ident(path)operator(\)) ident(free)operator(()ident(dp)operator(->)ident(path)operator(\);) + ident(dp)operator(->)ident(dir) operator(=) pre_constant(NULL)operator(;) + ident(dp)operator(->)ident(path) operator(=) pre_constant(NULL)operator(;) + ident(dp)operator(->)ident(dir) operator(=) ident(opendir)operator(()ident(RSTRING)operator(()ident(dirname)operator(\)->)ident(ptr)operator(\);) + reserved(if) operator(()ident(dp)operator(->)ident(dir) operator(==) pre_constant(NULL)operator(\)) operator({) + reserved(if) operator(()ident(errno) operator(==) ident(EMFILE) operator(||) ident(errno) operator(==) ident(ENFILE)operator(\)) operator({) + ident(rb_gc)operator((\);) + ident(dp)operator(->)ident(dir) operator(=) ident(opendir)operator(()ident(RSTRING)operator(()ident(dirname)operator(\)->)ident(ptr)operator(\);) + operator(}) + reserved(if) operator(()ident(dp)operator(->)ident(dir) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(dirname)operator(\)->)ident(ptr)operator(\);) + operator(}) + operator(}) + ident(dp)operator(->)ident(path) operator(=) ident(strdup)operator(()ident(RSTRING)operator(()ident(dirname)operator(\)->)ident(ptr)operator(\);) + + reserved(return) ident(dir)operator(;) +operator(}) + +comment(/* + * call-seq: + * Dir.open( string \) => aDir + * Dir.open( string \) {| aDir | block } => anObject + * + * With no block, <code>open</code> is a synonym for + * <code>Dir::new</code>. If a block is present, it is passed + * <i>aDir</i> as a parameter. The directory is closed at the end of + * the block, and <code>Dir::open</code> returns the value of the + * block. + */) + +directive(static) ident(VALUE) +ident(dir_s_open)operator(()ident(klass)operator(,) ident(dirname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(dirname)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dp)operator(;) + ident(VALUE) ident(dir) operator(=) ident(Data_Make_Struct)operator(()ident(klass)operator(,) reserved(struct) ident(dir_data)operator(,) integer(0)operator(,) ident(free_dir)operator(,) ident(dp)operator(\);) + + ident(dir_initialize)operator(()ident(dir)operator(,) ident(dirname)operator(\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(return) ident(rb_ensure)operator(()ident(rb_yield)operator(,) ident(dir)operator(,) ident(dir_close)operator(,) ident(dir)operator(\);) + operator(}) + + reserved(return) ident(dir)operator(;) +operator(}) + +directive(static) directive(void) +ident(dir_closed)operator((\)) +operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(closed directory)delimiter(")>operator(\);) +operator(}) + +directive(static) directive(void) +ident(dir_check)operator(()ident(dir)operator(\)) + ident(VALUE) ident(dir)operator(;) +operator({) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(dir)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: operation on untainted Dir)delimiter(")>operator(\);) + ident(rb_check_frozen)operator(()ident(dir)operator(\);) +operator(}) + +preprocessor(#define) ident(GetDIR)operator(()ident(obj)operator(,) ident(dirp)operator(\)) reserved(do) operator({)\ + ident(dir_check)operator(()ident(dir)operator(\);)\ + ident(Data_Get_Struct)operator(()ident(obj)operator(,) reserved(struct) ident(dir_data)operator(,) ident(dirp)operator(\);)\ + reserved(if) operator(()ident(dirp)operator(->)ident(dir) operator(==) pre_constant(NULL)operator(\)) ident(dir_closed)operator((\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* + * call-seq: + * dir.inspect => string + * + * Return a string describing this Dir object. + */) +directive(static) ident(VALUE) +ident(dir_inspect)operator(()ident(dir)operator(\)) + ident(VALUE) ident(dir)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dirp)operator(;) + + ident(GetDIR)operator(()ident(dir)operator(,) ident(dirp)operator(\);) + reserved(if) operator(()ident(dirp)operator(->)ident(path)operator(\)) operator({) + pre_type(char) operator(*)ident(c) operator(=) ident(rb_obj_classname)operator(()ident(dir)operator(\);) + pre_type(int) ident(len) operator(=) ident(strlen)operator(()ident(c)operator(\)) operator(+) ident(strlen)operator(()ident(dirp)operator(->)ident(path)operator(\)) operator(+) integer(4)operator(;) + ident(VALUE) ident(s) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) + ident(snprintf)operator(()ident(RSTRING_PTR)operator(()ident(s)operator(\),) ident(len)operator(+)integer(1)operator(,) string<delimiter(")content(#<%s:%s>)delimiter(")>operator(,) ident(c)operator(,) ident(dirp)operator(->)ident(path)operator(\);) + reserved(return) ident(s)operator(;) + operator(}) + reserved(return) ident(rb_funcall)operator(()ident(dir)operator(,) ident(rb_intern)operator(()string<delimiter(")content(to_s)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * dir.path => string or nil + * + * Returns the path parameter passed to <em>dir</em>'s constructor. + * + * d = Dir.new(".."\) + * d.path #=> ".." + */) +directive(static) ident(VALUE) +ident(dir_path)operator(()ident(dir)operator(\)) + ident(VALUE) ident(dir)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dirp)operator(;) + + ident(GetDIR)operator(()ident(dir)operator(,) ident(dirp)operator(\);) + reserved(if) operator((!)ident(dirp)operator(->)ident(path)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(rb_str_new2)operator(()ident(dirp)operator(->)ident(path)operator(\);) +operator(}) + +comment(/* + * call-seq: + * dir.read => string or nil + * + * Reads the next entry from <em>dir</em> and returns it as a string. + * Returns <code>nil</code> at the end of the stream. + * + * d = Dir.new("testdir"\) + * d.read #=> "." + * d.read #=> ".." + * d.read #=> "config.h" + */) +directive(static) ident(VALUE) +ident(dir_read)operator(()ident(dir)operator(\)) + ident(VALUE) ident(dir)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dirp)operator(;) + reserved(struct) ident(dirent) operator(*)ident(dp)operator(;) + + ident(GetDIR)operator(()ident(dir)operator(,) ident(dirp)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + ident(dp) operator(=) ident(readdir)operator(()ident(dirp)operator(->)ident(dir)operator(\);) + reserved(if) operator(()ident(dp)operator(\)) operator({) + reserved(return) ident(rb_tainted_str_new)operator(()ident(dp)operator(->)ident(d_name)operator(,) ident(NAMLEN)operator(()ident(dp)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(errno) operator(==) integer(0)operator(\)) operator({) comment(/* end of stream */) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +comment(/* + * call-seq: + * dir.each { |filename| block } => dir + * + * Calls the block once for each entry in this directory, passing the + * filename of each entry as a parameter to the block. + * + * d = Dir.new("testdir"\) + * d.each {|x| puts "Got #{x}" } + * + * <em>produces:</em> + * + * Got . + * Got .. + * Got config.h + * Got main.rb + */) +directive(static) ident(VALUE) +ident(dir_each)operator(()ident(dir)operator(\)) + ident(VALUE) ident(dir)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dirp)operator(;) + reserved(struct) ident(dirent) operator(*)ident(dp)operator(;) + + ident(GetDIR)operator(()ident(dir)operator(,) ident(dirp)operator(\);) + ident(rewinddir)operator(()ident(dirp)operator(->)ident(dir)operator(\);) + reserved(for) operator(()ident(dp) operator(=) ident(readdir)operator(()ident(dirp)operator(->)ident(dir)operator(\);) ident(dp) operator(!=) pre_constant(NULL)operator(;) ident(dp) operator(=) ident(readdir)operator(()ident(dirp)operator(->)ident(dir)operator(\)\)) operator({) + ident(rb_yield)operator(()ident(rb_tainted_str_new)operator(()ident(dp)operator(->)ident(d_name)operator(,) ident(NAMLEN)operator(()ident(dp)operator(\)\)\);) + reserved(if) operator(()ident(dirp)operator(->)ident(dir) operator(==) pre_constant(NULL)operator(\)) ident(dir_closed)operator((\);) + operator(}) + reserved(return) ident(dir)operator(;) +operator(}) + +comment(/* + * call-seq: + * dir.pos => integer + * dir.tell => integer + * + * Returns the current position in <em>dir</em>. See also + * <code>Dir#seek</code>. + * + * d = Dir.new("testdir"\) + * d.tell #=> 0 + * d.read #=> "." + * d.tell #=> 12 + */) +directive(static) ident(VALUE) +ident(dir_tell)operator(()ident(dir)operator(\)) + ident(VALUE) ident(dir)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_TELLDIR) + reserved(struct) ident(dir_data) operator(*)ident(dirp)operator(;) + pre_type(long) ident(pos)operator(;) + + ident(GetDIR)operator(()ident(dir)operator(,) ident(dirp)operator(\);) + ident(pos) operator(=) ident(telldir)operator(()ident(dirp)operator(->)ident(dir)operator(\);) + reserved(return) ident(rb_int2inum)operator(()ident(pos)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * dir.seek( integer \) => dir + * + * Seeks to a particular location in <em>dir</em>. <i>integer</i> + * must be a value returned by <code>Dir#tell</code>. + * + * d = Dir.new("testdir"\) #=> #<Dir:0x401b3c40> + * d.read #=> "." + * i = d.tell #=> 12 + * d.read #=> ".." + * d.seek(i\) #=> #<Dir:0x401b3c40> + * d.read #=> ".." + */) +directive(static) ident(VALUE) +ident(dir_seek)operator(()ident(dir)operator(,) ident(pos)operator(\)) + ident(VALUE) ident(dir)operator(,) ident(pos)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dirp)operator(;) + ident(off_t) ident(p) operator(=) ident(NUM2OFFT)operator(()ident(pos)operator(\);) + + ident(GetDIR)operator(()ident(dir)operator(,) ident(dirp)operator(\);) +preprocessor(#ifdef) ident(HAVE_SEEKDIR) + ident(seekdir)operator(()ident(dirp)operator(->)ident(dir)operator(,) ident(p)operator(\);) + reserved(return) ident(dir)operator(;) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * dir.pos( integer \) => integer + * + * Synonym for <code>Dir#seek</code>, but returns the position + * parameter. + * + * d = Dir.new("testdir"\) #=> #<Dir:0x401b3c40> + * d.read #=> "." + * i = d.pos #=> 12 + * d.read #=> ".." + * d.pos = i #=> 12 + * d.read #=> ".." + */) +directive(static) ident(VALUE) +ident(dir_set_pos)operator(()ident(dir)operator(,) ident(pos)operator(\)) + ident(VALUE) ident(dir)operator(,) ident(pos)operator(;) +operator({) + ident(dir_seek)operator(()ident(dir)operator(,) ident(pos)operator(\);) + reserved(return) ident(pos)operator(;) +operator(}) + +comment(/* + * call-seq: + * dir.rewind => dir + * + * Repositions <em>dir</em> to the first entry. + * + * d = Dir.new("testdir"\) + * d.read #=> "." + * d.rewind #=> #<Dir:0x401b3fb0> + * d.read #=> "." + */) +directive(static) ident(VALUE) +ident(dir_rewind)operator(()ident(dir)operator(\)) + ident(VALUE) ident(dir)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dirp)operator(;) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(dir)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't close)delimiter(")>operator(\);) + operator(}) + ident(GetDIR)operator(()ident(dir)operator(,) ident(dirp)operator(\);) + ident(rewinddir)operator(()ident(dirp)operator(->)ident(dir)operator(\);) + reserved(return) ident(dir)operator(;) +operator(}) + +comment(/* + * call-seq: + * dir.close => nil + * + * Closes the directory stream. Any further attempts to access + * <em>dir</em> will raise an <code>IOError</code>. + * + * d = Dir.new("testdir"\) + * d.close #=> nil + */) +directive(static) ident(VALUE) +ident(dir_close)operator(()ident(dir)operator(\)) + ident(VALUE) ident(dir)operator(;) +operator({) + reserved(struct) ident(dir_data) operator(*)ident(dirp)operator(;) + + ident(GetDIR)operator(()ident(dir)operator(,) ident(dirp)operator(\);) + ident(closedir)operator(()ident(dirp)operator(->)ident(dir)operator(\);) + ident(dirp)operator(->)ident(dir) operator(=) pre_constant(NULL)operator(;) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) directive(void) +ident(dir_chdir)operator(()ident(path)operator(\)) + ident(VALUE) ident(path)operator(;) +operator({) + reserved(if) operator(()ident(chdir)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) +operator(}) + +directive(static) pre_type(int) ident(chdir_blocking) operator(=) integer(0)operator(;) +directive(static) ident(VALUE) ident(chdir_thread) operator(=) ident(Qnil)operator(;) + +reserved(struct) ident(chdir_data) operator({) + ident(VALUE) ident(old_path)operator(,) ident(new_path)operator(;) + pre_type(int) ident(done)operator(;) +operator(};) + +directive(static) ident(VALUE) +ident(chdir_yield)operator(()ident(args)operator(\)) + reserved(struct) ident(chdir_data) operator(*)ident(args)operator(;) +operator({) + ident(dir_chdir)operator(()ident(args)operator(->)ident(new_path)operator(\);) + ident(args)operator(->)ident(done) operator(=) ident(Qtrue)operator(;) + ident(chdir_blocking)operator(++;) + reserved(if) operator(()ident(chdir_thread) operator(==) ident(Qnil)operator(\)) + ident(chdir_thread) operator(=) ident(rb_thread_current)operator((\);) + reserved(return) ident(rb_yield)operator(()ident(args)operator(->)ident(new_path)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(chdir_restore)operator(()ident(args)operator(\)) + reserved(struct) ident(chdir_data) operator(*)ident(args)operator(;) +operator({) + reserved(if) operator(()ident(args)operator(->)ident(done)operator(\)) operator({) + ident(chdir_blocking)operator(--;) + reserved(if) operator(()ident(chdir_blocking) operator(==) integer(0)operator(\)) + ident(chdir_thread) operator(=) ident(Qnil)operator(;) + ident(dir_chdir)operator(()ident(args)operator(->)ident(old_path)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * Dir.chdir( [ string] \) => 0 + * Dir.chdir( [ string] \) {| path | block } => anObject + * + * Changes the current working directory of the process to the given + * string. When called without an argument, changes the directory to + * the value of the environment variable <code>HOME</code>, or + * <code>LOGDIR</code>. <code>SystemCallError</code> (probably + * <code>Errno::ENOENT</code>\) if the target directory does not exist. + * + * If a block is given, it is passed the name of the new current + * directory, and the block is executed with that as the current + * directory. The original working directory is restored when the block + * exits. The return value of <code>chdir</code> is the value of the + * block. <code>chdir</code> blocks can be nested, but in a + * multi-threaded program an error will be raised if a thread attempts + * to open a <code>chdir</code> block while another thread has one + * open. + * + * Dir.chdir("/var/spool/mail"\) + * puts Dir.pwd + * Dir.chdir("/tmp"\) do + * puts Dir.pwd + * Dir.chdir("/usr"\) do + * puts Dir.pwd + * end + * puts Dir.pwd + * end + * puts Dir.pwd + * + * <em>produces:</em> + * + * /var/spool/mail + * /tmp + * /usr + * /tmp + * /var/spool/mail + */) +directive(static) ident(VALUE) +ident(dir_s_chdir)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(path) operator(=) ident(Qnil)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(path)operator(\)) operator(==) integer(1)operator(\)) operator({) + ident(SafeStringValue)operator(()ident(path)operator(\);) + operator(}) + reserved(else) operator({) + directive(const) pre_type(char) operator(*)ident(dist) operator(=) ident(getenv)operator(()string<delimiter(")content(HOME)delimiter(")>operator(\);) + reserved(if) operator((!)ident(dist)operator(\)) operator({) + ident(dist) operator(=) ident(getenv)operator(()string<delimiter(")content(LOGDIR)delimiter(")>operator(\);) + reserved(if) operator((!)ident(dist)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(HOME/LOGDIR not set)delimiter(")>operator(\);) + operator(}) + ident(path) operator(=) ident(rb_str_new2)operator(()ident(dist)operator(\);) + operator(}) + + reserved(if) operator(()ident(chdir_blocking) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator((!)ident(rb_block_given_p)operator((\)) operator(||) ident(rb_thread_current)operator((\)) operator(!=) ident(chdir_thread)operator(\)) + ident(rb_warn)operator(()string<delimiter(")content(conflicting chdir during another chdir block)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(struct) ident(chdir_data) ident(args)operator(;) + pre_type(char) operator(*)ident(cwd) operator(=) ident(my_getcwd)operator((\);) + + ident(args)operator(.)ident(old_path) operator(=) ident(rb_tainted_str_new2)operator(()ident(cwd)operator(\);) ident(free)operator(()ident(cwd)operator(\);) + ident(args)operator(.)ident(new_path) operator(=) ident(path)operator(;) + ident(args)operator(.)ident(done) operator(=) ident(Qfalse)operator(;) + reserved(return) ident(rb_ensure)operator(()ident(chdir_yield)operator(,) operator(()ident(VALUE)operator(\)&)ident(args)operator(,) ident(chdir_restore)operator(,) operator(()ident(VALUE)operator(\)&)ident(args)operator(\);) + operator(}) + ident(dir_chdir)operator(()ident(path)operator(\);) + + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Dir.getwd => string + * Dir.pwd => string + * + * Returns the path to the current working directory of this process as + * a string. + * + * Dir.chdir("/tmp"\) #=> 0 + * Dir.getwd #=> "/tmp" + */) +directive(static) ident(VALUE) +ident(dir_s_getwd)operator(()ident(dir)operator(\)) + ident(VALUE) ident(dir)operator(;) +operator({) + pre_type(char) operator(*)ident(path)operator(;) + ident(VALUE) ident(cwd)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + ident(path) operator(=) ident(my_getcwd)operator((\);) + ident(cwd) operator(=) ident(rb_tainted_str_new2)operator(()ident(path)operator(\);) + + ident(free)operator(()ident(path)operator(\);) + reserved(return) ident(cwd)operator(;) +operator(}) + +directive(static) directive(void) ident(check_dirname) ident(_)operator((()directive(volatile) ident(VALUE) operator(*\)\);) +directive(static) directive(void) +ident(check_dirname)operator(()ident(dir)operator(\)) + directive(volatile) ident(VALUE) operator(*)ident(dir)operator(;) +operator({) + pre_type(char) operator(*)ident(path)operator(,) operator(*)ident(pend)operator(;) + + ident(SafeStringValue)operator((*)ident(dir)operator(\);) + ident(rb_secure)operator(()integer(2)operator(\);) + ident(path) operator(=) ident(RSTRING)operator((*)ident(dir)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(path) operator(&&) operator(*()ident(pend) operator(=) ident(rb_path_end)operator(()ident(rb_path_skip_prefix)operator(()ident(path)operator(\)\)\)\)) operator({) + operator(*)ident(dir) operator(=) ident(rb_str_new)operator(()ident(path)operator(,) ident(pend) operator(-) ident(path)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * Dir.chroot( string \) => 0 + * + * Changes this process's idea of the file system root. Only a + * privileged process may make this call. Not available on all + * platforms. On Unix systems, see <code>chroot(2\)</code> for more + * information. + */) +directive(static) ident(VALUE) +ident(dir_s_chroot)operator(()ident(dir)operator(,) ident(path)operator(\)) + ident(VALUE) ident(dir)operator(,) ident(path)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_CHROOT)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + ident(check_dirname)operator((&)ident(path)operator(\);) + + reserved(if) operator(()ident(chroot)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\)) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) + + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * Dir.mkdir( string [, integer] \) => 0 + * + * Makes a new directory named by <i>string</i>, with permissions + * specified by the optional parameter <i>anInteger</i>. The + * permissions may be modified by the value of + * <code>File::umask</code>, and are ignored on NT. Raises a + * <code>SystemCallError</code> if the directory cannot be created. See + * also the discussion of permissions in the class documentation for + * <code>File</code>. + * + */) +directive(static) ident(VALUE) +ident(dir_s_mkdir)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(path)operator(,) ident(vmode)operator(;) + pre_type(int) ident(mode)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(path)operator(,) operator(&)ident(vmode)operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(mode) operator(=) ident(NUM2INT)operator(()ident(vmode)operator(\);) + operator(}) + reserved(else) operator({) + ident(mode) operator(=) oct(0777)operator(;) + operator(}) + + ident(check_dirname)operator((&)ident(path)operator(\);) + reserved(if) operator(()ident(mkdir)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(,) ident(mode)operator(\)) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) + + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Dir.delete( string \) => 0 + * Dir.rmdir( string \) => 0 + * Dir.unlink( string \) => 0 + * + * Deletes the named directory. Raises a subclass of + * <code>SystemCallError</code> if the directory isn't empty. + */) +directive(static) ident(VALUE) +ident(dir_s_rmdir)operator(()ident(obj)operator(,) ident(dir)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(dir)operator(;) +operator({) + ident(check_dirname)operator((&)ident(dir)operator(\);) + reserved(if) operator(()ident(rmdir)operator(()ident(RSTRING)operator(()ident(dir)operator(\)->)ident(ptr)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(dir)operator(\)->)ident(ptr)operator(\);) + + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +directive(static) directive(void) +ident(sys_warning_1)operator(()ident(mesg)operator(\)) + directive(const) pre_type(char)operator(*) ident(mesg)operator(;) +operator({) + ident(rb_sys_warning)operator(()string<delimiter(")content(%s)delimiter(")>operator(,) ident(mesg)operator(\);) +operator(}) + +preprocessor(#define) ident(GLOB_VERBOSE) operator(()integer(1)ident(UL) operator(<<) operator(()reserved(sizeof)operator(()pre_type(int)operator(\)) operator(*) ident(CHAR_BIT) operator(-) integer(1)operator(\)\)) +preprocessor(#define) ident(sys_warning)operator(()ident(val)operator(\)) \ + operator(()directive(void)operator(\)(()ident(flags) operator(&) ident(GLOB_VERBOSE)operator(\)) operator(&&) ident(rb_protect)operator((()ident(VALUE) operator((*\))ident(_)operator((()ident(VALUE)operator(\)\)\))ident(sys_warning_1)operator(,) operator(()ident(VALUE)operator(\)()ident(val)operator(\),) integer(0)operator(\)\)) + +preprocessor(#define) ident(GLOB_ALLOC)operator(()ident(type)operator(\)) operator(()ident(type) operator(*\))ident(malloc)operator(()reserved(sizeof)operator(()ident(type)operator(\)\)) +preprocessor(#define) ident(GLOB_ALLOC_N)operator(()ident(type)operator(,) ident(n)operator(\)) operator(()ident(type) operator(*\))ident(malloc)operator(()reserved(sizeof)operator(()ident(type)operator(\)) operator(*) operator(()ident(n)operator(\)\)) +preprocessor(#define) ident(GLOB_JUMP_TAG)operator(()ident(status)operator(\)) operator((()ident(status) operator(==) operator(-)integer(1)operator(\)) operator(?) ident(rb_memerror)operator((\)) operator(:) ident(rb_jump_tag)operator(()ident(status)operator(\)\)) + +comment(/* + * ENOTDIR can be returned by stat(2\) if a non-leaf element of the path + * is not a directory. + */) +preprocessor(#define) ident(to_be_ignored)operator(()ident(e)operator(\)) operator((()ident(e)operator(\)) operator(==) ident(ENOENT) operator(||) operator(()ident(e)operator(\)) operator(==) ident(ENOTDIR)operator(\)) + +comment(/* System call with warning */) +directive(static) pre_type(int) +ident(do_stat)operator(()directive(const) pre_type(char) operator(*)ident(path)operator(,) reserved(struct) ident(stat) operator(*)ident(pst)operator(,) pre_type(int) ident(flags)operator(\)) + +operator({) + pre_type(int) ident(ret) operator(=) ident(stat)operator(()ident(path)operator(,) ident(pst)operator(\);) + reserved(if) operator(()ident(ret) operator(<) integer(0) operator(&&) operator(!)ident(to_be_ignored)operator(()ident(errno)operator(\)\)) + ident(sys_warning)operator(()ident(path)operator(\);) + + reserved(return) ident(ret)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(do_lstat)operator(()directive(const) pre_type(char) operator(*)ident(path)operator(,) reserved(struct) ident(stat) operator(*)ident(pst)operator(,) pre_type(int) ident(flags)operator(\)) +operator({) + pre_type(int) ident(ret) operator(=) ident(lstat)operator(()ident(path)operator(,) ident(pst)operator(\);) + reserved(if) operator(()ident(ret) operator(<) integer(0) operator(&&) operator(!)ident(to_be_ignored)operator(()ident(errno)operator(\)\)) + ident(sys_warning)operator(()ident(path)operator(\);) + + reserved(return) ident(ret)operator(;) +operator(}) + +directive(static) ident(DIR) operator(*) +ident(do_opendir)operator(()directive(const) pre_type(char) operator(*)ident(path)operator(,) pre_type(int) ident(flags)operator(\)) +operator({) + ident(DIR) operator(*)ident(dirp) operator(=) ident(opendir)operator(()ident(path)operator(\);) + reserved(if) operator(()ident(dirp) operator(==) pre_constant(NULL) operator(&&) operator(!)ident(to_be_ignored)operator(()ident(errno)operator(\)\)) + ident(sys_warning)operator(()ident(path)operator(\);) + + reserved(return) ident(dirp)operator(;) +operator(}) + +comment(/* Return nonzero if S has any special globbing chars in it. */) +directive(static) pre_type(int) +ident(has_magic)operator(()ident(s)operator(,) ident(flags)operator(\)) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(int) ident(flags)operator(;) +operator({) + directive(const) pre_type(int) ident(escape) operator(=) operator(!()ident(flags) operator(&) ident(FNM_NOESCAPE)operator(\);) + directive(const) pre_type(int) ident(nocase) operator(=) ident(flags) operator(&) ident(FNM_CASEFOLD)operator(;) + + directive(register) directive(const) pre_type(char) operator(*)ident(p) operator(=) ident(s)operator(;) + directive(register) pre_type(char) ident(c)operator(;) + + reserved(while) operator(()ident(c) operator(=) operator(*)ident(p)operator(++\)) operator({) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('*')operator(:) + reserved(case) char('?')operator(:) + reserved(case) char('[')operator(:) + reserved(return) integer(1)operator(;) + + reserved(case) char('\\\\')operator(:) + reserved(if) operator(()ident(escape) operator(&&) operator(!()ident(c) operator(=) operator(*)ident(p)operator(++\)\)) + reserved(return) integer(0)operator(;) + reserved(continue)operator(;) + + reserved(default)operator(:) + reserved(if) operator((!)ident(FNM_SYSCASE) operator(&&) ident(ISALPHA)operator(()ident(c)operator(\)) operator(&&) ident(nocase)operator(\)) + reserved(return) integer(1)operator(;) + operator(}) + + ident(p) operator(=) ident(Next)operator(()ident(p)operator(-)integer(1)operator(\);) + operator(}) + + reserved(return) integer(0)operator(;) +operator(}) + +comment(/* Find separator in globbing pattern. */) +directive(static) pre_type(char) operator(*) +ident(find_dirsep)operator(()directive(const) pre_type(char) operator(*)ident(s)operator(,) pre_type(int) ident(flags)operator(\)) +operator({) + directive(const) pre_type(int) ident(escape) operator(=) operator(!()ident(flags) operator(&) ident(FNM_NOESCAPE)operator(\);) + + directive(register) directive(const) pre_type(char) operator(*)ident(p) operator(=) ident(s)operator(;) + directive(register) pre_type(char) ident(c)operator(;) + pre_type(int) ident(open) operator(=) integer(0)operator(;) + + reserved(while) operator(()ident(c) operator(=) operator(*)ident(p)operator(++\)) operator({) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('[')operator(:) + ident(open) operator(=) integer(1)operator(;) + reserved(continue)operator(;) + reserved(case) char(']')operator(:) + ident(open) operator(=) integer(0)operator(;) + reserved(continue)operator(;) + + reserved(case) char('/')operator(:) + reserved(if) operator((!)ident(open)operator(\)) + reserved(return) operator(()pre_type(char) operator(*\))ident(p)operator(-)integer(1)operator(;) + reserved(continue)operator(;) + + reserved(case) char('\\\\')operator(:) + reserved(if) operator(()ident(escape) operator(&&) operator(!()ident(c) operator(=) operator(*)ident(p)operator(++\)\)) + reserved(return) operator(()pre_type(char) operator(*\))ident(p)operator(-)integer(1)operator(;) + reserved(continue)operator(;) + operator(}) + + ident(p) operator(=) ident(Next)operator(()ident(p)operator(-)integer(1)operator(\);) + operator(}) + + reserved(return) operator(()pre_type(char) operator(*\))ident(p)operator(-)integer(1)operator(;) +operator(}) + +comment(/* Remove escaping backslashes */) +directive(static) directive(void) +ident(remove_backslashes)operator(()ident(p)operator(\)) + pre_type(char) operator(*)ident(p)operator(;) +operator({) + pre_type(char) operator(*)ident(t) operator(=) ident(p)operator(;) + pre_type(char) operator(*)ident(s) operator(=) ident(p)operator(;) + + reserved(while) operator((*)ident(p)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('\\\\')operator(\)) operator({) + reserved(if) operator(()ident(t) operator(!=) ident(s)operator(\)) + ident(memmove)operator(()ident(t)operator(,) ident(s)operator(,) ident(p) operator(-) ident(s)operator(\);) + ident(t) operator(+=) ident(p) operator(-) ident(s)operator(;) + ident(s) operator(=) operator(++)ident(p)operator(;) + reserved(if) operator((!*)ident(p)operator(\)) reserved(break)operator(;) + operator(}) + ident(Inc)operator(()ident(p)operator(\);) + operator(}) + + reserved(while) operator((*)ident(p)operator(++\);) + + reserved(if) operator(()ident(t) operator(!=) ident(s)operator(\)) + ident(memmove)operator(()ident(t)operator(,) ident(s)operator(,) ident(p) operator(-) ident(s)operator(\);) comment(/* move '\\0' too */) +operator(}) + +comment(/* Globing pattern */) +reserved(enum) ident(glob_pattern_type) operator({) ident(PLAIN)operator(,) ident(MAGICAL)operator(,) ident(RECURSIVE)operator(,) ident(MATCH_ALL)operator(,) ident(MATCH_DIR) operator(};) + +reserved(struct) ident(glob_pattern) operator({) + pre_type(char) operator(*)ident(str)operator(;) + reserved(enum) ident(glob_pattern_type) ident(type)operator(;) + reserved(struct) ident(glob_pattern) operator(*)ident(next)operator(;) +operator(};) + +directive(static) directive(void) ident(glob_free_pattern)operator(()reserved(struct) ident(glob_pattern) operator(*)ident(list)operator(\);) + +directive(static) reserved(struct) ident(glob_pattern) operator(*) +ident(glob_make_pattern)operator(()directive(const) pre_type(char) operator(*)ident(p)operator(,) pre_type(int) ident(flags)operator(\)) +operator({) + reserved(struct) ident(glob_pattern) operator(*)ident(list)operator(,) operator(*)ident(tmp)operator(,) operator(**)ident(tail) operator(=) operator(&)ident(list)operator(;) + pre_type(int) ident(dirsep) operator(=) integer(0)operator(;) comment(/* pattern is terminated with '/' */) + + reserved(while) operator((*)ident(p)operator(\)) operator({) + ident(tmp) operator(=) ident(GLOB_ALLOC)operator(()reserved(struct) ident(glob_pattern)operator(\);) + reserved(if) operator((!)ident(tmp)operator(\)) reserved(goto) ident(error)operator(;) + reserved(if) operator(()ident(p)operator([)integer(0)operator(]) operator(==) char('*') operator(&&) ident(p)operator([)integer(1)operator(]) operator(==) char('*') operator(&&) ident(p)operator([)integer(2)operator(]) operator(==) char('/')operator(\)) operator({) + comment(/* fold continuous RECURSIVEs (needed in glob_helper\) */) + reserved(do) operator({) ident(p) operator(+=) integer(3)operator(;) operator(}) reserved(while) operator(()ident(p)operator([)integer(0)operator(]) operator(==) char('*') operator(&&) ident(p)operator([)integer(1)operator(]) operator(==) char('*') operator(&&) ident(p)operator([)integer(2)operator(]) operator(==) char('/')operator(\);) + ident(tmp)operator(->)ident(type) operator(=) ident(RECURSIVE)operator(;) + ident(tmp)operator(->)ident(str) operator(=) integer(0)operator(;) + ident(dirsep) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) + directive(const) pre_type(char) operator(*)ident(m) operator(=) ident(find_dirsep)operator(()ident(p)operator(,) ident(flags)operator(\);) + pre_type(char) operator(*)ident(buf) operator(=) ident(GLOB_ALLOC_N)operator(()pre_type(char)operator(,) ident(m)operator(-)ident(p)operator(+)integer(1)operator(\);) + reserved(if) operator((!)ident(buf)operator(\)) operator({) + ident(free)operator(()ident(tmp)operator(\);) + reserved(goto) ident(error)operator(;) + operator(}) + ident(memcpy)operator(()ident(buf)operator(,) ident(p)operator(,) ident(m)operator(-)ident(p)operator(\);) + ident(buf)operator([)ident(m)operator(-)ident(p)operator(]) operator(=) char('\\0')operator(;) + ident(tmp)operator(->)ident(type) operator(=) ident(has_magic)operator(()ident(buf)operator(,) ident(flags)operator(\)) operator(?) ident(MAGICAL) operator(:) ident(PLAIN)operator(;) + ident(tmp)operator(->)ident(str) operator(=) ident(buf)operator(;) + reserved(if) operator((*)ident(m)operator(\)) operator({) + ident(dirsep) operator(=) integer(1)operator(;) + ident(p) operator(=) ident(m) operator(+) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(dirsep) operator(=) integer(0)operator(;) + ident(p) operator(=) ident(m)operator(;) + operator(}) + operator(}) + operator(*)ident(tail) operator(=) ident(tmp)operator(;) + ident(tail) operator(=) operator(&)ident(tmp)operator(->)ident(next)operator(;) + operator(}) + + ident(tmp) operator(=) ident(GLOB_ALLOC)operator(()reserved(struct) ident(glob_pattern)operator(\);) + reserved(if) operator((!)ident(tmp)operator(\)) operator({) + label(error)operator(:) + operator(*)ident(tail) operator(=) integer(0)operator(;) + ident(glob_free_pattern)operator(()ident(list)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + ident(tmp)operator(->)ident(type) operator(=) ident(dirsep) operator(?) ident(MATCH_DIR) operator(:) ident(MATCH_ALL)operator(;) + ident(tmp)operator(->)ident(str) operator(=) integer(0)operator(;) + operator(*)ident(tail) operator(=) ident(tmp)operator(;) + ident(tmp)operator(->)ident(next) operator(=) integer(0)operator(;) + + reserved(return) ident(list)operator(;) +operator(}) + +directive(static) directive(void) +ident(glob_free_pattern)operator(()reserved(struct) ident(glob_pattern) operator(*)ident(list)operator(\)) +operator({) + reserved(while) operator(()ident(list)operator(\)) operator({) + reserved(struct) ident(glob_pattern) operator(*)ident(tmp) operator(=) ident(list)operator(;) + ident(list) operator(=) ident(list)operator(->)ident(next)operator(;) + reserved(if) operator(()ident(tmp)operator(->)ident(str)operator(\)) + ident(free)operator(()ident(tmp)operator(->)ident(str)operator(\);) + ident(free)operator(()ident(tmp)operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(char) operator(*) +ident(join_path)operator(()directive(const) pre_type(char) operator(*)ident(path)operator(,) pre_type(int) ident(dirsep)operator(,) directive(const) pre_type(char) operator(*)ident(name)operator(\)) +operator({) + pre_type(long) ident(len) operator(=) ident(strlen)operator(()ident(path)operator(\);) + pre_type(char) operator(*)ident(buf) operator(=) ident(GLOB_ALLOC_N)operator(()pre_type(char)operator(,) ident(len)operator(+)ident(strlen)operator(()ident(name)operator(\)+()ident(dirsep)operator(?)integer(1)operator(:)integer(0)operator(\)+)integer(1)operator(\);) + + reserved(if) operator((!)ident(buf)operator(\)) reserved(return) integer(0)operator(;) + ident(memcpy)operator(()ident(buf)operator(,) ident(path)operator(,) ident(len)operator(\);) + reserved(if) operator(()ident(dirsep)operator(\)) operator({) + ident(strcpy)operator(()ident(buf)operator(+)ident(len)operator(,) string<delimiter(")content(/)delimiter(")>operator(\);) + ident(len)operator(++;) + operator(}) + ident(strcpy)operator(()ident(buf)operator(+)ident(len)operator(,) ident(name)operator(\);) + reserved(return) ident(buf)operator(;) +operator(}) + +reserved(enum) ident(answer) operator({) ident(YES)operator(,) ident(NO)operator(,) ident(UNKNOWN) operator(};) + +preprocessor(#ifndef) ident(S_ISLNK) +preprocessor(# ifndef) ident(S_IFLNK) +preprocessor(# define) ident(S_ISLNK)operator(()ident(m)operator(\)) operator(()integer(0)operator(\)) +preprocessor(# else) +preprocessor(# define) ident(S_ISLNK)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFLNK)operator(\)) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#ifndef) ident(S_ISDIR) +preprocessor(# define) ident(S_ISDIR)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFDIR)operator(\)) +preprocessor(#endif) + +reserved(struct) ident(glob_args) operator({) + directive(void) operator((*)ident(func)operator(\)) ident(_)operator((()directive(const) pre_type(char)operator(*,) ident(VALUE)operator(\)\);) + directive(const) pre_type(char) operator(*)ident(c)operator(;) + ident(VALUE) ident(v)operator(;) +operator(};) + +directive(static) ident(VALUE) ident(glob_func_caller) ident(_)operator((()ident(VALUE)operator(\)\);) + +directive(static) ident(VALUE) +ident(glob_func_caller)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(struct) ident(glob_args) operator(*)ident(args) operator(=) operator(()reserved(struct) ident(glob_args) operator(*\))ident(val)operator(;) + + operator((*)ident(args)operator(->)ident(func)operator(\)()ident(args)operator(->)ident(c)operator(,) ident(args)operator(->)ident(v)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +preprocessor(#define) ident(glob_call_func)operator(()ident(func)operator(,) ident(path)operator(,) ident(arg)operator(\)) operator((*)ident(func)operator(\)()ident(path)operator(,) ident(arg)operator(\)) + +directive(static) pre_type(int) ident(glob_helper) ident(_)operator((()directive(const) pre_type(char) operator(*,) pre_type(int)operator(,) reserved(enum) ident(answer)operator(,) reserved(enum) ident(answer)operator(,) reserved(struct) ident(glob_pattern) operator(**,) reserved(struct) ident(glob_pattern) operator(**,) pre_type(int)operator(,) ident(ruby_glob_func) operator(*,) ident(VALUE)operator(\)\);) + +directive(static) pre_type(int) +ident(glob_helper)operator(()ident(path)operator(,) ident(dirsep)operator(,) ident(exist)operator(,) ident(isdir)operator(,) ident(beg)operator(,) ident(end)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + pre_type(int) ident(dirsep)operator(;) comment(/* '/' should be placed before appending child entry's name to 'path'. */) + reserved(enum) ident(answer) ident(exist)operator(;) comment(/* Does 'path' indicate an existing entry? */) + reserved(enum) ident(answer) ident(isdir)operator(;) comment(/* Does 'path' indicate a directory or a symlink to a directory? */) + reserved(struct) ident(glob_pattern) operator(**)ident(beg)operator(;) + reserved(struct) ident(glob_pattern) operator(**)ident(end)operator(;) + pre_type(int) ident(flags)operator(;) + ident(ruby_glob_func) operator(*)ident(func)operator(;) + ident(VALUE) ident(arg)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + pre_type(int) ident(status) operator(=) integer(0)operator(;) + reserved(struct) ident(glob_pattern) operator(**)ident(cur)operator(,) operator(**)ident(new_beg)operator(,) operator(**)ident(new_end)operator(;) + pre_type(int) ident(plain) operator(=) integer(0)operator(,) ident(magical) operator(=) integer(0)operator(,) ident(recursive) operator(=) integer(0)operator(,) ident(match_all) operator(=) integer(0)operator(,) ident(match_dir) operator(=) integer(0)operator(;) + pre_type(int) ident(escape) operator(=) operator(!()ident(flags) operator(&) ident(FNM_NOESCAPE)operator(\);) + + reserved(for) operator(()ident(cur) operator(=) ident(beg)operator(;) ident(cur) operator(<) ident(end)operator(;) operator(++)ident(cur)operator(\)) operator({) + reserved(struct) ident(glob_pattern) operator(*)ident(p) operator(=) operator(*)ident(cur)operator(;) + reserved(if) operator(()ident(p)operator(->)ident(type) operator(==) ident(RECURSIVE)operator(\)) operator({) + ident(recursive) operator(=) integer(1)operator(;) + ident(p) operator(=) ident(p)operator(->)ident(next)operator(;) + operator(}) + reserved(switch) operator(()ident(p)operator(->)ident(type)operator(\)) operator({) + reserved(case) label(PLAIN)operator(:) + ident(plain) operator(=) integer(1)operator(;) + reserved(break)operator(;) + reserved(case) label(MAGICAL)operator(:) + ident(magical) operator(=) integer(1)operator(;) + reserved(break)operator(;) + reserved(case) label(MATCH_ALL)operator(:) + ident(match_all) operator(=) integer(1)operator(;) + reserved(break)operator(;) + reserved(case) label(MATCH_DIR)operator(:) + ident(match_dir) operator(=) integer(1)operator(;) + reserved(break)operator(;) + reserved(case) label(RECURSIVE)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(continuous RECURSIVEs)delimiter(")>operator(\);) + operator(}) + operator(}) + + reserved(if) operator((*)ident(path)operator(\)) operator({) + reserved(if) operator(()ident(match_all) operator(&&) ident(exist) operator(==) ident(UNKNOWN)operator(\)) operator({) + reserved(if) operator(()ident(do_lstat)operator(()ident(path)operator(,) operator(&)ident(st)operator(,) ident(flags)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(exist) operator(=) ident(YES)operator(;) + ident(isdir) operator(=) ident(S_ISDIR)operator(()ident(st)operator(.)ident(st_mode)operator(\)) operator(?) ident(YES) operator(:) ident(S_ISLNK)operator(()ident(st)operator(.)ident(st_mode)operator(\)) operator(?) ident(UNKNOWN) operator(:) ident(NO)operator(;) + operator(}) + reserved(else) operator({) + ident(exist) operator(=) ident(NO)operator(;) + ident(isdir) operator(=) ident(NO)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(match_dir) operator(&&) ident(isdir) operator(==) ident(UNKNOWN)operator(\)) operator({) + reserved(if) operator(()ident(do_stat)operator(()ident(path)operator(,) operator(&)ident(st)operator(,) ident(flags)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(exist) operator(=) ident(YES)operator(;) + ident(isdir) operator(=) ident(S_ISDIR)operator(()ident(st)operator(.)ident(st_mode)operator(\)) operator(?) ident(YES) operator(:) ident(NO)operator(;) + operator(}) + reserved(else) operator({) + ident(exist) operator(=) ident(NO)operator(;) + ident(isdir) operator(=) ident(NO)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(match_all) operator(&&) ident(exist) operator(==) ident(YES)operator(\)) operator({) + ident(status) operator(=) ident(glob_call_func)operator(()ident(func)operator(,) ident(path)operator(,) ident(arg)operator(\);) + reserved(if) operator(()ident(status)operator(\)) reserved(return) ident(status)operator(;) + operator(}) + reserved(if) operator(()ident(match_dir) operator(&&) ident(isdir) operator(==) ident(YES)operator(\)) operator({) + pre_type(char) operator(*)ident(tmp) operator(=) ident(join_path)operator(()ident(path)operator(,) ident(dirsep)operator(,) string<delimiter(")delimiter(")>operator(\);) + reserved(if) operator((!)ident(tmp)operator(\)) reserved(return) operator(-)integer(1)operator(;) + ident(status) operator(=) ident(glob_call_func)operator(()ident(func)operator(,) ident(tmp)operator(,) ident(arg)operator(\);) + ident(free)operator(()ident(tmp)operator(\);) + reserved(if) operator(()ident(status)operator(\)) reserved(return) ident(status)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()ident(exist) operator(==) ident(NO) operator(||) ident(isdir) operator(==) ident(NO)operator(\)) reserved(return) integer(0)operator(;) + + reserved(if) operator(()ident(magical) operator(||) ident(recursive)operator(\)) operator({) + reserved(struct) ident(dirent) operator(*)ident(dp)operator(;) + ident(DIR) operator(*)ident(dirp) operator(=) ident(do_opendir)operator((*)ident(path) operator(?) ident(path) operator(:) string<delimiter(")content(.)delimiter(")>operator(,) ident(flags)operator(\);) + reserved(if) operator(()ident(dirp) operator(==) pre_constant(NULL)operator(\)) reserved(return) integer(0)operator(;) + + reserved(for) operator(()ident(dp) operator(=) ident(readdir)operator(()ident(dirp)operator(\);) ident(dp) operator(!=) pre_constant(NULL)operator(;) ident(dp) operator(=) ident(readdir)operator(()ident(dirp)operator(\)\)) operator({) + pre_type(char) operator(*)ident(buf) operator(=) ident(join_path)operator(()ident(path)operator(,) ident(dirsep)operator(,) ident(dp)operator(->)ident(d_name)operator(\);) + reserved(enum) ident(answer) ident(new_isdir) operator(=) ident(UNKNOWN)operator(;) + + reserved(if) operator((!)ident(buf)operator(\)) operator({) + ident(status) operator(=) operator(-)integer(1)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(recursive) operator(&&) ident(strcmp)operator(()ident(dp)operator(->)ident(d_name)operator(,) string<delimiter(")content(.)delimiter(")>operator(\)) operator(!=) integer(0) operator(&&) ident(strcmp)operator(()ident(dp)operator(->)ident(d_name)operator(,) string<delimiter(")content(..)delimiter(")>operator(\)) operator(!=) integer(0) + operator(&&) ident(fnmatch)operator(()string<delimiter(")content(*)delimiter(")>operator(,) ident(dp)operator(->)ident(d_name)operator(,) ident(flags)operator(\)) operator(==) integer(0)operator(\)) operator({) +preprocessor(#ifndef) ident(_WIN32) + reserved(if) operator(()ident(do_lstat)operator(()ident(buf)operator(,) operator(&)ident(st)operator(,) ident(flags)operator(\)) operator(==) integer(0)operator(\)) + ident(new_isdir) operator(=) ident(S_ISDIR)operator(()ident(st)operator(.)ident(st_mode)operator(\)) operator(?) ident(YES) operator(:) ident(S_ISLNK)operator(()ident(st)operator(.)ident(st_mode)operator(\)) operator(?) ident(UNKNOWN) operator(:) ident(NO)operator(;) + reserved(else) + ident(new_isdir) operator(=) ident(NO)operator(;) +preprocessor(#else) + ident(new_isdir) operator(=) ident(dp)operator(->)ident(d_isdir) operator(?) operator((!)ident(dp)operator(->)ident(d_isrep) operator(?) ident(YES) operator(:) ident(UNKNOWN)operator(\)) operator(:) ident(NO)operator(;) +preprocessor(#endif) + operator(}) + + ident(new_beg) operator(=) ident(new_end) operator(=) ident(GLOB_ALLOC_N)operator(()reserved(struct) ident(glob_pattern) operator(*,) operator(()ident(end) operator(-) ident(beg)operator(\)) operator(*) integer(2)operator(\);) + reserved(if) operator((!)ident(new_beg)operator(\)) operator({) + ident(status) operator(=) operator(-)integer(1)operator(;) + reserved(break)operator(;) + operator(}) + + reserved(for) operator(()ident(cur) operator(=) ident(beg)operator(;) ident(cur) operator(<) ident(end)operator(;) operator(++)ident(cur)operator(\)) operator({) + reserved(struct) ident(glob_pattern) operator(*)ident(p) operator(=) operator(*)ident(cur)operator(;) + reserved(if) operator(()ident(p)operator(->)ident(type) operator(==) ident(RECURSIVE)operator(\)) operator({) + reserved(if) operator(()ident(new_isdir) operator(==) ident(YES)operator(\)) comment(/* not symlink but real directory */) + operator(*)ident(new_end)operator(++) operator(=) ident(p)operator(;) comment(/* append recursive pattern */) + ident(p) operator(=) ident(p)operator(->)ident(next)operator(;) comment(/* 0 times recursion */) + operator(}) + reserved(if) operator(()ident(p)operator(->)ident(type) operator(==) ident(PLAIN) operator(||) ident(p)operator(->)ident(type) operator(==) ident(MAGICAL)operator(\)) operator({) + reserved(if) operator(()ident(fnmatch)operator(()ident(p)operator(->)ident(str)operator(,) ident(dp)operator(->)ident(d_name)operator(,) ident(flags)operator(\)) operator(==) integer(0)operator(\)) + operator(*)ident(new_end)operator(++) operator(=) ident(p)operator(->)ident(next)operator(;) + operator(}) + operator(}) + + ident(status) operator(=) ident(glob_helper)operator(()ident(buf)operator(,) integer(1)operator(,) ident(YES)operator(,) ident(new_isdir)operator(,) ident(new_beg)operator(,) ident(new_end)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\);) + ident(free)operator(()ident(buf)operator(\);) + ident(free)operator(()ident(new_beg)operator(\);) + reserved(if) operator(()ident(status)operator(\)) reserved(break)operator(;) + operator(}) + + ident(closedir)operator(()ident(dirp)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(plain)operator(\)) operator({) + reserved(struct) ident(glob_pattern) operator(**)ident(copy_beg)operator(,) operator(**)ident(copy_end)operator(,) operator(**)ident(cur2)operator(;) + + ident(copy_beg) operator(=) ident(copy_end) operator(=) ident(GLOB_ALLOC_N)operator(()reserved(struct) ident(glob_pattern) operator(*,) ident(end) operator(-) ident(beg)operator(\);) + reserved(if) operator((!)ident(copy_beg)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(for) operator(()ident(cur) operator(=) ident(beg)operator(;) ident(cur) operator(<) ident(end)operator(;) operator(++)ident(cur)operator(\)) + operator(*)ident(copy_end)operator(++) operator(=) operator((*)ident(cur)operator(\)->)ident(type) operator(==) ident(PLAIN) operator(?) operator(*)ident(cur) operator(:) integer(0)operator(;) + + reserved(for) operator(()ident(cur) operator(=) ident(copy_beg)operator(;) ident(cur) operator(<) ident(copy_end)operator(;) operator(++)ident(cur)operator(\)) operator({) + reserved(if) operator((*)ident(cur)operator(\)) operator({) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(char) operator(*)ident(name)operator(;) + ident(name) operator(=) ident(GLOB_ALLOC_N)operator(()pre_type(char)operator(,) ident(strlen)operator(((*)ident(cur)operator(\)->)ident(str)operator(\)) operator(+) integer(1)operator(\);) + reserved(if) operator((!)ident(name)operator(\)) operator({) + ident(status) operator(=) operator(-)integer(1)operator(;) + reserved(break)operator(;) + operator(}) + ident(strcpy)operator(()ident(name)operator(,) operator((*)ident(cur)operator(\)->)ident(str)operator(\);) + reserved(if) operator(()ident(escape)operator(\)) ident(remove_backslashes)operator(()ident(name)operator(\);) + + ident(new_beg) operator(=) ident(new_end) operator(=) ident(GLOB_ALLOC_N)operator(()reserved(struct) ident(glob_pattern) operator(*,) ident(end) operator(-) ident(beg)operator(\);) + reserved(if) operator((!)ident(new_beg)operator(\)) operator({) + ident(free)operator(()ident(name)operator(\);) + ident(status) operator(=) operator(-)integer(1)operator(;) + reserved(break)operator(;) + operator(}) + operator(*)ident(new_end)operator(++) operator(=) operator((*)ident(cur)operator(\)->)ident(next)operator(;) + reserved(for) operator(()ident(cur2) operator(=) ident(cur) operator(+) integer(1)operator(;) ident(cur2) operator(<) ident(copy_end)operator(;) operator(++)ident(cur2)operator(\)) operator({) + reserved(if) operator((*)ident(cur2) operator(&&) ident(fnmatch)operator(((*)ident(cur2)operator(\)->)ident(str)operator(,) ident(name)operator(,) ident(flags)operator(\)) operator(==) integer(0)operator(\)) operator({) + operator(*)ident(new_end)operator(++) operator(=) operator((*)ident(cur2)operator(\)->)ident(next)operator(;) + operator(*)ident(cur2) operator(=) integer(0)operator(;) + operator(}) + operator(}) + + ident(buf) operator(=) ident(join_path)operator(()ident(path)operator(,) ident(dirsep)operator(,) ident(name)operator(\);) + ident(free)operator(()ident(name)operator(\);) + reserved(if) operator((!)ident(buf)operator(\)) operator({) + ident(free)operator(()ident(new_beg)operator(\);) + ident(status) operator(=) operator(-)integer(1)operator(;) + reserved(break)operator(;) + operator(}) + ident(status) operator(=) ident(glob_helper)operator(()ident(buf)operator(,) integer(1)operator(,) ident(UNKNOWN)operator(,) ident(UNKNOWN)operator(,) ident(new_beg)operator(,) ident(new_end)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\);) + ident(free)operator(()ident(buf)operator(\);) + ident(free)operator(()ident(new_beg)operator(\);) + reserved(if) operator(()ident(status)operator(\)) reserved(break)operator(;) + operator(}) + operator(}) + + ident(free)operator(()ident(copy_beg)operator(\);) + operator(}) + + reserved(return) ident(status)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(ruby_glob0)operator(()ident(path)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + pre_type(int) ident(flags)operator(;) + ident(ruby_glob_func) operator(*)ident(func)operator(;) + ident(VALUE) ident(arg)operator(;) +operator({) + reserved(struct) ident(glob_pattern) operator(*)ident(list)operator(;) + directive(const) pre_type(char) operator(*)ident(root)operator(,) operator(*)ident(start)operator(;) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(int) ident(n)operator(;) + pre_type(int) ident(status)operator(;) + + ident(start) operator(=) ident(root) operator(=) ident(path)operator(;) + ident(flags) operator(|=) ident(FNM_SYSCASE)operator(;) +preprocessor(#if) ident(defined) ident(DOSISH) + ident(root) operator(=) ident(rb_path_skip_prefix)operator(()ident(root)operator(\);) +preprocessor(#endif) + + reserved(if) operator(()ident(root) operator(&&) operator(*)ident(root) operator(==) char('/')operator(\)) ident(root)operator(++;) + + ident(n) operator(=) ident(root) operator(-) ident(start)operator(;) + ident(buf) operator(=) ident(GLOB_ALLOC_N)operator(()pre_type(char)operator(,) ident(n) operator(+) integer(1)operator(\);) + reserved(if) operator((!)ident(buf)operator(\)) reserved(return) operator(-)integer(1)operator(;) + ident(MEMCPY)operator(()ident(buf)operator(,) ident(start)operator(,) pre_type(char)operator(,) ident(n)operator(\);) + ident(buf)operator([)ident(n)operator(]) operator(=) char('\\0')operator(;) + + ident(list) operator(=) ident(glob_make_pattern)operator(()ident(root)operator(,) ident(flags)operator(\);) + reserved(if) operator((!)ident(list)operator(\)) operator({) + ident(free)operator(()ident(buf)operator(\);) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + ident(status) operator(=) ident(glob_helper)operator(()ident(buf)operator(,) integer(0)operator(,) ident(UNKNOWN)operator(,) ident(UNKNOWN)operator(,) operator(&)ident(list)operator(,) operator(&)ident(list) operator(+) integer(1)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\);) + ident(glob_free_pattern)operator(()ident(list)operator(\);) + ident(free)operator(()ident(buf)operator(\);) + + reserved(return) ident(status)operator(;) +operator(}) + +pre_type(int) +ident(ruby_glob)operator(()ident(path)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + pre_type(int) ident(flags)operator(;) + ident(ruby_glob_func) operator(*)ident(func)operator(;) + ident(VALUE) ident(arg)operator(;) +operator({) + reserved(return) ident(ruby_glob0)operator(()ident(path)operator(,) ident(flags) operator(&) operator(~)ident(GLOB_VERBOSE)operator(,) ident(func)operator(,) ident(arg)operator(\);) +operator(}) + +directive(static) pre_type(int) ident(rb_glob_caller) ident(_)operator((()directive(const) pre_type(char) operator(*,) ident(VALUE)operator(\)\);) + +directive(static) pre_type(int) +ident(rb_glob_caller)operator(()ident(path)operator(,) ident(a)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + ident(VALUE) ident(a)operator(;) +operator({) + pre_type(int) ident(status)operator(;) + reserved(struct) ident(glob_args) operator(*)ident(args) operator(=) operator(()reserved(struct) ident(glob_args) operator(*\))ident(a)operator(;) + + ident(args)operator(->)ident(c) operator(=) ident(path)operator(;) + ident(rb_protect)operator(()ident(glob_func_caller)operator(,) ident(a)operator(,) operator(&)ident(status)operator(\);) + reserved(return) ident(status)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(rb_glob2)operator(()ident(path)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + pre_type(int) ident(flags)operator(;) + directive(void) operator((*)ident(func)operator(\)) ident(_)operator((()directive(const) pre_type(char) operator(*,) ident(VALUE)operator(\)\);) + ident(VALUE) ident(arg)operator(;) +operator({) + reserved(struct) ident(glob_args) ident(args)operator(;) + + ident(args)operator(.)ident(func) operator(=) ident(func)operator(;) + ident(args)operator(.)ident(v) operator(=) ident(arg)operator(;) + + reserved(if) operator(()ident(flags) operator(&) ident(FNM_SYSCASE)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(Dir.glob(\) ignores File::FNM_CASEFOLD)delimiter(")>operator(\);) + operator(}) + + reserved(return) ident(ruby_glob0)operator(()ident(path)operator(,) ident(flags) operator(|) ident(GLOB_VERBOSE)operator(,) ident(rb_glob_caller)operator(,) operator(()ident(VALUE)operator(\)&)ident(args)operator(\);) +operator(}) + +directive(void) +ident(rb_glob)operator(()ident(path)operator(,) ident(func)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + directive(void) operator((*)ident(func)operator(\)) ident(_)operator((()directive(const) pre_type(char)operator(*,) ident(VALUE)operator(\)\);) + ident(VALUE) ident(arg)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(rb_glob2)operator(()ident(path)operator(,) integer(0)operator(,) ident(func)operator(,) ident(arg)operator(\);) + reserved(if) operator(()ident(status)operator(\)) ident(GLOB_JUMP_TAG)operator(()ident(status)operator(\);) +operator(}) + +directive(static) directive(void) ident(push_pattern) ident(_)operator((()directive(const) pre_type(char)operator(*) ident(path)operator(,) ident(VALUE) ident(ary)operator(\)\);) +directive(static) directive(void) +ident(push_pattern)operator(()ident(path)operator(,) ident(ary)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_tainted_str_new2)operator(()ident(path)operator(\)\);) +operator(}) + +pre_type(int) +ident(ruby_brace_expand)operator(()ident(str)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) + pre_type(int) ident(flags)operator(;) + ident(ruby_glob_func) operator(*)ident(func)operator(;) + ident(VALUE) ident(arg)operator(;) +operator({) + directive(const) pre_type(int) ident(escape) operator(=) operator(!()ident(flags) operator(&) ident(FNM_NOESCAPE)operator(\);) + directive(const) pre_type(char) operator(*)ident(p) operator(=) ident(str)operator(;) + directive(const) pre_type(char) operator(*)ident(s) operator(=) ident(p)operator(;) + directive(const) pre_type(char) operator(*)ident(lbrace) operator(=) integer(0)operator(,) operator(*)ident(rbrace) operator(=) integer(0)operator(;) + pre_type(int) ident(nest) operator(=) integer(0)operator(,) ident(status) operator(=) integer(0)operator(;) + + reserved(while) operator((*)ident(p)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('{') operator(&&) ident(nest)operator(++) operator(==) integer(0)operator(\)) operator({) + ident(lbrace) operator(=) ident(p)operator(;) + operator(}) + reserved(if) operator((*)ident(p) operator(==) char('}') operator(&&) operator(--)ident(nest) operator(<=) integer(0)operator(\)) operator({) + ident(rbrace) operator(=) ident(p)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator((*)ident(p) operator(==) char('\\\\') operator(&&) ident(escape)operator(\)) operator({) + reserved(if) operator((!*++)ident(p)operator(\)) reserved(break)operator(;) + operator(}) + ident(Inc)operator(()ident(p)operator(\);) + operator(}) + + reserved(if) operator(()ident(lbrace) operator(&&) ident(rbrace)operator(\)) operator({) + pre_type(char) operator(*)ident(buf) operator(=) ident(GLOB_ALLOC_N)operator(()pre_type(char)operator(,) ident(strlen)operator(()ident(s)operator(\)) operator(+) integer(1)operator(\);) + pre_type(long) ident(shift)operator(;) + + reserved(if) operator((!)ident(buf)operator(\)) reserved(return) operator(-)integer(1)operator(;) + ident(memcpy)operator(()ident(buf)operator(,) ident(s)operator(,) ident(lbrace)operator(-)ident(s)operator(\);) + ident(shift) operator(=) operator(()ident(lbrace)operator(-)ident(s)operator(\);) + ident(p) operator(=) ident(lbrace)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(rbrace)operator(\)) operator({) + directive(const) pre_type(char) operator(*)ident(t) operator(=) operator(++)ident(p)operator(;) + ident(nest) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(rbrace) operator(&&) operator(!(*)ident(p) operator(==) char(',') operator(&&) ident(nest) operator(==) integer(0)operator(\)\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('{')operator(\)) ident(nest)operator(++;) + reserved(if) operator((*)ident(p) operator(==) char('}')operator(\)) ident(nest)operator(--;) + reserved(if) operator((*)ident(p) operator(==) char('\\\\') operator(&&) ident(escape)operator(\)) operator({) + reserved(if) operator((++)ident(p) operator(==) ident(rbrace)operator(\)) reserved(break)operator(;) + operator(}) + ident(Inc)operator(()ident(p)operator(\);) + operator(}) + ident(memcpy)operator(()ident(buf)operator(+)ident(shift)operator(,) ident(t)operator(,) ident(p)operator(-)ident(t)operator(\);) + ident(strcpy)operator(()ident(buf)operator(+)ident(shift)operator(+()ident(p)operator(-)ident(t)operator(\),) ident(rbrace)operator(+)integer(1)operator(\);) + ident(status) operator(=) ident(ruby_brace_expand)operator(()ident(buf)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\);) + reserved(if) operator(()ident(status)operator(\)) reserved(break)operator(;) + operator(}) + ident(free)operator(()ident(buf)operator(\);) + operator(}) + reserved(else) reserved(if) operator((!)ident(lbrace) operator(&&) operator(!)ident(rbrace)operator(\)) operator({) + ident(status) operator(=) operator((*)ident(func)operator(\)()ident(s)operator(,) ident(arg)operator(\);) + operator(}) + + reserved(return) ident(status)operator(;) +operator(}) + +reserved(struct) ident(brace_args) operator({) + ident(ruby_glob_func) operator(*)ident(func)operator(;) + ident(VALUE) ident(value)operator(;) + pre_type(int) ident(flags)operator(;) +operator(};) + +directive(static) pre_type(int) ident(glob_brace) ident(_)operator((()directive(const) pre_type(char) operator(*,) ident(VALUE)operator(\)\);) +directive(static) pre_type(int) +ident(glob_brace)operator(()ident(path)operator(,) ident(val)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(struct) ident(brace_args) operator(*)ident(arg) operator(=) operator(()reserved(struct) ident(brace_args) operator(*\))ident(val)operator(;) + + reserved(return) ident(ruby_glob0)operator(()ident(path)operator(,) ident(arg)operator(->)ident(flags)operator(,) ident(arg)operator(->)ident(func)operator(,) ident(arg)operator(->)ident(value)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(ruby_brace_glob0)operator(()ident(str)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) + pre_type(int) ident(flags)operator(;) + ident(ruby_glob_func) operator(*)ident(func)operator(;) + ident(VALUE) ident(arg)operator(;) +operator({) + reserved(struct) ident(brace_args) ident(args)operator(;) + + ident(args)operator(.)ident(func) operator(=) ident(func)operator(;) + ident(args)operator(.)ident(value) operator(=) ident(arg)operator(;) + ident(args)operator(.)ident(flags) operator(=) ident(flags)operator(;) + reserved(return) ident(ruby_brace_expand)operator(()ident(str)operator(,) ident(flags)operator(,) ident(glob_brace)operator(,) operator(()ident(VALUE)operator(\)&)ident(args)operator(\);) +operator(}) + +pre_type(int) +ident(ruby_brace_glob)operator(()ident(str)operator(,) ident(flags)operator(,) ident(func)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) + pre_type(int) ident(flags)operator(;) + ident(ruby_glob_func) operator(*)ident(func)operator(;) + ident(VALUE) ident(arg)operator(;) +operator({) + reserved(return) ident(ruby_brace_glob0)operator(()ident(str)operator(,) ident(flags) operator(&) operator(~)ident(GLOB_VERBOSE)operator(,) ident(func)operator(,) ident(arg)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(push_glob)operator(()ident(VALUE) ident(ary)operator(,) directive(const) pre_type(char) operator(*)ident(str)operator(,) pre_type(int) ident(flags)operator(\)) +operator({) + reserved(struct) ident(glob_args) ident(args)operator(;) + + ident(args)operator(.)ident(func) operator(=) ident(push_pattern)operator(;) + ident(args)operator(.)ident(v) operator(=) ident(ary)operator(;) + reserved(return) ident(ruby_brace_glob0)operator(()ident(str)operator(,) ident(flags) operator(|) ident(GLOB_VERBOSE)operator(,) ident(rb_glob_caller)operator(,) operator(()ident(VALUE)operator(\)&)ident(args)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_push_glob)operator(()ident(str)operator(,) ident(flags)operator(\)) comment(/* '\\0' is delimiter */) + ident(VALUE) ident(str)operator(;) + pre_type(int) ident(flags)operator(;) +operator({) + pre_type(long) ident(offset) operator(=) integer(0)operator(;) + ident(VALUE) ident(ary)operator(;) + + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + ident(SafeStringValue)operator(()ident(str)operator(\);) + + reserved(while) operator(()ident(offset) operator(<) ident(RSTRING_LEN)operator(()ident(str)operator(\)\)) operator({) + pre_type(int) ident(status) operator(=) ident(push_glob)operator(()ident(ary)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(offset)operator(,) ident(flags)operator(\);) + pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + reserved(if) operator(()ident(status)operator(\)) ident(GLOB_JUMP_TAG)operator(()ident(status)operator(\);) + reserved(if) operator(()ident(offset) operator(>=) ident(RSTRING_LEN)operator(()ident(str)operator(\)\)) reserved(break)operator(;) + ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(offset)operator(;) + ident(p) operator(+=) ident(strlen)operator(()ident(p)operator(\)) operator(+) integer(1)operator(;) + ident(pend) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(RSTRING_LEN)operator(()ident(str)operator(\);) + reserved(while) operator(()ident(p) operator(<) ident(pend) operator(&&) operator(!*)ident(p)operator(\)) + ident(p)operator(++;) + ident(offset) operator(=) ident(p) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + operator(}) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(dir_globs)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(flags)operator(\)) + pre_type(long) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + pre_type(int) ident(flags)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(argc)operator(;) operator(++)ident(i)operator(\)) operator({) + pre_type(int) ident(status)operator(;) + ident(VALUE) ident(str) operator(=) ident(argv)operator([)ident(i)operator(];) + ident(SafeStringValue)operator(()ident(str)operator(\);) + ident(status) operator(=) ident(push_glob)operator(()ident(ary)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(flags)operator(\);) + reserved(if) operator(()ident(status)operator(\)) ident(GLOB_JUMP_TAG)operator(()ident(status)operator(\);) + operator(}) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * Dir[ array ] => array + * Dir[ string [, string ...] ] => array + * + * Equivalent to calling + * <code>Dir.glob(</code><i>array,</i><code>0\)</code> and + * <code>Dir.glob([</code><i>string,...</i><code>],0\)</code>. + * + */) +directive(static) ident(VALUE) +ident(dir_s_aref)operator(()pre_type(int) ident(argc)operator(,) ident(VALUE) operator(*)ident(argv)operator(,) ident(VALUE) ident(obj)operator(\)) + operator({) + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + reserved(return) ident(rb_push_glob)operator(()ident(argv)operator([)integer(0)operator(],) integer(0)operator(\);) + operator(}) + reserved(return) ident(dir_globs)operator(()ident(argc)operator(,) ident(argv)operator(,) integer(0)operator(\);) + operator(}) + +comment(/* + * call-seq: + * Dir.glob( pattern, [flags] \) => array + * Dir.glob( pattern, [flags] \) {| filename | block } => nil + * + * Returns the filenames found by expanding <i>pattern</i> which is + * an +Array+ of the patterns or the pattern +String+, either as an + * <i>array</i> or as parameters to the block. Note that this pattern + * is not a regexp (it's closer to a shell glob\). See + * <code>File::fnmatch</code> for the meaning of the <i>flags</i> + * parameter. Note that case sensitivity depends on your system (so + * <code>File::FNM_CASEFOLD</code> is ignored\) + * + * <code>*</code>:: Matches any file. Can be restricted by + * other values in the glob. <code>*</code> + * will match all files; <code>c*</code> will + * match all files beginning with + * <code>c</code>; <code>*c</code> will match + * all files ending with <code>c</code>; and + * <code>*c*</code> will match all files that + * have <code>c</code> in them (including at + * the beginning or end\). Equivalent to + * <code>/ .* /x</code> in regexp. + * <code>**</code>:: Matches directories recursively. + * <code>?</code>:: Matches any one character. Equivalent to + * <code>/.{1}/</code> in regexp. + * <code>[set]</code>:: Matches any one character in +set+. + * Behaves exactly like character sets in + * Regexp, including set negation + * (<code>[^a-z]</code>\). + * <code>{p,q}</code>:: Matches either literal <code>p</code> or + * literal <code>q</code>. Matching literals + * may be more than one character in length. + * More than two literals may be specified. + * Equivalent to pattern alternation in + * regexp. + * <code>\\</code>:: Escapes the next metacharacter. + * + * Dir["config.?"] #=> ["config.h"] + * Dir.glob("config.?"\) #=> ["config.h"] + * Dir.glob("*.[a-z][a-z]"\) #=> ["main.rb"] + * Dir.glob("*.[^r]*"\) #=> ["config.h"] + * Dir.glob("*.{rb,h}"\) #=> ["main.rb", "config.h"] + * Dir.glob("*"\) #=> ["config.h", "main.rb"] + * Dir.glob("*", File::FNM_DOTMATCH\) #=> [".", "..", "config.h", "main.rb"] + * + * rbfiles = File.join("**", "*.rb"\) + * Dir.glob(rbfiles\) #=> ["main.rb", + * "lib/song.rb", + * "lib/song/karaoke.rb"] + * libdirs = File.join("**", "lib"\) + * Dir.glob(libdirs\) #=> ["lib"] + * + * librbfiles = File.join("**", "lib", "**", "*.rb"\) + * Dir.glob(librbfiles\) #=> ["lib/song.rb", + * "lib/song/karaoke.rb"] + * + * librbfiles = File.join("**", "lib", "*.rb"\) + * Dir.glob(librbfiles\) #=> ["lib/song.rb"] + */) +directive(static) ident(VALUE) +ident(dir_s_glob)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(str)operator(,) ident(rflags)operator(,) ident(ary)operator(;) + pre_type(int) ident(flags)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(str)operator(,) operator(&)ident(rflags)operator(\)) operator(==) integer(2)operator(\)) + ident(flags) operator(=) ident(NUM2INT)operator(()ident(rflags)operator(\);) + reserved(else) + ident(flags) operator(=) integer(0)operator(;) + + ident(ary) operator(=) ident(rb_check_array_type)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(ary)operator(\)\)) operator({) + ident(ary) operator(=) ident(rb_push_glob)operator(()ident(str)operator(,) ident(flags)operator(\);) + operator(}) + reserved(else) operator({) + directive(volatile) ident(VALUE) ident(v) operator(=) ident(ary)operator(;) + ident(ary) operator(=) ident(dir_globs)operator(()ident(RARRAY_LEN)operator(()ident(v)operator(\),) ident(RARRAY_PTR)operator(()ident(v)operator(\),) ident(flags)operator(\);) + operator(}) + + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_ary_each)operator(()ident(ary)operator(\);) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(dir_open_dir)operator(()ident(path)operator(\)) + ident(VALUE) ident(path)operator(;) +operator({) + ident(VALUE) ident(dir) operator(=) ident(rb_funcall)operator(()ident(rb_cDir)operator(,) ident(rb_intern)operator(()string<delimiter(")content(open)delimiter(")>operator(\),) integer(1)operator(,) ident(path)operator(\);) + + reserved(if) operator(()ident(TYPE)operator(()ident(dir)operator(\)) operator(!=) ident(T_DATA) operator(||) + ident(RDATA)operator(()ident(dir)operator(\)->)ident(dfree) operator(!=) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(free_dir)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type %s (expected Dir\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(dir)operator(\)\);) + operator(}) + reserved(return) ident(dir)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Dir.foreach( dirname \) {| filename | block } => nil + * + * Calls the block once for each entry in the named directory, passing + * the filename of each entry as a parameter to the block. + * + * Dir.foreach("testdir"\) {|x| puts "Got #{x}" } + * + * <em>produces:</em> + * + * Got . + * Got .. + * Got config.h + * Got main.rb + * + */) +directive(static) ident(VALUE) +ident(dir_foreach)operator(()ident(io)operator(,) ident(dirname)operator(\)) + ident(VALUE) ident(io)operator(,) ident(dirname)operator(;) +operator({) + ident(VALUE) ident(dir)operator(;) + + ident(dir) operator(=) ident(dir_open_dir)operator(()ident(dirname)operator(\);) + ident(rb_ensure)operator(()ident(dir_each)operator(,) ident(dir)operator(,) ident(dir_close)operator(,) ident(dir)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * Dir.entries( dirname \) => array + * + * Returns an array containing all of the filenames in the given + * directory. Will raise a <code>SystemCallError</code> if the named + * directory doesn't exist. + * + * Dir.entries("testdir"\) #=> [".", "..", "config.h", "main.rb"] + * + */) +directive(static) ident(VALUE) +ident(dir_entries)operator(()ident(io)operator(,) ident(dirname)operator(\)) + ident(VALUE) ident(io)operator(,) ident(dirname)operator(;) +operator({) + ident(VALUE) ident(dir)operator(;) + + ident(dir) operator(=) ident(dir_open_dir)operator(()ident(dirname)operator(\);) + reserved(return) ident(rb_ensure)operator(()ident(rb_Array)operator(,) ident(dir)operator(,) ident(dir_close)operator(,) ident(dir)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.fnmatch( pattern, path, [flags] \) => (true or false\) + * File.fnmatch?( pattern, path, [flags] \) => (true or false\) + * + * Returns true if <i>path</i> matches against <i>pattern</i> The + * pattern is not a regular expression; instead it follows rules + * similar to shell filename globbing. It may contain the following + * metacharacters: + * + * <code>*</code>:: Matches any file. Can be restricted by + * other values in the glob. <code>*</code> + * will match all files; <code>c*</code> will + * match all files beginning with + * <code>c</code>; <code>*c</code> will match + * all files ending with <code>c</code>; and + * <code>*c*</code> will match all files that + * have <code>c</code> in them (including at + * the beginning or end\). Equivalent to + * <code>/ .* /x</code> in regexp. + * <code>**</code>:: Matches directories recursively or files + * expansively. + * <code>?</code>:: Matches any one character. Equivalent to + * <code>/.{1}/</code> in regexp. + * <code>[set]</code>:: Matches any one character in +set+. + * Behaves exactly like character sets in + * Regexp, including set negation + * (<code>[^a-z]</code>\). + * <code>\\</code>:: Escapes the next metacharacter. + * + * <i>flags</i> is a bitwise OR of the <code>FNM_xxx</code> + * parameters. The same glob pattern and flags are used by + * <code>Dir::glob</code>. + * + * File.fnmatch('cat', 'cat'\) #=> true : match entire string + * File.fnmatch('cat', 'category'\) #=> false : only match partial string + * File.fnmatch('c{at,ub}s', 'cats'\) #=> false : { } isn't supported + * + * File.fnmatch('c?t', 'cat'\) #=> true : '?' match only 1 character + * File.fnmatch('c??t', 'cat'\) #=> false : ditto + * File.fnmatch('c*', 'cats'\) #=> true : '*' match 0 or more characters + * File.fnmatch('c*t', 'c/a/b/t'\) #=> true : ditto + * File.fnmatch('ca[a-z]', 'cat'\) #=> true : inclusive bracket expression + * File.fnmatch('ca[^t]', 'cat'\) #=> false : exclusive bracket expression ('^' or '!'\) + * + * File.fnmatch('cat', 'CAT'\) #=> false : case sensitive + * File.fnmatch('cat', 'CAT', File::FNM_CASEFOLD\) #=> true : case insensitive + * + * File.fnmatch('?', '/', File::FNM_PATHNAME\) #=> false : wildcard doesn't match '/' on FNM_PATHNAME + * File.fnmatch('*', '/', File::FNM_PATHNAME\) #=> false : ditto + * File.fnmatch('[/]', '/', File::FNM_PATHNAME\) #=> false : ditto + * + * File.fnmatch('\\?', '?'\) #=> true : escaped wildcard becomes ordinary + * File.fnmatch('\\a', 'a'\) #=> true : escaped ordinary remains ordinary + * File.fnmatch('\\a', '\\a', File::FNM_NOESCAPE\) #=> true : FNM_NOESACPE makes '\\' ordinary + * File.fnmatch('[\\?]', '?'\) #=> true : can escape inside bracket expression + * + * File.fnmatch('*', '.profile'\) #=> false : wildcard doesn't match leading + * File.fnmatch('*', '.profile', File::FNM_DOTMATCH\) #=> true period by default. + * File.fnmatch('.*', '.profile'\) #=> true + * + * rbfiles = '**' '/' '*.rb' # you don't have to do like this. just write in single string. + * File.fnmatch(rbfiles, 'main.rb'\) #=> false + * File.fnmatch(rbfiles, './main.rb'\) #=> false + * File.fnmatch(rbfiles, 'lib/song.rb'\) #=> true + * File.fnmatch('**.rb', 'main.rb'\) #=> true + * File.fnmatch('**.rb', './main.rb'\) #=> false + * File.fnmatch('**.rb', 'lib/song.rb'\) #=> true + * File.fnmatch('*', 'dave/.profile'\) #=> true + * + * pattern = '*' '/' '*' + * File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME\) #=> false + * File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME | File::FNM_DOTMATCH\) #=> true + * + * pattern = '**' '/' 'foo' + * File.fnmatch(pattern, 'a/b/c/foo', File::FNM_PATHNAME\) #=> true + * File.fnmatch(pattern, '/a/b/c/foo', File::FNM_PATHNAME\) #=> true + * File.fnmatch(pattern, 'c:/a/b/c/foo', File::FNM_PATHNAME\) #=> true + * File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME\) #=> false + * File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME | File::FNM_DOTMATCH\) #=> true + */) +directive(static) ident(VALUE) +ident(file_s_fnmatch)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(pattern)operator(,) ident(path)operator(;) + ident(VALUE) ident(rflags)operator(;) + pre_type(int) ident(flags)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(21)delimiter(")>operator(,) operator(&)ident(pattern)operator(,) operator(&)ident(path)operator(,) operator(&)ident(rflags)operator(\)) operator(==) integer(3)operator(\)) + ident(flags) operator(=) ident(NUM2INT)operator(()ident(rflags)operator(\);) + reserved(else) + ident(flags) operator(=) integer(0)operator(;) + + ident(StringValue)operator(()ident(pattern)operator(\);) + ident(StringValue)operator(()ident(path)operator(\);) + + reserved(if) operator(()ident(fnmatch)operator(()ident(RSTRING)operator(()ident(pattern)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(,) ident(flags)operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(Qtrue)operator(;) + + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * Objects of class <code>Dir</code> are directory streams representing + * directories in the underlying file system. They provide a variety of + * ways to list directories and their contents. See also + * <code>File</code>. + * + * The directory used in these examples contains the two regular files + * (<code>config.h</code> and <code>main.rb</code>\), the parent + * directory (<code>..</code>\), and the directory itself + * (<code>.</code>\). + */) +directive(void) +ident(Init_Dir)operator((\)) +operator({) + ident(rb_cDir) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Dir)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + + ident(rb_include_module)operator(()ident(rb_cDir)operator(,) ident(rb_mEnumerable)operator(\);) + + ident(rb_define_alloc_func)operator(()ident(rb_cDir)operator(,) ident(dir_s_alloc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,) string<delimiter(")content(open)delimiter(")>operator(,) ident(dir_s_open)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,) string<delimiter(")content(foreach)delimiter(")>operator(,) ident(dir_foreach)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,) string<delimiter(")content(entries)delimiter(")>operator(,) ident(dir_entries)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(initialize)delimiter(")>operator(,) ident(dir_initialize)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(path)delimiter(")>operator(,) ident(dir_path)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(read)delimiter(")>operator(,) ident(dir_read)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(each)delimiter(")>operator(,) ident(dir_each)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(rewind)delimiter(")>operator(,) ident(dir_rewind)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(tell)delimiter(")>operator(,) ident(dir_tell)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(seek)delimiter(")>operator(,) ident(dir_seek)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(pos)delimiter(")>operator(,) ident(dir_tell)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(pos=)delimiter(")>operator(,) ident(dir_set_pos)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(close)delimiter(")>operator(,) ident(dir_close)operator(,) integer(0)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(chdir)delimiter(")>operator(,) ident(dir_s_chdir)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(getwd)delimiter(")>operator(,) ident(dir_s_getwd)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(pwd)delimiter(")>operator(,) ident(dir_s_getwd)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(chroot)delimiter(")>operator(,) ident(dir_s_chroot)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(mkdir)delimiter(")>operator(,) ident(dir_s_mkdir)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(rmdir)delimiter(")>operator(,) ident(dir_s_rmdir)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(delete)delimiter(")>operator(,) ident(dir_s_rmdir)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(unlink)delimiter(")>operator(,) ident(dir_s_rmdir)operator(,) integer(1)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content(glob)delimiter(")>operator(,) ident(dir_s_glob)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cDir)operator(,)string<delimiter(")content([])delimiter(")>operator(,) ident(dir_s_aref)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,)string<delimiter(")content(fnmatch)delimiter(")>operator(,) ident(file_s_fnmatch)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,)string<delimiter(")content(fnmatch?)delimiter(")>operator(,) ident(file_s_fnmatch)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_file_const)operator(()string<delimiter(")content(FNM_NOESCAPE)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(FNM_NOESCAPE)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(FNM_PATHNAME)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(FNM_PATHNAME)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(FNM_DOTMATCH)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(FNM_DOTMATCH)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(FNM_CASEFOLD)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(FNM_CASEFOLD)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(FNM_SYSCASE)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(FNM_SYSCASE)operator(\)\);) +operator(}) +comment(/********************************************************************** + + dln.c - + + $Author: shyouhei $ + $Date: 2008-06-15 15:25:08 +0200 (Sun, 15 Jun 2008\) $ + created at: Tue Jan 18 17:05:06 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("dln.h") + +preprocessor(#ifdef) ident(HAVE_STDLIB_H) +preprocessor(# include) include(<stdlib.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__CHECKER__) +preprocessor(#undef) ident(HAVE_DLOPEN) +preprocessor(#undef) ident(USE_DLN_A_OUT) +preprocessor(#undef) ident(USE_DLN_DLOPEN) +preprocessor(#endif) + +preprocessor(#ifdef) ident(USE_DLN_A_OUT) +pre_type(char) operator(*)ident(dln_argv0)operator(;) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_ALLOCA_H)operator(\)) +preprocessor(#include) include(<alloca.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_STRING_H) +preprocessor(# include) include(<string.h>) +preprocessor(#else) +preprocessor(# include) include(<strings.h>) +preprocessor(#endif) + +preprocessor(#ifndef) ident(xmalloc) +directive(void) operator(*)ident(xmalloc)operator((\);) +directive(void) operator(*)ident(xcalloc)operator((\);) +directive(void) operator(*)ident(xrealloc)operator((\);) +preprocessor(#endif) + +preprocessor(#include) include(<stdio.h>) +preprocessor(#if) ident(defined)operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(__VMS)operator(\)) +preprocessor(#include) include("missing/file.h") +preprocessor(#endif) +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<sys/stat.h>) + +preprocessor(#ifndef) ident(S_ISDIR) +preprocessor(# define) ident(S_ISDIR)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFDIR)operator(\)) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_SYS_PARAM_H) +preprocessor(# include) include(<sys/param.h>) +preprocessor(#endif) +preprocessor(#ifndef) ident(MAXPATHLEN) +preprocessor(# define) ident(MAXPATHLEN) integer(1024) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(# include) include(<unistd.h>) +preprocessor(#endif) + +preprocessor(#ifndef) ident(_WIN32) +pre_type(char) operator(*)ident(getenv)operator((\);) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__VMS)operator(\)) +preprocessor(#pragma) ident(builtins) +preprocessor(#include) include(<dlfcn.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__MACOS__) +preprocessor(# include) include(<TextUtils.h>) +preprocessor(# include) include(<CodeFragments.h>) +preprocessor(# include) include(<Aliases.h>) +preprocessor(# include) include("macruby_private.h") +preprocessor(#endif) + +preprocessor(#ifdef) ident(__BEOS__) +preprocessor(# include) include(<image.h>) +preprocessor(#endif) + +preprocessor(#ifndef) ident(NO_DLN_LOAD) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_DLOPEN)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(USE_DLN_A_OUT)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(_AIX)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__APPLE__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(_UNICOSMP)operator(\)) +comment(/* dynamic load with dlopen(\) */) +preprocessor(# define) ident(USE_DLN_DLOPEN) +preprocessor(#endif) + +preprocessor(#ifndef) ident(FUNCNAME_PATTERN) +preprocessor(# if) ident(defined)operator(()ident(__hp9000s300)operator(\)) operator(||) operator(()ident(defined)operator(()ident(__NetBSD__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__ELF__)operator(\)\)) operator(||) ident(defined)operator(()ident(__BORLANDC__)operator(\)) operator(||) operator(()ident(defined)operator(()ident(__FreeBSD__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__ELF__)operator(\)\)) operator(||) operator(()ident(defined)operator(()ident(__OpenBSD__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__ELF__)operator(\)\)) operator(||) ident(defined)operator(()ident(NeXT)operator(\)) operator(||) ident(defined)operator(()ident(__WATCOMC__)operator(\)) operator(||) ident(defined)operator(()ident(__APPLE__)operator(\)) +preprocessor(# define) ident(FUNCNAME_PATTERN) string<delimiter(")content(_Init_%s)delimiter(")> +preprocessor(# else) +preprocessor(# define) ident(FUNCNAME_PATTERN) string<delimiter(")content(Init_%s)delimiter(")> +preprocessor(# endif) +preprocessor(#endif) + +directive(static) pre_type(int) +ident(init_funcname_len)operator(()ident(buf)operator(,) ident(file)operator(\)) + pre_type(char) operator(**)ident(buf)operator(;) + directive(const) pre_type(char) operator(*)ident(file)operator(;) +operator({) + pre_type(char) operator(*)ident(p)operator(;) + directive(const) pre_type(char) operator(*)ident(slash)operator(;) + pre_type(int) ident(len)operator(;) + + comment(/* Load the file as an object one */) + reserved(for) operator(()ident(slash) operator(=) ident(file)operator(-)integer(1)operator(;) operator(*)ident(file)operator(;) ident(file)operator(++\)) comment(/* Find position of last '/' */) +preprocessor(#ifdef) ident(__MACOS__) + reserved(if) operator((*)ident(file) operator(==) char(':')operator(\)) ident(slash) operator(=) ident(file)operator(;) +preprocessor(#else) + reserved(if) operator((*)ident(file) operator(==) char('/')operator(\)) ident(slash) operator(=) ident(file)operator(;) +preprocessor(#endif) + + ident(len) operator(=) ident(strlen)operator(()ident(FUNCNAME_PATTERN)operator(\)) operator(+) ident(strlen)operator(()ident(slash) operator(+) integer(1)operator(\);) + operator(*)ident(buf) operator(=) ident(xmalloc)operator(()ident(len)operator(\);) + ident(snprintf)operator((*)ident(buf)operator(,) ident(len)operator(,) ident(FUNCNAME_PATTERN)operator(,) ident(slash) operator(+) integer(1)operator(\);) + reserved(for) operator(()ident(p) operator(=) operator(*)ident(buf)operator(;) operator(*)ident(p)operator(;) ident(p)operator(++\)) operator({) comment(/* Delete suffix if it exists */) + reserved(if) operator((*)ident(p) operator(==) char('.')operator(\)) operator({) + operator(*)ident(p) operator(=) char('\\0')operator(;) reserved(break)operator(;) + operator(}) + operator(}) + reserved(return) ident(p) operator(-) operator(*)ident(buf)operator(;) +operator(}) + +preprocessor(#define) ident(init_funcname)operator(()ident(buf)operator(,) ident(file)operator(\)) reserved(do) operator({)\ + pre_type(int) ident(len) operator(=) ident(init_funcname_len)operator(()ident(buf)operator(,) ident(file)operator(\);)\ + pre_type(char) operator(*)ident(tmp) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(len)operator(+)integer(1)operator(\);)\ + reserved(if) operator((!)ident(tmp)operator(\)) operator({)\ + ident(free)operator((*)ident(buf)operator(\);)\ + ident(rb_memerror)operator((\);)\ + operator(})\ + ident(strcpy)operator(()ident(tmp)operator(,) operator(*)ident(buf)operator(\);)\ + ident(free)operator((*)ident(buf)operator(\);)\ + operator(*)ident(buf) operator(=) ident(tmp)operator(;)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#ifdef) ident(USE_DLN_A_OUT) + +preprocessor(#ifndef) ident(LIBC_NAME) +preprocessor(# define) ident(LIBC_NAME) string<delimiter(")content(libc.a)delimiter(")> +preprocessor(#endif) + +preprocessor(#ifndef) ident(DLN_DEFAULT_LIB_PATH) +preprocessor(# define) ident(DLN_DEFAULT_LIB_PATH) string<delimiter(")content(/lib:/usr/lib:/usr/local/lib:.)delimiter(")> +preprocessor(#endif) + +preprocessor(#include) include(<errno.h>) + +directive(static) pre_type(int) ident(dln_errno)operator(;) + +preprocessor(#define) ident(DLN_ENOEXEC) ident(ENOEXEC) comment(/* Exec format error */) +preprocessor(#define) ident(DLN_ECONFL) integer(1201) comment(/* Symbol name conflict */) +preprocessor(#define) ident(DLN_ENOINIT) integer(1202) comment(/* No initializer given */) +preprocessor(#define) ident(DLN_EUNDEF) integer(1203) comment(/* Undefine symbol remains */) +preprocessor(#define) ident(DLN_ENOTLIB) integer(1204) comment(/* Not a library file */) +preprocessor(#define) ident(DLN_EBADLIB) integer(1205) comment(/* Malformed library file */) +preprocessor(#define) ident(DLN_EINIT) integer(1206) comment(/* Not initialized */) + +directive(static) pre_type(int) ident(dln_init_p) operator(=) integer(0)operator(;) + +preprocessor(#include) include(<ar.h>) +preprocessor(#include) include(<a.out.h>) +preprocessor(#ifndef) ident(N_COMM) +preprocessor(# define) ident(N_COMM) hex(0x12) +preprocessor(#endif) +preprocessor(#ifndef) ident(N_MAGIC) +preprocessor(# define) ident(N_MAGIC)operator(()ident(x)operator(\)) operator(()ident(x)operator(\))operator(.)ident(a_magic) +preprocessor(#endif) + +preprocessor(#define) ident(INVALID_OBJECT)operator(()ident(h)operator(\)) operator(()ident(N_MAGIC)operator(()ident(h)operator(\)) operator(!=) ident(OMAGIC)operator(\)) + +preprocessor(#include) include("util.h") +preprocessor(#include) include("st.h") + +directive(static) ident(st_table) operator(*)ident(sym_tbl)operator(;) +directive(static) ident(st_table) operator(*)ident(undef_tbl)operator(;) + +directive(static) pre_type(int) ident(load_lib)operator((\);) + +directive(static) pre_type(int) +ident(load_header)operator(()ident(fd)operator(,) ident(hdrp)operator(,) ident(disp)operator(\)) + pre_type(int) ident(fd)operator(;) + reserved(struct) ident(exec) operator(*)ident(hdrp)operator(;) + pre_type(long) ident(disp)operator(;) +operator({) + pre_type(int) ident(size)operator(;) + + ident(lseek)operator(()ident(fd)operator(,) ident(disp)operator(,) integer(0)operator(\);) + ident(size) operator(=) ident(read)operator(()ident(fd)operator(,) ident(hdrp)operator(,) reserved(sizeof)operator(()reserved(struct) ident(exec)operator(\)\);) + reserved(if) operator(()ident(size) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(size) operator(!=) reserved(sizeof)operator(()reserved(struct) ident(exec)operator(\)) operator(||) ident(N_BADMAG)operator((*)ident(hdrp)operator(\)\)) operator({) + ident(dln_errno) operator(=) ident(DLN_ENOEXEC)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(sequent)operator(\)) +preprocessor(#define) ident(RELOC_SYMBOL)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_symbolnum)operator(\)) +preprocessor(#define) ident(RELOC_MEMORY_SUB_P)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_bsr)operator(\)) +preprocessor(#define) ident(RELOC_PCREL_P)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_pcrel) operator(||) operator(()ident(r)operator(\)->)ident(r_bsr)operator(\)) +preprocessor(#define) ident(RELOC_TARGET_SIZE)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_length)operator(\)) +preprocessor(#endif) + +comment(/* Default macros */) +preprocessor(#ifndef) ident(RELOC_ADDRESS) +preprocessor(#define) ident(RELOC_ADDRESS)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_address)operator(\)) +preprocessor(#define) ident(RELOC_EXTERN_P)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_extern)operator(\)) +preprocessor(#define) ident(RELOC_SYMBOL)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_symbolnum)operator(\)) +preprocessor(#define) ident(RELOC_MEMORY_SUB_P)operator(()ident(r)operator(\)) integer(0) +preprocessor(#define) ident(RELOC_PCREL_P)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_pcrel)operator(\)) +preprocessor(#define) ident(RELOC_TARGET_SIZE)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_length)operator(\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) operator(&&) ident(defined)operator(()ident(sparc)operator(\)) +comment(/* Sparc (Sun 4\) macros */) +preprocessor(# undef) ident(relocation_info) +preprocessor(# define) ident(relocation_info) ident(reloc_info_sparc) +preprocessor(# define) ident(R_RIGHTSHIFT)operator(()ident(r)operator(\)) operator(()ident(reloc_r_rightshift)operator([()ident(r)operator(\)->)ident(r_type)operator(]\)) +preprocessor(# define) ident(R_BITSIZE)operator(()ident(r)operator(\)) operator(()ident(reloc_r_bitsize)operator([()ident(r)operator(\)->)ident(r_type)operator(]\)) +preprocessor(# define) ident(R_LENGTH)operator(()ident(r)operator(\)) operator(()ident(reloc_r_length)operator([()ident(r)operator(\)->)ident(r_type)operator(]\)) +directive(static) pre_type(int) ident(reloc_r_rightshift)operator([]) operator(=) operator({) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(2)operator(,) integer(2)operator(,) integer(10)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) +operator(};) +directive(static) pre_type(int) ident(reloc_r_bitsize)operator([]) operator(=) operator({) + integer(8)operator(,) integer(16)operator(,) integer(32)operator(,) integer(8)operator(,) integer(16)operator(,) integer(32)operator(,) integer(30)operator(,) integer(22)operator(,) integer(22)operator(,) integer(22)operator(,) integer(13)operator(,) integer(10)operator(,) integer(32)operator(,) integer(32)operator(,) integer(16)operator(,) +operator(};) +directive(static) pre_type(int) ident(reloc_r_length)operator([]) operator(=) operator({) + integer(0)operator(,) integer(1)operator(,) integer(2)operator(,) integer(0)operator(,) integer(1)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) +operator(};) +preprocessor(# define) ident(R_PCREL)operator(()ident(r)operator(\)) \ + operator((()ident(r)operator(\)->)ident(r_type) operator(>=) ident(RELOC_DISP8) operator(&&) operator(()ident(r)operator(\)->)ident(r_type) operator(<=) ident(RELOC_WDISP22)operator(\)) +preprocessor(# define) ident(R_SYMBOL)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_index)operator(\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(sequent)operator(\)) +preprocessor(#define) ident(R_SYMBOL)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_symbolnum)operator(\)) +preprocessor(#define) ident(R_MEMORY_SUB)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_bsr)operator(\)) +preprocessor(#define) ident(R_PCREL)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_pcrel) operator(||) operator(()ident(r)operator(\)->)ident(r_bsr)operator(\)) +preprocessor(#define) ident(R_LENGTH)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_length)operator(\)) +preprocessor(#endif) + +preprocessor(#ifndef) ident(R_SYMBOL) +preprocessor(# define) ident(R_SYMBOL)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_symbolnum)operator(\)) +preprocessor(# define) ident(R_MEMORY_SUB)operator(()ident(r)operator(\)) integer(0) +preprocessor(# define) ident(R_PCREL)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_pcrel)operator(\)) +preprocessor(# define) ident(R_LENGTH)operator(()ident(r)operator(\)) operator((()ident(r)operator(\)->)ident(r_length)operator(\)) +preprocessor(#endif) + +directive(static) reserved(struct) ident(relocation_info) operator(*) +ident(load_reloc)operator(()ident(fd)operator(,) ident(hdrp)operator(,) ident(disp)operator(\)) + pre_type(int) ident(fd)operator(;) + reserved(struct) ident(exec) operator(*)ident(hdrp)operator(;) + pre_type(long) ident(disp)operator(;) +operator({) + reserved(struct) ident(relocation_info) operator(*)ident(reloc)operator(;) + pre_type(int) ident(size)operator(;) + + ident(lseek)operator(()ident(fd)operator(,) ident(disp) operator(+) ident(N_TXTOFF)operator((*)ident(hdrp)operator(\)) operator(+) ident(hdrp)operator(->)ident(a_text) operator(+) ident(hdrp)operator(->)ident(a_data)operator(,) integer(0)operator(\);) + ident(size) operator(=) ident(hdrp)operator(->)ident(a_trsize) operator(+) ident(hdrp)operator(->)ident(a_drsize)operator(;) + ident(reloc) operator(=) operator(()reserved(struct) ident(relocation_info)operator(*\))ident(xmalloc)operator(()ident(size)operator(\);) + reserved(if) operator(()ident(reloc) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + reserved(return) pre_constant(NULL)operator(;) + operator(}) + + reserved(if) operator(()ident(read)operator(()ident(fd)operator(,) ident(reloc)operator(,) ident(size)operator(\)) operator(!=) ident(size)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + ident(free)operator(()ident(reloc)operator(\);) + reserved(return) pre_constant(NULL)operator(;) + operator(}) + + reserved(return) ident(reloc)operator(;) +operator(}) + +directive(static) reserved(struct) ident(nlist) operator(*) +ident(load_sym)operator(()ident(fd)operator(,) ident(hdrp)operator(,) ident(disp)operator(\)) + pre_type(int) ident(fd)operator(;) + reserved(struct) ident(exec) operator(*)ident(hdrp)operator(;) + pre_type(long) ident(disp)operator(;) +operator({) + reserved(struct) ident(nlist) operator(*) ident(buffer)operator(;) + reserved(struct) ident(nlist) operator(*) ident(sym)operator(;) + reserved(struct) ident(nlist) operator(*) ident(end)operator(;) + pre_type(long) ident(displ)operator(;) + pre_type(int) ident(size)operator(;) + + ident(lseek)operator(()ident(fd)operator(,) ident(N_SYMOFF)operator((*)ident(hdrp)operator(\)) operator(+) ident(hdrp)operator(->)ident(a_syms) operator(+) ident(disp)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(read)operator(()ident(fd)operator(,) operator(&)ident(size)operator(,) reserved(sizeof)operator(()pre_type(int)operator(\)\)) operator(!=) reserved(sizeof)operator(()pre_type(int)operator(\)\)) operator({) + reserved(goto) ident(err_noexec)operator(;) + operator(}) + + ident(buffer) operator(=) operator(()reserved(struct) ident(nlist)operator(*\))ident(xmalloc)operator(()ident(hdrp)operator(->)ident(a_syms) operator(+) ident(size)operator(\);) + reserved(if) operator(()ident(buffer) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + reserved(return) pre_constant(NULL)operator(;) + operator(}) + + ident(lseek)operator(()ident(fd)operator(,) ident(disp) operator(+) ident(N_SYMOFF)operator((*)ident(hdrp)operator(\),) integer(0)operator(\);) + reserved(if) operator(()ident(read)operator(()ident(fd)operator(,) ident(buffer)operator(,) ident(hdrp)operator(->)ident(a_syms) operator(+) ident(size)operator(\)) operator(!=) ident(hdrp)operator(->)ident(a_syms) operator(+) ident(size)operator(\)) operator({) + ident(free)operator(()ident(buffer)operator(\);) + reserved(goto) ident(err_noexec)operator(;) + operator(}) + + ident(sym) operator(=) ident(buffer)operator(;) + ident(end) operator(=) ident(sym) operator(+) ident(hdrp)operator(->)ident(a_syms) operator(/) reserved(sizeof)operator(()reserved(struct) ident(nlist)operator(\);) + ident(displ) operator(=) operator(()pre_type(long)operator(\))ident(buffer) operator(+) operator(()pre_type(long)operator(\)()ident(hdrp)operator(->)ident(a_syms)operator(\);) + + reserved(while) operator(()ident(sym) operator(<) ident(end)operator(\)) operator({) + ident(sym)operator(->)ident(n_un)operator(.)ident(n_name) operator(=) operator(()pre_type(char)operator(*\))ident(sym)operator(->)ident(n_un)operator(.)ident(n_strx) operator(+) ident(displ)operator(;) + ident(sym)operator(++;) + operator(}) + reserved(return) ident(buffer)operator(;) + + label(err_noexec)operator(:) + ident(dln_errno) operator(=) ident(DLN_ENOEXEC)operator(;) + reserved(return) pre_constant(NULL)operator(;) +operator(}) + +directive(static) ident(st_table) operator(*) +ident(sym_hash)operator(()ident(hdrp)operator(,) ident(syms)operator(\)) + reserved(struct) ident(exec) operator(*)ident(hdrp)operator(;) + reserved(struct) ident(nlist) operator(*)ident(syms)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + reserved(struct) ident(nlist) operator(*)ident(sym) operator(=) ident(syms)operator(;) + reserved(struct) ident(nlist) operator(*)ident(end) operator(=) ident(syms) operator(+) operator(()ident(hdrp)operator(->)ident(a_syms) operator(/) reserved(sizeof)operator(()reserved(struct) ident(nlist)operator(\)\);) + + ident(tbl) operator(=) ident(st_init_strtable)operator((\);) + reserved(if) operator(()ident(tbl) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + reserved(return) pre_constant(NULL)operator(;) + operator(}) + + reserved(while) operator(()ident(sym) operator(<) ident(end)operator(\)) operator({) + ident(st_insert)operator(()ident(tbl)operator(,) ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(,) ident(sym)operator(\);) + ident(sym)operator(++;) + operator(}) + reserved(return) ident(tbl)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(dln_init)operator(()ident(prog)operator(\)) + directive(const) pre_type(char) operator(*)ident(prog)operator(;) +operator({) + pre_type(char) operator(*)ident(file)operator(;) + pre_type(int) ident(fd)operator(;) + reserved(struct) ident(exec) ident(hdr)operator(;) + reserved(struct) ident(nlist) operator(*)ident(syms)operator(;) + + reserved(if) operator(()ident(dln_init_p) operator(==) integer(1)operator(\)) reserved(return) integer(0)operator(;) + + ident(file) operator(=) ident(dln_find_exe)operator(()ident(prog)operator(,) pre_constant(NULL)operator(\);) + reserved(if) operator(()ident(file) operator(==) pre_constant(NULL) operator(||) operator(()ident(fd) operator(=) ident(open)operator(()ident(file)operator(,) ident(O_RDONLY)operator(\)\)) operator(<) integer(0)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + + reserved(if) operator(()ident(load_header)operator(()ident(fd)operator(,) operator(&)ident(hdr)operator(,) integer(0)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(return) operator(-)integer(1)operator(;) + ident(syms) operator(=) ident(load_sym)operator(()ident(fd)operator(,) operator(&)ident(hdr)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(syms) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(close)operator(()ident(fd)operator(\);) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + ident(sym_tbl) operator(=) ident(sym_hash)operator((&)ident(hdr)operator(,) ident(syms)operator(\);) + reserved(if) operator(()ident(sym_tbl) operator(==) pre_constant(NULL)operator(\)) operator({) comment(/* file may be start with #! */) + pre_type(char) ident(c) operator(=) char('\\0')operator(;) + pre_type(char) ident(buf)operator([)ident(MAXPATHLEN)operator(];) + pre_type(char) operator(*)ident(p)operator(;) + + ident(free)operator(()ident(syms)operator(\);) + ident(lseek)operator(()ident(fd)operator(,) integer(0L)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(read)operator(()ident(fd)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(!=) char('#')operator(\)) reserved(goto) ident(err_noexec)operator(;) + reserved(if) operator(()ident(read)operator(()ident(fd)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(!=) char('!')operator(\)) reserved(goto) ident(err_noexec)operator(;) + + ident(p) operator(=) ident(buf)operator(;) + comment(/* skip forwarding spaces */) + reserved(while) operator(()ident(read)operator(()ident(fd)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\)) operator(==) integer(1)operator(\)) operator({) + reserved(if) operator(()ident(c) operator(==) char('\\n')operator(\)) reserved(goto) ident(err_noexec)operator(;) + reserved(if) operator(()ident(c) operator(!=) char('\\t') operator(&&) ident(c) operator(!=) char(' ')operator(\)) operator({) + operator(*)ident(p)operator(++) operator(=) ident(c)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + comment(/* read in command name */) + reserved(while) operator(()ident(read)operator(()ident(fd)operator(,) ident(p)operator(,) integer(1)operator(\)) operator(==) integer(1)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('\\n') operator(||) operator(*)ident(p) operator(==) char('\\t') operator(||) operator(*)ident(p) operator(==) char(' ')operator(\)) reserved(break)operator(;) + ident(p)operator(++;) + reserved(if) operator(()ident(p)operator(-)ident(buf) operator(>=) ident(MAXPATHLEN)operator(\)) operator({) + ident(dln_errno) operator(=) ident(ENAMETOOLONG)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + operator(}) + operator(*)ident(p) operator(=) char('\\0')operator(;) + + reserved(return) ident(dln_init)operator(()ident(buf)operator(\);) + operator(}) + ident(dln_init_p) operator(=) integer(1)operator(;) + ident(undef_tbl) operator(=) ident(st_init_strtable)operator((\);) + ident(close)operator(()ident(fd)operator(\);) + reserved(return) integer(0)operator(;) + + label(err_noexec)operator(:) + ident(close)operator(()ident(fd)operator(\);) + ident(dln_errno) operator(=) ident(DLN_ENOEXEC)operator(;) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +directive(static) pre_type(long) +ident(load_text_data)operator(()ident(fd)operator(,) ident(hdrp)operator(,) ident(bss)operator(,) ident(disp)operator(\)) + pre_type(int) ident(fd)operator(;) + reserved(struct) ident(exec) operator(*)ident(hdrp)operator(;) + pre_type(int) ident(bss)operator(;) + pre_type(long) ident(disp)operator(;) +operator({) + pre_type(int) ident(size)operator(;) + pre_type(unsigned) pre_type(char)operator(*) ident(addr)operator(;) + + ident(lseek)operator(()ident(fd)operator(,) ident(disp) operator(+) ident(N_TXTOFF)operator((*)ident(hdrp)operator(\),) integer(0)operator(\);) + ident(size) operator(=) ident(hdrp)operator(->)ident(a_text) operator(+) ident(hdrp)operator(->)ident(a_data)operator(;) + + reserved(if) operator(()ident(bss) operator(==) operator(-)integer(1)operator(\)) ident(size) operator(+=) ident(hdrp)operator(->)ident(a_bss)operator(;) + reserved(else) reserved(if) operator(()ident(bss) operator(>) integer(1)operator(\)) ident(size) operator(+=) ident(bss)operator(;) + + ident(addr) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(xmalloc)operator(()ident(size)operator(\);) + reserved(if) operator(()ident(addr) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + reserved(return) integer(0)operator(;) + operator(}) + + reserved(if) operator(()ident(read)operator(()ident(fd)operator(,) ident(addr)operator(,) ident(size)operator(\)) operator(!=) ident(size)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + ident(free)operator(()ident(addr)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + + reserved(if) operator(()ident(bss) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(memset)operator(()ident(addr) operator(+) ident(hdrp)operator(->)ident(a_text) operator(+) ident(hdrp)operator(->)ident(a_data)operator(,) integer(0)operator(,) ident(hdrp)operator(->)ident(a_bss)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(bss) operator(>) integer(0)operator(\)) operator({) + ident(memset)operator(()ident(addr) operator(+) ident(hdrp)operator(->)ident(a_text) operator(+) ident(hdrp)operator(->)ident(a_data)operator(,) integer(0)operator(,) ident(bss)operator(\);) + operator(}) + + reserved(return) operator(()pre_type(long)operator(\))ident(addr)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(undef_print)operator(()ident(key)operator(,) ident(value)operator(\)) + pre_type(char) operator(*)ident(key)operator(,) operator(*)ident(value)operator(;) +operator({) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content( %s)char(\\n)delimiter(")>operator(,) ident(key)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) directive(void) +ident(dln_print_undef)operator((\)) +operator({) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content( Undefined symbols:)char(\\n)delimiter(")>operator(\);) + ident(st_foreach)operator(()ident(undef_tbl)operator(,) ident(undef_print)operator(,) pre_constant(NULL)operator(\);) +operator(}) + +directive(static) directive(void) +ident(dln_undefined)operator((\)) +operator({) + reserved(if) operator(()ident(undef_tbl)operator(->)ident(num_entries) operator(>) integer(0)operator(\)) operator({) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content(dln: Calling undefined function)char(\\n)delimiter(")>operator(\);) + ident(dln_print_undef)operator((\);) + ident(rb_exit)operator(()integer(1)operator(\);) + operator(}) +operator(}) + +reserved(struct) ident(undef) operator({) + pre_type(char) operator(*)ident(name)operator(;) + reserved(struct) ident(relocation_info) ident(reloc)operator(;) + pre_type(long) ident(base)operator(;) + pre_type(char) operator(*)ident(addr)operator(;) + reserved(union) operator({) + pre_type(char) ident(c)operator(;) + pre_type(short) ident(s)operator(;) + pre_type(long) ident(l)operator(;) + operator(}) ident(u)operator(;) +operator(};) + +directive(static) ident(st_table) operator(*)ident(reloc_tbl) operator(=) pre_constant(NULL)operator(;) +directive(static) directive(void) +ident(link_undef)operator(()ident(name)operator(,) ident(base)operator(,) ident(reloc)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + pre_type(long) ident(base)operator(;) + reserved(struct) ident(relocation_info) operator(*)ident(reloc)operator(;) +operator({) + directive(static) pre_type(int) ident(u_no) operator(=) integer(0)operator(;) + reserved(struct) ident(undef) operator(*)ident(obj)operator(;) + pre_type(char) operator(*)ident(addr) operator(=) operator(()pre_type(char)operator(*\)()ident(reloc)operator(->)ident(r_address) operator(+) ident(base)operator(\);) + + ident(obj) operator(=) operator(()reserved(struct) ident(undef)operator(*\))ident(xmalloc)operator(()reserved(sizeof)operator(()reserved(struct) ident(undef)operator(\)\);) + ident(obj)operator(->)ident(name) operator(=) ident(strdup)operator(()ident(name)operator(\);) + ident(obj)operator(->)ident(reloc) operator(=) operator(*)ident(reloc)operator(;) + ident(obj)operator(->)ident(base) operator(=) ident(base)operator(;) + reserved(switch) operator(()ident(R_LENGTH)operator(()ident(reloc)operator(\)\)) operator({) + reserved(case) integer(0)operator(:) comment(/* byte */) + ident(obj)operator(->)ident(u)operator(.)ident(c) operator(=) operator(*)ident(addr)operator(;) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) comment(/* word */) + ident(obj)operator(->)ident(u)operator(.)ident(s) operator(=) operator(*()pre_type(short)operator(*\))ident(addr)operator(;) + reserved(break)operator(;) + reserved(case) integer(2)operator(:) comment(/* long */) + ident(obj)operator(->)ident(u)operator(.)ident(l) operator(=) operator(*()pre_type(long)operator(*\))ident(addr)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(reloc_tbl) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(reloc_tbl) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + ident(st_insert)operator(()ident(reloc_tbl)operator(,) ident(u_no)operator(++,) ident(obj)operator(\);) +operator(}) + +reserved(struct) ident(reloc_arg) operator({) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + pre_type(long) ident(value)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(reloc_undef)operator(()ident(no)operator(,) ident(undef)operator(,) ident(arg)operator(\)) + pre_type(int) ident(no)operator(;) + reserved(struct) ident(undef) operator(*)ident(undef)operator(;) + reserved(struct) ident(reloc_arg) operator(*)ident(arg)operator(;) +operator({) + pre_type(int) ident(datum)operator(;) + pre_type(char) operator(*)ident(address)operator(;) +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) operator(&&) ident(defined)operator(()ident(sparc)operator(\)) + pre_type(unsigned) pre_type(int) ident(mask) operator(=) integer(0)operator(;) +preprocessor(#endif) + + reserved(if) operator(()ident(strcmp)operator(()ident(arg)operator(->)ident(name)operator(,) ident(undef)operator(->)ident(name)operator(\)) operator(!=) integer(0)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(address) operator(=) operator(()pre_type(char)operator(*\)()ident(undef)operator(->)ident(base) operator(+) ident(undef)operator(->)ident(reloc)operator(.)ident(r_address)operator(\);) + ident(datum) operator(=) ident(arg)operator(->)ident(value)operator(;) + + reserved(if) operator(()ident(R_PCREL)operator((&()ident(undef)operator(->)ident(reloc)operator(\)\)\)) ident(datum) operator(-=) ident(undef)operator(->)ident(base)operator(;) +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) operator(&&) ident(defined)operator(()ident(sparc)operator(\)) + ident(datum) operator(+=) ident(undef)operator(->)ident(reloc)operator(.)ident(r_addend)operator(;) + ident(datum) operator(>>=) ident(R_RIGHTSHIFT)operator((&()ident(undef)operator(->)ident(reloc)operator(\)\);) + ident(mask) operator(=) operator(()integer(1) operator(<<) ident(R_BITSIZE)operator((&()ident(undef)operator(->)ident(reloc)operator(\)\)\)) operator(-) integer(1)operator(;) + ident(mask) operator(|=) ident(mask) operator(-)integer(1)operator(;) + ident(datum) operator(&=) ident(mask)operator(;) + reserved(switch) operator(()ident(R_LENGTH)operator((&()ident(undef)operator(->)ident(reloc)operator(\)\)\)) operator({) + reserved(case) integer(0)operator(:) + operator(*)ident(address) operator(=) ident(undef)operator(->)ident(u)operator(.)ident(c)operator(;) + operator(*)ident(address) operator(&=) operator(~)ident(mask)operator(;) + operator(*)ident(address) operator(|=) ident(datum)operator(;) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) + operator(*()pre_type(short) operator(*\))ident(address) operator(=) ident(undef)operator(->)ident(u)operator(.)ident(s)operator(;) + operator(*()pre_type(short) operator(*\))ident(address) operator(&=) operator(~)ident(mask)operator(;) + operator(*()pre_type(short) operator(*\))ident(address) operator(|=) ident(datum)operator(;) + reserved(break)operator(;) + reserved(case) integer(2)operator(:) + operator(*()pre_type(long) operator(*\))ident(address) operator(=) ident(undef)operator(->)ident(u)operator(.)ident(l)operator(;) + operator(*()pre_type(long) operator(*\))ident(address) operator(&=) operator(~)ident(mask)operator(;) + operator(*()pre_type(long) operator(*\))ident(address) operator(|=) ident(datum)operator(;) + reserved(break)operator(;) + operator(}) +preprocessor(#else) + reserved(switch) operator(()ident(R_LENGTH)operator((&()ident(undef)operator(->)ident(reloc)operator(\)\)\)) operator({) + reserved(case) integer(0)operator(:) comment(/* byte */) + reserved(if) operator(()ident(R_MEMORY_SUB)operator((&()ident(undef)operator(->)ident(reloc)operator(\)\)\)) + operator(*)ident(address) operator(=) ident(datum) operator(-) operator(*)ident(address)operator(;) + reserved(else) operator(*)ident(address) operator(=) ident(undef)operator(->)ident(u)operator(.)ident(c) operator(+) ident(datum)operator(;) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) comment(/* word */) + reserved(if) operator(()ident(R_MEMORY_SUB)operator((&()ident(undef)operator(->)ident(reloc)operator(\)\)\)) + operator(*()pre_type(short)operator(*\))ident(address) operator(=) ident(datum) operator(-) operator(*()pre_type(short)operator(*\))ident(address)operator(;) + reserved(else) operator(*()pre_type(short)operator(*\))ident(address) operator(=) ident(undef)operator(->)ident(u)operator(.)ident(s) operator(+) ident(datum)operator(;) + reserved(break)operator(;) + reserved(case) integer(2)operator(:) comment(/* long */) + reserved(if) operator(()ident(R_MEMORY_SUB)operator((&()ident(undef)operator(->)ident(reloc)operator(\)\)\)) + operator(*()pre_type(long)operator(*\))ident(address) operator(=) ident(datum) operator(-) operator(*()pre_type(long)operator(*\))ident(address)operator(;) + reserved(else) operator(*()pre_type(long)operator(*\))ident(address) operator(=) ident(undef)operator(->)ident(u)operator(.)ident(l) operator(+) ident(datum)operator(;) + reserved(break)operator(;) + operator(}) +preprocessor(#endif) + ident(free)operator(()ident(undef)operator(->)ident(name)operator(\);) + ident(free)operator(()ident(undef)operator(\);) + reserved(return) ident(ST_DELETE)operator(;) +operator(}) + +directive(static) directive(void) +ident(unlink_undef)operator(()ident(name)operator(,) ident(value)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + pre_type(long) ident(value)operator(;) +operator({) + reserved(struct) ident(reloc_arg) ident(arg)operator(;) + + ident(arg)operator(.)ident(name) operator(=) ident(name)operator(;) + ident(arg)operator(.)ident(value) operator(=) ident(value)operator(;) + ident(st_foreach)operator(()ident(reloc_tbl)operator(,) ident(reloc_undef)operator(,) operator(&)ident(arg)operator(\);) +operator(}) + +preprocessor(#ifdef) ident(N_INDR) +reserved(struct) ident(indr_data) operator({) + pre_type(char) operator(*)ident(name0)operator(,) operator(*)ident(name1)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(reloc_repl)operator(()ident(no)operator(,) ident(undef)operator(,) ident(data)operator(\)) + pre_type(int) ident(no)operator(;) + reserved(struct) ident(undef) operator(*)ident(undef)operator(;) + reserved(struct) ident(indr_data) operator(*)ident(data)operator(;) +operator({) + reserved(if) operator(()ident(strcmp)operator(()ident(data)operator(->)ident(name0)operator(,) ident(undef)operator(->)ident(name)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(free)operator(()ident(undef)operator(->)ident(name)operator(\);) + ident(undef)operator(->)ident(name) operator(=) ident(strdup)operator(()ident(data)operator(->)ident(name1)operator(\);) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) +preprocessor(#endif) + +directive(static) pre_type(int) +ident(load_1)operator(()ident(fd)operator(,) ident(disp)operator(,) ident(need_init)operator(\)) + pre_type(int) ident(fd)operator(;) + pre_type(long) ident(disp)operator(;) + directive(const) pre_type(char) operator(*)ident(need_init)operator(;) +operator({) + directive(static) pre_type(char) operator(*)ident(libc) operator(=) ident(LIBC_NAME)operator(;) + reserved(struct) ident(exec) ident(hdr)operator(;) + reserved(struct) ident(relocation_info) operator(*)ident(reloc) operator(=) pre_constant(NULL)operator(;) + pre_type(long) ident(block) operator(=) integer(0)operator(;) + pre_type(long) ident(new_common) operator(=) integer(0)operator(;) comment(/* Length of new common */) + reserved(struct) ident(nlist) operator(*)ident(syms) operator(=) pre_constant(NULL)operator(;) + reserved(struct) ident(nlist) operator(*)ident(sym)operator(;) + reserved(struct) ident(nlist) operator(*)ident(end)operator(;) + pre_type(int) ident(init_p) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(load_header)operator(()ident(fd)operator(,) operator(&)ident(hdr)operator(,) ident(disp)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator(()ident(INVALID_OBJECT)operator(()ident(hdr)operator(\)\)) operator({) + ident(dln_errno) operator(=) ident(DLN_ENOEXEC)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + ident(reloc) operator(=) ident(load_reloc)operator(()ident(fd)operator(,) operator(&)ident(hdr)operator(,) ident(disp)operator(\);) + reserved(if) operator(()ident(reloc) operator(==) pre_constant(NULL)operator(\)) reserved(return) operator(-)integer(1)operator(;) + + ident(syms) operator(=) ident(load_sym)operator(()ident(fd)operator(,) operator(&)ident(hdr)operator(,) ident(disp)operator(\);) + reserved(if) operator(()ident(syms) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(free)operator(()ident(reloc)operator(\);) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + + ident(sym) operator(=) ident(syms)operator(;) + ident(end) operator(=) ident(syms) operator(+) operator(()ident(hdr)operator(.)ident(a_syms) operator(/) reserved(sizeof)operator(()reserved(struct) ident(nlist)operator(\)\);) + reserved(while) operator(()ident(sym) operator(<) ident(end)operator(\)) operator({) + reserved(struct) ident(nlist) operator(*)ident(old_sym)operator(;) + pre_type(int) ident(value) operator(=) ident(sym)operator(->)ident(n_value)operator(;) + +preprocessor(#ifdef) ident(N_INDR) + reserved(if) operator(()ident(sym)operator(->)ident(n_type) operator(==) operator(()ident(N_INDR) operator(|) ident(N_EXT)operator(\)\)) operator({) + pre_type(char) operator(*)ident(key) operator(=) ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(sym_tbl)operator(,) ident(sym)operator([)integer(1)operator(])operator(.)ident(n_un)operator(.)ident(n_name)operator(,) operator(&)ident(old_sym)operator(\)\)) operator({) + reserved(if) operator(()ident(st_delete)operator(()ident(undef_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(key)operator(,) pre_constant(NULL)operator(\)\)) operator({) + ident(unlink_undef)operator(()ident(key)operator(,) ident(old_sym)operator(->)ident(n_value)operator(\);) + ident(free)operator(()ident(key)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + reserved(struct) ident(indr_data) ident(data)operator(;) + + ident(data)operator(.)ident(name0) operator(=) ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(;) + ident(data)operator(.)ident(name1) operator(=) ident(sym)operator([)integer(1)operator(])operator(.)ident(n_un)operator(.)ident(n_name)operator(;) + ident(st_foreach)operator(()ident(reloc_tbl)operator(,) ident(reloc_repl)operator(,) operator(&)ident(data)operator(\);) + + ident(st_insert)operator(()ident(undef_tbl)operator(,) ident(strdup)operator(()ident(sym)operator([)integer(1)operator(])operator(.)ident(n_un)operator(.)ident(n_name)operator(\),) pre_constant(NULL)operator(\);) + reserved(if) operator(()ident(st_delete)operator(()ident(undef_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(key)operator(,) pre_constant(NULL)operator(\)\)) operator({) + ident(free)operator(()ident(key)operator(\);) + operator(}) + operator(}) + ident(sym) operator(+=) integer(2)operator(;) + reserved(continue)operator(;) + operator(}) +preprocessor(#endif) + reserved(if) operator(()ident(sym)operator(->)ident(n_type) operator(==) operator(()ident(N_UNDF) operator(|) ident(N_EXT)operator(\)\)) operator({) + reserved(if) operator(()ident(st_lookup)operator(()ident(sym_tbl)operator(,) ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(,) operator(&)ident(old_sym)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(old_sym) operator(=) pre_constant(NULL)operator(;) + operator(}) + + reserved(if) operator(()ident(value)operator(\)) operator({) + reserved(if) operator(()ident(old_sym)operator(\)) operator({) + ident(sym)operator(->)ident(n_type) operator(=) ident(N_EXT) operator(|) ident(N_COMM)operator(;) + ident(sym)operator(->)ident(n_value) operator(=) ident(old_sym)operator(->)ident(n_value)operator(;) + operator(}) + reserved(else) operator({) + pre_type(int) ident(rnd) operator(=) + ident(value) operator(>=) reserved(sizeof)operator(()pre_type(double)operator(\)) operator(?) reserved(sizeof)operator(()pre_type(double)operator(\)) operator(-) integer(1) + operator(:) ident(value) operator(>=) reserved(sizeof)operator(()pre_type(long)operator(\)) operator(?) reserved(sizeof)operator(()pre_type(long)operator(\)) operator(-) integer(1) + operator(:) reserved(sizeof)operator(()pre_type(short)operator(\)) operator(-) integer(1)operator(;) + + ident(sym)operator(->)ident(n_type) operator(=) ident(N_COMM)operator(;) + ident(new_common) operator(+=) ident(rnd)operator(;) + ident(new_common) operator(&=) operator(~()pre_type(long)operator(\))ident(rnd)operator(;) + ident(sym)operator(->)ident(n_value) operator(=) ident(new_common)operator(;) + ident(new_common) operator(+=) ident(value)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(old_sym)operator(\)) operator({) + ident(sym)operator(->)ident(n_type) operator(=) ident(N_EXT) operator(|) ident(N_COMM)operator(;) + ident(sym)operator(->)ident(n_value) operator(=) ident(old_sym)operator(->)ident(n_value)operator(;) + operator(}) + reserved(else) operator({) + ident(sym)operator(->)ident(n_value) operator(=) operator(()pre_type(long)operator(\))ident(dln_undefined)operator(;) + ident(st_insert)operator(()ident(undef_tbl)operator(,) ident(strdup)operator(()ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(\),) pre_constant(NULL)operator(\);) + operator(}) + operator(}) + operator(}) + ident(sym)operator(++;) + operator(}) + + ident(block) operator(=) ident(load_text_data)operator(()ident(fd)operator(,) operator(&)ident(hdr)operator(,) ident(hdr)operator(.)ident(a_bss) operator(+) ident(new_common)operator(,) ident(disp)operator(\);) + reserved(if) operator(()ident(block) operator(==) integer(0)operator(\)) reserved(goto) ident(err_exit)operator(;) + + ident(sym) operator(=) ident(syms)operator(;) + reserved(while) operator(()ident(sym) operator(<) ident(end)operator(\)) operator({) + reserved(struct) ident(nlist) operator(*)ident(new_sym)operator(;) + pre_type(char) operator(*)ident(key)operator(;) + + reserved(switch) operator(()ident(sym)operator(->)ident(n_type)operator(\)) operator({) + reserved(case) label(N_COMM)operator(:) + ident(sym)operator(->)ident(n_value) operator(+=) ident(hdr)operator(.)ident(a_text) operator(+) ident(hdr)operator(.)ident(a_data)operator(;) + reserved(case) ident(N_TEXT)operator(|)label(N_EXT)operator(:) + reserved(case) ident(N_DATA)operator(|)label(N_EXT)operator(:) + + ident(sym)operator(->)ident(n_value) operator(+=) ident(block)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(sym_tbl)operator(,) ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(,) operator(&)ident(new_sym)operator(\)) operator(!=) integer(0) + operator(&&) ident(new_sym)operator(->)ident(n_value) operator(!=) operator(()pre_type(long)operator(\))ident(dln_undefined)operator(\)) operator({) + ident(dln_errno) operator(=) ident(DLN_ECONFL)operator(;) + reserved(goto) ident(err_exit)operator(;) + operator(}) + + ident(key) operator(=) ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(;) + reserved(if) operator(()ident(st_delete)operator(()ident(undef_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(key)operator(,) pre_constant(NULL)operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(unlink_undef)operator(()ident(key)operator(,) ident(sym)operator(->)ident(n_value)operator(\);) + ident(free)operator(()ident(key)operator(\);) + operator(}) + + ident(new_sym) operator(=) operator(()reserved(struct) ident(nlist)operator(*\))ident(xmalloc)operator(()reserved(sizeof)operator(()reserved(struct) ident(nlist)operator(\)\);) + operator(*)ident(new_sym) operator(=) operator(*)ident(sym)operator(;) + ident(new_sym)operator(->)ident(n_un)operator(.)ident(n_name) operator(=) ident(strdup)operator(()ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(\);) + ident(st_insert)operator(()ident(sym_tbl)operator(,) ident(new_sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(,) ident(new_sym)operator(\);) + reserved(break)operator(;) + + reserved(case) label(N_TEXT)operator(:) + reserved(case) label(N_DATA)operator(:) + ident(sym)operator(->)ident(n_value) operator(+=) ident(block)operator(;) + reserved(break)operator(;) + operator(}) + ident(sym)operator(++;) + operator(}) + + comment(/* + * First comes the text-relocation + */) + operator({) + reserved(struct) ident(relocation_info) operator(*) ident(rel) operator(=) ident(reloc)operator(;) + reserved(struct) ident(relocation_info) operator(*) ident(rel_beg) operator(=) ident(reloc) operator(+) + operator(()ident(hdr)operator(.)ident(a_trsize)operator(/)reserved(sizeof)operator(()reserved(struct) ident(relocation_info)operator(\)\);) + reserved(struct) ident(relocation_info) operator(*) ident(rel_end) operator(=) ident(reloc) operator(+) + operator(()ident(hdr)operator(.)ident(a_trsize)operator(+)ident(hdr)operator(.)ident(a_drsize)operator(\))operator(/)reserved(sizeof)operator(()reserved(struct) ident(relocation_info)operator(\);) + + reserved(while) operator(()ident(rel) operator(<) ident(rel_end)operator(\)) operator({) + pre_type(char) operator(*)ident(address) operator(=) operator(()pre_type(char)operator(*\)()ident(rel)operator(->)ident(r_address) operator(+) ident(block)operator(\);) + pre_type(long) ident(datum) operator(=) integer(0)operator(;) +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) operator(&&) ident(defined)operator(()ident(sparc)operator(\)) + pre_type(unsigned) pre_type(int) ident(mask) operator(=) integer(0)operator(;) +preprocessor(#endif) + + reserved(if)operator(()ident(rel) operator(>=) ident(rel_beg)operator(\)) + ident(address) operator(+=) ident(hdr)operator(.)ident(a_text)operator(;) + + reserved(if) operator(()ident(rel)operator(->)ident(r_extern)operator(\)) operator({) comment(/* Look it up in symbol-table */) + ident(sym) operator(=) operator(&()ident(syms)operator([)ident(R_SYMBOL)operator(()ident(rel)operator(\)]\);) + reserved(switch) operator(()ident(sym)operator(->)ident(n_type)operator(\)) operator({) + reserved(case) ident(N_EXT)operator(|)label(N_UNDF)operator(:) + ident(link_undef)operator(()ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(,) ident(block)operator(,) ident(rel)operator(\);) + reserved(case) ident(N_EXT)operator(|)label(N_COMM)operator(:) + reserved(case) label(N_COMM)operator(:) + ident(datum) operator(=) ident(sym)operator(->)ident(n_value)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(goto) ident(err_exit)operator(;) + operator(}) + operator(}) comment(/* end.. look it up */) + reserved(else) operator({) comment(/* is static */) + reserved(switch) operator(()ident(R_SYMBOL)operator(()ident(rel)operator(\)\)) operator({) + reserved(case) label(N_TEXT)operator(:) + reserved(case) label(N_DATA)operator(:) + ident(datum) operator(=) ident(block)operator(;) + reserved(break)operator(;) + reserved(case) label(N_BSS)operator(:) + ident(datum) operator(=) ident(block) operator(+) ident(new_common)operator(;) + reserved(break)operator(;) + reserved(case) label(N_ABS)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) comment(/* end .. is static */) + reserved(if) operator(()ident(R_PCREL)operator(()ident(rel)operator(\)\)) ident(datum) operator(-=) ident(block)operator(;) + +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) operator(&&) ident(defined)operator(()ident(sparc)operator(\)) + ident(datum) operator(+=) ident(rel)operator(->)ident(r_addend)operator(;) + ident(datum) operator(>>=) ident(R_RIGHTSHIFT)operator(()ident(rel)operator(\);) + ident(mask) operator(=) operator(()integer(1) operator(<<) ident(R_BITSIZE)operator(()ident(rel)operator(\)\)) operator(-) integer(1)operator(;) + ident(mask) operator(|=) ident(mask) operator(-)integer(1)operator(;) + ident(datum) operator(&=) ident(mask)operator(;) + + reserved(switch) operator(()ident(R_LENGTH)operator(()ident(rel)operator(\)\)) operator({) + reserved(case) integer(0)operator(:) + operator(*)ident(address) operator(&=) operator(~)ident(mask)operator(;) + operator(*)ident(address) operator(|=) ident(datum)operator(;) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) + operator(*()pre_type(short) operator(*\))ident(address) operator(&=) operator(~)ident(mask)operator(;) + operator(*()pre_type(short) operator(*\))ident(address) operator(|=) ident(datum)operator(;) + reserved(break)operator(;) + reserved(case) integer(2)operator(:) + operator(*()pre_type(long) operator(*\))ident(address) operator(&=) operator(~)ident(mask)operator(;) + operator(*()pre_type(long) operator(*\))ident(address) operator(|=) ident(datum)operator(;) + reserved(break)operator(;) + operator(}) +preprocessor(#else) + reserved(switch) operator(()ident(R_LENGTH)operator(()ident(rel)operator(\)\)) operator({) + reserved(case) integer(0)operator(:) comment(/* byte */) + reserved(if) operator(()ident(datum) operator(<) operator(-)integer(128) operator(||) ident(datum) operator(>) integer(127)operator(\)) reserved(goto) ident(err_exit)operator(;) + operator(*)ident(address) operator(+=) ident(datum)operator(;) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) comment(/* word */) + operator(*()pre_type(short) operator(*\))ident(address) operator(+=) ident(datum)operator(;) + reserved(break)operator(;) + reserved(case) integer(2)operator(:) comment(/* long */) + operator(*()pre_type(long) operator(*\))ident(address) operator(+=) ident(datum)operator(;) + reserved(break)operator(;) + operator(}) +preprocessor(#endif) + ident(rel)operator(++;) + operator(}) + operator(}) + + reserved(if) operator(()ident(need_init)operator(\)) operator({) + pre_type(int) ident(len)operator(;) + pre_type(char) operator(**)ident(libs_to_be_linked) operator(=) integer(0)operator(;) + pre_type(char) operator(*)ident(buf)operator(;) + + reserved(if) operator(()ident(undef_tbl)operator(->)ident(num_entries) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(load_lib)operator(()ident(libc)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(err_exit)operator(;) + operator(}) + + ident(init_funcname)operator((&)ident(buf)operator(,) ident(need_init)operator(\);) + ident(len) operator(=) ident(strlen)operator(()ident(buf)operator(\);) + + reserved(for) operator(()ident(sym) operator(=) ident(syms)operator(;) ident(sym)operator(<)ident(end)operator(;) ident(sym)operator(++\)) operator({) + pre_type(char) operator(*)ident(name) operator(=) ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(;) + reserved(if) operator(()ident(name)operator([)integer(0)operator(]) operator(==) char('_') operator(&&) ident(sym)operator(->)ident(n_value) operator(>=) ident(block)operator(\)) operator({) + reserved(if) operator(()ident(strcmp)operator(()ident(name)operator(+)integer(1)operator(,) string<delimiter(")content(dln_libs_to_be_linked)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(libs_to_be_linked) operator(=) operator(()pre_type(char)operator(**\))ident(sym)operator(->)ident(n_value)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(strcmp)operator(()ident(name)operator(+)integer(1)operator(,) ident(buf)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(init_p) operator(=) integer(1)operator(;) + operator((()pre_type(int) operator((*\)(\)\))ident(sym)operator(->)ident(n_value)operator(\)(\);) + operator(}) + operator(}) + operator(}) + reserved(if) operator(()ident(libs_to_be_linked) operator(&&) ident(undef_tbl)operator(->)ident(num_entries) operator(>) integer(0)operator(\)) operator({) + reserved(while) operator((*)ident(libs_to_be_linked)operator(\)) operator({) + ident(load_lib)operator((*)ident(libs_to_be_linked)operator(\);) + ident(libs_to_be_linked)operator(++;) + operator(}) + operator(}) + operator(}) + ident(free)operator(()ident(reloc)operator(\);) + ident(free)operator(()ident(syms)operator(\);) + reserved(if) operator(()ident(need_init)operator(\)) operator({) + reserved(if) operator(()ident(init_p) operator(==) integer(0)operator(\)) operator({) + ident(dln_errno) operator(=) ident(DLN_ENOINIT)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(undef_tbl)operator(->)ident(num_entries) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(load_lib)operator(()ident(libc)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(err_exit)operator(;) + reserved(if) operator(()ident(undef_tbl)operator(->)ident(num_entries) operator(>) integer(0)operator(\)) operator({) + ident(dln_errno) operator(=) ident(DLN_EUNDEF)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) + + label(err_exit)operator(:) + reserved(if) operator(()ident(syms)operator(\)) ident(free)operator(()ident(syms)operator(\);) + reserved(if) operator(()ident(reloc)operator(\)) ident(free)operator(()ident(reloc)operator(\);) + reserved(if) operator(()ident(block)operator(\)) ident(free)operator((()pre_type(char)operator(*\))ident(block)operator(\);) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +directive(static) pre_type(int) ident(target_offset)operator(;) +directive(static) pre_type(int) +ident(search_undef)operator(()ident(key)operator(,) ident(value)operator(,) ident(lib_tbl)operator(\)) + directive(const) pre_type(char) operator(*)ident(key)operator(;) + pre_type(int) ident(value)operator(;) + ident(st_table) operator(*)ident(lib_tbl)operator(;) +operator({) + pre_type(long) ident(offset)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(lib_tbl)operator(,) ident(key)operator(,) operator(&)ident(offset)operator(\)) operator(==) integer(0)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(target_offset) operator(=) ident(offset)operator(;) + reserved(return) ident(ST_STOP)operator(;) +operator(}) + +reserved(struct) ident(symdef) operator({) + pre_type(int) ident(rb_str_index)operator(;) + pre_type(int) ident(lib_offset)operator(;) +operator(};) + +pre_type(char) operator(*)ident(dln_librrb_ary_path) operator(=) ident(DLN_DEFAULT_LIB_PATH)operator(;) + +directive(static) pre_type(int) +ident(load_lib)operator(()ident(lib)operator(\)) + directive(const) pre_type(char) operator(*)ident(lib)operator(;) +operator({) + pre_type(char) operator(*)ident(path)operator(,) operator(*)ident(file)operator(;) + pre_type(char) ident(armagic)operator([)ident(SARMAG)operator(];) + pre_type(int) ident(fd)operator(,) ident(size)operator(;) + reserved(struct) ident(ar_hdr) ident(ahdr)operator(;) + ident(st_table) operator(*)ident(lib_tbl) operator(=) pre_constant(NULL)operator(;) + pre_type(int) operator(*)ident(data)operator(,) ident(nsym)operator(;) + reserved(struct) ident(symdef) operator(*)ident(base)operator(;) + pre_type(char) operator(*)ident(name_base)operator(;) + + reserved(if) operator(()ident(dln_init_p) operator(==) integer(0)operator(\)) operator({) + ident(dln_errno) operator(=) ident(DLN_ENOINIT)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + + reserved(if) operator(()ident(undef_tbl)operator(->)ident(num_entries) operator(==) integer(0)operator(\)) reserved(return) integer(0)operator(;) + ident(dln_errno) operator(=) ident(DLN_EBADLIB)operator(;) + + reserved(if) operator(()ident(lib)operator([)integer(0)operator(]) operator(==) char('-') operator(&&) ident(lib)operator([)integer(1)operator(]) operator(==) char('l')operator(\)) operator({) + pre_type(long) ident(len) operator(=) ident(strlen)operator(()ident(lib)operator(\)) operator(+) integer(4)operator(;) + pre_type(char) operator(*)ident(p) operator(=) ident(alloca)operator(()ident(len)operator(\);) + ident(snprintf)operator(()ident(p)operator(,) ident(len)operator(,) string<delimiter(")content(lib%s.a)delimiter(")>operator(,) ident(lib)operator(+)integer(2)operator(\);) + ident(lib) operator(=) ident(p)operator(;) + operator(}) + + comment(/* library search path: */) + comment(/* look for environment variable DLN_LIBRARY_PATH first. */) + comment(/* then variable dln_librrb_ary_path. */) + comment(/* if path is still NULL, use "." for path. */) + ident(path) operator(=) ident(getenv)operator(()string<delimiter(")content(DLN_LIBRARY_PATH)delimiter(")>operator(\);) + reserved(if) operator(()ident(path) operator(==) pre_constant(NULL)operator(\)) ident(path) operator(=) ident(dln_librrb_ary_path)operator(;) + + ident(file) operator(=) ident(dln_find_file)operator(()ident(lib)operator(,) ident(path)operator(\);) + ident(fd) operator(=) ident(open)operator(()ident(file)operator(,) ident(O_RDONLY)operator(\);) + reserved(if) operator(()ident(fd) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(syserr)operator(;) + ident(size) operator(=) ident(read)operator(()ident(fd)operator(,) ident(armagic)operator(,) ident(SARMAG)operator(\);) + reserved(if) operator(()ident(size) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(syserr)operator(;) + + reserved(if) operator(()ident(size) operator(!=) ident(SARMAG)operator(\)) operator({) + ident(dln_errno) operator(=) ident(DLN_ENOTLIB)operator(;) + reserved(goto) ident(badlib)operator(;) + operator(}) + ident(size) operator(=) ident(read)operator(()ident(fd)operator(,) operator(&)ident(ahdr)operator(,) reserved(sizeof)operator(()ident(ahdr)operator(\)\);) + reserved(if) operator(()ident(size) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(syserr)operator(;) + reserved(if) operator(()ident(size) operator(!=) reserved(sizeof)operator(()ident(ahdr)operator(\)) operator(||) ident(sscanf)operator(()ident(ahdr)operator(.)ident(ar_size)operator(,) string<delimiter(")content(%d)delimiter(")>operator(,) operator(&)ident(size)operator(\)) operator(!=) integer(1)operator(\)) operator({) + reserved(goto) ident(badlib)operator(;) + operator(}) + + reserved(if) operator(()ident(strncmp)operator(()ident(ahdr)operator(.)ident(ar_name)operator(,) string<delimiter(")content(__.SYMDEF)delimiter(")>operator(,) integer(9)operator(\)) operator(==) integer(0)operator(\)) operator({) + comment(/* make hash table from __.SYMDEF */) + + ident(lib_tbl) operator(=) ident(st_init_strtable)operator((\);) + ident(data) operator(=) operator(()pre_type(int)operator(*\))ident(xmalloc)operator(()ident(size)operator(\);) + reserved(if) operator(()ident(data) operator(==) pre_constant(NULL)operator(\)) reserved(goto) ident(syserr)operator(;) + ident(size) operator(=) ident(read)operator(()ident(fd)operator(,) ident(data)operator(,) ident(size)operator(\);) + ident(nsym) operator(=) operator(*)ident(data) operator(/) reserved(sizeof)operator(()reserved(struct) ident(symdef)operator(\);) + ident(base) operator(=) operator(()reserved(struct) ident(symdef)operator(*\)()ident(data) operator(+) integer(1)operator(\);) + ident(name_base) operator(=) operator(()pre_type(char)operator(*\)()ident(base) operator(+) ident(nsym)operator(\)) operator(+) reserved(sizeof)operator(()pre_type(int)operator(\);) + reserved(while) operator(()ident(nsym) operator(>) integer(0)operator(\)) operator({) + pre_type(char) operator(*)ident(name) operator(=) ident(name_base) operator(+) ident(base)operator(->)ident(rb_str_index)operator(;) + + ident(st_insert)operator(()ident(lib_tbl)operator(,) ident(name)operator(,) ident(base)operator(->)ident(lib_offset) operator(+) reserved(sizeof)operator(()ident(ahdr)operator(\)\);) + ident(nsym)operator(--;) + ident(base)operator(++;) + operator(}) + reserved(for) operator((;;\)) operator({) + ident(target_offset) operator(=) operator(-)integer(1)operator(;) + ident(st_foreach)operator(()ident(undef_tbl)operator(,) ident(search_undef)operator(,) ident(lib_tbl)operator(\);) + reserved(if) operator(()ident(target_offset) operator(==) operator(-)integer(1)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(load_1)operator(()ident(fd)operator(,) ident(target_offset)operator(,) integer(0)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(st_free_table)operator(()ident(lib_tbl)operator(\);) + ident(free)operator(()ident(data)operator(\);) + reserved(goto) ident(badlib)operator(;) + operator(}) + reserved(if) operator(()ident(undef_tbl)operator(->)ident(num_entries) operator(==) integer(0)operator(\)) reserved(break)operator(;) + operator(}) + ident(free)operator(()ident(data)operator(\);) + ident(st_free_table)operator(()ident(lib_tbl)operator(\);) + operator(}) + reserved(else) operator({) + comment(/* linear library, need to scan (FUTURE\) */) + + reserved(for) operator((;;\)) operator({) + pre_type(int) ident(offset) operator(=) ident(SARMAG)operator(;) + pre_type(int) ident(found) operator(=) integer(0)operator(;) + reserved(struct) ident(exec) ident(hdr)operator(;) + reserved(struct) ident(nlist) operator(*)ident(syms)operator(,) operator(*)ident(sym)operator(,) operator(*)ident(end)operator(;) + + reserved(while) operator(()ident(undef_tbl)operator(->)ident(num_entries) operator(>) integer(0)operator(\)) operator({) + ident(found) operator(=) integer(0)operator(;) + ident(lseek)operator(()ident(fd)operator(,) ident(offset)operator(,) integer(0)operator(\);) + ident(size) operator(=) ident(read)operator(()ident(fd)operator(,) operator(&)ident(ahdr)operator(,) reserved(sizeof)operator(()ident(ahdr)operator(\)\);) + reserved(if) operator(()ident(size) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(syserr)operator(;) + reserved(if) operator(()ident(size) operator(==) integer(0)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(size) operator(!=) reserved(sizeof)operator(()ident(ahdr)operator(\)) + operator(||) ident(sscanf)operator(()ident(ahdr)operator(.)ident(ar_size)operator(,) string<delimiter(")content(%d)delimiter(")>operator(,) operator(&)ident(size)operator(\)) operator(!=) integer(1)operator(\)) operator({) + reserved(goto) ident(badlib)operator(;) + operator(}) + ident(offset) operator(+=) reserved(sizeof)operator(()ident(ahdr)operator(\);) + reserved(if) operator(()ident(load_header)operator(()ident(fd)operator(,) operator(&)ident(hdr)operator(,) ident(offset)operator(\)) operator(==) operator(-)integer(1)operator(\)) + reserved(goto) ident(badlib)operator(;) + ident(syms) operator(=) ident(load_sym)operator(()ident(fd)operator(,) operator(&)ident(hdr)operator(,) ident(offset)operator(\);) + reserved(if) operator(()ident(syms) operator(==) pre_constant(NULL)operator(\)) reserved(goto) ident(badlib)operator(;) + ident(sym) operator(=) ident(syms)operator(;) + ident(end) operator(=) ident(syms) operator(+) operator(()ident(hdr)operator(.)ident(a_syms) operator(/) reserved(sizeof)operator(()reserved(struct) ident(nlist)operator(\)\);) + reserved(while) operator(()ident(sym) operator(<) ident(end)operator(\)) operator({) + reserved(if) operator(()ident(sym)operator(->)ident(n_type) operator(==) ident(N_EXT)operator(|)ident(N_TEXT) + operator(&&) ident(st_lookup)operator(()ident(undef_tbl)operator(,) ident(sym)operator(->)ident(n_un)operator(.)ident(n_name)operator(,) pre_constant(NULL)operator(\)\)) operator({) + reserved(break)operator(;) + operator(}) + ident(sym)operator(++;) + operator(}) + reserved(if) operator(()ident(sym) operator(<) ident(end)operator(\)) operator({) + ident(found)operator(++;) + ident(free)operator(()ident(syms)operator(\);) + reserved(if) operator(()ident(load_1)operator(()ident(fd)operator(,) ident(offset)operator(,) integer(0)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + reserved(goto) ident(badlib)operator(;) + operator(}) + operator(}) + ident(offset) operator(+=) ident(size)operator(;) + reserved(if) operator(()ident(offset) operator(&) integer(1)operator(\)) ident(offset)operator(++;) + operator(}) + reserved(if) operator(()ident(found)operator(\)) reserved(break)operator(;) + operator(}) + operator(}) + ident(close)operator(()ident(fd)operator(\);) + reserved(return) integer(0)operator(;) + + label(syserr)operator(:) + ident(dln_errno) operator(=) ident(errno)operator(;) + label(badlib)operator(:) + reserved(if) operator(()ident(fd) operator(>=) integer(0)operator(\)) ident(close)operator(()ident(fd)operator(\);) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(load)operator(()ident(file)operator(\)) + directive(const) pre_type(char) operator(*)ident(file)operator(;) +operator({) + pre_type(int) ident(fd)operator(;) + pre_type(int) ident(result)operator(;) + + reserved(if) operator(()ident(dln_init_p) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(dln_init)operator(()ident(dln_argv0)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(return) operator(-)integer(1)operator(;) + operator(}) + ident(result) operator(=) ident(strlen)operator(()ident(file)operator(\);) + reserved(if) operator(()ident(file)operator([)ident(result)operator(-)integer(1)operator(]) operator(==) char('a')operator(\)) operator({) + reserved(return) ident(load_lib)operator(()ident(file)operator(\);) + operator(}) + + ident(fd) operator(=) ident(open)operator(()ident(file)operator(,) ident(O_RDONLY)operator(\);) + reserved(if) operator(()ident(fd) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(dln_errno) operator(=) ident(errno)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + ident(result) operator(=) ident(load_1)operator(()ident(fd)operator(,) integer(0)operator(,) ident(file)operator(\);) + ident(close)operator(()ident(fd)operator(\);) + + reserved(return) ident(result)operator(;) +operator(}) + +directive(void)operator(*) +ident(dln_sym)operator(()ident(name)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + reserved(struct) ident(nlist) operator(*)ident(sym)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(sym_tbl)operator(,) ident(name)operator(,) operator(&)ident(sym)operator(\)\)) + reserved(return) operator(()directive(void)operator(*\))ident(sym)operator(->)ident(n_value)operator(;) + reserved(return) pre_constant(NULL)operator(;) +operator(}) + +preprocessor(#endif) comment(/* USE_DLN_A_OUT */) + +preprocessor(#ifdef) ident(USE_DLN_DLOPEN) +preprocessor(# if) ident(defined)operator(()ident(__NetBSD__)operator(\)) operator(&&) ident(defined)operator(()ident(__NetBSD_Version__)operator(\)) operator(&&) ident(__NetBSD_Version__) operator(<) integer(105000000) +preprocessor(# include) include(<nlist.h>) +preprocessor(# include) include(<link.h>) +preprocessor(# else) +preprocessor(# include) include(<dlfcn.h>) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__hpux) +preprocessor(#include) include(<errno.h>) +preprocessor(#include) include("dl.h") +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(_AIX)operator(\)) +preprocessor(#include) include(<ctype.h>) comment(/* for isdigit(\) */) +preprocessor(#include) include(<errno.h>) comment(/* for global errno */) +preprocessor(#include) include(<sys/ldr.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(NeXT) +preprocessor(#if) ident(NS_TARGET_MAJOR) operator(<) integer(4) +preprocessor(#include) include(<mach-o/rld.h>) +preprocessor(#else) +preprocessor(#include) include(<mach-o/dyld.h>) +preprocessor(#ifndef) ident(NSLINKMODULE_OPTION_BINDNOW) +preprocessor(#define) ident(NSLINKMODULE_OPTION_BINDNOW) integer(1) +preprocessor(#endif) +preprocessor(#endif) +preprocessor(#else) +preprocessor(#ifdef) ident(__APPLE__) +preprocessor(#include) include(<mach-o/dyld.h>) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(_WIN32) operator(&&) operator(!)ident(defined) ident(__CYGWIN__) +preprocessor(#include) include(<windows.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(_WIN32_WCE) +preprocessor(#undef) ident(FormatMessage) +preprocessor(#define) ident(FormatMessage) ident(FormatMessageA) +preprocessor(#undef) ident(LoadLibrary) +preprocessor(#define) ident(LoadLibrary) ident(LoadLibraryA) +preprocessor(#undef) ident(GetProcAddress) +preprocessor(#define) ident(GetProcAddress) ident(GetProcAddressA) +preprocessor(#endif) + +directive(static) directive(const) pre_type(char) operator(*) +ident(dln_strerror)operator((\)) +operator({) +preprocessor(#ifdef) ident(USE_DLN_A_OUT) + pre_type(char) operator(*)ident(strerror)operator((\);) + + reserved(switch) operator(()ident(dln_errno)operator(\)) operator({) + reserved(case) label(DLN_ECONFL)operator(:) + reserved(return) string<delimiter(")content(Symbol name conflict)delimiter(")>operator(;) + reserved(case) label(DLN_ENOINIT)operator(:) + reserved(return) string<delimiter(")content(No initializer given)delimiter(")>operator(;) + reserved(case) label(DLN_EUNDEF)operator(:) + reserved(return) string<delimiter(")content(Unresolved symbols)delimiter(")>operator(;) + reserved(case) label(DLN_ENOTLIB)operator(:) + reserved(return) string<delimiter(")content(Not a library file)delimiter(")>operator(;) + reserved(case) label(DLN_EBADLIB)operator(:) + reserved(return) string<delimiter(")content(Malformed library file)delimiter(")>operator(;) + reserved(case) label(DLN_EINIT)operator(:) + reserved(return) string<delimiter(")content(Not initialized)delimiter(")>operator(;) + reserved(default)operator(:) + reserved(return) ident(strerror)operator(()ident(dln_errno)operator(\);) + operator(}) +preprocessor(#endif) + +preprocessor(#ifdef) ident(USE_DLN_DLOPEN) + reserved(return) operator(()pre_type(char)operator(*\))ident(dlerror)operator((\);) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(_WIN32) operator(&&) operator(!)ident(defined) ident(__CYGWIN__) + directive(static) pre_type(char) ident(message)operator([)integer(1024)operator(];) + pre_type(int) ident(error) operator(=) ident(GetLastError)operator((\);) + pre_type(char) operator(*)ident(p) operator(=) ident(message)operator(;) + ident(p) operator(+=) ident(sprintf)operator(()ident(message)operator(,) string<delimiter(")content(%d: )delimiter(")>operator(,) ident(error)operator(\);) + ident(FormatMessage)operator(() + ident(FORMAT_MESSAGE_FROM_SYSTEM) operator(|) ident(FORMAT_MESSAGE_IGNORE_INSERTS)operator(,) + pre_constant(NULL)operator(,) + ident(error)operator(,) + ident(MAKELANGID)operator(()ident(LANG_NEUTRAL)operator(,) ident(SUBLANG_DEFAULT)operator(\),) + ident(p)operator(,) + reserved(sizeof) ident(message) operator(-) ident(strlen)operator(()ident(message)operator(\),) + pre_constant(NULL)operator(\);) + + reserved(for) operator(()ident(p) operator(=) ident(message)operator(;) operator(*)ident(p)operator(;) ident(p)operator(++\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('\\n') operator(||) operator(*)ident(p) operator(==) char('\\r')operator(\)) + operator(*)ident(p) operator(=) char(' ')operator(;) + operator(}) + reserved(return) ident(message)operator(;) +preprocessor(#endif) +operator(}) + + +preprocessor(#if) ident(defined)operator(()ident(_AIX)operator(\)) operator(&&) operator(!) ident(defined)operator(()ident(_IA64)operator(\)) +directive(static) directive(void) +ident(aix_loaderror)operator(()directive(const) pre_type(char) operator(*)ident(pathname)operator(\)) +operator({) + pre_type(char) operator(*)ident(message)operator([)integer(8)operator(],) ident(errbuf)operator([)integer(1024)operator(];) + pre_type(int) ident(i)operator(,)ident(j)operator(;) + + reserved(struct) ident(errtab) operator({) + pre_type(int) ident(errnum)operator(;) + pre_type(char) operator(*)ident(errstr)operator(;) + operator(}) ident(load_errtab)operator([]) operator(=) operator({) + operator({)ident(L_ERROR_TOOMANY)operator(,) string<delimiter(")content(too many errors, rest skipped.)delimiter(")>operator(},) + operator({)ident(L_ERROR_NOLIB)operator(,) string<delimiter(")content(can't load library:)delimiter(")>operator(},) + operator({)ident(L_ERROR_UNDEF)operator(,) string<delimiter(")content(can't find symbol in library:)delimiter(")>operator(},) + operator({)ident(L_ERROR_RLDBAD)operator(,) + string<delimiter(")content(RLD index out of range or bad relocation type:)delimiter(")>operator(},) + operator({)ident(L_ERROR_FORMAT)operator(,) string<delimiter(")content(not a valid, executable xcoff file:)delimiter(")>operator(},) + operator({)ident(L_ERROR_MEMBER)operator(,) + string<delimiter(")content(file not an archive or does not contain requested member:)delimiter(")>operator(},) + operator({)ident(L_ERROR_TYPE)operator(,) string<delimiter(")content(symbol table mismatch:)delimiter(")>operator(},) + operator({)ident(L_ERROR_ALIGN)operator(,) string<delimiter(")content(text alignment in file is wrong.)delimiter(")>operator(},) + operator({)ident(L_ERROR_SYSTEM)operator(,) string<delimiter(")content(System error:)delimiter(")>operator(},) + operator({)ident(L_ERROR_ERRNO)operator(,) pre_constant(NULL)operator(}) + operator(};) + +preprocessor(#define) ident(LOAD_ERRTAB_LEN) operator(()reserved(sizeof)operator(()ident(load_errtab)operator(\))operator(/)reserved(sizeof)operator(()ident(load_errtab)operator([)integer(0)operator(]\)\)) +preprocessor(#define) ident(ERRBUF_APPEND)operator(()ident(s)operator(\)) ident(strncat)operator(()ident(errbuf)operator(,) ident(s)operator(,) reserved(sizeof)operator(()ident(errbuf)operator(\)-)ident(strlen)operator(()ident(errbuf)operator(\)-)integer(1)operator(\)) + + ident(snprintf)operator(()ident(errbuf)operator(,) integer(1024)operator(,) string<delimiter(")content(load failed - %s )delimiter(")>operator(,) ident(pathname)operator(\);) + + reserved(if) operator((!)ident(loadquery)operator(()integer(1)operator(,) operator(&)ident(message)operator([)integer(0)operator(],) reserved(sizeof)operator(()ident(message)operator(\)\)\)) + ident(ERRBUF_APPEND)operator(()ident(strerror)operator(()ident(errno)operator(\)\);) + reserved(for)operator(()ident(i) operator(=) integer(0)operator(;) ident(message)operator([)ident(i)operator(]) operator(&&) operator(*)ident(message)operator([)ident(i)operator(];) ident(i)operator(++\)) operator({) + pre_type(int) ident(nerr) operator(=) ident(atoi)operator(()ident(message)operator([)ident(i)operator(]\);) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(j)operator(<)ident(LOAD_ERRTAB_LEN)operator(;) ident(j)operator(++\)) operator({) + reserved(if) operator(()ident(nerr) operator(==) ident(load_errtab)operator([)ident(i)operator(])operator(.)ident(errnum) operator(&&) ident(load_errtab)operator([)ident(i)operator(])operator(.)ident(errstr)operator(\)) + ident(ERRBUF_APPEND)operator(()ident(load_errtab)operator([)ident(i)operator(])operator(.)ident(errstr)operator(\);) + operator(}) + reserved(while) operator(()ident(isdigit)operator((*)ident(message)operator([)ident(i)operator(]\)\)) ident(message)operator([)ident(i)operator(]++;) + ident(ERRBUF_APPEND)operator(()ident(message)operator([)ident(i)operator(]\);) + ident(ERRBUF_APPEND)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\);) + operator(}) + ident(errbuf)operator([)ident(strlen)operator(()ident(errbuf)operator(\)-)integer(1)operator(]) operator(=) char('\\0')operator(;) comment(/* trim off last newline */) + ident(rb_loaderror)operator(()ident(errbuf)operator(\);) + reserved(return)operator(;) +operator(}) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__VMS)operator(\)) +preprocessor(#include) include(<starlet.h>) +preprocessor(#include) include(<rms.h>) +preprocessor(#include) include(<stsdef.h>) +preprocessor(#include) include(<unixlib.h>) +preprocessor(#include) include(<descrip.h>) +preprocessor(#include) include(<lib$routines.h>) + +directive(static) pre_type(char) operator(*)ident(vms_filespec)operator(;) +directive(static) pre_type(int) ident(vms_fileact)operator(()pre_type(char) operator(*)ident(filespec)operator(,) pre_type(int) ident(type)operator(\);) +directive(static) pre_type(long) ident(vms_fisexh)operator(()pre_type(long) operator(*)ident(sigarr)operator(,) pre_type(long) operator(*)ident(mecarr)operator(\);) +preprocessor(#endif) + +preprocessor(#endif) comment(/* NO_DLN_LOAD */) + +directive(void)operator(*) +ident(dln_load)operator(()ident(file)operator(\)) + directive(const) pre_type(char) operator(*)ident(file)operator(;) +operator({) +preprocessor(#ifdef) ident(NO_DLN_LOAD) + ident(rb_raise)operator(()ident(rb_eLoadError)operator(,) string<delimiter(")content(this executable file can't load extension libraries)delimiter(")>operator(\);) +preprocessor(#else) + +preprocessor(#if) operator(!)ident(defined)operator(()ident(_AIX)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(NeXT)operator(\)) + directive(const) pre_type(char) operator(*)ident(error) operator(=) integer(0)operator(;) +preprocessor(#define) ident(DLN_ERROR)operator((\)) operator(()ident(error) operator(=) ident(dln_strerror)operator((\),) ident(strcpy)operator(()ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(strlen)operator(()ident(error)operator(\)) operator(+) integer(1)operator(\),) ident(error)operator(\)\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(_WIN32) operator(&&) operator(!)ident(defined) ident(__CYGWIN__) + ident(HINSTANCE) ident(handle)operator(;) + pre_type(char) ident(winfile)operator([)ident(MAXPATHLEN)operator(];) + directive(void) operator((*)ident(init_fct)operator(\)(\);) + pre_type(char) operator(*)ident(buf)operator(;) + + reserved(if) operator(()ident(strlen)operator(()ident(file)operator(\)) operator(>=) ident(MAXPATHLEN)operator(\)) ident(rb_loaderror)operator(()string<delimiter(")content(filename too long)delimiter(")>operator(\);) + + comment(/* Load the file as an object one */) + ident(init_funcname)operator((&)ident(buf)operator(,) ident(file)operator(\);) + + ident(strcpy)operator(()ident(winfile)operator(,) ident(file)operator(\);) + + comment(/* Load file */) + reserved(if) operator((()ident(handle) operator(=) ident(LoadLibrary)operator(()ident(winfile)operator(\)\)) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(error) operator(=) ident(dln_strerror)operator((\);) + reserved(goto) ident(failed)operator(;) + operator(}) + + reserved(if) operator((()ident(init_fct) operator(=) operator(()directive(void)operator((*\)(\)\))ident(GetProcAddress)operator(()ident(handle)operator(,) ident(buf)operator(\)\)) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(rb_loaderror)operator(()string<delimiter(")content(%s - %s)char(\\n)content(%s)delimiter(")>operator(,) ident(dln_strerror)operator((\),) ident(buf)operator(,) ident(file)operator(\);) + operator(}) + + comment(/* Call the init code */) + operator((*)ident(init_fct)operator(\)(\);) + reserved(return) ident(handle)operator(;) +preprocessor(#else) +preprocessor(#ifdef) ident(USE_DLN_A_OUT) + reserved(if) operator(()ident(load)operator(()ident(file)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(error) operator(=) ident(dln_strerror)operator((\);) + reserved(goto) ident(failed)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +preprocessor(#else) + + pre_type(char) operator(*)ident(buf)operator(;) + comment(/* Load the file as an object one */) + ident(init_funcname)operator((&)ident(buf)operator(,) ident(file)operator(\);) + +preprocessor(#ifdef) ident(USE_DLN_DLOPEN) +preprocessor(#define) ident(DLN_DEFINED) + operator({) + directive(void) operator(*)ident(handle)operator(;) + directive(void) operator((*)ident(init_fct)operator(\)(\);) + +preprocessor(#ifndef) ident(RTLD_LAZY) +preprocessor(# define) ident(RTLD_LAZY) integer(1) +preprocessor(#endif) +preprocessor(#ifdef) ident(__INTERIX) +preprocessor(# undef) ident(RTLD_GLOBAL) +preprocessor(#endif) +preprocessor(#ifndef) ident(RTLD_GLOBAL) +preprocessor(# define) ident(RTLD_GLOBAL) integer(0) +preprocessor(#endif) + + comment(/* Load file */) + reserved(if) operator((()ident(handle) operator(=) operator(()directive(void)operator(*\))ident(dlopen)operator(()ident(file)operator(,) ident(RTLD_LAZY)operator(|)ident(RTLD_GLOBAL)operator(\)\)) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(error) operator(=) ident(dln_strerror)operator((\);) + reserved(goto) ident(failed)operator(;) + operator(}) + + ident(init_fct) operator(=) operator(()directive(void)operator((*\)(\)\))ident(dlsym)operator(()ident(handle)operator(,) ident(buf)operator(\);) + reserved(if) operator(()ident(init_fct) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(error) operator(=) ident(DLN_ERROR)operator((\);) + ident(dlclose)operator(()ident(handle)operator(\);) + reserved(goto) ident(failed)operator(;) + operator(}) + comment(/* Call the init code */) + operator((*)ident(init_fct)operator(\)(\);) + + reserved(return) ident(handle)operator(;) + operator(}) +preprocessor(#endif) comment(/* USE_DLN_DLOPEN */) + +preprocessor(#ifdef) ident(__hpux) +preprocessor(#define) ident(DLN_DEFINED) + operator({) + ident(shl_t) ident(lib) operator(=) pre_constant(NULL)operator(;) + pre_type(int) ident(flags)operator(;) + directive(void) operator((*)ident(init_fct)operator(\)(\);) + + ident(flags) operator(=) ident(BIND_DEFERRED)operator(;) + ident(lib) operator(=) ident(shl_load)operator(()ident(file)operator(,) ident(flags)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(lib) operator(==) pre_constant(NULL)operator(\)) operator({) + directive(extern) pre_type(int) ident(errno)operator(;) + ident(rb_loaderror)operator(()string<delimiter(")content(%s - %s)delimiter(")>operator(,) ident(strerror)operator(()ident(errno)operator(\),) ident(file)operator(\);) + operator(}) + ident(shl_findsym)operator((&)ident(lib)operator(,) ident(buf)operator(,) ident(TYPE_PROCEDURE)operator(,) operator(()directive(void)operator(*\)&)ident(init_fct)operator(\);) + reserved(if) operator(()ident(init_fct) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(shl_findsym)operator((&)ident(lib)operator(,) ident(buf)operator(,) ident(TYPE_UNDEFINED)operator(,) operator(()directive(void)operator(*\)&)ident(init_fct)operator(\);) + reserved(if) operator(()ident(init_fct) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(errno) operator(=) ident(ENOSYM)operator(;) + ident(rb_loaderror)operator(()string<delimiter(")content(%s - %s)delimiter(")>operator(,) ident(strerror)operator(()ident(ENOSYM)operator(\),) ident(file)operator(\);) + operator(}) + operator(}) + operator((*)ident(init_fct)operator(\)(\);) + reserved(return) operator(()directive(void)operator(*\))ident(lib)operator(;) + operator(}) +preprocessor(#endif) comment(/* hpux */) + +preprocessor(#if) ident(defined)operator(()ident(_AIX)operator(\)) operator(&&) operator(!) ident(defined)operator(()ident(_IA64)operator(\)) +preprocessor(#define) ident(DLN_DEFINED) + operator({) + directive(void) operator((*)ident(init_fct)operator(\)(\);) + + ident(init_fct) operator(=) operator(()directive(void)operator((*\)(\)\))ident(load)operator((()pre_type(char)operator(*\))ident(file)operator(,) integer(1)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(init_fct) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(aix_loaderror)operator(()ident(file)operator(\);) + operator(}) + reserved(if) operator(()ident(loadbind)operator(()integer(0)operator(,) operator(()directive(void)operator(*\))ident(dln_load)operator(,) operator(()directive(void)operator(*\))ident(init_fct)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(aix_loaderror)operator(()ident(file)operator(\);) + operator(}) + operator((*)ident(init_fct)operator(\)(\);) + reserved(return) operator(()directive(void)operator(*\))ident(init_fct)operator(;) + operator(}) +preprocessor(#endif) comment(/* _AIX */) + +preprocessor(#if) ident(defined)operator(()ident(NeXT)operator(\)) operator(||) ident(defined)operator(()ident(__APPLE__)operator(\)) +preprocessor(#define) ident(DLN_DEFINED) +comment(/*---------------------------------------------------- + By SHIROYAMA Takayuki Psi@fortune.nest.or.jp + + Special Thanks... + Yu tomoak-i@is.aist-nara.ac.jp, + Mi hisho@tasihara.nest.or.jp, + sunshine@sunshineco.com, + and... Miss ARAI Akino(^^;\) + ----------------------------------------------------*/) +preprocessor(#if) ident(defined)operator(()ident(NeXT)operator(\)) operator(&&) operator(()ident(NS_TARGET_MAJOR) operator(<) integer(4)operator(\))comment(/* NeXTSTEP rld functions */) + + operator({) + ident(NXStream)operator(*) ident(s)operator(;) + pre_type(unsigned) pre_type(long) ident(init_address)operator(;) + pre_type(char) operator(*)ident(object_files)operator([)integer(2)operator(]) operator(=) operator({)pre_constant(NULL)operator(,) pre_constant(NULL)operator(};) + + directive(void) operator((*)ident(init_fct)operator(\)(\);) + + ident(object_files)operator([)integer(0)operator(]) operator(=) operator(()pre_type(char)operator(*\))ident(file)operator(;) + + ident(s) operator(=) ident(NXOpenFile)operator(()integer(2)operator(,)ident(NX_WRITEONLY)operator(\);) + + comment(/* Load object file, if return value ==0 , load failed*/) + reserved(if)operator(()ident(rld_load)operator(()ident(s)operator(,) pre_constant(NULL)operator(,) ident(object_files)operator(,) pre_constant(NULL)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(NXFlush)operator(()ident(s)operator(\);) + ident(NXClose)operator(()ident(s)operator(\);) + ident(rb_loaderror)operator(()string<delimiter(")content(Failed to load %.200s)delimiter(")>operator(,) ident(file)operator(\);) + operator(}) + + comment(/* lookup the initial function */) + reserved(if)operator(()ident(rld_lookup)operator(()ident(s)operator(,) ident(buf)operator(,) operator(&)ident(init_address)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(NXFlush)operator(()ident(s)operator(\);) + ident(NXClose)operator(()ident(s)operator(\);) + ident(rb_loaderror)operator(()string<delimiter(")content(Failed to lookup Init function %.200s)delimiter(")>operator(,) ident(file)operator(\);) + operator(}) + + ident(NXFlush)operator(()ident(s)operator(\);) + ident(NXClose)operator(()ident(s)operator(\);) + + comment(/* Cannot call *init_address directory, so copy this value to + funtion pointer */) + ident(init_fct) operator(=) operator(()directive(void)operator((*\)(\)\))ident(init_address)operator(;) + operator((*)ident(init_fct)operator(\)(\);) + reserved(return) operator(()directive(void)operator(*\))ident(init_address)operator(;) + operator(}) +preprocessor(#else)comment(/* OPENSTEP dyld functions */) + operator({) + pre_type(int) ident(dyld_result)operator(;) + ident(NSObjectFileImage) ident(obj_file)operator(;) comment(/* handle, but not use it */) + comment(/* "file" is module file name . + "buf" is pointer to initial function name with "_" . */) + + directive(void) operator((*)ident(init_fct)operator(\)(\);) + + + ident(dyld_result) operator(=) ident(NSCreateObjectFileImageFromFile)operator(()ident(file)operator(,) operator(&)ident(obj_file)operator(\);) + + reserved(if) operator(()ident(dyld_result) operator(!=) ident(NSObjectFileImageSuccess)operator(\)) operator({) + ident(rb_loaderror)operator(()string<delimiter(")content(Failed to load %.200s)delimiter(")>operator(,) ident(file)operator(\);) + operator(}) + + ident(NSLinkModule)operator(()ident(obj_file)operator(,) ident(file)operator(,) ident(NSLINKMODULE_OPTION_BINDNOW)operator(\);) + + comment(/* lookup the initial function */) + reserved(if)operator((!)ident(NSIsSymbolNameDefined)operator(()ident(buf)operator(\)\)) operator({) + ident(rb_loaderror)operator(()string<delimiter(")content(Failed to lookup Init function %.200s)delimiter(")>operator(,)ident(file)operator(\);) + operator(}) + ident(init_fct) operator(=) ident(NSAddressOfSymbol)operator(()ident(NSLookupAndBindSymbol)operator(()ident(buf)operator(\)\);) + operator((*)ident(init_fct)operator(\)(\);) + + reserved(return) operator(()directive(void)operator(*\))ident(init_fct)operator(;) + operator(}) +preprocessor(#endif) comment(/* rld or dyld */) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__BEOS__) +preprocessor(# define) ident(DLN_DEFINED) + operator({) + ident(status_t) ident(err_stat)operator(;) comment(/* BeOS error status code */) + ident(image_id) ident(img_id)operator(;) comment(/* extention module unique id */) + directive(void) operator((*)ident(init_fct)operator(\)(\);) comment(/* initialize function for extention module */) + + comment(/* load extention module */) + ident(img_id) operator(=) ident(load_add_on)operator(()ident(file)operator(\);) + reserved(if) operator(()ident(img_id) operator(<=) integer(0)operator(\)) operator({) + ident(rb_loaderror)operator(()string<delimiter(")content(Failed to load %.200s)delimiter(")>operator(,) ident(file)operator(\);) + operator(}) + + comment(/* find symbol for module initialize function. */) + comment(/* The Be Book KernelKit Images section described to use + B_SYMBOL_TYPE_TEXT for symbol of function, not + B_SYMBOL_TYPE_CODE. Why ? */) + comment(/* strcat(init_fct_symname, "__Fv"\); */) comment(/* parameter nothing. */) + comment(/* "__Fv" dont need! The Be Book Bug ? */) + ident(err_stat) operator(=) ident(get_image_symbol)operator(()ident(img_id)operator(,) ident(buf)operator(,) + ident(B_SYMBOL_TYPE_TEXT)operator(,) operator(()directive(void) operator(**\)&)ident(init_fct)operator(\);) + + reserved(if) operator(()ident(err_stat) operator(!=) ident(B_NO_ERROR)operator(\)) operator({) + pre_type(char) ident(real_name)operator([)ident(MAXPATHLEN)operator(];) + + ident(strcpy)operator(()ident(real_name)operator(,) ident(buf)operator(\);) + ident(strcat)operator(()ident(real_name)operator(,) string<delimiter(")content(__Fv)delimiter(")>operator(\);) + ident(err_stat) operator(=) ident(get_image_symbol)operator(()ident(img_id)operator(,) ident(real_name)operator(,) + ident(B_SYMBOL_TYPE_TEXT)operator(,) operator(()directive(void) operator(**\)&)ident(init_fct)operator(\);) + operator(}) + + reserved(if) operator((()ident(B_BAD_IMAGE_ID) operator(==) ident(err_stat)operator(\)) operator(||) operator(()ident(B_BAD_INDEX) operator(==) ident(err_stat)operator(\)\)) operator({) + ident(unload_add_on)operator(()ident(img_id)operator(\);) + ident(rb_loaderror)operator(()string<delimiter(")content(Failed to lookup Init function %.200s)delimiter(")>operator(,) ident(file)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(B_NO_ERROR) operator(!=) ident(err_stat)operator(\)) operator({) + pre_type(char) ident(errmsg)operator([]) operator(=) string<delimiter(")content(Internal of BeOS version. %.200s (symbol_name = %s\))delimiter(")>operator(;) + ident(unload_add_on)operator(()ident(img_id)operator(\);) + ident(rb_loaderror)operator(()ident(errmsg)operator(,) ident(strerror)operator(()ident(err_stat)operator(\),) ident(buf)operator(\);) + operator(}) + + comment(/* call module initialize function. */) + operator((*)ident(init_fct)operator(\)(\);) + reserved(return) operator(()directive(void)operator(*\))ident(img_id)operator(;) + operator(}) +preprocessor(#endif) comment(/* __BEOS__*/) + +preprocessor(#ifdef) ident(__MACOS__) +preprocessor(# define) ident(DLN_DEFINED) + operator({) + ident(OSErr) ident(err)operator(;) + ident(FSSpec) ident(libspec)operator(;) + ident(CFragConnectionID) ident(connID)operator(;) + ident(Ptr) ident(mainAddr)operator(;) + pre_type(char) ident(errMessage)operator([)integer(1024)operator(];) + ident(Boolean) ident(isfolder)operator(,) ident(didsomething)operator(;) + ident(Str63) ident(fragname)operator(;) + ident(Ptr) ident(symAddr)operator(;) + ident(CFragSymbolClass) ident(class)operator(;) + directive(void) operator((*)ident(init_fct)operator(\)(\);) + pre_type(char) ident(fullpath)operator([)ident(MAXPATHLEN)operator(];) + + ident(strcpy)operator(()ident(fullpath)operator(,) ident(file)operator(\);) + + comment(/* resolve any aliases to find the real file */) + ident(c2pstr)operator(()ident(fullpath)operator(\);) + operator(()directive(void)operator(\))ident(FSMakeFSSpec)operator(()integer(0)operator(,) integer(0)operator(,) ident(fullpath)operator(,) operator(&)ident(libspec)operator(\);) + ident(err) operator(=) ident(ResolveAliasFile)operator((&)ident(libspec)operator(,) integer(1)operator(,) operator(&)ident(isfolder)operator(,) operator(&)ident(didsomething)operator(\);) + reserved(if) operator(()ident(err)operator(\)) operator({) + ident(rb_loaderror)operator(()string<delimiter(")content(Unresolved Alias - %s)delimiter(")>operator(,) ident(file)operator(\);) + operator(}) + + comment(/* Load the fragment (or return the connID if it is already loaded */) + ident(fragname)operator([)integer(0)operator(]) operator(=) integer(0)operator(;) + ident(err) operator(=) ident(GetDiskFragment)operator((&)ident(libspec)operator(,) integer(0)operator(,) integer(0)operator(,) ident(fragname)operator(,) + ident(kLoadCFrag)operator(,) operator(&)ident(connID)operator(,) operator(&)ident(mainAddr)operator(,) + ident(errMessage)operator(\);) + reserved(if) operator(()ident(err)operator(\)) operator({) + ident(p2cstr)operator(()ident(errMessage)operator(\);) + ident(rb_loaderror)operator(()string<delimiter(")content(%s - %s)delimiter(")>operator(,)ident(errMessage) operator(,) ident(file)operator(\);) + operator(}) + + comment(/* Locate the address of the correct init function */) + ident(c2pstr)operator(()ident(buf)operator(\);) + ident(err) operator(=) ident(FindSymbol)operator(()ident(connID)operator(,) ident(buf)operator(,) operator(&)ident(symAddr)operator(,) operator(&)ident(class)operator(\);) + reserved(if) operator(()ident(err)operator(\)) operator({) + ident(rb_loaderror)operator(()string<delimiter(")content(Unresolved symbols - %s)delimiter(")> operator(,) ident(file)operator(\);) + operator(}) + ident(init_fct) operator(=) operator(()directive(void) operator((*\)(\)\))ident(symAddr)operator(;) + operator((*)ident(init_fct)operator(\)(\);) + reserved(return) operator(()directive(void)operator(*\))ident(init_fct)operator(;) + operator(}) +preprocessor(#endif) comment(/* __MACOS__ */) + +preprocessor(#if) ident(defined)operator(()ident(__VMS)operator(\)) +preprocessor(#define) ident(DLN_DEFINED) + operator({) + pre_type(long) ident(status)operator(;) + directive(void) operator((*)ident(init_fct)operator(\)(\);) + pre_type(char) operator(*)ident(fname)operator(,) operator(*)ident(p1)operator(,) operator(*)ident(p2)operator(;) + + ident($)ident(DESCRIPTOR)operator(()ident(fname_d)operator(,) string<delimiter(")delimiter(")>operator(\);) + ident($)ident(DESCRIPTOR)operator(()ident(image_d)operator(,) string<delimiter(")delimiter(")>operator(\);) + ident($)ident(DESCRIPTOR)operator(()ident(buf_d)operator(,) string<delimiter(")delimiter(")>operator(\);) + + ident(decc)ident($)ident(to_vms)operator(()ident(file)operator(,) ident(vms_fileact)operator(,) integer(0)operator(,) integer(0)operator(\);) + + ident(fname) operator(=) operator(()pre_type(char) operator(*\))ident(__alloca)operator(()ident(strlen)operator(()ident(file)operator(\)+)integer(1)operator(\);) + ident(strcpy)operator(()ident(fname)operator(,)ident(file)operator(\);) + reserved(if) operator(()ident(p1) operator(=) ident(strrchr)operator(()ident(fname)operator(,)char('/')operator(\)\)) + ident(fname) operator(=) ident(p1) operator(+) integer(1)operator(;) + reserved(if) operator(()ident(p2) operator(=) ident(strrchr)operator(()ident(fname)operator(,)char('.')operator(\)\)) + operator(*)ident(p2) operator(=) char('\\0')operator(;) + + ident(fname_d)operator(.)ident(dsc)ident($)ident(w_length) operator(=) ident(strlen)operator(()ident(fname)operator(\);) + ident(fname_d)operator(.)ident(dsc)ident($)ident(a_pointer) operator(=) ident(fname)operator(;) + ident(image_d)operator(.)ident(dsc)ident($)ident(w_length) operator(=) ident(strlen)operator(()ident(vms_filespec)operator(\);) + ident(image_d)operator(.)ident(dsc)ident($)ident(a_pointer) operator(=) ident(vms_filespec)operator(;) + ident(buf_d)operator(.)ident(dsc)ident($)ident(w_length) operator(=) ident(strlen)operator(()ident(buf)operator(\);) + ident(buf_d)operator(.)ident(dsc)ident($)ident(a_pointer) operator(=) ident(buf)operator(;) + + ident(lib)ident($)ident(establish)operator(()ident(vms_fisexh)operator(\);) + + ident(status) operator(=) ident(lib)ident($)ident(find_image_symbol) operator(() + operator(&)ident(fname_d)operator(,) + operator(&)ident(buf_d)operator(,) + operator(&)ident(init_fct)operator(,) + operator(&)ident(image_d)operator(\);) + + ident(lib)ident($)ident(establish)operator(()integer(0)operator(\);) + + reserved(if) operator(()ident(status) operator(==) ident(RMS)ident($)ident(_FNF)operator(\)) operator({) + ident(error) operator(=) ident(dln_strerror)operator((\);) + reserved(goto) ident(failed)operator(;) + operator(}) reserved(else) reserved(if) operator((!)ident($)ident(VMS_STATUS_SUCCESS)operator(()ident(status)operator(\)\)) operator({) + ident(error) operator(=) ident(DLN_ERROR)operator((\);) + reserved(goto) ident(failed)operator(;) + operator(}) + + comment(/* Call the init code */) + operator((*)ident(init_fct)operator(\)(\);) + + reserved(return) integer(1)operator(;) + operator(}) +preprocessor(#endif) comment(/* __VMS */) + +preprocessor(#ifndef) ident(DLN_DEFINED) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + +preprocessor(#endif) comment(/* USE_DLN_A_OUT */) +preprocessor(#endif) +preprocessor(#if) operator(!)ident(defined)operator(()ident(_AIX)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(NeXT)operator(\)) + label(failed)operator(:) + ident(rb_loaderror)operator(()string<delimiter(")content(%s - %s)delimiter(")>operator(,) ident(error)operator(,) ident(file)operator(\);) +preprocessor(#endif) + +preprocessor(#endif) comment(/* NO_DLN_LOAD */) + reserved(return) integer(0)operator(;) comment(/* dummy return */) +operator(}) + +directive(static) pre_type(char) operator(*)ident(dln_find_1)operator((\);) + +pre_type(char) operator(*) +ident(dln_find_exe)operator(()ident(fname)operator(,) ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(fname)operator(;) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) + reserved(if) operator((!)ident(path)operator(\)) operator({) + ident(path) operator(=) ident(getenv)operator(()ident(PATH_ENV)operator(\);) + operator(}) + + reserved(if) operator((!)ident(path)operator(\)) operator({) +preprocessor(#if) ident(defined)operator(()ident(MSDOS)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__MACOS__)operator(\)) + ident(path) operator(=) string<delimiter(")content(/usr/local/bin;/usr/ucb;/usr/bin;/bin;.)delimiter(")>operator(;) +preprocessor(#else) + ident(path) operator(=) string<delimiter(")content(/usr/local/bin:/usr/ucb:/usr/bin:/bin:.)delimiter(")>operator(;) +preprocessor(#endif) + operator(}) + reserved(return) ident(dln_find_1)operator(()ident(fname)operator(,) ident(path)operator(,) integer(1)operator(\);) +operator(}) + +pre_type(char) operator(*) +ident(dln_find_file)operator(()ident(fname)operator(,) ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(fname)operator(;) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) +preprocessor(#ifndef) ident(__MACOS__) + reserved(if) operator((!)ident(path)operator(\)) ident(path) operator(=) string<delimiter(")content(.)delimiter(")>operator(;) + reserved(return) ident(dln_find_1)operator(()ident(fname)operator(,) ident(path)operator(,) integer(0)operator(\);) +preprocessor(#else) + reserved(if) operator((!)ident(path)operator(\)) ident(path) operator(=) string<delimiter(")content(.)delimiter(")>operator(;) + reserved(return) ident(_macruby_path_conv_posix_to_macos)operator(()ident(dln_find_1)operator(()ident(fname)operator(,) ident(path)operator(,) integer(0)operator(\)\);) +preprocessor(#endif) +operator(}) + +directive(static) pre_type(char) ident(fbuf)operator([)ident(MAXPATHLEN)operator(];) + +directive(static) pre_type(char) operator(*) +ident(dln_find_1)operator(()ident(fname)operator(,) ident(path)operator(,) ident(exe_flag)operator(\)) + pre_type(char) operator(*)ident(fname)operator(;) + pre_type(char) operator(*)ident(path)operator(;) + pre_type(int) ident(exe_flag)operator(;) comment(/* non 0 if looking for executable. */) +operator({) + directive(register) pre_type(char) operator(*)ident(dp)operator(;) + directive(register) pre_type(char) operator(*)ident(ep)operator(;) + directive(register) pre_type(char) operator(*)ident(bp)operator(;) + reserved(struct) ident(stat) ident(st)operator(;) +preprocessor(#ifdef) ident(__MACOS__) + directive(const) pre_type(char)operator(*) ident(mac_fullpath)operator(;) +preprocessor(#endif) + + reserved(if) operator((!)ident(fname)operator(\)) reserved(return) ident(fname)operator(;) + reserved(if) operator(()ident(fname)operator([)integer(0)operator(]) operator(==) char('/')operator(\)) reserved(return) ident(fname)operator(;) + reserved(if) operator(()ident(strncmp)operator(()string<delimiter(")content(./)delimiter(")>operator(,) ident(fname)operator(,) integer(2)operator(\)) operator(==) integer(0) operator(||) ident(strncmp)operator(()string<delimiter(")content(../)delimiter(")>operator(,) ident(fname)operator(,) integer(3)operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(fname)operator(;) + reserved(if) operator(()ident(exe_flag) operator(&&) ident(strchr)operator(()ident(fname)operator(,) char('/')operator(\)\)) reserved(return) ident(fname)operator(;) +preprocessor(#ifdef) ident(DOSISH) + reserved(if) operator(()ident(fname)operator([)integer(0)operator(]) operator(==) char('\\\\')operator(\)) reserved(return) ident(fname)operator(;) +preprocessor(# ifdef) ident(DOSISH_DRIVE_LETTER) + reserved(if) operator(()ident(strlen)operator(()ident(fname)operator(\)) operator(>) integer(2) operator(&&) ident(fname)operator([)integer(1)operator(]) operator(==) char(':')operator(\)) reserved(return) ident(fname)operator(;) +preprocessor(# endif) + reserved(if) operator(()ident(strncmp)operator(()string<delimiter(")content(.)char(\\\\)delimiter(")>operator(,) ident(fname)operator(,) integer(2)operator(\)) operator(==) integer(0) operator(||) ident(strncmp)operator(()string<delimiter(")content(..)char(\\\\)delimiter(")>operator(,) ident(fname)operator(,) integer(3)operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(fname)operator(;) + reserved(if) operator(()ident(exe_flag) operator(&&) ident(strchr)operator(()ident(fname)operator(,) char('\\\\')operator(\)\)) reserved(return) ident(fname)operator(;) +preprocessor(#endif) + + reserved(for) operator(()ident(dp) operator(=) ident(path)operator(;;) ident(dp) operator(=) operator(++)ident(ep)operator(\)) operator({) + directive(register) pre_type(int) ident(l)operator(;) + pre_type(int) ident(i)operator(;) + pre_type(int) ident(fspace)operator(;) + + comment(/* extract a component */) + ident(ep) operator(=) ident(strchr)operator(()ident(dp)operator(,) ident(PATH_SEP)operator([)integer(0)operator(]\);) + reserved(if) operator(()ident(ep) operator(==) pre_constant(NULL)operator(\)) + ident(ep) operator(=) ident(dp)operator(+)ident(strlen)operator(()ident(dp)operator(\);) + + comment(/* find the length of that component */) + ident(l) operator(=) ident(ep) operator(-) ident(dp)operator(;) + ident(bp) operator(=) ident(fbuf)operator(;) + ident(fspace) operator(=) reserved(sizeof) ident(fbuf) operator(-) integer(2)operator(;) + reserved(if) operator(()ident(l) operator(>) integer(0)operator(\)) operator({) + comment(/* + ** If the length of the component is zero length, + ** start from the current directory. If the + ** component begins with "~", start from the + ** user's $HOME environment variable. Otherwise + ** take the path literally. + */) + + reserved(if) operator((*)ident(dp) operator(==) char('~') operator(&&) operator(()ident(l) operator(==) integer(1) operator(||) +preprocessor(#if) ident(defined)operator(()ident(DOSISH)operator(\)) + ident(dp)operator([)integer(1)operator(]) operator(==) char('\\\\') operator(||) +preprocessor(#endif) + ident(dp)operator([)integer(1)operator(]) operator(==) char('/')operator(\)\)) operator({) + pre_type(char) operator(*)ident(home)operator(;) + + ident(home) operator(=) ident(getenv)operator(()string<delimiter(")content(HOME)delimiter(")>operator(\);) + reserved(if) operator(()ident(home) operator(!=) pre_constant(NULL)operator(\)) operator({) + ident(i) operator(=) ident(strlen)operator(()ident(home)operator(\);) + reserved(if) operator((()ident(fspace) operator(-=) ident(i)operator(\)) operator(<) integer(0)operator(\)) + reserved(goto) ident(toolong)operator(;) + ident(memcpy)operator(()ident(bp)operator(,) ident(home)operator(,) ident(i)operator(\);) + ident(bp) operator(+=) ident(i)operator(;) + operator(}) + ident(dp)operator(++;) + ident(l)operator(--;) + operator(}) + reserved(if) operator(()ident(l) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator((()ident(fspace) operator(-=) ident(l)operator(\)) operator(<) integer(0)operator(\)) + reserved(goto) ident(toolong)operator(;) + ident(memcpy)operator(()ident(bp)operator(,) ident(dp)operator(,) ident(l)operator(\);) + ident(bp) operator(+=) ident(l)operator(;) + operator(}) + + comment(/* add a "/" between directory and filename */) + reserved(if) operator(()ident(ep)operator([-)integer(1)operator(]) operator(!=) char('/')operator(\)) + operator(*)ident(bp)operator(++) operator(=) char('/')operator(;) + operator(}) + + comment(/* now append the file name */) + ident(i) operator(=) ident(strlen)operator(()ident(fname)operator(\);) + reserved(if) operator((()ident(fspace) operator(-=) ident(i)operator(\)) operator(<) integer(0)operator(\)) operator({) + label(toolong)operator(:) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content(openpath: pathname too long (ignored\))char(\\n)delimiter(")>operator(\);) + operator(*)ident(bp) operator(=) char('\\0')operator(;) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")char(\\t)content(Directory )char(\\")content(%s)char(\\")char(\\n)delimiter(")>operator(,) ident(fbuf)operator(\);) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")char(\\t)content(File )char(\\")content(%s)char(\\")char(\\n)delimiter(")>operator(,) ident(fname)operator(\);) + reserved(goto) ident(next)operator(;) + operator(}) + ident(memcpy)operator(()ident(bp)operator(,) ident(fname)operator(,) ident(i) operator(+) integer(1)operator(\);) + +preprocessor(#if) ident(defined)operator(()ident(DOSISH)operator(\)) + reserved(if) operator(()ident(exe_flag)operator(\)) operator({) + directive(static) directive(const) pre_type(char) ident(extension)operator([][)integer(5)operator(]) operator(=) operator({) +preprocessor(#if) ident(defined)operator(()ident(MSDOS)operator(\)) + string<delimiter(")content(.com)delimiter(")>operator(,) string<delimiter(")content(.exe)delimiter(")>operator(,) string<delimiter(")content(.bat)delimiter(")>operator(,) +preprocessor(#if) ident(defined)operator(()ident(DJGPP)operator(\)) + string<delimiter(")content(.btm)delimiter(")>operator(,) string<delimiter(")content(.sh)delimiter(")>operator(,) string<delimiter(")content(.ksh)delimiter(")>operator(,) string<delimiter(")content(.pl)delimiter(")>operator(,) string<delimiter(")content(.sed)delimiter(")>operator(,) +preprocessor(#endif) +preprocessor(#elif) ident(defined)operator(()ident(__EMX__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) + string<delimiter(")content(.exe)delimiter(")>operator(,) string<delimiter(")content(.com)delimiter(")>operator(,) string<delimiter(")content(.cmd)delimiter(")>operator(,) string<delimiter(")content(.bat)delimiter(")>operator(,) +comment(/* end of __EMX__ or _WIN32 */) +preprocessor(#else) + string<delimiter(")content(.r)delimiter(")>operator(,) string<delimiter(")content(.R)delimiter(")>operator(,) string<delimiter(")content(.x)delimiter(")>operator(,) string<delimiter(")content(.X)delimiter(")>operator(,) string<delimiter(")content(.bat)delimiter(")>operator(,) string<delimiter(")content(.BAT)delimiter(")>operator(,) +comment(/* __human68k__ */) +preprocessor(#endif) + operator(};) + pre_type(int) ident(j)operator(;) + + reserved(for) operator(()ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) reserved(sizeof)operator(()ident(extension)operator(\)) operator(/) reserved(sizeof)operator(()ident(extension)operator([)integer(0)operator(]\);) ident(j)operator(++\)) operator({) + reserved(if) operator(()ident(fspace) operator(<) ident(strlen)operator(()ident(extension)operator([)ident(j)operator(]\)\)) operator({) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content(openpath: pathname too long (ignored\))char(\\n)delimiter(")>operator(\);) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")char(\\t)content(Directory )char(\\")content(%.*s)char(\\")char(\\n)delimiter(")>operator(,) operator(()pre_type(int)operator(\)) operator(()ident(bp) operator(-) ident(fbuf)operator(\),) ident(fbuf)operator(\);) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")char(\\t)content(File )char(\\")content(%s%s)char(\\")char(\\n)delimiter(")>operator(,) ident(fname)operator(,) ident(extension)operator([)ident(j)operator(]\);) + reserved(continue)operator(;) + operator(}) + ident(strcpy)operator(()ident(bp) operator(+) ident(i)operator(,) ident(extension)operator([)ident(j)operator(]\);) +preprocessor(#ifndef) ident(__MACOS__) + reserved(if) operator(()ident(stat)operator(()ident(fbuf)operator(,) operator(&)ident(st)operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(fbuf)operator(;) +preprocessor(#else) + reserved(if) operator(()ident(mac_fullpath) operator(=) ident(_macruby_exist_file_in_libdir_as_posix_name)operator(()ident(fbuf)operator(\)\)) + reserved(return) ident(mac_fullpath)operator(;) + +preprocessor(#endif) + operator(}) + reserved(goto) ident(next)operator(;) + operator(}) +preprocessor(#endif) comment(/* MSDOS or _WIN32 or __human68k__ or __EMX__ */) + +preprocessor(#ifndef) ident(__MACOS__) + reserved(if) operator(()ident(stat)operator(()ident(fbuf)operator(,) operator(&)ident(st)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(exe_flag) operator(==) integer(0)operator(\)) reserved(return) ident(fbuf)operator(;) + comment(/* looking for executable */) + reserved(if) operator((!)ident(S_ISDIR)operator(()ident(st)operator(.)ident(st_mode)operator(\)) operator(&&) ident(eaccess)operator(()ident(fbuf)operator(,) ident(X_OK)operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(fbuf)operator(;) + operator(}) +preprocessor(#else) + reserved(if) operator(()ident(mac_fullpath) operator(=) ident(_macruby_exist_file_in_libdir_as_posix_name)operator(()ident(fbuf)operator(\)\)) operator({) + reserved(if) operator(()ident(exe_flag) operator(==) integer(0)operator(\)) reserved(return) ident(mac_fullpath)operator(;) + comment(/* looking for executable */) + reserved(if) operator(()ident(stat)operator(()ident(mac_fullpath)operator(,) operator(&)ident(st)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator((!)ident(S_ISDIR)operator(()ident(st)operator(.)ident(st_mode)operator(\)) operator(&&) ident(eaccess)operator(()ident(mac_fullpath)operator(,) ident(X_OK)operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(mac_fullpath)operator(;) + operator(}) + operator(}) +preprocessor(#endif) + + label(next)operator(:) + comment(/* if not, and no other alternatives, life is bleak */) + reserved(if) operator((*)ident(ep) operator(==) char('\\0')operator(\)) operator({) + reserved(return) pre_constant(NULL)operator(;) + operator(}) + + comment(/* otherwise try the next component in the search path */) + operator(}) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(__VMS)operator(\)) + +comment(/* action routine for decc$to_vms */) +directive(static) pre_type(int) ident(vms_fileact)operator(()pre_type(char) operator(*)ident(filespec)operator(,) pre_type(int) ident(type)operator(\)) +operator({) + reserved(if) operator(()ident(vms_filespec)operator(\)) + ident(free)operator(()ident(vms_filespec)operator(\);) + ident(vms_filespec) operator(=) ident(malloc)operator(()ident(strlen)operator(()ident(filespec)operator(\)+)integer(1)operator(\);) + ident(strcpy)operator(()ident(vms_filespec)operator(,) ident(filespec)operator(\);) + reserved(return) integer(1)operator(;) +operator(}) + +comment(/* exception handler for LIB$FIND_IMAGE_SYMBOL */) +directive(static) pre_type(long) ident(vms_fisexh)operator(()pre_type(long) operator(*)ident(sigarr)operator(,) pre_type(long) operator(*)ident(mecarr)operator(\)) +operator({) + ident(sys)ident($)ident(unwind)operator(()integer(1)operator(,) integer(0)operator(\);) + reserved(return) integer(1)operator(;) +operator(}) + +preprocessor(#endif) comment(/* __VMS */) +preprocessor(#define) ident(NO_DLN_LOAD) integer(1) +preprocessor(#include) include("dln.c") +directive(void) +ident(Init_ext)operator((\)) +operator({) +operator(}) +comment(/********************************************************************** + + enum.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Fri Oct 1 15:15:19 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("node.h") +preprocessor(#include) include("util.h") + +ident(VALUE) ident(rb_mEnumerable)operator(;) +directive(static) ident(ID) ident(id_each)operator(,) ident(id_eqq)operator(,) ident(id_cmp)operator(;) + +ident(VALUE) +ident(rb_each)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(obj)operator(,) ident(id_each)operator(,) integer(0)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(grep_i)operator(()ident(i)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(i)operator(,) operator(*)ident(arg)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(arg)operator([)integer(0)operator(],) ident(id_eqq)operator(,) integer(1)operator(,) ident(i)operator(\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(arg)operator([)integer(1)operator(],) ident(i)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(grep_iter_i)operator(()ident(i)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(i)operator(,) operator(*)ident(arg)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(arg)operator([)integer(0)operator(],) ident(id_eqq)operator(,) integer(1)operator(,) ident(i)operator(\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(arg)operator([)integer(1)operator(],) ident(rb_yield)operator(()ident(i)operator(\)\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.grep(pattern\) => array + * enum.grep(pattern\) {| obj | block } => array + * + * Returns an array of every element in <i>enum</i> for which + * <code>Pattern === element</code>. If the optional <em>block</em> is + * supplied, each matching element is passed to it, and the block's + * result is stored in the output array. + * + * (1..100\).grep 38..44 #=> [38, 39, 40, 41, 42, 43, 44] + * c = IO.constants + * c.grep(/SEEK/\) #=> ["SEEK_END", "SEEK_SET", "SEEK_CUR"] + * res = c.grep(/SEEK/\) {|v| IO.const_get(v\) } + * res #=> [2, 0, 1] + * + */) + +directive(static) ident(VALUE) +ident(enum_grep)operator(()ident(obj)operator(,) ident(pat)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(pat)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + ident(VALUE) ident(arg)operator([)integer(2)operator(];) + + ident(arg)operator([)integer(0)operator(]) operator(=) ident(pat)operator(;) + ident(arg)operator([)integer(1)operator(]) operator(=) ident(ary)operator(;) + + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(rb_block_given_p)operator((\)) operator(?) ident(grep_iter_i) operator(:) ident(grep_i)operator(,) operator(()ident(VALUE)operator(\))ident(arg)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(find_i)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield)operator(()ident(i)operator(\)\)\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + ident(rb_iter_break)operator((\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.detect(ifnone = nil\) {| obj | block } => obj or nil + * enum.find(ifnone = nil\) {| obj | block } => obj or nil + * + * Passes each entry in <i>enum</i> to <em>block</em>. Returns the + * first for which <em>block</em> is not <code>false</code>. If no + * object matches, calls <i>ifnone</i> and returns its result when it + * is specified, or returns <code>nil</code> + * + * (1..10\).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> nil + * (1..100\).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> 35 + * + */) + +directive(static) ident(VALUE) +ident(enum_find)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE)operator(*) ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(memo) operator(=) ident(Qundef)operator(;) + ident(VALUE) ident(if_none)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(if_none)operator(\);) + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(find_i)operator(,) operator(()ident(VALUE)operator(\)&)ident(memo)operator(\);) + reserved(if) operator(()ident(memo) operator(!=) ident(Qundef)operator(\)) operator({) + reserved(return) ident(memo)operator(;) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(if_none)operator(\)\)) operator({) + reserved(return) ident(rb_funcall)operator(()ident(if_none)operator(,) ident(rb_intern)operator(()string<delimiter(")content(call)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(find_all_i)operator(()ident(i)operator(,) ident(ary)operator(\)) + ident(VALUE) ident(i)operator(,) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield)operator(()ident(i)operator(\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(i)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.find_all {| obj | block } => array + * enum.select {| obj | block } => array + * + * Returns an array containing all elements of <i>enum</i> for which + * <em>block</em> is not <code>false</code> (see also + * <code>Enumerable#reject</code>\). + * + * (1..10\).find_all {|i| i % 3 == 0 } #=> [3, 6, 9] + * + */) + +directive(static) ident(VALUE) +ident(enum_find_all)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(find_all_i)operator(,) ident(ary)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(reject_i)operator(()ident(i)operator(,) ident(ary)operator(\)) + ident(VALUE) ident(i)operator(,) ident(ary)operator(;) +operator({) + reserved(if) operator((!)ident(RTEST)operator(()ident(rb_yield)operator(()ident(i)operator(\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(i)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.reject {| obj | block } => array + * + * Returns an array for all elements of <i>enum</i> for which + * <em>block</em> is false (see also <code>Enumerable#find_all</code>\). + * + * (1..10\).reject {|i| i % 3 == 0 } #=> [1, 2, 4, 5, 7, 8, 10] + * + */) + +directive(static) ident(VALUE) +ident(enum_reject)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(reject_i)operator(,) ident(ary)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(collect_i)operator(()ident(i)operator(,) ident(ary)operator(\)) + ident(VALUE) ident(i)operator(,) ident(ary)operator(;) +operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_yield)operator(()ident(i)operator(\)\);) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(collect_all)operator(()ident(i)operator(,) ident(ary)operator(\)) + ident(VALUE) ident(i)operator(,) ident(ary)operator(;) +operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(i)operator(\);) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.collect {| obj | block } => array + * enum.map {| obj | block } => array + * + * Returns a new array with the results of running <em>block</em> once + * for every element in <i>enum</i>. + * + * (1..4\).collect {|i| i*i } #=> [1, 4, 9, 16] + * (1..4\).collect { "cat" } #=> ["cat", "cat", "cat", "cat"] + * + */) + +directive(static) ident(VALUE) +ident(enum_collect)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(rb_block_given_p)operator((\)) operator(?) ident(collect_i) operator(:) ident(collect_all)operator(,) ident(ary)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.to_a => array + * enum.entries => array + * + * Returns an array containing the items in <i>enum</i>. + * + * (1..7\).to_a #=> [1, 2, 3, 4, 5, 6, 7] + * { 'a'=>1, 'b'=>2, 'c'=>3 }.to_a #=> [["a", 1], ["b", 2], ["c", 3]] + */) +directive(static) ident(VALUE) +ident(enum_to_a)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(collect_all)operator(,) ident(ary)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(inject_i)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + reserved(if) operator((*)ident(memo) operator(==) ident(Qundef)operator(\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + operator(}) + reserved(else) operator({) + operator(*)ident(memo) operator(=) ident(rb_yield_values)operator(()integer(2)operator(,) operator(*)ident(memo)operator(,) ident(i)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.inject(initial\) {| memo, obj | block } => obj + * enum.inject {| memo, obj | block } => obj + * + * Combines the elements of <i>enum</i> by applying the block to an + * accumulator value (<i>memo</i>\) and each element in turn. At each + * step, <i>memo</i> is set to the value returned by the block. The + * first form lets you supply an initial value for <i>memo</i>. The + * second form uses the first element of the collection as a the + * initial value (and skips that element while iterating\). + * + * # Sum some numbers + * (5..10\).inject {|sum, n| sum + n } #=> 45 + * # Multiply some numbers + * (5..10\).inject(1\) {|product, n| product * n } #=> 151200 + * + * # find the longest word + * longest = %w{ cat sheep bear }.inject do |memo,word| + * memo.length > word.length ? memo : word + * end + * longest #=> "sheep" + * + * # find the length of the longest word + * longest = %w{ cat sheep bear }.inject(0\) do |memo,word| + * memo >= word.length ? memo : word.length + * end + * longest #=> 5 + * + */) + +directive(static) ident(VALUE) +ident(enum_inject)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(,) ident(obj)operator(;) +operator({) + ident(VALUE) ident(memo) operator(=) ident(Qundef)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(memo)operator(\)) operator(==) integer(0)operator(\)) + ident(memo) operator(=) ident(Qundef)operator(;) + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(inject_i)operator(,) operator(()ident(VALUE)operator(\)&)ident(memo)operator(\);) + reserved(if) operator(()ident(memo) operator(==) ident(Qundef)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(memo)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(partition_i)operator(()ident(i)operator(,) ident(ary)operator(\)) + ident(VALUE) ident(i)operator(,) operator(*)ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield)operator(()ident(i)operator(\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator([)integer(0)operator(],) ident(i)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_ary_push)operator(()ident(ary)operator([)integer(1)operator(],) ident(i)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.partition {| obj | block } => [ true_array, false_array ] + * + * Returns two arrays, the first containing the elements of + * <i>enum</i> for which the block evaluates to true, the second + * containing the rest. + * + * (1..6\).partition {|i| (i&1\).zero?} #=> [[2, 4, 6], [1, 3, 5]] + * + */) + +directive(static) ident(VALUE) +ident(enum_partition)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(ary)operator([)integer(2)operator(];) + + ident(ary)operator([)integer(0)operator(]) operator(=) ident(rb_ary_new)operator((\);) + ident(ary)operator([)integer(1)operator(]) operator(=) ident(rb_ary_new)operator((\);) + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(partition_i)operator(,) operator(()ident(VALUE)operator(\))ident(ary)operator(\);) + + reserved(return) ident(rb_assoc_new)operator(()ident(ary)operator([)integer(0)operator(],) ident(ary)operator([)integer(1)operator(]\);) +operator(}) + +comment(/* + * call-seq: + * enum.sort => array + * enum.sort {| a, b | block } => array + * + * Returns an array containing the items in <i>enum</i> sorted, + * either according to their own <code><=></code> method, or by using + * the results of the supplied block. The block should return -1, 0, or + * +1 depending on the comparison between <i>a</i> and <i>b</i>. As of + * Ruby 1.8, the method <code>Enumerable#sort_by</code> implements a + * built-in Schwartzian Transform, useful when key computation or + * comparison is expensive.. + * + * %w(rhea kea flea\).sort #=> ["flea", "kea", "rhea"] + * (1..10\).sort {|a,b| b <=> a} #=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] + */) + +directive(static) ident(VALUE) +ident(enum_sort)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_ary_sort)operator(()ident(enum_to_a)operator(()ident(obj)operator(\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(sort_by_i)operator(()ident(i)operator(,) ident(ary)operator(\)) + ident(VALUE) ident(i)operator(,) ident(ary)operator(;) +operator({) + ident(VALUE) ident(v)operator(;) + ident(NODE) operator(*)ident(memo)operator(;) + + ident(v) operator(=) ident(rb_yield)operator(()ident(i)operator(\);) + reserved(if) operator(()ident(RBASIC)operator(()ident(ary)operator(\)->)ident(klass)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(sort_by reentered)delimiter(")>operator(\);) + operator(}) + ident(memo) operator(=) ident(rb_node_newnode)operator(()ident(NODE_MEMO)operator(,) ident(v)operator(,) ident(i)operator(,) integer(0)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) operator(()ident(VALUE)operator(\))ident(memo)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(sort_by_cmp)operator(()ident(aa)operator(,) ident(bb)operator(\)) + ident(NODE) operator(**)ident(aa)operator(,) operator(**)ident(bb)operator(;) +operator({) + ident(VALUE) ident(a) operator(=) ident(aa)operator([)integer(0)operator(]->)ident(u1)operator(.)ident(value)operator(;) + ident(VALUE) ident(b) operator(=) ident(bb)operator([)integer(0)operator(]->)ident(u1)operator(.)ident(value)operator(;) + + reserved(return) ident(rb_cmpint)operator(()ident(rb_funcall)operator(()ident(a)operator(,) ident(id_cmp)operator(,) integer(1)operator(,) ident(b)operator(\),) ident(a)operator(,) ident(b)operator(\);) +operator(}) + +comment(/* + * call-seq: + * enum.sort_by {| obj | block } => array + * + * Sorts <i>enum</i> using a set of keys generated by mapping the + * values in <i>enum</i> through the given block. + * + * %w{ apple pear fig }.sort_by {|word| word.length} + #=> ["fig", "pear", "apple"] + * + * The current implementation of <code>sort_by</code> generates an + * array of tuples containing the original collection element and the + * mapped value. This makes <code>sort_by</code> fairly expensive when + * the keysets are simple + * + * require 'benchmark' + * include Benchmark + * + * a = (1..100000\).map {rand(100000\)} + * + * bm(10\) do |b| + * b.report("Sort"\) { a.sort } + * b.report("Sort by"\) { a.sort_by {|a| a} } + * end + * + * <em>produces:</em> + * + * user system total real + * Sort 0.180000 0.000000 0.180000 ( 0.175469\) + * Sort by 1.980000 0.040000 2.020000 ( 2.013586\) + * + * However, consider the case where comparing the keys is a non-trivial + * operation. The following code sorts some files on modification time + * using the basic <code>sort</code> method. + * + * files = Dir["*"] + * sorted = files.sort {|a,b| File.new(a\).mtime <=> File.new(b\).mtime} + * sorted #=> ["mon", "tues", "wed", "thurs"] + * + * This sort is inefficient: it generates two new <code>File</code> + * objects during every comparison. A slightly better technique is to + * use the <code>Kernel#test</code> method to generate the modification + * times directly. + * + * files = Dir["*"] + * sorted = files.sort { |a,b| + * test(?M, a\) <=> test(?M, b\) + * } + * sorted #=> ["mon", "tues", "wed", "thurs"] + * + * This still generates many unnecessary <code>Time</code> objects. A + * more efficient technique is to cache the sort keys (modification + * times in this case\) before the sort. Perl users often call this + * approach a Schwartzian Transform, after Randal Schwartz. We + * construct a temporary array, where each element is an array + * containing our sort key along with the filename. We sort this array, + * and then extract the filename from the result. + * + * sorted = Dir["*"].collect { |f| + * [test(?M, f\), f] + * }.sort.collect { |f| f[1] } + * sorted #=> ["mon", "tues", "wed", "thurs"] + * + * This is exactly what <code>sort_by</code> does internally. + * + * sorted = Dir["*"].sort_by {|f| test(?M, f\)} + * sorted #=> ["mon", "tues", "wed", "thurs"] + */) + +directive(static) ident(VALUE) +ident(enum_sort_by)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(obj)operator(\)) operator(==) ident(T_ARRAY)operator(\)) operator({) + ident(ary) operator(=) ident(rb_ary_new2)operator(()ident(RARRAY)operator(()ident(obj)operator(\)->)ident(len)operator(\);) + operator(}) + reserved(else) operator({) + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + operator(}) + ident(RBASIC)operator(()ident(ary)operator(\)->)ident(klass) operator(=) integer(0)operator(;) + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(sort_by_i)operator(,) ident(ary)operator(\);) + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(>) integer(1)operator(\)) operator({) + ident(qsort)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(,) reserved(sizeof)operator(()ident(VALUE)operator(\),) ident(sort_by_cmp)operator(,) integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(RBASIC)operator(()ident(ary)operator(\)->)ident(klass)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(sort_by reentered)delimiter(")>operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(RNODE)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)->)ident(u2)operator(.)ident(value)operator(;) + operator(}) + ident(RBASIC)operator(()ident(ary)operator(\)->)ident(klass) operator(=) ident(rb_cArray)operator(;) + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(all_iter_i)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + reserved(if) operator((!)ident(RTEST)operator(()ident(rb_yield)operator(()ident(i)operator(\)\)\)) operator({) + operator(*)ident(memo) operator(=) ident(Qfalse)operator(;) + ident(rb_iter_break)operator((\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(all_i)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + reserved(if) operator((!)ident(RTEST)operator(()ident(i)operator(\)\)) operator({) + operator(*)ident(memo) operator(=) ident(Qfalse)operator(;) + ident(rb_iter_break)operator((\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.all? [{|obj| block } ] => true or false + * + * Passes each element of the collection to the given block. The method + * returns <code>true</code> if the block never returns + * <code>false</code> or <code>nil</code>. If the block is not given, + * Ruby adds an implicit block of <code>{|obj| obj}</code> (that is + * <code>all?</code> will return <code>true</code> only if none of the + * collection members are <code>false</code> or <code>nil</code>.\) + * + * %w{ ant bear cat}.all? {|word| word.length >= 3} #=> true + * %w{ ant bear cat}.all? {|word| word.length >= 4} #=> false + * [ nil, true, 99 ].all? #=> false + * + */) + +directive(static) ident(VALUE) +ident(enum_all)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(Qtrue)operator(;) + + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(rb_block_given_p)operator((\)) operator(?) ident(all_iter_i) operator(:) ident(all_i)operator(,) operator(()ident(VALUE)operator(\)&)ident(result)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(any_iter_i)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield)operator(()ident(i)operator(\)\)\)) operator({) + operator(*)ident(memo) operator(=) ident(Qtrue)operator(;) + ident(rb_iter_break)operator((\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(any_i)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(i)operator(\)\)) operator({) + operator(*)ident(memo) operator(=) ident(Qtrue)operator(;) + ident(rb_iter_break)operator((\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.any? [{|obj| block } ] => true or false + * + * Passes each element of the collection to the given block. The method + * returns <code>true</code> if the block ever returns a value other + * than <code>false</code> or <code>nil</code>. If the block is not + * given, Ruby adds an implicit block of <code>{|obj| obj}</code> (that + * is <code>any?</code> will return <code>true</code> if at least one + * of the collection members is not <code>false</code> or + * <code>nil</code>. + * + * %w{ ant bear cat}.any? {|word| word.length >= 3} #=> true + * %w{ ant bear cat}.any? {|word| word.length >= 4} #=> true + * [ nil, true, 99 ].any? #=> true + * + */) + +directive(static) ident(VALUE) +ident(enum_any)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(Qfalse)operator(;) + + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(rb_block_given_p)operator((\)) operator(?) ident(any_iter_i) operator(:) ident(any_i)operator(,) operator(()ident(VALUE)operator(\)&)ident(result)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(min_i)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + ident(VALUE) ident(cmp)operator(;) + + reserved(if) operator((*)ident(memo) operator(==) ident(Qundef)operator(\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + operator(}) + reserved(else) operator({) + ident(cmp) operator(=) ident(rb_funcall)operator(()ident(i)operator(,) ident(id_cmp)operator(,) integer(1)operator(,) operator(*)ident(memo)operator(\);) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(cmp)operator(,) ident(i)operator(,) operator(*)ident(memo)operator(\)) operator(<) integer(0)operator(\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(min_ii)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + ident(VALUE) ident(cmp)operator(;) + + reserved(if) operator((*)ident(memo) operator(==) ident(Qundef)operator(\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + operator(}) + reserved(else) operator({) + ident(cmp) operator(=) ident(rb_yield_values)operator(()integer(2)operator(,) ident(i)operator(,) operator(*)ident(memo)operator(\);) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(cmp)operator(,) ident(i)operator(,) operator(*)ident(memo)operator(\)) operator(<) integer(0)operator(\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * enum.min => obj + * enum.min {| a,b | block } => obj + * + * Returns the object in <i>enum</i> with the minimum value. The + * first form assumes all objects implement <code>Comparable</code>; + * the second uses the block to return <em>a <=> b</em>. + * + * a = %w(albatross dog horse\) + * a.min #=> "albatross" + * a.min {|a,b| a.length <=> b.length } #=> "dog" + */) + +directive(static) ident(VALUE) +ident(enum_min)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(Qundef)operator(;) + + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(rb_block_given_p)operator((\)) operator(?) ident(min_ii) operator(:) ident(min_i)operator(,) operator(()ident(VALUE)operator(\)&)ident(result)operator(\);) + reserved(if) operator(()ident(result) operator(==) ident(Qundef)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.max => obj + * enum.max {| a,b | block } => obj + * + * Returns the object in <i>enum</i> with the maximum value. The + * first form assumes all objects implement <code>Comparable</code>; + * the second uses the block to return <em>a <=> b</em>. + * + * a = %w(albatross dog horse\) + * a.max #=> "horse" + * a.max {|a,b| a.length <=> b.length } #=> "albatross" + */) + +directive(static) ident(VALUE) +ident(max_i)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + ident(VALUE) ident(cmp)operator(;) + + reserved(if) operator((*)ident(memo) operator(==) ident(Qundef)operator(\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + operator(}) + reserved(else) operator({) + ident(cmp) operator(=) ident(rb_funcall)operator(()ident(i)operator(,) ident(id_cmp)operator(,) integer(1)operator(,) operator(*)ident(memo)operator(\);) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(cmp)operator(,) ident(i)operator(,) operator(*)ident(memo)operator(\)) operator(>) integer(0)operator(\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(max_ii)operator(()ident(i)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(i)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + ident(VALUE) ident(cmp)operator(;) + + reserved(if) operator((*)ident(memo) operator(==) ident(Qundef)operator(\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + operator(}) + reserved(else) operator({) + ident(cmp) operator(=) ident(rb_yield_values)operator(()integer(2)operator(,) ident(i)operator(,) operator(*)ident(memo)operator(\);) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(cmp)operator(,) ident(i)operator(,) operator(*)ident(memo)operator(\)) operator(>) integer(0)operator(\)) operator({) + operator(*)ident(memo) operator(=) ident(i)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.max => obj + * enum.max {|a,b| block } => obj + * + * Returns the object in _enum_ with the maximum value. The + * first form assumes all objects implement <code>Comparable</code>; + * the second uses the block to return <em>a <=> b</em>. + * + * a = %w(albatross dog horse\) + * a.max #=> "horse" + * a.max {|a,b| a.length <=> b.length } #=> "albatross" + */) + +directive(static) ident(VALUE) +ident(enum_max)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(Qundef)operator(;) + + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(rb_block_given_p)operator((\)) operator(?) ident(max_ii) operator(:) ident(max_i)operator(,) operator(()ident(VALUE)operator(\)&)ident(result)operator(\);) + reserved(if) operator(()ident(result) operator(==) ident(Qundef)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(member_i)operator(()ident(item)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(item)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + reserved(if) operator(()ident(rb_equal)operator(()ident(item)operator(,) ident(memo)operator([)integer(0)operator(]\)\)) operator({) + ident(memo)operator([)integer(1)operator(]) operator(=) ident(Qtrue)operator(;) + ident(rb_iter_break)operator((\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.include?(obj\) => true or false + * enum.member?(obj\) => true or false + * + * Returns <code>true</code> if any member of <i>enum</i> equals + * <i>obj</i>. Equality is tested using <code>==</code>. + * + * IO.constants.include? "SEEK_SET" #=> true + * IO.constants.include? "SEEK_NO_FURTHER" #=> false + * + */) + +directive(static) ident(VALUE) +ident(enum_member)operator(()ident(obj)operator(,) ident(val)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(val)operator(;) +operator({) + ident(VALUE) ident(memo)operator([)integer(2)operator(];) + + ident(memo)operator([)integer(0)operator(]) operator(=) ident(val)operator(;) + ident(memo)operator([)integer(1)operator(]) operator(=) ident(Qfalse)operator(;) + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(member_i)operator(,) operator(()ident(VALUE)operator(\))ident(memo)operator(\);) + reserved(return) ident(memo)operator([)integer(1)operator(];) +operator(}) + +directive(static) ident(VALUE) +ident(each_with_index_i)operator(()ident(val)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + ident(rb_yield_values)operator(()integer(2)operator(,) ident(val)operator(,) ident(INT2FIX)operator((*)ident(memo)operator(\)\);) + operator(++*)ident(memo)operator(;) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.each_with_index {|obj, i| block } -> enum + * + * Calls <em>block</em> with two arguments, the item and its index, for + * each item in <i>enum</i>. + * + * hash = Hash.new + * %w(cat dog wombat\).each_with_index {|item, index| + * hash[item] = index + * } + * hash #=> {"cat"=>0, "wombat"=>2, "dog"=>1} + * + */) + +directive(static) ident(VALUE) +ident(enum_each_with_index)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(memo) operator(=) integer(0)operator(;) + + ident(rb_need_block)operator((\);) + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(each_with_index_i)operator(,) operator(()ident(VALUE)operator(\)&)ident(memo)operator(\);) + reserved(return) ident(obj)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(zip_i)operator(()ident(val)operator(,) ident(memo)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(VALUE) operator(*)ident(memo)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(memo)operator([)integer(0)operator(];) + ident(VALUE) ident(args) operator(=) ident(memo)operator([)integer(1)operator(];) + pre_type(int) ident(idx) operator(=) ident(memo)operator([)integer(2)operator(]++;) + ident(VALUE) ident(tmp)operator(;) + pre_type(int) ident(i)operator(;) + + ident(tmp) operator(=) ident(rb_ary_new2)operator(()ident(RARRAY)operator(()ident(args)operator(\)->)ident(len) operator(+) integer(1)operator(\);) + ident(rb_ary_store)operator(()ident(tmp)operator(,) integer(0)operator(,) ident(val)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(args)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(tmp)operator(,) ident(rb_ary_entry)operator(()ident(RARRAY)operator(()ident(args)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(idx)operator(\)\);) + operator(}) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_yield)operator(()ident(tmp)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(tmp)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * enum.zip(arg, ...\) => array + * enum.zip(arg, ...\) {|arr| block } => nil + * + * Converts any arguments to arrays, then merges elements of + * <i>enum</i> with corresponding elements from each argument. This + * generates a sequence of <code>enum#size</code> <em>n</em>-element + * arrays, where <em>n</em> is one more that the count of arguments. If + * the size of any argument is less than <code>enum#size</code>, + * <code>nil</code> values are supplied. If a block given, it is + * invoked for each output array, otherwise an array of arrays is + * returned. + * + * a = [ 4, 5, 6 ] + * b = [ 7, 8, 9 ] + * + * (1..3\).zip(a, b\) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] + * "cat\\ndog".zip([1]\) #=> [["cat\\n", 1], ["dog", nil]] + * (1..3\).zip #=> [[1], [2], [3]] + * + */) + +directive(static) ident(VALUE) +ident(enum_zip)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + ident(VALUE) ident(result)operator(;) + ident(VALUE) ident(memo)operator([)integer(3)operator(];) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(argv)operator([)ident(i)operator(]) operator(=) ident(rb_convert_type)operator(()ident(argv)operator([)ident(i)operator(],) ident(T_ARRAY)operator(,) string<delimiter(")content(Array)delimiter(")>operator(,) string<delimiter(")content(to_a)delimiter(")>operator(\);) + operator(}) + ident(result) operator(=) ident(rb_block_given_p)operator((\)) operator(?) ident(Qnil) operator(:) ident(rb_ary_new)operator((\);) + ident(memo)operator([)integer(0)operator(]) operator(=) ident(result)operator(;) + ident(memo)operator([)integer(1)operator(]) operator(=) ident(rb_ary_new4)operator(()ident(argc)operator(,) ident(argv)operator(\);) + ident(memo)operator([)integer(2)operator(]) operator(=) integer(0)operator(;) + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(obj)operator(,) ident(zip_i)operator(,) operator(()ident(VALUE)operator(\))ident(memo)operator(\);) + + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * The <code>Enumerable</code> mixin provides collection classes with + * several traversal and searching methods, and with the ability to + * sort. The class must provide a method <code>each</code>, which + * yields successive members of the collection. If + * <code>Enumerable#max</code>, <code>#min</code>, or + * <code>#sort</code> is used, the objects in the collection must also + * implement a meaningful <code><=></code> operator, as these methods + * rely on an ordering between members of the collection. + */) + +directive(void) +ident(Init_Enumerable)operator((\)) +operator({) + ident(rb_mEnumerable) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(Enumerable)delimiter(")>operator(\);) + + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(to_a)delimiter(")>operator(,) ident(enum_to_a)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(entries)delimiter(")>operator(,) ident(enum_to_a)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(sort)delimiter(")>operator(,) ident(enum_sort)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(sort_by)delimiter(")>operator(,) ident(enum_sort_by)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(grep)delimiter(")>operator(,) ident(enum_grep)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(find)delimiter(")>operator(,) ident(enum_find)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(detect)delimiter(")>operator(,) ident(enum_find)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(find_all)delimiter(")>operator(,) ident(enum_find_all)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(select)delimiter(")>operator(,) ident(enum_find_all)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(reject)delimiter(")>operator(,) ident(enum_reject)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(collect)delimiter(")>operator(,) ident(enum_collect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(map)delimiter(")>operator(,) ident(enum_collect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(inject)delimiter(")>operator(,) ident(enum_inject)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(partition)delimiter(")>operator(,) ident(enum_partition)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(all?)delimiter(")>operator(,) ident(enum_all)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(any?)delimiter(")>operator(,) ident(enum_any)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(min)delimiter(")>operator(,) ident(enum_min)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(max)delimiter(")>operator(,) ident(enum_max)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(member?)delimiter(")>operator(,) ident(enum_member)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(include?)delimiter(")>operator(,) ident(enum_member)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,)string<delimiter(")content(each_with_index)delimiter(")>operator(,) ident(enum_each_with_index)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mEnumerable)operator(,) string<delimiter(")content(zip)delimiter(")>operator(,) ident(enum_zip)operator(,) operator(-)integer(1)operator(\);) + + ident(id_eqq) operator(=) ident(rb_intern)operator(()string<delimiter(")content(===)delimiter(")>operator(\);) + ident(id_each) operator(=) ident(rb_intern)operator(()string<delimiter(")content(each)delimiter(")>operator(\);) + ident(id_cmp) operator(=) ident(rb_intern)operator(()string<delimiter(")content(<=>)delimiter(")>operator(\);) +operator(}) + +comment(/********************************************************************** + + error.c - + + $Author: shyouhei $ + $Date: 2008-08-04 05:16:55 +0200 (Mon, 04 Aug 2008\) $ + created at: Mon Aug 9 16:11:34 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("env.h") +preprocessor(#include) include("st.h") + +preprocessor(#include) include(<stdio.h>) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(#include) include(<stdarg.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(,)ident(b)operator(\)) +preprocessor(#else) +preprocessor(#include) include(<varargs.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(\)) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_STDLIB_H) +preprocessor(#include) include(<stdlib.h>) +preprocessor(#endif) +preprocessor(#ifndef) ident(EXIT_SUCCESS) +preprocessor(#define) ident(EXIT_SUCCESS) integer(0) +preprocessor(#endif) + +directive(extern) directive(const) pre_type(char) ident(ruby_version)operator([],) ident(ruby_release_date)operator([],) ident(ruby_platform)operator([];) + +pre_type(int) ident(ruby_nerrs)operator(;) + +directive(static) pre_type(int) +ident(err_position)operator(()ident(buf)operator(,) ident(len)operator(\)) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + ident(ruby_set_current_source)operator((\);) + reserved(if) operator((!)ident(ruby_sourcefile)operator(\)) operator({) + reserved(return) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ruby_sourceline) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(snprintf)operator(()ident(buf)operator(,) ident(len)operator(,) string<delimiter(")content(%s: )delimiter(")>operator(,) ident(ruby_sourcefile)operator(\);) + operator(}) + reserved(else) operator({) + reserved(return) ident(snprintf)operator(()ident(buf)operator(,) ident(len)operator(,) string<delimiter(")content(%s:%d: )delimiter(")>operator(,) ident(ruby_sourcefile)operator(,) ident(ruby_sourceline)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(err_snprintf)operator(()ident(buf)operator(,) ident(len)operator(,) ident(fmt)operator(,) ident(args)operator(\)) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(long) ident(len)operator(;) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_list) ident(args)operator(;) +operator({) + pre_type(long) ident(n)operator(;) + + ident(n) operator(=) ident(err_position)operator(()ident(buf)operator(,) ident(len)operator(\);) + reserved(if) operator(()ident(len) operator(>) ident(n)operator(\)) operator({) + ident(vsnprintf)operator((()pre_type(char)operator(*\))ident(buf)operator(+)ident(n)operator(,) ident(len)operator(-)ident(n)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) ident(err_append) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +directive(static) directive(void) +ident(err_print)operator(()ident(fmt)operator(,) ident(args)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_list) ident(args)operator(;) +operator({) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + + ident(err_snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + ident(err_append)operator(()ident(buf)operator(\);) +operator(}) + +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_compile_error)operator(()directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_compile_error)operator(()ident(fmt)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(va_list) ident(args)operator(;) + + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(err_print)operator(()ident(fmt)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) + ident(ruby_nerrs)operator(++;) +operator(}) + +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_compile_error_append)operator(()directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_compile_error_append)operator(()ident(fmt)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(va_list) ident(args)operator(;) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(vsnprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) + ident(err_append)operator(()ident(buf)operator(\);) +operator(}) + +directive(static) directive(void) +ident(warn_print)operator(()ident(fmt)operator(,) ident(args)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_list) ident(args)operator(;) +operator({) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + pre_type(int) ident(len)operator(;) + + ident(err_snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + ident(len) operator(=) ident(strlen)operator(()ident(buf)operator(\);) + ident(buf)operator([)ident(len)operator(++]) operator(=) char('\\n')operator(;) + ident(rb_write_error2)operator(()ident(buf)operator(,) ident(len)operator(\);) +operator(}) + +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_warn)operator(()directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_warn)operator(()ident(fmt)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + ident(va_list) ident(args)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_verbose)operator(\)\)) reserved(return)operator(;) + + ident(snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) string<delimiter(")content(warning: %s)delimiter(")>operator(,) ident(fmt)operator(\);) + + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(warn_print)operator(()ident(buf)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) +operator(}) + +comment(/* rb_warning(\) reports only in verbose mode */) +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_warning)operator(()directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_warning)operator(()ident(fmt)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + ident(va_list) ident(args)operator(;) + + reserved(if) operator((!)ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)) reserved(return)operator(;) + + ident(snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) string<delimiter(")content(warning: %s)delimiter(")>operator(,) ident(fmt)operator(\);) + + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(warn_print)operator(()ident(buf)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) +operator(}) + +comment(/* + * call-seq: + * warn(msg\) => nil + * + * Display the given message (followed by a newline\) on STDERR unless + * warnings are disabled (for example with the <code>-W0</code> flag\). + */) + +directive(static) ident(VALUE) +ident(rb_warn_m)operator(()ident(self)operator(,) ident(mesg)operator(\)) + ident(VALUE) ident(self)operator(,) ident(mesg)operator(;) +operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(ruby_verbose)operator(\)\)) operator({) + ident(rb_io_write)operator(()ident(rb_stderr)operator(,) ident(mesg)operator(\);) + ident(rb_io_write)operator(()ident(rb_stderr)operator(,) ident(rb_default_rs)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_bug)operator(()directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_bug)operator(()ident(fmt)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + ident(va_list) ident(args)operator(;) + ident(FILE) operator(*)ident(out) operator(=) ident(stderr)operator(;) + pre_type(int) ident(len) operator(=) ident(err_position)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(\);) + + reserved(if) operator(()ident(fwrite)operator(()ident(buf)operator(,) integer(1)operator(,) ident(len)operator(,) ident(out)operator(\)) operator(==) ident(len) operator(||) + ident(fwrite)operator(()ident(buf)operator(,) integer(1)operator(,) ident(len)operator(,) operator(()ident(out) operator(=) ident(stdout)operator(\)\)) operator(==) ident(len)operator(\)) operator({) + ident(fputs)operator(()string<delimiter(")content([BUG] )delimiter(")>operator(,) ident(out)operator(\);) + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(vfprintf)operator(()ident(out)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) + ident(fprintf)operator(()ident(out)operator(,) string<delimiter(")char(\\n)content(ruby %s (%s\) [%s])char(\\n)char(\\n)delimiter(")>operator(,) + ident(ruby_version)operator(,) ident(ruby_release_date)operator(,) ident(ruby_platform)operator(\);) + operator(}) + ident(abort)operator((\);) +operator(}) + +directive(static) reserved(struct) ident(types) operator({) + pre_type(int) ident(type)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator(}) ident(builtin_types)operator([]) operator(=) operator({) + operator({)ident(T_NIL)operator(,) string<delimiter(")content(nil)delimiter(")>operator(},) + operator({)ident(T_OBJECT)operator(,) string<delimiter(")content(Object)delimiter(")>operator(},) + operator({)ident(T_CLASS)operator(,) string<delimiter(")content(Class)delimiter(")>operator(},) + operator({)ident(T_ICLASS)operator(,) string<delimiter(")content(iClass)delimiter(")>operator(},) comment(/* internal use: mixed-in module holder */) + operator({)ident(T_MODULE)operator(,) string<delimiter(")content(Module)delimiter(")>operator(},) + operator({)ident(T_FLOAT)operator(,) string<delimiter(")content(Float)delimiter(")>operator(},) + operator({)ident(T_STRING)operator(,) string<delimiter(")content(String)delimiter(")>operator(},) + operator({)ident(T_REGEXP)operator(,) string<delimiter(")content(Regexp)delimiter(")>operator(},) + operator({)ident(T_ARRAY)operator(,) string<delimiter(")content(Array)delimiter(")>operator(},) + operator({)ident(T_FIXNUM)operator(,) string<delimiter(")content(Fixnum)delimiter(")>operator(},) + operator({)ident(T_HASH)operator(,) string<delimiter(")content(Hash)delimiter(")>operator(},) + operator({)ident(T_STRUCT)operator(,) string<delimiter(")content(Struct)delimiter(")>operator(},) + operator({)ident(T_BIGNUM)operator(,) string<delimiter(")content(Bignum)delimiter(")>operator(},) + operator({)ident(T_FILE)operator(,) string<delimiter(")content(File)delimiter(")>operator(},) + operator({)ident(T_TRUE)operator(,) string<delimiter(")content(true)delimiter(")>operator(},) + operator({)ident(T_FALSE)operator(,) string<delimiter(")content(false)delimiter(")>operator(},) + operator({)ident(T_SYMBOL)operator(,) string<delimiter(")content(Symbol)delimiter(")>operator(},) comment(/* :symbol */) + operator({)ident(T_DATA)operator(,) string<delimiter(")content(Data)delimiter(")>operator(},) comment(/* internal use: wrapped C pointers */) + operator({)ident(T_MATCH)operator(,) string<delimiter(")content(MatchData)delimiter(")>operator(},) comment(/* data of $~ */) + operator({)ident(T_VARMAP)operator(,) string<delimiter(")content(Varmap)delimiter(")>operator(},) comment(/* internal use: dynamic variables */) + operator({)ident(T_SCOPE)operator(,) string<delimiter(")content(Scope)delimiter(")>operator(},) comment(/* internal use: variable scope */) + operator({)ident(T_NODE)operator(,) string<delimiter(")content(Node)delimiter(")>operator(},) comment(/* internal use: syntax tree node */) + operator({)ident(T_UNDEF)operator(,) string<delimiter(")content(undef)delimiter(")>operator(},) comment(/* internal use: #undef; should not happen */) + operator({-)integer(1)operator(,) integer(0)operator(}) +operator(};) + +directive(void) +ident(rb_check_type)operator(()ident(x)operator(,) ident(t)operator(\)) + ident(VALUE) ident(x)operator(;) + pre_type(int) ident(t)operator(;) +operator({) + reserved(struct) ident(types) operator(*)ident(type) operator(=) ident(builtin_types)operator(;) + + reserved(if) operator(()ident(x) operator(==) ident(Qundef)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(undef leaked to the Ruby space)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(TYPE)operator(()ident(x)operator(\)) operator(!=) ident(t)operator(\)) operator({) + reserved(while) operator(()ident(type)operator(->)ident(type) operator(>=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(type)operator(->)ident(type) operator(==) ident(t)operator(\)) operator({) + pre_type(char) operator(*)ident(etype)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(x)operator(\)\)) operator({) + ident(etype) operator(=) string<delimiter(")content(nil)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(FIXNUM_P)operator(()ident(x)operator(\)\)) operator({) + ident(etype) operator(=) string<delimiter(")content(Fixnum)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(SYMBOL_P)operator(()ident(x)operator(\)\)) operator({) + ident(etype) operator(=) string<delimiter(")content(Symbol)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(rb_special_const_p)operator(()ident(x)operator(\)\)) operator({) + ident(etype) operator(=) ident(RSTRING)operator(()ident(rb_obj_as_string)operator(()ident(x)operator(\)\)->)ident(ptr)operator(;) + operator(}) + reserved(else) operator({) + ident(etype) operator(=) ident(rb_obj_classname)operator(()ident(x)operator(\);) + operator(}) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type %s (expected %s\))delimiter(")>operator(,) + ident(etype)operator(,) ident(type)operator(->)ident(name)operator(\);) + operator(}) + ident(type)operator(++;) + operator(}) + ident(rb_bug)operator(()string<delimiter(")content(unknown type 0x%x)delimiter(")>operator(,) ident(t)operator(\);) + operator(}) +operator(}) + +comment(/* exception classes */) +preprocessor(#include) include(<errno.h>) + +ident(VALUE) ident(rb_eException)operator(;) +ident(VALUE) ident(rb_eSystemExit)operator(;) +ident(VALUE) ident(rb_eInterrupt)operator(;) +ident(VALUE) ident(rb_eSignal)operator(;) +ident(VALUE) ident(rb_eFatal)operator(;) +ident(VALUE) ident(rb_eStandardError)operator(;) +ident(VALUE) ident(rb_eRuntimeError)operator(;) +ident(VALUE) ident(rb_eTypeError)operator(;) +ident(VALUE) ident(rb_eArgError)operator(;) +ident(VALUE) ident(rb_eIndexError)operator(;) +ident(VALUE) ident(rb_eRangeError)operator(;) +ident(VALUE) ident(rb_eNameError)operator(;) +ident(VALUE) ident(rb_eNoMethodError)operator(;) +ident(VALUE) ident(rb_eSecurityError)operator(;) +ident(VALUE) ident(rb_eNotImpError)operator(;) +ident(VALUE) ident(rb_eNoMemError)operator(;) +ident(VALUE) ident(rb_cNameErrorMesg)operator(;) + +ident(VALUE) ident(rb_eScriptError)operator(;) +ident(VALUE) ident(rb_eSyntaxError)operator(;) +ident(VALUE) ident(rb_eLoadError)operator(;) + +ident(VALUE) ident(rb_eSystemCallError)operator(;) +ident(VALUE) ident(rb_mErrno)operator(;) + +ident(VALUE) +ident(rb_exc_new)operator(()ident(etype)operator(,) ident(ptr)operator(,) ident(len)operator(\)) + ident(VALUE) ident(etype)operator(;) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(etype)operator(,) ident(rb_intern)operator(()string<delimiter(")content(new)delimiter(")>operator(\),) integer(1)operator(,) ident(rb_str_new)operator(()ident(ptr)operator(,) ident(len)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_exc_new2)operator(()ident(etype)operator(,) ident(s)operator(\)) + ident(VALUE) ident(etype)operator(;) + directive(const) pre_type(char) operator(*)ident(s)operator(;) +operator({) + reserved(return) ident(rb_exc_new)operator(()ident(etype)operator(,) ident(s)operator(,) ident(strlen)operator(()ident(s)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_exc_new3)operator(()ident(etype)operator(,) ident(str)operator(\)) + ident(VALUE) ident(etype)operator(,) ident(str)operator(;) +operator({) + ident(StringValue)operator(()ident(str)operator(\);) + reserved(return) ident(rb_funcall)operator(()ident(etype)operator(,) ident(rb_intern)operator(()string<delimiter(")content(new)delimiter(")>operator(\),) integer(1)operator(,) ident(str)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Exception.new(msg = nil\) => exception + * + * Construct a new Exception object, optionally passing in + * a message. + */) + +directive(static) ident(VALUE) +ident(exc_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(exc)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(exc)operator(;) +operator({) + ident(VALUE) ident(arg)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(arg)operator(\);) + ident(rb_iv_set)operator(()ident(exc)operator(,) string<delimiter(")content(mesg)delimiter(")>operator(,) ident(arg)operator(\);) + ident(rb_iv_set)operator(()ident(exc)operator(,) string<delimiter(")content(bt)delimiter(")>operator(,) ident(Qnil)operator(\);) + + reserved(return) ident(exc)operator(;) +operator(}) + +comment(/* + * Document-method: exception + * + * call-seq: + * exc.exception(string\) -> an_exception or exc + * + * With no argument, or if the argument is the same as the receiver, + * return the receiver. Otherwise, create a new + * exception object of the same class as the receiver, but with a + * message equal to <code>string.to_str</code>. + * + */) + +directive(static) ident(VALUE) +ident(exc_exception)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(VALUE) ident(exc)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) reserved(return) ident(self)operator(;) + reserved(if) operator(()ident(argc) operator(==) integer(1) operator(&&) ident(self) operator(==) ident(argv)operator([)integer(0)operator(]\)) reserved(return) ident(self)operator(;) + ident(exc) operator(=) ident(rb_obj_clone)operator(()ident(self)operator(\);) + ident(exc_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(exc)operator(\);) + + reserved(return) ident(exc)operator(;) +operator(}) + +comment(/* + * call-seq: + * exception.to_s => string + * + * Returns exception's message (or the name of the exception if + * no message is set\). + */) + +directive(static) ident(VALUE) +ident(exc_to_s)operator(()ident(exc)operator(\)) + ident(VALUE) ident(exc)operator(;) +operator({) + ident(VALUE) ident(mesg) operator(=) ident(rb_attr_get)operator(()ident(exc)operator(,) ident(rb_intern)operator(()string<delimiter(")content(mesg)delimiter(")>operator(\)\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(mesg)operator(\)\)) reserved(return) ident(rb_class_name)operator(()ident(CLASS_OF)operator(()ident(exc)operator(\)\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(exc)operator(\)\)) ident(OBJ_TAINT)operator(()ident(mesg)operator(\);) + reserved(return) ident(mesg)operator(;) +operator(}) + +comment(/* + * call-seq: + * exception.message => string + * exception.to_str => string + * + * Returns the result of invoking <code>exception.to_s</code>. + * Normally this returns the exception's message or name. By + * supplying a to_str method, exceptions are agreeing to + * be used where Strings are expected. + */) + +directive(static) ident(VALUE) +ident(exc_to_str)operator(()ident(exc)operator(\)) + ident(VALUE) ident(exc)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(exc)operator(,) ident(rb_intern)operator(()string<delimiter(")content(to_s)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * exception.inspect => string + * + * Return this exception's class name an message + */) + +directive(static) ident(VALUE) +ident(exc_inspect)operator(()ident(exc)operator(\)) + ident(VALUE) ident(exc)operator(;) +operator({) + ident(VALUE) ident(str)operator(,) ident(klass)operator(;) + + ident(klass) operator(=) ident(CLASS_OF)operator(()ident(exc)operator(\);) + ident(exc) operator(=) ident(rb_obj_as_string)operator(()ident(exc)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(exc)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(rb_str_dup)operator(()ident(rb_class_name)operator(()ident(klass)operator(\)\);) + operator(}) + + ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content(#<)delimiter(")>operator(\);) + ident(klass) operator(=) ident(rb_class_name)operator(()ident(klass)operator(\);) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(klass)operator(\);) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) string<delimiter(")content(: )delimiter(")>operator(,) integer(2)operator(\);) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(exc)operator(\);) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) integer(1)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * exception.backtrace => array + * + * Returns any backtrace associated with the exception. The backtrace + * is an array of strings, each containing either ``filename:lineNo: in + * `method''' or ``filename:lineNo.'' + * + * def a + * raise "boom" + * end + * + * def b + * a(\) + * end + * + * begin + * b(\) + * rescue => detail + * print detail.backtrace.join("\\n"\) + * end + * + * <em>produces:</em> + * + * prog.rb:2:in `a' + * prog.rb:6:in `b' + * prog.rb:10 +*/) + +directive(static) ident(VALUE) +ident(exc_backtrace)operator(()ident(exc)operator(\)) + ident(VALUE) ident(exc)operator(;) +operator({) + directive(static) ident(ID) ident(bt)operator(;) + + reserved(if) operator((!)ident(bt)operator(\)) ident(bt) operator(=) ident(rb_intern)operator(()string<delimiter(")content(bt)delimiter(")>operator(\);) + reserved(return) ident(rb_attr_get)operator(()ident(exc)operator(,) ident(bt)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_check_backtrace)operator(()ident(bt)operator(\)) + ident(VALUE) ident(bt)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + directive(static) pre_type(char) operator(*)ident(err) operator(=) string<delimiter(")content(backtrace must be Array of String)delimiter(")>operator(;) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(bt)operator(\)\)) operator({) + pre_type(int) ident(t) operator(=) ident(TYPE)operator(()ident(bt)operator(\);) + + reserved(if) operator(()ident(t) operator(==) ident(T_STRING)operator(\)) reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(bt)operator(\);) + reserved(if) operator(()ident(t) operator(!=) ident(T_ARRAY)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) ident(err)operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(RARRAY)operator(()ident(bt)operator(\)->)ident(len)operator(;)ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(RARRAY)operator(()ident(bt)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)) operator(!=) ident(T_STRING)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) ident(err)operator(\);) + operator(}) + operator(}) + operator(}) + reserved(return) ident(bt)operator(;) +operator(}) + +comment(/* + * call-seq: + * exc.set_backtrace(array\) => array + * + * Sets the backtrace information associated with <i>exc</i>. The + * argument must be an array of <code>String</code> objects in the + * format described in <code>Exception#backtrace</code>. + * + */) + +directive(static) ident(VALUE) +ident(exc_set_backtrace)operator(()ident(exc)operator(,) ident(bt)operator(\)) + ident(VALUE) ident(exc)operator(;) + ident(VALUE) ident(bt)operator(;) +operator({) + reserved(return) ident(rb_iv_set)operator(()ident(exc)operator(,) string<delimiter(")content(bt)delimiter(")>operator(,) ident(rb_check_backtrace)operator(()ident(bt)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * SystemExit.new(status=0\) => system_exit + * + * Create a new +SystemExit+ exception with the given status. + */) + +directive(static) ident(VALUE) +ident(exit_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(exc)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(exc)operator(;) +operator({) + ident(VALUE) ident(status) operator(=) ident(INT2FIX)operator(()ident(EXIT_SUCCESS)operator(\);) + reserved(if) operator(()ident(argc) operator(>) integer(0) operator(&&) ident(FIXNUM_P)operator(()ident(argv)operator([)integer(0)operator(]\)\)) operator({) + ident(status) operator(=) operator(*)ident(argv)operator(++;) + operator(--)ident(argc)operator(;) + operator(}) + ident(rb_call_super)operator(()ident(argc)operator(,) ident(argv)operator(\);) + ident(rb_iv_set)operator(()ident(exc)operator(,) string<delimiter(")content(status)delimiter(")>operator(,) ident(status)operator(\);) + reserved(return) ident(exc)operator(;) +operator(}) + + +comment(/* + * call-seq: + * system_exit.status => fixnum + * + * Return the status value associated with this system exit. + */) + +directive(static) ident(VALUE) +ident(exit_status)operator(()ident(exc)operator(\)) + ident(VALUE) ident(exc)operator(;) +operator({) + reserved(return) ident(rb_attr_get)operator(()ident(exc)operator(,) ident(rb_intern)operator(()string<delimiter(")content(status)delimiter(")>operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * system_exit.success? => true or false + * + * Returns +true+ if exiting successful, +false+ if not. + */) + +directive(static) ident(VALUE) +ident(exit_success_p)operator(()ident(exc)operator(\)) + ident(VALUE) ident(exc)operator(;) +operator({) + ident(VALUE) ident(status) operator(=) ident(rb_attr_get)operator(()ident(exc)operator(,) ident(rb_intern)operator(()string<delimiter(")content(status)delimiter(")>operator(\)\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(status)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(status) operator(==) ident(INT2FIX)operator(()ident(EXIT_SUCCESS)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_name_error)operator(()ident(ID) ident(id)operator(,) directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_name_error)operator(()ident(id)operator(,) ident(fmt)operator(,) ident(va_alist)operator(\)) + ident(ID) ident(id)operator(;) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(VALUE) ident(exc)operator(,) ident(argv)operator([)integer(2)operator(];) + ident(va_list) ident(args)operator(;) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(vsnprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) + + ident(argv)operator([)integer(0)operator(]) operator(=) ident(rb_str_new2)operator(()ident(buf)operator(\);) + ident(argv)operator([)integer(1)operator(]) operator(=) ident(ID2SYM)operator(()ident(id)operator(\);) + ident(exc) operator(=) ident(rb_class_new_instance)operator(()integer(2)operator(,) ident(argv)operator(,) ident(rb_eNameError)operator(\);) + ident(rb_exc_raise)operator(()ident(exc)operator(\);) +operator(}) + +comment(/* + * call-seq: + * NameError.new(msg [, name]\) => name_error + * + * Construct a new NameError exception. If given the <i>name</i> + * parameter may subsequently be examined using the <code>NameError.name</code> + * method. + */) + +directive(static) ident(VALUE) +ident(name_err_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(VALUE) ident(name)operator(;) + + ident(name) operator(=) operator(()ident(argc) operator(>) integer(1)operator(\)) operator(?) ident(argv)operator([--)ident(argc)operator(]) operator(:) ident(Qnil)operator(;) + ident(rb_call_super)operator(()ident(argc)operator(,) ident(argv)operator(\);) + ident(rb_iv_set)operator(()ident(self)operator(,) string<delimiter(")content(name)delimiter(")>operator(,) ident(name)operator(\);) + reserved(return) ident(self)operator(;) +operator(}) + +comment(/* + * call-seq: + * name_error.name => string or nil + * + * Return the name associated with this NameError exception. + */) + +directive(static) ident(VALUE) +ident(name_err_name)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(rb_attr_get)operator(()ident(self)operator(,) ident(rb_intern)operator(()string<delimiter(")content(name)delimiter(")>operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * name_error.to_s => string + * + * Produce a nicely-formated string representing the +NameError+. + */) + +directive(static) ident(VALUE) +ident(name_err_to_s)operator(()ident(exc)operator(\)) + ident(VALUE) ident(exc)operator(;) +operator({) + ident(VALUE) ident(mesg) operator(=) ident(rb_attr_get)operator(()ident(exc)operator(,) ident(rb_intern)operator(()string<delimiter(")content(mesg)delimiter(")>operator(\)\),) ident(str) operator(=) ident(mesg)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(mesg)operator(\)\)) reserved(return) ident(rb_class_name)operator(()ident(CLASS_OF)operator(()ident(exc)operator(\)\);) + ident(StringValue)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(str) operator(!=) ident(mesg)operator(\)) operator({) + ident(rb_iv_set)operator(()ident(exc)operator(,) string<delimiter(")content(mesg)delimiter(")>operator(,) ident(mesg) operator(=) ident(str)operator(\);) + operator(}) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(exc)operator(\)\)) ident(OBJ_TAINT)operator(()ident(mesg)operator(\);) + reserved(return) ident(mesg)operator(;) +operator(}) + +comment(/* + * call-seq: + * NoMethodError.new(msg, name [, args]\) => no_method_error + * + * Construct a NoMethodError exception for a method of the given name + * called with the given arguments. The name may be accessed using + * the <code>#name</code> method on the resulting object, and the + * arguments using the <code>#args</code> method. + */) + +directive(static) ident(VALUE) +ident(nometh_err_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(VALUE) ident(args) operator(=) operator(()ident(argc) operator(>) integer(2)operator(\)) operator(?) ident(argv)operator([--)ident(argc)operator(]) operator(:) ident(Qnil)operator(;) + ident(name_err_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\);) + ident(rb_iv_set)operator(()ident(self)operator(,) string<delimiter(")content(args)delimiter(")>operator(,) ident(args)operator(\);) + reserved(return) ident(self)operator(;) +operator(}) + +comment(/* :nodoc: */) +directive(static) directive(void) +ident(name_err_mesg_mark)operator(()ident(ptr)operator(\)) + ident(VALUE) operator(*)ident(ptr)operator(;) +operator({) + ident(rb_gc_mark_locations)operator(()ident(ptr)operator(,) ident(ptr)operator(+)integer(3)operator(\);) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(name_err_mesg_new)operator(()ident(obj)operator(,) ident(mesg)operator(,) ident(recv)operator(,) ident(method)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(mesg)operator(,) ident(recv)operator(,) ident(method)operator(;) +operator({) + ident(VALUE) operator(*)ident(ptr) operator(=) ident(ALLOC_N)operator(()ident(VALUE)operator(,) integer(3)operator(\);) + + ident(ptr)operator([)integer(0)operator(]) operator(=) ident(mesg)operator(;) + ident(ptr)operator([)integer(1)operator(]) operator(=) ident(recv)operator(;) + ident(ptr)operator([)integer(2)operator(]) operator(=) ident(method)operator(;) + reserved(return) ident(Data_Wrap_Struct)operator(()ident(rb_cNameErrorMesg)operator(,) ident(name_err_mesg_mark)operator(,) operator(-)integer(1)operator(,) ident(ptr)operator(\);) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(name_err_mesg_to_str)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) operator(*)ident(ptr)operator(,) ident(mesg)operator(;) + ident(Data_Get_Struct)operator(()ident(obj)operator(,) ident(VALUE)operator(,) ident(ptr)operator(\);) + + ident(mesg) operator(=) ident(ptr)operator([)integer(0)operator(];) + reserved(if) operator(()ident(NIL_P)operator(()ident(mesg)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(else) operator({) + pre_type(char) operator(*)ident(desc) operator(=) integer(0)operator(;) + ident(VALUE) ident(d) operator(=) integer(0)operator(,) ident(args)operator([)integer(3)operator(];) + + ident(obj) operator(=) ident(ptr)operator([)integer(1)operator(];) + reserved(switch) operator(()ident(TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_NIL)operator(:) + ident(desc) operator(=) string<delimiter(")content(nil)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(T_TRUE)operator(:) + ident(desc) operator(=) string<delimiter(")content(true)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(T_FALSE)operator(:) + ident(desc) operator(=) string<delimiter(")content(false)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(d) operator(=) ident(rb_protect)operator(()ident(rb_inspect)operator(,) ident(obj)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(d)operator(\)) operator(||) ident(RSTRING)operator(()ident(d)operator(\)->)ident(len) operator(>) integer(65)operator(\)) operator({) + ident(d) operator(=) ident(rb_any_to_s)operator(()ident(obj)operator(\);) + operator(}) + ident(desc) operator(=) ident(RSTRING)operator(()ident(d)operator(\)->)ident(ptr)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(desc) operator(&&) ident(desc)operator([)integer(0)operator(]) operator(!=) char('#')operator(\)) operator({) + ident(d) operator(=) ident(rb_str_new2)operator(()ident(desc)operator(\);) + ident(rb_str_cat2)operator(()ident(d)operator(,) string<delimiter(")content(:)delimiter(")>operator(\);) + ident(rb_str_cat2)operator(()ident(d)operator(,) ident(rb_obj_classname)operator(()ident(obj)operator(\)\);) + operator(}) + ident(args)operator([)integer(0)operator(]) operator(=) ident(mesg)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(ptr)operator([)integer(2)operator(];) + ident(args)operator([)integer(2)operator(]) operator(=) ident(d)operator(;) + ident(mesg) operator(=) ident(rb_f_sprintf)operator(()integer(3)operator(,) ident(args)operator(\);) + operator(}) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) ident(OBJ_TAINT)operator(()ident(mesg)operator(\);) + reserved(return) ident(mesg)operator(;) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(name_err_mesg_load)operator(()ident(klass)operator(,) ident(str)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(str)operator(;) +operator({) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * no_method_error.args => obj + * + * Return the arguments passed in as the third parameter to + * the constructor. + */) + +directive(static) ident(VALUE) +ident(nometh_err_args)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(rb_attr_get)operator(()ident(self)operator(,) ident(rb_intern)operator(()string<delimiter(")content(args)delimiter(")>operator(\)\);) +operator(}) + +directive(void) +ident(rb_invalid_str)operator(()ident(str)operator(,) ident(type)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(,) operator(*)ident(type)operator(;) +operator({) + ident(VALUE) ident(s) operator(=) ident(rb_str_inspect)operator(()ident(rb_str_new2)operator(()ident(str)operator(\)\);) + + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(invalid value for %s: %s)delimiter(")>operator(,) ident(type)operator(,) ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr)operator(\);) +operator(}) + +comment(/* + * Document-module: Errno + * + * Ruby exception objects are subclasses of <code>Exception</code>. + * However, operating systems typically report errors using plain + * integers. Module <code>Errno</code> is created dynamically to map + * these operating system errors to Ruby classes, with each error + * number generating its own subclass of <code>SystemCallError</code>. + * As the subclass is created in module <code>Errno</code>, its name + * will start <code>Errno::</code>. + * + * The names of the <code>Errno::</code> classes depend on + * the environment in which Ruby runs. On a typical Unix or Windows + * platform, there are <code>Errno</code> classes such as + * <code>Errno::EACCES</code>, <code>Errno::EAGAIN</code>, + * <code>Errno::EINTR</code>, and so on. + * + * The integer operating system error number corresponding to a + * particular error is available as the class constant + * <code>Errno::</code><em>error</em><code>::Errno</code>. + * + * Errno::EACCES::Errno #=> 13 + * Errno::EAGAIN::Errno #=> 11 + * Errno::EINTR::Errno #=> 4 + * + * The full list of operating system errors on your particular platform + * are available as the constants of <code>Errno</code>. + * + * Errno.constants #=> E2BIG, EACCES, EADDRINUSE, EADDRNOTAVAIL, ... + */) + +directive(static) ident(st_table) operator(*)ident(syserr_tbl)operator(;) + +directive(static) ident(VALUE) +ident(set_syserr)operator(()ident(n)operator(,) ident(name)operator(\)) + pre_type(int) ident(n)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(VALUE) ident(error)operator(;) + + reserved(if) operator((!)ident(st_lookup)operator(()ident(syserr_tbl)operator(,) ident(n)operator(,) operator(&)ident(error)operator(\)\)) operator({) + ident(error) operator(=) ident(rb_define_class_under)operator(()ident(rb_mErrno)operator(,) ident(name)operator(,) ident(rb_eSystemCallError)operator(\);) + ident(rb_define_const)operator(()ident(error)operator(,) string<delimiter(")content(Errno)delimiter(")>operator(,) ident(INT2NUM)operator(()ident(n)operator(\)\);) + ident(st_add_direct)operator(()ident(syserr_tbl)operator(,) ident(n)operator(,) ident(error)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_define_const)operator(()ident(rb_mErrno)operator(,) ident(name)operator(,) ident(error)operator(\);) + operator(}) + reserved(return) ident(error)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(get_syserr)operator(()ident(n)operator(\)) + pre_type(int) ident(n)operator(;) +operator({) + ident(VALUE) ident(error)operator(;) + + reserved(if) operator((!)ident(st_lookup)operator(()ident(syserr_tbl)operator(,) ident(n)operator(,) operator(&)ident(error)operator(\)\)) operator({) + pre_type(char) ident(name)operator([)integer(8)operator(];) comment(/* some Windows' errno have 5 digits. */) + + ident(snprintf)operator(()ident(name)operator(,) reserved(sizeof)operator(()ident(name)operator(\),) string<delimiter(")content(E%03d)delimiter(")>operator(,) ident(n)operator(\);) + ident(error) operator(=) ident(set_syserr)operator(()ident(n)operator(,) ident(name)operator(\);) + operator(}) + reserved(return) ident(error)operator(;) +operator(}) + +comment(/* + * call-seq: + * SystemCallError.new(msg, errno\) => system_call_error_subclass + * + * If _errno_ corresponds to a known system error code, constructs + * the appropriate <code>Errno</code> class for that error, otherwise + * constructs a generic <code>SystemCallError</code> object. The + * error number is subsequently available via the <code>errno</code> + * method. + */) + +directive(static) ident(VALUE) +ident(syserr_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#if) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__VMS)operator(\)) + pre_type(char) operator(*)ident(strerror)operator((\);) +preprocessor(#endif) + pre_type(char) operator(*)ident(err)operator(;) + ident(VALUE) ident(mesg)operator(,) ident(error)operator(;) + ident(VALUE) ident(klass) operator(=) ident(rb_obj_class)operator(()ident(self)operator(\);) + + reserved(if) operator(()ident(klass) operator(==) ident(rb_eSystemCallError)operator(\)) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(mesg)operator(,) operator(&)ident(error)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(1) operator(&&) ident(FIXNUM_P)operator(()ident(mesg)operator(\)\)) operator({) + ident(error) operator(=) ident(mesg)operator(;) ident(mesg) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(error)operator(\)) operator(&&) ident(st_lookup)operator(()ident(syserr_tbl)operator(,) ident(NUM2LONG)operator(()ident(error)operator(\),) operator(&)ident(klass)operator(\)\)) operator({) + comment(/* change class */) + reserved(if) operator(()ident(TYPE)operator(()ident(self)operator(\)) operator(!=) ident(T_OBJECT)operator(\)) operator({) comment(/* insurance to avoid type crash */) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(invalid instance type)delimiter(")>operator(\);) + operator(}) + ident(RBASIC)operator(()ident(self)operator(\)->)ident(klass) operator(=) ident(klass)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(mesg)operator(\);) + ident(error) operator(=) ident(rb_const_get)operator(()ident(klass)operator(,) ident(rb_intern)operator(()string<delimiter(")content(Errno)delimiter(")>operator(\)\);) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(error)operator(\)\)) ident(err) operator(=) ident(strerror)operator(()ident(NUM2LONG)operator(()ident(error)operator(\)\);) + reserved(else) ident(err) operator(=) string<delimiter(")content(unknown error)delimiter(")>operator(;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(mesg)operator(\)\)) operator({) + ident(VALUE) ident(str) operator(=) ident(mesg)operator(;) + ident(size_t) ident(len)operator(;) + + ident(StringValue)operator(()ident(str)operator(\);) + ident(len) operator(=) ident(strlen)operator(()ident(err)operator(\)+)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(+)integer(3)operator(;) + ident(mesg) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) + ident(snprintf)operator(()ident(RSTRING)operator(()ident(mesg)operator(\)->)ident(ptr)operator(,) ident(len)operator(+)integer(1)operator(,) string<delimiter(")content(%s - %.*s)delimiter(")>operator(,) ident(err)operator(,) + operator(()pre_type(int)operator(\))ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(rb_str_resize)operator(()ident(mesg)operator(,) ident(strlen)operator(()ident(RSTRING)operator(()ident(mesg)operator(\)->)ident(ptr)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(mesg) operator(=) ident(rb_str_new2)operator(()ident(err)operator(\);) + operator(}) + ident(rb_call_super)operator(()integer(1)operator(,) operator(&)ident(mesg)operator(\);) + ident(rb_iv_set)operator(()ident(self)operator(,) string<delimiter(")content(errno)delimiter(")>operator(,) ident(error)operator(\);) + reserved(return) ident(self)operator(;) +operator(}) + +comment(/* + * call-seq: + * system_call_error.errno => fixnum + * + * Return this SystemCallError's error number. + */) + +directive(static) ident(VALUE) +ident(syserr_errno)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(rb_attr_get)operator(()ident(self)operator(,) ident(rb_intern)operator(()string<delimiter(")content(errno)delimiter(")>operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * system_call_error === other => true or false + * + * Return +true+ if the receiver is a generic +SystemCallError+, or + * if the error numbers _self_ and _other_ are the same. + */) + + +directive(static) ident(VALUE) +ident(syserr_eqq)operator(()ident(self)operator(,) ident(exc)operator(\)) + ident(VALUE) ident(self)operator(,) ident(exc)operator(;) +operator({) + ident(VALUE) ident(num)operator(,) ident(e)operator(;) + + reserved(if) operator((!)ident(rb_obj_is_kind_of)operator(()ident(exc)operator(,) ident(rb_eSystemCallError)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(self) operator(==) ident(rb_eSystemCallError)operator(\)) reserved(return) ident(Qtrue)operator(;) + + ident(num) operator(=) ident(rb_attr_get)operator(()ident(exc)operator(,) ident(rb_intern)operator(()string<delimiter(")content(errno)delimiter(")>operator(\)\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(num)operator(\)\)) operator({) + ident(VALUE) ident(klass) operator(=) ident(CLASS_OF)operator(()ident(exc)operator(\);) + + reserved(while) operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_ICLASS) operator(||) ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(klass) operator(=) operator(()ident(VALUE)operator(\))ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) + operator(}) + ident(num) operator(=) ident(rb_const_get)operator(()ident(klass)operator(,) ident(rb_intern)operator(()string<delimiter(")content(Errno)delimiter(")>operator(\)\);) + operator(}) + ident(e) operator(=) ident(rb_const_get)operator(()ident(self)operator(,) ident(rb_intern)operator(()string<delimiter(")content(Errno)delimiter(")>operator(\)\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(num)operator(\)) operator(?) ident(num) operator(==) ident(e) operator(:) ident(rb_equal)operator(()ident(num)operator(,) ident(e)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * Descendents of class <code>Exception</code> are used to communicate + * between <code>raise</code> methods and <code>rescue</code> + * statements in <code>begin/end</code> blocks. <code>Exception</code> + * objects carry information about the exception---its type (the + * exception's class name\), an optional descriptive string, and + * optional traceback information. Programs may subclass + * <code>Exception</code> to add additional information. + */) + +directive(void) +ident(Init_Exception)operator((\)) +operator({) + ident(rb_eException) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Exception)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_eException)operator(,) string<delimiter(")content(exception)delimiter(")>operator(,) ident(rb_class_new_instance)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_eException)operator(,) string<delimiter(")content(exception)delimiter(")>operator(,) ident(exc_exception)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_eException)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(exc_initialize)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_eException)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(exc_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_eException)operator(,) string<delimiter(")content(to_str)delimiter(")>operator(,) ident(exc_to_str)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_eException)operator(,) string<delimiter(")content(message)delimiter(")>operator(,) ident(exc_to_str)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_eException)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(exc_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_eException)operator(,) string<delimiter(")content(backtrace)delimiter(")>operator(,) ident(exc_backtrace)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_eException)operator(,) string<delimiter(")content(set_backtrace)delimiter(")>operator(,) ident(exc_set_backtrace)operator(,) integer(1)operator(\);) + + ident(rb_eSystemExit) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(SystemExit)delimiter(")>operator(,) ident(rb_eException)operator(\);) + ident(rb_define_method)operator(()ident(rb_eSystemExit)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(exit_initialize)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_eSystemExit)operator(,) string<delimiter(")content(status)delimiter(")>operator(,) ident(exit_status)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_eSystemExit)operator(,) string<delimiter(")content(success?)delimiter(")>operator(,) ident(exit_success_p)operator(,) integer(0)operator(\);) + + ident(rb_eFatal) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(fatal)delimiter(")>operator(,) ident(rb_eException)operator(\);) + ident(rb_eSignal) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(SignalException)delimiter(")>operator(,) ident(rb_eException)operator(\);) + ident(rb_eInterrupt) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Interrupt)delimiter(")>operator(,) ident(rb_eSignal)operator(\);) + + ident(rb_eStandardError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(StandardError)delimiter(")>operator(,) ident(rb_eException)operator(\);) + ident(rb_eTypeError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(TypeError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_eArgError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(ArgumentError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_eIndexError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(IndexError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_eRangeError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(RangeError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_eNameError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(NameError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_define_method)operator(()ident(rb_eNameError)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(name_err_initialize)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_eNameError)operator(,) string<delimiter(")content(name)delimiter(")>operator(,) ident(name_err_name)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_eNameError)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(name_err_to_s)operator(,) integer(0)operator(\);) + ident(rb_cNameErrorMesg) operator(=) ident(rb_define_class_under)operator(()ident(rb_eNameError)operator(,) string<delimiter(")content(message)delimiter(")>operator(,) ident(rb_cData)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cNameErrorMesg)operator(,) string<delimiter(")content(!)delimiter(")>operator(,) ident(name_err_mesg_new)operator(,) integer(3)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNameErrorMesg)operator(,) string<delimiter(")content(to_str)delimiter(")>operator(,) ident(name_err_mesg_to_str)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNameErrorMesg)operator(,) string<delimiter(")content(_dump)delimiter(")>operator(,) ident(name_err_mesg_to_str)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cNameErrorMesg)operator(,) string<delimiter(")content(_load)delimiter(")>operator(,) ident(name_err_mesg_load)operator(,) integer(1)operator(\);) + ident(rb_eNoMethodError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(NoMethodError)delimiter(")>operator(,) ident(rb_eNameError)operator(\);) + ident(rb_define_method)operator(()ident(rb_eNoMethodError)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(nometh_err_initialize)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_eNoMethodError)operator(,) string<delimiter(")content(args)delimiter(")>operator(,) ident(nometh_err_args)operator(,) integer(0)operator(\);) + + ident(rb_eScriptError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(ScriptError)delimiter(")>operator(,) ident(rb_eException)operator(\);) + ident(rb_eSyntaxError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(SyntaxError)delimiter(")>operator(,) ident(rb_eScriptError)operator(\);) + ident(rb_eLoadError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(LoadError)delimiter(")>operator(,) ident(rb_eScriptError)operator(\);) + ident(rb_eNotImpError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(NotImplementedError)delimiter(")>operator(,) ident(rb_eScriptError)operator(\);) + + ident(rb_eRuntimeError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(RuntimeError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_eSecurityError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(SecurityError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_eNoMemError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(NoMemoryError)delimiter(")>operator(,) ident(rb_eException)operator(\);) + + ident(syserr_tbl) operator(=) ident(st_init_numtable)operator((\);) + ident(rb_eSystemCallError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(SystemCallError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_define_method)operator(()ident(rb_eSystemCallError)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(syserr_initialize)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_eSystemCallError)operator(,) string<delimiter(")content(errno)delimiter(")>operator(,) ident(syserr_errno)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_eSystemCallError)operator(,) string<delimiter(")content(===)delimiter(")>operator(,) ident(syserr_eqq)operator(,) integer(1)operator(\);) + + ident(rb_mErrno) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(Errno)delimiter(")>operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(warn)delimiter(")>operator(,) ident(rb_warn_m)operator(,) integer(1)operator(\);) +operator(}) + +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_raise)operator(()ident(VALUE) ident(exc)operator(,) directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_raise)operator(()ident(exc)operator(,) ident(fmt)operator(,) ident(va_alist)operator(\)) + ident(VALUE) ident(exc)operator(;) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(va_list) ident(args)operator(;) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + + ident(va_init_list)operator(()ident(args)operator(,)ident(fmt)operator(\);) + ident(vsnprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) + ident(rb_exc_raise)operator(()ident(rb_exc_new2)operator(()ident(exc)operator(,) ident(buf)operator(\)\);) +operator(}) + +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_loaderror)operator(()directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_loaderror)operator(()ident(fmt)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(va_list) ident(args)operator(;) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(vsnprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) + ident(rb_exc_raise)operator(()ident(rb_exc_new2)operator(()ident(rb_eLoadError)operator(,) ident(buf)operator(\)\);) +operator(}) + +directive(void) +ident(rb_notimplement)operator((\)) +operator({) + ident(rb_raise)operator(()ident(rb_eNotImpError)operator(,) + string<delimiter(")content(%s(\) function is unimplemented on this machine)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\)\);) +operator(}) + +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_fatal)operator(()directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_fatal)operator(()ident(fmt)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(va_list) ident(args)operator(;) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(vsnprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) + + ident(ruby_in_eval) operator(=) integer(0)operator(;) + ident(rb_exc_fatal)operator(()ident(rb_exc_new2)operator(()ident(rb_eFatal)operator(,) ident(buf)operator(\)\);) +operator(}) + +directive(void) +ident(rb_sys_fail)operator(()ident(mesg)operator(\)) + directive(const) pre_type(char) operator(*)ident(mesg)operator(;) +operator({) + pre_type(int) ident(n) operator(=) ident(errno)operator(;) + ident(VALUE) ident(arg)operator(;) + + ident(errno) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(n) operator(==) integer(0)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(rb_sys_fail(%s\) - errno == 0)delimiter(")>operator(,) ident(mesg) operator(?) ident(mesg) operator(:) string<delimiter(")delimiter(")>operator(\);) + operator(}) + + ident(arg) operator(=) ident(mesg) operator(?) ident(rb_str_new2)operator(()ident(mesg)operator(\)) operator(:) ident(Qnil)operator(;) + ident(rb_exc_raise)operator(()ident(rb_class_new_instance)operator(()integer(1)operator(,) operator(&)ident(arg)operator(,) ident(get_syserr)operator(()ident(n)operator(\)\)\);) +operator(}) + +directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_sys_warning)operator(()directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_sys_warning)operator(()ident(fmt)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + ident(va_list) ident(args)operator(;) + pre_type(int) ident(errno_save)operator(;) + + ident(errno_save) operator(=) ident(errno)operator(;) + + reserved(if) operator((!)ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)) reserved(return)operator(;) + + ident(snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) string<delimiter(")content(warning: %s)delimiter(")>operator(,) ident(fmt)operator(\);) + ident(snprintf)operator(()ident(buf)operator(+)ident(strlen)operator(()ident(buf)operator(\),) ident(BUFSIZ)operator(-)ident(strlen)operator(()ident(buf)operator(\),) string<delimiter(")content(: %s)delimiter(")>operator(,) ident(strerror)operator(()ident(errno_save)operator(\)\);) + + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(warn_print)operator(()ident(buf)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) + ident(errno) operator(=) ident(errno_save)operator(;) +operator(}) + +directive(void) +ident(rb_load_fail)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) + ident(rb_loaderror)operator(()string<delimiter(")content(%s -- %s)delimiter(")>operator(,) ident(strerror)operator(()ident(errno)operator(\),) ident(path)operator(\);) +operator(}) + +directive(void) +ident(rb_error_frozen)operator(()ident(what)operator(\)) + directive(const) pre_type(char) operator(*)ident(what)operator(;) +operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't modify frozen %s)delimiter(")>operator(,) ident(what)operator(\);) +operator(}) + +directive(void) +ident(rb_check_frozen)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(obj)operator(\)\)) ident(rb_error_frozen)operator(()ident(rb_obj_classname)operator(()ident(obj)operator(\)\);) +operator(}) + +directive(void) +ident(Init_syserr)operator((\)) +operator({) +preprocessor(#ifdef) ident(EPERM) + ident(set_syserr)operator(()ident(EPERM)operator(,) string<delimiter(")content(EPERM)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOENT) + ident(set_syserr)operator(()ident(ENOENT)operator(,) string<delimiter(")content(ENOENT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ESRCH) + ident(set_syserr)operator(()ident(ESRCH)operator(,) string<delimiter(")content(ESRCH)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EINTR) + ident(set_syserr)operator(()ident(EINTR)operator(,) string<delimiter(")content(EINTR)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EIO) + ident(set_syserr)operator(()ident(EIO)operator(,) string<delimiter(")content(EIO)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENXIO) + ident(set_syserr)operator(()ident(ENXIO)operator(,) string<delimiter(")content(ENXIO)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(E2BIG) + ident(set_syserr)operator(()ident(E2BIG)operator(,) string<delimiter(")content(E2BIG)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOEXEC) + ident(set_syserr)operator(()ident(ENOEXEC)operator(,) string<delimiter(")content(ENOEXEC)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EBADF) + ident(set_syserr)operator(()ident(EBADF)operator(,) string<delimiter(")content(EBADF)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ECHILD) + ident(set_syserr)operator(()ident(ECHILD)operator(,) string<delimiter(")content(ECHILD)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EAGAIN) + ident(set_syserr)operator(()ident(EAGAIN)operator(,) string<delimiter(")content(EAGAIN)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOMEM) + ident(set_syserr)operator(()ident(ENOMEM)operator(,) string<delimiter(")content(ENOMEM)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EACCES) + ident(set_syserr)operator(()ident(EACCES)operator(,) string<delimiter(")content(EACCES)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EFAULT) + ident(set_syserr)operator(()ident(EFAULT)operator(,) string<delimiter(")content(EFAULT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOTBLK) + ident(set_syserr)operator(()ident(ENOTBLK)operator(,) string<delimiter(")content(ENOTBLK)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EBUSY) + ident(set_syserr)operator(()ident(EBUSY)operator(,) string<delimiter(")content(EBUSY)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EEXIST) + ident(set_syserr)operator(()ident(EEXIST)operator(,) string<delimiter(")content(EEXIST)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EXDEV) + ident(set_syserr)operator(()ident(EXDEV)operator(,) string<delimiter(")content(EXDEV)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENODEV) + ident(set_syserr)operator(()ident(ENODEV)operator(,) string<delimiter(")content(ENODEV)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOTDIR) + ident(set_syserr)operator(()ident(ENOTDIR)operator(,) string<delimiter(")content(ENOTDIR)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EISDIR) + ident(set_syserr)operator(()ident(EISDIR)operator(,) string<delimiter(")content(EISDIR)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EINVAL) + ident(set_syserr)operator(()ident(EINVAL)operator(,) string<delimiter(")content(EINVAL)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENFILE) + ident(set_syserr)operator(()ident(ENFILE)operator(,) string<delimiter(")content(ENFILE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EMFILE) + ident(set_syserr)operator(()ident(EMFILE)operator(,) string<delimiter(")content(EMFILE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOTTY) + ident(set_syserr)operator(()ident(ENOTTY)operator(,) string<delimiter(")content(ENOTTY)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ETXTBSY) + ident(set_syserr)operator(()ident(ETXTBSY)operator(,) string<delimiter(")content(ETXTBSY)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EFBIG) + ident(set_syserr)operator(()ident(EFBIG)operator(,) string<delimiter(")content(EFBIG)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOSPC) + ident(set_syserr)operator(()ident(ENOSPC)operator(,) string<delimiter(")content(ENOSPC)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ESPIPE) + ident(set_syserr)operator(()ident(ESPIPE)operator(,) string<delimiter(")content(ESPIPE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EROFS) + ident(set_syserr)operator(()ident(EROFS)operator(,) string<delimiter(")content(EROFS)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EMLINK) + ident(set_syserr)operator(()ident(EMLINK)operator(,) string<delimiter(")content(EMLINK)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EPIPE) + ident(set_syserr)operator(()ident(EPIPE)operator(,) string<delimiter(")content(EPIPE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EDOM) + ident(set_syserr)operator(()ident(EDOM)operator(,) string<delimiter(")content(EDOM)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ERANGE) + ident(set_syserr)operator(()ident(ERANGE)operator(,) string<delimiter(")content(ERANGE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EDEADLK) + ident(set_syserr)operator(()ident(EDEADLK)operator(,) string<delimiter(")content(EDEADLK)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENAMETOOLONG) + ident(set_syserr)operator(()ident(ENAMETOOLONG)operator(,) string<delimiter(")content(ENAMETOOLONG)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOLCK) + ident(set_syserr)operator(()ident(ENOLCK)operator(,) string<delimiter(")content(ENOLCK)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOSYS) + ident(set_syserr)operator(()ident(ENOSYS)operator(,) string<delimiter(")content(ENOSYS)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOTEMPTY) + ident(set_syserr)operator(()ident(ENOTEMPTY)operator(,) string<delimiter(")content(ENOTEMPTY)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ELOOP) + ident(set_syserr)operator(()ident(ELOOP)operator(,) string<delimiter(")content(ELOOP)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EWOULDBLOCK) + ident(set_syserr)operator(()ident(EWOULDBLOCK)operator(,) string<delimiter(")content(EWOULDBLOCK)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOMSG) + ident(set_syserr)operator(()ident(ENOMSG)operator(,) string<delimiter(")content(ENOMSG)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EIDRM) + ident(set_syserr)operator(()ident(EIDRM)operator(,) string<delimiter(")content(EIDRM)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ECHRNG) + ident(set_syserr)operator(()ident(ECHRNG)operator(,) string<delimiter(")content(ECHRNG)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EL2NSYNC) + ident(set_syserr)operator(()ident(EL2NSYNC)operator(,) string<delimiter(")content(EL2NSYNC)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EL3HLT) + ident(set_syserr)operator(()ident(EL3HLT)operator(,) string<delimiter(")content(EL3HLT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EL3RST) + ident(set_syserr)operator(()ident(EL3RST)operator(,) string<delimiter(")content(EL3RST)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ELNRNG) + ident(set_syserr)operator(()ident(ELNRNG)operator(,) string<delimiter(")content(ELNRNG)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EUNATCH) + ident(set_syserr)operator(()ident(EUNATCH)operator(,) string<delimiter(")content(EUNATCH)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOCSI) + ident(set_syserr)operator(()ident(ENOCSI)operator(,) string<delimiter(")content(ENOCSI)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EL2HLT) + ident(set_syserr)operator(()ident(EL2HLT)operator(,) string<delimiter(")content(EL2HLT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EBADE) + ident(set_syserr)operator(()ident(EBADE)operator(,) string<delimiter(")content(EBADE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EBADR) + ident(set_syserr)operator(()ident(EBADR)operator(,) string<delimiter(")content(EBADR)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EXFULL) + ident(set_syserr)operator(()ident(EXFULL)operator(,) string<delimiter(")content(EXFULL)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOANO) + ident(set_syserr)operator(()ident(ENOANO)operator(,) string<delimiter(")content(ENOANO)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EBADRQC) + ident(set_syserr)operator(()ident(EBADRQC)operator(,) string<delimiter(")content(EBADRQC)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EBADSLT) + ident(set_syserr)operator(()ident(EBADSLT)operator(,) string<delimiter(")content(EBADSLT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EDEADLOCK) + ident(set_syserr)operator(()ident(EDEADLOCK)operator(,) string<delimiter(")content(EDEADLOCK)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EBFONT) + ident(set_syserr)operator(()ident(EBFONT)operator(,) string<delimiter(")content(EBFONT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOSTR) + ident(set_syserr)operator(()ident(ENOSTR)operator(,) string<delimiter(")content(ENOSTR)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENODATA) + ident(set_syserr)operator(()ident(ENODATA)operator(,) string<delimiter(")content(ENODATA)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ETIME) + ident(set_syserr)operator(()ident(ETIME)operator(,) string<delimiter(")content(ETIME)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOSR) + ident(set_syserr)operator(()ident(ENOSR)operator(,) string<delimiter(")content(ENOSR)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENONET) + ident(set_syserr)operator(()ident(ENONET)operator(,) string<delimiter(")content(ENONET)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOPKG) + ident(set_syserr)operator(()ident(ENOPKG)operator(,) string<delimiter(")content(ENOPKG)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EREMOTE) + ident(set_syserr)operator(()ident(EREMOTE)operator(,) string<delimiter(")content(EREMOTE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOLINK) + ident(set_syserr)operator(()ident(ENOLINK)operator(,) string<delimiter(")content(ENOLINK)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EADV) + ident(set_syserr)operator(()ident(EADV)operator(,) string<delimiter(")content(EADV)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ESRMNT) + ident(set_syserr)operator(()ident(ESRMNT)operator(,) string<delimiter(")content(ESRMNT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ECOMM) + ident(set_syserr)operator(()ident(ECOMM)operator(,) string<delimiter(")content(ECOMM)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EPROTO) + ident(set_syserr)operator(()ident(EPROTO)operator(,) string<delimiter(")content(EPROTO)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EMULTIHOP) + ident(set_syserr)operator(()ident(EMULTIHOP)operator(,) string<delimiter(")content(EMULTIHOP)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EDOTDOT) + ident(set_syserr)operator(()ident(EDOTDOT)operator(,) string<delimiter(")content(EDOTDOT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EBADMSG) + ident(set_syserr)operator(()ident(EBADMSG)operator(,) string<delimiter(")content(EBADMSG)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EOVERFLOW) + ident(set_syserr)operator(()ident(EOVERFLOW)operator(,) string<delimiter(")content(EOVERFLOW)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOTUNIQ) + ident(set_syserr)operator(()ident(ENOTUNIQ)operator(,) string<delimiter(")content(ENOTUNIQ)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EBADFD) + ident(set_syserr)operator(()ident(EBADFD)operator(,) string<delimiter(")content(EBADFD)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EREMCHG) + ident(set_syserr)operator(()ident(EREMCHG)operator(,) string<delimiter(")content(EREMCHG)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ELIBACC) + ident(set_syserr)operator(()ident(ELIBACC)operator(,) string<delimiter(")content(ELIBACC)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ELIBBAD) + ident(set_syserr)operator(()ident(ELIBBAD)operator(,) string<delimiter(")content(ELIBBAD)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ELIBSCN) + ident(set_syserr)operator(()ident(ELIBSCN)operator(,) string<delimiter(")content(ELIBSCN)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ELIBMAX) + ident(set_syserr)operator(()ident(ELIBMAX)operator(,) string<delimiter(")content(ELIBMAX)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ELIBEXEC) + ident(set_syserr)operator(()ident(ELIBEXEC)operator(,) string<delimiter(")content(ELIBEXEC)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EILSEQ) + ident(set_syserr)operator(()ident(EILSEQ)operator(,) string<delimiter(")content(EILSEQ)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ERESTART) + ident(set_syserr)operator(()ident(ERESTART)operator(,) string<delimiter(")content(ERESTART)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ESTRPIPE) + ident(set_syserr)operator(()ident(ESTRPIPE)operator(,) string<delimiter(")content(ESTRPIPE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EUSERS) + ident(set_syserr)operator(()ident(EUSERS)operator(,) string<delimiter(")content(EUSERS)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOTSOCK) + ident(set_syserr)operator(()ident(ENOTSOCK)operator(,) string<delimiter(")content(ENOTSOCK)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EDESTADDRREQ) + ident(set_syserr)operator(()ident(EDESTADDRREQ)operator(,) string<delimiter(")content(EDESTADDRREQ)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EMSGSIZE) + ident(set_syserr)operator(()ident(EMSGSIZE)operator(,) string<delimiter(")content(EMSGSIZE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EPROTOTYPE) + ident(set_syserr)operator(()ident(EPROTOTYPE)operator(,) string<delimiter(")content(EPROTOTYPE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOPROTOOPT) + ident(set_syserr)operator(()ident(ENOPROTOOPT)operator(,) string<delimiter(")content(ENOPROTOOPT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EPROTONOSUPPORT) + ident(set_syserr)operator(()ident(EPROTONOSUPPORT)operator(,) string<delimiter(")content(EPROTONOSUPPORT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ESOCKTNOSUPPORT) + ident(set_syserr)operator(()ident(ESOCKTNOSUPPORT)operator(,) string<delimiter(")content(ESOCKTNOSUPPORT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EOPNOTSUPP) + ident(set_syserr)operator(()ident(EOPNOTSUPP)operator(,) string<delimiter(")content(EOPNOTSUPP)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EPFNOSUPPORT) + ident(set_syserr)operator(()ident(EPFNOSUPPORT)operator(,) string<delimiter(")content(EPFNOSUPPORT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EAFNOSUPPORT) + ident(set_syserr)operator(()ident(EAFNOSUPPORT)operator(,) string<delimiter(")content(EAFNOSUPPORT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EADDRINUSE) + ident(set_syserr)operator(()ident(EADDRINUSE)operator(,) string<delimiter(")content(EADDRINUSE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EADDRNOTAVAIL) + ident(set_syserr)operator(()ident(EADDRNOTAVAIL)operator(,) string<delimiter(")content(EADDRNOTAVAIL)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENETDOWN) + ident(set_syserr)operator(()ident(ENETDOWN)operator(,) string<delimiter(")content(ENETDOWN)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENETUNREACH) + ident(set_syserr)operator(()ident(ENETUNREACH)operator(,) string<delimiter(")content(ENETUNREACH)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENETRESET) + ident(set_syserr)operator(()ident(ENETRESET)operator(,) string<delimiter(")content(ENETRESET)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ECONNABORTED) + ident(set_syserr)operator(()ident(ECONNABORTED)operator(,) string<delimiter(")content(ECONNABORTED)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ECONNRESET) + ident(set_syserr)operator(()ident(ECONNRESET)operator(,) string<delimiter(")content(ECONNRESET)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOBUFS) + ident(set_syserr)operator(()ident(ENOBUFS)operator(,) string<delimiter(")content(ENOBUFS)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EISCONN) + ident(set_syserr)operator(()ident(EISCONN)operator(,) string<delimiter(")content(EISCONN)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOTCONN) + ident(set_syserr)operator(()ident(ENOTCONN)operator(,) string<delimiter(")content(ENOTCONN)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ESHUTDOWN) + ident(set_syserr)operator(()ident(ESHUTDOWN)operator(,) string<delimiter(")content(ESHUTDOWN)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ETOOMANYREFS) + ident(set_syserr)operator(()ident(ETOOMANYREFS)operator(,) string<delimiter(")content(ETOOMANYREFS)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ETIMEDOUT) + ident(set_syserr)operator(()ident(ETIMEDOUT)operator(,) string<delimiter(")content(ETIMEDOUT)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ECONNREFUSED) + ident(set_syserr)operator(()ident(ECONNREFUSED)operator(,) string<delimiter(")content(ECONNREFUSED)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EHOSTDOWN) + ident(set_syserr)operator(()ident(EHOSTDOWN)operator(,) string<delimiter(")content(EHOSTDOWN)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EHOSTUNREACH) + ident(set_syserr)operator(()ident(EHOSTUNREACH)operator(,) string<delimiter(")content(EHOSTUNREACH)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EALREADY) + ident(set_syserr)operator(()ident(EALREADY)operator(,) string<delimiter(")content(EALREADY)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EINPROGRESS) + ident(set_syserr)operator(()ident(EINPROGRESS)operator(,) string<delimiter(")content(EINPROGRESS)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ESTALE) + ident(set_syserr)operator(()ident(ESTALE)operator(,) string<delimiter(")content(ESTALE)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EUCLEAN) + ident(set_syserr)operator(()ident(EUCLEAN)operator(,) string<delimiter(")content(EUCLEAN)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENOTNAM) + ident(set_syserr)operator(()ident(ENOTNAM)operator(,) string<delimiter(")content(ENOTNAM)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(ENAVAIL) + ident(set_syserr)operator(()ident(ENAVAIL)operator(,) string<delimiter(")content(ENAVAIL)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EISNAM) + ident(set_syserr)operator(()ident(EISNAM)operator(,) string<delimiter(")content(EISNAM)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EREMOTEIO) + ident(set_syserr)operator(()ident(EREMOTEIO)operator(,) string<delimiter(")content(EREMOTEIO)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(EDQUOT) + ident(set_syserr)operator(()ident(EDQUOT)operator(,) string<delimiter(")content(EDQUOT)delimiter(")>operator(\);) +preprocessor(#endif) +operator(}) + +directive(static) directive(void) +ident(err_append)operator(()ident(s)operator(\)) + directive(const) pre_type(char) operator(*)ident(s)operator(;) +operator({) + directive(extern) ident(VALUE) ident(ruby_errinfo)operator(;) + + reserved(if) operator(()ident(ruby_in_eval)operator(\)) operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_errinfo)operator(\)\)) operator({) + ident(ruby_errinfo) operator(=) ident(rb_exc_new2)operator(()ident(rb_eSyntaxError)operator(,) ident(s)operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(str) operator(=) ident(rb_obj_as_string)operator(()ident(ruby_errinfo)operator(\);) + + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")char(\\n)delimiter(")>operator(\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) ident(s)operator(\);) + ident(ruby_errinfo) operator(=) ident(rb_exc_new3)operator(()ident(rb_eSyntaxError)operator(,) ident(str)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(rb_write_error)operator(()ident(s)operator(\);) + ident(rb_write_error)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\);) + operator(}) +operator(}) +comment(/********************************************************************** + + eval.c - + + $Author: wyhaines $ + $Date: 2009-08-20 19:22:00 +0200 (Thu, 20 Aug 2009\) $ + created at: Thu Jun 10 14:22:17 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("node.h") +preprocessor(#include) include("env.h") +preprocessor(#include) include("util.h") +preprocessor(#include) include("rubysig.h") + +preprocessor(#ifdef) ident(HAVE_STDLIB_H) +preprocessor(#include) include(<stdlib.h>) +preprocessor(#endif) +preprocessor(#ifndef) ident(EXIT_SUCCESS) +preprocessor(#define) ident(EXIT_SUCCESS) integer(0) +preprocessor(#endif) +preprocessor(#ifndef) ident(EXIT_FAILURE) +preprocessor(#define) ident(EXIT_FAILURE) integer(1) +preprocessor(#endif) + +preprocessor(#include) include(<stdio.h>) + +preprocessor(#include) include("st.h") +preprocessor(#include) include("dln.h") + +preprocessor(#ifdef) ident(__APPLE__) +preprocessor(#include) include(<crt_externs.h>) +preprocessor(#endif) + +comment(/* Make alloca work the best possible way. */) +preprocessor(#ifdef) ident(__GNUC__) +preprocessor(# ifndef) ident(atarist) +preprocessor(# ifndef) ident(alloca) +preprocessor(# define) ident(alloca) ident(__builtin_alloca) +preprocessor(# endif) +preprocessor(# endif) comment(/* atarist */) +preprocessor(#else) +preprocessor(# ifdef) ident(HAVE_ALLOCA_H) +preprocessor(# include) include(<alloca.h>) +preprocessor(# else) +preprocessor(# ifndef) ident(_AIX) +preprocessor(# ifndef) ident(alloca) comment(/* predefined by HP cc +Olibcalls */) +directive(void) operator(*)ident(alloca) operator((\);) +preprocessor(# endif) +preprocessor(# endif) comment(/* AIX */) +preprocessor(# endif) comment(/* HAVE_ALLOCA_H */) +preprocessor(#endif) comment(/* __GNUC__ */) + +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(#include) include(<stdarg.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(,)ident(b)operator(\)) +preprocessor(#else) +preprocessor(#include) include(<varargs.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(\)) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_STRING_H) +pre_type(char) operator(*)ident(strrchr) ident(_)operator((()directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) + +preprocessor(#include) include(<time.h>) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_FCNTL_H)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) +preprocessor(#include) include(<fcntl.h>) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SYS_FCNTL_H)operator(\)) +preprocessor(#include) include(<sys/fcntl.h>) +preprocessor(#endif) +preprocessor(#ifdef) ident(__CYGWIN__) +preprocessor(#include) include(<io.h>) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__BEOS__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(BONE)operator(\)) +preprocessor(#include) include(<net/socket.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__MACOS__) +preprocessor(#include) include("macruby_private.h") +preprocessor(#endif) + +preprocessor(#ifdef) ident(__VMS) +preprocessor(#include) include("vmsruby_private.h") +preprocessor(#endif) + +preprocessor(#ifdef) ident(USE_CONTEXT) + +ident(NORETURN)operator(()directive(static) directive(void) ident(rb_jump_context)operator(()ident(rb_jmpbuf_t)operator(,) pre_type(int)operator(\)\);) +directive(static) directive(inline) directive(void) +ident(rb_jump_context)operator(()ident(env)operator(,) ident(val)operator(\)) + ident(rb_jmpbuf_t) ident(env)operator(;) + pre_type(int) ident(val)operator(;) +operator({) + ident(env)operator(->)ident(status) operator(=) ident(val)operator(;) + ident(setcontext)operator((&)ident(env)operator(->)ident(context)operator(\);) + ident(abort)operator((\);) comment(/* ensure noreturn */) +operator(}) +comment(/* + * PRE_GETCONTEXT and POST_GETCONTEXT is a magic for getcontext, gcc, + * IA64 register stack and SPARC register window combination problem. + * + * Assume following code sequence. + * + * 1. set a register in the register stack/window such as r32/l0. + * 2. call getcontext. + * 3. use the register. + * 4. update the register for other use. + * 5. call setcontext indirectly (or directly\). + * + * This code should be run as 1->2->3->4->5->3->4. + * But after second getcontext return (second 3\), + * the register is broken (updated\). + * It's because getcontext/setcontext doesn't preserve the content of the + * register stack/window. + * + * setjmp also doesn't preserve the content of the register stack/window. + * But it has not the problem because gcc knows setjmp may return twice. + * gcc detects setjmp and generates setjmp safe code. + * + * So setjmp calls before and after the getcontext call makes the code + * somewhat safe. + * It fix the problem on IA64. + * It is not required that setjmp is called at run time, since the problem is + * register usage. + * + * Since the magic setjmp is not enough for SPARC, + * inline asm is used to prohibit registers in register windows. + * + * Since the problem is fixed at gcc 4.0.3, the magic is applied only for + * prior versions of gcc. + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21957 + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22127 + */) +preprocessor(# define) ident(GCC_VERSION_BEFORE)operator(()ident(major)operator(,) ident(minor)operator(,) ident(patchlevel)operator(\)) \ + operator(()ident(defined)operator(()ident(__GNUC__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__INTEL_COMPILER)operator(\)) operator(&&) \ + operator((()ident(__GNUC__) operator(<) operator(()ident(major)operator(\)\)) operator(||) \ + operator(()ident(__GNUC__) operator(==) operator(()ident(major)operator(\)) operator(&&) ident(__GNUC_MINOR__) operator(<) operator(()ident(minor)operator(\)\)) operator(||) \ + operator(()ident(__GNUC__) operator(==) operator(()ident(major)operator(\)) operator(&&) ident(__GNUC_MINOR__) operator(==) operator(()ident(minor)operator(\)) operator(&&) ident(__GNUC_PATCHLEVEL__) operator(<) operator(()ident(patchlevel)operator(\)\)\)\)) +preprocessor(# if) ident(GCC_VERSION_BEFORE)operator(()integer(4)operator(,)integer(0)operator(,)integer(3)operator(\)) operator(&&) operator(()ident(defined)operator(()ident(sparc)operator(\)) operator(||) ident(defined)operator(()ident(__sparc__)operator(\)\)) +preprocessor(# ifdef) ident(__pic__) +comment(/* + * %l7 is excluded for PIC because it is PIC register. + * http://lists.freebsd.org/pipermail/freebsd-sparc64/2006-January/003739.html + */) +preprocessor(# define) ident(PRE_GETCONTEXT) \ + operator(({) ident(__asm__) directive(volatile) operator(()string<delimiter(")delimiter(")> operator(:) operator(:) operator(:) \ + string<delimiter(")content(%o0)delimiter(")>operator(,) string<delimiter(")content(%o1)delimiter(")>operator(,) string<delimiter(")content(%o2)delimiter(")>operator(,) string<delimiter(")content(%o3)delimiter(")>operator(,) string<delimiter(")content(%o4)delimiter(")>operator(,) string<delimiter(")content(%o5)delimiter(")>operator(,) string<delimiter(")content(%o7)delimiter(")>operator(,) \ + string<delimiter(")content(%l0)delimiter(")>operator(,) string<delimiter(")content(%l1)delimiter(")>operator(,) string<delimiter(")content(%l2)delimiter(")>operator(,) string<delimiter(")content(%l3)delimiter(")>operator(,) string<delimiter(")content(%l4)delimiter(")>operator(,) string<delimiter(")content(%l5)delimiter(")>operator(,) string<delimiter(")content(%l6)delimiter(")>operator(,) \ + string<delimiter(")content(%i0)delimiter(")>operator(,) string<delimiter(")content(%i1)delimiter(")>operator(,) string<delimiter(")content(%i2)delimiter(")>operator(,) string<delimiter(")content(%i3)delimiter(")>operator(,) string<delimiter(")content(%i4)delimiter(")>operator(,) string<delimiter(")content(%i5)delimiter(")>operator(,) string<delimiter(")content(%i7)delimiter(")>operator(\);) operator(}\)) +preprocessor(# else) +preprocessor(# define) ident(PRE_GETCONTEXT) \ + operator(({) ident(__asm__) directive(volatile) operator(()string<delimiter(")delimiter(")> operator(:) operator(:) operator(:) \ + string<delimiter(")content(%o0)delimiter(")>operator(,) string<delimiter(")content(%o1)delimiter(")>operator(,) string<delimiter(")content(%o2)delimiter(")>operator(,) string<delimiter(")content(%o3)delimiter(")>operator(,) string<delimiter(")content(%o4)delimiter(")>operator(,) string<delimiter(")content(%o5)delimiter(")>operator(,) string<delimiter(")content(%o7)delimiter(")>operator(,) \ + string<delimiter(")content(%l0)delimiter(")>operator(,) string<delimiter(")content(%l1)delimiter(")>operator(,) string<delimiter(")content(%l2)delimiter(")>operator(,) string<delimiter(")content(%l3)delimiter(")>operator(,) string<delimiter(")content(%l4)delimiter(")>operator(,) string<delimiter(")content(%l5)delimiter(")>operator(,) string<delimiter(")content(%l6)delimiter(")>operator(,) string<delimiter(")content(%l7)delimiter(")>operator(,) \ + string<delimiter(")content(%i0)delimiter(")>operator(,) string<delimiter(")content(%i1)delimiter(")>operator(,) string<delimiter(")content(%i2)delimiter(")>operator(,) string<delimiter(")content(%i3)delimiter(")>operator(,) string<delimiter(")content(%i4)delimiter(")>operator(,) string<delimiter(")content(%i5)delimiter(")>operator(,) string<delimiter(")content(%i7)delimiter(")>operator(\);) operator(}\)) +preprocessor(# endif) +preprocessor(# define) ident(POST_GETCONTEXT) ident(PRE_GETCONTEXT) +preprocessor(# elif) ident(GCC_VERSION_BEFORE)operator(()integer(4)operator(,)integer(0)operator(,)integer(3)operator(\)) operator(&&) ident(defined)operator(()ident(__ia64)operator(\)) +directive(static) ident(jmp_buf) ident(function_call_may_return_twice_jmp_buf)operator(;) +pre_type(int) ident(function_call_may_return_twice_false_1) operator(=) integer(0)operator(;) +pre_type(int) ident(function_call_may_return_twice_false_2) operator(=) integer(0)operator(;) +preprocessor(# define) ident(PRE_GETCONTEXT) \ + operator(()ident(function_call_may_return_twice_false_1) operator(?) \ + ident(setjmp)operator(()ident(function_call_may_return_twice_jmp_buf)operator(\)) operator(:) \ + integer(0)operator(\)) +preprocessor(# define) ident(POST_GETCONTEXT) \ + operator(()ident(function_call_may_return_twice_false_2) operator(?) \ + ident(setjmp)operator(()ident(function_call_may_return_twice_jmp_buf)operator(\)) operator(:) \ + integer(0)operator(\)) +preprocessor(# elif) ident(defined)operator(()ident(__FreeBSD__)operator(\)) operator(&&) ident(__FreeBSD__) operator(<) integer(7) +comment(/* + * workaround for FreeBSD/i386 getcontext/setcontext bug. + * clear the carry flag by (0 ? ... : ...\). + * FreeBSD PR 92110 http://www.freebsd.org/cgi/query-pr.cgi?pr=92110 + * [ruby-dev:28263] + */) +directive(static) pre_type(int) directive(volatile) ident(freebsd_clear_carry_flag) operator(=) integer(0)operator(;) +preprocessor(# define) ident(PRE_GETCONTEXT) \ + operator(()ident(freebsd_clear_carry_flag) operator(?) operator(()ident(freebsd_clear_carry_flag) operator(=) integer(0)operator(\)) operator(:) integer(0)operator(\)) +preprocessor(# endif) +preprocessor(# ifndef) ident(PRE_GETCONTEXT) +preprocessor(# define) ident(PRE_GETCONTEXT) integer(0) +preprocessor(# endif) +preprocessor(# ifndef) ident(POST_GETCONTEXT) +preprocessor(# define) ident(POST_GETCONTEXT) integer(0) +preprocessor(# endif) +preprocessor(# define) ident(ruby_longjmp)operator(()ident(env)operator(,) ident(val)operator(\)) ident(rb_jump_context)operator(()ident(env)operator(,) ident(val)operator(\)) +preprocessor(# define) ident(ruby_setjmp)operator(()ident(just_before_setjmp)operator(,) ident(j)operator(\)) operator((()ident(j)operator(\)->)ident(status) operator(=) integer(0)operator(,) \ + operator(()ident(just_before_setjmp)operator(\),) \ + ident(PRE_GETCONTEXT)operator(,) \ + ident(getcontext)operator((&()ident(j)operator(\)->)ident(context)operator(\),) \ + ident(POST_GETCONTEXT)operator(,) \ + operator(()ident(j)operator(\)->)ident(status)operator(\)) +preprocessor(#else) +preprocessor(# if) operator(!)ident(defined)operator(()ident(setjmp)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE__SETJMP)operator(\)) +preprocessor(# define) ident(ruby_setjmp)operator(()ident(just_before_setjmp)operator(,) ident(env)operator(\)) \ + operator((()ident(just_before_setjmp)operator(\),) ident(_setjmp)operator(()ident(env)operator(\)\)) +preprocessor(# define) ident(ruby_longjmp)operator(()ident(env)operator(,)ident(val)operator(\)) ident(_longjmp)operator(()ident(env)operator(,)ident(val)operator(\)) +preprocessor(# else) +preprocessor(# define) ident(ruby_setjmp)operator(()ident(just_before_setjmp)operator(,) ident(env)operator(\)) \ + operator((()ident(just_before_setjmp)operator(\),) ident(setjmp)operator(()ident(env)operator(\)\)) +preprocessor(# define) ident(ruby_longjmp)operator(()ident(env)operator(,)ident(val)operator(\)) ident(longjmp)operator(()ident(env)operator(,)ident(val)operator(\)) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<signal.h>) +preprocessor(#include) include(<errno.h>) + +preprocessor(#if) ident(defined)operator(()ident(__VMS)operator(\)) +preprocessor(#pragma) ident(nostandard) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_SYS_SELECT_H) +preprocessor(#include) include(<sys/select.h>) +preprocessor(#endif) + +preprocessor(#include) include(<sys/stat.h>) + +ident(VALUE) ident(rb_cProc)operator(;) +ident(VALUE) ident(rb_cBinding)operator(;) +directive(static) ident(VALUE) ident(proc_invoke) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(,)ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_f_binding) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) directive(void) ident(rb_f_END) ident(_)operator((()directive(void)operator(\)\);) +directive(static) ident(VALUE) ident(rb_f_block_given_p) ident(_)operator((()directive(void)operator(\)\);) +directive(static) ident(VALUE) ident(block_pass) ident(_)operator((()ident(VALUE)operator(,)ident(NODE)operator(*\)\);) + +ident(VALUE) ident(rb_cMethod)operator(;) +directive(static) ident(VALUE) ident(method_call) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_cUnboundMethod)operator(;) +directive(static) ident(VALUE) ident(umethod_bind) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_mod_define_method) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(NORETURN)operator(()directive(static) directive(void) ident(rb_raise_jump) ident(_)operator((()ident(VALUE)operator(\)\)\);) +directive(static) ident(VALUE) ident(rb_make_exception) ident(_)operator((()pre_type(int) ident(argc)operator(,) ident(VALUE) operator(*)ident(argv)operator(\)\);) + +directive(static) pre_type(int) ident(scope_vmode)operator(;) +preprocessor(#define) ident(SCOPE_PUBLIC) integer(0) +preprocessor(#define) ident(SCOPE_PRIVATE) integer(1) +preprocessor(#define) ident(SCOPE_PROTECTED) integer(2) +preprocessor(#define) ident(SCOPE_MODFUNC) integer(5) +preprocessor(#define) ident(SCOPE_MASK) integer(7) +preprocessor(#define) ident(SCOPE_SET)operator(()ident(f)operator(\)) operator(()ident(scope_vmode)operator(=()ident(f)operator(\)\)) +preprocessor(#define) ident(SCOPE_TEST)operator(()ident(f)operator(\)) operator(()ident(scope_vmode)operator(&()ident(f)operator(\)\)) + +ident(VALUE) operator((*)ident(ruby_sandbox_save)operator(\))ident(_)operator((()ident(rb_thread_t)operator(\)\);) +ident(VALUE) operator((*)ident(ruby_sandbox_restore)operator(\))ident(_)operator((()ident(rb_thread_t)operator(\)\);) +ident(NODE)operator(*) ident(ruby_current_node)operator(;) +pre_type(int) ident(ruby_safe_level) operator(=) integer(0)operator(;) +comment(/* safe-level: + 0 - strings from streams/environment/ARGV are tainted (default\) + 1 - no dangerous operation by tainted value + 2 - process/file operations prohibited + 3 - all generated objects are tainted + 4 - no global (non-tainted\) variable modification/no direct output +*/) + +directive(static) ident(VALUE) ident(safe_getter) ident(_)operator((()directive(void)operator(\)\);) +directive(static) directive(void) ident(safe_setter) ident(_)operator((()ident(VALUE) ident(val)operator(\)\);) + +directive(void) +ident(rb_secure)operator(()ident(level)operator(\)) + pre_type(int) ident(level)operator(;) +operator({) + reserved(if) operator(()ident(level) operator(<=) ident(ruby_safe_level)operator(\)) operator({) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure operation `%s' at level %d)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\),) ident(ruby_safe_level)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure operation at level %d)delimiter(")>operator(,) ident(ruby_safe_level)operator(\);) + operator(}) + operator(}) +operator(}) + +directive(void) +ident(rb_secure_update)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) ident(rb_secure)operator(()integer(4)operator(\);) +operator(}) + +directive(void) +ident(rb_check_safe_obj)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + reserved(if) operator(()ident(ruby_safe_level) operator(>) integer(0) operator(&&) ident(OBJ_TAINTED)operator(()ident(x)operator(\)\){) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure operation - %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure operation: -r)delimiter(")>operator(\);) + operator(}) + operator(}) + ident(rb_secure)operator(()integer(4)operator(\);) +operator(}) + +directive(void) +ident(rb_check_safe_str)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + ident(rb_check_safe_obj)operator(()ident(x)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(x)operator(\)!=) ident(T_STRING)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type %s (expected String\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(x)operator(\)\);) + operator(}) +operator(}) + +ident(NORETURN)operator(()directive(static) directive(void) ident(print_undef) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\)\);) +directive(static) directive(void) +ident(print_undef)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(undefined method `%s' for %s `%s')delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\),) + operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_MODULE)operator(\)) operator(?) string<delimiter(")content(module)delimiter(")> operator(:) string<delimiter(")content(class)delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(klass)operator(\)\);) +operator(}) + +directive(static) ident(ID) ident(removed)operator(,) ident(singleton_removed)operator(,) ident(undefined)operator(,) ident(singleton_undefined)operator(;) + +preprocessor(#define) ident(CACHE_SIZE) hex(0x800) +preprocessor(#define) ident(CACHE_MASK) hex(0x7ff) +preprocessor(#define) ident(EXPR1)operator(()ident(c)operator(,)ident(m)operator(\)) operator((((()ident(c)operator(\)>>)integer(3)operator(\)^()ident(m)operator(\)\)&)ident(CACHE_MASK)operator(\)) + +reserved(struct) ident(cache_entry) operator({) comment(/* method hash table. */) + ident(ID) ident(mid)operator(;) comment(/* method's id */) + ident(ID) ident(mid0)operator(;) comment(/* method's original id */) + ident(VALUE) ident(klass)operator(;) comment(/* receiver's class */) + ident(VALUE) ident(origin)operator(;) comment(/* where method defined */) + ident(NODE) operator(*)ident(method)operator(;) + pre_type(int) ident(noex)operator(;) +operator(};) + +directive(static) reserved(struct) ident(cache_entry) ident(cache)operator([)ident(CACHE_SIZE)operator(];) +directive(static) pre_type(int) ident(ruby_running) operator(=) integer(0)operator(;) + +directive(void) +ident(rb_clear_cache)operator((\)) +operator({) + reserved(struct) ident(cache_entry) operator(*)ident(ent)operator(,) operator(*)ident(end)operator(;) + + reserved(if) operator((!)ident(ruby_running)operator(\)) reserved(return)operator(;) + ident(ent) operator(=) ident(cache)operator(;) ident(end) operator(=) ident(ent) operator(+) ident(CACHE_SIZE)operator(;) + reserved(while) operator(()ident(ent) operator(<) ident(end)operator(\)) operator({) + ident(ent)operator(->)ident(mid) operator(=) integer(0)operator(;) + ident(ent)operator(++;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(rb_clear_cache_for_undef)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(struct) ident(cache_entry) operator(*)ident(ent)operator(,) operator(*)ident(end)operator(;) + + reserved(if) operator((!)ident(ruby_running)operator(\)) reserved(return)operator(;) + ident(ent) operator(=) ident(cache)operator(;) ident(end) operator(=) ident(ent) operator(+) ident(CACHE_SIZE)operator(;) + reserved(while) operator(()ident(ent) operator(<) ident(end)operator(\)) operator({) + reserved(if) operator(()ident(ent)operator(->)ident(mid) operator(==) ident(id) operator(&&) + ident(RCLASS)operator(()ident(ent)operator(->)ident(origin)operator(\)->)ident(m_tbl) operator(==) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(\)) operator({) + ident(ent)operator(->)ident(mid) operator(=) integer(0)operator(;) + operator(}) + ident(ent)operator(++;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(rb_clear_cache_by_id)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(struct) ident(cache_entry) operator(*)ident(ent)operator(,) operator(*)ident(end)operator(;) + + reserved(if) operator((!)ident(ruby_running)operator(\)) reserved(return)operator(;) + ident(ent) operator(=) ident(cache)operator(;) ident(end) operator(=) ident(ent) operator(+) ident(CACHE_SIZE)operator(;) + reserved(while) operator(()ident(ent) operator(<) ident(end)operator(\)) operator({) + reserved(if) operator(()ident(ent)operator(->)ident(mid) operator(==) ident(id)operator(\)) operator({) + ident(ent)operator(->)ident(mid) operator(=) integer(0)operator(;) + operator(}) + ident(ent)operator(++;) + operator(}) +operator(}) + +directive(void) +ident(rb_clear_cache_by_class)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(struct) ident(cache_entry) operator(*)ident(ent)operator(,) operator(*)ident(end)operator(;) + + reserved(if) operator((!)ident(ruby_running)operator(\)) reserved(return)operator(;) + ident(ent) operator(=) ident(cache)operator(;) ident(end) operator(=) ident(ent) operator(+) ident(CACHE_SIZE)operator(;) + reserved(while) operator(()ident(ent) operator(<) ident(end)operator(\)) operator({) + reserved(if) operator(()ident(ent)operator(->)ident(klass) operator(==) ident(klass) operator(||) ident(ent)operator(->)ident(origin) operator(==) ident(klass)operator(\)) operator({) + ident(ent)operator(->)ident(mid) operator(=) integer(0)operator(;) + operator(}) + ident(ent)operator(++;) + operator(}) +operator(}) + +directive(static) ident(ID) ident(init)operator(,) ident(eqq)operator(,) ident(each)operator(,) ident(aref)operator(,) ident(aset)operator(,) ident(match)operator(,) ident(missing)operator(;) +directive(static) ident(ID) ident(added)operator(,) ident(singleton_added)operator(;) +directive(static) ident(ID) ident(__id__)operator(,) ident(__send__)operator(,) ident(respond_to)operator(;) + +preprocessor(#define) ident(NOEX_TAINTED) integer(8) +preprocessor(#define) ident(NOEX_SAFE)operator(()ident(n)operator(\)) operator((()ident(n)operator(\)) operator(>>) integer(4)operator(\)) +preprocessor(#define) ident(NOEX_WITH)operator(()ident(n)operator(,) ident(v)operator(\)) operator((()ident(n)operator(\)) operator(|) operator(()ident(v)operator(\)) operator(<<) integer(4)operator(\)) +preprocessor(#define) ident(NOEX_WITH_SAFE)operator(()ident(n)operator(\)) ident(NOEX_WITH)operator(()ident(n)operator(,) ident(ruby_safe_level)operator(\)) + +directive(void) +ident(rb_add_method)operator(()ident(klass)operator(,) ident(mid)operator(,) ident(node)operator(,) ident(noex)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(mid)operator(;) + ident(NODE) operator(*)ident(node)operator(;) + pre_type(int) ident(noex)operator(;) +operator({) + ident(NODE) operator(*)ident(body)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(klass)operator(\)\)) ident(klass) operator(=) ident(rb_cObject)operator(;) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4) operator(&&) operator(()ident(klass) operator(==) ident(rb_cObject) operator(||) operator(!)ident(OBJ_TAINTED)operator(()ident(klass)operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't define method)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)) operator(&&) + ident(node) operator(&&) ident(nd_type)operator(()ident(node)operator(\)) operator(!=) ident(NODE_ZSUPER) operator(&&) + operator(()ident(mid) operator(==) ident(rb_intern)operator(()string<delimiter(")content(initialize)delimiter(")> operator(\)||) ident(mid) operator(==) ident(rb_intern)operator(()string<delimiter(")content(initialize_copy)delimiter(")>operator(\)\)\)) operator({) + ident(noex) operator(=) ident(NOEX_PRIVATE) operator(|) ident(noex)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)) operator(&&) ident(node) operator(&&) ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_CFUNC) operator(&&) + ident(mid) operator(==) ident(rb_intern)operator(()string<delimiter(")content(allocate)delimiter(")>operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(defining %s.allocate is deprecated; use rb_define_alloc_func(\))delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(rb_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\)\)\);) + ident(mid) operator(=) ident(ID_ALLOCATOR)operator(;) + operator(}) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(klass)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(class/module)delimiter(")>operator(\);) + ident(rb_clear_cache_by_id)operator(()ident(mid)operator(\);) + ident(body) operator(=) ident(NEW_METHOD)operator(()ident(node)operator(,) ident(NOEX_WITH_SAFE)operator(()ident(noex)operator(\)\);) + ident(st_insert)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) ident(mid)operator(,) operator(()ident(st_data_t)operator(\))ident(body)operator(\);) + reserved(if) operator(()ident(node) operator(&&) ident(mid) operator(!=) ident(ID_ALLOCATOR) operator(&&) ident(ruby_running)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_funcall)operator(()ident(rb_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\),) ident(singleton_added)operator(,) integer(1)operator(,) ident(ID2SYM)operator(()ident(mid)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(rb_funcall)operator(()ident(klass)operator(,) ident(added)operator(,) integer(1)operator(,) ident(ID2SYM)operator(()ident(mid)operator(\)\);) + operator(}) + operator(}) +operator(}) + +directive(void) +ident(rb_define_alloc_func)operator(()ident(klass)operator(,) ident(func)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)) ident(_)operator((()ident(VALUE)operator(\)\);) +operator({) + ident(Check_Type)operator(()ident(klass)operator(,) ident(T_CLASS)operator(\);) + ident(rb_add_method)operator(()ident(rb_singleton_class)operator(()ident(klass)operator(\),) ident(ID_ALLOCATOR)operator(,) ident(NEW_CFUNC)operator(()ident(func)operator(,) integer(0)operator(\),) + ident(NOEX_PRIVATE)operator(\);) +operator(}) + +directive(void) +ident(rb_undef_alloc_func)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(Check_Type)operator(()ident(klass)operator(,) ident(T_CLASS)operator(\);) + ident(rb_add_method)operator(()ident(rb_singleton_class)operator(()ident(klass)operator(\),) ident(ID_ALLOCATOR)operator(,) integer(0)operator(,) ident(NOEX_UNDEF)operator(\);) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(search_method)operator(()ident(klass)operator(,) ident(id)operator(,) ident(origin)operator(\)) + ident(VALUE) ident(klass)operator(,) operator(*)ident(origin)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(st_data_t) ident(body)operator(;) + + reserved(if) operator((!)ident(klass)operator(\)) reserved(return) integer(0)operator(;) + reserved(while) operator((!)ident(st_lookup)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) ident(id)operator(,) operator(&)ident(body)operator(\)\)) operator({) + ident(klass) operator(=) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) + reserved(if) operator((!)ident(klass)operator(\)) reserved(return) integer(0)operator(;) + operator(}) + + reserved(if) operator(()ident(origin)operator(\)) operator(*)ident(origin) operator(=) ident(klass)operator(;) + reserved(return) operator(()ident(NODE) operator(*\))ident(body)operator(;) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(rb_get_method_body)operator(()ident(klassp)operator(,) ident(idp)operator(,) ident(noexp)operator(\)) + ident(VALUE) operator(*)ident(klassp)operator(;) + ident(ID) operator(*)ident(idp)operator(;) + pre_type(int) operator(*)ident(noexp)operator(;) +operator({) + ident(ID) ident(id) operator(=) operator(*)ident(idp)operator(;) + ident(VALUE) ident(klass) operator(=) operator(*)ident(klassp)operator(;) + ident(VALUE) ident(origin)operator(;) + ident(NODE) operator(*) directive(volatile) ident(body)operator(;) + reserved(struct) ident(cache_entry) operator(*)ident(ent)operator(;) + + reserved(if) operator((()ident(body) operator(=) ident(search_method)operator(()ident(klass)operator(,) ident(id)operator(,) operator(&)ident(origin)operator(\)\)) operator(==) integer(0) operator(||) operator(!)ident(body)operator(->)ident(nd_body)operator(\)) operator({) + comment(/* store empty info in cache */) + ident(ent) operator(=) ident(cache) operator(+) ident(EXPR1)operator(()ident(klass)operator(,) ident(id)operator(\);) + ident(ent)operator(->)ident(klass) operator(=) ident(klass)operator(;) + ident(ent)operator(->)ident(origin) operator(=) ident(klass)operator(;) + ident(ent)operator(->)ident(mid) operator(=) ident(ent)operator(->)ident(mid0) operator(=) ident(id)operator(;) + ident(ent)operator(->)ident(noex) operator(=) integer(0)operator(;) + ident(ent)operator(->)ident(method) operator(=) integer(0)operator(;) + + reserved(return) integer(0)operator(;) + operator(}) + + reserved(if) operator(()ident(ruby_running)operator(\)) operator({) + comment(/* store in cache */) + ident(ent) operator(=) ident(cache) operator(+) ident(EXPR1)operator(()ident(klass)operator(,) ident(id)operator(\);) + ident(ent)operator(->)ident(klass) operator(=) ident(klass)operator(;) + ident(ent)operator(->)ident(noex) operator(=) ident(body)operator(->)ident(nd_noex)operator(;) + reserved(if) operator(()ident(noexp)operator(\)) operator(*)ident(noexp) operator(=) ident(body)operator(->)ident(nd_noex)operator(;) + ident(body) operator(=) ident(body)operator(->)ident(nd_body)operator(;) + reserved(if) operator(()ident(nd_type)operator(()ident(body)operator(\)) operator(==) ident(NODE_FBODY)operator(\)) operator({) + ident(ent)operator(->)ident(mid) operator(=) ident(id)operator(;) + operator(*)ident(klassp) operator(=) ident(body)operator(->)ident(nd_orig)operator(;) + ident(ent)operator(->)ident(origin) operator(=) ident(body)operator(->)ident(nd_orig)operator(;) + operator(*)ident(idp) operator(=) ident(ent)operator(->)ident(mid0) operator(=) ident(body)operator(->)ident(nd_mid)operator(;) + ident(body) operator(=) ident(ent)operator(->)ident(method) operator(=) ident(body)operator(->)ident(nd_head)operator(;) + operator(}) + reserved(else) operator({) + operator(*)ident(klassp) operator(=) ident(origin)operator(;) + ident(ent)operator(->)ident(origin) operator(=) ident(origin)operator(;) + ident(ent)operator(->)ident(mid) operator(=) ident(ent)operator(->)ident(mid0) operator(=) ident(id)operator(;) + ident(ent)operator(->)ident(method) operator(=) ident(body)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(noexp)operator(\)) operator(*)ident(noexp) operator(=) ident(body)operator(->)ident(nd_noex)operator(;) + ident(body) operator(=) ident(body)operator(->)ident(nd_body)operator(;) + reserved(if) operator(()ident(nd_type)operator(()ident(body)operator(\)) operator(==) ident(NODE_FBODY)operator(\)) operator({) + operator(*)ident(klassp) operator(=) ident(body)operator(->)ident(nd_orig)operator(;) + operator(*)ident(idp) operator(=) ident(body)operator(->)ident(nd_mid)operator(;) + ident(body) operator(=) ident(body)operator(->)ident(nd_head)operator(;) + operator(}) + reserved(else) operator({) + operator(*)ident(klassp) operator(=) ident(origin)operator(;) + operator(}) + operator(}) + + reserved(return) ident(body)operator(;) +operator(}) + +ident(NODE)operator(*) +ident(rb_method_node)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + pre_type(int) ident(noex)operator(;) + + reserved(return) ident(rb_get_method_body)operator((&)ident(klass)operator(,) operator(&)ident(id)operator(,) operator(&)ident(noex)operator(\);) +operator(}) + +directive(static) directive(void) +ident(remove_method)operator(()ident(klass)operator(,) ident(mid)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(mid)operator(;) +operator({) + ident(st_data_t) ident(data)operator(;) + ident(NODE) operator(*)ident(body) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(klass) operator(==) ident(rb_cObject)operator(\)) operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + operator(}) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(klass)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't remove method)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(klass)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(class/module)delimiter(")>operator(\);) + reserved(if) operator(()ident(mid) operator(==) ident(__id__) operator(||) ident(mid) operator(==) ident(__send__) operator(||) ident(mid) operator(==) ident(init)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(removing `%s' may cause serious problem)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(mid)operator(\)\);) + operator(}) + reserved(if) operator(()ident(st_lookup)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) ident(mid)operator(,) operator(&)ident(data)operator(\)\)) operator({) + ident(body) operator(=) operator(()ident(NODE) operator(*\))ident(data)operator(;) + reserved(if) operator((!)ident(body) operator(||) operator(!)ident(body)operator(->)ident(nd_body)operator(\)) ident(body) operator(=) integer(0)operator(;) + reserved(else) operator({) + ident(st_delete)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) operator(&)ident(mid)operator(,) operator(&)ident(data)operator(\);) + operator(}) + operator(}) + reserved(if) operator((!)ident(body)operator(\)) operator({) + ident(rb_name_error)operator(()ident(mid)operator(,) string<delimiter(")content(method `%s' not defined in %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(mid)operator(\),) ident(rb_class2name)operator(()ident(klass)operator(\)\);) + operator(}) + ident(rb_clear_cache_for_undef)operator(()ident(klass)operator(,) ident(mid)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_funcall)operator(()ident(rb_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\),) ident(singleton_removed)operator(,) integer(1)operator(,) ident(ID2SYM)operator(()ident(mid)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(rb_funcall)operator(()ident(klass)operator(,) ident(removed)operator(,) integer(1)operator(,) ident(ID2SYM)operator(()ident(mid)operator(\)\);) + operator(}) +operator(}) + +directive(void) +ident(rb_remove_method)operator(()ident(klass)operator(,) ident(name)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(remove_method)operator(()ident(klass)operator(,) ident(rb_intern)operator(()ident(name)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * remove_method(symbol\) => self + * + * Removes the method identified by _symbol_ from the current + * class. For an example, see <code>Module.undef_method</code>. + */) + +directive(static) ident(VALUE) +ident(rb_mod_remove_method)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(mod)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(remove_method)operator(()ident(mod)operator(,) ident(rb_to_id)operator(()ident(argv)operator([)ident(i)operator(]\)\);) + operator(}) + reserved(return) ident(mod)operator(;) +operator(}) + +preprocessor(#undef) ident(rb_disable_super) +preprocessor(#undef) ident(rb_enable_super) + +directive(void) +ident(rb_disable_super)operator(()ident(klass)operator(,) ident(name)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + comment(/* obsolete - no use */) +operator(}) + +directive(void) +ident(rb_enable_super)operator(()ident(klass)operator(,) ident(name)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(rb_enable_super(\) is obsolete)delimiter(")>operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_export_method)operator(()ident(klass)operator(,) ident(name)operator(,) ident(noex)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(name)operator(;) + ident(ID) ident(noex)operator(;) +operator({) + ident(NODE) operator(*)ident(body)operator(;) + ident(VALUE) ident(origin)operator(;) + + reserved(if) operator(()ident(klass) operator(==) ident(rb_cObject)operator(\)) operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + operator(}) + ident(body) operator(=) ident(search_method)operator(()ident(klass)operator(,) ident(name)operator(,) operator(&)ident(origin)operator(\);) + reserved(if) operator((!)ident(body) operator(&&) ident(TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_MODULE)operator(\)) operator({) + ident(body) operator(=) ident(search_method)operator(()ident(rb_cObject)operator(,) ident(name)operator(,) operator(&)ident(origin)operator(\);) + operator(}) + reserved(if) operator((!)ident(body) operator(||) operator(!)ident(body)operator(->)ident(nd_body)operator(\)) operator({) + ident(print_undef)operator(()ident(klass)operator(,) ident(name)operator(\);) + operator(}) + reserved(if) operator(()ident(body)operator(->)ident(nd_noex) operator(!=) ident(noex)operator(\)) operator({) + reserved(if) operator(()ident(klass) operator(==) ident(origin)operator(\)) operator({) + ident(body)operator(->)ident(nd_noex) operator(=) ident(noex)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_add_method)operator(()ident(klass)operator(,) ident(name)operator(,) ident(NEW_ZSUPER)operator((\),) ident(noex)operator(\);) + operator(}) + operator(}) +operator(}) + +pre_type(int) +ident(rb_method_boundp)operator(()ident(klass)operator(,) ident(id)operator(,) ident(ex)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(ex)operator(;) +operator({) + reserved(struct) ident(cache_entry) operator(*)ident(ent)operator(;) + pre_type(int) ident(noex)operator(;) + + comment(/* is it in the method cache? */) + ident(ent) operator(=) ident(cache) operator(+) ident(EXPR1)operator(()ident(klass)operator(,) ident(id)operator(\);) + reserved(if) operator(()ident(ent)operator(->)ident(mid) operator(==) ident(id) operator(&&) ident(ent)operator(->)ident(klass) operator(==) ident(klass)operator(\)) operator({) + reserved(if) operator(()ident(ex) operator(&&) operator(()ident(ent)operator(->)ident(noex) operator(&) ident(NOEX_PRIVATE)operator(\)\)) + reserved(return) ident(Qfalse)operator(;) + reserved(if) operator((!)ident(ent)operator(->)ident(method)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(if) operator(()ident(rb_get_method_body)operator((&)ident(klass)operator(,) operator(&)ident(id)operator(,) operator(&)ident(noex)operator(\)\)) operator({) + reserved(if) operator(()ident(ex) operator(&&) operator(()ident(noex) operator(&) ident(NOEX_PRIVATE)operator(\)\)) + reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(void) +ident(rb_attr)operator(()ident(klass)operator(,) ident(id)operator(,) ident(read)operator(,) ident(write)operator(,) ident(ex)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(read)operator(,) ident(write)operator(,) ident(ex)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + pre_type(char) operator(*)ident(buf)operator(;) + ident(ID) ident(attriv)operator(;) + pre_type(int) ident(noex)operator(;) + ident(size_t) ident(len)operator(;) + + reserved(if) operator((!)ident(ex)operator(\)) ident(noex) operator(=) ident(NOEX_PUBLIC)operator(;) + reserved(else) operator({) + reserved(if) operator(()ident(SCOPE_TEST)operator(()ident(SCOPE_PRIVATE)operator(\)\)) operator({) + ident(noex) operator(=) ident(NOEX_PRIVATE)operator(;) + ident(rb_warning)operator((()ident(scope_vmode) operator(==) ident(SCOPE_MODFUNC)operator(\)) operator(?) + string<delimiter(")content(attribute accessor as module_function)delimiter(")> operator(:) + string<delimiter(")content(private attribute?)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(SCOPE_TEST)operator(()ident(SCOPE_PROTECTED)operator(\)\)) operator({) + ident(noex) operator(=) ident(NOEX_PROTECTED)operator(;) + operator(}) + reserved(else) operator({) + ident(noex) operator(=) ident(NOEX_PUBLIC)operator(;) + operator(}) + operator(}) + + reserved(if) operator((!)ident(rb_is_local_id)operator(()ident(id)operator(\)) operator(&&) operator(!)ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(invalid attribute name `%s')delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + ident(name) operator(=) ident(rb_id2name)operator(()ident(id)operator(\);) + reserved(if) operator((!)ident(name)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(argument needs to be symbol or string)delimiter(")>operator(\);) + operator(}) + ident(len) operator(=) ident(strlen)operator(()ident(name)operator(\)+)integer(2)operator(;) + ident(buf) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,)ident(len)operator(\);) + ident(snprintf)operator(()ident(buf)operator(,) ident(len)operator(,) string<delimiter(")content(@%s)delimiter(")>operator(,) ident(name)operator(\);) + ident(attriv) operator(=) ident(rb_intern)operator(()ident(buf)operator(\);) + reserved(if) operator(()ident(read)operator(\)) operator({) + ident(rb_add_method)operator(()ident(klass)operator(,) ident(id)operator(,) ident(NEW_IVAR)operator(()ident(attriv)operator(\),) ident(noex)operator(\);) + operator(}) + reserved(if) operator(()ident(write)operator(\)) operator({) + ident(rb_add_method)operator(()ident(klass)operator(,) ident(rb_id_attrset)operator(()ident(id)operator(\),) ident(NEW_ATTRSET)operator(()ident(attriv)operator(\),) ident(noex)operator(\);) + operator(}) +operator(}) + +directive(extern) pre_type(int) ident(ruby_in_compile)operator(;) + +ident(VALUE) ident(ruby_errinfo) operator(=) ident(Qnil)operator(;) +directive(extern) ident(NODE) operator(*)ident(ruby_eval_tree_begin)operator(;) +directive(extern) ident(NODE) operator(*)ident(ruby_eval_tree)operator(;) +directive(extern) pre_type(int) ident(ruby_nerrs)operator(;) + +ident(VALUE) ident(rb_eLocalJumpError)operator(;) +ident(VALUE) ident(rb_eSysStackError)operator(;) + +directive(extern) ident(VALUE) ident(ruby_top_self)operator(;) + +reserved(struct) ident(FRAME) operator(*)ident(ruby_frame)operator(;) +reserved(struct) ident(SCOPE) operator(*)ident(ruby_scope)operator(;) +directive(static) reserved(struct) ident(FRAME) operator(*)ident(top_frame)operator(;) +directive(static) reserved(struct) ident(SCOPE) operator(*)ident(top_scope)operator(;) + +directive(static) pre_type(unsigned) pre_type(long) ident(frame_unique) operator(=) integer(0)operator(;) + +preprocessor(#define) ident(PUSH_FRAME)operator((\)) reserved(do) operator({) \ + directive(volatile) reserved(struct) ident(FRAME) ident(_frame)operator(;) \ + ident(_frame)operator(.)ident(prev) operator(=) ident(ruby_frame)operator(;) \ + ident(_frame)operator(.)ident(tmp) operator(=) integer(0)operator(;) \ + ident(_frame)operator(.)ident(node) operator(=) ident(ruby_current_node)operator(;) \ + ident(_frame)operator(.)ident(iter) operator(=) ident(ruby_iter)operator(->)ident(iter)operator(;) \ + ident(_frame)operator(.)ident(argc) operator(=) integer(0)operator(;) \ + ident(_frame)operator(.)ident(flags) operator(=) integer(0)operator(;) \ + ident(_frame)operator(.)ident(uniq) operator(=) ident(frame_unique)operator(++;) \ + ident(ruby_frame) operator(=) operator(&)ident(_frame) + +preprocessor(#define) ident(POP_FRAME)operator((\)) \ + ident(ruby_current_node) operator(=) ident(_frame)operator(.)ident(node)operator(;) \ + ident(ruby_frame) operator(=) ident(_frame)operator(.)ident(prev)operator(;) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +reserved(struct) ident(BLOCK) operator({) + ident(NODE) operator(*)ident(var)operator(;) + ident(NODE) operator(*)ident(body)operator(;) + ident(VALUE) ident(self)operator(;) + reserved(struct) ident(FRAME) ident(frame)operator(;) + reserved(struct) ident(SCOPE) operator(*)ident(scope)operator(;) + ident(VALUE) ident(klass)operator(;) + ident(NODE) operator(*)ident(cref)operator(;) + pre_type(int) ident(iter)operator(;) + pre_type(int) ident(vmode)operator(;) + pre_type(int) ident(flags)operator(;) + pre_type(int) ident(uniq)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(dyna_vars)operator(;) + ident(VALUE) ident(orig_thread)operator(;) + ident(VALUE) ident(wrapper)operator(;) + ident(VALUE) ident(block_obj)operator(;) + reserved(struct) ident(BLOCK) operator(*)ident(outer)operator(;) + reserved(struct) ident(BLOCK) operator(*)ident(prev)operator(;) +operator(};) + +preprocessor(#define) ident(BLOCK_D_SCOPE) integer(1) +preprocessor(#define) ident(BLOCK_LAMBDA) integer(2) + +directive(static) reserved(struct) ident(BLOCK) operator(*)ident(ruby_block)operator(;) +directive(static) pre_type(unsigned) pre_type(long) ident(block_unique) operator(=) integer(1)operator(;) + +preprocessor(#define) ident(PUSH_BLOCK)operator(()ident(v)operator(,)ident(b)operator(\)) reserved(do) operator({) \ + reserved(struct) ident(BLOCK) ident(_block)operator(;) \ + ident(_block)operator(.)ident(var) operator(=) operator(()ident(v)operator(\);) \ + ident(_block)operator(.)ident(body) operator(=) operator(()ident(b)operator(\);) \ + ident(_block)operator(.)ident(self) operator(=) ident(self)operator(;) \ + ident(_block)operator(.)ident(frame) operator(=) operator(*)ident(ruby_frame)operator(;) \ + ident(_block)operator(.)ident(klass) operator(=) ident(ruby_class)operator(;) \ + ident(_block)operator(.)ident(cref) operator(=) ident(ruby_cref)operator(;) \ + ident(_block)operator(.)ident(frame)operator(.)ident(node) operator(=) ident(ruby_current_node)operator(;)\ + ident(_block)operator(.)ident(scope) operator(=) ident(ruby_scope)operator(;) \ + ident(_block)operator(.)ident(prev) operator(=) ident(ruby_block)operator(;) \ + ident(_block)operator(.)ident(outer) operator(=) ident(ruby_block)operator(;) \ + ident(_block)operator(.)ident(iter) operator(=) ident(ruby_iter)operator(->)ident(iter)operator(;) \ + ident(_block)operator(.)ident(vmode) operator(=) ident(scope_vmode)operator(;) \ + ident(_block)operator(.)ident(flags) operator(=) ident(BLOCK_D_SCOPE)operator(;) \ + ident(_block)operator(.)ident(dyna_vars) operator(=) ident(ruby_dyna_vars)operator(;) \ + ident(_block)operator(.)ident(wrapper) operator(=) ident(ruby_wrapper)operator(;) \ + ident(_block)operator(.)ident(block_obj) operator(=) integer(0)operator(;) \ + ident(_block)operator(.)ident(uniq) operator(=) operator(()ident(b)operator(\)?)ident(block_unique)operator(++:)integer(0)operator(;) \ + reserved(if) operator(()ident(b)operator(\)) operator({) \ + ident(prot_tag)operator(->)ident(blkid) operator(=) ident(_block)operator(.)ident(uniq)operator(;) \ + operator(}) \ + ident(ruby_block) operator(=) operator(&)ident(_block) + +preprocessor(#define) ident(POP_BLOCK)operator((\)) \ + ident(ruby_block) operator(=) ident(_block)operator(.)ident(prev)operator(;) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +reserved(struct) ident(RVarmap) operator(*)ident(ruby_dyna_vars)operator(;) +preprocessor(#define) ident(PUSH_VARS)operator((\)) reserved(do) operator({) \ + reserved(struct) ident(RVarmap) operator(*) directive(volatile) ident(_old)operator(;) \ + ident(_old) operator(=) ident(ruby_dyna_vars)operator(;) \ + ident(ruby_dyna_vars) operator(=) integer(0) + +preprocessor(#define) ident(POP_VARS)operator((\)) \ + reserved(if) operator(()ident(_old) operator(&&) operator(()ident(ruby_scope)operator(->)ident(flags) operator(&) ident(SCOPE_DONT_RECYCLE)operator(\)\)) operator({)\ + reserved(if) operator(()ident(RBASIC)operator(()ident(_old)operator(\)->)ident(flags)operator(\)) comment(/* unless it's already recycled */) \ + ident(FL_SET)operator(()ident(_old)operator(,) ident(DVAR_DONT_RECYCLE)operator(\);) \ + operator(})\ + ident(ruby_dyna_vars) operator(=) ident(_old)operator(;) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(DVAR_DONT_RECYCLE) ident(FL_USER2) + +preprocessor(#define) ident(DMETHOD_P)operator((\)) operator(()ident(ruby_frame)operator(->)ident(flags) operator(&) ident(FRAME_DMETH)operator(\)) + +directive(static) reserved(struct) ident(RVarmap)operator(*) +ident(new_dvar)operator(()ident(id)operator(,) ident(value)operator(,) ident(prev)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(value)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(prev)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(vars)operator(,) reserved(struct) ident(RVarmap)operator(\);) + ident(OBJSETUP)operator(()ident(vars)operator(,) integer(0)operator(,) ident(T_VARMAP)operator(\);) + ident(vars)operator(->)ident(id) operator(=) ident(id)operator(;) + ident(vars)operator(->)ident(val) operator(=) ident(value)operator(;) + ident(vars)operator(->)ident(next) operator(=) ident(prev)operator(;) + + reserved(return) ident(vars)operator(;) +operator(}) + +ident(VALUE) +ident(rb_dvar_defined)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(struct) ident(RVarmap) operator(*)ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + + reserved(while) operator(()ident(vars)operator(\)) operator({) + reserved(if) operator(()ident(vars)operator(->)ident(id) operator(==) ident(id)operator(\)) reserved(return) ident(Qtrue)operator(;) + ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +ident(VALUE) +ident(rb_dvar_curr)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(struct) ident(RVarmap) operator(*)ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + + reserved(while) operator(()ident(vars)operator(\)) operator({) + reserved(if) operator(()ident(vars)operator(->)ident(id) operator(==) integer(0)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(vars)operator(->)ident(id) operator(==) ident(id)operator(\)) reserved(return) ident(Qtrue)operator(;) + ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +ident(VALUE) +ident(rb_dvar_ref)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(struct) ident(RVarmap) operator(*)ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + + reserved(while) operator(()ident(vars)operator(\)) operator({) + reserved(if) operator(()ident(vars)operator(->)ident(id) operator(==) ident(id)operator(\)) operator({) + reserved(return) ident(vars)operator(->)ident(val)operator(;) + operator(}) + ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(void) +ident(rb_dvar_push)operator(()ident(id)operator(,) ident(value)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(value)operator(;) +operator({) + ident(ruby_dyna_vars) operator(=) ident(new_dvar)operator(()ident(id)operator(,) ident(value)operator(,) ident(ruby_dyna_vars)operator(\);) +operator(}) + +directive(static) directive(void) +ident(dvar_asgn_internal)operator(()ident(id)operator(,) ident(value)operator(,) ident(curr)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(value)operator(;) + pre_type(int) ident(curr)operator(;) +operator({) + pre_type(int) ident(n) operator(=) integer(0)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + + reserved(while) operator(()ident(vars)operator(\)) operator({) + reserved(if) operator(()ident(curr) operator(&&) ident(vars)operator(->)ident(id) operator(==) integer(0)operator(\)) operator({) + comment(/* first null is a dvar header */) + ident(n)operator(++;) + reserved(if) operator(()ident(n) operator(==) integer(2)operator(\)) reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(vars)operator(->)ident(id) operator(==) ident(id)operator(\)) operator({) + ident(vars)operator(->)ident(val) operator(=) ident(value)operator(;) + reserved(return)operator(;) + operator(}) + ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(;) + operator(}) + reserved(if) operator((!)ident(ruby_dyna_vars)operator(\)) operator({) + ident(ruby_dyna_vars) operator(=) ident(new_dvar)operator(()ident(id)operator(,) ident(value)operator(,) integer(0)operator(\);) + operator(}) + reserved(else) operator({) + ident(vars) operator(=) ident(new_dvar)operator(()ident(id)operator(,) ident(value)operator(,) ident(ruby_dyna_vars)operator(->)ident(next)operator(\);) + ident(ruby_dyna_vars)operator(->)ident(next) operator(=) ident(vars)operator(;) + operator(}) +operator(}) + +directive(static) directive(inline) directive(void) +ident(dvar_asgn)operator(()ident(id)operator(,) ident(value)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(value)operator(;) +operator({) + ident(dvar_asgn_internal)operator(()ident(id)operator(,) ident(value)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) directive(inline) directive(void) +ident(dvar_asgn_curr)operator(()ident(id)operator(,) ident(value)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(value)operator(;) +operator({) + ident(dvar_asgn_internal)operator(()ident(id)operator(,) ident(value)operator(,) integer(1)operator(\);) +operator(}) + +ident(VALUE) operator(*) +ident(rb_svar)operator(()ident(cnt)operator(\)) + pre_type(int) ident(cnt)operator(;) +operator({) + reserved(struct) ident(RVarmap) operator(*)ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + ident(ID) ident(id)operator(;) + + reserved(if) operator((!)ident(ruby_scope)operator(->)ident(local_tbl)operator(\)) reserved(return) pre_constant(NULL)operator(;) + reserved(if) operator(()ident(cnt) operator(>=) ident(ruby_scope)operator(->)ident(local_tbl)operator([)integer(0)operator(]\)) reserved(return) pre_constant(NULL)operator(;) + ident(id) operator(=) ident(ruby_scope)operator(->)ident(local_tbl)operator([)ident(cnt)operator(+)integer(1)operator(];) + reserved(while) operator(()ident(vars)operator(\)) operator({) + reserved(if) operator(()ident(vars)operator(->)ident(id) operator(==) ident(id)operator(\)) reserved(return) operator(&)ident(vars)operator(->)ident(val)operator(;) + ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(;) + operator(}) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(local_vars) operator(==) integer(0)operator(\)) reserved(return) pre_constant(NULL)operator(;) + reserved(return) operator(&)ident(ruby_scope)operator(->)ident(local_vars)operator([)ident(cnt)operator(];) +operator(}) + +reserved(struct) ident(iter) operator({) + pre_type(int) ident(iter)operator(;) + reserved(struct) ident(iter) operator(*)ident(prev)operator(;) +operator(};) +directive(static) reserved(struct) ident(iter) operator(*)ident(ruby_iter)operator(;) + +preprocessor(#define) ident(ITER_NOT) integer(0) +preprocessor(#define) ident(ITER_PRE) integer(1) +preprocessor(#define) ident(ITER_CUR) integer(2) +preprocessor(#define) ident(ITER_PAS) integer(3) + +preprocessor(#define) ident(PUSH_ITER)operator(()ident(i)operator(\)) reserved(do) operator({) \ + reserved(struct) ident(iter) ident(_iter)operator(;) \ + ident(_iter)operator(.)ident(prev) operator(=) ident(ruby_iter)operator(;) \ + ident(_iter)operator(.)ident(iter) operator(=) operator(()ident(i)operator(\);) \ + ident(ruby_iter) operator(=) operator(&)ident(_iter) + +preprocessor(#define) ident(POP_ITER)operator((\)) \ + ident(ruby_iter) operator(=) ident(_iter)operator(.)ident(prev)operator(;) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +reserved(struct) ident(tag) operator({) + ident(rb_jmpbuf_t) ident(buf)operator(;) + reserved(struct) ident(FRAME) operator(*)ident(frame)operator(;) + reserved(struct) ident(iter) operator(*)ident(iter)operator(;) + ident(VALUE) ident(tag)operator(;) + ident(VALUE) ident(retval)operator(;) + reserved(struct) ident(SCOPE) operator(*)ident(scope)operator(;) + ident(VALUE) ident(dst)operator(;) + reserved(struct) ident(tag) operator(*)ident(prev)operator(;) + pre_type(int) ident(blkid)operator(;) +operator(};) +directive(static) reserved(struct) ident(tag) operator(*)ident(prot_tag)operator(;) + +preprocessor(#define) ident(PUSH_TAG)operator(()ident(ptag)operator(\)) reserved(do) operator({) \ + reserved(struct) ident(tag) ident(_tag)operator(;) \ + ident(_tag)operator(.)ident(retval) operator(=) ident(Qnil)operator(;) \ + ident(_tag)operator(.)ident(frame) operator(=) ident(ruby_frame)operator(;) \ + ident(_tag)operator(.)ident(iter) operator(=) ident(ruby_iter)operator(;) \ + ident(_tag)operator(.)ident(prev) operator(=) ident(prot_tag)operator(;) \ + ident(_tag)operator(.)ident(scope) operator(=) ident(ruby_scope)operator(;) \ + ident(_tag)operator(.)ident(tag) operator(=) ident(ptag)operator(;) \ + ident(_tag)operator(.)ident(dst) operator(=) integer(0)operator(;) \ + ident(_tag)operator(.)ident(blkid) operator(=) integer(0)operator(;) \ + ident(prot_tag) operator(=) operator(&)ident(_tag) + +preprocessor(#define) ident(PROT_NONE) ident(Qfalse) comment(/* 0 */) +preprocessor(#define) ident(PROT_THREAD) ident(Qtrue) comment(/* 2 */) +preprocessor(#define) ident(PROT_FUNC) ident(INT2FIX)operator(()integer(0)operator(\)) comment(/* 1 */) +preprocessor(#define) ident(PROT_LOOP) ident(INT2FIX)operator(()integer(1)operator(\)) comment(/* 3 */) +preprocessor(#define) ident(PROT_LAMBDA) ident(INT2FIX)operator(()integer(2)operator(\)) comment(/* 5 */) +preprocessor(#define) ident(PROT_YIELD) ident(INT2FIX)operator(()integer(3)operator(\)) comment(/* 7 */) + +preprocessor(#define) ident(EXEC_TAG)operator((\)) operator(()ident(FLUSH_REGISTER_WINDOWS)operator(,) ident(ruby_setjmp)operator(((()directive(void)operator(\))integer(0)operator(\),) ident(prot_tag)operator(->)ident(buf)operator(\)\)) + +preprocessor(#define) ident(JUMP_TAG)operator(()ident(st)operator(\)) reserved(do) operator({) \ + ident(ruby_frame) operator(=) ident(prot_tag)operator(->)ident(frame)operator(;) \ + ident(ruby_iter) operator(=) ident(prot_tag)operator(->)ident(iter)operator(;) \ + ident(ruby_longjmp)operator(()ident(prot_tag)operator(->)ident(buf)operator(,()ident(st)operator(\)\);) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(POP_TAG)operator((\)) \ + ident(prot_tag) operator(=) ident(_tag)operator(.)ident(prev)operator(;) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(TAG_DST)operator((\)) operator(()ident(_tag)operator(.)ident(dst) operator(==) operator(()ident(VALUE)operator(\))ident(ruby_frame)operator(->)ident(uniq)operator(\)) + +preprocessor(#define) ident(TAG_RETURN) hex(0x1) +preprocessor(#define) ident(TAG_BREAK) hex(0x2) +preprocessor(#define) ident(TAG_NEXT) hex(0x3) +preprocessor(#define) ident(TAG_RETRY) hex(0x4) +preprocessor(#define) ident(TAG_REDO) hex(0x5) +preprocessor(#define) ident(TAG_RAISE) hex(0x6) +preprocessor(#define) ident(TAG_THROW) hex(0x7) +preprocessor(#define) ident(TAG_FATAL) hex(0x8) +preprocessor(#define) ident(TAG_MASK) hex(0xf) + +ident(VALUE) ident(ruby_class)operator(;) +directive(static) ident(VALUE) ident(ruby_wrapper)operator(;) comment(/* security wrapper */) + +preprocessor(#define) ident(PUSH_CLASS)operator(()ident(c)operator(\)) reserved(do) operator({) \ + directive(volatile) ident(VALUE) ident(_class) operator(=) ident(ruby_class)operator(;) \ + ident(ruby_class) operator(=) operator(()ident(c)operator(\)) + +preprocessor(#define) ident(POP_CLASS)operator((\)) ident(ruby_class) operator(=) ident(_class)operator(;) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +ident(NODE) operator(*)ident(ruby_cref) operator(=) integer(0)operator(;) +ident(NODE) operator(*)ident(ruby_top_cref)operator(;) +preprocessor(#define) ident(PUSH_CREF)operator(()ident(c)operator(\)) ident(ruby_cref) operator(=) ident(NEW_CREF)operator(()ident(c)operator(,)ident(ruby_cref)operator(\)) +preprocessor(#define) ident(POP_CREF)operator((\)) ident(ruby_cref) operator(=) ident(ruby_cref)operator(->)ident(nd_next) + +preprocessor(#define) ident(PUSH_SCOPE)operator((\)) reserved(do) operator({) \ + directive(volatile) pre_type(int) ident(_vmode) operator(=) ident(scope_vmode)operator(;) \ + reserved(struct) ident(SCOPE) operator(*) directive(volatile) ident(_old)operator(;) \ + ident(NEWOBJ)operator(()ident(_scope)operator(,) reserved(struct) ident(SCOPE)operator(\);) \ + ident(OBJSETUP)operator(()ident(_scope)operator(,) integer(0)operator(,) ident(T_SCOPE)operator(\);) \ + ident(_scope)operator(->)ident(local_tbl) operator(=) integer(0)operator(;) \ + ident(_scope)operator(->)ident(local_vars) operator(=) integer(0)operator(;) \ + ident(_scope)operator(->)ident(flags) operator(=) integer(0)operator(;) \ + ident(_old) operator(=) ident(ruby_scope)operator(;) \ + ident(ruby_scope) operator(=) ident(_scope)operator(;) \ + ident(scope_vmode) operator(=) ident(SCOPE_PUBLIC) + +ident(rb_thread_t) ident(rb_curr_thread)operator(;) +ident(rb_thread_t) ident(rb_main_thread)operator(;) +preprocessor(#define) ident(main_thread) ident(rb_main_thread) +preprocessor(#define) ident(curr_thread) ident(rb_curr_thread) + +directive(static) directive(void) ident(scope_dup) ident(_)operator((()reserved(struct) ident(SCOPE) operator(*\)\);) + +preprocessor(#define) ident(POP_SCOPE)operator((\)) \ + reserved(if) operator(()ident(ruby_scope)operator(->)ident(flags) operator(&) ident(SCOPE_DONT_RECYCLE)operator(\)) operator({)\ + reserved(if) operator(()ident(_old)operator(\)) ident(scope_dup)operator(()ident(_old)operator(\);) \ + operator(}) \ + reserved(if) operator((!()ident(ruby_scope)operator(->)ident(flags) operator(&) ident(SCOPE_MALLOC)operator(\)\)) operator({)\ + ident(ruby_scope)operator(->)ident(local_vars) operator(=) integer(0)operator(;) \ + ident(ruby_scope)operator(->)ident(local_tbl) operator(=) integer(0)operator(;) \ + reserved(if) operator((!()ident(ruby_scope)operator(->)ident(flags) operator(&) ident(SCOPE_DONT_RECYCLE)operator(\)) operator(&&) \ + ident(ruby_scope) operator(!=) ident(top_scope)operator(\)) operator({) \ + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(ruby_scope)operator(\);)\ + operator(}) \ + operator(}) \ + ident(ruby_scope)operator(->)ident(flags) operator(|=) ident(SCOPE_NOSTACK)operator(;) \ + ident(ruby_scope) operator(=) ident(_old)operator(;) \ + ident(scope_vmode) operator(=) ident(_vmode)operator(;) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +directive(static) ident(VALUE) ident(rb_eval) ident(_)operator((()ident(VALUE)operator(,)ident(NODE)operator(*\)\);) +directive(static) ident(VALUE) ident(eval) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(,)ident(VALUE)operator(,)pre_type(char)operator(*,)pre_type(int)operator(\)\);) +directive(static) ident(NODE) operator(*)ident(compile) ident(_)operator((()ident(VALUE)operator(,) pre_type(char)operator(*,) pre_type(int)operator(\)\);) + +directive(static) ident(VALUE) ident(rb_yield_0) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) ident(VALUE)operator(,) pre_type(int)operator(,) pre_type(int)operator(\)\);) + +preprocessor(#define) ident(YIELD_LAMBDA_CALL) integer(1) +preprocessor(#define) ident(YIELD_PROC_CALL) integer(2) +preprocessor(#define) ident(YIELD_PUBLIC_DEF) integer(4) +preprocessor(#define) ident(YIELD_FUNC_AVALUE) integer(1) +preprocessor(#define) ident(YIELD_FUNC_SVALUE) integer(2) + +directive(static) ident(VALUE) ident(rb_call) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(,)ident(ID)operator(,)pre_type(int)operator(,)directive(const) ident(VALUE)operator(*,)pre_type(int)operator(,)ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(module_setup) ident(_)operator((()ident(VALUE)operator(,)ident(NODE)operator(*\)\);) + +directive(static) ident(VALUE) ident(massign) ident(_)operator((()ident(VALUE)operator(,)ident(NODE)operator(*,)ident(VALUE)operator(,)pre_type(int)operator(\)\);) +directive(static) directive(void) ident(assign) ident(_)operator((()ident(VALUE)operator(,)ident(NODE)operator(*,)ident(VALUE)operator(,)pre_type(int)operator(\)\);) + +reserved(typedef) reserved(struct) ident(event_hook) operator({) + ident(rb_event_hook_func_t) ident(func)operator(;) + ident(rb_event_t) ident(events)operator(;) + reserved(struct) ident(event_hook) operator(*)ident(next)operator(;) +operator(}) ident(rb_event_hook_t)operator(;) + +directive(static) ident(rb_event_hook_t) operator(*)ident(event_hooks)operator(;) + +preprocessor(#define) ident(EXEC_EVENT_HOOK)operator(()ident(event)operator(,) ident(node)operator(,) ident(self)operator(,) ident(id)operator(,) ident(klass)operator(\)) \ + reserved(do) operator({) \ + ident(rb_event_hook_t) operator(*)ident(hook) operator(=) ident(event_hooks)operator(;) \ + ident(rb_event_hook_func_t) ident(hook_func)operator(;) \ + ident(rb_event_t) ident(events)operator(;) \ + \ + reserved(while) operator(()ident(hook)operator(\)) operator({) \ + ident(hook_func) operator(=) ident(hook)operator(->)ident(func)operator(;) \ + ident(events) operator(=) ident(hook)operator(->)ident(events)operator(;) \ + ident(hook) operator(=) ident(hook)operator(->)ident(next)operator(;) \ + reserved(if) operator(()ident(events) operator(&) ident(event)operator(\)) \ + operator((*)ident(hook_func)operator(\)()ident(event)operator(,) ident(node)operator(,) ident(self)operator(,) ident(id)operator(,) ident(klass)operator(\);) \ + operator(}) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +directive(static) ident(VALUE) ident(trace_func) operator(=) integer(0)operator(;) +directive(static) pre_type(int) ident(tracing) operator(=) integer(0)operator(;) +directive(static) directive(void) ident(call_trace_func) ident(_)operator((()ident(rb_event_t)operator(,)ident(NODE)operator(*,)ident(VALUE)operator(,)ident(ID)operator(,)ident(VALUE)operator(\)\);) + +comment(#if 0 +#define SET_CURRENT_SOURCE(\) (ruby_sourcefile = ruby_current_node->nd_file, \\ + ruby_sourceline = nd_line(ruby_current_node\)\) +#else) +preprocessor(#define) ident(SET_CURRENT_SOURCE)operator((\)) operator((()directive(void)operator(\))integer(0)operator(\)) +preprocessor(#endif) + +directive(void) +ident(ruby_set_current_source)operator((\)) +operator({) + reserved(if) operator(()ident(ruby_current_node)operator(\)) operator({) + ident(ruby_sourcefile) operator(=) ident(ruby_current_node)operator(->)ident(nd_file)operator(;) + ident(ruby_sourceline) operator(=) ident(nd_line)operator(()ident(ruby_current_node)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(warn_printf)operator(()directive(const) pre_type(char) operator(*)ident(fmt)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(warn_printf)operator(()ident(fmt)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + ident(va_list) ident(args)operator(;) + + ident(va_init_list)operator(()ident(args)operator(,) ident(fmt)operator(\);) + ident(vsnprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) ident(fmt)operator(,) ident(args)operator(\);) + ident(va_end)operator(()ident(args)operator(\);) + ident(rb_write_error)operator(()ident(buf)operator(\);) +operator(}) + +preprocessor(#define) ident(warn_print)operator(()ident(x)operator(\)) ident(rb_write_error)operator(()ident(x)operator(\)) +preprocessor(#define) ident(warn_print2)operator(()ident(x)operator(,)ident(l)operator(\)) ident(rb_write_error2)operator(()ident(x)operator(,)ident(l)operator(\)) + +directive(static) directive(void) +ident(error_pos)operator((\)) +operator({) + ident(ruby_set_current_source)operator((\);) + reserved(if) operator(()ident(ruby_sourcefile)operator(\)) operator({) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\)) operator({) + ident(warn_printf)operator(()string<delimiter(")content(%s:%d:in `%s')delimiter(")>operator(,) ident(ruby_sourcefile)operator(,) ident(ruby_sourceline)operator(,) + ident(rb_id2name)operator(()ident(ruby_frame)operator(->)ident(orig_func)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(ruby_sourceline) operator(==) integer(0)operator(\)) operator({) + ident(warn_printf)operator(()string<delimiter(")content(%s)delimiter(")>operator(,) ident(ruby_sourcefile)operator(\);) + operator(}) + reserved(else) operator({) + ident(warn_printf)operator(()string<delimiter(")content(%s:%d)delimiter(")>operator(,) ident(ruby_sourcefile)operator(,) ident(ruby_sourceline)operator(\);) + operator(}) + operator(}) +operator(}) + +ident(VALUE) ident(rb_check_backtrace)operator(()ident(VALUE)operator(\);) + +directive(static) ident(VALUE) +ident(get_backtrace)operator(()ident(info)operator(\)) + ident(VALUE) ident(info)operator(;) +operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(info)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(info) operator(=) ident(rb_funcall)operator(()ident(info)operator(,) ident(rb_intern)operator(()string<delimiter(")content(backtrace)delimiter(")>operator(\),) integer(0)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(info)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(rb_check_backtrace)operator(()ident(info)operator(\);) +operator(}) + +directive(static) directive(void) +ident(set_backtrace)operator(()ident(info)operator(,) ident(bt)operator(\)) + ident(VALUE) ident(info)operator(,) ident(bt)operator(;) +operator({) + ident(rb_funcall)operator(()ident(info)operator(,) ident(rb_intern)operator(()string<delimiter(")content(set_backtrace)delimiter(")>operator(\),) integer(1)operator(,) ident(bt)operator(\);) +operator(}) + +directive(static) directive(void) +ident(error_print)operator((\)) +operator({) + ident(VALUE) ident(errat) operator(=) ident(Qnil)operator(;) comment(/* OK */) + directive(volatile) ident(VALUE) ident(eclass)operator(,) ident(e)operator(;) + pre_type(char) operator(*)ident(einfo)operator(;) + pre_type(long) ident(elen)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_errinfo)operator(\)\)) reserved(return)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator(()ident(EXEC_TAG)operator((\)) operator(==) integer(0)operator(\)) operator({) + ident(errat) operator(=) ident(get_backtrace)operator(()ident(ruby_errinfo)operator(\);) + operator(}) + reserved(else) operator({) + ident(errat) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(if) operator(()ident(EXEC_TAG)operator((\)\)) reserved(goto) ident(error)operator(;) + reserved(if) operator(()ident(NIL_P)operator(()ident(errat)operator(\)\){) + ident(ruby_set_current_source)operator((\);) + reserved(if) operator(()ident(ruby_sourcefile)operator(\)) + ident(warn_printf)operator(()string<delimiter(")content(%s:%d)delimiter(")>operator(,) ident(ruby_sourcefile)operator(,) ident(ruby_sourceline)operator(\);) + reserved(else) + ident(warn_printf)operator(()string<delimiter(")content(%d)delimiter(")>operator(,) ident(ruby_sourceline)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(RARRAY)operator(()ident(errat)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + ident(error_pos)operator((\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(mesg) operator(=) ident(RARRAY)operator(()ident(errat)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + + reserved(if) operator(()ident(NIL_P)operator(()ident(mesg)operator(\)\)) ident(error_pos)operator((\);) + reserved(else) operator({) + ident(warn_print2)operator(()ident(RSTRING)operator(()ident(mesg)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(mesg)operator(\)->)ident(len)operator(\);) + operator(}) + operator(}) + + ident(eclass) operator(=) ident(CLASS_OF)operator(()ident(ruby_errinfo)operator(\);) + reserved(if) operator(()ident(EXEC_TAG)operator((\)) operator(==) integer(0)operator(\)) operator({) + ident(e) operator(=) ident(rb_funcall)operator(()ident(ruby_errinfo)operator(,) ident(rb_intern)operator(()string<delimiter(")content(message)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\);) + ident(StringValue)operator(()ident(e)operator(\);) + ident(einfo) operator(=) ident(RSTRING)operator(()ident(e)operator(\)->)ident(ptr)operator(;) + ident(elen) operator(=) ident(RSTRING)operator(()ident(e)operator(\)->)ident(len)operator(;) + operator(}) + reserved(else) operator({) + ident(einfo) operator(=) string<delimiter(")delimiter(")>operator(;) + ident(elen) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(EXEC_TAG)operator((\)\)) reserved(goto) ident(error)operator(;) + reserved(if) operator(()ident(eclass) operator(==) ident(rb_eRuntimeError) operator(&&) ident(elen) operator(==) integer(0)operator(\)) operator({) + ident(warn_print)operator(()string<delimiter(")content(: unhandled exception)char(\\n)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(epath)operator(;) + + ident(epath) operator(=) ident(rb_class_name)operator(()ident(eclass)operator(\);) + reserved(if) operator(()ident(elen) operator(==) integer(0)operator(\)) operator({) + ident(warn_print)operator(()string<delimiter(")content(: )delimiter(")>operator(\);) + ident(warn_print2)operator(()ident(RSTRING)operator(()ident(epath)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(epath)operator(\)->)ident(len)operator(\);) + ident(warn_print)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + pre_type(char) operator(*)ident(tail) operator(=) integer(0)operator(;) + pre_type(long) ident(len) operator(=) ident(elen)operator(;) + + reserved(if) operator(()ident(RSTRING)operator(()ident(epath)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(==) char('#')operator(\)) ident(epath) operator(=) integer(0)operator(;) + reserved(if) operator((()ident(tail) operator(=) ident(memchr)operator(()ident(einfo)operator(,) char('\\n')operator(,) ident(elen)operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + ident(len) operator(=) ident(tail) operator(-) ident(einfo)operator(;) + ident(tail)operator(++;) comment(/* skip newline */) + operator(}) + ident(warn_print)operator(()string<delimiter(")content(: )delimiter(")>operator(\);) + ident(warn_print2)operator(()ident(einfo)operator(,) ident(len)operator(\);) + reserved(if) operator(()ident(epath)operator(\)) operator({) + ident(warn_print)operator(()string<delimiter(")content( ()delimiter(")>operator(\);) + ident(warn_print2)operator(()ident(RSTRING)operator(()ident(epath)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(epath)operator(\)->)ident(len)operator(\);) + ident(warn_print)operator(()string<delimiter(")content(\))char(\\n)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(tail) operator(&&) ident(elen)operator(>)ident(len)operator(+)integer(1)operator(\)) operator({) + ident(warn_print2)operator(()ident(tail)operator(,) ident(elen)operator(-)ident(len)operator(-)integer(1)operator(\);) + reserved(if) operator(()ident(einfo)operator([)ident(elen)operator(-)integer(1)operator(]) operator(!=) char('\\n')operator(\)) ident(warn_print2)operator(()string<delimiter(")char(\\n)delimiter(")>operator(,) integer(1)operator(\);) + operator(}) + operator(}) + operator(}) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(errat)operator(\)\)) operator({) + pre_type(long) ident(i)operator(;) + reserved(struct) ident(RArray) operator(*)ident(ep) operator(=) ident(RARRAY)operator(()ident(errat)operator(\);) + +preprocessor(#define) ident(TRACE_MAX) operator(()ident(TRACE_HEAD)operator(+)ident(TRACE_TAIL)operator(+)integer(5)operator(\)) +preprocessor(#define) ident(TRACE_HEAD) integer(8) +preprocessor(#define) ident(TRACE_TAIL) integer(5) + + ident(ep) operator(=) ident(RARRAY)operator(()ident(errat)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(1)operator(;) ident(i)operator(<)ident(ep)operator(->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(ep)operator(->)ident(ptr)operator([)ident(i)operator(]\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(warn_printf)operator(()string<delimiter(")char(\\t)content(from %s)char(\\n)delimiter(")>operator(,) ident(RSTRING)operator(()ident(ep)operator(->)ident(ptr)operator([)ident(i)operator(]\)->)ident(ptr)operator(\);) + operator(}) + reserved(if) operator(()ident(i) operator(==) ident(TRACE_HEAD) operator(&&) ident(ep)operator(->)ident(len) operator(>) ident(TRACE_MAX)operator(\)) operator({) + ident(warn_printf)operator(()string<delimiter(")char(\\t)content( ... %ld levels...)char(\\n)delimiter(")>operator(,) + ident(ep)operator(->)ident(len) operator(-) ident(TRACE_HEAD) operator(-) ident(TRACE_TAIL)operator(\);) + ident(i) operator(=) ident(ep)operator(->)ident(len) operator(-) ident(TRACE_TAIL)operator(;) + operator(}) + operator(}) + operator(}) + label(error)operator(:) + ident(POP_TAG)operator((\);) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(__APPLE__)operator(\)) +preprocessor(#define) ident(environ) operator((*)ident(_NSGetEnviron)operator((\)\)) +preprocessor(#elif) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__MACOS__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32_WCE)operator(\)) +directive(extern) pre_type(char) operator(**)ident(environ)operator(;) +preprocessor(#endif) +pre_type(char) operator(**)ident(rb_origenviron)operator(;) + +directive(void) ident(rb_call_inits) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_stack) ident(_)operator((()ident(VALUE)operator(*\)\);) +directive(void) ident(Init_heap) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_ext) ident(_)operator((()directive(void)operator(\)\);) + +preprocessor(#ifdef) ident(HAVE_NATIVETHREAD) +directive(static) ident(rb_nativethread_t) ident(ruby_thid)operator(;) +pre_type(int) +ident(is_ruby_native_thread)operator((\)) operator({) + reserved(return) ident(NATIVETHREAD_EQUAL)operator(()ident(ruby_thid)operator(,) ident(NATIVETHREAD_CURRENT)operator((\)\);) +operator(}) + +preprocessor(# ifdef) ident(HAVE_NATIVETHREAD_KILL) +directive(void) +ident(ruby_native_thread_kill)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) + ident(NATIVETHREAD_KILL)operator(()ident(ruby_thid)operator(,) ident(sig)operator(\);) +operator(}) +preprocessor(# endif) +preprocessor(#endif) + +directive(void) +ident(ruby_init)operator((\)) +operator({) + directive(static) pre_type(int) ident(initialized) operator(=) integer(0)operator(;) + directive(static) reserved(struct) ident(FRAME) ident(frame)operator(;) + directive(static) reserved(struct) ident(iter) ident(iter)operator(;) + pre_type(int) ident(state)operator(;) + + reserved(if) operator(()ident(initialized)operator(\)) + reserved(return)operator(;) + ident(initialized) operator(=) integer(1)operator(;) +preprocessor(#ifdef) ident(HAVE_NATIVETHREAD) + ident(ruby_thid) operator(=) ident(NATIVETHREAD_CURRENT)operator((\);) +preprocessor(#endif) + + ident(ruby_frame) operator(=) ident(top_frame) operator(=) operator(&)ident(frame)operator(;) + ident(ruby_iter) operator(=) operator(&)ident(iter)operator(;) + +preprocessor(#ifdef) ident(__MACOS__) + ident(rb_origenviron) operator(=) integer(0)operator(;) +preprocessor(#else) + ident(rb_origenviron) operator(=) ident(environ)operator(;) +preprocessor(#endif) + + ident(Init_stack)operator((()directive(void)operator(*\)&)ident(state)operator(\);) + ident(Init_heap)operator((\);) + ident(PUSH_SCOPE)operator((\);) + ident(ruby_scope)operator(->)ident(local_vars) operator(=) integer(0)operator(;) + ident(ruby_scope)operator(->)ident(local_tbl) operator(=) integer(0)operator(;) + ident(top_scope) operator(=) ident(ruby_scope)operator(;) + comment(/* default visibility is private at toplevel */) + ident(SCOPE_SET)operator(()ident(SCOPE_PRIVATE)operator(\);) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(rb_call_inits)operator((\);) + ident(ruby_class) operator(=) ident(rb_cObject)operator(;) + ident(ruby_frame)operator(->)ident(self) operator(=) ident(ruby_top_self)operator(;) + ident(ruby_top_cref) operator(=) ident(rb_node_newnode)operator(()ident(NODE_CREF)operator(,)ident(rb_cObject)operator(,)integer(0)operator(,)integer(0)operator(\);) + ident(ruby_cref) operator(=) ident(ruby_top_cref)operator(;) + ident(rb_define_global_const)operator(()string<delimiter(")content(TOPLEVEL_BINDING)delimiter(")>operator(,) ident(rb_f_binding)operator(()ident(ruby_top_self)operator(\)\);) +preprocessor(#ifdef) ident(__MACOS__) + ident(_macruby_init)operator((\);) +preprocessor(#elif) ident(defined)operator(()ident(__VMS)operator(\)) + ident(_vmsruby_init)operator((\);) +preprocessor(#endif) + ident(ruby_prog_init)operator((\);) + ident(ALLOW_INTS)operator(;) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) operator({) + ident(error_print)operator((\);) + ident(exit)operator(()ident(EXIT_FAILURE)operator(\);) + operator(}) + ident(POP_SCOPE)operator((\);) + ident(ruby_scope) operator(=) ident(top_scope)operator(;) + ident(top_scope)operator(->)ident(flags) operator(&=) operator(~)ident(SCOPE_NOSTACK)operator(;) + ident(ruby_running) operator(=) integer(1)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(eval_node)operator(()ident(self)operator(,) ident(node)operator(\)) + ident(VALUE) ident(self)operator(;) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + ident(NODE) operator(*)ident(beg_tree) operator(=) ident(ruby_eval_tree_begin)operator(;) + + ident(ruby_eval_tree_begin) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(beg_tree)operator(\)) operator({) + ident(rb_eval)operator(()ident(self)operator(,) ident(beg_tree)operator(\);) + operator(}) + + reserved(if) operator((!)ident(node)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(\);) +operator(}) + +pre_type(int) ident(ruby_in_eval)operator(;) + +directive(static) directive(void) ident(rb_thread_cleanup) ident(_)operator((()directive(void)operator(\)\);) +directive(static) directive(void) ident(rb_thread_wait_other_threads) ident(_)operator((()directive(void)operator(\)\);) + +directive(static) pre_type(int) ident(thread_no_ensure) ident(_)operator((()directive(void)operator(\)\);) + +directive(static) ident(VALUE) ident(exception_error)operator(;) +directive(static) ident(VALUE) ident(sysstack_error)operator(;) + +directive(static) pre_type(int) +ident(sysexit_status)operator(()ident(err)operator(\)) + ident(VALUE) ident(err)operator(;) +operator({) + ident(VALUE) ident(st) operator(=) ident(rb_iv_get)operator(()ident(err)operator(,) string<delimiter(")content(status)delimiter(")>operator(\);) + reserved(return) ident(NUM2INT)operator(()ident(st)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(error_handle)operator(()ident(ex)operator(\)) + pre_type(int) ident(ex)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(EXIT_FAILURE)operator(;) + ident(rb_thread_t) ident(th) operator(=) ident(curr_thread)operator(;) + + reserved(if) operator(()ident(rb_thread_set_raised)operator(()ident(th)operator(\)\)) + reserved(return) ident(EXIT_FAILURE)operator(;) + reserved(switch) operator(()ident(ex) operator(&) ident(TAG_MASK)operator(\)) operator({) + reserved(case) integer(0)operator(:) + ident(status) operator(=) ident(EXIT_SUCCESS)operator(;) + reserved(break)operator(;) + + reserved(case) label(TAG_RETURN)operator(:) + ident(error_pos)operator((\);) + ident(warn_print)operator(()string<delimiter(")content(: unexpected return)char(\\n)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_NEXT)operator(:) + ident(error_pos)operator((\);) + ident(warn_print)operator(()string<delimiter(")content(: unexpected next)char(\\n)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_BREAK)operator(:) + ident(error_pos)operator((\);) + ident(warn_print)operator(()string<delimiter(")content(: unexpected break)char(\\n)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_REDO)operator(:) + ident(error_pos)operator((\);) + ident(warn_print)operator(()string<delimiter(")content(: unexpected redo)char(\\n)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_RETRY)operator(:) + ident(error_pos)operator((\);) + ident(warn_print)operator(()string<delimiter(")content(: retry outside of rescue clause)char(\\n)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_THROW)operator(:) + reserved(if) operator(()ident(prot_tag) operator(&&) ident(prot_tag)operator(->)ident(frame) operator(&&) ident(prot_tag)operator(->)ident(frame)operator(->)ident(node)operator(\)) operator({) + ident(NODE) operator(*)ident(tag) operator(=) ident(prot_tag)operator(->)ident(frame)operator(->)ident(node)operator(;) + ident(warn_printf)operator(()string<delimiter(")content(%s:%d: uncaught throw)char(\\n)delimiter(")>operator(,) + ident(tag)operator(->)ident(nd_file)operator(,) ident(nd_line)operator(()ident(tag)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(error_pos)operator((\);) + ident(warn_printf)operator(()string<delimiter(")content(: unexpected throw)char(\\n)delimiter(")>operator(\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(TAG_RAISE)operator(:) + reserved(case) label(TAG_FATAL)operator(:) + reserved(if) operator(()ident(rb_obj_is_kind_of)operator(()ident(ruby_errinfo)operator(,) ident(rb_eSystemExit)operator(\)\)) operator({) + ident(status) operator(=) ident(sysexit_status)operator(()ident(ruby_errinfo)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(rb_obj_is_instance_of)operator(()ident(ruby_errinfo)operator(,) ident(rb_eSignal)operator(\)\)) operator({) + comment(/* no message when exiting by signal */) + operator(}) + reserved(else) operator({) + ident(error_print)operator((\);) + operator(}) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(Unknown longjmp status %d)delimiter(")>operator(,) ident(ex)operator(\);) + reserved(break)operator(;) + operator(}) + ident(rb_thread_reset_raised)operator(()ident(th)operator(\);) + reserved(return) ident(status)operator(;) +operator(}) + +directive(void) +ident(ruby_options)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + pre_type(char) operator(**)ident(argv)operator(;) +operator({) + pre_type(int) ident(state)operator(;) + + ident(Init_stack)operator((()directive(void)operator(*\)&)ident(state)operator(\);) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(ruby_process_options)operator(()ident(argc)operator(,) ident(argv)operator(\);) + operator(}) + reserved(else) operator({) + ident(trace_func) operator(=) integer(0)operator(;) + ident(tracing) operator(=) integer(0)operator(;) + ident(exit)operator(()ident(error_handle)operator(()ident(state)operator(\)\);) + operator(}) + ident(POP_TAG)operator((\);) +operator(}) + +directive(void) ident(rb_exec_end_proc) ident(_)operator((()directive(void)operator(\)\);) + +directive(static) directive(void) +ident(ruby_finalize_0)operator((\)) +operator({) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator(()ident(EXEC_TAG)operator((\)) operator(==) integer(0)operator(\)) operator({) + ident(rb_trap_exit)operator((\);) + operator(}) + ident(POP_TAG)operator((\);) + ident(rb_exec_end_proc)operator((\);) +operator(}) + +directive(static) directive(void) +ident(ruby_finalize_1)operator((\)) +operator({) + ident(signal)operator(()ident(SIGINT)operator(,) ident(SIG_DFL)operator(\);) + ident(ruby_errinfo) operator(=) integer(0)operator(;) + ident(rb_gc_call_finalizer_at_exit)operator((\);) + ident(trace_func) operator(=) integer(0)operator(;) + ident(tracing) operator(=) integer(0)operator(;) +operator(}) + +directive(void) +ident(ruby_finalize)operator((\)) +operator({) + ident(ruby_finalize_0)operator((\);) + ident(ruby_finalize_1)operator((\);) +operator(}) + +pre_type(int) +ident(ruby_cleanup)operator(()ident(ex)operator(\)) + pre_type(int) ident(ex)operator(;) +operator({) + pre_type(int) ident(state)operator(;) + directive(volatile) ident(VALUE) ident(errs)operator([)integer(2)operator(];) + pre_type(int) ident(nerr)operator(;) + + ident(errs)operator([)integer(1)operator(]) operator(=) ident(ruby_errinfo)operator(;) + ident(ruby_safe_level) operator(=) integer(0)operator(;) + ident(Init_stack)operator((()directive(void) operator(*\)&)ident(state)operator(\);) + ident(ruby_finalize_0)operator((\);) + ident(errs)operator([)integer(0)operator(]) operator(=) ident(ruby_errinfo)operator(;) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + ident(PUSH_ITER)operator(()ident(ITER_NOT)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(rb_thread_cleanup)operator((\);) + ident(rb_thread_wait_other_threads)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(ex) operator(==) integer(0)operator(\)) operator({) + ident(ex) operator(=) ident(state)operator(;) + operator(}) + ident(POP_ITER)operator((\);) + ident(ruby_errinfo) operator(=) ident(errs)operator([)integer(1)operator(];) + ident(ex) operator(=) ident(error_handle)operator(()ident(ex)operator(\);) + ident(ruby_finalize_1)operator((\);) + ident(POP_TAG)operator((\);) + + reserved(for) operator(()ident(nerr) operator(=) integer(0)operator(;) ident(nerr) operator(<) reserved(sizeof)operator(()ident(errs)operator(\)) operator(/) reserved(sizeof)operator(()ident(errs)operator([)integer(0)operator(]\);) operator(++)ident(nerr)operator(\)) operator({) + ident(VALUE) ident(err) operator(=) ident(errs)operator([)ident(nerr)operator(];) + + reserved(if) operator((!)ident(RTEST)operator(()ident(err)operator(\)\)) reserved(continue)operator(;) + + reserved(if) operator(()ident(rb_obj_is_kind_of)operator(()ident(err)operator(,) ident(rb_eSystemExit)operator(\)\)) operator({) + reserved(return) ident(sysexit_status)operator(()ident(err)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(rb_obj_is_kind_of)operator(()ident(err)operator(,) ident(rb_eSignal)operator(\)\)) operator({) + ident(VALUE) ident(sig) operator(=) ident(rb_iv_get)operator(()ident(err)operator(,) string<delimiter(")content(signo)delimiter(")>operator(\);) + ident(ruby_default_signal)operator(()ident(NUM2INT)operator(()ident(sig)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(ex) operator(==) integer(0)operator(\)) operator({) + ident(ex) operator(=) integer(1)operator(;) + operator(}) + operator(}) + +preprocessor(#if) ident(EXIT_SUCCESS) operator(!=) integer(0) operator(||) ident(EXIT_FAILURE) operator(!=) integer(1) + reserved(switch) operator(()ident(ex)operator(\)) operator({) +preprocessor(#if) ident(EXIT_SUCCESS) operator(!=) integer(0) + reserved(case) integer(0)operator(:) reserved(return) ident(EXIT_SUCCESS)operator(;) +preprocessor(#endif) +preprocessor(#if) ident(EXIT_FAILURE) operator(!=) integer(1) + reserved(case) integer(1)operator(:) reserved(return) ident(EXIT_FAILURE)operator(;) +preprocessor(#endif) + operator(}) +preprocessor(#endif) + + reserved(return) ident(ex)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(ruby_exec_internal)operator((\)) +operator({) + pre_type(int) ident(state)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + ident(PUSH_ITER)operator(()ident(ITER_NOT)operator(\);) + comment(/* default visibility is private at toplevel */) + ident(SCOPE_SET)operator(()ident(SCOPE_PRIVATE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(eval_node)operator(()ident(ruby_top_self)operator(,) ident(ruby_eval_tree)operator(\);) + operator(}) + ident(POP_ITER)operator((\);) + ident(POP_TAG)operator((\);) + reserved(return) ident(state)operator(;) +operator(}) + +directive(void) +ident(ruby_stop)operator(()ident(ex)operator(\)) + pre_type(int) ident(ex)operator(;) +operator({) + ident(exit)operator(()ident(ruby_cleanup)operator(()ident(ex)operator(\)\);) +operator(}) + +pre_type(int) +ident(ruby_exec)operator((\)) +operator({) + directive(volatile) ident(NODE) operator(*)ident(tmp)operator(;) + + ident(Init_stack)operator((()directive(void)operator(*\)&)ident(tmp)operator(\);) + reserved(return) ident(ruby_exec_internal)operator((\);) +operator(}) + +directive(void) +ident(ruby_run)operator((\)) +operator({) + pre_type(int) ident(state)operator(;) + directive(static) pre_type(int) ident(ex)operator(;) + + reserved(if) operator(()ident(ruby_nerrs) operator(>) integer(0)operator(\)) ident(exit)operator(()ident(EXIT_FAILURE)operator(\);) + ident(state) operator(=) ident(ruby_exec)operator((\);) + reserved(if) operator(()ident(state) operator(&&) operator(!)ident(ex)operator(\)) ident(ex) operator(=) ident(state)operator(;) + ident(ruby_stop)operator(()ident(ex)operator(\);) +operator(}) + +directive(static) directive(void) +ident(compile_error)operator(()ident(at)operator(\)) + directive(const) pre_type(char) operator(*)ident(at)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + ident(ruby_nerrs) operator(=) integer(0)operator(;) + ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content(compile error)delimiter(")>operator(\);) + reserved(if) operator(()ident(at)operator(\)) operator({) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content( in )delimiter(")>operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(at)operator(\);) + operator(}) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) string<delimiter(")char(\\n)delimiter(")>operator(,) integer(1)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(ruby_errinfo)operator(\)\)) operator({) + ident(rb_str_append)operator(()ident(str)operator(,) ident(rb_obj_as_string)operator(()ident(ruby_errinfo)operator(\)\);) + operator(}) + ident(rb_exc_raise)operator(()ident(rb_exc_new3)operator(()ident(rb_eSyntaxError)operator(,) ident(str)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_eval_string)operator(()ident(str)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) +operator({) + ident(VALUE) ident(v)operator(;) + ident(NODE) operator(*)ident(oldsrc) operator(=) ident(ruby_current_node)operator(;) + + ident(ruby_current_node) operator(=) integer(0)operator(;) + ident(ruby_sourcefile) operator(=) ident(rb_source_filename)operator(()string<delimiter(")content((eval\))delimiter(")>operator(\);) + ident(v) operator(=) ident(eval)operator(()ident(ruby_top_self)operator(,) ident(rb_str_new2)operator(()ident(str)operator(\),) ident(Qnil)operator(,) integer(0)operator(,) integer(0)operator(\);) + ident(ruby_current_node) operator(=) ident(oldsrc)operator(;) + + reserved(return) ident(v)operator(;) +operator(}) + +ident(VALUE) +ident(rb_eval_string_protect)operator(()ident(str)operator(,) ident(state)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) + pre_type(int) operator(*)ident(state)operator(;) +operator({) + reserved(return) ident(rb_protect)operator((()ident(VALUE) operator((*\))ident(_)operator((()ident(VALUE)operator(\)\)\))ident(rb_eval_string)operator(,) operator(()ident(VALUE)operator(\))ident(str)operator(,) ident(state)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_eval_string_wrap)operator(()ident(str)operator(,) ident(state)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) + pre_type(int) operator(*)ident(state)operator(;) +operator({) + pre_type(int) ident(status)operator(;) + ident(VALUE) ident(self) operator(=) ident(ruby_top_self)operator(;) + ident(VALUE) ident(wrapper) operator(=) ident(ruby_wrapper)operator(;) + ident(VALUE) ident(val)operator(;) + + ident(PUSH_CLASS)operator(()ident(ruby_wrapper) operator(=) ident(rb_module_new)operator((\)\);) + ident(ruby_top_self) operator(=) ident(rb_obj_clone)operator(()ident(ruby_top_self)operator(\);) + ident(rb_extend_object)operator(()ident(ruby_top_self)operator(,) ident(ruby_wrapper)operator(\);) + ident(PUSH_FRAME)operator((\);) + ident(ruby_frame)operator(->)ident(last_func) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(last_class) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(self) operator(=) ident(self)operator(;) + ident(PUSH_CREF)operator(()ident(ruby_wrapper)operator(\);) + ident(PUSH_SCOPE)operator((\);) + + ident(val) operator(=) ident(rb_eval_string_protect)operator(()ident(str)operator(,) operator(&)ident(status)operator(\);) + ident(ruby_top_self) operator(=) ident(self)operator(;) + + ident(POP_SCOPE)operator((\);) + ident(POP_FRAME)operator((\);) + ident(POP_CLASS)operator((\);) + ident(ruby_wrapper) operator(=) ident(wrapper)operator(;) + reserved(if) operator(()ident(state)operator(\)) operator({) + operator(*)ident(state) operator(=) ident(status)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(status)operator(\)) operator({) + ident(JUMP_TAG)operator(()ident(status)operator(\);) + operator(}) + reserved(return) ident(val)operator(;) +operator(}) + +ident(NORETURN)operator(()directive(static) directive(void) ident(localjump_error)operator(()directive(const) pre_type(char)operator(*,) ident(VALUE)operator(,) pre_type(int)operator(\)\);) +directive(static) directive(void) +ident(localjump_error)operator(()ident(mesg)operator(,) ident(value)operator(,) ident(reason)operator(\)) + directive(const) pre_type(char) operator(*)ident(mesg)operator(;) + ident(VALUE) ident(value)operator(;) + pre_type(int) ident(reason)operator(;) +operator({) + ident(VALUE) ident(exc) operator(=) ident(rb_exc_new2)operator(()ident(rb_eLocalJumpError)operator(,) ident(mesg)operator(\);) + ident(ID) ident(id)operator(;) + + ident(rb_iv_set)operator(()ident(exc)operator(,) string<delimiter(")content(@exit_value)delimiter(")>operator(,) ident(value)operator(\);) + reserved(switch) operator(()ident(reason)operator(\)) operator({) + reserved(case) label(TAG_BREAK)operator(:) + ident(id) operator(=) ident(rb_intern)operator(()string<delimiter(")content(break)delimiter(")>operator(\);) reserved(break)operator(;) + reserved(case) label(TAG_REDO)operator(:) + ident(id) operator(=) ident(rb_intern)operator(()string<delimiter(")content(redo)delimiter(")>operator(\);) reserved(break)operator(;) + reserved(case) label(TAG_RETRY)operator(:) + ident(id) operator(=) ident(rb_intern)operator(()string<delimiter(")content(retry)delimiter(")>operator(\);) reserved(break)operator(;) + reserved(case) label(TAG_NEXT)operator(:) + ident(id) operator(=) ident(rb_intern)operator(()string<delimiter(")content(next)delimiter(")>operator(\);) reserved(break)operator(;) + reserved(case) label(TAG_RETURN)operator(:) + ident(id) operator(=) ident(rb_intern)operator(()string<delimiter(")content(return)delimiter(")>operator(\);) reserved(break)operator(;) + reserved(default)operator(:) + ident(id) operator(=) ident(rb_intern)operator(()string<delimiter(")content(noreason)delimiter(")>operator(\);) reserved(break)operator(;) + operator(}) + ident(rb_iv_set)operator(()ident(exc)operator(,) string<delimiter(")content(@reason)delimiter(")>operator(,) ident(ID2SYM)operator(()ident(id)operator(\)\);) + ident(rb_exc_raise)operator(()ident(exc)operator(\);) +operator(}) + +comment(/* + * call_seq: + * local_jump_error.exit_value => obj + * + * Returns the exit value associated with this +LocalJumpError+. + */) +directive(static) ident(VALUE) +ident(localjump_xvalue)operator(()ident(exc)operator(\)) + ident(VALUE) ident(exc)operator(;) +operator({) + reserved(return) ident(rb_iv_get)operator(()ident(exc)operator(,) string<delimiter(")content(@exit_value)delimiter(")>operator(\);) +operator(}) + +comment(/* + * call-seq: + * local_jump_error.reason => symbol + * + * The reason this block was terminated: + * :break, :redo, :retry, :next, :return, or :noreason. + */) + +directive(static) ident(VALUE) +ident(localjump_reason)operator(()ident(exc)operator(\)) + ident(VALUE) ident(exc)operator(;) +operator({) + reserved(return) ident(rb_iv_get)operator(()ident(exc)operator(,) string<delimiter(")content(@reason)delimiter(")>operator(\);) +operator(}) + +ident(NORETURN)operator(()directive(static) directive(void) ident(jump_tag_but_local_jump) ident(_)operator((()pre_type(int)operator(,)ident(VALUE)operator(\)\)\);) +directive(static) directive(void) +ident(jump_tag_but_local_jump)operator(()ident(state)operator(,) ident(val)operator(\)) + pre_type(int) ident(state)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + + reserved(if) operator(()ident(val) operator(==) ident(Qundef)operator(\)) ident(val) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + reserved(switch) operator(()ident(state)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(break)operator(;) + reserved(case) label(TAG_RETURN)operator(:) + ident(localjump_error)operator(()string<delimiter(")content(unexpected return)delimiter(")>operator(,) ident(val)operator(,) ident(state)operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_BREAK)operator(:) + ident(localjump_error)operator(()string<delimiter(")content(unexpected break)delimiter(")>operator(,) ident(val)operator(,) ident(state)operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_NEXT)operator(:) + ident(localjump_error)operator(()string<delimiter(")content(unexpected next)delimiter(")>operator(,) ident(val)operator(,) ident(state)operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_REDO)operator(:) + ident(localjump_error)operator(()string<delimiter(")content(unexpected redo)delimiter(")>operator(,) ident(Qnil)operator(,) ident(state)operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_RETRY)operator(:) + ident(localjump_error)operator(()string<delimiter(")content(retry outside of rescue clause)delimiter(")>operator(,) ident(Qnil)operator(,) ident(state)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + ident(JUMP_TAG)operator(()ident(state)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_eval_cmd)operator(()ident(cmd)operator(,) ident(arg)operator(,) ident(level)operator(\)) + ident(VALUE) ident(cmd)operator(,) ident(arg)operator(;) + pre_type(int) ident(level)operator(;) +operator({) + pre_type(int) ident(state)operator(;) + ident(VALUE) ident(val) operator(=) ident(Qnil)operator(;) comment(/* OK */) + reserved(struct) ident(SCOPE) operator(*)ident(saved_scope)operator(;) + directive(volatile) pre_type(int) ident(safe) operator(=) ident(ruby_safe_level)operator(;) + + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(cmd)operator(\)\)) operator({) + ident(level) operator(=) integer(4)operator(;) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(cmd)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + ident(PUSH_ITER)operator(()ident(ITER_NOT)operator(\);) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + ident(ruby_safe_level) operator(=) ident(level)operator(;) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(val) operator(=) ident(rb_funcall2)operator(()ident(cmd)operator(,) ident(rb_intern)operator(()string<delimiter(")content(call)delimiter(")>operator(\),) ident(RARRAY)operator(()ident(arg)operator(\)->)ident(len)operator(,) ident(RARRAY)operator(()ident(arg)operator(\)->)ident(ptr)operator(\);) + operator(}) + ident(ruby_safe_level) operator(=) ident(safe)operator(;) + ident(POP_TAG)operator((\);) + ident(POP_ITER)operator((\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + reserved(return) ident(val)operator(;) + operator(}) + + ident(saved_scope) operator(=) ident(ruby_scope)operator(;) + ident(ruby_scope) operator(=) ident(top_scope)operator(;) + ident(PUSH_FRAME)operator((\);) + ident(ruby_frame)operator(->)ident(last_func) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(last_class) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(self) operator(=) ident(ruby_top_self)operator(;) + ident(PUSH_CREF)operator(()ident(ruby_wrapper) operator(?) ident(ruby_wrapper) operator(:) ident(rb_cObject)operator(\);) + + ident(ruby_safe_level) operator(=) ident(level)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(val) operator(=) ident(eval)operator(()ident(ruby_top_self)operator(,) ident(cmd)operator(,) ident(Qnil)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(flags) operator(&) ident(SCOPE_DONT_RECYCLE)operator(\)) + ident(scope_dup)operator(()ident(saved_scope)operator(\);) + ident(ruby_scope) operator(=) ident(saved_scope)operator(;) + ident(ruby_safe_level) operator(=) ident(safe)operator(;) + ident(POP_TAG)operator((\);) + ident(POP_FRAME)operator((\);) + + reserved(if) operator(()ident(state)operator(\)) ident(jump_tag_but_local_jump)operator(()ident(state)operator(,) ident(val)operator(\);) + reserved(return) ident(val)operator(;) +operator(}) + +preprocessor(#define) ident(ruby_cbase) operator(()ident(ruby_cref)operator(->)ident(nd_clss)operator(\)) + +directive(static) ident(VALUE) +ident(ev_const_defined)operator(()ident(cref)operator(,) ident(id)operator(,) ident(self)operator(\)) + ident(NODE) operator(*)ident(cref)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(NODE) operator(*)ident(cbase) operator(=) ident(cref)operator(;) + ident(VALUE) ident(result)operator(;) + + reserved(while) operator(()ident(cbase) operator(&&) ident(cbase)operator(->)ident(nd_next)operator(\)) operator({) + reserved(struct) ident(RClass) operator(*)ident(klass) operator(=) ident(RCLASS)operator(()ident(cbase)operator(->)ident(nd_clss)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(klass)operator(\)\)) operator({) + reserved(if) operator(()ident(klass)operator(->)ident(iv_tbl) operator(&&) ident(st_lookup)operator(()ident(klass)operator(->)ident(iv_tbl)operator(,) ident(id)operator(,) operator(&)ident(result)operator(\)\)) operator({) + reserved(if) operator(()ident(result) operator(==) ident(Qundef) operator(&&) ident(NIL_P)operator(()ident(rb_autoload_p)operator((()ident(VALUE)operator(\))ident(klass)operator(,) ident(id)operator(\)\)\)) operator({) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) + ident(cbase) operator(=) ident(cbase)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(return) ident(rb_const_defined)operator(()ident(cref)operator(->)ident(nd_clss)operator(,) ident(id)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(ev_const_get)operator(()ident(cref)operator(,) ident(id)operator(,) ident(self)operator(\)) + ident(NODE) operator(*)ident(cref)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(NODE) operator(*)ident(cbase) operator(=) ident(cref)operator(;) + ident(VALUE) ident(result)operator(;) + + reserved(while) operator(()ident(cbase) operator(&&) ident(cbase)operator(->)ident(nd_next)operator(\)) operator({) + ident(VALUE) ident(klass) operator(=) ident(cbase)operator(->)ident(nd_clss)operator(;) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(klass)operator(\)\)) operator({) + reserved(while) operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl) operator(&&) + ident(st_lookup)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) ident(id)operator(,) operator(&)ident(result)operator(\)\)) operator({) + reserved(if) operator(()ident(result) operator(==) ident(Qundef)operator(\)) operator({) + reserved(if) operator((!)ident(RTEST)operator(()ident(rb_autoload_load)operator(()ident(klass)operator(,) ident(id)operator(\)\)\)) reserved(break)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(return) ident(result)operator(;) + operator(}) + operator(}) + ident(cbase) operator(=) ident(cbase)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(return) ident(rb_const_get)operator(()ident(NIL_P)operator(()ident(cref)operator(->)ident(nd_clss)operator(\)) operator(?) ident(CLASS_OF)operator(()ident(self)operator(\):) ident(cref)operator(->)ident(nd_clss)operator(,) ident(id)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(cvar_cbase)operator((\)) +operator({) + ident(NODE) operator(*)ident(cref) operator(=) ident(ruby_cref)operator(;) + + reserved(while) operator(()ident(cref) operator(&&) ident(cref)operator(->)ident(nd_next) operator(&&) operator(()ident(NIL_P)operator(()ident(cref)operator(->)ident(nd_clss)operator(\)) operator(||) ident(FL_TEST)operator(()ident(cref)operator(->)ident(nd_clss)operator(,) ident(FL_SINGLETON)operator(\)\)\)) operator({) + ident(cref) operator(=) ident(cref)operator(->)ident(nd_next)operator(;) + reserved(if) operator((!)ident(cref)operator(->)ident(nd_next)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(class variable access from toplevel singleton method)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(cref)operator(->)ident(nd_clss)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no class variables available)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(cref)operator(->)ident(nd_clss)operator(;) +operator(}) + +comment(/* + * call-seq: + * Module.nesting => array + * + * Returns the list of +Modules+ nested at the point of call. + * + * module M1 + * module M2 + * $a = Module.nesting + * end + * end + * $a #=> [M1::M2, M1] + * $a[0].name #=> "M1::M2" + */) + +directive(static) ident(VALUE) +ident(rb_mod_nesting)operator((\)) +operator({) + ident(NODE) operator(*)ident(cbase) operator(=) ident(ruby_cref)operator(;) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + reserved(while) operator(()ident(cbase) operator(&&) ident(cbase)operator(->)ident(nd_next)operator(\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(cbase)operator(->)ident(nd_clss)operator(\)\)) ident(rb_ary_push)operator(()ident(ary)operator(,) ident(cbase)operator(->)ident(nd_clss)operator(\);) + ident(cbase) operator(=) ident(cbase)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(if) operator(()ident(ruby_wrapper) operator(&&) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(ruby_wrapper)operator(\);) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * Module.constants => array + * + * Returns an array of the names of all constants defined in the + * system. This list includes the names of all modules and classes. + * + * p Module.constants.sort[1..5] + * + * <em>produces:</em> + * + * ["ARGV", "ArgumentError", "Array", "Bignum", "Binding"] + */) + +directive(static) ident(VALUE) +ident(rb_mod_s_constants)operator((\)) +operator({) + ident(NODE) operator(*)ident(cbase) operator(=) ident(ruby_cref)operator(;) + directive(void) operator(*)ident(data) operator(=) integer(0)operator(;) + + reserved(while) operator(()ident(cbase)operator(\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(cbase)operator(->)ident(nd_clss)operator(\)\)) operator({) + ident(data) operator(=) ident(rb_mod_const_at)operator(()ident(cbase)operator(->)ident(nd_clss)operator(,) ident(data)operator(\);) + operator(}) + ident(cbase) operator(=) ident(cbase)operator(->)ident(nd_next)operator(;) + operator(}) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(ruby_cbase)operator(\)\)) operator({) + ident(data) operator(=) ident(rb_mod_const_of)operator(()ident(ruby_cbase)operator(,) ident(data)operator(\);) + operator(}) + reserved(return) ident(rb_const_list)operator(()ident(data)operator(\);) +operator(}) + +directive(void) +ident(rb_frozen_class_p)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + pre_type(char) operator(*)ident(desc) operator(=) string<delimiter(")content(something(?!\))delimiter(")>operator(;) + + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(klass)operator(\)\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) + ident(desc) operator(=) string<delimiter(")content(object)delimiter(")>operator(;) + reserved(else) operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(klass)operator(\)\)) operator({) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_ICLASS)operator(:) + ident(desc) operator(=) string<delimiter(")content(module)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) label(T_CLASS)operator(:) + ident(desc) operator(=) string<delimiter(")content(class)delimiter(")>operator(;) reserved(break)operator(;) + operator(}) + operator(}) + ident(rb_error_frozen)operator(()ident(desc)operator(\);) + operator(}) +operator(}) + +directive(void) +ident(rb_undef)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(origin)operator(;) + ident(NODE) operator(*)ident(body)operator(;) + + reserved(if) operator(()ident(ruby_cbase) operator(==) ident(rb_cObject) operator(&&) ident(klass) operator(==) ident(rb_cObject)operator(\)) operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + operator(}) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(klass)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't undef `%s')delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + ident(rb_frozen_class_p)operator(()ident(klass)operator(\);) + reserved(if) operator(()ident(id) operator(==) ident(__id__) operator(||) ident(id) operator(==) ident(__send__) operator(||) ident(id) operator(==) ident(init)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(undefining `%s' may cause serious problem)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + ident(body) operator(=) ident(search_method)operator(()ident(klass)operator(,) ident(id)operator(,) operator(&)ident(origin)operator(\);) + reserved(if) operator((!)ident(body) operator(||) operator(!)ident(body)operator(->)ident(nd_body)operator(\)) operator({) + pre_type(char) operator(*)ident(s0) operator(=) string<delimiter(")content( class)delimiter(")>operator(;) + ident(VALUE) ident(c) operator(=) ident(klass)operator(;) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(c)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(VALUE) ident(obj) operator(=) ident(rb_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\);) + + reserved(switch) operator(()ident(TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_CLASS)operator(:) + ident(c) operator(=) ident(obj)operator(;) + ident(s0) operator(=) string<delimiter(")delimiter(")>operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(TYPE)operator(()ident(c)operator(\)) operator(==) ident(T_MODULE)operator(\)) operator({) + ident(s0) operator(=) string<delimiter(")content( module)delimiter(")>operator(;) + operator(}) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(undefined method `%s' for%s `%s')delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\),)ident(s0)operator(,)ident(rb_class2name)operator(()ident(c)operator(\)\);) + operator(}) + ident(rb_add_method)operator(()ident(klass)operator(,) ident(id)operator(,) integer(0)operator(,) ident(NOEX_PUBLIC)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_funcall)operator(()ident(rb_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\),) + ident(singleton_undefined)operator(,) integer(1)operator(,) ident(ID2SYM)operator(()ident(id)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(rb_funcall)operator(()ident(klass)operator(,) ident(undefined)operator(,) integer(1)operator(,) ident(ID2SYM)operator(()ident(id)operator(\)\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * undef_method(symbol\) => self + * + * Prevents the current class from responding to calls to the named + * method. Contrast this with <code>remove_method</code>, which deletes + * the method from the particular class; Ruby will still search + * superclasses and mixed-in modules for a possible receiver. + * + * class Parent + * def hello + * puts "In parent" + * end + * end + * class Child < Parent + * def hello + * puts "In child" + * end + * end + * + * + * c = Child.new + * c.hello + * + * + * class Child + * remove_method :hello # remove from child, still in parent + * end + * c.hello + * + * + * class Child + * undef_method :hello # prevent any calls to 'hello' + * end + * c.hello + * + * <em>produces:</em> + * + * In child + * In parent + * prog.rb:23: undefined method `hello' for #<Child:0x401b3bb4> (NoMethodError\) + */) + +directive(static) ident(VALUE) +ident(rb_mod_undef_method)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(mod)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(rb_undef)operator(()ident(mod)operator(,) ident(rb_to_id)operator(()ident(argv)operator([)ident(i)operator(]\)\);) + operator(}) + reserved(return) ident(mod)operator(;) +operator(}) + +directive(void) +ident(rb_alias)operator(()ident(klass)operator(,) ident(name)operator(,) ident(def)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(name)operator(,) ident(def)operator(;) +operator({) + ident(VALUE) ident(origin)operator(;) + ident(NODE) operator(*)ident(orig)operator(,) operator(*)ident(body)operator(,) operator(*)ident(node)operator(;) + ident(VALUE) ident(singleton) operator(=) integer(0)operator(;) + ident(st_data_t) ident(data)operator(;) + + ident(rb_frozen_class_p)operator(()ident(klass)operator(\);) + reserved(if) operator(()ident(name) operator(==) ident(def)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(klass) operator(==) ident(rb_cObject)operator(\)) operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + operator(}) + ident(orig) operator(=) ident(search_method)operator(()ident(klass)operator(,) ident(def)operator(,) operator(&)ident(origin)operator(\);) + reserved(if) operator((!)ident(orig) operator(||) operator(!)ident(orig)operator(->)ident(nd_body)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_MODULE)operator(\)) operator({) + ident(orig) operator(=) ident(search_method)operator(()ident(rb_cObject)operator(,) ident(def)operator(,) operator(&)ident(origin)operator(\);) + operator(}) + operator(}) + reserved(if) operator((!)ident(orig) operator(||) operator(!)ident(orig)operator(->)ident(nd_body)operator(\)) operator({) + ident(print_undef)operator(()ident(klass)operator(,) ident(def)operator(\);) + operator(}) + reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(singleton) operator(=) ident(rb_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\);) + operator(}) + ident(body) operator(=) ident(orig)operator(->)ident(nd_body)operator(;) + ident(orig)operator(->)ident(nd_cnt)operator(++;) + reserved(if) operator(()ident(nd_type)operator(()ident(body)operator(\)) operator(==) ident(NODE_FBODY)operator(\)) operator({) comment(/* was alias */) + ident(def) operator(=) ident(body)operator(->)ident(nd_mid)operator(;) + ident(origin) operator(=) ident(body)operator(->)ident(nd_orig)operator(;) + ident(body) operator(=) ident(body)operator(->)ident(nd_head)operator(;) + operator(}) + + ident(rb_clear_cache_by_id)operator(()ident(name)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)) operator(&&) ident(st_lookup)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) ident(name)operator(,) operator(&)ident(data)operator(\)\)) operator({) + ident(node) operator(=) operator(()ident(NODE) operator(*\))ident(data)operator(;) + reserved(if) operator(()ident(node)operator(->)ident(nd_cnt) operator(==) integer(0) operator(&&) ident(node)operator(->)ident(nd_body)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(discarding old %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(name)operator(\)\);) + operator(}) + operator(}) + ident(st_insert)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) ident(name)operator(,) + operator(()ident(st_data_t)operator(\))ident(NEW_METHOD)operator(()ident(NEW_FBODY)operator(()ident(body)operator(,) ident(def)operator(,) ident(origin)operator(\),) + ident(NOEX_WITH_SAFE)operator(()ident(orig)operator(->)ident(nd_noex)operator(\)\)\);) + + reserved(if) operator((!)ident(ruby_running)operator(\)) reserved(return)operator(;) + + reserved(if) operator(()ident(singleton)operator(\)) operator({) + ident(rb_funcall)operator(()ident(singleton)operator(,) ident(singleton_added)operator(,) integer(1)operator(,) ident(ID2SYM)operator(()ident(name)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(rb_funcall)operator(()ident(klass)operator(,) ident(added)operator(,) integer(1)operator(,) ident(ID2SYM)operator(()ident(name)operator(\)\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * alias_method(new_name, old_name\) => self + * + * Makes <i>new_name</i> a new copy of the method <i>old_name</i>. This can + * be used to retain access to methods that are overridden. + * + * module Mod + * alias_method :orig_exit, :exit + * def exit(code=0\) + * puts "Exiting with code #{code}" + * orig_exit(code\) + * end + * end + * include Mod + * exit(99\) + * + * <em>produces:</em> + * + * Exiting with code 99 + */) + +directive(static) ident(VALUE) +ident(rb_mod_alias_method)operator(()ident(mod)operator(,) ident(newname)operator(,) ident(oldname)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(newname)operator(,) ident(oldname)operator(;) +operator({) + ident(rb_alias)operator(()ident(mod)operator(,) ident(rb_to_id)operator(()ident(newname)operator(\),) ident(rb_to_id)operator(()ident(oldname)operator(\)\);) + reserved(return) ident(mod)operator(;) +operator(}) + +ident(NODE) operator(*) +ident(rb_copy_node_scope)operator(()ident(node)operator(,) ident(rval)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) + ident(NODE) operator(*)ident(rval)operator(;) +operator({) + ident(NODE) operator(*)ident(copy) operator(=) ident(NEW_NODE)operator(()ident(NODE_SCOPE)operator(,)integer(0)operator(,)ident(rval)operator(,)ident(node)operator(->)ident(nd_next)operator(\);) + + reserved(if) operator(()ident(node)operator(->)ident(nd_tbl)operator(\)) operator({) + ident(copy)operator(->)ident(nd_tbl) operator(=) ident(ALLOC_N)operator(()ident(ID)operator(,) ident(node)operator(->)ident(nd_tbl)operator([)integer(0)operator(]+)integer(1)operator(\);) + ident(MEMCPY)operator(()ident(copy)operator(->)ident(nd_tbl)operator(,) ident(node)operator(->)ident(nd_tbl)operator(,) ident(ID)operator(,) ident(node)operator(->)ident(nd_tbl)operator([)integer(0)operator(]+)integer(1)operator(\);) + operator(}) + reserved(else) operator({) + ident(copy)operator(->)ident(nd_tbl) operator(=) integer(0)operator(;) + operator(}) + reserved(return) ident(copy)operator(;) +operator(}) + +preprocessor(#ifdef) ident(C_ALLOCA) +preprocessor(# define) ident(TMP_PROTECT) ident(NODE) operator(*) directive(volatile) ident(tmp__protect_tmp)operator(=)integer(0) +preprocessor(# define) ident(TMP_ALLOC)operator(()ident(n)operator(\)) \ + operator(()ident(tmp__protect_tmp) operator(=) ident(NEW_NODE)operator(()ident(NODE_ALLOCA)operator(,) \ + ident(ALLOC_N)operator(()ident(VALUE)operator(,)ident(n)operator(\),)ident(tmp__protect_tmp)operator(,)ident(n)operator(\),) \ + operator(()directive(void)operator(*\))ident(tmp__protect_tmp)operator(->)ident(nd_head)operator(\)) +preprocessor(#else) +preprocessor(# define) ident(TMP_PROTECT) reserved(typedef) pre_type(int) ident(foobazzz) +preprocessor(# define) ident(TMP_ALLOC)operator(()ident(n)operator(\)) ident(ALLOCA_N)operator(()ident(VALUE)operator(,)ident(n)operator(\)) +preprocessor(#endif) + +preprocessor(#define) ident(SETUP_ARGS0)operator(()ident(anode)operator(,)ident(extra)operator(\)) reserved(do) operator({)\ + ident(NODE) operator(*)ident(n) operator(=) ident(anode)operator(;)\ + reserved(if) operator((!)ident(n)operator(\)) operator({)\ + ident(argc) operator(=) integer(0)operator(;)\ + ident(argv) operator(=) integer(0)operator(;)\ + operator(})\ + reserved(else) reserved(if) operator(()ident(nd_type)operator(()ident(n)operator(\)) operator(==) ident(NODE_ARRAY)operator(\)) operator({)\ + ident(argc)operator(=)ident(anode)operator(->)ident(nd_alen)operator(;)\ + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({)\ + pre_type(int) ident(i)operator(;)\ + ident(n) operator(=) ident(anode)operator(;)\ + ident(argv) operator(=) ident(TMP_ALLOC)operator(()ident(argc)operator(+)ident(extra)operator(\);)\ + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(argc)operator(;)ident(i)operator(++\)) operator({)\ + ident(argv)operator([)ident(i)operator(]) operator(=) ident(rb_eval)operator(()ident(self)operator(,)ident(n)operator(->)ident(nd_head)operator(\);)\ + ident(n)operator(=)ident(n)operator(->)ident(nd_next)operator(;)\ + operator(})\ + operator(})\ + reserved(else) operator({)\ + ident(argc) operator(=) integer(0)operator(;)\ + ident(argv) operator(=) integer(0)operator(;)\ + operator(})\ + operator(})\ + reserved(else) operator({)\ + ident(VALUE) ident(args) operator(=) ident(rb_eval)operator(()ident(self)operator(,)ident(n)operator(\);)\ + reserved(if) operator(()ident(TYPE)operator(()ident(args)operator(\)) operator(!=) ident(T_ARRAY)operator(\))\ + ident(args) operator(=) ident(rb_ary_to_ary)operator(()ident(args)operator(\);)\ + ident(argc) operator(=) ident(RARRAY)operator(()ident(args)operator(\)->)ident(len)operator(;)\ + ident(argv) operator(=) ident(TMP_ALLOC)operator(()ident(argc)operator(+)ident(extra)operator(\);)\ + ident(MEMCPY)operator(()ident(argv)operator(,) ident(RARRAY)operator(()ident(args)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(argc)operator(\);)\ + operator(})\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(SETUP_ARGS)operator(()ident(anode)operator(\)) ident(SETUP_ARGS0)operator(()ident(anode)operator(,)integer(0)operator(\)) + +preprocessor(#define) ident(BEGIN_CALLARGS) reserved(do) operator({)\ + reserved(struct) ident(BLOCK) operator(*)ident(tmp_block) operator(=) ident(ruby_block)operator(;)\ + pre_type(int) ident(tmp_iter) operator(=) ident(ruby_iter)operator(->)ident(iter)operator(;)\ + reserved(switch) operator(()ident(tmp_iter)operator(\)) operator({)\ + reserved(case) label(ITER_PRE)operator(:)\ + reserved(if) operator(()ident(ruby_block)operator(\)) ident(ruby_block) operator(=) ident(ruby_block)operator(->)ident(outer)operator(;)\ + reserved(case) label(ITER_PAS)operator(:)\ + ident(tmp_iter) operator(=) ident(ITER_NOT)operator(;)\ + operator(})\ + ident(PUSH_ITER)operator(()ident(tmp_iter)operator(\)) + +preprocessor(#define) ident(END_CALLARGS) \ + ident(ruby_block) operator(=) ident(tmp_block)operator(;)\ + ident(POP_ITER)operator((\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(MATCH_DATA) operator(*)ident(rb_svar)operator(()ident(node)operator(->)ident(nd_cnt)operator(\)) + +directive(static) pre_type(char)operator(*) ident(is_defined) ident(_)operator((()ident(VALUE)operator(,) ident(NODE)operator(*,) pre_type(char)operator(*\)\);) + +directive(static) pre_type(char)operator(*) +ident(arg_defined)operator(()ident(self)operator(,) ident(node)operator(,) ident(buf)operator(,) ident(type)operator(\)) + ident(VALUE) ident(self)operator(;) + ident(NODE) operator(*)ident(node)operator(;) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(char) operator(*)ident(type)operator(;) +operator({) + pre_type(int) ident(argc)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(if) operator((!)ident(node)operator(\)) reserved(return) ident(type)operator(;) comment(/* no args */) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_ARRAY)operator(\)) operator({) + ident(argc)operator(=)ident(node)operator(->)ident(nd_alen)operator(;) + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(argc)operator(;)ident(i)operator(++\)) operator({) + reserved(if) operator((!)ident(is_defined)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(,) ident(buf)operator(\)\)) + reserved(return) integer(0)operator(;) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + operator(}) + operator(}) + operator(}) + reserved(else) reserved(if) operator((!)ident(is_defined)operator(()ident(self)operator(,) ident(node)operator(,) ident(buf)operator(\)\)) operator({) + reserved(return) integer(0)operator(;) + operator(}) + reserved(return) ident(type)operator(;) +operator(}) + +directive(static) pre_type(char)operator(*) +ident(is_defined)operator(()ident(self)operator(,) ident(node)operator(,) ident(buf)operator(\)) + ident(VALUE) ident(self)operator(;) + ident(NODE) operator(*)ident(node)operator(;) comment(/* OK */) + pre_type(char) operator(*)ident(buf)operator(;) +operator({) + ident(VALUE) ident(val)operator(;) comment(/* OK */) + pre_type(int) ident(state)operator(;) + + label(again)operator(:) + reserved(if) operator((!)ident(node)operator(\)) reserved(return) string<delimiter(")content(expression)delimiter(")>operator(;) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_SUPER)operator(:) + reserved(case) label(NODE_ZSUPER)operator(:) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(last_func) operator(==) integer(0)operator(\)) reserved(return) integer(0)operator(;) + reserved(else) reserved(if) operator(()ident(ruby_frame)operator(->)ident(last_class) operator(==) integer(0)operator(\)) reserved(return) integer(0)operator(;) + ident(val) operator(=) ident(ruby_frame)operator(->)ident(last_class)operator(;) + reserved(if) operator(()ident(rb_method_boundp)operator(()ident(RCLASS)operator(()ident(val)operator(\)->)ident(super)operator(,) ident(ruby_frame)operator(->)ident(orig_func)operator(,) integer(0)operator(\)\)) operator({) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_SUPER)operator(\)) operator({) + reserved(return) ident(arg_defined)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_args)operator(,) ident(buf)operator(,) string<delimiter(")content(super)delimiter(")>operator(\);) + operator(}) + reserved(return) string<delimiter(")content(super)delimiter(")>operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_VCALL)operator(:) + reserved(case) label(NODE_FCALL)operator(:) + ident(val) operator(=) ident(self)operator(;) + reserved(goto) ident(check_bound)operator(;) + + reserved(case) label(NODE_ATTRASGN)operator(:) + ident(val) operator(=) ident(self)operator(;) + reserved(if) operator(()ident(node)operator(->)ident(nd_recv) operator(==) operator(()ident(NODE) operator(*\))integer(1)operator(\)) reserved(goto) ident(check_bound)operator(;) + reserved(case) label(NODE_CALL)operator(:) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(val) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_recv)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) operator({) + ident(ruby_errinfo) operator(=) ident(Qnil)operator(;) + reserved(return) integer(0)operator(;) + operator(}) + label(check_bound)operator(:) + operator({) + pre_type(int) ident(call) operator(=) ident(nd_type)operator(()ident(node)operator(\)==)ident(NODE_CALL)operator(;) + + ident(val) operator(=) ident(CLASS_OF)operator(()ident(val)operator(\);) + reserved(if) operator(()ident(call)operator(\)) operator({) + pre_type(int) ident(noex)operator(;) + ident(ID) ident(id) operator(=) ident(node)operator(->)ident(nd_mid)operator(;) + + reserved(if) operator((!)ident(rb_get_method_body)operator((&)ident(val)operator(,) operator(&)ident(id)operator(,) operator(&)ident(noex)operator(\)\)) + reserved(break)operator(;) + reserved(if) operator((()ident(noex) operator(&) ident(NOEX_PRIVATE)operator(\)\)) + reserved(break)operator(;) + reserved(if) operator((()ident(noex) operator(&) ident(NOEX_PROTECTED)operator(\)) operator(&&) + operator(!)ident(rb_obj_is_kind_of)operator(()ident(self)operator(,) ident(rb_class_real)operator(()ident(val)operator(\)\)\)) + reserved(break)operator(;) + operator(}) + reserved(else) reserved(if) operator((!)ident(rb_method_boundp)operator(()ident(val)operator(,) ident(node)operator(->)ident(nd_mid)operator(,) ident(call)operator(\)\)) + reserved(break)operator(;) + reserved(return) ident(arg_defined)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_args)operator(,) ident(buf)operator(,) + ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_ATTRASGN) operator(?) + string<delimiter(")content(assignment)delimiter(")> operator(:) string<delimiter(")content(method)delimiter(")>operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_MATCH2)operator(:) + reserved(case) label(NODE_MATCH3)operator(:) + reserved(return) string<delimiter(")content(method)delimiter(")>operator(;) + + reserved(case) label(NODE_YIELD)operator(:) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(return) string<delimiter(")content(yield)delimiter(")>operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_SELF)operator(:) + reserved(return) string<delimiter(")content(self)delimiter(")>operator(;) + + reserved(case) label(NODE_NIL)operator(:) + reserved(return) string<delimiter(")content(nil)delimiter(")>operator(;) + + reserved(case) label(NODE_TRUE)operator(:) + reserved(return) string<delimiter(")content(true)delimiter(")>operator(;) + + reserved(case) label(NODE_FALSE)operator(:) + reserved(return) string<delimiter(")content(false)delimiter(")>operator(;) + + reserved(case) label(NODE_ATTRSET)operator(:) + reserved(case) label(NODE_OP_ASGN1)operator(:) + reserved(case) label(NODE_OP_ASGN2)operator(:) + reserved(case) label(NODE_OP_ASGN_OR)operator(:) + reserved(case) label(NODE_OP_ASGN_AND)operator(:) + reserved(case) label(NODE_MASGN)operator(:) + reserved(case) label(NODE_LASGN)operator(:) + reserved(case) label(NODE_DASGN)operator(:) + reserved(case) label(NODE_DASGN_CURR)operator(:) + reserved(case) label(NODE_GASGN)operator(:) + reserved(case) label(NODE_IASGN)operator(:) + reserved(case) label(NODE_CDECL)operator(:) + reserved(case) label(NODE_CVDECL)operator(:) + reserved(case) label(NODE_CVASGN)operator(:) + reserved(return) string<delimiter(")content(assignment)delimiter(")>operator(;) + + reserved(case) label(NODE_LVAR)operator(:) + reserved(return) string<delimiter(")content(local-variable)delimiter(")>operator(;) + reserved(case) label(NODE_DVAR)operator(:) + reserved(return) string<delimiter(")content(local-variable(in-block\))delimiter(")>operator(;) + + reserved(case) label(NODE_GVAR)operator(:) + reserved(if) operator(()ident(rb_gvar_defined)operator(()ident(node)operator(->)ident(nd_entry)operator(\)\)) operator({) + reserved(return) string<delimiter(")content(global-variable)delimiter(")>operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_IVAR)operator(:) + reserved(if) operator(()ident(rb_ivar_defined)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_vid)operator(\)\)) operator({) + reserved(return) string<delimiter(")content(instance-variable)delimiter(")>operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_CONST)operator(:) + reserved(if) operator(()ident(ev_const_defined)operator(()ident(ruby_cref)operator(,) ident(node)operator(->)ident(nd_vid)operator(,) ident(self)operator(\)\)) operator({) + reserved(return) string<delimiter(")content(constant)delimiter(")>operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_CVAR)operator(:) + reserved(if) operator(()ident(rb_cvar_defined)operator(()ident(cvar_cbase)operator((\),) ident(node)operator(->)ident(nd_vid)operator(\)\)) operator({) + reserved(return) string<delimiter(")content(class variable)delimiter(")>operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_COLON2)operator(:) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(val) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) operator({) + ident(ruby_errinfo) operator(=) ident(Qnil)operator(;) + reserved(return) integer(0)operator(;) + operator(}) + reserved(else) operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(val)operator(\)\)) operator({) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(if) operator(()ident(rb_const_defined_from)operator(()ident(val)operator(,) ident(node)operator(->)ident(nd_mid)operator(\)\)) + reserved(return) string<delimiter(")content(constant)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(if) operator(()ident(rb_method_boundp)operator(()ident(CLASS_OF)operator(()ident(val)operator(\),) ident(node)operator(->)ident(nd_mid)operator(,) integer(1)operator(\)\)) operator({) + reserved(return) string<delimiter(")content(method)delimiter(")>operator(;) + operator(}) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_COLON3)operator(:) + reserved(if) operator(()ident(rb_const_defined_from)operator(()ident(rb_cObject)operator(,) ident(node)operator(->)ident(nd_mid)operator(\)\)) operator({) + reserved(return) string<delimiter(")content(constant)delimiter(")>operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_NTH_REF)operator(:) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_reg_nth_defined)operator(()ident(node)operator(->)ident(nd_nth)operator(,) ident(MATCH_DATA)operator(\)\)\)) operator({) + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content($%d)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(node)operator(->)ident(nd_nth)operator(\);) + reserved(return) ident(buf)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_BACK_REF)operator(:) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_reg_nth_defined)operator(()integer(0)operator(,) ident(MATCH_DATA)operator(\)\)\)) operator({) + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content($%c)delimiter(")>operator(,) operator(()pre_type(char)operator(\))ident(node)operator(->)ident(nd_nth)operator(\);) + reserved(return) ident(buf)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_NEWLINE)operator(:) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(default)operator(:) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator((!)ident(state)operator(\)) operator({) + reserved(return) string<delimiter(")content(expression)delimiter(")>operator(;) + operator(}) + ident(ruby_errinfo) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) pre_type(int) ident(handle_rescue) ident(_)operator((()ident(VALUE)operator(,)ident(NODE)operator(*\)\);) + +directive(static) directive(void) ident(blk_free)operator((\);) + +directive(static) ident(VALUE) +ident(rb_obj_is_proc)operator(()ident(proc)operator(\)) + ident(VALUE) ident(proc)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(proc)operator(\)) operator(==) ident(T_DATA) operator(&&) ident(RDATA)operator(()ident(proc)operator(\)->)ident(dfree) operator(==) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(blk_free)operator(\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(void) +ident(rb_add_event_hook)operator(()ident(func)operator(,) ident(events)operator(\)) + ident(rb_event_hook_func_t) ident(func)operator(;) + ident(rb_event_t) ident(events)operator(;) +operator({) + ident(rb_event_hook_t) operator(*)ident(hook)operator(;) + + ident(hook) operator(=) ident(ALLOC)operator(()ident(rb_event_hook_t)operator(\);) + ident(hook)operator(->)ident(func) operator(=) ident(func)operator(;) + ident(hook)operator(->)ident(events) operator(=) ident(events)operator(;) + ident(hook)operator(->)ident(next) operator(=) ident(event_hooks)operator(;) + ident(event_hooks) operator(=) ident(hook)operator(;) +operator(}) + +pre_type(int) +ident(rb_remove_event_hook)operator(()ident(func)operator(\)) + ident(rb_event_hook_func_t) ident(func)operator(;) +operator({) + ident(rb_event_hook_t) operator(*)ident(prev)operator(,) operator(*)ident(hook)operator(;) + + ident(prev) operator(=) pre_constant(NULL)operator(;) + ident(hook) operator(=) ident(event_hooks)operator(;) + reserved(while) operator(()ident(hook)operator(\)) operator({) + reserved(if) operator(()ident(hook)operator(->)ident(func) operator(==) ident(func)operator(\)) operator({) + reserved(if) operator(()ident(prev)operator(\)) operator({) + ident(prev)operator(->)ident(next) operator(=) ident(hook)operator(->)ident(next)operator(;) + operator(}) + reserved(else) operator({) + ident(event_hooks) operator(=) ident(hook)operator(->)ident(next)operator(;) + operator(}) + ident(xfree)operator(()ident(hook)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + ident(prev) operator(=) ident(hook)operator(;) + ident(hook) operator(=) ident(hook)operator(->)ident(next)operator(;) + operator(}) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +comment(/* + * call-seq: + * set_trace_func(proc\) => proc + * set_trace_func(nil\) => nil + * + * Establishes _proc_ as the handler for tracing, or disables + * tracing if the parameter is +nil+. _proc_ takes up + * to six parameters: an event name, a filename, a line number, an + * object id, a binding, and the name of a class. _proc_ is + * invoked whenever an event occurs. Events are: <code>c-call</code> + * (call a C-language routine\), <code>c-return</code> (return from a + * C-language routine\), <code>call</code> (call a Ruby method\), + * <code>class</code> (start a class or module definition\), + * <code>end</code> (finish a class or module definition\), + * <code>line</code> (execute code on a new line\), <code>raise</code> + * (raise an exception\), and <code>return</code> (return from a Ruby + * method\). Tracing is disabled within the context of _proc_. + * + * class Test + * def test + * a = 1 + * b = 2 + * end + * end + * + * set_trace_func proc { |event, file, line, id, binding, classname| + * printf "%8s %s:%-2d %10s %8s\\n", event, file, line, id, classname + * } + * t = Test.new + * t.test + * + * line prog.rb:11 false + * c-call prog.rb:11 new Class + * c-call prog.rb:11 initialize Object + * c-return prog.rb:11 initialize Object + * c-return prog.rb:11 new Class + * line prog.rb:12 false + * call prog.rb:2 test Test + * line prog.rb:3 test Test + * line prog.rb:4 test Test + * return prog.rb:4 test Test + */) + + +directive(static) ident(VALUE) +ident(set_trace_func)operator(()ident(obj)operator(,) ident(trace)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(trace)operator(;) +operator({) + ident(rb_event_hook_t) operator(*)ident(hook)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(trace)operator(\)\)) operator({) + ident(trace_func) operator(=) integer(0)operator(;) + ident(rb_remove_event_hook)operator(()ident(call_trace_func)operator(\);) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(if) operator((!)ident(rb_obj_is_proc)operator(()ident(trace)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(trace_func needs to be Proc)delimiter(")>operator(\);) + operator(}) + ident(trace_func) operator(=) ident(trace)operator(;) + reserved(for) operator(()ident(hook) operator(=) ident(event_hooks)operator(;) ident(hook)operator(;) ident(hook) operator(=) ident(hook)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(hook)operator(->)ident(func) operator(==) ident(call_trace_func)operator(\)) + reserved(return) ident(trace)operator(;) + operator(}) + ident(rb_add_event_hook)operator(()ident(call_trace_func)operator(,) ident(RUBY_EVENT_ALL)operator(\);) + reserved(return) ident(trace)operator(;) +operator(}) + +directive(static) pre_type(char) operator(*) +ident(get_event_name)operator(()ident(rb_event_t) ident(event)operator(\)) +operator({) + reserved(switch) operator(()ident(event)operator(\)) operator({) + reserved(case) label(RUBY_EVENT_LINE)operator(:) + reserved(return) string<delimiter(")content(line)delimiter(")>operator(;) + reserved(case) label(RUBY_EVENT_CLASS)operator(:) + reserved(return) string<delimiter(")content(class)delimiter(")>operator(;) + reserved(case) label(RUBY_EVENT_END)operator(:) + reserved(return) string<delimiter(")content(end)delimiter(")>operator(;) + reserved(case) label(RUBY_EVENT_CALL)operator(:) + reserved(return) string<delimiter(")content(call)delimiter(")>operator(;) + reserved(case) label(RUBY_EVENT_RETURN)operator(:) + reserved(return) string<delimiter(")content(return)delimiter(")>operator(;) + reserved(case) label(RUBY_EVENT_C_CALL)operator(:) + reserved(return) string<delimiter(")content(c-call)delimiter(")>operator(;) + reserved(case) label(RUBY_EVENT_C_RETURN)operator(:) + reserved(return) string<delimiter(")content(c-return)delimiter(")>operator(;) + reserved(case) label(RUBY_EVENT_RAISE)operator(:) + reserved(return) string<delimiter(")content(raise)delimiter(")>operator(;) + reserved(default)operator(:) + reserved(return) string<delimiter(")content(unknown)delimiter(")>operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(call_trace_func)operator(()ident(event)operator(,) ident(node)operator(,) ident(self)operator(,) ident(id)operator(,) ident(klass)operator(\)) + ident(rb_event_t) ident(event)operator(;) + ident(NODE) operator(*)ident(node)operator(;) + ident(VALUE) ident(self)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(klass)operator(;) comment(/* OK */) +operator({) + pre_type(int) ident(state)operator(,) ident(raised)operator(;) + reserved(struct) ident(FRAME) operator(*)ident(prev)operator(;) + ident(NODE) operator(*)ident(node_save)operator(;) + ident(VALUE) ident(srcfile)operator(;) + pre_type(char) operator(*)ident(event_name)operator(;) + ident(rb_thread_t) ident(th) operator(=) ident(curr_thread)operator(;) + + reserved(if) operator((!)ident(trace_func)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(tracing)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(ruby_in_compile)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(id) operator(==) ident(ID_ALLOCATOR)operator(\)) reserved(return)operator(;) + + reserved(if) operator((!()ident(node_save) operator(=) ident(ruby_current_node)operator(\)\)) operator({) + ident(node_save) operator(=) ident(NEW_NEWLINE)operator(()integer(0)operator(\);) + operator(}) + ident(tracing) operator(=) integer(1)operator(;) + ident(prev) operator(=) ident(ruby_frame)operator(;) + ident(PUSH_FRAME)operator((\);) + operator(*)ident(ruby_frame) operator(=) operator(*)ident(prev)operator(;) + ident(ruby_frame)operator(->)ident(prev) operator(=) ident(prev)operator(;) + ident(ruby_frame)operator(->)ident(iter) operator(=) integer(0)operator(;) comment(/* blocks not available anyway */) + + reserved(if) operator(()ident(node)operator(\)) operator({) + ident(ruby_current_node) operator(=) ident(node)operator(;) + ident(ruby_frame)operator(->)ident(node) operator(=) ident(node)operator(;) + ident(ruby_sourcefile) operator(=) ident(node)operator(->)ident(nd_file)operator(;) + ident(ruby_sourceline) operator(=) ident(nd_line)operator(()ident(node)operator(\);) + operator(}) + reserved(if) operator(()ident(klass)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(klass) operator(=) ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(klass) operator(=) ident(rb_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\);) + operator(}) + operator(}) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + ident(raised) operator(=) ident(rb_thread_reset_raised)operator(()ident(th)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(srcfile) operator(=) ident(rb_str_new2)operator(()ident(ruby_sourcefile)operator(?)label(ruby_sourcefile)operator(:)string<delimiter(")content((ruby\))delimiter(")>operator(\);) + ident(event_name) operator(=) ident(get_event_name)operator(()ident(event)operator(\);) + ident(proc_invoke)operator(()ident(trace_func)operator(,) ident(rb_ary_new3)operator(()integer(6)operator(,) ident(rb_str_new2)operator(()ident(event_name)operator(\),) + ident(srcfile)operator(,) + ident(INT2FIX)operator(()ident(ruby_sourceline)operator(\),) + ident(id)operator(?)ident(ID2SYM)operator(()ident(id)operator(\):)ident(Qnil)operator(,) + ident(self)operator(?)ident(rb_f_binding)operator(()ident(self)operator(\):)ident(Qnil)operator(,) + ident(klass)operator(\),) + ident(Qundef)operator(,) integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(raised)operator(\)) ident(rb_thread_set_raised)operator(()ident(th)operator(\);) + ident(POP_TAG)operator((\);) + ident(POP_FRAME)operator((\);) + + ident(tracing) operator(=) integer(0)operator(;) + ident(ruby_current_node) operator(=) ident(node_save)operator(;) + ident(SET_CURRENT_SOURCE)operator((\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(avalue_to_svalue)operator(()ident(v)operator(\)) + ident(VALUE) ident(v)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(,) ident(top)operator(;) + + ident(tmp) operator(=) ident(rb_check_array_type)operator(()ident(v)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(return) ident(v)operator(;) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(Qundef)operator(;) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len) operator(==) integer(1)operator(\)) operator({) + ident(top) operator(=) ident(rb_check_array_type)operator(()ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(ptr)operator([)integer(0)operator(]\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(top)operator(\)\)) operator({) + reserved(return) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(top)operator(\)->)ident(len) operator(>) integer(1)operator(\)) operator({) + reserved(return) ident(v)operator(;) + operator(}) + reserved(return) ident(top)operator(;) + operator(}) + reserved(return) ident(tmp)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(svalue_to_avalue)operator(()ident(v)operator(\)) + ident(VALUE) ident(v)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(,) ident(top)operator(;) + + reserved(if) operator(()ident(v) operator(==) ident(Qundef)operator(\)) reserved(return) ident(rb_ary_new2)operator(()integer(0)operator(\);) + ident(tmp) operator(=) ident(rb_check_array_type)operator(()ident(v)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(v)operator(\);) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len) operator(==) integer(1)operator(\)) operator({) + ident(top) operator(=) ident(rb_check_array_type)operator(()ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(ptr)operator([)integer(0)operator(]\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(top)operator(\)) operator(&&) ident(RARRAY)operator(()ident(top)operator(\)->)ident(len) operator(>) integer(1)operator(\)) operator({) + reserved(return) ident(tmp)operator(;) + operator(}) + reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(v)operator(\);) + operator(}) + reserved(return) ident(tmp)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(svalue_to_mrhs)operator(()ident(v)operator(,) ident(lhs)operator(\)) + ident(VALUE) ident(v)operator(;) + ident(NODE) operator(*)ident(lhs)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + + reserved(if) operator(()ident(v) operator(==) ident(Qundef)operator(\)) reserved(return) ident(rb_ary_new2)operator(()integer(0)operator(\);) + ident(tmp) operator(=) ident(rb_check_array_type)operator(()ident(v)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(v)operator(\);) + operator(}) + comment(/* no lhs means splat lhs only */) + reserved(if) operator((!)ident(lhs)operator(\)) operator({) + reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(v)operator(\);) + operator(}) + reserved(return) ident(tmp)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(avalue_splat)operator(()ident(v)operator(\)) + ident(VALUE) ident(v)operator(;) +operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(v)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(Qundef)operator(;) + operator(}) + reserved(if) operator(()ident(RARRAY)operator(()ident(v)operator(\)->)ident(len) operator(==) integer(1)operator(\)) operator({) + reserved(return) ident(RARRAY)operator(()ident(v)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + operator(}) + reserved(return) ident(v)operator(;) +operator(}) + +preprocessor(#if) integer(1) +ident(VALUE) +ident(rb_Array)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_check_array_type)operator(()ident(val)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + comment(/* hack to avoid invoke Object#to_a */) + ident(VALUE) ident(origin)operator(;) + ident(ID) ident(id) operator(=) ident(rb_intern)operator(()string<delimiter(")content(to_a)delimiter(")>operator(\);) + + reserved(if) operator(()ident(search_method)operator(()ident(CLASS_OF)operator(()ident(val)operator(\),) ident(id)operator(,) operator(&)ident(origin)operator(\)) operator(&&) + ident(RCLASS)operator(()ident(origin)operator(\)->)ident(m_tbl) operator(!=) ident(RCLASS)operator(()ident(rb_mKernel)operator(\)->)ident(m_tbl)operator(\)) operator({) comment(/* exclude Kernel#to_a */) + ident(val) operator(=) ident(rb_funcall)operator(()ident(val)operator(,) ident(id)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(val)operator(\)) operator(!=) ident(T_ARRAY)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(`to_a' did not return Array)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(val)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(val)operator(\);) + operator(}) + operator(}) + reserved(return) ident(tmp)operator(;) +operator(}) +preprocessor(#endif) + +directive(static) ident(VALUE) +ident(splat_value)operator(()ident(v)operator(\)) + ident(VALUE) ident(v)operator(;) +operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(v)operator(\)\)) reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(Qnil)operator(\);) + reserved(return) ident(rb_Array)operator(()ident(v)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(class_prefix)operator(()ident(self)operator(,) ident(cpath)operator(\)) + ident(VALUE) ident(self)operator(;) + ident(NODE) operator(*)ident(cpath)operator(;) +operator({) + reserved(if) operator((!)ident(cpath)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(class path missing)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(cpath)operator(->)ident(nd_head)operator(\)) operator({) + ident(VALUE) ident(c) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(cpath)operator(->)ident(nd_head)operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(c)operator(\)\)) operator({) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s is not a class/module)delimiter(")>operator(,) + ident(RSTRING)operator(()ident(rb_obj_as_string)operator(()ident(c)operator(\)\)->)ident(ptr)operator(\);) + operator(}) + reserved(return) ident(c)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(nd_type)operator(()ident(cpath)operator(\)) operator(==) ident(NODE_COLON2)operator(\)) operator({) + reserved(return) ident(ruby_cbase)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ruby_wrapper)operator(\)) operator({) + reserved(return) ident(ruby_wrapper)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_cObject)operator(;) + operator(}) +operator(}) + +preprocessor(#define) ident(return_value)operator(()ident(v)operator(\)) reserved(do) operator({)\ + reserved(if) operator((()ident(prot_tag)operator(->)ident(retval) operator(=) operator(()ident(v)operator(\)\)) operator(==) ident(Qundef)operator(\)) operator({)\ + ident(prot_tag)operator(->)ident(retval) operator(=) ident(Qnil)operator(;)\ + operator(})\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +ident(NORETURN)operator(()directive(static) directive(void) ident(return_jump) ident(_)operator((()ident(VALUE)operator(\)\)\);) +ident(NORETURN)operator(()directive(static) directive(void) ident(break_jump) ident(_)operator((()ident(VALUE)operator(\)\)\);) +ident(NORETURN)operator(()directive(static) directive(void) ident(next_jump) ident(_)operator((()ident(VALUE)operator(\)\)\);) +ident(NORETURN)operator(()directive(static) directive(void) ident(unknown_node) ident(_)operator((()ident(NODE) operator(*) directive(volatile)operator(\)\)\);) + +directive(static) directive(void) +ident(unknown_node)operator(()ident(node)operator(\)) + ident(NODE) operator(*)directive(volatile) ident(node)operator(;) +operator({) + ident(ruby_current_node) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(node)operator(->)ident(flags) operator(==) integer(0)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(terminated node (0x%lx\))delimiter(")>operator(,) ident(node)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(node)operator(\)) operator(!=) ident(T_NODE)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(not a node 0x%02lx (0x%lx\))delimiter(")>operator(,) ident(BUILTIN_TYPE)operator(()ident(node)operator(\),) ident(node)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_bug)operator(()string<delimiter(")content(unknown node type %d (0x%lx\))delimiter(")>operator(,) ident(nd_type)operator(()ident(node)operator(\),) ident(node)operator(\);) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(rb_eval)operator(()ident(self)operator(,) ident(n)operator(\)) + ident(VALUE) ident(self)operator(;) + ident(NODE) operator(*)ident(n)operator(;) +operator({) + ident(NODE) operator(*) directive(volatile) ident(contnode) operator(=) integer(0)operator(;) + ident(NODE) operator(*) directive(volatile) ident(node) operator(=) ident(n)operator(;) + pre_type(int) ident(state)operator(;) + directive(volatile) ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) + ident(st_data_t) ident(data)operator(;) + +preprocessor(#define) ident(RETURN)operator(()ident(v)operator(\)) reserved(do) operator({) \ + ident(result) operator(=) operator(()ident(v)operator(\);) \ + reserved(goto) ident(finish)operator(;) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + + label(again)operator(:) + reserved(if) operator((!)ident(node)operator(\)) ident(RETURN)operator(()ident(Qnil)operator(\);) + + ident(ruby_current_node) operator(=) ident(node)operator(;) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_BLOCK)operator(:) + reserved(if) operator(()ident(contnode)operator(\)) operator({) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(\);) + reserved(break)operator(;) + operator(}) + ident(contnode) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + ident(node) operator(=) ident(node)operator(->)ident(nd_head)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_POSTEXE)operator(:) + ident(rb_f_END)operator((\);) + ident(nd_set_type)operator(()ident(node)operator(,) ident(NODE_NIL)operator(\);) comment(/* exec just once */) + ident(result) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + + comment(/* begin .. end without clauses */) + reserved(case) label(NODE_BEGIN)operator(:) + ident(node) operator(=) ident(node)operator(->)ident(nd_body)operator(;) + reserved(goto) ident(again)operator(;) + + comment(/* nodes for speed-up(default match\) */) + reserved(case) label(NODE_MATCH)operator(:) + ident(result) operator(=) ident(rb_reg_match2)operator(()ident(node)operator(->)ident(nd_lit)operator(\);) + reserved(break)operator(;) + + comment(/* nodes for speed-up(literal match\) */) + reserved(case) label(NODE_MATCH2)operator(:) + operator({) + ident(VALUE) ident(l) operator(=) ident(rb_eval)operator(()ident(self)operator(,)ident(node)operator(->)ident(nd_recv)operator(\);) + ident(VALUE) ident(r) operator(=) ident(rb_eval)operator(()ident(self)operator(,)ident(node)operator(->)ident(nd_value)operator(\);) + ident(result) operator(=) ident(rb_reg_match)operator(()ident(l)operator(,) ident(r)operator(\);) + operator(}) + reserved(break)operator(;) + + comment(/* nodes for speed-up(literal match\) */) + reserved(case) label(NODE_MATCH3)operator(:) + operator({) + ident(VALUE) ident(r) operator(=) ident(rb_eval)operator(()ident(self)operator(,)ident(node)operator(->)ident(nd_recv)operator(\);) + ident(VALUE) ident(l) operator(=) ident(rb_eval)operator(()ident(self)operator(,)ident(node)operator(->)ident(nd_value)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(l)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(result) operator(=) ident(rb_reg_match)operator(()ident(r)operator(,) ident(l)operator(\);) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(rb_funcall)operator(()ident(l)operator(,) ident(match)operator(,) integer(1)operator(,) ident(r)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + comment(/* node for speed-up(top-level loop for -n/-p\) */) + reserved(case) label(NODE_OPT_N)operator(:) + ident(PUSH_TAG)operator(()ident(PROT_LOOP)operator(\);) + reserved(switch) operator(()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator({) + reserved(case) integer(0)operator(:) + label(opt_n_next)operator(:) + reserved(while) operator((!)ident(NIL_P)operator(()ident(rb_gets)operator((\)\)\)) operator({) + label(opt_n_redo)operator(:) + ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_body)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TAG_REDO)operator(:) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(opt_n_redo)operator(;) + reserved(case) label(TAG_NEXT)operator(:) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(opt_n_next)operator(;) + reserved(case) label(TAG_BREAK)operator(:) + ident(state) operator(=) integer(0)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + ident(RETURN)operator(()ident(Qnil)operator(\);) + + reserved(case) label(NODE_SELF)operator(:) + ident(RETURN)operator(()ident(self)operator(\);) + + reserved(case) label(NODE_NIL)operator(:) + ident(RETURN)operator(()ident(Qnil)operator(\);) + + reserved(case) label(NODE_TRUE)operator(:) + ident(RETURN)operator(()ident(Qtrue)operator(\);) + + reserved(case) label(NODE_FALSE)operator(:) + ident(RETURN)operator(()ident(Qfalse)operator(\);) + + reserved(case) label(NODE_IF)operator(:) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_LINE)operator(,) ident(node)operator(,) ident(self)operator(,) + ident(ruby_frame)operator(->)ident(last_func)operator(,) + ident(ruby_frame)operator(->)ident(last_class)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_cond)operator(\)\)\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_body)operator(;) + operator(}) + reserved(else) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_else)operator(;) + operator(}) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_WHEN)operator(:) + reserved(while) operator(()ident(node)operator(\)) operator({) + ident(NODE) operator(*)ident(tag)operator(;) + + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(!=) ident(NODE_WHEN)operator(\)) reserved(goto) ident(again)operator(;) + ident(tag) operator(=) ident(node)operator(->)ident(nd_head)operator(;) + reserved(while) operator(()ident(tag)operator(\)) operator({) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_LINE)operator(,) ident(tag)operator(,) ident(self)operator(,) + ident(ruby_frame)operator(->)ident(last_func)operator(,) + ident(ruby_frame)operator(->)ident(last_class)operator(\);) + reserved(if) operator(()ident(tag)operator(->)ident(nd_head) operator(&&) ident(nd_type)operator(()ident(tag)operator(->)ident(nd_head)operator(\)) operator(==) ident(NODE_WHEN)operator(\)) operator({) + ident(VALUE) ident(v) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(tag)operator(->)ident(nd_head)operator(->)ident(nd_head)operator(\);) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(T_ARRAY)operator(\)) ident(v) operator(=) ident(rb_ary_to_ary)operator(()ident(v)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(v)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(RARRAY)operator(()ident(v)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_body)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + operator(}) + ident(tag) operator(=) ident(tag)operator(->)ident(nd_next)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(tag)operator(->)ident(nd_head)operator(\)\)\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_body)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + ident(tag) operator(=) ident(tag)operator(->)ident(nd_next)operator(;) + operator(}) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + operator(}) + ident(RETURN)operator(()ident(Qnil)operator(\);) + + reserved(case) label(NODE_CASE)operator(:) + operator({) + ident(VALUE) ident(val)operator(;) + + ident(val) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\);) + ident(node) operator(=) ident(node)operator(->)ident(nd_body)operator(;) + reserved(while) operator(()ident(node)operator(\)) operator({) + ident(NODE) operator(*)ident(tag)operator(;) + + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(!=) ident(NODE_WHEN)operator(\)) operator({) + reserved(goto) ident(again)operator(;) + operator(}) + ident(tag) operator(=) ident(node)operator(->)ident(nd_head)operator(;) + reserved(while) operator(()ident(tag)operator(\)) operator({) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_LINE)operator(,) ident(tag)operator(,) ident(self)operator(,) + ident(ruby_frame)operator(->)ident(last_func)operator(,) + ident(ruby_frame)operator(->)ident(last_class)operator(\);) + reserved(if) operator(()ident(tag)operator(->)ident(nd_head) operator(&&) ident(nd_type)operator(()ident(tag)operator(->)ident(nd_head)operator(\)) operator(==) ident(NODE_WHEN)operator(\)) operator({) + ident(VALUE) ident(v) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(tag)operator(->)ident(nd_head)operator(->)ident(nd_head)operator(\);) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(T_ARRAY)operator(\)) ident(v) operator(=) ident(rb_ary_to_ary)operator(()ident(v)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(v)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall2)operator(()ident(RARRAY)operator(()ident(v)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(eqq)operator(,) integer(1)operator(,) operator(&)ident(val)operator(\)\)\){) + ident(node) operator(=) ident(node)operator(->)ident(nd_body)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + operator(}) + ident(tag) operator(=) ident(tag)operator(->)ident(nd_next)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall2)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(tag)operator(->)ident(nd_head)operator(\),) ident(eqq)operator(,) integer(1)operator(,) operator(&)ident(val)operator(\)\)\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_body)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + ident(tag) operator(=) ident(tag)operator(->)ident(nd_next)operator(;) + operator(}) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + operator(}) + operator(}) + ident(RETURN)operator(()ident(Qnil)operator(\);) + + reserved(case) label(NODE_WHILE)operator(:) + ident(PUSH_TAG)operator(()ident(PROT_LOOP)operator(\);) + ident(result) operator(=) ident(Qnil)operator(;) + reserved(switch) operator(()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator({) + reserved(case) integer(0)operator(:) + reserved(if) operator(()ident(node)operator(->)ident(nd_state) operator(&&) operator(!)ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_cond)operator(\)\)\)) + reserved(goto) ident(while_out)operator(;) + reserved(do) operator({) + label(while_redo)operator(:) + ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_body)operator(\);) + label(while_next)operator(:) + operator(;) + operator(}) reserved(while) operator(()ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_cond)operator(\)\)\);) + reserved(break)operator(;) + + reserved(case) label(TAG_REDO)operator(:) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(while_redo)operator(;) + reserved(case) label(TAG_NEXT)operator(:) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(while_next)operator(;) + reserved(case) label(TAG_BREAK)operator(:) + reserved(if) operator(()ident(TAG_DST)operator((\)\)) operator({) + ident(state) operator(=) integer(0)operator(;) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + operator(}) + comment(/* fall through */) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + label(while_out)operator(:) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + ident(RETURN)operator(()ident(result)operator(\);) + + reserved(case) label(NODE_UNTIL)operator(:) + ident(PUSH_TAG)operator(()ident(PROT_LOOP)operator(\);) + ident(result) operator(=) ident(Qnil)operator(;) + reserved(switch) operator(()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator({) + reserved(case) integer(0)operator(:) + reserved(if) operator(()ident(node)operator(->)ident(nd_state) operator(&&) ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_cond)operator(\)\)\)) + reserved(goto) ident(until_out)operator(;) + reserved(do) operator({) + label(until_redo)operator(:) + ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_body)operator(\);) + label(until_next)operator(:) + operator(;) + operator(}) reserved(while) operator((!)ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_cond)operator(\)\)\);) + reserved(break)operator(;) + + reserved(case) label(TAG_REDO)operator(:) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(until_redo)operator(;) + reserved(case) label(TAG_NEXT)operator(:) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(until_next)operator(;) + reserved(case) label(TAG_BREAK)operator(:) + reserved(if) operator(()ident(TAG_DST)operator((\)\)) operator({) + ident(state) operator(=) integer(0)operator(;) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + operator(}) + comment(/* fall through */) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + label(until_out)operator(:) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + ident(RETURN)operator(()ident(result)operator(\);) + + reserved(case) label(NODE_BLOCK_PASS)operator(:) + ident(result) operator(=) ident(block_pass)operator(()ident(self)operator(,) ident(node)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_ITER)operator(:) + reserved(case) label(NODE_FOR)operator(:) + operator({) + ident(PUSH_TAG)operator(()ident(PROT_LOOP)operator(\);) + ident(PUSH_BLOCK)operator(()ident(node)operator(->)ident(nd_var)operator(,) ident(node)operator(->)ident(nd_body)operator(\);) + + ident(state) operator(=) ident(EXEC_TAG)operator((\);) + reserved(if) operator(()ident(state) operator(==) integer(0)operator(\)) operator({) + label(iter_retry)operator(:) + ident(PUSH_ITER)operator(()ident(ITER_PRE)operator(\);) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_ITER)operator(\)) operator({) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_iter)operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(recv)operator(;) + + ident(_block)operator(.)ident(flags) operator(&=) operator(~)ident(BLOCK_D_SCOPE)operator(;) + ident(BEGIN_CALLARGS)operator(;) + ident(recv) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_iter)operator(\);) + ident(END_CALLARGS)operator(;) + ident(ruby_current_node) operator(=) ident(node)operator(;) + ident(SET_CURRENT_SOURCE)operator((\);) + ident(result) operator(=) ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),)ident(recv)operator(,)ident(each)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(,)ident(self)operator(\);) + operator(}) + ident(POP_ITER)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_BREAK) operator(&&) ident(TAG_DST)operator((\)\)) operator({) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + ident(state) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_RETRY)operator(\)) operator({) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(iter_retry)operator(;) + operator(}) + ident(POP_BLOCK)operator((\);) + ident(POP_TAG)operator((\);) + reserved(switch) operator(()ident(state)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_BREAK)operator(:) + ident(break_jump)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_stts)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(NODE_NEXT)operator(:) + ident(CHECK_INTS)operator(;) + ident(next_jump)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_stts)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(NODE_REDO)operator(:) + ident(CHECK_INTS)operator(;) + ident(JUMP_TAG)operator(()ident(TAG_REDO)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_RETRY)operator(:) + ident(CHECK_INTS)operator(;) + ident(JUMP_TAG)operator(()ident(TAG_RETRY)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_SPLAT)operator(:) + ident(result) operator(=) ident(splat_value)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(NODE_TO_ARY)operator(:) + ident(result) operator(=) ident(rb_ary_to_ary)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(NODE_SVALUE)operator(:) + ident(result) operator(=) ident(avalue_splat)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\)\);) + reserved(if) operator(()ident(result) operator(==) ident(Qundef)operator(\)) ident(result) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_YIELD)operator(:) + reserved(if) operator(()ident(node)operator(->)ident(nd_head)operator(\)) operator({) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\);) + ident(ruby_current_node) operator(=) ident(node)operator(;) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(Qundef)operator(;) comment(/* no arg */) + operator(}) + ident(SET_CURRENT_SOURCE)operator((\);) + ident(result) operator(=) ident(rb_yield_0)operator(()ident(result)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) ident(node)operator(->)ident(nd_state)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_RESCUE)operator(:) + operator({) + directive(volatile) ident(VALUE) ident(e_info) operator(=) ident(ruby_errinfo)operator(;) + directive(volatile) pre_type(int) ident(rescuing) operator(=) integer(0)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + label(retry_entry)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(rescuing)operator(\)) operator({) + reserved(if) operator(()ident(rescuing) operator(<) integer(0)operator(\)) operator({) + comment(/* in rescue argument, just reraise */) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_RETRY)operator(\)) operator({) + ident(rescuing) operator(=) ident(state) operator(=) integer(0)operator(;) + ident(ruby_errinfo) operator(=) ident(e_info)operator(;) + reserved(goto) ident(retry_entry)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(!=) ident(TAG_RAISE)operator(\)) operator({) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_RAISE)operator(\)) operator({) + ident(NODE) operator(*)ident(resq) operator(=) ident(node)operator(->)ident(nd_resq)operator(;) + + ident(rescuing) operator(=) operator(-)integer(1)operator(;) + reserved(while) operator(()ident(resq)operator(\)) operator({) + ident(ruby_current_node) operator(=) ident(resq)operator(;) + reserved(if) operator(()ident(handle_rescue)operator(()ident(self)operator(,) ident(resq)operator(\)\)) operator({) + ident(state) operator(=) integer(0)operator(;) + ident(rescuing) operator(=) integer(1)operator(;) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(resq)operator(->)ident(nd_body)operator(\);) + reserved(break)operator(;) + operator(}) + ident(resq) operator(=) ident(resq)operator(->)ident(nd_head)operator(;) comment(/* next rescue */) + operator(}) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state) operator(!=) ident(TAG_RAISE)operator(\)) ident(ruby_errinfo) operator(=) ident(e_info)operator(;) + reserved(if) operator(()ident(state)operator(\)) operator({) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + operator(}) + comment(/* no exception raised */) + reserved(if) operator((!)ident(rescuing) operator(&&) operator(()ident(node) operator(=) ident(node)operator(->)ident(nd_else)operator(\)\)) operator({) comment(/* else clause given */) + reserved(goto) ident(again)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_ENSURE)operator(:) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(node)operator(->)ident(nd_ensr) operator(&&) operator(!)ident(thread_no_ensure)operator((\)\)) operator({) + ident(VALUE) ident(retval) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) comment(/* save retval */) + ident(VALUE) ident(errinfo) operator(=) ident(ruby_errinfo)operator(;) + + ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_ensr)operator(\);) + ident(return_value)operator(()ident(retval)operator(\);) + ident(ruby_errinfo) operator(=) ident(errinfo)operator(;) + operator(}) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_AND)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_1st)operator(\);) + reserved(if) operator((!)ident(RTEST)operator(()ident(result)operator(\)\)) reserved(break)operator(;) + ident(node) operator(=) ident(node)operator(->)ident(nd_2nd)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_OR)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_1st)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(result)operator(\)\)) reserved(break)operator(;) + ident(node) operator(=) ident(node)operator(->)ident(nd_2nd)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_NOT)operator(:) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_body)operator(\)\)\)) ident(result) operator(=) ident(Qfalse)operator(;) + reserved(else) ident(result) operator(=) ident(Qtrue)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_DOT2)operator(:) + reserved(case) label(NODE_DOT3)operator(:) + operator({) + ident(VALUE) ident(beg) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_beg)operator(\);) + ident(VALUE) ident(end) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_end)operator(\);) + ident(result) operator(=) ident(rb_range_new)operator(()ident(beg)operator(,) ident(end)operator(,) ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_DOT3)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_FLIP2)operator(:) comment(/* like AWK */) + operator({) + ident(VALUE) operator(*)ident(flip) operator(=) ident(rb_svar)operator(()ident(node)operator(->)ident(nd_cnt)operator(\);) + reserved(if) operator((!)ident(flip)operator(\)) ident(rb_bug)operator(()string<delimiter(")content(unexpected local variable)delimiter(")>operator(\);) + reserved(if) operator((!)ident(RTEST)operator((*)ident(flip)operator(\)\)) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_beg)operator(\)\)\)) operator({) + operator(*)ident(flip) operator(=) ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_end)operator(\)\)?)label(Qfalse)operator(:)ident(Qtrue)operator(;) + ident(result) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(Qfalse)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_end)operator(\)\)\)) operator({) + operator(*)ident(flip) operator(=) ident(Qfalse)operator(;) + operator(}) + ident(result) operator(=) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_FLIP3)operator(:) comment(/* like SED */) + operator({) + ident(VALUE) operator(*)ident(flip) operator(=) ident(rb_svar)operator(()ident(node)operator(->)ident(nd_cnt)operator(\);) + reserved(if) operator((!)ident(flip)operator(\)) ident(rb_bug)operator(()string<delimiter(")content(unexpected local variable)delimiter(")>operator(\);) + reserved(if) operator((!)ident(RTEST)operator((*)ident(flip)operator(\)\)) operator({) + ident(result) operator(=) ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_beg)operator(\)\)) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) + operator(*)ident(flip) operator(=) ident(result)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_end)operator(\)\)\)) operator({) + operator(*)ident(flip) operator(=) ident(Qfalse)operator(;) + operator(}) + ident(result) operator(=) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_RETURN)operator(:) + ident(return_jump)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_stts)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(NODE_ARGSCAT)operator(:) + operator({) + ident(VALUE) ident(args) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\);) + ident(result) operator(=) ident(rb_ary_concat)operator(()ident(args)operator(,) ident(splat_value)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_body)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_ARGSPUSH)operator(:) + operator({) + ident(VALUE) ident(args) operator(=) ident(rb_ary_dup)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\)\);) + ident(result) operator(=) ident(rb_ary_push)operator(()ident(args)operator(,) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_body)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_ATTRASGN)operator(:) + operator({) + ident(VALUE) ident(recv)operator(;) + pre_type(int) ident(argc)operator(;) ident(VALUE) operator(*)ident(argv)operator(;) comment(/* used in SETUP_ARGS */) + pre_type(int) ident(scope)operator(;) + ident(TMP_PROTECT)operator(;) + + ident(BEGIN_CALLARGS)operator(;) + reserved(if) operator(()ident(node)operator(->)ident(nd_recv) operator(==) operator(()ident(NODE) operator(*\))integer(1)operator(\)) operator({) + ident(recv) operator(=) ident(self)operator(;) + ident(scope) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(recv) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_recv)operator(\);) + ident(scope) operator(=) integer(0)operator(;) + operator(}) + ident(SETUP_ARGS)operator(()ident(node)operator(->)ident(nd_args)operator(\);) + ident(END_CALLARGS)operator(;) + + ident(ruby_current_node) operator(=) ident(node)operator(;) + ident(SET_CURRENT_SOURCE)operator((\);) + ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),)ident(recv)operator(,)ident(node)operator(->)ident(nd_mid)operator(,)ident(argc)operator(,)ident(argv)operator(,)ident(scope)operator(,)ident(self)operator(\);) + ident(result) operator(=) ident(argv)operator([)ident(argc)operator(-)integer(1)operator(];) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_CALL)operator(:) + operator({) + ident(VALUE) ident(recv)operator(;) + pre_type(int) ident(argc)operator(;) ident(VALUE) operator(*)ident(argv)operator(;) comment(/* used in SETUP_ARGS */) + ident(TMP_PROTECT)operator(;) + + ident(BEGIN_CALLARGS)operator(;) + ident(recv) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_recv)operator(\);) + ident(SETUP_ARGS)operator(()ident(node)operator(->)ident(nd_args)operator(\);) + ident(END_CALLARGS)operator(;) + + ident(ruby_current_node) operator(=) ident(node)operator(;) + ident(SET_CURRENT_SOURCE)operator((\);) + ident(result) operator(=) ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),)ident(recv)operator(,)ident(node)operator(->)ident(nd_mid)operator(,)ident(argc)operator(,)ident(argv)operator(,)integer(0)operator(,)ident(self)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_FCALL)operator(:) + operator({) + pre_type(int) ident(argc)operator(;) ident(VALUE) operator(*)ident(argv)operator(;) comment(/* used in SETUP_ARGS */) + ident(TMP_PROTECT)operator(;) + + ident(BEGIN_CALLARGS)operator(;) + ident(SETUP_ARGS)operator(()ident(node)operator(->)ident(nd_args)operator(\);) + ident(END_CALLARGS)operator(;) + + ident(ruby_current_node) operator(=) ident(node)operator(;) + ident(SET_CURRENT_SOURCE)operator((\);) + ident(result) operator(=) ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(self)operator(\),)ident(self)operator(,)ident(node)operator(->)ident(nd_mid)operator(,)ident(argc)operator(,)ident(argv)operator(,)integer(1)operator(,)ident(self)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_VCALL)operator(:) + ident(SET_CURRENT_SOURCE)operator((\);) + ident(result) operator(=) ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(self)operator(\),)ident(self)operator(,)ident(node)operator(->)ident(nd_mid)operator(,)integer(0)operator(,)integer(0)operator(,)integer(2)operator(,)ident(self)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_SUPER)operator(:) + reserved(case) label(NODE_ZSUPER)operator(:) + operator({) + pre_type(int) ident(argc)operator(;) ident(VALUE) operator(*)ident(argv)operator(;) comment(/* used in SETUP_ARGS */) + ident(TMP_PROTECT)operator(;) + + reserved(if) operator(()ident(ruby_frame)operator(->)ident(last_class) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\)) operator({) + ident(rb_name_error)operator(()ident(ruby_frame)operator(->)ident(last_func)operator(,) + string<delimiter(")content(superclass method `%s' disabled)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(ruby_frame)operator(->)ident(orig_func)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eNoMethodError)operator(,) string<delimiter(")content(super called outside of method)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_ZSUPER)operator(\)) operator({) + ident(argc) operator(=) ident(ruby_frame)operator(->)ident(argc)operator(;) + reserved(if) operator(()ident(argc) operator(&&) ident(DMETHOD_P)operator((\)\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(RBASIC)operator(()ident(ruby_scope)operator(\)->)ident(klass)operator(\)) operator(!=) ident(T_ARRAY) operator(||) + ident(RARRAY)operator(()ident(RBASIC)operator(()ident(ruby_scope)operator(\)->)ident(klass)operator(\)->)ident(len) operator(!=) ident(argc)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) + string<delimiter(")content(super: specify arguments explicitly)delimiter(")>operator(\);) + operator(}) + ident(argv) operator(=) ident(RARRAY)operator(()ident(RBASIC)operator(()ident(ruby_scope)operator(\)->)ident(klass)operator(\)->)ident(ptr)operator(;) + operator(}) + reserved(else) reserved(if) operator((!)ident(ruby_scope)operator(->)ident(local_vars)operator(\)) operator({) + ident(argc) operator(=) integer(0)operator(;) + ident(argv) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(argv) operator(=) ident(ruby_scope)operator(->)ident(local_vars) operator(+) integer(2)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(BEGIN_CALLARGS)operator(;) + ident(SETUP_ARGS)operator(()ident(node)operator(->)ident(nd_args)operator(\);) + ident(END_CALLARGS)operator(;) + ident(ruby_current_node) operator(=) ident(node)operator(;) + operator(}) + + ident(SET_CURRENT_SOURCE)operator((\);) + ident(result) operator(=) ident(rb_call_super)operator(()ident(argc)operator(,) ident(argv)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_SCOPE)operator(:) + operator({) + reserved(struct) ident(FRAME) ident(frame)operator(;) + ident(NODE) operator(*)ident(saved_cref) operator(=) integer(0)operator(;) + + ident(frame) operator(=) operator(*)ident(ruby_frame)operator(;) + ident(frame)operator(.)ident(tmp) operator(=) ident(ruby_frame)operator(;) + ident(ruby_frame) operator(=) operator(&)ident(frame)operator(;) + + ident(PUSH_SCOPE)operator((\);) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator(()ident(node)operator(->)ident(nd_rval)operator(\)) operator({) + ident(saved_cref) operator(=) ident(ruby_cref)operator(;) + ident(ruby_cref) operator(=) operator(()ident(NODE)operator(*\))ident(node)operator(->)ident(nd_rval)operator(;) + operator(}) + reserved(if) operator(()ident(node)operator(->)ident(nd_tbl)operator(\)) operator({) + ident(VALUE) operator(*)ident(vars) operator(=) ident(ALLOCA_N)operator(()ident(VALUE)operator(,) ident(node)operator(->)ident(nd_tbl)operator([)integer(0)operator(]+)integer(1)operator(\);) + operator(*)ident(vars)operator(++) operator(=) operator(()ident(VALUE)operator(\))ident(node)operator(;) + ident(ruby_scope)operator(->)ident(local_vars) operator(=) ident(vars)operator(;) + ident(rb_mem_clear)operator(()ident(ruby_scope)operator(->)ident(local_vars)operator(,) ident(node)operator(->)ident(nd_tbl)operator([)integer(0)operator(]\);) + ident(ruby_scope)operator(->)ident(local_tbl) operator(=) ident(node)operator(->)ident(nd_tbl)operator(;) + operator(}) + reserved(else) operator({) + ident(ruby_scope)operator(->)ident(local_vars) operator(=) integer(0)operator(;) + ident(ruby_scope)operator(->)ident(local_tbl) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_next)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + ident(POP_SCOPE)operator((\);) + ident(ruby_frame) operator(=) ident(frame)operator(.)ident(tmp)operator(;) + reserved(if) operator(()ident(saved_cref)operator(\)) + ident(ruby_cref) operator(=) ident(saved_cref)operator(;) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_OP_ASGN1)operator(:) + operator({) + pre_type(int) ident(argc)operator(;) ident(VALUE) operator(*)ident(argv)operator(;) comment(/* used in SETUP_ARGS */) + ident(VALUE) ident(recv)operator(,) ident(val)operator(,) ident(tmp)operator(;) + ident(NODE) operator(*)ident(rval)operator(;) + ident(TMP_PROTECT)operator(;) + + ident(recv) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_recv)operator(\);) + ident(rval) operator(=) ident(node)operator(->)ident(nd_args)operator(->)ident(nd_head)operator(;) + ident(SETUP_ARGS0)operator(()ident(node)operator(->)ident(nd_args)operator(->)ident(nd_body)operator(,) integer(1)operator(\);) + ident(val) operator(=) ident(rb_funcall3)operator(()ident(recv)operator(,) ident(aref)operator(,) ident(argc)operator(,) ident(argv)operator(\);) + reserved(switch) operator(()ident(node)operator(->)ident(nd_mid)operator(\)) operator({) + reserved(case) integer(0)operator(:) comment(/* OR */) + reserved(if) operator(()ident(RTEST)operator(()ident(val)operator(\)\)) ident(RETURN)operator(()ident(val)operator(\);) + ident(val) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(rval)operator(\);) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) comment(/* AND */) + reserved(if) operator((!)ident(RTEST)operator(()ident(val)operator(\)\)) ident(RETURN)operator(()ident(val)operator(\);) + ident(val) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(rval)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(tmp) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(rval)operator(\);) + ident(val) operator(=) ident(rb_funcall3)operator(()ident(val)operator(,) ident(node)operator(->)ident(nd_mid)operator(,) integer(1)operator(,) operator(&)ident(tmp)operator(\);) + operator(}) + ident(argv)operator([)ident(argc)operator(]) operator(=) ident(val)operator(;) + ident(rb_funcall2)operator(()ident(recv)operator(,) ident(aset)operator(,) ident(argc)operator(+)integer(1)operator(,) ident(argv)operator(\);) + ident(result) operator(=) ident(val)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_OP_ASGN2)operator(:) + operator({) + ident(ID) ident(id) operator(=) ident(node)operator(->)ident(nd_next)operator(->)ident(nd_vid)operator(;) + ident(VALUE) ident(recv)operator(,) ident(val)operator(,) ident(tmp)operator(;) + + ident(recv) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_recv)operator(\);) + ident(val) operator(=) ident(rb_funcall3)operator(()ident(recv)operator(,) ident(id)operator(,) integer(0)operator(,) integer(0)operator(\);) + reserved(switch) operator(()ident(node)operator(->)ident(nd_next)operator(->)ident(nd_mid)operator(\)) operator({) + reserved(case) integer(0)operator(:) comment(/* OR */) + reserved(if) operator(()ident(RTEST)operator(()ident(val)operator(\)\)) ident(RETURN)operator(()ident(val)operator(\);) + ident(val) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) comment(/* AND */) + reserved(if) operator((!)ident(RTEST)operator(()ident(val)operator(\)\)) ident(RETURN)operator(()ident(val)operator(\);) + ident(val) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(tmp) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + ident(val) operator(=) ident(rb_funcall3)operator(()ident(val)operator(,) ident(node)operator(->)ident(nd_next)operator(->)ident(nd_mid)operator(,) integer(1)operator(,) operator(&)ident(tmp)operator(\);) + operator(}) + + ident(rb_funcall2)operator(()ident(recv)operator(,) ident(node)operator(->)ident(nd_next)operator(->)ident(nd_aid)operator(,) integer(1)operator(,) operator(&)ident(val)operator(\);) + ident(result) operator(=) ident(val)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_OP_ASGN_AND)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\);) + reserved(if) operator((!)ident(RTEST)operator(()ident(result)operator(\)\)) reserved(break)operator(;) + ident(node) operator(=) ident(node)operator(->)ident(nd_value)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_OP_ASGN_OR)operator(:) + reserved(if) operator((()ident(node)operator(->)ident(nd_aid) operator(&&) operator(!)ident(is_defined)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(,) integer(0)operator(\)\)) operator(||) + operator(!)ident(RTEST)operator(()ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\)\)\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_value)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_MASGN)operator(:) + ident(result) operator(=) ident(massign)operator(()ident(self)operator(,) ident(node)operator(,) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\),) integer(0)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_LASGN)operator(:) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(local_vars) operator(==) integer(0)operator(\)) + ident(rb_bug)operator(()string<delimiter(")content(unexpected local variable assignment)delimiter(")>operator(\);) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + ident(ruby_scope)operator(->)ident(local_vars)operator([)ident(node)operator(->)ident(nd_cnt)operator(]) operator(=) ident(result)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_DASGN)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + ident(dvar_asgn)operator(()ident(node)operator(->)ident(nd_vid)operator(,) ident(result)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_DASGN_CURR)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + ident(dvar_asgn_curr)operator(()ident(node)operator(->)ident(nd_vid)operator(,) ident(result)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_GASGN)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + ident(rb_gvar_set)operator(()ident(node)operator(->)ident(nd_entry)operator(,) ident(result)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_IASGN)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + ident(rb_ivar_set)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_vid)operator(,) ident(result)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_CDECL)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + reserved(if) operator(()ident(node)operator(->)ident(nd_vid) operator(==) integer(0)operator(\)) operator({) + ident(rb_const_set)operator(()ident(class_prefix)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_else)operator(\),) ident(node)operator(->)ident(nd_else)operator(->)ident(nd_mid)operator(,) ident(result)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_const_set)operator(()ident(ruby_cbase)operator(,) ident(node)operator(->)ident(nd_vid)operator(,) ident(result)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_CVDECL)operator(:) + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_cbase)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no class/module to define class variable)delimiter(")>operator(\);) + operator(}) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + ident(rb_cvar_set)operator(()ident(cvar_cbase)operator((\),) ident(node)operator(->)ident(nd_vid)operator(,) ident(result)operator(,) ident(Qtrue)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_CVASGN)operator(:) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_value)operator(\);) + ident(rb_cvar_set)operator(()ident(cvar_cbase)operator((\),) ident(node)operator(->)ident(nd_vid)operator(,) ident(result)operator(,) ident(Qfalse)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_LVAR)operator(:) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(local_vars) operator(==) integer(0)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(unexpected local variable)delimiter(")>operator(\);) + operator(}) + ident(result) operator(=) ident(ruby_scope)operator(->)ident(local_vars)operator([)ident(node)operator(->)ident(nd_cnt)operator(];) + reserved(break)operator(;) + + reserved(case) label(NODE_DVAR)operator(:) + ident(result) operator(=) ident(rb_dvar_ref)operator(()ident(node)operator(->)ident(nd_vid)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_GVAR)operator(:) + ident(result) operator(=) ident(rb_gvar_get)operator(()ident(node)operator(->)ident(nd_entry)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_IVAR)operator(:) + ident(result) operator(=) ident(rb_ivar_get)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_vid)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_CONST)operator(:) + ident(result) operator(=) ident(ev_const_get)operator(()ident(ruby_cref)operator(,) ident(node)operator(->)ident(nd_vid)operator(,) ident(self)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_CVAR)operator(:) + ident(result) operator(=) ident(rb_cvar_get)operator(()ident(cvar_cbase)operator((\),) ident(node)operator(->)ident(nd_vid)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_BLOCK_ARG)operator(:) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(local_vars) operator(==) integer(0)operator(\)) + ident(rb_bug)operator(()string<delimiter(")content(unexpected block argument)delimiter(")>operator(\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(result) operator(=) ident(rb_block_proc)operator((\);) + ident(ruby_scope)operator(->)ident(local_vars)operator([)ident(node)operator(->)ident(nd_cnt)operator(]) operator(=) ident(result)operator(;) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_COLON2)operator(:) + operator({) + ident(VALUE) ident(klass)operator(;) + + ident(klass) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\);) + reserved(if) operator(()ident(rb_is_const_id)operator(()ident(node)operator(->)ident(nd_mid)operator(\)\)) operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(klass)operator(\)\)) operator({) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + ident(result) operator(=) ident(rb_const_get_from)operator(()ident(klass)operator(,) ident(node)operator(->)ident(nd_mid)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s is not a class/module)delimiter(")>operator(,) + ident(RSTRING)operator(()ident(rb_obj_as_string)operator(()ident(klass)operator(\)\)->)ident(ptr)operator(\);) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(rb_funcall)operator(()ident(klass)operator(,) ident(node)operator(->)ident(nd_mid)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_COLON3)operator(:) + ident(result) operator(=) ident(rb_const_get_from)operator(()ident(rb_cObject)operator(,) ident(node)operator(->)ident(nd_mid)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_NTH_REF)operator(:) + ident(result) operator(=) ident(rb_reg_nth_match)operator(()ident(node)operator(->)ident(nd_nth)operator(,) ident(MATCH_DATA)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_BACK_REF)operator(:) + reserved(switch) operator(()ident(node)operator(->)ident(nd_nth)operator(\)) operator({) + reserved(case) char('&')operator(:) + ident(result) operator(=) ident(rb_reg_last_match)operator(()ident(MATCH_DATA)operator(\);) + reserved(break)operator(;) + reserved(case) char('`')operator(:) + ident(result) operator(=) ident(rb_reg_match_pre)operator(()ident(MATCH_DATA)operator(\);) + reserved(break)operator(;) + reserved(case) char('\\'')operator(:) + ident(result) operator(=) ident(rb_reg_match_post)operator(()ident(MATCH_DATA)operator(\);) + reserved(break)operator(;) + reserved(case) char('+')operator(:) + ident(result) operator(=) ident(rb_reg_match_last)operator(()ident(MATCH_DATA)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(unexpected back-ref)delimiter(")>operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_HASH)operator(:) + operator({) + ident(NODE) operator(*)ident(list)operator(;) + ident(VALUE) ident(hash) operator(=) ident(rb_hash_new)operator((\);) + ident(VALUE) ident(key)operator(,) ident(val)operator(;) + + ident(list) operator(=) ident(node)operator(->)ident(nd_head)operator(;) + reserved(while) operator(()ident(list)operator(\)) operator({) + ident(key) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(list)operator(->)ident(nd_head)operator(\);) + ident(list) operator(=) ident(list)operator(->)ident(nd_next)operator(;) + reserved(if) operator(()ident(list) operator(==) integer(0)operator(\)) + ident(rb_bug)operator(()string<delimiter(")content(odd number list for Hash)delimiter(")>operator(\);) + ident(val) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(list)operator(->)ident(nd_head)operator(\);) + ident(list) operator(=) ident(list)operator(->)ident(nd_next)operator(;) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(key)operator(,) ident(val)operator(\);) + operator(}) + ident(result) operator(=) ident(hash)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_ZARRAY)operator(:) comment(/* zero length list */) + ident(result) operator(=) ident(rb_ary_new)operator((\);) + reserved(break)operator(;) + + reserved(case) label(NODE_ARRAY)operator(:) + operator({) + ident(VALUE) ident(ary)operator(;) + pre_type(long) ident(i)operator(;) + + ident(i) operator(=) ident(node)operator(->)ident(nd_alen)operator(;) + ident(ary) operator(=) ident(rb_ary_new2)operator(()ident(i)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(node)operator(;)ident(node)operator(=)ident(node)operator(->)ident(nd_next)operator(\)) operator({) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(++]) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(\);) + ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(=) ident(i)operator(;) + operator(}) + + ident(result) operator(=) ident(ary)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_STR)operator(:) + ident(result) operator(=) ident(rb_str_new3)operator(()ident(node)operator(->)ident(nd_lit)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_EVSTR)operator(:) + ident(result) operator(=) ident(rb_obj_as_string)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_body)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(NODE_DSTR)operator(:) + reserved(case) label(NODE_DXSTR)operator(:) + reserved(case) label(NODE_DREGX)operator(:) + reserved(case) label(NODE_DREGX_ONCE)operator(:) + reserved(case) label(NODE_DSYM)operator(:) + operator({) + ident(VALUE) ident(str)operator(,) ident(str2)operator(;) + ident(NODE) operator(*)ident(list) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + + ident(str) operator(=) ident(rb_str_new3)operator(()ident(node)operator(->)ident(nd_lit)operator(\);) + reserved(while) operator(()ident(list)operator(\)) operator({) + reserved(if) operator(()ident(list)operator(->)ident(nd_head)operator(\)) operator({) + reserved(switch) operator(()ident(nd_type)operator(()ident(list)operator(->)ident(nd_head)operator(\)\)) operator({) + reserved(case) label(NODE_STR)operator(:) + ident(str2) operator(=) ident(list)operator(->)ident(nd_head)operator(->)ident(nd_lit)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(str2) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(list)operator(->)ident(nd_head)operator(\);) + reserved(break)operator(;) + operator(}) + ident(rb_str_append)operator(()ident(str)operator(,) ident(str2)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(str2)operator(\);) + operator(}) + ident(list) operator(=) ident(list)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_DREGX)operator(:) + ident(result) operator(=) ident(rb_reg_new)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) + ident(node)operator(->)ident(nd_cflag)operator(\);) + reserved(break)operator(;) + reserved(case) label(NODE_DREGX_ONCE)operator(:) comment(/* regexp expand once */) + ident(result) operator(=) ident(rb_reg_new)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) + ident(node)operator(->)ident(nd_cflag)operator(\);) + ident(nd_set_type)operator(()ident(node)operator(,) ident(NODE_LIT)operator(\);) + ident(node)operator(->)ident(nd_lit) operator(=) ident(result)operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_LIT)operator(:) + comment(/* other thread may replace NODE_DREGX_ONCE to NODE_LIT */) + reserved(goto) ident(again)operator(;) + reserved(case) label(NODE_DXSTR)operator(:) + ident(result) operator(=) ident(rb_funcall)operator(()ident(self)operator(,) char('`')operator(,) integer(1)operator(,) ident(str)operator(\);) + reserved(break)operator(;) + reserved(case) label(NODE_DSYM)operator(:) + ident(result) operator(=) ident(rb_str_intern)operator(()ident(str)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(result) operator(=) ident(str)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_XSTR)operator(:) + ident(result) operator(=) ident(rb_funcall)operator(()ident(self)operator(,) char('`')operator(,) integer(1)operator(,) ident(rb_str_new3)operator(()ident(node)operator(->)ident(nd_lit)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(NODE_LIT)operator(:) + ident(result) operator(=) ident(node)operator(->)ident(nd_lit)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_DEFN)operator(:) + reserved(if) operator(()ident(node)operator(->)ident(nd_defn)operator(\)) operator({) + ident(NODE) operator(*)ident(body)operator(,) operator(*)ident(defn)operator(;) + ident(VALUE) ident(origin)operator(;) + pre_type(int) ident(noex)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_class)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no class/module to add method)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(ruby_class) operator(==) ident(rb_cObject) operator(&&) ident(node)operator(->)ident(nd_mid) operator(==) ident(init)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(redefining Object#initialize may cause infinite loop)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(node)operator(->)ident(nd_mid) operator(==) ident(__id__) operator(||) ident(node)operator(->)ident(nd_mid) operator(==) ident(__send__)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(redefining `%s' may cause serious problem)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(node)operator(->)ident(nd_mid)operator(\)\);) + operator(}) + ident(rb_frozen_class_p)operator(()ident(ruby_class)operator(\);) + ident(body) operator(=) ident(search_method)operator(()ident(ruby_class)operator(,) ident(node)operator(->)ident(nd_mid)operator(,) operator(&)ident(origin)operator(\);) + reserved(if) operator(()ident(body)operator(\){) + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)) operator(&&) ident(ruby_class) operator(==) ident(origin) operator(&&) ident(body)operator(->)ident(nd_cnt) operator(==) integer(0) operator(&&) ident(body)operator(->)ident(nd_body)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(method redefined; discarding old %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(node)operator(->)ident(nd_mid)operator(\)\);) + operator(}) + operator(}) + + reserved(if) operator(()ident(SCOPE_TEST)operator(()ident(SCOPE_PRIVATE)operator(\)) operator(||) ident(node)operator(->)ident(nd_mid) operator(==) ident(init)operator(\)) operator({) + ident(noex) operator(=) ident(NOEX_PRIVATE)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(SCOPE_TEST)operator(()ident(SCOPE_PROTECTED)operator(\)\)) operator({) + ident(noex) operator(=) ident(NOEX_PROTECTED)operator(;) + operator(}) + reserved(else) operator({) + ident(noex) operator(=) ident(NOEX_PUBLIC)operator(;) + operator(}) + reserved(if) operator(()ident(body) operator(&&) ident(origin) operator(==) ident(ruby_class) operator(&&) ident(body)operator(->)ident(nd_body) operator(==) integer(0)operator(\)) operator({) + ident(noex) operator(|=) ident(NOEX_NOSUPER)operator(;) + operator(}) + + ident(defn) operator(=) ident(rb_copy_node_scope)operator(()ident(node)operator(->)ident(nd_defn)operator(,) ident(ruby_cref)operator(\);) + ident(rb_add_method)operator(()ident(ruby_class)operator(,) ident(node)operator(->)ident(nd_mid)operator(,) ident(defn)operator(,) ident(noex)operator(\);) + reserved(if) operator(()ident(scope_vmode) operator(==) ident(SCOPE_MODFUNC)operator(\)) operator({) + ident(rb_add_method)operator(()ident(rb_singleton_class)operator(()ident(ruby_class)operator(\),) + ident(node)operator(->)ident(nd_mid)operator(,) ident(defn)operator(,) ident(NOEX_PUBLIC)operator(\);) + operator(}) + ident(result) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_DEFS)operator(:) + reserved(if) operator(()ident(node)operator(->)ident(nd_defn)operator(\)) operator({) + ident(VALUE) ident(recv) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_recv)operator(\);) + ident(VALUE) ident(klass)operator(;) + ident(NODE) operator(*)ident(body) operator(=) integer(0)operator(,) operator(*)ident(defn)operator(;) + + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(recv)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't define singleton method)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(recv)operator(\)) operator(||) ident(SYMBOL_P)operator(()ident(recv)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) + string<delimiter(")content(can't define singleton method )char(\\")content(%s)char(\\")content( for %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(node)operator(->)ident(nd_mid)operator(\),) + ident(rb_obj_classname)operator(()ident(recv)operator(\)\);) + operator(}) + + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(recv)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(object)delimiter(")>operator(\);) + ident(klass) operator(=) ident(rb_singleton_class)operator(()ident(recv)operator(\);) + reserved(if) operator(()ident(st_lookup)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(,) ident(node)operator(->)ident(nd_mid)operator(,) operator(&)ident(data)operator(\)\)) operator({) + ident(body) operator(=) operator(()ident(NODE) operator(*\))ident(data)operator(;) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(redefining method prohibited)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(redefine %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(node)operator(->)ident(nd_mid)operator(\)\);) + operator(}) + operator(}) + ident(defn) operator(=) ident(rb_copy_node_scope)operator(()ident(node)operator(->)ident(nd_defn)operator(,) ident(ruby_cref)operator(\);) + ident(rb_add_method)operator(()ident(klass)operator(,) ident(node)operator(->)ident(nd_mid)operator(,) ident(defn)operator(,) + ident(NOEX_PUBLIC)operator(|()ident(body)operator(?)ident(body)operator(->)ident(nd_noex)operator(&)label(NOEX_UNDEF)operator(:)integer(0)operator(\)\);) + ident(result) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_UNDEF)operator(:) + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_class)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no class to undef method)delimiter(")>operator(\);) + operator(}) + ident(rb_undef)operator(()ident(ruby_class)operator(,) ident(rb_to_id)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(u2)operator(.)ident(node)operator(\)\)\);) + ident(result) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_ALIAS)operator(:) + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_class)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no class to make alias)delimiter(")>operator(\);) + operator(}) + ident(rb_alias)operator(()ident(ruby_class)operator(,) ident(rb_to_id)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(u1)operator(.)ident(node)operator(\)\),) + ident(rb_to_id)operator(()ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(u2)operator(.)ident(node)operator(\)\)\);) + ident(result) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_VALIAS)operator(:) + ident(rb_alias_variable)operator(()ident(node)operator(->)ident(u1)operator(.)ident(id)operator(,) ident(node)operator(->)ident(u2)operator(.)ident(id)operator(\);) + ident(result) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_CLASS)operator(:) + operator({) + ident(VALUE) ident(super)operator(,) ident(klass)operator(,) ident(tmp)operator(,) ident(cbase)operator(;) + ident(ID) ident(cname)operator(;) + pre_type(int) ident(gen) operator(=) ident(Qfalse)operator(;) + + ident(cbase) operator(=) ident(class_prefix)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_cpath)operator(\);) + ident(cname) operator(=) ident(node)operator(->)ident(nd_cpath)operator(->)ident(nd_mid)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_cbase)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no outer class/module)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(node)operator(->)ident(nd_super)operator(\)) operator({) + ident(super) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_super)operator(\);) + ident(rb_check_inheritable)operator(()ident(super)operator(\);) + operator(}) + reserved(else) operator({) + ident(super) operator(=) integer(0)operator(;) + operator(}) + + reserved(if) operator(()ident(rb_const_defined_at)operator(()ident(cbase)operator(,) ident(cname)operator(\)\)) operator({) + ident(klass) operator(=) ident(rb_const_get_at)operator(()ident(cbase)operator(,) ident(cname)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(!=) ident(T_CLASS)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s is not a class)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(cname)operator(\)\);) + operator(}) + reserved(if) operator(()ident(super)operator(\)) operator({) + ident(tmp) operator(=) ident(rb_class_real)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(\);) + reserved(if) operator(()ident(tmp) operator(!=) ident(super)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(superclass mismatch for class %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(cname)operator(\)\);) + operator(}) + ident(super) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(extending class prohibited)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator((!)ident(super)operator(\)) ident(super) operator(=) ident(rb_cObject)operator(;) + ident(klass) operator(=) ident(rb_define_class_id)operator(()ident(cname)operator(,) ident(super)operator(\);) + ident(rb_set_class_path)operator(()ident(klass)operator(,) ident(cbase)operator(,) ident(rb_id2name)operator(()ident(cname)operator(\)\);) + ident(rb_const_set)operator(()ident(cbase)operator(,) ident(cname)operator(,) ident(klass)operator(\);) + ident(gen) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(if) operator(()ident(ruby_wrapper)operator(\)) operator({) + ident(rb_extend_object)operator(()ident(klass)operator(,) ident(ruby_wrapper)operator(\);) + ident(rb_include_module)operator(()ident(klass)operator(,) ident(ruby_wrapper)operator(\);) + operator(}) + reserved(if) operator(()ident(super) operator(&&) ident(gen)operator(\)) operator({) + ident(rb_class_inherited)operator(()ident(super)operator(,) ident(klass)operator(\);) + operator(}) + ident(result) operator(=) ident(module_setup)operator(()ident(klass)operator(,) ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_MODULE)operator(:) + operator({) + ident(VALUE) ident(module)operator(,) ident(cbase)operator(;) + ident(ID) ident(cname)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_cbase)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no outer class/module)delimiter(")>operator(\);) + operator(}) + ident(cbase) operator(=) ident(class_prefix)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_cpath)operator(\);) + ident(cname) operator(=) ident(node)operator(->)ident(nd_cpath)operator(->)ident(nd_mid)operator(;) + reserved(if) operator(()ident(rb_const_defined_at)operator(()ident(cbase)operator(,) ident(cname)operator(\)\)) operator({) + ident(module) operator(=) ident(rb_const_get_at)operator(()ident(cbase)operator(,) ident(cname)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(module)operator(\)) operator(!=) ident(T_MODULE)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s is not a module)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(cname)operator(\)\);) + operator(}) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(extending module prohibited)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(module) operator(=) ident(rb_define_module_id)operator(()ident(cname)operator(\);) + ident(rb_set_class_path)operator(()ident(module)operator(,) ident(cbase)operator(,) ident(rb_id2name)operator(()ident(cname)operator(\)\);) + ident(rb_const_set)operator(()ident(cbase)operator(,) ident(cname)operator(,) ident(module)operator(\);) + operator(}) + reserved(if) operator(()ident(ruby_wrapper)operator(\)) operator({) + ident(rb_extend_object)operator(()ident(module)operator(,) ident(ruby_wrapper)operator(\);) + ident(rb_include_module)operator(()ident(module)operator(,) ident(ruby_wrapper)operator(\);) + operator(}) + + ident(result) operator(=) ident(module_setup)operator(()ident(module)operator(,) ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_SCLASS)operator(:) + operator({) + ident(VALUE) ident(klass)operator(;) + + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_recv)operator(\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(result)operator(\)) operator(||) ident(SYMBOL_P)operator(()ident(result)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no virtual class for %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(result)operator(\)\);) + operator(}) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(result)operator(\)\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't extend object)delimiter(")>operator(\);) + ident(klass) operator(=) ident(rb_singleton_class)operator(()ident(result)operator(\);) + + reserved(if) operator(()ident(ruby_wrapper)operator(\)) operator({) + ident(rb_extend_object)operator(()ident(klass)operator(,) ident(ruby_wrapper)operator(\);) + ident(rb_include_module)operator(()ident(klass)operator(,) ident(ruby_wrapper)operator(\);) + operator(}) + + ident(result) operator(=) ident(module_setup)operator(()ident(klass)operator(,) ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_DEFINED)operator(:) + operator({) + pre_type(char) ident(buf)operator([)integer(20)operator(];) + pre_type(char) operator(*)ident(desc) operator(=) ident(is_defined)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_head)operator(,) ident(buf)operator(\);) + + reserved(if) operator(()ident(desc)operator(\)) ident(result) operator(=) ident(rb_str_new2)operator(()ident(desc)operator(\);) + reserved(else) ident(result) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_NEWLINE)operator(:) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_LINE)operator(,) ident(node)operator(,) ident(self)operator(,) + ident(ruby_frame)operator(->)ident(last_func)operator(,) + ident(ruby_frame)operator(->)ident(last_class)operator(\);) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(default)operator(:) + ident(unknown_node)operator(()ident(node)operator(\);) + operator(}) + label(finish)operator(:) + ident(CHECK_INTS)operator(;) + reserved(if) operator(()ident(contnode)operator(\)) operator({) + ident(node) operator(=) ident(contnode)operator(;) + ident(contnode) operator(=) integer(0)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(module_setup)operator(()ident(module)operator(,) ident(n)operator(\)) + ident(VALUE) ident(module)operator(;) + ident(NODE) operator(*)ident(n)operator(;) +operator({) + ident(NODE) operator(*) directive(volatile) ident(node) operator(=) ident(n)operator(->)ident(nd_body)operator(;) + pre_type(int) ident(state)operator(;) + reserved(struct) ident(FRAME) ident(frame)operator(;) + ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) comment(/* OK */) + ident(TMP_PROTECT)operator(;) + + ident(frame) operator(=) operator(*)ident(ruby_frame)operator(;) + ident(frame)operator(.)ident(tmp) operator(=) ident(ruby_frame)operator(;) + ident(ruby_frame) operator(=) operator(&)ident(frame)operator(;) + + ident(PUSH_CLASS)operator(()ident(module)operator(\);) + ident(PUSH_SCOPE)operator((\);) + ident(PUSH_VARS)operator((\);) + + reserved(if) operator(()ident(node)operator(->)ident(nd_tbl)operator(\)) operator({) + ident(VALUE) operator(*)ident(vars) operator(=) ident(TMP_ALLOC)operator(()ident(node)operator(->)ident(nd_tbl)operator([)integer(0)operator(]+)integer(1)operator(\);) + operator(*)ident(vars)operator(++) operator(=) operator(()ident(VALUE)operator(\))ident(node)operator(;) + ident(ruby_scope)operator(->)ident(local_vars) operator(=) ident(vars)operator(;) + ident(rb_mem_clear)operator(()ident(ruby_scope)operator(->)ident(local_vars)operator(,) ident(node)operator(->)ident(nd_tbl)operator([)integer(0)operator(]\);) + ident(ruby_scope)operator(->)ident(local_tbl) operator(=) ident(node)operator(->)ident(nd_tbl)operator(;) + operator(}) + reserved(else) operator({) + ident(ruby_scope)operator(->)ident(local_vars) operator(=) integer(0)operator(;) + ident(ruby_scope)operator(->)ident(local_tbl) operator(=) integer(0)operator(;) + operator(}) + + ident(PUSH_CREF)operator(()ident(module)operator(\);) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_CLASS)operator(,) ident(n)operator(,) ident(ruby_cbase)operator(,) + ident(ruby_frame)operator(->)ident(last_func)operator(,) ident(ruby_frame)operator(->)ident(last_class)operator(\);) + ident(result) operator(=) ident(rb_eval)operator(()ident(ruby_cbase)operator(,) ident(node)operator(->)ident(nd_next)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + ident(POP_CREF)operator((\);) + ident(POP_VARS)operator((\);) + ident(POP_SCOPE)operator((\);) + ident(POP_CLASS)operator((\);) + + ident(ruby_frame) operator(=) ident(frame)operator(.)ident(tmp)operator(;) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_END)operator(,) ident(n)operator(,) integer(0)operator(,) + ident(ruby_frame)operator(->)ident(last_func)operator(,) ident(ruby_frame)operator(->)ident(last_class)operator(\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(NODE) operator(*)ident(basic_respond_to) operator(=) integer(0)operator(;) + +pre_type(int) +ident(rb_obj_respond_to)operator(()ident(obj)operator(,) ident(id)operator(,) ident(priv)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(priv)operator(;) +operator({) + ident(VALUE) ident(klass) operator(=) ident(CLASS_OF)operator(()ident(obj)operator(\);) + + reserved(if) operator(()ident(rb_method_node)operator(()ident(klass)operator(,) ident(respond_to)operator(\)) operator(==) ident(basic_respond_to)operator(\)) operator({) + reserved(return) ident(rb_method_boundp)operator(()ident(klass)operator(,) ident(id)operator(,) operator(!)ident(priv)operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(args)operator([)integer(2)operator(];) + pre_type(int) ident(n) operator(=) integer(0)operator(;) + ident(args)operator([)ident(n)operator(++]) operator(=) ident(ID2SYM)operator(()ident(id)operator(\);) + reserved(if) operator(()ident(priv)operator(\)) ident(args)operator([)ident(n)operator(++]) operator(=) ident(Qtrue)operator(;) + reserved(return) ident(RTEST)operator(()ident(rb_funcall2)operator(()ident(obj)operator(,) ident(respond_to)operator(,) ident(n)operator(,) ident(args)operator(\)\);) + operator(}) +operator(}) + +pre_type(int) +ident(rb_respond_to)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(rb_obj_respond_to)operator(()ident(obj)operator(,) ident(id)operator(,) ident(Qfalse)operator(\);) +operator(}) + +comment(/* + * call-seq: + * obj.respond_to?(symbol, include_private=false\) => true or false + * + * Returns +true+> if _obj_ responds to the given + * method. Private methods are included in the search only if the + * optional second parameter evaluates to +true+. + */) + +directive(static) ident(VALUE) +ident(obj_respond_to)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(mid)operator(,) ident(priv)operator(;) + ident(ID) ident(id)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(mid)operator(,) operator(&)ident(priv)operator(\);) + ident(id) operator(=) ident(rb_to_id)operator(()ident(mid)operator(\);) + reserved(if) operator(()ident(rb_method_boundp)operator(()ident(CLASS_OF)operator(()ident(obj)operator(\),) ident(id)operator(,) operator(!)ident(RTEST)operator(()ident(priv)operator(\)\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.method_defined?(symbol\) => true or false + * + * Returns +true+ if the named method is defined by + * _mod_ (or its included modules and, if _mod_ is a class, + * its ancestors\). Public and protected methods are matched. + * + * module A + * def method1(\) end + * end + * class B + * def method2(\) end + * end + * class C < B + * include A + * def method3(\) end + * end + * + * A.method_defined? :method1 #=> true + * C.method_defined? "method1" #=> true + * C.method_defined? "method2" #=> true + * C.method_defined? "method3" #=> true + * C.method_defined? "method4" #=> false + */) + +directive(static) ident(VALUE) +ident(rb_mod_method_defined)operator(()ident(mod)operator(,) ident(mid)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(mid)operator(;) +operator({) + reserved(return) ident(rb_method_boundp)operator(()ident(mod)operator(,) ident(rb_to_id)operator(()ident(mid)operator(\),) integer(1)operator(\);) +operator(}) + +preprocessor(#define) ident(VISI_CHECK)operator(()ident(x)operator(,)ident(f)operator(\)) operator(((()ident(x)operator(\)&)ident(NOEX_MASK)operator(\)) operator(==) operator(()ident(f)operator(\)\)) + +comment(/* + * call-seq: + * mod.public_method_defined?(symbol\) => true or false + * + * Returns +true+ if the named public method is defined by + * _mod_ (or its included modules and, if _mod_ is a class, + * its ancestors\). + * + * module A + * def method1(\) end + * end + * class B + * protected + * def method2(\) end + * end + * class C < B + * include A + * def method3(\) end + * end + * + * A.method_defined? :method1 #=> true + * C.public_method_defined? "method1" #=> true + * C.public_method_defined? "method2" #=> false + * C.method_defined? "method2" #=> true + */) + +directive(static) ident(VALUE) +ident(rb_mod_public_method_defined)operator(()ident(mod)operator(,) ident(mid)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(mid)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(mid)operator(\);) + pre_type(int) ident(noex)operator(;) + + reserved(if) operator(()ident(rb_get_method_body)operator((&)ident(mod)operator(,) operator(&)ident(id)operator(,) operator(&)ident(noex)operator(\)\)) operator({) + reserved(if) operator(()ident(VISI_CHECK)operator(()ident(noex)operator(,) ident(NOEX_PUBLIC)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.private_method_defined?(symbol\) => true or false + * + * Returns +true+ if the named private method is defined by + * _ mod_ (or its included modules and, if _mod_ is a class, + * its ancestors\). + * + * module A + * def method1(\) end + * end + * class B + * private + * def method2(\) end + * end + * class C < B + * include A + * def method3(\) end + * end + * + * A.method_defined? :method1 #=> true + * C.private_method_defined? "method1" #=> false + * C.private_method_defined? "method2" #=> true + * C.method_defined? "method2" #=> false + */) + +directive(static) ident(VALUE) +ident(rb_mod_private_method_defined)operator(()ident(mod)operator(,) ident(mid)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(mid)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(mid)operator(\);) + pre_type(int) ident(noex)operator(;) + + reserved(if) operator(()ident(rb_get_method_body)operator((&)ident(mod)operator(,) operator(&)ident(id)operator(,) operator(&)ident(noex)operator(\)\)) operator({) + reserved(if) operator(()ident(VISI_CHECK)operator(()ident(noex)operator(,) ident(NOEX_PRIVATE)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.protected_method_defined?(symbol\) => true or false + * + * Returns +true+ if the named protected method is defined + * by _mod_ (or its included modules and, if _mod_ is a + * class, its ancestors\). + * + * module A + * def method1(\) end + * end + * class B + * protected + * def method2(\) end + * end + * class C < B + * include A + * def method3(\) end + * end + * + * A.method_defined? :method1 #=> true + * C.protected_method_defined? "method1" #=> false + * C.protected_method_defined? "method2" #=> true + * C.method_defined? "method2" #=> true + */) + +directive(static) ident(VALUE) +ident(rb_mod_protected_method_defined)operator(()ident(mod)operator(,) ident(mid)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(mid)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(mid)operator(\);) + pre_type(int) ident(noex)operator(;) + + reserved(if) operator(()ident(rb_get_method_body)operator((&)ident(mod)operator(,) operator(&)ident(id)operator(,) operator(&)ident(noex)operator(\)\)) operator({) + reserved(if) operator(()ident(VISI_CHECK)operator(()ident(noex)operator(,) ident(NOEX_PROTECTED)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +ident(NORETURN)operator(()directive(static) ident(VALUE) ident(terminate_process) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(\)\)\);) +directive(static) ident(VALUE) +ident(terminate_process)operator(()ident(status)operator(,) ident(mesg)operator(\)) + pre_type(int) ident(status)operator(;) + ident(VALUE) ident(mesg)operator(;) +operator({) + ident(VALUE) ident(args)operator([)integer(2)operator(];) + ident(args)operator([)integer(0)operator(]) operator(=) ident(INT2NUM)operator(()ident(status)operator(\);) + ident(args)operator([)integer(1)operator(]) operator(=) ident(mesg)operator(;) + + ident(rb_exc_raise)operator(()ident(rb_class_new_instance)operator(()integer(2)operator(,) ident(args)operator(,) ident(rb_eSystemExit)operator(\)\);) +operator(}) + +directive(void) +ident(rb_exit)operator(()ident(status)operator(\)) + pre_type(int) ident(status)operator(;) +operator({) + reserved(if) operator(()ident(prot_tag)operator(\)) operator({) + ident(terminate_process)operator(()ident(status)operator(,) ident(rb_str_new)operator(()string<delimiter(")content(exit)delimiter(")>operator(,) integer(4)operator(\)\);) + operator(}) + ident(ruby_finalize)operator((\);) + ident(exit)operator(()ident(status)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * exit(integer=0\) + * Kernel::exit(integer=0\) + * Process::exit(integer=0\) + * + * Initiates the termination of the Ruby script by raising the + * <code>SystemExit</code> exception. This exception may be caught. The + * optional parameter is used to return a status code to the invoking + * environment. + * + * begin + * exit + * puts "never get here" + * rescue SystemExit + * puts "rescued a SystemExit exception" + * end + * puts "after begin block" + * + * <em>produces:</em> + * + * rescued a SystemExit exception + * after begin block + * + * Just prior to termination, Ruby executes any <code>at_exit</code> functions + * (see Kernel::at_exit\) and runs any object finalizers (see + * ObjectSpace::define_finalizer\). + * + * at_exit { puts "at_exit function" } + * ObjectSpace.define_finalizer("string", proc { puts "in finalizer" }\) + * exit + * + * <em>produces:</em> + * + * at_exit function + * in finalizer + */) + +ident(VALUE) +ident(rb_f_exit)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(status)operator(;) + pre_type(int) ident(istatus)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(status)operator(\)) operator(==) integer(1)operator(\)) operator({) + reserved(switch) operator(()ident(status)operator(\)) operator({) + reserved(case) label(Qtrue)operator(:) + ident(istatus) operator(=) ident(EXIT_SUCCESS)operator(;) + reserved(break)operator(;) + reserved(case) label(Qfalse)operator(:) + ident(istatus) operator(=) ident(EXIT_FAILURE)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(istatus) operator(=) ident(NUM2INT)operator(()ident(status)operator(\);) +preprocessor(#if) ident(EXIT_SUCCESS) operator(!=) integer(0) + reserved(if) operator(()ident(istatus) operator(==) integer(0)operator(\)) ident(istatus) operator(=) ident(EXIT_SUCCESS)operator(;) +preprocessor(#endif) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(istatus) operator(=) ident(EXIT_SUCCESS)operator(;) + operator(}) + ident(rb_exit)operator(()ident(istatus)operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + + +comment(/* + * call-seq: + * abort + * Kernel::abort + * Process::abort + * + * Terminate execution immediately, effectively by calling + * <code>Kernel.exit(1\)</code>. If _msg_ is given, it is written + * to STDERR prior to terminating. + */) + +ident(VALUE) +ident(rb_f_abort)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(ruby_errinfo)operator(\)\)) operator({) + ident(error_print)operator((\);) + operator(}) + ident(rb_exit)operator(()ident(EXIT_FAILURE)operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(mesg)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(1)delimiter(")>operator(,) operator(&)ident(mesg)operator(\);) + ident(StringValue)operator(()ident(mesg)operator(\);) + ident(rb_io_puts)operator(()integer(1)operator(,) operator(&)ident(mesg)operator(,) ident(rb_stderr)operator(\);) + ident(terminate_process)operator(()ident(EXIT_FAILURE)operator(,) ident(mesg)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +directive(void) +ident(rb_iter_break)operator((\)) +operator({) + ident(break_jump)operator(()ident(Qnil)operator(\);) +operator(}) + +ident(NORETURN)operator(()directive(static) directive(void) ident(rb_longjmp) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(\)\)\);) +directive(static) ident(VALUE) ident(make_backtrace) ident(_)operator((()directive(void)operator(\)\);) + +directive(static) directive(void) +ident(rb_longjmp)operator(()ident(tag)operator(,) ident(mesg)operator(\)) + pre_type(int) ident(tag)operator(;) + ident(VALUE) ident(mesg)operator(;) +operator({) + ident(VALUE) ident(at)operator(;) + ident(rb_thread_t) ident(th) operator(=) ident(curr_thread)operator(;) + + reserved(if) operator(()ident(rb_thread_set_raised)operator(()ident(th)operator(\)\)) operator({) + ident(ruby_errinfo) operator(=) ident(exception_error)operator(;) + ident(JUMP_TAG)operator(()ident(TAG_FATAL)operator(\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(mesg)operator(\)\)) ident(mesg) operator(=) ident(ruby_errinfo)operator(;) + reserved(if) operator(()ident(NIL_P)operator(()ident(mesg)operator(\)\)) operator({) + ident(mesg) operator(=) ident(rb_exc_new)operator(()ident(rb_eRuntimeError)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + + ident(ruby_set_current_source)operator((\);) + reserved(if) operator(()ident(ruby_sourcefile) operator(&&) operator(!)ident(NIL_P)operator(()ident(mesg)operator(\)\)) operator({) + ident(at) operator(=) ident(get_backtrace)operator(()ident(mesg)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(at)operator(\)\)) operator({) + ident(at) operator(=) ident(make_backtrace)operator((\);) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(mesg)operator(\)\)) operator({) + ident(mesg) operator(=) ident(rb_obj_dup)operator(()ident(mesg)operator(\);) + operator(}) + ident(set_backtrace)operator(()ident(mesg)operator(,) ident(at)operator(\);) + operator(}) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(mesg)operator(\)\)) operator({) + ident(ruby_errinfo) operator(=) ident(mesg)operator(;) + operator(}) + + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_debug)operator(\)) operator(&&) operator(!)ident(NIL_P)operator(()ident(ruby_errinfo)operator(\)) + operator(&&) operator(!)ident(rb_obj_is_kind_of)operator(()ident(ruby_errinfo)operator(,) ident(rb_eSystemExit)operator(\)\)) operator({) + ident(VALUE) ident(e) operator(=) ident(ruby_errinfo)operator(;) + pre_type(int) ident(status)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(status) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(StringValue)operator(()ident(e)operator(\);) + ident(warn_printf)operator(()string<delimiter(")content(Exception `%s' at %s:%d - %s)char(\\n)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(ruby_errinfo)operator(\),) + ident(ruby_sourcefile)operator(,) ident(ruby_sourceline)operator(,) + ident(RSTRING)operator(()ident(e)operator(\)->)ident(ptr)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(status) operator(==) ident(TAG_FATAL) operator(&&) ident(ruby_errinfo) operator(==) ident(exception_error)operator(\)) operator({) + ident(ruby_errinfo) operator(=) ident(mesg)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(status)operator(\)) operator({) + ident(rb_thread_reset_raised)operator(()ident(th)operator(\);) + ident(JUMP_TAG)operator(()ident(status)operator(\);) + operator(}) + operator(}) + + ident(rb_trap_restore_mask)operator((\);) + reserved(if) operator(()ident(tag) operator(!=) ident(TAG_FATAL)operator(\)) operator({) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_RAISE)operator(,) ident(ruby_current_node)operator(,) + ident(ruby_frame)operator(->)ident(self)operator(,) + ident(ruby_frame)operator(->)ident(last_func)operator(,) + ident(ruby_frame)operator(->)ident(last_class)operator(\);) + operator(}) + reserved(if) operator((!)ident(prot_tag)operator(\)) operator({) + ident(error_print)operator((\);) + operator(}) + ident(rb_thread_raised_clear)operator(()ident(th)operator(\);) + ident(JUMP_TAG)operator(()ident(tag)operator(\);) +operator(}) + +directive(void) +ident(rb_exc_jump)operator(()ident(mesg)operator(\)) + ident(VALUE) ident(mesg)operator(;) +operator({) + ident(rb_thread_raised_clear)operator(()ident(rb_curr_thread)operator(\);) + ident(ruby_errinfo) operator(=) ident(mesg)operator(;) + ident(JUMP_TAG)operator(()ident(TAG_RAISE)operator(\);) +operator(}) + +directive(void) +ident(rb_exc_raise)operator(()ident(mesg)operator(\)) + ident(VALUE) ident(mesg)operator(;) +operator({) + ident(rb_longjmp)operator(()ident(TAG_RAISE)operator(,) ident(mesg)operator(\);) +operator(}) + +directive(void) +ident(rb_exc_fatal)operator(()ident(mesg)operator(\)) + ident(VALUE) ident(mesg)operator(;) +operator({) + ident(rb_longjmp)operator(()ident(TAG_FATAL)operator(,) ident(mesg)operator(\);) +operator(}) + +directive(void) +ident(rb_interrupt)operator((\)) +operator({) + ident(rb_raise)operator(()ident(rb_eInterrupt)operator(,) string<delimiter(")delimiter(")>operator(\);) +operator(}) + +comment(/* + * call-seq: + * raise + * raise(string\) + * raise(exception [, string [, array]]\) + * fail + * fail(string\) + * fail(exception [, string [, array]]\) + * + * With no arguments, raises the exception in <code>$!</code> or raises + * a <code>RuntimeError</code> if <code>$!</code> is +nil+. + * With a single +String+ argument, raises a + * +RuntimeError+ with the string as a message. Otherwise, + * the first parameter should be the name of an +Exception+ + * class (or an object that returns an +Exception+ object when sent + * an +exception+ message\). The optional second parameter sets the + * message associated with the exception, and the third parameter is an + * array of callback information. Exceptions are caught by the + * +rescue+ clause of <code>begin...end</code> blocks. + * + * raise "Failed to create socket" + * raise ArgumentError, "No parameters", caller + */) + +directive(static) ident(VALUE) +ident(rb_f_raise)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(rb_raise_jump)operator(()ident(rb_make_exception)operator(()ident(argc)operator(,) ident(argv)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +directive(static) ident(VALUE) +ident(rb_make_exception)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(mesg)operator(;) + ident(ID) ident(exception)operator(;) + pre_type(int) ident(n)operator(;) + + ident(mesg) operator(=) ident(Qnil)operator(;) + reserved(switch) operator(()ident(argc)operator(\)) operator({) + reserved(case) integer(0)operator(:) + ident(mesg) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) + reserved(if) operator(()ident(NIL_P)operator(()ident(argv)operator([)integer(0)operator(]\)\)) reserved(break)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(mesg) operator(=) ident(rb_exc_new3)operator(()ident(rb_eRuntimeError)operator(,) ident(argv)operator([)integer(0)operator(]\);) + reserved(break)operator(;) + operator(}) + ident(n) operator(=) integer(0)operator(;) + reserved(goto) ident(exception_call)operator(;) + + reserved(case) integer(2)operator(:) + reserved(case) integer(3)operator(:) + ident(n) operator(=) integer(1)operator(;) + label(exception_call)operator(:) + ident(exception) operator(=) ident(rb_intern)operator(()string<delimiter(")content(exception)delimiter(")>operator(\);) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(argv)operator([)integer(0)operator(],) ident(exception)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(exception class/object expected)delimiter(")>operator(\);) + operator(}) + ident(mesg) operator(=) ident(rb_funcall)operator(()ident(argv)operator([)integer(0)operator(],) ident(exception)operator(,) ident(n)operator(,) ident(argv)operator([)integer(1)operator(]\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator((!)ident(rb_obj_is_kind_of)operator(()ident(mesg)operator(,) ident(rb_eException)operator(\)\)) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(exception object expected)delimiter(")>operator(\);) + reserved(if) operator(()ident(argc)operator(>)integer(2)operator(\)) + ident(set_backtrace)operator(()ident(mesg)operator(,) ident(argv)operator([)integer(2)operator(]\);) + operator(}) + + reserved(return) ident(mesg)operator(;) +operator(}) + +directive(static) directive(void) +ident(rb_raise_jump)operator(()ident(mesg)operator(\)) + ident(VALUE) ident(mesg)operator(;) +operator({) + reserved(if) operator(()ident(ruby_frame) operator(!=) ident(top_frame)operator(\)) operator({) + ident(PUSH_FRAME)operator((\);) comment(/* fake frame */) + operator(*)ident(ruby_frame) operator(=) operator(*)ident(_frame)operator(.)ident(prev)operator(->)ident(prev)operator(;) + ident(rb_longjmp)operator(()ident(TAG_RAISE)operator(,) ident(mesg)operator(\);) + ident(POP_FRAME)operator((\);) + operator(}) + ident(rb_longjmp)operator(()ident(TAG_RAISE)operator(,) ident(mesg)operator(\);) +operator(}) + +directive(void) +ident(rb_jump_tag)operator(()ident(tag)operator(\)) + pre_type(int) ident(tag)operator(;) +operator({) + ident(JUMP_TAG)operator(()ident(tag)operator(\);) +operator(}) + +pre_type(int) +ident(rb_block_given_p)operator((\)) +operator({) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(iter) operator(==) ident(ITER_CUR) operator(&&) ident(ruby_block)operator(\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +pre_type(int) +ident(rb_iterator_p)operator((\)) +operator({) + reserved(return) ident(rb_block_given_p)operator((\);) +operator(}) + +comment(/* + * call-seq: + * block_given? => true or false + * iterator? => true or false + * + * Returns <code>true</code> if <code>yield</code> would execute a + * block in the current context. The <code>iterator?</code> form + * is mildly deprecated. + * + * def try + * if block_given? + * yield + * else + * "no block" + * end + * end + * try #=> "no block" + * try { "hello" } #=> "hello" + * try do "hello" end #=> "hello" + */) + + +directive(static) ident(VALUE) +ident(rb_f_block_given_p)operator((\)) +operator({) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(prev) operator(&&) ident(ruby_frame)operator(->)ident(prev)operator(->)ident(iter) operator(==) ident(ITER_CUR) operator(&&) ident(ruby_block)operator(\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +ident(VALUE) ident(rb_eThreadError)operator(;) + +ident(NORETURN)operator(()directive(static) directive(void) ident(proc_jump_error)operator(()pre_type(int)operator(,) ident(VALUE)operator(\)\);) +directive(static) directive(void) +ident(proc_jump_error)operator(()ident(state)operator(,) ident(result)operator(\)) + pre_type(int) ident(state)operator(;) + ident(VALUE) ident(result)operator(;) +operator({) + pre_type(char) ident(mesg)operator([)integer(32)operator(];) + pre_type(char) operator(*)ident(statement)operator(;) + + reserved(switch) operator(()ident(state)operator(\)) operator({) + reserved(case) label(TAG_BREAK)operator(:) + ident(statement) operator(=) string<delimiter(")content(break)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) label(TAG_RETURN)operator(:) + ident(statement) operator(=) string<delimiter(")content(return)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) label(TAG_RETRY)operator(:) + ident(statement) operator(=) string<delimiter(")content(retry)delimiter(")>operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(statement) operator(=) string<delimiter(")content(local-jump)delimiter(")>operator(;) reserved(break)operator(;) comment(/* should not happen */) + operator(}) + ident(snprintf)operator(()ident(mesg)operator(,) reserved(sizeof) ident(mesg)operator(,) string<delimiter(")content(%s from proc-closure)delimiter(")>operator(,) ident(statement)operator(\);) + ident(localjump_error)operator(()ident(mesg)operator(,) ident(result)operator(,) ident(state)operator(\);) +operator(}) + +directive(static) directive(void) +ident(return_jump)operator(()ident(retval)operator(\)) + ident(VALUE) ident(retval)operator(;) +operator({) + reserved(struct) ident(tag) operator(*)ident(tt) operator(=) ident(prot_tag)operator(;) + pre_type(int) ident(yield) operator(=) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(retval) operator(==) ident(Qundef)operator(\)) ident(retval) operator(=) ident(Qnil)operator(;) + reserved(while) operator(()ident(tt)operator(\)) operator({) + reserved(if) operator(()ident(tt)operator(->)ident(tag) operator(==) ident(PROT_YIELD)operator(\)) operator({) + ident(yield) operator(=) ident(Qtrue)operator(;) + ident(tt) operator(=) ident(tt)operator(->)ident(prev)operator(;) + operator(}) + reserved(if) operator(()ident(tt)operator(->)ident(tag) operator(==) ident(PROT_FUNC) operator(&&) ident(tt)operator(->)ident(frame)operator(->)ident(uniq) operator(==) ident(ruby_frame)operator(->)ident(uniq)operator(\)) operator({) + ident(tt)operator(->)ident(dst) operator(=) operator(()ident(VALUE)operator(\))ident(ruby_frame)operator(->)ident(uniq)operator(;) + ident(tt)operator(->)ident(retval) operator(=) ident(retval)operator(;) + ident(JUMP_TAG)operator(()ident(TAG_RETURN)operator(\);) + operator(}) + reserved(if) operator(()ident(tt)operator(->)ident(tag) operator(==) ident(PROT_LAMBDA) operator(&&) operator(!)ident(yield)operator(\)) operator({) + ident(tt)operator(->)ident(dst) operator(=) operator(()ident(VALUE)operator(\))ident(tt)operator(->)ident(frame)operator(->)ident(uniq)operator(;) + ident(tt)operator(->)ident(retval) operator(=) ident(retval)operator(;) + ident(JUMP_TAG)operator(()ident(TAG_RETURN)operator(\);) + operator(}) + reserved(if) operator(()ident(tt)operator(->)ident(tag) operator(==) ident(PROT_THREAD)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(return can't jump across threads)delimiter(")>operator(\);) + operator(}) + ident(tt) operator(=) ident(tt)operator(->)ident(prev)operator(;) + operator(}) + ident(localjump_error)operator(()string<delimiter(")content(unexpected return)delimiter(")>operator(,) ident(retval)operator(,) ident(TAG_RETURN)operator(\);) +operator(}) + +directive(static) directive(void) +ident(break_jump)operator(()ident(retval)operator(\)) + ident(VALUE) ident(retval)operator(;) +operator({) + reserved(struct) ident(tag) operator(*)ident(tt) operator(=) ident(prot_tag)operator(;) + + reserved(if) operator(()ident(retval) operator(==) ident(Qundef)operator(\)) ident(retval) operator(=) ident(Qnil)operator(;) + reserved(while) operator(()ident(tt)operator(\)) operator({) + reserved(switch) operator(()ident(tt)operator(->)ident(tag)operator(\)) operator({) + reserved(case) label(PROT_THREAD)operator(:) + reserved(case) label(PROT_YIELD)operator(:) + reserved(case) label(PROT_LOOP)operator(:) + reserved(case) label(PROT_LAMBDA)operator(:) + ident(tt)operator(->)ident(dst) operator(=) operator(()ident(VALUE)operator(\))ident(tt)operator(->)ident(frame)operator(->)ident(uniq)operator(;) + ident(tt)operator(->)ident(retval) operator(=) ident(retval)operator(;) + ident(JUMP_TAG)operator(()ident(TAG_BREAK)operator(\);) + reserved(break)operator(;) + reserved(case) label(PROT_FUNC)operator(:) + ident(tt) operator(=) integer(0)operator(;) + reserved(continue)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + ident(tt) operator(=) ident(tt)operator(->)ident(prev)operator(;) + operator(}) + ident(localjump_error)operator(()string<delimiter(")content(unexpected break)delimiter(")>operator(,) ident(retval)operator(,) ident(TAG_BREAK)operator(\);) +operator(}) + +directive(static) directive(void) +ident(next_jump)operator(()ident(retval)operator(\)) + ident(VALUE) ident(retval)operator(;) +operator({) + reserved(struct) ident(tag) operator(*)ident(tt) operator(=) ident(prot_tag)operator(;) + + reserved(if) operator(()ident(retval) operator(==) ident(Qundef)operator(\)) ident(retval) operator(=) ident(Qnil)operator(;) + reserved(while) operator(()ident(tt)operator(\)) operator({) + reserved(switch) operator(()ident(tt)operator(->)ident(tag)operator(\)) operator({) + reserved(case) label(PROT_THREAD)operator(:) + reserved(case) label(PROT_YIELD)operator(:) + reserved(case) label(PROT_LOOP)operator(:) + reserved(case) label(PROT_LAMBDA)operator(:) + reserved(case) label(PROT_FUNC)operator(:) + ident(tt)operator(->)ident(dst) operator(=) operator(()ident(VALUE)operator(\))ident(tt)operator(->)ident(frame)operator(->)ident(uniq)operator(;) + ident(tt)operator(->)ident(retval) operator(=) ident(retval)operator(;) + ident(JUMP_TAG)operator(()ident(TAG_NEXT)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + ident(tt) operator(=) ident(tt)operator(->)ident(prev)operator(;) + operator(}) + ident(localjump_error)operator(()string<delimiter(")content(unexpected next)delimiter(")>operator(,) ident(retval)operator(,) ident(TAG_NEXT)operator(\);) +operator(}) + +directive(void) +ident(rb_need_block)operator((\)) +operator({) + reserved(if) operator((!)ident(rb_block_given_p)operator((\)\)) operator({) + ident(localjump_error)operator(()string<delimiter(")content(no block given)delimiter(")>operator(,) ident(Qnil)operator(,) integer(0)operator(\);) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(rb_yield_0)operator(()ident(val)operator(,) ident(self)operator(,) ident(klass)operator(,) ident(flags)operator(,) ident(avalue)operator(\)) + ident(VALUE) ident(val)operator(,) ident(self)operator(,) ident(klass)operator(;) comment(/* OK */) + pre_type(int) ident(flags)operator(,) ident(avalue)operator(;) +operator({) + ident(NODE) operator(*)ident(node)operator(;) + directive(volatile) ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) + directive(volatile) ident(VALUE) ident(old_cref)operator(;) + directive(volatile) ident(VALUE) ident(old_wrapper)operator(;) + reserved(struct) ident(BLOCK) operator(*) directive(volatile) ident(block)operator(;) + reserved(struct) ident(SCOPE) operator(*) directive(volatile) ident(old_scope)operator(;) + pre_type(int) ident(old_vmode)operator(;) + reserved(struct) ident(FRAME) ident(frame)operator(;) + ident(NODE) operator(*)ident(cnode) operator(=) ident(ruby_current_node)operator(;) + pre_type(int) ident(lambda) operator(=) ident(flags) operator(&) ident(YIELD_LAMBDA_CALL)operator(;) + pre_type(int) ident(state)operator(;) + + ident(rb_need_block)operator((\);) + + ident(PUSH_VARS)operator((\);) + ident(block) operator(=) ident(ruby_block)operator(;) + ident(frame) operator(=) ident(block)operator(->)ident(frame)operator(;) + ident(frame)operator(.)ident(prev) operator(=) ident(ruby_frame)operator(;) + ident(frame)operator(.)ident(node) operator(=) ident(cnode)operator(;) + ident(ruby_frame) operator(=) operator(&()ident(frame)operator(\);) + ident(old_cref) operator(=) operator(()ident(VALUE)operator(\))ident(ruby_cref)operator(;) + ident(ruby_cref) operator(=) ident(block)operator(->)ident(cref)operator(;) + ident(old_wrapper) operator(=) ident(ruby_wrapper)operator(;) + ident(ruby_wrapper) operator(=) ident(block)operator(->)ident(wrapper)operator(;) + ident(old_scope) operator(=) ident(ruby_scope)operator(;) + ident(ruby_scope) operator(=) ident(block)operator(->)ident(scope)operator(;) + ident(old_vmode) operator(=) ident(scope_vmode)operator(;) + ident(scope_vmode) operator(=) operator(()ident(flags) operator(&) ident(YIELD_PUBLIC_DEF)operator(\)) operator(?) ident(SCOPE_PUBLIC) operator(:) ident(block)operator(->)ident(vmode)operator(;) + ident(ruby_block) operator(=) ident(block)operator(->)ident(prev)operator(;) + reserved(if) operator(()ident(block)operator(->)ident(flags) operator(&) ident(BLOCK_D_SCOPE)operator(\)) operator({) + comment(/* put place holder for dynamic (in-block\) local variables */) + ident(ruby_dyna_vars) operator(=) ident(new_dvar)operator(()integer(0)operator(,) integer(0)operator(,) ident(block)operator(->)ident(dyna_vars)operator(\);) + operator(}) + reserved(else) operator({) + comment(/* FOR does not introduce new scope */) + ident(ruby_dyna_vars) operator(=) ident(block)operator(->)ident(dyna_vars)operator(;) + operator(}) + ident(PUSH_CLASS)operator(()ident(klass) operator(?) ident(klass) operator(:) ident(block)operator(->)ident(klass)operator(\);) + reserved(if) operator((!)ident(klass)operator(\)) operator({) + ident(self) operator(=) ident(block)operator(->)ident(self)operator(;) + operator(}) + ident(node) operator(=) ident(block)operator(->)ident(body)operator(;) + + reserved(if) operator(()ident(block)operator(->)ident(var)operator(\)) operator({) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(block)operator(->)ident(var) operator(==) operator(()ident(NODE)operator(*\))integer(1)operator(\)) operator({) comment(/* no parameter || */) + reserved(if) operator(()ident(lambda) operator(&&) ident(RARRAY)operator(()ident(val)operator(\)->)ident(len) operator(!=) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%ld for 0\))delimiter(")>operator(,) + ident(RARRAY)operator(()ident(val)operator(\)->)ident(len)operator(\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(block)operator(->)ident(var) operator(==) operator(()ident(NODE)operator(*\))integer(2)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(val)operator(\)) operator(==) ident(T_ARRAY) operator(&&) ident(RARRAY)operator(()ident(val)operator(\)->)ident(len) operator(!=) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%ld for 0\))delimiter(")>operator(,) + ident(RARRAY)operator(()ident(val)operator(\)->)ident(len)operator(\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(nd_type)operator(()ident(block)operator(->)ident(var)operator(\)) operator(==) ident(NODE_MASGN)operator(\)) operator({) + reserved(if) operator((!)ident(avalue)operator(\)) operator({) + ident(val) operator(=) ident(svalue_to_mrhs)operator(()ident(val)operator(,) ident(block)operator(->)ident(var)operator(->)ident(nd_head)operator(\);) + operator(}) + ident(massign)operator(()ident(self)operator(,) ident(block)operator(->)ident(var)operator(,) ident(val)operator(,) ident(lambda)operator(\);) + operator(}) + reserved(else) operator({) + pre_type(int) ident(len) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(avalue)operator(\)) operator({) + ident(len) operator(=) ident(RARRAY)operator(()ident(val)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) operator({) + reserved(goto) ident(zero_arg)operator(;) + operator(}) + reserved(if) operator(()ident(len) operator(==) integer(1)operator(\)) operator({) + ident(val) operator(=) ident(RARRAY)operator(()ident(val)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + operator(}) + reserved(else) operator({) + reserved(goto) ident(multi_values)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(val) operator(==) ident(Qundef)operator(\)) operator({) + label(zero_arg)operator(:) + ident(val) operator(=) ident(Qnil)operator(;) + label(multi_values)operator(:) + operator({) + ident(ruby_current_node) operator(=) ident(block)operator(->)ident(var)operator(;) + ident(rb_warn)operator(()string<delimiter(")content(multiple values for a block parameter (%d for 1\))char(\\n)char(\\t)content(from %s:%d)delimiter(")>operator(,) + ident(len)operator(,) ident(cnode)operator(->)ident(nd_file)operator(,) ident(nd_line)operator(()ident(cnode)operator(\)\);) + ident(ruby_current_node) operator(=) ident(cnode)operator(;) + operator(}) + operator(}) + ident(assign)operator(()ident(self)operator(,) ident(block)operator(->)ident(var)operator(,) ident(val)operator(,) ident(lambda)operator(\);) + operator(}) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) reserved(goto) ident(pop_state)operator(;) + operator(}) + reserved(if) operator((!)ident(node)operator(\)) operator({) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(pop_state)operator(;) + operator(}) + ident(ruby_current_node) operator(=) ident(node)operator(;) + + ident(PUSH_ITER)operator(()ident(block)operator(->)ident(iter)operator(\);) + ident(PUSH_TAG)operator(()ident(lambda) operator(?) ident(PROT_NONE) operator(:) ident(PROT_YIELD)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + label(redo)operator(:) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_CFUNC) operator(||) ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_IFUNC)operator(\)) operator({) + reserved(if) operator(()ident(node)operator(->)ident(nd_state) operator(==) ident(YIELD_FUNC_AVALUE)operator(\)) operator({) + reserved(if) operator((!)ident(avalue)operator(\)) operator({) + ident(val) operator(=) ident(svalue_to_avalue)operator(()ident(val)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(avalue)operator(\)) operator({) + ident(val) operator(=) ident(avalue_to_svalue)operator(()ident(val)operator(\);) + operator(}) + reserved(if) operator(()ident(val) operator(==) ident(Qundef) operator(&&) ident(node)operator(->)ident(nd_state) operator(!=) ident(YIELD_FUNC_SVALUE)operator(\)) + ident(val) operator(=) ident(Qnil)operator(;) + operator(}) + ident(result) operator(=) operator((*)ident(node)operator(->)ident(nd_cfnc)operator(\)()ident(val)operator(,) ident(node)operator(->)ident(nd_tval)operator(,) ident(self)operator(\);) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + reserved(switch) operator(()ident(state)operator(\)) operator({) + reserved(case) label(TAG_REDO)operator(:) + ident(state) operator(=) integer(0)operator(;) + ident(CHECK_INTS)operator(;) + reserved(goto) ident(redo)operator(;) + reserved(case) label(TAG_NEXT)operator(:) + reserved(if) operator((!)ident(lambda)operator(\)) operator({) + ident(state) operator(=) integer(0)operator(;) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + operator(}) + reserved(break)operator(;) + reserved(case) label(TAG_BREAK)operator(:) + reserved(if) operator(()ident(TAG_DST)operator((\)\)) operator({) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + operator(}) + reserved(else) operator({) + ident(lambda) operator(=) ident(Qtrue)operator(;) comment(/* just pass TAG_BREAK */) + operator(}) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + ident(POP_TAG)operator((\);) + ident(POP_ITER)operator((\);) + label(pop_state)operator(:) + ident(POP_CLASS)operator((\);) + reserved(if) operator(()ident(ruby_dyna_vars) operator(&&) operator(()ident(block)operator(->)ident(flags) operator(&) ident(BLOCK_D_SCOPE)operator(\)) operator(&&) + operator(!)ident(FL_TEST)operator(()ident(ruby_dyna_vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\)\)) operator({) + reserved(struct) ident(RVarmap) operator(*)ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + + reserved(if) operator(()ident(ruby_dyna_vars)operator(->)ident(id) operator(==) integer(0)operator(\)) operator({) + ident(vars) operator(=) ident(ruby_dyna_vars)operator(->)ident(next)operator(;) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(ruby_dyna_vars)operator(\);) + reserved(while) operator(()ident(vars) operator(&&) ident(vars)operator(->)ident(id) operator(!=) integer(0) operator(&&) ident(vars) operator(!=) ident(block)operator(->)ident(dyna_vars)operator(\)) operator({) + reserved(struct) ident(RVarmap) operator(*)ident(tmp) operator(=) ident(vars)operator(->)ident(next)operator(;) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(vars)operator(\);) + ident(vars) operator(=) ident(tmp)operator(;) + operator(}) + operator(}) + operator(}) + ident(POP_VARS)operator((\);) + ident(ruby_block) operator(=) ident(block)operator(;) + ident(ruby_frame) operator(=) ident(ruby_frame)operator(->)ident(prev)operator(;) + ident(ruby_cref) operator(=) operator(()ident(NODE)operator(*\))ident(old_cref)operator(;) + ident(ruby_wrapper) operator(=) ident(old_wrapper)operator(;) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(flags) operator(&) ident(SCOPE_DONT_RECYCLE)operator(\)) + ident(scope_dup)operator(()ident(old_scope)operator(\);) + ident(ruby_scope) operator(=) ident(old_scope)operator(;) + ident(scope_vmode) operator(=) ident(old_vmode)operator(;) + reserved(switch) operator(()ident(state)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(break)operator(;) + reserved(case) label(TAG_BREAK)operator(:) + reserved(if) operator((!)ident(lambda)operator(\)) operator({) + reserved(struct) ident(tag) operator(*)ident(tt) operator(=) ident(prot_tag)operator(;) + + reserved(while) operator(()ident(tt)operator(\)) operator({) + reserved(if) operator(()ident(tt)operator(->)ident(tag) operator(==) ident(PROT_LOOP) operator(&&) ident(tt)operator(->)ident(blkid) operator(==) ident(ruby_block)operator(->)ident(uniq)operator(\)) operator({) + ident(tt)operator(->)ident(dst) operator(=) operator(()ident(VALUE)operator(\))ident(tt)operator(->)ident(frame)operator(->)ident(uniq)operator(;) + ident(tt)operator(->)ident(retval) operator(=) ident(result)operator(;) + ident(JUMP_TAG)operator(()ident(TAG_BREAK)operator(\);) + operator(}) + ident(tt) operator(=) ident(tt)operator(->)ident(prev)operator(;) + operator(}) + ident(proc_jump_error)operator(()ident(TAG_BREAK)operator(,) ident(result)operator(\);) + operator(}) + comment(/* fall through */) + reserved(default)operator(:) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + reserved(break)operator(;) + operator(}) + ident(ruby_current_node) operator(=) ident(cnode)operator(;) + reserved(return) ident(result)operator(;) +operator(}) + +ident(VALUE) +ident(rb_yield)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(return) ident(rb_yield_0)operator(()ident(val)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) ident(Qfalse)operator(\);) +operator(}) + +ident(VALUE) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_yield_values)operator(()pre_type(int) ident(n)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_yield_values)operator(()ident(n)operator(,) ident(va_alist)operator(\)) + pre_type(int) ident(n)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(va_list) ident(args)operator(;) + ident(VALUE) ident(ary)operator(;) + + reserved(if) operator(()ident(n) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(rb_yield_0)operator(()ident(Qundef)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) ident(Qfalse)operator(\);) + operator(}) + ident(ary) operator(=) ident(rb_ary_new2)operator(()ident(n)operator(\);) + ident(va_init_list)operator(()ident(args)operator(,) ident(n)operator(\);) + reserved(while) operator(()ident(n)operator(--\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(va_arg)operator(()ident(args)operator(,) ident(VALUE)operator(\)\);) + operator(}) + ident(va_end)operator(()ident(args)operator(\);) + reserved(return) ident(rb_yield_0)operator(()ident(ary)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) ident(Qtrue)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_yield_splat)operator(()ident(values)operator(\)) + ident(VALUE) ident(values)operator(;) +operator({) + pre_type(int) ident(avalue) operator(=) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(values)operator(\)) operator(==) ident(T_ARRAY)operator(\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(values)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + ident(values) operator(=) ident(Qundef)operator(;) + operator(}) + reserved(else) operator({) + ident(avalue) operator(=) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(return) ident(rb_yield_0)operator(()ident(values)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) ident(avalue)operator(\);) +operator(}) + +comment(/* + * call-seq: + * loop {|| block } + * + * Repeatedly executes the block. + * + * loop do + * print "Input: " + * line = gets + * break if !line or line =~ /^qQ/ + * # ... + * end + */) + +directive(static) ident(VALUE) +ident(rb_f_loop)operator((\)) +operator({) + reserved(for) operator((;;\)) operator({) + ident(rb_yield_0)operator(()ident(Qundef)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) ident(Qfalse)operator(\);) + ident(CHECK_INTS)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) comment(/* dummy */) +operator(}) + +directive(static) ident(VALUE) +ident(massign)operator(()ident(self)operator(,) ident(node)operator(,) ident(val)operator(,) ident(pcall)operator(\)) + ident(VALUE) ident(self)operator(;) + ident(NODE) operator(*)ident(node)operator(;) + ident(VALUE) ident(val)operator(;) + pre_type(int) ident(pcall)operator(;) +operator({) + ident(NODE) operator(*)ident(list)operator(;) + pre_type(long) ident(i) operator(=) integer(0)operator(,) ident(len)operator(;) + + ident(len) operator(=) ident(RARRAY)operator(()ident(val)operator(\)->)ident(len)operator(;) + ident(list) operator(=) ident(node)operator(->)ident(nd_head)operator(;) + reserved(for) operator((;) ident(list) operator(&&) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(assign)operator(()ident(self)operator(,) ident(list)operator(->)ident(nd_head)operator(,) ident(RARRAY)operator(()ident(val)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(pcall)operator(\);) + ident(list) operator(=) ident(list)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(if) operator(()ident(pcall) operator(&&) ident(list)operator(\)) reserved(goto) ident(arg_error)operator(;) + reserved(if) operator(()ident(node)operator(->)ident(nd_args)operator(\)) operator({) + reserved(if) operator((()pre_type(long)operator(\)()ident(node)operator(->)ident(nd_args)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + comment(/* no check for mere `*' */) + operator(}) + reserved(else) reserved(if) operator((!)ident(list) operator(&&) ident(i)operator(<)ident(len)operator(\)) operator({) + ident(assign)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_args)operator(,) ident(rb_ary_new4)operator(()ident(len)operator(-)ident(i)operator(,) ident(RARRAY)operator(()ident(val)operator(\)->)ident(ptr)operator(+)ident(i)operator(\),) ident(pcall)operator(\);) + operator(}) + reserved(else) operator({) + ident(assign)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_args)operator(,) ident(rb_ary_new2)operator(()integer(0)operator(\),) ident(pcall)operator(\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(pcall) operator(&&) ident(i) operator(<) ident(len)operator(\)) operator({) + reserved(goto) ident(arg_error)operator(;) + operator(}) + + reserved(while) operator(()ident(list)operator(\)) operator({) + ident(i)operator(++;) + ident(assign)operator(()ident(self)operator(,) ident(list)operator(->)ident(nd_head)operator(,) ident(Qnil)operator(,) ident(pcall)operator(\);) + ident(list) operator(=) ident(list)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(return) ident(val)operator(;) + + label(arg_error)operator(:) + reserved(while) operator(()ident(list)operator(\)) operator({) + ident(i)operator(++;) + ident(list) operator(=) ident(list)operator(->)ident(nd_next)operator(;) + operator(}) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%ld for %ld\))delimiter(")>operator(,) ident(len)operator(,) ident(i)operator(\);) +operator(}) + +directive(static) directive(void) +ident(assign)operator(()ident(self)operator(,) ident(lhs)operator(,) ident(val)operator(,) ident(pcall)operator(\)) + ident(VALUE) ident(self)operator(;) + ident(NODE) operator(*)ident(lhs)operator(;) + ident(VALUE) ident(val)operator(;) + pre_type(int) ident(pcall)operator(;) +operator({) + ident(ruby_current_node) operator(=) ident(lhs)operator(;) + reserved(if) operator(()ident(val) operator(==) ident(Qundef)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(assigning void value)delimiter(")>operator(\);) + ident(val) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(switch) operator(()ident(nd_type)operator(()ident(lhs)operator(\)\)) operator({) + reserved(case) label(NODE_GASGN)operator(:) + ident(rb_gvar_set)operator(()ident(lhs)operator(->)ident(nd_entry)operator(,) ident(val)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_IASGN)operator(:) + ident(rb_ivar_set)operator(()ident(self)operator(,) ident(lhs)operator(->)ident(nd_vid)operator(,) ident(val)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_LASGN)operator(:) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(local_vars) operator(==) integer(0)operator(\)) + ident(rb_bug)operator(()string<delimiter(")content(unexpected local variable assignment)delimiter(")>operator(\);) + ident(ruby_scope)operator(->)ident(local_vars)operator([)ident(lhs)operator(->)ident(nd_cnt)operator(]) operator(=) ident(val)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_DASGN)operator(:) + ident(dvar_asgn)operator(()ident(lhs)operator(->)ident(nd_vid)operator(,) ident(val)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_DASGN_CURR)operator(:) + ident(dvar_asgn_curr)operator(()ident(lhs)operator(->)ident(nd_vid)operator(,) ident(val)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_CDECL)operator(:) + reserved(if) operator(()ident(lhs)operator(->)ident(nd_vid) operator(==) integer(0)operator(\)) operator({) + ident(rb_const_set)operator(()ident(class_prefix)operator(()ident(self)operator(,) ident(lhs)operator(->)ident(nd_else)operator(\),) ident(lhs)operator(->)ident(nd_else)operator(->)ident(nd_mid)operator(,) ident(val)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_const_set)operator(()ident(ruby_cbase)operator(,) ident(lhs)operator(->)ident(nd_vid)operator(,) ident(val)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_CVDECL)operator(:) + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)) operator(&&) ident(FL_TEST)operator(()ident(ruby_cbase)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(declaring singleton class variable)delimiter(")>operator(\);) + operator(}) + ident(rb_cvar_set)operator(()ident(cvar_cbase)operator((\),) ident(lhs)operator(->)ident(nd_vid)operator(,) ident(val)operator(,) ident(Qtrue)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_CVASGN)operator(:) + ident(rb_cvar_set)operator(()ident(cvar_cbase)operator((\),) ident(lhs)operator(->)ident(nd_vid)operator(,) ident(val)operator(,) ident(Qfalse)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_MASGN)operator(:) + ident(massign)operator(()ident(self)operator(,) ident(lhs)operator(,) ident(svalue_to_mrhs)operator(()ident(val)operator(,) ident(lhs)operator(->)ident(nd_head)operator(\),) ident(pcall)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_CALL)operator(:) + reserved(case) label(NODE_ATTRASGN)operator(:) + operator({) + ident(VALUE) ident(recv)operator(;) + pre_type(int) ident(scope)operator(;) + reserved(if) operator(()ident(lhs)operator(->)ident(nd_recv) operator(==) operator(()ident(NODE) operator(*\))integer(1)operator(\)) operator({) + ident(recv) operator(=) ident(self)operator(;) + ident(scope) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(recv) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(lhs)operator(->)ident(nd_recv)operator(\);) + ident(scope) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator((!)ident(lhs)operator(->)ident(nd_args)operator(\)) operator({) + comment(/* attr set */) + ident(ruby_current_node) operator(=) ident(lhs)operator(;) + ident(SET_CURRENT_SOURCE)operator((\);) + ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),) ident(recv)operator(,) ident(lhs)operator(->)ident(nd_mid)operator(,) integer(1)operator(,) operator(&)ident(val)operator(,) ident(scope)operator(,) ident(self)operator(\);) + operator(}) + reserved(else) operator({) + comment(/* array set */) + ident(VALUE) ident(args)operator(;) + + ident(args) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(lhs)operator(->)ident(nd_args)operator(\);) + ident(rb_ary_push)operator(()ident(args)operator(,) ident(val)operator(\);) + ident(ruby_current_node) operator(=) ident(lhs)operator(;) + ident(SET_CURRENT_SOURCE)operator((\);) + ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),) ident(recv)operator(,) ident(lhs)operator(->)ident(nd_mid)operator(,) + ident(RARRAY)operator(()ident(args)operator(\)->)ident(len)operator(,) ident(RARRAY)operator(()ident(args)operator(\)->)ident(ptr)operator(,) ident(scope)operator(,) ident(self)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(bug in variable assignment)delimiter(")>operator(\);) + reserved(break)operator(;) + operator(}) +operator(}) + +ident(VALUE) +ident(rb_iterate)operator(()ident(it_proc)operator(,) ident(data1)operator(,) ident(bl_proc)operator(,) ident(data2)operator(\)) + ident(VALUE) operator((*)ident(it_proc)operator(\)) ident(_)operator((()ident(VALUE)operator(\)\),) operator((*)ident(bl_proc)operator(\)()ident(ANYARGS)operator(\);) + ident(VALUE) ident(data1)operator(,) ident(data2)operator(;) +operator({) + pre_type(int) ident(state)operator(;) + directive(volatile) ident(VALUE) ident(retval) operator(=) ident(Qnil)operator(;) + ident(NODE) operator(*)ident(node) operator(=) ident(NEW_IFUNC)operator(()ident(bl_proc)operator(,) ident(data2)operator(\);) + ident(VALUE) ident(self) operator(=) ident(ruby_top_self)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_LOOP)operator(\);) + ident(PUSH_BLOCK)operator(()integer(0)operator(,) ident(node)operator(\);) + ident(PUSH_ITER)operator(()ident(ITER_PRE)operator(\);) + ident(state) operator(=) ident(EXEC_TAG)operator((\);) + reserved(if) operator(()ident(state) operator(==) integer(0)operator(\)) operator({) + label(iter_retry)operator(:) + ident(retval) operator(=) operator((*)ident(it_proc)operator(\)()ident(data1)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_BREAK) operator(&&) ident(TAG_DST)operator((\)\)) operator({) + ident(retval) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + ident(state) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_RETRY)operator(\)) operator({) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(iter_retry)operator(;) + operator(}) + ident(POP_ITER)operator((\);) + ident(POP_BLOCK)operator((\);) + ident(POP_TAG)operator((\);) + + reserved(switch) operator(()ident(state)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + operator(}) + reserved(return) ident(retval)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(handle_rescue)operator(()ident(self)operator(,) ident(node)operator(\)) + ident(VALUE) ident(self)operator(;) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + pre_type(int) ident(argc)operator(;) ident(VALUE) operator(*)ident(argv)operator(;) comment(/* used in SETUP_ARGS */) + ident(TMP_PROTECT)operator(;) + + reserved(if) operator((!)ident(node)operator(->)ident(nd_args)operator(\)) operator({) + reserved(return) ident(rb_obj_is_kind_of)operator(()ident(ruby_errinfo)operator(,) ident(rb_eStandardError)operator(\);) + operator(}) + + ident(BEGIN_CALLARGS)operator(;) + ident(SETUP_ARGS)operator(()ident(node)operator(->)ident(nd_args)operator(\);) + ident(END_CALLARGS)operator(;) + + reserved(while) operator(()ident(argc)operator(--\)) operator({) + reserved(if) operator((!)ident(rb_obj_is_kind_of)operator(()ident(argv)operator([)integer(0)operator(],) ident(rb_cModule)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(class or module required for rescue clause)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall)operator((*)ident(argv)operator(,) ident(eqq)operator(,) integer(1)operator(,) ident(ruby_errinfo)operator(\)\)\)) reserved(return) integer(1)operator(;) + ident(argv)operator(++;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +ident(VALUE) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_rescue2)operator(()ident(VALUE) operator((*)ident(b_proc)operator(\)()ident(ANYARGS)operator(\),) ident(VALUE) ident(data1)operator(,) ident(VALUE) operator((*)ident(r_proc)operator(\)()ident(ANYARGS)operator(\),) ident(VALUE) ident(data2)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_rescue2)operator(()ident(b_proc)operator(,) ident(data1)operator(,) ident(r_proc)operator(,) ident(data2)operator(,) ident(va_alist)operator(\)) + ident(VALUE) operator((*)ident(b_proc)operator(\)()ident(ANYARGS)operator(\),) operator((*)ident(r_proc)operator(\)()ident(ANYARGS)operator(\);) + ident(VALUE) ident(data1)operator(,) ident(data2)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + pre_type(int) ident(state)operator(;) + directive(volatile) ident(VALUE) ident(result)operator(;) + directive(volatile) ident(VALUE) ident(e_info) operator(=) ident(ruby_errinfo)operator(;) + directive(volatile) pre_type(int) ident(handle) operator(=) ident(Qfalse)operator(;) + ident(VALUE) ident(eclass)operator(;) + ident(va_list) ident(args)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(switch) operator(()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator({) + reserved(case) label(TAG_RETRY)operator(:) + reserved(if) operator((!)ident(handle)operator(\)) reserved(break)operator(;) + ident(handle) operator(=) ident(Qfalse)operator(;) + ident(state) operator(=) integer(0)operator(;) + ident(ruby_errinfo) operator(=) ident(Qnil)operator(;) + reserved(case) integer(0)operator(:) + ident(result) operator(=) operator((*)ident(b_proc)operator(\)()ident(data1)operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_RAISE)operator(:) + reserved(if) operator(()ident(handle)operator(\)) reserved(break)operator(;) + ident(handle) operator(=) ident(Qfalse)operator(;) + ident(va_init_list)operator(()ident(args)operator(,) ident(data2)operator(\);) + reserved(while) operator((()ident(eclass) operator(=) ident(va_arg)operator(()ident(args)operator(,) ident(VALUE)operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(rb_obj_is_kind_of)operator(()ident(ruby_errinfo)operator(,) ident(eclass)operator(\)\)) operator({) + ident(handle) operator(=) ident(Qtrue)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + ident(va_end)operator(()ident(args)operator(\);) + + reserved(if) operator(()ident(handle)operator(\)) operator({) + ident(state) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(r_proc)operator(\)) operator({) + ident(result) operator(=) operator((*)ident(r_proc)operator(\)()ident(data2)operator(,) ident(ruby_errinfo)operator(\);) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(Qnil)operator(;) + operator(}) + ident(ruby_errinfo) operator(=) ident(e_info)operator(;) + operator(}) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + + reserved(return) ident(result)operator(;) +operator(}) + +ident(VALUE) +ident(rb_rescue)operator(()ident(b_proc)operator(,) ident(data1)operator(,) ident(r_proc)operator(,) ident(data2)operator(\)) + ident(VALUE) operator((*)ident(b_proc)operator(\)(\),) operator((*)ident(r_proc)operator(\)(\);) + ident(VALUE) ident(data1)operator(,) ident(data2)operator(;) +operator({) + reserved(return) ident(rb_rescue2)operator(()ident(b_proc)operator(,) ident(data1)operator(,) ident(r_proc)operator(,) ident(data2)operator(,) ident(rb_eStandardError)operator(,) operator(()ident(VALUE)operator(\))integer(0)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(cont_protect)operator(;) + +ident(VALUE) +ident(rb_protect)operator(()ident(proc)operator(,) ident(data)operator(,) ident(state)operator(\)) + ident(VALUE) operator((*)ident(proc)operator(\)) ident(_)operator((()ident(VALUE)operator(\)\);) + ident(VALUE) ident(data)operator(;) + pre_type(int) operator(*)ident(state)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) comment(/* OK */) + pre_type(int) ident(status)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + ident(cont_protect) operator(=) operator(()ident(VALUE)operator(\))ident(rb_node_newnode)operator(()ident(NODE_MEMO)operator(,) ident(cont_protect)operator(,) integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator((()ident(status) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(result) operator(=) operator((*)ident(proc)operator(\)()ident(data)operator(\);) + operator(}) + ident(cont_protect) operator(=) operator((()ident(NODE) operator(*\))ident(cont_protect)operator(\)->)ident(u1)operator(.)ident(value)operator(;) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) operator({) + operator(*)ident(state) operator(=) ident(status)operator(;) + operator(}) + reserved(if) operator(()ident(status) operator(!=) integer(0)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + + reserved(return) ident(result)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ensure)operator(()ident(b_proc)operator(,) ident(data1)operator(,) ident(e_proc)operator(,) ident(data2)operator(\)) + ident(VALUE) operator((*)ident(b_proc)operator(\)(\);) + ident(VALUE) ident(data1)operator(;) + ident(VALUE) operator((*)ident(e_proc)operator(\)(\);) + ident(VALUE) ident(data2)operator(;) +operator({) + pre_type(int) ident(state)operator(;) + directive(volatile) ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) + ident(VALUE) ident(retval)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(result) operator(=) operator((*)ident(b_proc)operator(\)()ident(data1)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + ident(retval) operator(=) ident(prot_tag) operator(?) ident(prot_tag)operator(->)ident(retval) operator(:) ident(Qnil)operator(;) comment(/* save retval */) + reserved(if) operator((!)ident(thread_no_ensure)operator((\)\)) operator({) + operator((*)ident(e_proc)operator(\)()ident(data2)operator(\);) + operator(}) + reserved(if) operator(()ident(prot_tag)operator(\)) ident(return_value)operator(()ident(retval)operator(\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + +ident(VALUE) +ident(rb_with_disable_interrupt)operator(()ident(proc)operator(,) ident(data)operator(\)) + ident(VALUE) operator((*)ident(proc)operator(\)(\);) + ident(VALUE) ident(data)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) comment(/* OK */) + pre_type(int) ident(status)operator(;) + + ident(DEFER_INTS)operator(;) + operator({) + pre_type(int) ident(thr_critical) operator(=) ident(rb_thread_critical)operator(;) + + ident(rb_thread_critical) operator(=) ident(Qtrue)operator(;) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(status) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(result) operator(=) operator((*)ident(proc)operator(\)()ident(data)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + ident(rb_thread_critical) operator(=) ident(thr_critical)operator(;) + operator(}) + ident(ENABLE_INTS)operator(;) + reserved(if) operator(()ident(status)operator(\)) ident(JUMP_TAG)operator(()ident(status)operator(\);) + + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) directive(void) +ident(stack_check)operator((\)) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_curr_thread)operator(;) + + reserved(if) operator((!)ident(rb_thread_raised_p)operator(()ident(th)operator(,) ident(RAISED_STACKOVERFLOW)operator(\)) operator(&&) ident(ruby_stack_check)operator((\)\)) operator({) + ident(rb_thread_raised_set)operator(()ident(th)operator(,) ident(RAISED_STACKOVERFLOW)operator(\);) + ident(rb_exc_raise)operator(()ident(sysstack_error)operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) ident(last_call_status)operator(;) + +preprocessor(#define) ident(CSTAT_PRIV) integer(1) +preprocessor(#define) ident(CSTAT_PROT) integer(2) +preprocessor(#define) ident(CSTAT_VCALL) integer(4) +preprocessor(#define) ident(CSTAT_SUPER) integer(8) + +comment(/* + * call-seq: + * obj.method_missing(symbol [, *args] \) => result + * + * Invoked by Ruby when <i>obj</i> is sent a message it cannot handle. + * <i>symbol</i> is the symbol for the method called, and <i>args</i> + * are any arguments that were passed to it. By default, the interpreter + * raises an error when this method is called. However, it is possible + * to override the method to provide more dynamic behavior. + * The example below creates + * a class <code>Roman</code>, which responds to methods with names + * consisting of roman numerals, returning the corresponding integer + * values. + * + * class Roman + * def romanToInt(str\) + * # ... + * end + * def method_missing(methId\) + * str = methId.id2name + * romanToInt(str\) + * end + * end + * + * r = Roman.new + * r.iv #=> 4 + * r.xxiii #=> 23 + * r.mm #=> 2000 + */) + +directive(static) ident(VALUE) +ident(rb_method_missing)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(exc) operator(=) ident(rb_eNoMethodError)operator(;) + pre_type(char) operator(*)ident(format) operator(=) integer(0)operator(;) + ident(NODE) operator(*)ident(cnode) operator(=) ident(ruby_current_node)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0) operator(||) operator(!)ident(SYMBOL_P)operator(()ident(argv)operator([)integer(0)operator(]\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(no id given)delimiter(")>operator(\);) + operator(}) + + ident(stack_check)operator((\);) + + ident(id) operator(=) ident(SYM2ID)operator(()ident(argv)operator([)integer(0)operator(]\);) + + reserved(if) operator(()ident(last_call_status) operator(&) ident(CSTAT_PRIV)operator(\)) operator({) + ident(format) operator(=) string<delimiter(")content(private method `%s' called for %s)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(last_call_status) operator(&) ident(CSTAT_PROT)operator(\)) operator({) + ident(format) operator(=) string<delimiter(")content(protected method `%s' called for %s)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(last_call_status) operator(&) ident(CSTAT_VCALL)operator(\)) operator({) + ident(format) operator(=) string<delimiter(")content(undefined local variable or method `%s' for %s)delimiter(")>operator(;) + ident(exc) operator(=) ident(rb_eNameError)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(last_call_status) operator(&) ident(CSTAT_SUPER)operator(\)) operator({) + ident(format) operator(=) string<delimiter(")content(super: no superclass method `%s')delimiter(")>operator(;) + operator(}) + reserved(if) operator((!)ident(format)operator(\)) operator({) + ident(format) operator(=) string<delimiter(")content(undefined method `%s' for %s)delimiter(")>operator(;) + operator(}) + + ident(ruby_current_node) operator(=) ident(cnode)operator(;) + operator({) + pre_type(int) ident(n) operator(=) integer(0)operator(;) + ident(VALUE) ident(args)operator([)integer(3)operator(];) + + ident(args)operator([)ident(n)operator(++]) operator(=) ident(rb_funcall)operator(()ident(rb_const_get)operator(()ident(exc)operator(,) ident(rb_intern)operator(()string<delimiter(")content(message)delimiter(")>operator(\)\),) char('!')operator(,) + integer(3)operator(,) ident(rb_str_new2)operator(()ident(format)operator(\),) ident(obj)operator(,) ident(argv)operator([)integer(0)operator(]\);) + ident(args)operator([)ident(n)operator(++]) operator(=) ident(argv)operator([)integer(0)operator(];) + reserved(if) operator(()ident(exc) operator(==) ident(rb_eNoMethodError)operator(\)) operator({) + ident(args)operator([)ident(n)operator(++]) operator(=) ident(rb_ary_new4)operator(()ident(argc)operator(-)integer(1)operator(,) ident(argv)operator(+)integer(1)operator(\);) + operator(}) + ident(exc) operator(=) ident(rb_class_new_instance)operator(()ident(n)operator(,) ident(args)operator(,) ident(exc)operator(\);) + ident(ruby_frame) operator(=) ident(ruby_frame)operator(->)ident(prev)operator(;) comment(/* pop frame for "method_missing" */) + ident(rb_exc_raise)operator(()ident(exc)operator(\);) + operator(}) + + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +directive(static) ident(VALUE) +ident(method_missing)operator(()ident(obj)operator(,) ident(id)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(call_status)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(argc)operator(;) + directive(const) ident(VALUE) operator(*)ident(argv)operator(;) + pre_type(int) ident(call_status)operator(;) +operator({) + ident(VALUE) operator(*)ident(nargv)operator(;) + + ident(last_call_status) operator(=) ident(call_status)operator(;) + + reserved(if) operator(()ident(id) operator(==) ident(missing)operator(\)) operator({) + ident(PUSH_FRAME)operator((\);) + ident(rb_method_missing)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\);) + ident(POP_FRAME)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(ID_ALLOCATOR)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(allocator undefined for %s)delimiter(")>operator(,) ident(rb_class2name)operator(()ident(obj)operator(\)\);) + operator(}) + reserved(if) operator(()ident(argc) operator(<) integer(0)operator(\)) operator({) + ident(VALUE) ident(tmp)operator(;) + + ident(argc) operator(=) operator(-)ident(argc)operator(-)integer(1)operator(;) + ident(tmp) operator(=) ident(splat_value)operator(()ident(argv)operator([)ident(argc)operator(]\);) + ident(nargv) operator(=) ident(ALLOCA_N)operator(()ident(VALUE)operator(,) ident(argc) operator(+) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len) operator(+) integer(1)operator(\);) + ident(MEMCPY)operator(()ident(nargv)operator(+)integer(1)operator(,) ident(argv)operator(,) ident(VALUE)operator(,) ident(argc)operator(\);) + ident(MEMCPY)operator(()ident(nargv)operator(+)integer(1)operator(+)ident(argc)operator(,) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len)operator(\);) + ident(argc) operator(+=) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len)operator(;) + operator(}) + reserved(else) operator({) + ident(nargv) operator(=) ident(ALLOCA_N)operator(()ident(VALUE)operator(,) ident(argc)operator(+)integer(1)operator(\);) + ident(MEMCPY)operator(()ident(nargv)operator(+)integer(1)operator(,) ident(argv)operator(,) ident(VALUE)operator(,) ident(argc)operator(\);) + operator(}) + ident(nargv)operator([)integer(0)operator(]) operator(=) ident(ID2SYM)operator(()ident(id)operator(\);) + reserved(return) ident(rb_funcall2)operator(()ident(obj)operator(,) ident(missing)operator(,) ident(argc)operator(+)integer(1)operator(,) ident(nargv)operator(\);) +operator(}) + +directive(static) directive(inline) ident(VALUE) +ident(call_cfunc)operator(()ident(func)operator(,) ident(recv)operator(,) ident(len)operator(,) ident(argc)operator(,) ident(argv)operator(\)) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + ident(VALUE) ident(recv)operator(;) + pre_type(int) ident(len)operator(,) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(if) operator(()ident(len) operator(>=) integer(0) operator(&&) ident(argc) operator(!=) ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for %d\))delimiter(")>operator(,) + ident(argc)operator(,) ident(len)operator(\);) + operator(}) + + reserved(switch) operator(()ident(len)operator(\)) operator({) + reserved(case) operator(-)integer(2)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(rb_ary_new4)operator(()ident(argc)operator(,) ident(argv)operator(\)\);) + reserved(break)operator(;) + reserved(case) operator(-)integer(1)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(argc)operator(,) ident(argv)operator(,) ident(recv)operator(\);) + reserved(break)operator(;) + reserved(case) integer(0)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(\);) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(2)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(3)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(4)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(5)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(6)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(7)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(],) ident(argv)operator([)integer(6)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(8)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(],) ident(argv)operator([)integer(6)operator(],) ident(argv)operator([)integer(7)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(9)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(],) ident(argv)operator([)integer(6)operator(],) ident(argv)operator([)integer(7)operator(],) ident(argv)operator([)integer(8)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(10)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(],) ident(argv)operator([)integer(6)operator(],) ident(argv)operator([)integer(7)operator(],) ident(argv)operator([)integer(8)operator(],) ident(argv)operator([)integer(9)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(11)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(],) ident(argv)operator([)integer(6)operator(],) ident(argv)operator([)integer(7)operator(],) ident(argv)operator([)integer(8)operator(],) ident(argv)operator([)integer(9)operator(],) ident(argv)operator([)integer(10)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(12)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(],) ident(argv)operator([)integer(6)operator(],) ident(argv)operator([)integer(7)operator(],) ident(argv)operator([)integer(8)operator(],) ident(argv)operator([)integer(9)operator(],) + ident(argv)operator([)integer(10)operator(],) ident(argv)operator([)integer(11)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(13)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(],) ident(argv)operator([)integer(6)operator(],) ident(argv)operator([)integer(7)operator(],) ident(argv)operator([)integer(8)operator(],) ident(argv)operator([)integer(9)operator(],) ident(argv)operator([)integer(10)operator(],) + ident(argv)operator([)integer(11)operator(],) ident(argv)operator([)integer(12)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(14)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(],) ident(argv)operator([)integer(6)operator(],) ident(argv)operator([)integer(7)operator(],) ident(argv)operator([)integer(8)operator(],) ident(argv)operator([)integer(9)operator(],) ident(argv)operator([)integer(10)operator(],) + ident(argv)operator([)integer(11)operator(],) ident(argv)operator([)integer(12)operator(],) ident(argv)operator([)integer(13)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(15)operator(:) + reserved(return) operator((*)ident(func)operator(\)()ident(recv)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(],) ident(argv)operator([)integer(3)operator(],) ident(argv)operator([)integer(4)operator(],) + ident(argv)operator([)integer(5)operator(],) ident(argv)operator([)integer(6)operator(],) ident(argv)operator([)integer(7)operator(],) ident(argv)operator([)integer(8)operator(],) ident(argv)operator([)integer(9)operator(],) ident(argv)operator([)integer(10)operator(],) + ident(argv)operator([)integer(11)operator(],) ident(argv)operator([)integer(12)operator(],) ident(argv)operator([)integer(13)operator(],) ident(argv)operator([)integer(14)operator(]\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(too many arguments (%d\))delimiter(")>operator(,) ident(len)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +directive(static) ident(VALUE) +ident(rb_call0)operator(()ident(klass)operator(,) ident(recv)operator(,) ident(id)operator(,) ident(oid)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(body)operator(,) ident(flags)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(recv)operator(;) + ident(ID) ident(id)operator(;) + ident(ID) ident(oid)operator(;) + pre_type(int) ident(argc)operator(;) comment(/* OK */) + ident(VALUE) operator(*)ident(argv)operator(;) comment(/* OK */) + ident(NODE) operator(*) directive(volatile) ident(body)operator(;) + pre_type(int) ident(flags)operator(;) +operator({) + ident(NODE) operator(*)ident(b2)operator(;) comment(/* OK */) + directive(volatile) ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) + pre_type(int) ident(itr)operator(;) + directive(static) pre_type(int) ident(tick)operator(;) + ident(TMP_PROTECT)operator(;) + directive(volatile) pre_type(int) ident(safe) operator(=) operator(-)integer(1)operator(;) + + reserved(if) operator(()ident(NOEX_SAFE)operator(()ident(flags)operator(\)) operator(>) ident(ruby_safe_level) operator(&&) ident(NOEX_SAFE)operator(()ident(flags)operator(\)) operator(>) integer(2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(calling insecure method: %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(switch) operator(()ident(ruby_iter)operator(->)ident(iter)operator(\)) operator({) + reserved(case) label(ITER_PRE)operator(:) + reserved(case) label(ITER_PAS)operator(:) + ident(itr) operator(=) ident(ITER_CUR)operator(;) + reserved(break)operator(;) + reserved(case) label(ITER_CUR)operator(:) + reserved(default)operator(:) + ident(itr) operator(=) ident(ITER_NOT)operator(;) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(((++)ident(tick) operator(&) hex(0xff)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(CHECK_INTS)operator(;) comment(/* better than nothing */) + ident(stack_check)operator((\);) + ident(rb_gc_finalize_deferred)operator((\);) + operator(}) + reserved(if) operator(()ident(argc) operator(<) integer(0)operator(\)) operator({) + ident(VALUE) ident(tmp)operator(;) + ident(VALUE) operator(*)ident(nargv)operator(;) + + ident(argc) operator(=) operator(-)ident(argc)operator(-)integer(1)operator(;) + ident(tmp) operator(=) ident(splat_value)operator(()ident(argv)operator([)ident(argc)operator(]\);) + ident(nargv) operator(=) ident(TMP_ALLOC)operator(()ident(argc) operator(+) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len)operator(\);) + ident(MEMCPY)operator(()ident(nargv)operator(,) ident(argv)operator(,) ident(VALUE)operator(,) ident(argc)operator(\);) + ident(MEMCPY)operator(()ident(nargv)operator(+)ident(argc)operator(,) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len)operator(\);) + ident(argc) operator(+=) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len)operator(;) + ident(argv) operator(=) ident(nargv)operator(;) + operator(}) + ident(PUSH_ITER)operator(()ident(itr)operator(\);) + ident(PUSH_FRAME)operator((\);) + + ident(ruby_frame)operator(->)ident(last_func) operator(=) ident(id)operator(;) + ident(ruby_frame)operator(->)ident(orig_func) operator(=) ident(oid)operator(;) + ident(ruby_frame)operator(->)ident(last_class) operator(=) operator(()ident(flags) operator(&) ident(NOEX_NOSUPER)operator(\)?)integer(0)operator(:)ident(klass)operator(;) + ident(ruby_frame)operator(->)ident(self) operator(=) ident(recv)operator(;) + ident(ruby_frame)operator(->)ident(argc) operator(=) ident(argc)operator(;) + ident(ruby_frame)operator(->)ident(flags) operator(=) integer(0)operator(;) + + reserved(switch) operator(()ident(nd_type)operator(()ident(body)operator(\)\)) operator({) + reserved(case) label(NODE_CFUNC)operator(:) + operator({) + pre_type(int) ident(len) operator(=) ident(body)operator(->)ident(nd_argc)operator(;) + + reserved(if) operator(()ident(len) operator(<) operator(-)integer(2)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(bad argc (%d\) specified for `%s(%s\)')delimiter(")>operator(,) + ident(len)operator(,) ident(rb_class2name)operator(()ident(klass)operator(\),) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(if) operator(()ident(event_hooks)operator(\)) operator({) + pre_type(int) ident(state)operator(;) + + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_C_CALL)operator(,) ident(ruby_current_node)operator(,) + ident(recv)operator(,) ident(id)operator(,) ident(klass)operator(\);) + ident(PUSH_TAG)operator(()ident(PROT_FUNC)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(result) operator(=) ident(call_cfunc)operator(()ident(body)operator(->)ident(nd_cfnc)operator(,) ident(recv)operator(,) ident(len)operator(,) ident(argc)operator(,) ident(argv)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + ident(ruby_current_node) operator(=) ident(ruby_frame)operator(->)ident(node)operator(;) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_C_RETURN)operator(,) ident(ruby_current_node)operator(,) + ident(recv)operator(,) ident(id)operator(,) ident(klass)operator(\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(call_cfunc)operator(()ident(body)operator(->)ident(nd_cfnc)operator(,) ident(recv)operator(,) ident(len)operator(,) ident(argc)operator(,) ident(argv)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + comment(/* for attr get/set */) + reserved(case) label(NODE_IVAR)operator(:) + reserved(if) operator(()ident(argc) operator(!=) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 0\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + ident(result) operator(=) ident(rb_attr_get)operator(()ident(recv)operator(,) ident(body)operator(->)ident(nd_vid)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_ATTRSET)operator(:) + reserved(if) operator(()ident(argc) operator(!=) integer(1)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 1\))delimiter(")>operator(,) ident(argc)operator(\);) + ident(result) operator(=) ident(rb_ivar_set)operator(()ident(recv)operator(,) ident(body)operator(->)ident(nd_vid)operator(,) ident(argv)operator([)integer(0)operator(]\);) + reserved(break)operator(;) + + reserved(case) label(NODE_ZSUPER)operator(:) + ident(result) operator(=) ident(rb_call_super)operator(()ident(argc)operator(,) ident(argv)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_DMETHOD)operator(:) + ident(result) operator(=) ident(method_call)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(umethod_bind)operator(()ident(body)operator(->)ident(nd_cval)operator(,) ident(recv)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(NODE_BMETHOD)operator(:) + ident(ruby_frame)operator(->)ident(flags) operator(|=) ident(FRAME_DMETH)operator(;) + reserved(if) operator(()ident(event_hooks)operator(\)) operator({) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(;) + ident(Data_Get_Struct)operator(()ident(body)operator(->)ident(nd_cval)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(data)operator(\);) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_CALL)operator(,) ident(data)operator(->)ident(body)operator(,) ident(recv)operator(,) ident(id)operator(,) ident(klass)operator(\);) + operator(}) + ident(result) operator(=) ident(proc_invoke)operator(()ident(body)operator(->)ident(nd_cval)operator(,) ident(rb_ary_new4)operator(()ident(argc)operator(,) ident(argv)operator(\),) ident(recv)operator(,) ident(klass)operator(\);) + reserved(if) operator(()ident(event_hooks)operator(\)) operator({) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_RETURN)operator(,) ident(body)operator(,) ident(recv)operator(,) ident(id)operator(,) ident(klass)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_SCOPE)operator(:) + operator({) + pre_type(int) ident(state)operator(;) + ident(VALUE) operator(*)ident(local_vars)operator(;) comment(/* OK */) + ident(NODE) operator(*)ident(saved_cref) operator(=) integer(0)operator(;) + + ident(PUSH_SCOPE)operator((\);) + reserved(if) operator(()ident(body)operator(->)ident(nd_rval)operator(\)) operator({) + ident(saved_cref) operator(=) ident(ruby_cref)operator(;) + ident(ruby_cref) operator(=) operator(()ident(NODE)operator(*\))ident(body)operator(->)ident(nd_rval)operator(;) + operator(}) + ident(PUSH_CLASS)operator(()ident(ruby_cbase)operator(\);) + reserved(if) operator(()ident(body)operator(->)ident(nd_tbl)operator(\)) operator({) + ident(local_vars) operator(=) ident(TMP_ALLOC)operator(()ident(body)operator(->)ident(nd_tbl)operator([)integer(0)operator(]+)integer(1)operator(\);) + operator(*)ident(local_vars)operator(++) operator(=) operator(()ident(VALUE)operator(\))ident(body)operator(;) + ident(rb_mem_clear)operator(()ident(local_vars)operator(,) ident(body)operator(->)ident(nd_tbl)operator([)integer(0)operator(]\);) + ident(ruby_scope)operator(->)ident(local_tbl) operator(=) ident(body)operator(->)ident(nd_tbl)operator(;) + ident(ruby_scope)operator(->)ident(local_vars) operator(=) ident(local_vars)operator(;) + operator(}) + reserved(else) operator({) + ident(local_vars) operator(=) ident(ruby_scope)operator(->)ident(local_vars) operator(=) integer(0)operator(;) + ident(ruby_scope)operator(->)ident(local_tbl) operator(=) integer(0)operator(;) + operator(}) + ident(b2) operator(=) ident(body) operator(=) ident(body)operator(->)ident(nd_next)operator(;) + + reserved(if) operator(()ident(NOEX_SAFE)operator(()ident(flags)operator(\)) operator(>) ident(ruby_safe_level)operator(\)) operator({) + ident(safe) operator(=) ident(ruby_safe_level)operator(;) + ident(ruby_safe_level) operator(=) ident(NOEX_SAFE)operator(()ident(flags)operator(\);) + operator(}) + ident(PUSH_VARS)operator((\);) + ident(PUSH_TAG)operator(()ident(PROT_FUNC)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(NODE) operator(*)ident(node) operator(=) integer(0)operator(;) + pre_type(int) ident(i)operator(,) ident(nopt) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(nd_type)operator(()ident(body)operator(\)) operator(==) ident(NODE_ARGS)operator(\)) operator({) + ident(node) operator(=) ident(body)operator(;) + ident(body) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(nd_type)operator(()ident(body)operator(\)) operator(==) ident(NODE_BLOCK)operator(\)) operator({) + ident(node) operator(=) ident(body)operator(->)ident(nd_head)operator(;) + ident(body) operator(=) ident(body)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(if) operator(()ident(node)operator(\)) operator({) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(!=) ident(NODE_ARGS)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(no argument-node)delimiter(")>operator(\);) + operator(}) + + ident(i) operator(=) ident(node)operator(->)ident(nd_cnt)operator(;) + reserved(if) operator(()ident(i) operator(>) ident(argc)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for %d\))delimiter(")>operator(,) + ident(argc)operator(,) ident(i)operator(\);) + operator(}) + reserved(if) operator((!)ident(node)operator(->)ident(nd_rest)operator(\)) operator({) + ident(NODE) operator(*)ident(optnode) operator(=) ident(node)operator(->)ident(nd_opt)operator(;) + + ident(nopt) operator(=) ident(i)operator(;) + reserved(while) operator(()ident(optnode)operator(\)) operator({) + ident(nopt)operator(++;) + ident(optnode) operator(=) ident(optnode)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(if) operator(()ident(nopt) operator(<) ident(argc)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) + string<delimiter(")content(wrong number of arguments (%d for %d\))delimiter(")>operator(,) + ident(argc)operator(,) ident(nopt)operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(local_vars)operator(\)) operator({) + reserved(if) operator(()ident(i) operator(>) integer(0)operator(\)) operator({) + comment(/* +2 for $_ and $~ */) + ident(MEMCPY)operator(()ident(local_vars)operator(+)integer(2)operator(,) ident(argv)operator(,) ident(VALUE)operator(,) ident(i)operator(\);) + operator(}) + operator(}) + ident(argv) operator(+=) ident(i)operator(;) ident(argc) operator(-=) ident(i)operator(;) + reserved(if) operator(()ident(node)operator(->)ident(nd_opt)operator(\)) operator({) + ident(NODE) operator(*)ident(opt) operator(=) ident(node)operator(->)ident(nd_opt)operator(;) + + reserved(while) operator(()ident(opt) operator(&&) ident(argc)operator(\)) operator({) + ident(assign)operator(()ident(recv)operator(,) ident(opt)operator(->)ident(nd_head)operator(,) operator(*)ident(argv)operator(,) integer(1)operator(\);) + ident(argv)operator(++;) ident(argc)operator(--;) + operator(++)ident(i)operator(;) + ident(opt) operator(=) ident(opt)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(if) operator(()ident(opt)operator(\)) operator({) + ident(rb_eval)operator(()ident(recv)operator(,) ident(opt)operator(\);) + reserved(while) operator(()ident(opt)operator(\)) operator({) + ident(opt) operator(=) ident(opt)operator(->)ident(nd_next)operator(;) + operator(++)ident(i)operator(;) + operator(}) + operator(}) + operator(}) + reserved(if) operator((!)ident(node)operator(->)ident(nd_rest)operator(\)) operator({) + ident(i) operator(=) ident(nopt)operator(;) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(v)operator(;) + + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + ident(v) operator(=) ident(rb_ary_new4)operator(()ident(argc)operator(,)ident(argv)operator(\);) + ident(i) operator(=) operator(-)ident(i) operator(-) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(v) operator(=) ident(rb_ary_new2)operator(()integer(0)operator(\);) + operator(}) + ident(assign)operator(()ident(recv)operator(,) ident(node)operator(->)ident(nd_rest)operator(,) ident(v)operator(,) integer(1)operator(\);) + operator(}) + ident(ruby_frame)operator(->)ident(argc) operator(=) ident(i)operator(;) + operator(}) + reserved(if) operator(()ident(event_hooks)operator(\)) operator({) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_CALL)operator(,) ident(b2)operator(,) ident(recv)operator(,) ident(id)operator(,) ident(klass)operator(\);) + operator(}) + ident(result) operator(=) ident(rb_eval)operator(()ident(recv)operator(,) ident(body)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_RETURN) operator(&&) ident(TAG_DST)operator((\)\)) operator({) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + ident(state) operator(=) integer(0)operator(;) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(event_hooks)operator(\)) operator({) + ident(EXEC_EVENT_HOOK)operator(()ident(RUBY_EVENT_RETURN)operator(,) ident(body)operator(,) ident(recv)operator(,) ident(id)operator(,) ident(klass)operator(\);) + operator(}) + ident(POP_VARS)operator((\);) + ident(POP_CLASS)operator((\);) + ident(POP_SCOPE)operator((\);) + ident(ruby_cref) operator(=) ident(saved_cref)operator(;) + reserved(if) operator(()ident(safe) operator(>=) integer(0)operator(\)) ident(ruby_safe_level) operator(=) ident(safe)operator(;) + reserved(switch) operator(()ident(state)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(break)operator(;) + + reserved(case) label(TAG_BREAK)operator(:) + reserved(case) label(TAG_RETURN)operator(:) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + reserved(break)operator(;) + + reserved(case) label(TAG_RETRY)operator(:) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + comment(/* fall through */) + reserved(default)operator(:) + ident(jump_tag_but_local_jump)operator(()ident(state)operator(,) ident(result)operator(\);) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(unknown_node)operator(()ident(body)operator(\);) + reserved(break)operator(;) + operator(}) + ident(POP_FRAME)operator((\);) + ident(POP_ITER)operator((\);) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_call)operator(()ident(klass)operator(,) ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(scope)operator(,) ident(self)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(recv)operator(;) + ident(ID) ident(mid)operator(;) + pre_type(int) ident(argc)operator(;) comment(/* OK */) + directive(const) ident(VALUE) operator(*)ident(argv)operator(;) comment(/* OK */) + pre_type(int) ident(scope)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(NODE) operator(*)ident(body)operator(;) comment(/* OK */) + pre_type(int) ident(noex)operator(;) + ident(ID) ident(id) operator(=) ident(mid)operator(;) + reserved(struct) ident(cache_entry) operator(*)ident(ent)operator(;) + + reserved(if) operator((!)ident(klass)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eNotImpError)operator(,) string<delimiter(")content(method `%s' called on terminated object (0x%lx\))delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(mid)operator(\),) ident(recv)operator(\);) + operator(}) + comment(/* is it in the method cache? */) + ident(ent) operator(=) ident(cache) operator(+) ident(EXPR1)operator(()ident(klass)operator(,) ident(mid)operator(\);) + reserved(if) operator(()ident(ent)operator(->)ident(mid) operator(==) ident(mid) operator(&&) ident(ent)operator(->)ident(klass) operator(==) ident(klass)operator(\)) operator({) + reserved(if) operator((!)ident(ent)operator(->)ident(method)operator(\)) + reserved(return) ident(method_missing)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(scope)operator(==)integer(2)operator(?)label(CSTAT_VCALL)operator(:)integer(0)operator(\);) + ident(klass) operator(=) ident(ent)operator(->)ident(origin)operator(;) + ident(id) operator(=) ident(ent)operator(->)ident(mid0)operator(;) + ident(noex) operator(=) ident(ent)operator(->)ident(noex)operator(;) + ident(body) operator(=) ident(ent)operator(->)ident(method)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(body) operator(=) ident(rb_get_method_body)operator((&)ident(klass)operator(,) operator(&)ident(id)operator(,) operator(&)ident(noex)operator(\)\)) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(scope) operator(==) integer(3)operator(\)) operator({) + reserved(return) ident(method_missing)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(CSTAT_SUPER)operator(\);) + operator(}) + reserved(return) ident(method_missing)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(scope)operator(==)integer(2)operator(?)label(CSTAT_VCALL)operator(:)integer(0)operator(\);) + operator(}) + + reserved(if) operator(()ident(mid) operator(!=) ident(missing) operator(&&) ident(scope) operator(==) integer(0)operator(\)) operator({) + comment(/* receiver specified form for private method */) + reserved(if) operator(()ident(noex) operator(&) ident(NOEX_PRIVATE)operator(\)) + reserved(return) ident(method_missing)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(CSTAT_PRIV)operator(\);) + + comment(/* self must be kind of a specified form for protected method */) + reserved(if) operator(()ident(noex) operator(&) ident(NOEX_PROTECTED)operator(\)) operator({) + ident(VALUE) ident(defined_class) operator(=) ident(klass)operator(;) + + reserved(if) operator(()ident(self) operator(==) ident(Qundef)operator(\)) ident(self) operator(=) ident(ruby_frame)operator(->)ident(self)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(defined_class)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(defined_class) operator(=) ident(RBASIC)operator(()ident(defined_class)operator(\)->)ident(klass)operator(;) + operator(}) + reserved(if) operator((!)ident(rb_obj_is_kind_of)operator(()ident(self)operator(,) ident(rb_class_real)operator(()ident(defined_class)operator(\)\)\)) + reserved(return) ident(method_missing)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(CSTAT_PROT)operator(\);) + operator(}) + operator(}) + + reserved(return) ident(rb_call0)operator(()ident(klass)operator(,) ident(recv)operator(,) ident(mid)operator(,) ident(id)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(body)operator(,) ident(noex)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_apply)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(args)operator(\)) + ident(VALUE) ident(recv)operator(;) + ident(ID) ident(mid)operator(;) + ident(VALUE) ident(args)operator(;) +operator({) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + + ident(argc) operator(=) ident(RARRAY)operator(()ident(args)operator(\)->)ident(len)operator(;) comment(/* Assigns LONG, but argc is INT */) + ident(argv) operator(=) ident(ALLOCA_N)operator(()ident(VALUE)operator(,) ident(argc)operator(\);) + ident(MEMCPY)operator(()ident(argv)operator(,) ident(RARRAY)operator(()ident(args)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(argc)operator(\);) + reserved(return) ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),) ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(,) integer(1)operator(,) ident(Qundef)operator(\);) +operator(}) + +comment(/* + * call-seq: + * obj.send(symbol [, args...]\) => obj + * obj.__send__(symbol [, args...]\) => obj + * + * Invokes the method identified by _symbol_, passing it any + * arguments specified. You can use <code>\\_\\_send__</code> if the name + * +send+ clashes with an existing method in _obj_. + * + * class Klass + * def hello(*args\) + * "Hello " + args.join(' '\) + * end + * end + * k = Klass.new + * k.send :hello, "gentle", "readers" #=> "Hello gentle readers" + */) + +directive(static) ident(VALUE) +ident(rb_f_send)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(recv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(recv)operator(;) +operator({) + ident(VALUE) ident(vid)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(no method name given)delimiter(")>operator(\);) + + ident(vid) operator(=) operator(*)ident(argv)operator(++;) ident(argc)operator(--;) + ident(PUSH_ITER)operator(()ident(rb_block_given_p)operator((\)?)label(ITER_PRE)operator(:)ident(ITER_NOT)operator(\);) + ident(vid) operator(=) ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),) ident(recv)operator(,) ident(rb_to_id)operator(()ident(vid)operator(\),) ident(argc)operator(,) ident(argv)operator(,) integer(1)operator(,) ident(Qundef)operator(\);) + ident(POP_ITER)operator((\);) + + reserved(return) ident(vid)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(vafuncall)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(n)operator(,) ident(ar)operator(\)) + ident(VALUE) ident(recv)operator(;) + ident(ID) ident(mid)operator(;) + pre_type(int) ident(n)operator(;) + ident(va_list) operator(*)ident(ar)operator(;) +operator({) + ident(VALUE) operator(*)ident(argv)operator(;) + + reserved(if) operator(()ident(n) operator(>) integer(0)operator(\)) operator({) + pre_type(long) ident(i)operator(;) + + ident(argv) operator(=) ident(ALLOCA_N)operator(()ident(VALUE)operator(,) ident(n)operator(\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(n)operator(;)ident(i)operator(++\)) operator({) + ident(argv)operator([)ident(i)operator(]) operator(=) ident(va_arg)operator((*)ident(ar)operator(,) ident(VALUE)operator(\);) + operator(}) + ident(va_end)operator((*)ident(ar)operator(\);) + operator(}) + reserved(else) operator({) + ident(argv) operator(=) integer(0)operator(;) + operator(}) + + reserved(return) ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),) ident(recv)operator(,) ident(mid)operator(,) ident(n)operator(,) ident(argv)operator(,) integer(1)operator(,) ident(Qundef)operator(\);) +operator(}) + +ident(VALUE) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_funcall)operator(()ident(VALUE) ident(recv)operator(,) ident(ID) ident(mid)operator(,) pre_type(int) ident(n)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_funcall)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(n)operator(,) ident(va_alist)operator(\)) + ident(VALUE) ident(recv)operator(;) + ident(ID) ident(mid)operator(;) + pre_type(int) ident(n)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(va_list) ident(ar)operator(;) + ident(va_init_list)operator(()ident(ar)operator(,) ident(n)operator(\);) + + reserved(return) ident(vafuncall)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(n)operator(,) operator(&)ident(ar)operator(\);) +operator(}) + +ident(VALUE) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_funcall_rescue)operator(()ident(VALUE) ident(recv)operator(,) ident(ID) ident(mid)operator(,) pre_type(int) ident(n)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_funcall_rescue)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(n)operator(,) ident(va_alist)operator(\)) + ident(VALUE) ident(recv)operator(;) + ident(ID) ident(mid)operator(;) + pre_type(int) ident(n)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) comment(/* OK */) + pre_type(int) ident(status)operator(;) + ident(va_list) ident(ar)operator(;) + + ident(va_init_list)operator(()ident(ar)operator(,) ident(n)operator(\);) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(status) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(result) operator(=) ident(vafuncall)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(n)operator(,) operator(&)ident(ar)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(switch) operator(()ident(status)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(return) ident(result)operator(;) + reserved(case) label(TAG_RAISE)operator(:) + reserved(return) ident(Qundef)operator(;) + reserved(default)operator(:) + ident(JUMP_TAG)operator(()ident(status)operator(\);) + operator(}) +operator(}) + +ident(VALUE) +ident(rb_funcall2)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(\)) + ident(VALUE) ident(recv)operator(;) + ident(ID) ident(mid)operator(;) + pre_type(int) ident(argc)operator(;) + directive(const) ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(return) ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),) ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(,) integer(1)operator(,) ident(Qundef)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_funcall3)operator(()ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(\)) + ident(VALUE) ident(recv)operator(;) + ident(ID) ident(mid)operator(;) + pre_type(int) ident(argc)operator(;) + directive(const) ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(return) ident(rb_call)operator(()ident(CLASS_OF)operator(()ident(recv)operator(\),) ident(recv)operator(,) ident(mid)operator(,) ident(argc)operator(,) ident(argv)operator(,) integer(0)operator(,) ident(Qundef)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_call_super)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + directive(const) ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(result)operator(,) ident(self)operator(,) ident(klass)operator(;) + + reserved(if) operator(()ident(ruby_frame)operator(->)ident(last_class) operator(==) integer(0)operator(\)) operator({) + ident(rb_name_error)operator(()ident(ruby_frame)operator(->)ident(last_func)operator(,) string<delimiter(")content(calling `super' from `%s' is prohibited)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(ruby_frame)operator(->)ident(orig_func)operator(\)\);) + operator(}) + + ident(self) operator(=) ident(ruby_frame)operator(->)ident(self)operator(;) + ident(klass) operator(=) ident(ruby_frame)operator(->)ident(last_class)operator(;) + reserved(if) operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(method_missing)operator(()ident(self)operator(,) ident(ruby_frame)operator(->)ident(orig_func)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(CSTAT_SUPER)operator(\);) + operator(}) + + ident(PUSH_ITER)operator(()ident(ruby_iter)operator(->)ident(iter) operator(?) ident(ITER_PRE) operator(:) ident(ITER_NOT)operator(\);) + ident(result) operator(=) ident(rb_call)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(,) ident(self)operator(,) ident(ruby_frame)operator(->)ident(orig_func)operator(,) ident(argc)operator(,) ident(argv)operator(,) integer(3)operator(,) ident(Qundef)operator(\);) + ident(POP_ITER)operator((\);) + + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(backtrace)operator(()ident(lev)operator(\)) + pre_type(int) ident(lev)operator(;) +operator({) + reserved(struct) ident(FRAME) operator(*)ident(frame) operator(=) ident(ruby_frame)operator(;) + pre_type(char) ident(buf)operator([)ident(BUFSIZ)operator(];) + ident(VALUE) ident(ary)operator(;) + ident(NODE) operator(*)ident(n)operator(;) + + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + reserved(if) operator(()ident(frame)operator(->)ident(last_func) operator(==) ident(ID_ALLOCATOR)operator(\)) operator({) + ident(frame) operator(=) ident(frame)operator(->)ident(prev)operator(;) + operator(}) + reserved(if) operator(()ident(lev) operator(<) integer(0)operator(\)) operator({) + ident(ruby_set_current_source)operator((\);) + reserved(if) operator(()ident(frame)operator(->)ident(last_func)operator(\)) operator({) + ident(snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) string<delimiter(")content(%s:%d:in `%s')delimiter(")>operator(,) + ident(ruby_sourcefile)operator(,) ident(ruby_sourceline)operator(,) + ident(rb_id2name)operator(()ident(frame)operator(->)ident(last_func)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(ruby_sourceline) operator(==) integer(0)operator(\)) operator({) + ident(snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) string<delimiter(")content(%s)delimiter(")>operator(,) ident(ruby_sourcefile)operator(\);) + operator(}) + reserved(else) operator({) + ident(snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) string<delimiter(")content(%s:%d)delimiter(")>operator(,) ident(ruby_sourcefile)operator(,) ident(ruby_sourceline)operator(\);) + operator(}) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(buf)operator(\)\);) + reserved(if) operator(()ident(lev) operator(<) operator(-)integer(1)operator(\)) reserved(return) ident(ary)operator(;) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(lev)operator(--) operator(>) integer(0)operator(\)) operator({) + ident(frame) operator(=) ident(frame)operator(->)ident(prev)operator(;) + reserved(if) operator((!)ident(frame)operator(\)) operator({) + ident(ary) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + operator(}) + reserved(for) operator((;) ident(frame) operator(&&) operator(()ident(n) operator(=) ident(frame)operator(->)ident(node)operator(\);) ident(frame) operator(=) ident(frame)operator(->)ident(prev)operator(\)) operator({) + reserved(if) operator(()ident(frame)operator(->)ident(prev) operator(&&) ident(frame)operator(->)ident(prev)operator(->)ident(last_func)operator(\)) operator({) + reserved(if) operator(()ident(frame)operator(->)ident(prev)operator(->)ident(node) operator(==) ident(n)operator(\)) operator({) + reserved(if) operator(()ident(frame)operator(->)ident(prev)operator(->)ident(last_func) operator(==) ident(frame)operator(->)ident(last_func)operator(\)) reserved(continue)operator(;) + operator(}) + ident(snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) string<delimiter(")content(%s:%d:in `%s')delimiter(")>operator(,) + ident(n)operator(->)ident(nd_file)operator(,) ident(nd_line)operator(()ident(n)operator(\),) + ident(rb_id2name)operator(()ident(frame)operator(->)ident(prev)operator(->)ident(last_func)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(snprintf)operator(()ident(buf)operator(,) ident(BUFSIZ)operator(,) string<delimiter(")content(%s:%d)delimiter(")>operator(,) ident(n)operator(->)ident(nd_file)operator(,) ident(nd_line)operator(()ident(n)operator(\)\);) + operator(}) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(buf)operator(\)\);) + operator(}) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * caller(start=1\) => array + * + * Returns the current execution stack---an array containing strings in + * the form ``<em>file:line</em>'' or ``<em>file:line: in + * `method'</em>''. The optional _start_ parameter + * determines the number of initial stack entries to omit from the + * result. + * + * def a(skip\) + * caller(skip\) + * end + * def b(skip\) + * a(skip\) + * end + * def c(skip\) + * b(skip\) + * end + * c(0\) #=> ["prog:2:in `a'", "prog:5:in `b'", "prog:8:in `c'", "prog:10"] + * c(1\) #=> ["prog:5:in `b'", "prog:8:in `c'", "prog:11"] + * c(2\) #=> ["prog:8:in `c'", "prog:12"] + * c(3\) #=> ["prog:13"] + */) + +directive(static) ident(VALUE) +ident(rb_f_caller)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(level)operator(;) + pre_type(int) ident(lev)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(level)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(level)operator(\)\)) ident(lev) operator(=) integer(1)operator(;) + reserved(else) ident(lev) operator(=) ident(NUM2INT)operator(()ident(level)operator(\);) + reserved(if) operator(()ident(lev) operator(<) integer(0)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative level (%d\))delimiter(")>operator(,) ident(lev)operator(\);) + + reserved(return) ident(backtrace)operator(()ident(lev)operator(\);) +operator(}) + +directive(void) +ident(rb_backtrace)operator((\)) +operator({) + pre_type(long) ident(i)operator(;) + ident(VALUE) ident(ary)operator(;) + + ident(ary) operator(=) ident(backtrace)operator((-)integer(1)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(printf)operator(()string<delimiter(")char(\\t)content(from %s)char(\\n)delimiter(")>operator(,) ident(RSTRING)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)->)ident(ptr)operator(\);) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(make_backtrace)operator((\)) +operator({) + reserved(return) ident(backtrace)operator((-)integer(1)operator(\);) +operator(}) + +ident(ID) +ident(rb_frame_last_func)operator((\)) +operator({) + reserved(return) ident(ruby_frame)operator(->)ident(last_func)operator(;) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(compile)operator(()ident(src)operator(,) ident(file)operator(,) ident(line)operator(\)) + ident(VALUE) ident(src)operator(;) + pre_type(char) operator(*)ident(file)operator(;) + pre_type(int) ident(line)operator(;) +operator({) + ident(NODE) operator(*)ident(node)operator(;) + pre_type(int) ident(critical)operator(;) + + ident(ruby_nerrs) operator(=) integer(0)operator(;) + ident(StringValue)operator(()ident(src)operator(\);) + ident(critical) operator(=) ident(rb_thread_critical)operator(;) + ident(rb_thread_critical) operator(=) ident(Qtrue)operator(;) + ident(node) operator(=) ident(rb_compile_string)operator(()ident(file)operator(,) ident(src)operator(,) ident(line)operator(\);) + ident(rb_thread_critical) operator(=) ident(critical)operator(;) + + reserved(if) operator(()ident(ruby_nerrs) operator(==) integer(0)operator(\)) reserved(return) ident(node)operator(;) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(eval)operator(()ident(self)operator(,) ident(src)operator(,) ident(scope)operator(,) ident(file)operator(,) ident(line)operator(\)) + ident(VALUE) ident(self)operator(,) ident(src)operator(,) ident(scope)operator(;) + pre_type(char) operator(*)ident(file)operator(;) + pre_type(int) ident(line)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(data) operator(=) pre_constant(NULL)operator(;) + directive(volatile) ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) + reserved(struct) ident(SCOPE) operator(*) directive(volatile) ident(old_scope)operator(;) + reserved(struct) ident(BLOCK) operator(*) directive(volatile) ident(old_block)operator(;) + reserved(struct) ident(RVarmap) operator(*) directive(volatile) ident(old_dyna_vars)operator(;) + ident(VALUE) directive(volatile) ident(old_cref)operator(;) + pre_type(int) directive(volatile) ident(old_vmode)operator(;) + directive(volatile) ident(VALUE) ident(old_wrapper)operator(;) + reserved(struct) ident(FRAME) ident(frame)operator(;) + ident(NODE) operator(*)ident(nodesave) operator(=) ident(ruby_current_node)operator(;) + directive(volatile) pre_type(int) ident(iter) operator(=) ident(ruby_frame)operator(->)ident(iter)operator(;) + directive(volatile) pre_type(int) ident(safe) operator(=) ident(ruby_safe_level)operator(;) + pre_type(int) ident(state)operator(;) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(scope)operator(\)\)) operator({) + reserved(if) operator((!)ident(rb_obj_is_proc)operator(()ident(scope)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type %s (expected Proc/Binding\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(scope)operator(\)\);) + operator(}) + + ident(Data_Get_Struct)operator(()ident(scope)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(data)operator(\);) + comment(/* PUSH BLOCK from data */) + ident(frame) operator(=) ident(data)operator(->)ident(frame)operator(;) + ident(frame)operator(.)ident(tmp) operator(=) ident(ruby_frame)operator(;) comment(/* gc protection */) + ident(ruby_frame) operator(=) operator(&()ident(frame)operator(\);) + ident(old_scope) operator(=) ident(ruby_scope)operator(;) + ident(ruby_scope) operator(=) ident(data)operator(->)ident(scope)operator(;) + ident(old_block) operator(=) ident(ruby_block)operator(;) + ident(ruby_block) operator(=) ident(data)operator(->)ident(prev)operator(;) + ident(old_dyna_vars) operator(=) ident(ruby_dyna_vars)operator(;) + ident(ruby_dyna_vars) operator(=) ident(data)operator(->)ident(dyna_vars)operator(;) + ident(old_vmode) operator(=) ident(scope_vmode)operator(;) + ident(scope_vmode) operator(=) ident(data)operator(->)ident(vmode)operator(;) + ident(old_cref) operator(=) operator(()ident(VALUE)operator(\))ident(ruby_cref)operator(;) + ident(ruby_cref) operator(=) ident(data)operator(->)ident(cref)operator(;) + ident(old_wrapper) operator(=) ident(ruby_wrapper)operator(;) + ident(ruby_wrapper) operator(=) ident(data)operator(->)ident(wrapper)operator(;) + reserved(if) operator((()ident(file) operator(==) integer(0) operator(||) operator(()ident(line) operator(==) integer(1) operator(&&) ident(strcmp)operator(()ident(file)operator(,) string<delimiter(")content((eval\))delimiter(")>operator(\)) operator(==) integer(0)operator(\)\)) operator(&&) ident(data)operator(->)ident(frame)operator(.)ident(node)operator(\)) operator({) + ident(file) operator(=) ident(data)operator(->)ident(frame)operator(.)ident(node)operator(->)ident(nd_file)operator(;) + reserved(if) operator((!)ident(file)operator(\)) ident(file) operator(=) string<delimiter(")content(__builtin__)delimiter(")>operator(;) + ident(line) operator(=) ident(nd_line)operator(()ident(data)operator(->)ident(frame)operator(.)ident(node)operator(\);) + operator(}) + + ident(self) operator(=) ident(data)operator(->)ident(self)operator(;) + ident(ruby_frame)operator(->)ident(iter) operator(=) ident(data)operator(->)ident(iter)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(prev)operator(\)) operator({) + ident(ruby_frame)operator(->)ident(iter) operator(=) ident(ruby_frame)operator(->)ident(prev)operator(->)ident(iter)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(file) operator(==) integer(0)operator(\)) operator({) + ident(ruby_set_current_source)operator((\);) + ident(file) operator(=) ident(ruby_sourcefile)operator(;) + ident(line) operator(=) ident(ruby_sourceline)operator(;) + operator(}) + ident(PUSH_CLASS)operator(()ident(data) operator(?) ident(data)operator(->)ident(klass) operator(:) ident(ruby_class)operator(\);) + ident(ruby_in_eval)operator(++;) + reserved(if) operator(()ident(TYPE)operator(()ident(ruby_class)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(ruby_class) operator(=) ident(RBASIC)operator(()ident(ruby_class)operator(\)->)ident(klass)operator(;) + operator(}) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(NODE) operator(*)ident(node)operator(;) + + ident(ruby_safe_level) operator(=) integer(0)operator(;) + ident(result) operator(=) ident(ruby_errinfo)operator(;) + ident(ruby_errinfo) operator(=) ident(Qnil)operator(;) + ident(node) operator(=) ident(compile)operator(()ident(src)operator(,) ident(file)operator(,) ident(line)operator(\);) + ident(ruby_safe_level) operator(=) ident(safe)operator(;) + reserved(if) operator(()ident(ruby_nerrs) operator(>) integer(0)operator(\)) operator({) + ident(compile_error)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(result)operator(\)\)) ident(ruby_errinfo) operator(=) ident(result)operator(;) + ident(result) operator(=) ident(eval_node)operator(()ident(self)operator(,) ident(node)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + ident(POP_CLASS)operator((\);) + ident(ruby_in_eval)operator(--;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(scope)operator(\)\)) operator({) + pre_type(int) ident(dont_recycle) operator(=) ident(ruby_scope)operator(->)ident(flags) operator(&) ident(SCOPE_DONT_RECYCLE)operator(;) + + ident(ruby_wrapper) operator(=) ident(old_wrapper)operator(;) + ident(ruby_cref) operator(=) operator(()ident(NODE)operator(*\))ident(old_cref)operator(;) + ident(ruby_frame) operator(=) ident(frame)operator(.)ident(tmp)operator(;) + ident(ruby_scope) operator(=) ident(old_scope)operator(;) + ident(ruby_block) operator(=) ident(old_block)operator(;) + ident(ruby_dyna_vars) operator(=) ident(old_dyna_vars)operator(;) + ident(data)operator(->)ident(vmode) operator(=) ident(scope_vmode)operator(;) comment(/* write back visibility mode */) + ident(scope_vmode) operator(=) ident(old_vmode)operator(;) + reserved(if) operator(()ident(dont_recycle)operator(\)) operator({) + reserved(struct) ident(tag) operator(*)ident(tag)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(vars)operator(;) + + ident(scope_dup)operator(()ident(ruby_scope)operator(\);) + reserved(for) operator(()ident(tag)operator(=)ident(prot_tag)operator(;) ident(tag)operator(;) ident(tag)operator(=)ident(tag)operator(->)ident(prev)operator(\)) operator({) + ident(scope_dup)operator(()ident(tag)operator(->)ident(scope)operator(\);) + operator(}) + reserved(for) operator(()ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) ident(vars)operator(;) ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(\)) operator({) + ident(FL_SET)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\);) + operator(}) + operator(}) + operator(}) + reserved(else) operator({) + ident(ruby_frame)operator(->)ident(iter) operator(=) ident(iter)operator(;) + operator(}) + ident(ruby_current_node) operator(=) ident(nodesave)operator(;) + ident(ruby_set_current_source)operator((\);) + reserved(if) operator(()ident(state)operator(\)) operator({) + reserved(if) operator(()ident(state) operator(==) ident(TAG_RAISE)operator(\)) operator({) + reserved(if) operator(()ident(strcmp)operator(()ident(file)operator(,) string<delimiter(")content((eval\))delimiter(")>operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(VALUE) ident(mesg)operator(,) ident(errat)operator(,) ident(bt2)operator(;) + + ident(errat) operator(=) ident(get_backtrace)operator(()ident(ruby_errinfo)operator(\);) + ident(mesg) operator(=) ident(rb_attr_get)operator(()ident(ruby_errinfo)operator(,) ident(rb_intern)operator(()string<delimiter(")content(mesg)delimiter(")>operator(\)\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(errat)operator(\)) operator(&&) ident(TYPE)operator(()ident(errat)operator(\)) operator(==) ident(T_ARRAY) operator(&&) + operator(()ident(bt2) operator(=) ident(backtrace)operator((-)integer(2)operator(\),) ident(RARRAY)operator(()ident(bt2)operator(\)->)ident(len) operator(>) integer(0)operator(\)\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(mesg)operator(\)) operator(&&) ident(TYPE)operator(()ident(mesg)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(rb_str_update)operator(()ident(mesg)operator(,) integer(0)operator(,) integer(0)operator(,) ident(rb_str_new2)operator(()string<delimiter(")content(: )delimiter(")>operator(\)\);) + ident(rb_str_update)operator(()ident(mesg)operator(,) integer(0)operator(,) integer(0)operator(,) ident(RARRAY)operator(()ident(errat)operator(\)->)ident(ptr)operator([)integer(0)operator(]\);) + operator(}) + ident(RARRAY)operator(()ident(errat)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(=) ident(RARRAY)operator(()ident(bt2)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + operator(}) + operator(}) + ident(rb_exc_raise)operator(()ident(ruby_errinfo)operator(\);) + operator(}) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + operator(}) + + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * eval(string [, binding [, filename [,lineno]]]\) => obj + * + * Evaluates the Ruby expression(s\) in <em>string</em>. If + * <em>binding</em> is given, the evaluation is performed in its + * context. The binding may be a <code>Binding</code> object or a + * <code>Proc</code> object. If the optional <em>filename</em> and + * <em>lineno</em> parameters are present, they will be used when + * reporting syntax errors. + * + * def getBinding(str\) + * return binding + * end + * str = "hello" + * eval "str + ' Fred'" #=> "hello Fred" + * eval "str + ' Fred'", getBinding("bye"\) #=> "bye Fred" + */) + +directive(static) ident(VALUE) +ident(rb_f_eval)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(VALUE) ident(src)operator(,) ident(scope)operator(,) ident(vfile)operator(,) ident(vline)operator(;) + pre_type(char) operator(*)ident(file) operator(=) string<delimiter(")content((eval\))delimiter(")>operator(;) + pre_type(int) ident(line) operator(=) integer(1)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(13)delimiter(")>operator(,) operator(&)ident(src)operator(,) operator(&)ident(scope)operator(,) operator(&)ident(vfile)operator(,) operator(&)ident(vline)operator(\);) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4)operator(\)) operator({) + ident(StringValue)operator(()ident(src)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(scope)operator(\)) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(scope)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify trusted binding)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(SafeStringValue)operator(()ident(src)operator(\);) + operator(}) + reserved(if) operator(()ident(argc) operator(>=) integer(3)operator(\)) operator({) + ident(StringValue)operator(()ident(vfile)operator(\);) + operator(}) + reserved(if) operator(()ident(argc) operator(>=) integer(4)operator(\)) operator({) + ident(line) operator(=) ident(NUM2INT)operator(()ident(vline)operator(\);) + operator(}) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(vfile)operator(\)\)) ident(file) operator(=) ident(RSTRING)operator(()ident(vfile)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(NIL_P)operator(()ident(scope)operator(\)) operator(&&) ident(ruby_frame)operator(->)ident(prev)operator(\)) operator({) + reserved(struct) ident(FRAME) operator(*)ident(prev)operator(;) + ident(VALUE) ident(val)operator(;) + + ident(prev) operator(=) ident(ruby_frame)operator(;) + ident(PUSH_FRAME)operator((\);) + operator(*)ident(ruby_frame) operator(=) operator(*)ident(prev)operator(->)ident(prev)operator(;) + ident(ruby_frame)operator(->)ident(prev) operator(=) ident(prev)operator(;) + ident(val) operator(=) ident(eval)operator(()ident(self)operator(,) ident(src)operator(,) ident(scope)operator(,) ident(file)operator(,) ident(line)operator(\);) + ident(POP_FRAME)operator((\);) + + reserved(return) ident(val)operator(;) + operator(}) + reserved(return) ident(eval)operator(()ident(self)operator(,) ident(src)operator(,) ident(scope)operator(,) ident(file)operator(,) ident(line)operator(\);) +operator(}) + +comment(/* function to call func under the specified class/module context */) +directive(static) ident(VALUE) +ident(exec_under)operator(()ident(func)operator(,) ident(under)operator(,) ident(cbase)operator(,) ident(args)operator(\)) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + ident(VALUE) ident(under)operator(,) ident(cbase)operator(;) + directive(void) operator(*)ident(args)operator(;) +operator({) + ident(VALUE) ident(val) operator(=) ident(Qnil)operator(;) comment(/* OK */) + pre_type(int) ident(state)operator(;) + pre_type(int) ident(mode)operator(;) + reserved(struct) ident(FRAME) operator(*)ident(f) operator(=) ident(ruby_frame)operator(;) + + ident(PUSH_CLASS)operator(()ident(under)operator(\);) + ident(PUSH_FRAME)operator((\);) + ident(ruby_frame)operator(->)ident(self) operator(=) ident(f)operator(->)ident(self)operator(;) + ident(ruby_frame)operator(->)ident(last_func) operator(=) ident(f)operator(->)ident(last_func)operator(;) + ident(ruby_frame)operator(->)ident(orig_func) operator(=) ident(f)operator(->)ident(orig_func)operator(;) + ident(ruby_frame)operator(->)ident(last_class) operator(=) ident(f)operator(->)ident(last_class)operator(;) + ident(ruby_frame)operator(->)ident(argc) operator(=) ident(f)operator(->)ident(argc)operator(;) + reserved(if) operator(()ident(cbase)operator(\)) operator({) + ident(PUSH_CREF)operator(()ident(cbase)operator(\);) + operator(}) + + ident(mode) operator(=) ident(scope_vmode)operator(;) + ident(SCOPE_SET)operator(()ident(SCOPE_PUBLIC)operator(\);) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(val) operator(=) operator((*)ident(func)operator(\)()ident(args)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(cbase)operator(\)) ident(POP_CREF)operator((\);) + ident(SCOPE_SET)operator(()ident(mode)operator(\);) + ident(POP_FRAME)operator((\);) + ident(POP_CLASS)operator((\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + + reserved(return) ident(val)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(eval_under_i)operator(()ident(args)operator(\)) + ident(VALUE) operator(*)ident(args)operator(;) +operator({) + reserved(struct) ident(FRAME) operator(*)ident(f) operator(=) ident(ruby_frame)operator(;) + + reserved(if) operator(()ident(f) operator(&&) operator(()ident(f) operator(=) ident(f)operator(->)ident(prev)operator(\)) operator(&&) operator(()ident(f) operator(=) ident(f)operator(->)ident(prev)operator(\)\)) operator({) + ident(ruby_frame) operator(=) ident(f)operator(;) + operator(}) + reserved(return) ident(eval)operator(()ident(args)operator([)integer(0)operator(],) ident(args)operator([)integer(1)operator(],) ident(Qnil)operator(,) operator(()pre_type(char)operator(*\))ident(args)operator([)integer(2)operator(],) operator(()pre_type(int)operator(\))ident(args)operator([)integer(3)operator(]\);) +operator(}) + +comment(/* string eval under the class/module context */) +directive(static) ident(VALUE) +ident(eval_under)operator(()ident(under)operator(,) ident(self)operator(,) ident(src)operator(,) ident(file)operator(,) ident(line)operator(\)) + ident(VALUE) ident(under)operator(,) ident(self)operator(,) ident(src)operator(;) + directive(const) pre_type(char) operator(*)ident(file)operator(;) + pre_type(int) ident(line)operator(;) +operator({) + ident(VALUE) ident(args)operator([)integer(4)operator(];) + + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4)operator(\)) operator({) + ident(StringValue)operator(()ident(src)operator(\);) + operator(}) + reserved(else) operator({) + ident(SafeStringValue)operator(()ident(src)operator(\);) + operator(}) + ident(args)operator([)integer(0)operator(]) operator(=) ident(self)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(src)operator(;) + ident(args)operator([)integer(2)operator(]) operator(=) operator(()ident(VALUE)operator(\))ident(file)operator(;) + ident(args)operator([)integer(3)operator(]) operator(=) operator(()ident(VALUE)operator(\))ident(line)operator(;) + reserved(return) ident(exec_under)operator(()ident(eval_under_i)operator(,) ident(under)operator(,) ident(under)operator(,) ident(args)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(yield_under_i)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(rb_yield_0)operator(()ident(self)operator(,) ident(self)operator(,) ident(ruby_class)operator(,) ident(YIELD_PUBLIC_DEF)operator(,) ident(Qfalse)operator(\);) +operator(}) + +comment(/* block eval under the class/module context */) +directive(static) ident(VALUE) +ident(yield_under)operator(()ident(under)operator(,) ident(self)operator(\)) + ident(VALUE) ident(under)operator(,) ident(self)operator(;) +operator({) + reserved(return) ident(exec_under)operator(()ident(yield_under_i)operator(,) ident(under)operator(,) integer(0)operator(,) ident(self)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(specific_eval)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(,) ident(self)operator(;) +operator({) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 0\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + reserved(return) ident(yield_under)operator(()ident(klass)operator(,) ident(self)operator(\);) + operator(}) + reserved(else) operator({) + pre_type(char) operator(*)ident(file) operator(=) string<delimiter(")content((eval\))delimiter(")>operator(;) + pre_type(int) ident(line) operator(=) integer(1)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(block not supplied)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4)operator(\)) operator({) + ident(StringValue)operator(()ident(argv)operator([)integer(0)operator(]\);) + operator(}) + reserved(else) operator({) + ident(SafeStringValue)operator(()ident(argv)operator([)integer(0)operator(]\);) + operator(}) + reserved(if) operator(()ident(argc) operator(>) integer(3)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments: %s(src\) or %s{..})delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\),) + ident(rb_id2name)operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\)\);) + operator(}) + reserved(if) operator(()ident(argc) operator(>) integer(2)operator(\)) ident(line) operator(=) ident(NUM2INT)operator(()ident(argv)operator([)integer(2)operator(]\);) + reserved(if) operator(()ident(argc) operator(>) integer(1)operator(\)) operator({) + ident(file) operator(=) ident(StringValuePtr)operator(()ident(argv)operator([)integer(1)operator(]\);) + operator(}) + operator(}) + reserved(return) ident(eval_under)operator(()ident(klass)operator(,) ident(self)operator(,) ident(argv)operator([)integer(0)operator(],) ident(file)operator(,) ident(line)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * obj.instance_eval(string [, filename [, lineno]] \) => obj + * obj.instance_eval {| | block } => obj + * + * Evaluates a string containing Ruby source code, or the given block, + * within the context of the receiver (_obj_\). In order to set the + * context, the variable +self+ is set to _obj_ while + * the code is executing, giving the code access to _obj_'s + * instance variables. In the version of <code>instance_eval</code> + * that takes a +String+, the optional second and third + * parameters supply a filename and starting line number that are used + * when reporting compilation errors. + * + * class Klass + * def initialize + * @secret = 99 + * end + * end + * k = Klass.new + * k.instance_eval { @secret } #=> 99 + */) + +ident(VALUE) +ident(rb_obj_instance_eval)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(VALUE) ident(klass)operator(;) + + reserved(if) operator(()ident(SPECIAL_CONST_P)operator(()ident(self)operator(\)\)) operator({) + ident(klass) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(else) operator({) + ident(klass) operator(=) ident(rb_singleton_class)operator(()ident(self)operator(\);) + operator(}) + reserved(return) ident(specific_eval)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(,) ident(self)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod.class_eval(string [, filename [, lineno]]\) => obj + * mod.module_eval {|| block } => obj + * + * Evaluates the string or block in the context of _mod_. This can + * be used to add methods to a class. <code>module_eval</code> returns + * the result of evaluating its argument. The optional _filename_ + * and _lineno_ parameters set the text for error messages. + * + * class Thing + * end + * a = %q{def hello(\) "Hello there!" end} + * Thing.module_eval(a\) + * puts Thing.new.hello(\) + * Thing.module_eval("invalid code", "dummy", 123\) + * + * <em>produces:</em> + * + * Hello there! + * dummy:123:in `module_eval': undefined local variable + * or method `code' for Thing:Class + */) + +ident(VALUE) +ident(rb_mod_module_eval)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(mod)operator(;) +operator({) + reserved(return) ident(specific_eval)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(,) ident(mod)operator(\);) +operator(}) + +ident(VALUE) ident(rb_load_path)operator(;) + +ident(NORETURN)operator(()directive(static) directive(void) ident(load_failed) ident(_)operator((()ident(VALUE)operator(\)\)\);) + +directive(void) +ident(rb_load)operator(()ident(fname)operator(,) ident(wrap)operator(\)) + ident(VALUE) ident(fname)operator(;) + pre_type(int) ident(wrap)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + pre_type(int) ident(state)operator(;) + directive(volatile) pre_type(int) ident(prohibit_int) operator(=) ident(rb_prohibit_interrupt)operator(;) + directive(volatile) ident(ID) ident(last_func)operator(;) + directive(volatile) ident(VALUE) ident(wrapper) operator(=) ident(ruby_wrapper)operator(;) + directive(volatile) ident(VALUE) ident(self) operator(=) ident(ruby_top_self)operator(;) + ident(NODE) operator(*)directive(volatile) ident(last_node)operator(;) + ident(NODE) operator(*)ident(saved_cref) operator(=) ident(ruby_cref)operator(;) + + reserved(if) operator(()ident(wrap) operator(&&) ident(ruby_safe_level) operator(>=) integer(4)operator(\)) operator({) + ident(StringValue)operator(()ident(fname)operator(\);) + operator(}) + reserved(else) operator({) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + operator(}) + ident(fname) operator(=) ident(rb_str_new4)operator(()ident(fname)operator(\);) + ident(tmp) operator(=) ident(rb_find_file)operator(()ident(fname)operator(\);) + reserved(if) operator((!)ident(tmp)operator(\)) operator({) + ident(load_failed)operator(()ident(fname)operator(\);) + operator(}) + ident(fname) operator(=) ident(tmp)operator(;) + + ident(ruby_errinfo) operator(=) ident(Qnil)operator(;) comment(/* ensure */) + ident(PUSH_VARS)operator((\);) + ident(PUSH_CLASS)operator(()ident(ruby_wrapper)operator(\);) + ident(ruby_cref) operator(=) ident(ruby_top_cref)operator(;) + reserved(if) operator((!)ident(wrap)operator(\)) operator({) + ident(rb_secure)operator(()integer(4)operator(\);) comment(/* should alter global state */) + ident(ruby_class) operator(=) ident(rb_cObject)operator(;) + ident(ruby_wrapper) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + comment(/* load in anonymous module as toplevel */) + ident(ruby_class) operator(=) ident(ruby_wrapper) operator(=) ident(rb_module_new)operator((\);) + ident(self) operator(=) ident(rb_obj_clone)operator(()ident(ruby_top_self)operator(\);) + ident(rb_extend_object)operator(()ident(self)operator(,) ident(ruby_wrapper)operator(\);) + ident(PUSH_CREF)operator(()ident(ruby_wrapper)operator(\);) + operator(}) + ident(PUSH_ITER)operator(()ident(ITER_NOT)operator(\);) + ident(PUSH_FRAME)operator((\);) + ident(ruby_frame)operator(->)ident(last_func) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(last_class) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(self) operator(=) ident(self)operator(;) + ident(PUSH_SCOPE)operator((\);) + comment(/* default visibility is private at loading toplevel */) + ident(SCOPE_SET)operator(()ident(SCOPE_PRIVATE)operator(\);) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + ident(state) operator(=) ident(EXEC_TAG)operator((\);) + ident(last_func) operator(=) ident(ruby_frame)operator(->)ident(last_func)operator(;) + ident(last_node) operator(=) ident(ruby_current_node)operator(;) + reserved(if) operator((!)ident(ruby_current_node) operator(&&) ident(ruby_sourcefile)operator(\)) operator({) + ident(last_node) operator(=) ident(NEW_NEWLINE)operator(()integer(0)operator(\);) + operator(}) + ident(ruby_current_node) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(state) operator(==) integer(0)operator(\)) operator({) + ident(NODE) operator(*)ident(node)operator(;) + directive(volatile) pre_type(int) ident(critical)operator(;) + + ident(DEFER_INTS)operator(;) + ident(ruby_in_eval)operator(++;) + ident(critical) operator(=) ident(rb_thread_critical)operator(;) + ident(rb_thread_critical) operator(=) ident(Qtrue)operator(;) + ident(rb_load_file)operator(()ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\);) + ident(ruby_in_eval)operator(--;) + ident(node) operator(=) ident(ruby_eval_tree)operator(;) + ident(rb_thread_critical) operator(=) ident(critical)operator(;) + ident(ALLOW_INTS)operator(;) + reserved(if) operator(()ident(ruby_nerrs) operator(==) integer(0)operator(\)) operator({) + ident(eval_node)operator(()ident(self)operator(,) ident(node)operator(\);) + operator(}) + operator(}) + ident(ruby_frame)operator(->)ident(last_func) operator(=) ident(last_func)operator(;) + ident(ruby_current_node) operator(=) ident(last_node)operator(;) + ident(ruby_sourcefile) operator(=) integer(0)operator(;) + ident(ruby_set_current_source)operator((\);) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(flags) operator(==) ident(SCOPE_ALLOCA) operator(&&) ident(ruby_class) operator(==) ident(rb_cObject)operator(\)) operator({) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(local_tbl)operator(\)) comment(/* toplevel was empty */) + ident(free)operator(()ident(ruby_scope)operator(->)ident(local_tbl)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + ident(rb_prohibit_interrupt) operator(=) ident(prohibit_int)operator(;) + ident(ruby_cref) operator(=) ident(saved_cref)operator(;) + ident(POP_SCOPE)operator((\);) + ident(POP_FRAME)operator((\);) + ident(POP_ITER)operator((\);) + ident(POP_CLASS)operator((\);) + ident(POP_VARS)operator((\);) + ident(ruby_wrapper) operator(=) ident(wrapper)operator(;) + reserved(if) operator(()ident(ruby_nerrs) operator(>) integer(0)operator(\)) operator({) + ident(ruby_nerrs) operator(=) integer(0)operator(;) + ident(rb_exc_raise)operator(()ident(ruby_errinfo)operator(\);) + operator(}) + reserved(if) operator(()ident(state)operator(\)) ident(jump_tag_but_local_jump)operator(()ident(state)operator(,) ident(Qundef)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(ruby_errinfo)operator(\)\)) comment(/* exception during load */) + ident(rb_exc_raise)operator(()ident(ruby_errinfo)operator(\);) +operator(}) + +directive(void) +ident(rb_load_protect)operator(()ident(fname)operator(,) ident(wrap)operator(,) ident(state)operator(\)) + ident(VALUE) ident(fname)operator(;) + pre_type(int) ident(wrap)operator(;) + pre_type(int) operator(*)ident(state)operator(;) +operator({) + pre_type(int) ident(status)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(status) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(rb_load)operator(()ident(fname)operator(,) ident(wrap)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) operator(*)ident(state) operator(=) ident(status)operator(;) +operator(}) + +comment(/* + * call-seq: + * load(filename, wrap=false\) => true + * + * Loads and executes the Ruby + * program in the file _filename_. If the filename does not + * resolve to an absolute path, the file is searched for in the library + * directories listed in <code>$:</code>. If the optional _wrap_ + * parameter is +true+, the loaded script will be executed + * under an anonymous module, protecting the calling program's global + * namespace. In no circumstance will any local variables in the loaded + * file be propagated to the loading environment. + */) + + +directive(static) ident(VALUE) +ident(rb_f_load)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(fname)operator(,) ident(wrap)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(fname)operator(,) operator(&)ident(wrap)operator(\);) + ident(rb_load)operator(()ident(fname)operator(,) ident(RTEST)operator(()ident(wrap)operator(\)\);) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +ident(VALUE) ident(ruby_dln_librefs)operator(;) +directive(static) ident(VALUE) ident(rb_features)operator(;) +directive(static) ident(st_table) operator(*)ident(loading_tbl)operator(;) + +preprocessor(#define) ident(IS_SOEXT)operator(()ident(e)operator(\)) operator(()ident(strcmp)operator(()ident(e)operator(,) string<delimiter(")content(.so)delimiter(")>operator(\)) operator(==) integer(0) operator(||) ident(strcmp)operator(()ident(e)operator(,) string<delimiter(")content(.o)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) +preprocessor(#ifdef) ident(DLEXT2) +preprocessor(#define) ident(IS_DLEXT)operator(()ident(e)operator(\)) operator(()ident(strcmp)operator(()ident(e)operator(,) ident(DLEXT)operator(\)) operator(==) integer(0) operator(||) ident(strcmp)operator(()ident(e)operator(,) ident(DLEXT2)operator(\)) operator(==) integer(0)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(IS_DLEXT)operator(()ident(e)operator(\)) operator(()ident(strcmp)operator(()ident(e)operator(,) ident(DLEXT)operator(\)) operator(==) integer(0)operator(\)) +preprocessor(#endif) + + +directive(static) directive(const) pre_type(char) operator(*)directive(const) ident(loadable_ext)operator([]) operator(=) operator({) + string<delimiter(")content(.rb)delimiter(")>operator(,) ident(DLEXT)operator(,) +preprocessor(#ifdef) ident(DLEXT2) + ident(DLEXT2)operator(,) +preprocessor(#endif) + integer(0) +operator(};) + +directive(static) pre_type(int) ident(rb_feature_p) ident(_)operator((()directive(const) pre_type(char) operator(**,) directive(const) pre_type(char) operator(*,) pre_type(int)operator(\)\);) +directive(static) pre_type(int) ident(search_required) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE) operator(*,) ident(VALUE) operator(*\)\);) + +directive(static) pre_type(int) +ident(rb_feature_p)operator(()ident(ftptr)operator(,) ident(ext)operator(,) ident(rb)operator(\)) + directive(const) pre_type(char) operator(**)ident(ftptr)operator(,) operator(*)ident(ext)operator(;) + pre_type(int) ident(rb)operator(;) +operator({) + ident(VALUE) ident(v)operator(;) + directive(const) pre_type(char) operator(*)ident(f)operator(,) operator(*)ident(e)operator(,) operator(*)ident(feature) operator(=) operator(*)ident(ftptr)operator(;) + pre_type(long) ident(i)operator(,) ident(len)operator(,) ident(elen)operator(;) + + reserved(if) operator(()ident(ext)operator(\)) operator({) + ident(len) operator(=) ident(ext) operator(-) ident(feature)operator(;) + ident(elen) operator(=) ident(strlen)operator(()ident(ext)operator(\);) + operator(}) + reserved(else) operator({) + ident(len) operator(=) ident(strlen)operator(()ident(feature)operator(\);) + ident(elen) operator(=) integer(0)operator(;) + operator(}) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RARRAY_LEN)operator(()ident(rb_features)operator(\);) operator(++)ident(i)operator(\)) operator({) + ident(v) operator(=) ident(RARRAY_PTR)operator(()ident(rb_features)operator(\)[)ident(i)operator(];) + ident(f) operator(=) ident(StringValuePtr)operator(()ident(v)operator(\);) + reserved(if) operator(()ident(RSTRING_LEN)operator(()ident(v)operator(\)) operator(<) ident(len) operator(||) ident(strncmp)operator(()ident(f)operator(,) ident(feature)operator(,) ident(len)operator(\)) operator(!=) integer(0)operator(\)) + reserved(continue)operator(;) + reserved(if) operator((!*()ident(e) operator(=) ident(f) operator(+) ident(len)operator(\)\)) operator({) + reserved(if) operator(()ident(ext)operator(\)) reserved(continue)operator(;) + operator(*)ident(ftptr) operator(=) integer(0)operator(;) + reserved(return) char('u')operator(;) + operator(}) + reserved(if) operator((*)ident(e) operator(!=) char('.')operator(\)) reserved(continue)operator(;) + reserved(if) operator(((!)ident(rb) operator(||) operator(!)ident(ext)operator(\)) operator(&&) operator(()ident(IS_SOEXT)operator(()ident(e)operator(\)) operator(||) ident(IS_DLEXT)operator(()ident(e)operator(\)\)\)) operator({) + operator(*)ident(ftptr) operator(=) integer(0)operator(;) + reserved(return) char('s')operator(;) + operator(}) + reserved(if) operator((()ident(rb) operator(||) operator(!)ident(ext)operator(\)) operator(&&) operator(()ident(strcmp)operator(()ident(e)operator(,) string<delimiter(")content(.rb)delimiter(")>operator(\)) operator(==) integer(0)operator(\)\)) operator({) + operator(*)ident(ftptr) operator(=) integer(0)operator(;) + reserved(return) char('r')operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(loading_tbl)operator(\)) operator({) + reserved(if) operator(()ident(st_lookup)operator(()ident(loading_tbl)operator(,) operator(()ident(st_data_t)operator(\))ident(feature)operator(,) operator(()ident(st_data_t) operator(*\))ident(ftptr)operator(\)\)) operator({) + reserved(if) operator((!)ident(ext)operator(\)) reserved(return) char('u')operator(;) + reserved(return) ident(strcmp)operator(()ident(ext)operator(,) string<delimiter(")content(.rb)delimiter(")>operator(\)) operator(?) char('s') operator(:) char('r')operator(;) + operator(}) + reserved(else) operator({) + pre_type(char) operator(*)ident(buf)operator(;) + + reserved(if) operator(()ident(ext) operator(&&) operator(*)ident(ext)operator(\)) reserved(return) integer(0)operator(;) + ident(buf) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(len) operator(+) ident(DLEXT_MAXLEN) operator(+) integer(1)operator(\);) + ident(MEMCPY)operator(()ident(buf)operator(,) ident(feature)operator(,) pre_type(char)operator(,) ident(len)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) operator(()ident(e) operator(=) ident(loadable_ext)operator([)ident(i)operator(]\)) operator(!=) integer(0)operator(;) ident(i)operator(++\)) operator({) + ident(strncpy)operator(()ident(buf) operator(+) ident(len)operator(,) ident(e)operator(,) ident(DLEXT_MAXLEN) operator(+) integer(1)operator(\);) + reserved(if) operator(()ident(st_lookup)operator(()ident(loading_tbl)operator(,) operator(()ident(st_data_t)operator(\))ident(buf)operator(,) operator(()ident(st_data_t) operator(*\))ident(ftptr)operator(\)\)) operator({) + reserved(return) ident(i) operator(?) char('s') operator(:) char('r')operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) +preprocessor(#define) ident(rb_feature_p)operator(()ident(feature)operator(,) ident(ext)operator(,) ident(rb)operator(\)) ident(rb_feature_p)operator((&)ident(feature)operator(,) ident(ext)operator(,) ident(rb)operator(\)) + +pre_type(int) +ident(rb_provided)operator(()ident(feature)operator(\)) + directive(const) pre_type(char) operator(*)ident(feature)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(ext) operator(=) ident(strrchr)operator(()ident(feature)operator(,) char('.')operator(\);) + + reserved(if) operator(()ident(ext) operator(&&) operator(!)ident(strchr)operator(()ident(ext)operator(,) char('/')operator(\)\)) operator({) + reserved(if) operator(()ident(strcmp)operator(()string<delimiter(")content(.rb)delimiter(")>operator(,) ident(ext)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(rb_feature_p)operator(()ident(feature)operator(,) ident(ext)operator(,) ident(Qtrue)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(IS_SOEXT)operator(()ident(ext)operator(\)) operator(||) ident(IS_DLEXT)operator(()ident(ext)operator(\)\)) operator({) + reserved(if) operator(()ident(rb_feature_p)operator(()ident(feature)operator(,) ident(ext)operator(,) ident(Qfalse)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(rb_feature_p)operator(()ident(feature)operator(,) ident(feature) operator(+) ident(strlen)operator(()ident(feature)operator(\),) ident(Qtrue)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) directive(void) +ident(rb_provide_feature)operator(()ident(feature)operator(\)) + ident(VALUE) ident(feature)operator(;) +operator({) + ident(rb_ary_push)operator(()ident(rb_features)operator(,) ident(feature)operator(\);) +operator(}) + +directive(void) +ident(rb_provide)operator(()ident(feature)operator(\)) + directive(const) pre_type(char) operator(*)ident(feature)operator(;) +operator({) + ident(rb_provide_feature)operator(()ident(rb_str_new2)operator(()ident(feature)operator(\)\);) +operator(}) + +directive(static) pre_type(char) operator(*) +ident(load_lock)operator(()ident(ftptr)operator(\)) + directive(const) pre_type(char) operator(*)ident(ftptr)operator(;) +operator({) + ident(st_data_t) ident(th)operator(;) + + reserved(if) operator((!)ident(loading_tbl) operator(||) + operator(!)ident(st_lookup)operator(()ident(loading_tbl)operator(,) operator(()ident(st_data_t)operator(\))ident(ftptr)operator(,) operator(&)ident(th)operator(\)\)) + operator({) + comment(/* loading ruby library should be serialized. */) + reserved(if) operator((!)ident(loading_tbl)operator(\)) operator({) + ident(loading_tbl) operator(=) ident(st_init_strtable)operator((\);) + operator(}) + comment(/* partial state */) + ident(ftptr) operator(=) ident(ruby_strdup)operator(()ident(ftptr)operator(\);) + ident(st_insert)operator(()ident(loading_tbl)operator(,) operator(()ident(st_data_t)operator(\))ident(ftptr)operator(,) operator(()ident(st_data_t)operator(\))ident(curr_thread)operator(\);) + reserved(return) operator(()pre_type(char) operator(*\))ident(ftptr)operator(;) + operator(}) + reserved(do) operator({) + ident(rb_thread_t) ident(owner) operator(=) operator(()ident(rb_thread_t)operator(\))ident(th)operator(;) + reserved(if) operator(()ident(owner) operator(==) ident(curr_thread)operator(\)) reserved(return) integer(0)operator(;) + ident(rb_thread_join)operator(()ident(owner)operator(->)ident(thread)operator(,) operator(-)float(1)float(.0)operator(\);) + operator(}) reserved(while) operator(()ident(st_lookup)operator(()ident(loading_tbl)operator(,) operator(()ident(st_data_t)operator(\))ident(ftptr)operator(,) operator(&)ident(th)operator(\)\);) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) directive(void) +ident(load_unlock)operator(()directive(const) pre_type(char) operator(*)ident(ftptr)operator(\)) +operator({) + reserved(if) operator(()ident(ftptr)operator(\)) operator({) + ident(st_data_t) ident(key) operator(=) operator(()ident(st_data_t)operator(\))ident(ftptr)operator(;) + + reserved(if) operator(()ident(st_delete)operator(()ident(loading_tbl)operator(,) operator(&)ident(key)operator(,) integer(0)operator(\)\)) operator({) + ident(free)operator((()pre_type(char) operator(*\))ident(key)operator(\);) + operator(}) + operator(}) +operator(}) + +comment(/* + * call-seq: + * require(string\) => true or false + * + * Ruby tries to load the library named _string_, returning + * +true+ if successful. If the filename does not resolve to + * an absolute path, it will be searched for in the directories listed + * in <code>$:</code>. If the file has the extension ``.rb'', it is + * loaded as a source file; if the extension is ``.so'', ``.o'', or + * ``.dll'', or whatever the default shared library extension is on + * the current platform, Ruby loads the shared library as a Ruby + * extension. Otherwise, Ruby tries adding ``.rb'', ``.so'', and so on + * to the name. The name of the loaded feature is added to the array in + * <code>$"</code>. A feature will not be loaded if it's name already + * appears in <code>$"</code>. However, the file name is not converted + * to an absolute path, so that ``<code>require 'a';require + * './a'</code>'' will load <code>a.rb</code> twice. + * + * require "my-library.rb" + * require "db-driver" + */) + +ident(VALUE) +ident(rb_f_require)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + reserved(return) ident(rb_require_safe)operator(()ident(fname)operator(,) ident(ruby_safe_level)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(search_required)operator(()ident(fname)operator(,) ident(featurep)operator(,) ident(path)operator(\)) + ident(VALUE) ident(fname)operator(,) operator(*)ident(featurep)operator(,) operator(*)ident(path)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + directive(const) pre_type(char) operator(*)ident(ext)operator(,) operator(*)ident(ftptr)operator(;) + pre_type(int) ident(type)operator(;) + + operator(*)ident(featurep) operator(=) ident(fname)operator(;) + operator(*)ident(path) operator(=) integer(0)operator(;) + ident(ext) operator(=) ident(strrchr)operator(()ident(ftptr) operator(=) ident(RSTRING_PTR)operator(()ident(fname)operator(\),) char('.')operator(\);) + reserved(if) operator(()ident(ext) operator(&&) operator(!)ident(strchr)operator(()ident(ext)operator(,) char('/')operator(\)\)) operator({) + reserved(if) operator(()ident(strcmp)operator(()string<delimiter(")content(.rb)delimiter(")>operator(,) ident(ext)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(rb_feature_p)operator(()ident(ftptr)operator(,) ident(ext)operator(,) ident(Qtrue)operator(\)\)) operator({) + reserved(if) operator(()ident(ftptr)operator(\)) operator(*)ident(path) operator(=) ident(rb_str_new2)operator(()ident(ftptr)operator(\);) + reserved(return) char('r')operator(;) + operator(}) + reserved(if) operator(((*)ident(path) operator(=) ident(rb_find_file)operator(()ident(fname)operator(\)\)) operator(!=) integer(0)operator(\)) reserved(return) char('r')operator(;) + reserved(return) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(IS_SOEXT)operator(()ident(ext)operator(\)\)) operator({) + reserved(if) operator(()ident(rb_feature_p)operator(()ident(ftptr)operator(,) ident(ext)operator(,) ident(Qfalse)operator(\)\)) operator({) + reserved(if) operator(()ident(ftptr)operator(\)) operator(*)ident(path) operator(=) ident(rb_str_new2)operator(()ident(ftptr)operator(\);) + reserved(return) char('s')operator(;) + operator(}) + ident(tmp) operator(=) ident(rb_str_new)operator(()ident(RSTRING_PTR)operator(()ident(fname)operator(\),) ident(ext)operator(-)ident(RSTRING_PTR)operator(()ident(fname)operator(\)\);) + operator(*)ident(featurep) operator(=) ident(tmp)operator(;) +preprocessor(#ifdef) ident(DLEXT2) + ident(OBJ_FREEZE)operator(()ident(tmp)operator(\);) + reserved(if) operator(()ident(rb_find_file_ext)operator((&)ident(tmp)operator(,) ident(loadable_ext)operator(+)integer(1)operator(\)\)) operator({) + operator(*)ident(featurep) operator(=) ident(tmp)operator(;) + operator(*)ident(path) operator(=) ident(rb_find_file)operator(()ident(tmp)operator(\);) + reserved(return) char('s')operator(;) + operator(}) +preprocessor(#else) + ident(rb_str_cat2)operator(()ident(tmp)operator(,) ident(DLEXT)operator(\);) + ident(OBJ_FREEZE)operator(()ident(tmp)operator(\);) + reserved(if) operator(((*)ident(path) operator(=) ident(rb_find_file)operator(()ident(tmp)operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + reserved(return) char('s')operator(;) + operator(}) +preprocessor(#endif) + operator(}) + reserved(else) reserved(if) operator(()ident(IS_DLEXT)operator(()ident(ext)operator(\)\)) operator({) + reserved(if) operator(()ident(rb_feature_p)operator(()ident(ftptr)operator(,) ident(ext)operator(,) ident(Qfalse)operator(\)\)) operator({) + reserved(if) operator(()ident(ftptr)operator(\)) operator(*)ident(path) operator(=) ident(rb_str_new2)operator(()ident(ftptr)operator(\);) + reserved(return) char('s')operator(;) + operator(}) + reserved(if) operator(((*)ident(path) operator(=) ident(rb_find_file)operator(()ident(fname)operator(\)\)) operator(!=) integer(0)operator(\)) reserved(return) char('s')operator(;) + operator(}) + operator(}) + ident(tmp) operator(=) ident(fname)operator(;) + ident(type) operator(=) ident(rb_find_file_ext)operator((&)ident(tmp)operator(,) ident(loadable_ext)operator(\);) + operator(*)ident(featurep) operator(=) ident(tmp)operator(;) + reserved(switch) operator(()ident(type)operator(\)) operator({) + reserved(case) integer(0)operator(:) + ident(type) operator(=) ident(rb_feature_p)operator(()ident(ftptr)operator(,) integer(0)operator(,) ident(Qfalse)operator(\);) + reserved(if) operator(()ident(type) operator(&&) ident(ftptr)operator(\)) operator(*)ident(path) operator(=) ident(rb_str_new2)operator(()ident(ftptr)operator(\);) + reserved(return) ident(type)operator(;) + + reserved(default)operator(:) + ident(ext) operator(=) ident(strrchr)operator(()ident(ftptr) operator(=) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(,) char('.')operator(\);) + reserved(if) operator((!)ident(rb_feature_p)operator(()ident(ftptr)operator(,) ident(ext)operator(,) operator(!--)ident(type)operator(\)\)) + operator(*)ident(path) operator(=) ident(rb_find_file)operator(()ident(tmp)operator(\);) + reserved(else) reserved(if) operator(()ident(ftptr)operator(\)) + operator(*)ident(path) operator(=) ident(rb_str_new2)operator(()ident(ftptr)operator(\);) + operator(}) + reserved(return) ident(type) operator(?) char('s') operator(:) char('r')operator(;) +operator(}) + +directive(static) directive(void) +ident(load_failed)operator(()ident(fname)operator(\)) + ident(VALUE) ident(fname)operator(;) +operator({) + ident(rb_raise)operator(()ident(rb_eLoadError)operator(,) string<delimiter(")content(no such file to load -- %s)delimiter(")>operator(,) ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_require_safe)operator(()ident(fname)operator(,) ident(safe)operator(\)) + ident(VALUE) ident(fname)operator(;) + pre_type(int) ident(safe)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) + directive(volatile) ident(VALUE) ident(errinfo) operator(=) ident(ruby_errinfo)operator(;) + pre_type(int) ident(state)operator(;) + reserved(struct) operator({) + ident(NODE) operator(*)ident(node)operator(;) + ident(ID) ident(func)operator(;) + pre_type(int) ident(vmode)operator(,) ident(safe)operator(;) + operator(}) directive(volatile) ident(saved)operator(;) + pre_type(char) operator(*)directive(volatile) ident(ftptr) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(fname)operator(\)\)) operator({) + ident(rb_check_safe_obj)operator(()ident(fname)operator(\);) + operator(}) + ident(StringValue)operator(()ident(fname)operator(\);) + ident(fname) operator(=) ident(rb_str_new4)operator(()ident(fname)operator(\);) + ident(saved)operator(.)ident(vmode) operator(=) ident(scope_vmode)operator(;) + ident(saved)operator(.)ident(node) operator(=) ident(ruby_current_node)operator(;) + ident(saved)operator(.)ident(func) operator(=) ident(ruby_frame)operator(->)ident(last_func)operator(;) + ident(saved)operator(.)ident(safe) operator(=) ident(ruby_safe_level)operator(;) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(VALUE) ident(feature)operator(,) ident(path)operator(;) + pre_type(long) ident(handle)operator(;) + pre_type(int) ident(found)operator(;) + + ident(ruby_safe_level) operator(=) ident(safe)operator(;) + ident(found) operator(=) ident(search_required)operator(()ident(fname)operator(,) operator(&)ident(feature)operator(,) operator(&)ident(path)operator(\);) + reserved(if) operator(()ident(found)operator(\)) operator({) + reserved(if) operator((!)ident(path) operator(||) operator(!()ident(ftptr) operator(=) ident(load_lock)operator(()ident(RSTRING_PTR)operator(()ident(feature)operator(\)\)\)\)) operator({) + ident(result) operator(=) ident(Qfalse)operator(;) + operator(}) + reserved(else) operator({) + ident(ruby_safe_level) operator(=) integer(0)operator(;) + reserved(switch) operator(()ident(found)operator(\)) operator({) + reserved(case) char('r')operator(:) + ident(rb_load)operator(()ident(path)operator(,) integer(0)operator(\);) + reserved(break)operator(;) + + reserved(case) char('s')operator(:) + ident(ruby_current_node) operator(=) integer(0)operator(;) + ident(ruby_sourcefile) operator(=) ident(rb_source_filename)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) + ident(ruby_sourceline) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(last_func) operator(=) integer(0)operator(;) + ident(SCOPE_SET)operator(()ident(SCOPE_PUBLIC)operator(\);) + ident(handle) operator(=) operator(()pre_type(long)operator(\))ident(dln_load)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) + ident(rb_ary_push)operator(()ident(ruby_dln_librefs)operator(,) ident(LONG2NUM)operator(()ident(handle)operator(\)\);) + reserved(break)operator(;) + operator(}) + ident(rb_provide_feature)operator(()ident(feature)operator(\);) + ident(result) operator(=) ident(Qtrue)operator(;) + operator(}) + operator(}) + operator(}) + ident(POP_TAG)operator((\);) + ident(ruby_current_node) operator(=) ident(saved)operator(.)ident(node)operator(;) + ident(ruby_set_current_source)operator((\);) + ident(ruby_frame)operator(->)ident(last_func) operator(=) ident(saved)operator(.)ident(func)operator(;) + ident(SCOPE_SET)operator(()ident(saved)operator(.)ident(vmode)operator(\);) + ident(ruby_safe_level) operator(=) ident(saved)operator(.)ident(safe)operator(;) + ident(load_unlock)operator(()ident(ftptr)operator(\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(result)operator(\)\)) operator({) + ident(load_failed)operator(()ident(fname)operator(\);) + operator(}) + ident(ruby_errinfo) operator(=) ident(errinfo)operator(;) + + reserved(return) ident(result)operator(;) +operator(}) + +ident(VALUE) +ident(rb_require)operator(()ident(fname)operator(\)) + directive(const) pre_type(char) operator(*)ident(fname)operator(;) +operator({) + ident(VALUE) ident(fn) operator(=) ident(rb_str_new2)operator(()ident(fname)operator(\);) + ident(OBJ_FREEZE)operator(()ident(fn)operator(\);) + reserved(return) ident(rb_require_safe)operator(()ident(fn)operator(,) ident(ruby_safe_level)operator(\);) +operator(}) + +directive(void) +ident(ruby_init_ext)operator(()ident(name)operator(,) ident(init)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + directive(void) operator((*)ident(init)operator(\)) ident(_)operator((()directive(void)operator(\)\);) +operator({) + ident(ruby_current_node) operator(=) integer(0)operator(;) + ident(ruby_sourcefile) operator(=) ident(rb_source_filename)operator(()ident(name)operator(\);) + ident(ruby_sourceline) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(last_func) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(orig_func) operator(=) integer(0)operator(;) + ident(SCOPE_SET)operator(()ident(SCOPE_PUBLIC)operator(\);) + reserved(if) operator(()ident(load_lock)operator(()ident(name)operator(\)\)) operator({) + operator((*)ident(init)operator(\)(\);) + ident(rb_provide)operator(()ident(name)operator(\);) + ident(load_unlock)operator(()ident(name)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(secure_visibility)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(self)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't change method visibility)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(set_method_visibility)operator(()ident(self)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(ex)operator(\)) + ident(VALUE) ident(self)operator(;) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(ID) ident(ex)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + ident(secure_visibility)operator(()ident(self)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(rb_export_method)operator(()ident(self)operator(,) ident(rb_to_id)operator(()ident(argv)operator([)ident(i)operator(]\),) ident(ex)operator(\);) + operator(}) + ident(rb_clear_cache_by_class)operator(()ident(self)operator(\);) +operator(}) + +comment(/* + * call-seq: + * public => self + * public(symbol, ...\) => self + * + * With no arguments, sets the default visibility for subsequently + * defined methods to public. With arguments, sets the named methods to + * have public visibility. + */) + +directive(static) ident(VALUE) +ident(rb_mod_public)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(module)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(module)operator(;) +operator({) + ident(secure_visibility)operator(()ident(module)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(SCOPE_SET)operator(()ident(SCOPE_PUBLIC)operator(\);) + operator(}) + reserved(else) operator({) + ident(set_method_visibility)operator(()ident(module)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(NOEX_PUBLIC)operator(\);) + operator(}) + reserved(return) ident(module)operator(;) +operator(}) + +comment(/* + * call-seq: + * protected => self + * protected(symbol, ...\) => self + * + * With no arguments, sets the default visibility for subsequently + * defined methods to protected. With arguments, sets the named methods + * to have protected visibility. + */) + +directive(static) ident(VALUE) +ident(rb_mod_protected)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(module)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(module)operator(;) +operator({) + ident(secure_visibility)operator(()ident(module)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(SCOPE_SET)operator(()ident(SCOPE_PROTECTED)operator(\);) + operator(}) + reserved(else) operator({) + ident(set_method_visibility)operator(()ident(module)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(NOEX_PROTECTED)operator(\);) + operator(}) + reserved(return) ident(module)operator(;) +operator(}) + +comment(/* + * call-seq: + * private => self + * private(symbol, ...\) => self + * + * With no arguments, sets the default visibility for subsequently + * defined methods to private. With arguments, sets the named methods + * to have private visibility. + * + * module Mod + * def a(\) end + * def b(\) end + * private + * def c(\) end + * private :a + * end + * Mod.private_instance_methods #=> ["a", "c"] + */) + +directive(static) ident(VALUE) +ident(rb_mod_private)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(module)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(module)operator(;) +operator({) + ident(secure_visibility)operator(()ident(module)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(SCOPE_SET)operator(()ident(SCOPE_PRIVATE)operator(\);) + operator(}) + reserved(else) operator({) + ident(set_method_visibility)operator(()ident(module)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(NOEX_PRIVATE)operator(\);) + operator(}) + reserved(return) ident(module)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.public_class_method(symbol, ...\) => mod + * + * Makes a list of existing class methods public. + */) + +directive(static) ident(VALUE) +ident(rb_mod_public_method)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(set_method_visibility)operator(()ident(CLASS_OF)operator(()ident(obj)operator(\),) ident(argc)operator(,) ident(argv)operator(,) ident(NOEX_PUBLIC)operator(\);) + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.private_class_method(symbol, ...\) => mod + * + * Makes existing class methods private. Often used to hide the default + * constructor <code>new</code>. + * + * class SimpleSingleton # Not thread safe + * private_class_method :new + * def SimpleSingleton.create(*args, &block\) + * @me = new(*args, &block\) if ! @me + * @me + * end + * end + */) + +directive(static) ident(VALUE) +ident(rb_mod_private_method)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(set_method_visibility)operator(()ident(CLASS_OF)operator(()ident(obj)operator(\),) ident(argc)operator(,) ident(argv)operator(,) ident(NOEX_PRIVATE)operator(\);) + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * public + * public(symbol, ...\) + * + * With no arguments, sets the default visibility for subsequently + * defined methods to public. With arguments, sets the named methods to + * have public visibility. + */) + +directive(static) ident(VALUE) +ident(top_public)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(return) ident(rb_mod_public)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(rb_cObject)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(top_private)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(return) ident(rb_mod_private)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(rb_cObject)operator(\);) +operator(}) + +comment(/* + * call-seq: + * module_function(symbol, ...\) => self + * + * Creates module functions for the named methods. These functions may + * be called with the module as a receiver, and also become available + * as instance methods to classes that mix in the module. Module + * functions are copies of the original, and so may be changed + * independently. The instance-method versions are made private. If + * used with no arguments, subsequently defined methods become module + * functions. + * + * module Mod + * def one + * "This is one" + * end + * module_function :one + * end + * class Cls + * include Mod + * def callOne + * one + * end + * end + * Mod.one #=> "This is one" + * c = Cls.new + * c.callOne #=> "This is one" + * module Mod + * def one + * "This is the new one" + * end + * end + * Mod.one #=> "This is one" + * c.callOne #=> "This is the new one" + */) + +directive(static) ident(VALUE) +ident(rb_mod_modfunc)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(module)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(module)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + ident(ID) ident(id)operator(;) + ident(NODE) operator(*)ident(body)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(module)operator(\)) operator(!=) ident(T_MODULE)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(module_function must be called for modules)delimiter(")>operator(\);) + operator(}) + + ident(secure_visibility)operator(()ident(module)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(SCOPE_SET)operator(()ident(SCOPE_MODFUNC)operator(\);) + reserved(return) ident(module)operator(;) + operator(}) + + ident(set_method_visibility)operator(()ident(module)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(NOEX_PRIVATE)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(m) operator(=) ident(module)operator(;) + + ident(id) operator(=) ident(rb_to_id)operator(()ident(argv)operator([)ident(i)operator(]\);) + reserved(for) operator((;;\)) operator({) + ident(body) operator(=) ident(search_method)operator(()ident(m)operator(,) ident(id)operator(,) operator(&)ident(m)operator(\);) + reserved(if) operator(()ident(body) operator(==) integer(0)operator(\)) operator({) + ident(body) operator(=) ident(search_method)operator(()ident(rb_cObject)operator(,) ident(id)operator(,) operator(&)ident(m)operator(\);) + operator(}) + reserved(if) operator(()ident(body) operator(==) integer(0) operator(||) ident(body)operator(->)ident(nd_body) operator(==) integer(0)operator(\)) operator({) + ident(print_undef)operator(()ident(module)operator(,) ident(id)operator(\);) + operator(}) + reserved(if) operator(()ident(nd_type)operator(()ident(body)operator(->)ident(nd_body)operator(\)) operator(!=) ident(NODE_ZSUPER)operator(\)) operator({) + reserved(break)operator(;) comment(/* normal case: need not to follow 'super' link */) + operator(}) + ident(m) operator(=) ident(RCLASS)operator(()ident(m)operator(\)->)ident(super)operator(;) + reserved(if) operator((!)ident(m)operator(\)) reserved(break)operator(;) + operator(}) + ident(rb_add_method)operator(()ident(rb_singleton_class)operator(()ident(module)operator(\),) ident(id)operator(,) ident(body)operator(->)ident(nd_body)operator(,) ident(NOEX_PUBLIC)operator(\);) + operator(}) + reserved(return) ident(module)operator(;) +operator(}) + +comment(/* + * call-seq: + * append_features(mod\) => mod + * + * When this module is included in another, Ruby calls + * <code>append_features</code> in this module, passing it the + * receiving module in _mod_. Ruby's default implementation is + * to add the constants, methods, and module variables of this module + * to _mod_ if this module has not already been added to + * _mod_ or one of its ancestors. See also <code>Module#include</code>. + */) + +directive(static) ident(VALUE) +ident(rb_mod_append_features)operator(()ident(module)operator(,) ident(include)operator(\)) + ident(VALUE) ident(module)operator(,) ident(include)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(include)operator(\)\)) operator({) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + ident(Check_Type)operator(()ident(include)operator(,) ident(T_CLASS)operator(\);) + reserved(break)operator(;) + operator(}) + ident(rb_include_module)operator(()ident(include)operator(,) ident(module)operator(\);) + + reserved(return) ident(module)operator(;) +operator(}) + +comment(/* + * call-seq: + * include(module, ...\) => self + * + * Invokes <code>Module.append_features</code> on each parameter in turn. + */) + +directive(static) ident(VALUE) +ident(rb_mod_include)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(module)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(module)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) ident(Check_Type)operator(()ident(argv)operator([)ident(i)operator(],) ident(T_MODULE)operator(\);) + reserved(while) operator(()ident(argc)operator(--\)) operator({) + ident(rb_funcall)operator(()ident(argv)operator([)ident(argc)operator(],) ident(rb_intern)operator(()string<delimiter(")content(append_features)delimiter(")>operator(\),) integer(1)operator(,) ident(module)operator(\);) + ident(rb_funcall)operator(()ident(argv)operator([)ident(argc)operator(],) ident(rb_intern)operator(()string<delimiter(")content(included)delimiter(")>operator(\),) integer(1)operator(,) ident(module)operator(\);) + operator(}) + reserved(return) ident(module)operator(;) +operator(}) + +directive(void) +ident(rb_obj_call_init)operator(()ident(obj)operator(,) ident(argc)operator(,) ident(argv)operator(\)) + ident(VALUE) ident(obj)operator(;) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(PUSH_ITER)operator(()ident(rb_block_given_p)operator((\)?)label(ITER_PRE)operator(:)ident(ITER_NOT)operator(\);) + ident(rb_funcall2)operator(()ident(obj)operator(,) ident(init)operator(,) ident(argc)operator(,) ident(argv)operator(\);) + ident(POP_ITER)operator((\);) +operator(}) + +directive(void) +ident(rb_extend_object)operator(()ident(obj)operator(,) ident(module)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(module)operator(;) +operator({) + ident(rb_include_module)operator(()ident(rb_singleton_class)operator(()ident(obj)operator(\),) ident(module)operator(\);) +operator(}) + +comment(/* + * call-seq: + * extend_object(obj\) => obj + * + * Extends the specified object by adding this module's constants and + * methods (which are added as singleton methods\). This is the callback + * method used by <code>Object#extend</code>. + * + * module Picky + * def Picky.extend_object(o\) + * if String === o + * puts "Can't add Picky to a String" + * else + * puts "Picky added to #{o.class}" + * super + * end + * end + * end + * (s = Array.new\).extend Picky # Call Object.extend + * (s = "quick brown fox"\).extend Picky + * + * <em>produces:</em> + * + * Picky added to Array + * Can't add Picky to a String + */) + +directive(static) ident(VALUE) +ident(rb_mod_extend_object)operator(()ident(mod)operator(,) ident(obj)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(obj)operator(;) +operator({) + ident(rb_extend_object)operator(()ident(obj)operator(,) ident(mod)operator(\);) + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.extend(module, ...\) => obj + * + * Adds to _obj_ the instance methods from each module given as a + * parameter. + * + * module Mod + * def hello + * "Hello from Mod.\\n" + * end + * end + * + * class Klass + * def hello + * "Hello from Klass.\\n" + * end + * end + * + * k = Klass.new + * k.hello #=> "Hello from Klass.\\n" + * k.extend(Mod\) #=> #<Klass:0x401b3bc8> + * k.hello #=> "Hello from Mod.\\n" + */) + +directive(static) ident(VALUE) +ident(rb_obj_extend)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (0 for 1\))delimiter(")>operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) ident(Check_Type)operator(()ident(argv)operator([)ident(i)operator(],) ident(T_MODULE)operator(\);) + reserved(while) operator(()ident(argc)operator(--\)) operator({) + ident(rb_funcall)operator(()ident(argv)operator([)ident(argc)operator(],) ident(rb_intern)operator(()string<delimiter(")content(extend_object)delimiter(")>operator(\),) integer(1)operator(,) ident(obj)operator(\);) + ident(rb_funcall)operator(()ident(argv)operator([)ident(argc)operator(],) ident(rb_intern)operator(()string<delimiter(")content(extended)delimiter(")>operator(\),) integer(1)operator(,) ident(obj)operator(\);) + operator(}) + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * include(module, ...\) => self + * + * Invokes <code>Module.append_features</code> + * on each parameter in turn. Effectively adds the methods and constants + * in each module to the receiver. + */) + +directive(static) ident(VALUE) +ident(top_include)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(ruby_wrapper)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(main#include in the wrapped load is effective only in wrapper module)delimiter(")>operator(\);) + reserved(return) ident(rb_mod_include)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(ruby_wrapper)operator(\);) + operator(}) + reserved(return) ident(rb_mod_include)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(rb_cObject)operator(\);) +operator(}) + +ident(VALUE) ident(rb_f_trace_var)operator((\);) +ident(VALUE) ident(rb_f_untrace_var)operator((\);) + +directive(static) directive(void) +ident(errinfo_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(var)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(val)operator(\)) operator(&&) operator(!)ident(rb_obj_is_kind_of)operator(()ident(val)operator(,) ident(rb_eException)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(assigning non-exception to $!)delimiter(")>operator(\);) + operator(}) + operator(*)ident(var) operator(=) ident(val)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(errat_getter)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(get_backtrace)operator(()ident(ruby_errinfo)operator(\);) +operator(}) + +directive(static) directive(void) +ident(errat_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(var)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_errinfo)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content($! not set)delimiter(")>operator(\);) + operator(}) + ident(set_backtrace)operator(()ident(ruby_errinfo)operator(,) ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * local_variables => array + * + * Returns the names of the current local variables. + * + * fred = 1 + * for i in 1..10 + * # ... + * end + * local_variables #=> ["fred", "i"] + */) + +directive(static) ident(VALUE) +ident(rb_f_local_variables)operator((\)) +operator({) + ident(ID) operator(*)ident(tbl)operator(;) + pre_type(int) ident(n)operator(,) ident(i)operator(;) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + reserved(struct) ident(RVarmap) operator(*)ident(vars)operator(;) + + ident(tbl) operator(=) ident(ruby_scope)operator(->)ident(local_tbl)operator(;) + reserved(if) operator(()ident(tbl)operator(\)) operator({) + ident(n) operator(=) operator(*)ident(tbl)operator(++;) + reserved(for) operator(()ident(i)operator(=)integer(2)operator(;) ident(i)operator(<)ident(n)operator(;) ident(i)operator(++\)) operator({) comment(/* skip first 2 ($_ and $~\) */) + reserved(if) operator((!)ident(rb_is_local_id)operator(()ident(tbl)operator([)ident(i)operator(]\)\)) reserved(continue)operator(;) comment(/* skip flip states */) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(tbl)operator([)ident(i)operator(]\)\)\);) + operator(}) + operator(}) + + ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + reserved(while) operator(()ident(vars)operator(\)) operator({) + reserved(if) operator(()ident(vars)operator(->)ident(id) operator(&&) ident(rb_is_local_id)operator(()ident(vars)operator(->)ident(id)operator(\)\)) operator({) comment(/* skip $_, $~ and flip states */) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(vars)operator(->)ident(id)operator(\)\)\);) + operator(}) + ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(;) + operator(}) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(rb_f_catch) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +ident(NORETURN)operator(()directive(static) ident(VALUE) ident(rb_f_throw) ident(_)operator((()pre_type(int)operator(,)ident(VALUE)operator(*\)\)\);) + +reserved(struct) ident(end_proc_data) operator({) + directive(void) operator((*)ident(func)operator(\)(\);) + ident(VALUE) ident(data)operator(;) + pre_type(int) ident(safe)operator(;) + reserved(struct) ident(end_proc_data) operator(*)ident(next)operator(;) +operator(};) + +directive(static) reserved(struct) ident(end_proc_data) operator(*)ident(end_procs)operator(,) operator(*)ident(ephemeral_end_procs)operator(,) operator(*)ident(tmp_end_procs)operator(;) + +directive(void) +ident(rb_set_end_proc)operator(()ident(func)operator(,) ident(data)operator(\)) + directive(void) operator((*)ident(func)operator(\)) ident(_)operator((()ident(VALUE)operator(\)\);) + ident(VALUE) ident(data)operator(;) +operator({) + reserved(struct) ident(end_proc_data) operator(*)ident(link) operator(=) ident(ALLOC)operator(()reserved(struct) ident(end_proc_data)operator(\);) + reserved(struct) ident(end_proc_data) operator(**)ident(list)operator(;) + + reserved(if) operator(()ident(ruby_wrapper)operator(\)) ident(list) operator(=) operator(&)ident(ephemeral_end_procs)operator(;) + reserved(else) ident(list) operator(=) operator(&)ident(end_procs)operator(;) + ident(link)operator(->)ident(next) operator(=) operator(*)ident(list)operator(;) + ident(link)operator(->)ident(func) operator(=) ident(func)operator(;) + ident(link)operator(->)ident(data) operator(=) ident(data)operator(;) + ident(link)operator(->)ident(safe) operator(=) ident(ruby_safe_level)operator(;) + operator(*)ident(list) operator(=) ident(link)operator(;) +operator(}) + +directive(void) +ident(rb_mark_end_proc)operator((\)) +operator({) + reserved(struct) ident(end_proc_data) operator(*)ident(link)operator(;) + + ident(link) operator(=) ident(end_procs)operator(;) + reserved(while) operator(()ident(link)operator(\)) operator({) + ident(rb_gc_mark)operator(()ident(link)operator(->)ident(data)operator(\);) + ident(link) operator(=) ident(link)operator(->)ident(next)operator(;) + operator(}) + ident(link) operator(=) ident(ephemeral_end_procs)operator(;) + reserved(while) operator(()ident(link)operator(\)) operator({) + ident(rb_gc_mark)operator(()ident(link)operator(->)ident(data)operator(\);) + ident(link) operator(=) ident(link)operator(->)ident(next)operator(;) + operator(}) + ident(link) operator(=) ident(tmp_end_procs)operator(;) + reserved(while) operator(()ident(link)operator(\)) operator({) + ident(rb_gc_mark)operator(()ident(link)operator(->)ident(data)operator(\);) + ident(link) operator(=) ident(link)operator(->)ident(next)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) ident(call_end_proc) ident(_)operator((()ident(VALUE) ident(data)operator(\)\);) + +directive(static) directive(void) +ident(call_end_proc)operator(()ident(data)operator(\)) + ident(VALUE) ident(data)operator(;) +operator({) + ident(PUSH_ITER)operator(()ident(ITER_NOT)operator(\);) + ident(PUSH_FRAME)operator((\);) + ident(ruby_frame)operator(->)ident(self) operator(=) ident(ruby_frame)operator(->)ident(prev)operator(->)ident(self)operator(;) + ident(ruby_frame)operator(->)ident(node) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(last_func) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(last_class) operator(=) integer(0)operator(;) + ident(proc_invoke)operator(()ident(data)operator(,) ident(rb_ary_new2)operator(()integer(0)operator(\),) ident(Qundef)operator(,) integer(0)operator(\);) + ident(POP_FRAME)operator((\);) + ident(POP_ITER)operator((\);) +operator(}) + +directive(static) directive(void) +ident(rb_f_END)operator((\)) +operator({) + ident(PUSH_FRAME)operator((\);) + ident(ruby_frame)operator(->)ident(argc) operator(=) integer(0)operator(;) + ident(ruby_frame)operator(->)ident(iter) operator(=) ident(ITER_CUR)operator(;) + ident(rb_set_end_proc)operator(()ident(call_end_proc)operator(,) ident(rb_block_proc)operator((\)\);) + ident(POP_FRAME)operator((\);) +operator(}) + +comment(/* + * call-seq: + * at_exit { block } -> proc + * + * Converts _block_ to a +Proc+ object (and therefore + * binds it at the point of call\) and registers it for execution when + * the program exits. If multiple handlers are registered, they are + * executed in reverse order of registration. + * + * def do_at_exit(str1\) + * at_exit { print str1 } + * end + * at_exit { puts "cruel world" } + * do_at_exit("goodbye "\) + * exit + * + * <em>produces:</em> + * + * goodbye cruel world + */) + +directive(static) ident(VALUE) +ident(rb_f_at_exit)operator((\)) +operator({) + ident(VALUE) ident(proc)operator(;) + + reserved(if) operator((!)ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(called without a block)delimiter(")>operator(\);) + operator(}) + ident(proc) operator(=) ident(rb_block_proc)operator((\);) + ident(rb_set_end_proc)operator(()ident(call_end_proc)operator(,) ident(proc)operator(\);) + reserved(return) ident(proc)operator(;) +operator(}) + +directive(void) +ident(rb_exec_end_proc)operator((\)) +operator({) + reserved(struct) ident(end_proc_data) operator(*)ident(link)operator(,) operator(*)ident(tmp)operator(;) + pre_type(int) ident(status)operator(;) + directive(volatile) pre_type(int) ident(safe) operator(=) ident(ruby_safe_level)operator(;) + + reserved(while) operator(()ident(ephemeral_end_procs)operator(\)) operator({) + ident(tmp_end_procs) operator(=) ident(link) operator(=) ident(ephemeral_end_procs)operator(;) + ident(ephemeral_end_procs) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(link)operator(\)) operator({) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(status) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(ruby_safe_level) operator(=) ident(link)operator(->)ident(safe)operator(;) + operator((*)ident(link)operator(->)ident(func)operator(\)()ident(link)operator(->)ident(data)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(status)operator(\)) operator({) + ident(error_handle)operator(()ident(status)operator(\);) + operator(}) + ident(tmp) operator(=) ident(link)operator(;) + ident(tmp_end_procs) operator(=) ident(link) operator(=) ident(link)operator(->)ident(next)operator(;) + ident(free)operator(()ident(tmp)operator(\);) + operator(}) + operator(}) + reserved(while) operator(()ident(end_procs)operator(\)) operator({) + ident(tmp_end_procs) operator(=) ident(link) operator(=) ident(end_procs)operator(;) + ident(end_procs) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(link)operator(\)) operator({) + ident(PUSH_TAG)operator(()ident(PROT_NONE)operator(\);) + reserved(if) operator((()ident(status) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(ruby_safe_level) operator(=) ident(link)operator(->)ident(safe)operator(;) + operator((*)ident(link)operator(->)ident(func)operator(\)()ident(link)operator(->)ident(data)operator(\);) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(status)operator(\)) operator({) + ident(error_handle)operator(()ident(status)operator(\);) + operator(}) + ident(tmp) operator(=) ident(link)operator(;) + ident(tmp_end_procs) operator(=) ident(link) operator(=) ident(link)operator(->)ident(next)operator(;) + ident(free)operator(()ident(tmp)operator(\);) + operator(}) + operator(}) + ident(ruby_safe_level) operator(=) ident(safe)operator(;) +operator(}) + +directive(void) +ident(Init_eval)operator((\)) +operator({) + ident(init) operator(=) ident(rb_intern)operator(()string<delimiter(")content(initialize)delimiter(")>operator(\);) + ident(eqq) operator(=) ident(rb_intern)operator(()string<delimiter(")content(===)delimiter(")>operator(\);) + ident(each) operator(=) ident(rb_intern)operator(()string<delimiter(")content(each)delimiter(")>operator(\);) + + ident(aref) operator(=) ident(rb_intern)operator(()string<delimiter(")content([])delimiter(")>operator(\);) + ident(aset) operator(=) ident(rb_intern)operator(()string<delimiter(")content([]=)delimiter(")>operator(\);) + ident(match) operator(=) ident(rb_intern)operator(()string<delimiter(")content(=~)delimiter(")>operator(\);) + ident(missing) operator(=) ident(rb_intern)operator(()string<delimiter(")content(method_missing)delimiter(")>operator(\);) + ident(added) operator(=) ident(rb_intern)operator(()string<delimiter(")content(method_added)delimiter(")>operator(\);) + ident(singleton_added) operator(=) ident(rb_intern)operator(()string<delimiter(")content(singleton_method_added)delimiter(")>operator(\);) + ident(removed) operator(=) ident(rb_intern)operator(()string<delimiter(")content(method_removed)delimiter(")>operator(\);) + ident(singleton_removed) operator(=) ident(rb_intern)operator(()string<delimiter(")content(singleton_method_removed)delimiter(")>operator(\);) + ident(undefined) operator(=) ident(rb_intern)operator(()string<delimiter(")content(method_undefined)delimiter(")>operator(\);) + ident(singleton_undefined) operator(=) ident(rb_intern)operator(()string<delimiter(")content(singleton_method_undefined)delimiter(")>operator(\);) + + ident(__id__) operator(=) ident(rb_intern)operator(()string<delimiter(")content(__id__)delimiter(")>operator(\);) + ident(__send__) operator(=) ident(rb_intern)operator(()string<delimiter(")content(__send__)delimiter(")>operator(\);) + + ident(rb_global_variable)operator((()directive(void) operator(*\)&)ident(top_scope)operator(\);) + ident(rb_global_variable)operator((()directive(void) operator(*\)&)ident(ruby_eval_tree_begin)operator(\);) + + ident(rb_global_variable)operator((()directive(void) operator(*\)&)ident(ruby_eval_tree)operator(\);) + ident(rb_global_variable)operator((()directive(void) operator(*\)&)ident(ruby_dyna_vars)operator(\);) + + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($@)delimiter(")>operator(,) ident(errat_getter)operator(,) ident(errat_setter)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($!)delimiter(")>operator(,) operator(&)ident(ruby_errinfo)operator(,) integer(0)operator(,) ident(errinfo_setter)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(eval)delimiter(")>operator(,) ident(rb_f_eval)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(iterator?)delimiter(")>operator(,) ident(rb_f_block_given_p)operator(,) integer(0)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(block_given?)delimiter(")>operator(,) ident(rb_f_block_given_p)operator(,) integer(0)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(method_missing)delimiter(")>operator(,) ident(rb_method_missing)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(loop)delimiter(")>operator(,) ident(rb_f_loop)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(respond_to?)delimiter(")>operator(,) ident(obj_respond_to)operator(,) operator(-)integer(1)operator(\);) + ident(respond_to) operator(=) ident(rb_intern)operator(()string<delimiter(")content(respond_to?)delimiter(")>operator(\);) + ident(rb_global_variable)operator((()directive(void) operator(*\)&)ident(basic_respond_to)operator(\);) + ident(basic_respond_to) operator(=) ident(rb_method_node)operator(()ident(rb_cObject)operator(,) ident(respond_to)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(raise)delimiter(")>operator(,) ident(rb_f_raise)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(fail)delimiter(")>operator(,) ident(rb_f_raise)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(caller)delimiter(")>operator(,) ident(rb_f_caller)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(exit)delimiter(")>operator(,) ident(rb_f_exit)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(abort)delimiter(")>operator(,) ident(rb_f_abort)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(at_exit)delimiter(")>operator(,) ident(rb_f_at_exit)operator(,) integer(0)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(catch)delimiter(")>operator(,) ident(rb_f_catch)operator(,) integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(throw)delimiter(")>operator(,) ident(rb_f_throw)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(global_variables)delimiter(")>operator(,) ident(rb_f_global_variables)operator(,) integer(0)operator(\);) comment(/* in variable.c */) + ident(rb_define_global_function)operator(()string<delimiter(")content(local_variables)delimiter(")>operator(,) ident(rb_f_local_variables)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(send)delimiter(")>operator(,) ident(rb_f_send)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(__send__)delimiter(")>operator(,) ident(rb_f_send)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(instance_eval)delimiter(")>operator(,) ident(rb_obj_instance_eval)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(append_features)delimiter(")>operator(,) ident(rb_mod_append_features)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(extend_object)delimiter(")>operator(,) ident(rb_mod_extend_object)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(include)delimiter(")>operator(,) ident(rb_mod_include)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(public)delimiter(")>operator(,) ident(rb_mod_public)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(protected)delimiter(")>operator(,) ident(rb_mod_protected)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(private)delimiter(")>operator(,) ident(rb_mod_private)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(module_function)delimiter(")>operator(,) ident(rb_mod_modfunc)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(method_defined?)delimiter(")>operator(,) ident(rb_mod_method_defined)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(public_method_defined?)delimiter(")>operator(,) ident(rb_mod_public_method_defined)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(private_method_defined?)delimiter(")>operator(,) ident(rb_mod_private_method_defined)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(protected_method_defined?)delimiter(")>operator(,) ident(rb_mod_protected_method_defined)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(public_class_method)delimiter(")>operator(,) ident(rb_mod_public_method)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(private_class_method)delimiter(")>operator(,) ident(rb_mod_private_method)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(module_eval)delimiter(")>operator(,) ident(rb_mod_module_eval)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(class_eval)delimiter(")>operator(,) ident(rb_mod_module_eval)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_undef_method)operator(()ident(rb_cClass)operator(,) string<delimiter(")content(module_function)delimiter(")>operator(\);) + + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(remove_method)delimiter(")>operator(,) ident(rb_mod_remove_method)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(undef_method)delimiter(")>operator(,) ident(rb_mod_undef_method)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(alias_method)delimiter(")>operator(,) ident(rb_mod_alias_method)operator(,) integer(2)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(define_method)delimiter(")>operator(,) ident(rb_mod_define_method)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(nesting)delimiter(")>operator(,) ident(rb_mod_nesting)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(constants)delimiter(")>operator(,) ident(rb_mod_s_constants)operator(,) integer(0)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(ruby_top_self)operator(,) string<delimiter(")content(include)delimiter(")>operator(,) ident(top_include)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(ruby_top_self)operator(,) string<delimiter(")content(public)delimiter(")>operator(,) ident(top_public)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(ruby_top_self)operator(,) string<delimiter(")content(private)delimiter(")>operator(,) ident(top_private)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(extend)delimiter(")>operator(,) ident(rb_obj_extend)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(trace_var)delimiter(")>operator(,) ident(rb_f_trace_var)operator(,) operator(-)integer(1)operator(\);) comment(/* in variable.c */) + ident(rb_define_global_function)operator(()string<delimiter(")content(untrace_var)delimiter(")>operator(,) ident(rb_f_untrace_var)operator(,) operator(-)integer(1)operator(\);) comment(/* in variable.c */) + + ident(rb_define_global_function)operator(()string<delimiter(")content(set_trace_func)delimiter(")>operator(,) ident(set_trace_func)operator(,) integer(1)operator(\);) + ident(rb_global_variable)operator((&)ident(trace_func)operator(\);) + + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($SAFE)delimiter(")>operator(,) ident(safe_getter)operator(,) ident(safe_setter)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod.autoload(name, filename\) => nil + * + * Registers _filename_ to be loaded (using <code>Kernel::require</code>\) + * the first time that _name_ (which may be a <code>String</code> or + * a symbol\) is accessed in the namespace of _mod_. + * + * module A + * end + * A.autoload(:B, "b"\) + * A::B.doit # autoloads "b" + */) + +directive(static) ident(VALUE) +ident(rb_mod_autoload)operator(()ident(mod)operator(,) ident(sym)operator(,) ident(file)operator(\)) + ident(VALUE) ident(mod)operator(;) + ident(VALUE) ident(sym)operator(;) + ident(VALUE) ident(file)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(sym)operator(\);) + + ident(Check_SafeStr)operator(()ident(file)operator(\);) + ident(rb_autoload)operator(()ident(mod)operator(,) ident(id)operator(,) ident(RSTRING)operator(()ident(file)operator(\)->)ident(ptr)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.autoload?(name\) => String or nil + * + * Returns _filename_ to be loaded if _name_ is registered as + * +autoload+ in the namespace of _mod_. + * + * module A + * end + * A.autoload(:B, "b"\) + * A.autoload?(:B\) # => "b" + */) + +directive(static) ident(VALUE) +ident(rb_mod_autoload_p)operator(()ident(mod)operator(,) ident(sym)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(sym)operator(;) +operator({) + reserved(return) ident(rb_autoload_p)operator(()ident(mod)operator(,) ident(rb_to_id)operator(()ident(sym)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * autoload(module, filename\) => nil + * + * Registers _filename_ to be loaded (using <code>Kernel::require</code>\) + * the first time that _module_ (which may be a <code>String</code> or + * a symbol\) is accessed. + * + * autoload(:MyModule, "/usr/local/lib/modules/my_module.rb"\) + */) + +directive(static) ident(VALUE) +ident(rb_f_autoload)operator(()ident(obj)operator(,) ident(sym)operator(,) ident(file)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(VALUE) ident(sym)operator(;) + ident(VALUE) ident(file)operator(;) +operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_cbase)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no class/module for autoload target)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(rb_mod_autoload)operator(()ident(ruby_cbase)operator(,) ident(sym)operator(,) ident(file)operator(\);) +operator(}) + +comment(/* + * call-seq: + * autoload(module, filename\) => nil + * + * Registers _filename_ to be loaded (using <code>Kernel::require</code>\) + * the first time that _module_ (which may be a <code>String</code> or + * a symbol\) is accessed. + * + * autoload(:MyModule, "/usr/local/lib/modules/my_module.rb"\) + */) + +directive(static) ident(VALUE) +ident(rb_f_autoload_p)operator(()ident(obj)operator(,) ident(sym)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(VALUE) ident(sym)operator(;) +operator({) + comment(/* use ruby_cbase as same as rb_f_autoload. */) + reserved(if) operator(()ident(NIL_P)operator(()ident(ruby_cbase)operator(\)\)) operator({) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(rb_mod_autoload_p)operator(()ident(ruby_cbase)operator(,) ident(sym)operator(\);) +operator(}) + +directive(void) +ident(Init_load)operator((\)) +operator({) + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($:)delimiter(")>operator(,) operator(&)ident(rb_load_path)operator(\);) + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($-I)delimiter(")>operator(,) operator(&)ident(rb_load_path)operator(\);) + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($LOAD_PATH)delimiter(")>operator(,) operator(&)ident(rb_load_path)operator(\);) + ident(rb_load_path) operator(=) ident(rb_ary_new)operator((\);) + + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($)char(\\")delimiter(")>operator(,) operator(&)ident(rb_features)operator(\);) + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($LOADED_FEATURES)delimiter(")>operator(,) operator(&)ident(rb_features)operator(\);) + ident(rb_features) operator(=) ident(rb_ary_new)operator((\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(load)delimiter(")>operator(,) ident(rb_f_load)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(require)delimiter(")>operator(,) ident(rb_f_require)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(autoload)delimiter(")>operator(,) ident(rb_mod_autoload)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(autoload?)delimiter(")>operator(,) ident(rb_mod_autoload_p)operator(,) integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(autoload)delimiter(")>operator(,) ident(rb_f_autoload)operator(,) integer(2)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(autoload?)delimiter(")>operator(,) ident(rb_f_autoload_p)operator(,) integer(1)operator(\);) + ident(rb_global_variable)operator((&)ident(ruby_wrapper)operator(\);) + + ident(rb_global_variable)operator((&)ident(ruby_dln_librefs)operator(\);) + ident(ruby_dln_librefs) operator(=) ident(rb_ary_new)operator((\);) +operator(}) + +directive(static) directive(void) +ident(scope_dup)operator(()ident(scope)operator(\)) + reserved(struct) ident(SCOPE) operator(*)ident(scope)operator(;) +operator({) + ident(ID) operator(*)ident(tbl)operator(;) + ident(VALUE) operator(*)ident(vars)operator(;) + + ident(scope)operator(->)ident(flags) operator(|=) ident(SCOPE_DONT_RECYCLE)operator(;) + reserved(if) operator(()ident(scope)operator(->)ident(flags) operator(&) ident(SCOPE_MALLOC)operator(\)) reserved(return)operator(;) + + reserved(if) operator(()ident(scope)operator(->)ident(local_tbl)operator(\)) operator({) + ident(tbl) operator(=) ident(scope)operator(->)ident(local_tbl)operator(;) + ident(vars) operator(=) ident(ALLOC_N)operator(()ident(VALUE)operator(,) ident(tbl)operator([)integer(0)operator(]+)integer(1)operator(\);) + operator(*)ident(vars)operator(++) operator(=) ident(scope)operator(->)ident(local_vars)operator([-)integer(1)operator(];) + ident(MEMCPY)operator(()ident(vars)operator(,) ident(scope)operator(->)ident(local_vars)operator(,) ident(VALUE)operator(,) ident(tbl)operator([)integer(0)operator(]\);) + ident(scope)operator(->)ident(local_vars) operator(=) ident(vars)operator(;) + ident(scope)operator(->)ident(flags) operator(|=) ident(SCOPE_MALLOC)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(blk_mark)operator(()ident(data)operator(\)) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(;) +operator({) + reserved(while) operator(()ident(data)operator(\)) operator({) + ident(rb_gc_mark_frame)operator((&)ident(data)operator(->)ident(frame)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(data)operator(->)ident(scope)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(data)operator(->)ident(var)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(data)operator(->)ident(body)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(data)operator(->)ident(self)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(data)operator(->)ident(dyna_vars)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(data)operator(->)ident(cref)operator(\);) + ident(rb_gc_mark)operator(()ident(data)operator(->)ident(wrapper)operator(\);) + ident(rb_gc_mark)operator(()ident(data)operator(->)ident(block_obj)operator(\);) + ident(data) operator(=) ident(data)operator(->)ident(prev)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(frame_free)operator(()ident(frame)operator(\)) + reserved(struct) ident(FRAME) operator(*)ident(frame)operator(;) +operator({) + reserved(struct) ident(FRAME) operator(*)ident(tmp)operator(;) + + ident(frame) operator(=) ident(frame)operator(->)ident(prev)operator(;) + reserved(while) operator(()ident(frame)operator(\)) operator({) + ident(tmp) operator(=) ident(frame)operator(;) + ident(frame) operator(=) ident(frame)operator(->)ident(prev)operator(;) + ident(free)operator(()ident(tmp)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(blk_free)operator(()ident(data)operator(\)) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(;) +operator({) + directive(void) operator(*)ident(tmp)operator(;) + + reserved(while) operator(()ident(data)operator(\)) operator({) + ident(frame_free)operator((&)ident(data)operator(->)ident(frame)operator(\);) + ident(tmp) operator(=) ident(data)operator(;) + ident(data) operator(=) ident(data)operator(->)ident(prev)operator(;) + ident(free)operator(()ident(tmp)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(frame_dup)operator(()ident(frame)operator(\)) + reserved(struct) ident(FRAME) operator(*)ident(frame)operator(;) +operator({) + reserved(struct) ident(FRAME) operator(*)ident(tmp)operator(;) + + reserved(for) operator((;;\)) operator({) + ident(frame)operator(->)ident(tmp) operator(=) integer(0)operator(;) comment(/* should not preserve tmp */) + reserved(if) operator((!)ident(frame)operator(->)ident(prev)operator(\)) reserved(break)operator(;) + ident(tmp) operator(=) ident(ALLOC)operator(()reserved(struct) ident(FRAME)operator(\);) + operator(*)ident(tmp) operator(=) operator(*)ident(frame)operator(->)ident(prev)operator(;) + ident(frame)operator(->)ident(prev) operator(=) ident(tmp)operator(;) + ident(frame) operator(=) ident(tmp)operator(;) + operator(}) +operator(}) + + +directive(static) directive(void) +ident(blk_copy_prev)operator(()ident(block)operator(\)) + reserved(struct) ident(BLOCK) operator(*)ident(block)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(tmp)operator(;) + reserved(struct) ident(RVarmap)operator(*) ident(vars)operator(;) + + reserved(while) operator(()ident(block)operator(->)ident(prev)operator(\)) operator({) + ident(tmp) operator(=) ident(ALLOC_N)operator(()reserved(struct) ident(BLOCK)operator(,) integer(1)operator(\);) + ident(MEMCPY)operator(()ident(tmp)operator(,) ident(block)operator(->)ident(prev)operator(,) reserved(struct) ident(BLOCK)operator(,) integer(1)operator(\);) + ident(scope_dup)operator(()ident(tmp)operator(->)ident(scope)operator(\);) + ident(frame_dup)operator((&)ident(tmp)operator(->)ident(frame)operator(\);) + + reserved(for) operator(()ident(vars) operator(=) ident(tmp)operator(->)ident(dyna_vars)operator(;) ident(vars)operator(;) ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\)\)) reserved(break)operator(;) + ident(FL_SET)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\);) + operator(}) + + ident(block)operator(->)ident(prev) operator(=) ident(tmp)operator(;) + ident(block) operator(=) ident(tmp)operator(;) + operator(}) +operator(}) + + +directive(static) directive(void) +ident(blk_dup)operator(()ident(dup)operator(,) ident(orig)operator(\)) + reserved(struct) ident(BLOCK) operator(*)ident(dup)operator(,) operator(*)ident(orig)operator(;) +operator({) + ident(MEMCPY)operator(()ident(dup)operator(,) ident(orig)operator(,) reserved(struct) ident(BLOCK)operator(,) integer(1)operator(\);) + ident(frame_dup)operator((&)ident(dup)operator(->)ident(frame)operator(\);) + + reserved(if) operator(()ident(dup)operator(->)ident(iter)operator(\)) operator({) + ident(blk_copy_prev)operator(()ident(dup)operator(\);) + operator(}) + reserved(else) operator({) + ident(dup)operator(->)ident(prev) operator(=) integer(0)operator(;) + operator(}) +operator(}) + +comment(/* + * MISSING: documentation + */) + +directive(static) ident(VALUE) +ident(proc_clone)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(orig)operator(,) operator(*)ident(data)operator(;) + ident(VALUE) ident(bind)operator(;) + + ident(Data_Get_Struct)operator(()ident(self)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(orig)operator(\);) + ident(bind) operator(=) ident(Data_Make_Struct)operator(()ident(rb_obj_class)operator(()ident(self)operator(\),)reserved(struct) ident(BLOCK)operator(,)ident(blk_mark)operator(,)ident(blk_free)operator(,)ident(data)operator(\);) + ident(CLONESETUP)operator(()ident(bind)operator(,) ident(self)operator(\);) + ident(blk_dup)operator(()ident(data)operator(,) ident(orig)operator(\);) + + reserved(return) ident(bind)operator(;) +operator(}) + +comment(/* + * MISSING: documentation + */) + +preprocessor(#define) ident(PROC_TSHIFT) operator(()ident(FL_USHIFT)operator(+)integer(1)operator(\)) +preprocessor(#define) ident(PROC_TMASK) operator(()ident(FL_USER1)operator(|)ident(FL_USER2)operator(|)ident(FL_USER3)operator(\)) +preprocessor(#define) ident(PROC_TMAX) operator(()ident(PROC_TMASK) operator(>>) ident(PROC_TSHIFT)operator(\)) + +directive(static) pre_type(int) ident(proc_get_safe_level)operator(()ident(VALUE)operator(\);) + +directive(static) ident(VALUE) +ident(proc_dup)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(orig)operator(,) operator(*)ident(data)operator(;) + ident(VALUE) ident(bind)operator(;) + pre_type(int) ident(safe) operator(=) ident(proc_get_safe_level)operator(()ident(self)operator(\);) + + ident(Data_Get_Struct)operator(()ident(self)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(orig)operator(\);) + ident(bind) operator(=) ident(Data_Make_Struct)operator(()ident(rb_obj_class)operator(()ident(self)operator(\),)reserved(struct) ident(BLOCK)operator(,)ident(blk_mark)operator(,)ident(blk_free)operator(,)ident(data)operator(\);) + ident(blk_dup)operator(()ident(data)operator(,) ident(orig)operator(\);) + reserved(if) operator(()ident(safe) operator(>) ident(PROC_TMAX)operator(\)) ident(safe) operator(=) ident(PROC_TMAX)operator(;) + ident(FL_SET)operator(()ident(bind)operator(,) operator(()ident(safe) operator(<<) ident(PROC_TSHIFT)operator(\)) operator(&) ident(PROC_TMASK)operator(\);) + + reserved(return) ident(bind)operator(;) +operator(}) + +comment(/* + * call-seq: + * binding -> a_binding + * + * Returns a +Binding+ object, describing the variable and + * method bindings at the point of call. This object can be used when + * calling +eval+ to execute the evaluated command in this + * environment. Also see the description of class +Binding+. + * + * def getBinding(param\) + * return binding + * end + * b = getBinding("hello"\) + * eval("param", b\) #=> "hello" + */) + +directive(static) ident(VALUE) +ident(rb_f_binding)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(,) operator(*)ident(p)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(vars)operator(;) + ident(VALUE) ident(bind)operator(;) + + ident(PUSH_BLOCK)operator(()integer(0)operator(,)integer(0)operator(\);) + ident(bind) operator(=) ident(Data_Make_Struct)operator(()ident(rb_cBinding)operator(,)reserved(struct) ident(BLOCK)operator(,)ident(blk_mark)operator(,)ident(blk_free)operator(,)ident(data)operator(\);) + operator(*)ident(data) operator(=) operator(*)ident(ruby_block)operator(;) + + ident(data)operator(->)ident(orig_thread) operator(=) ident(rb_thread_current)operator((\);) + ident(data)operator(->)ident(wrapper) operator(=) ident(ruby_wrapper)operator(;) + ident(data)operator(->)ident(iter) operator(=) ident(rb_f_block_given_p)operator((\);) + ident(frame_dup)operator((&)ident(data)operator(->)ident(frame)operator(\);) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(prev)operator(\)) operator({) + ident(data)operator(->)ident(frame)operator(.)ident(last_func) operator(=) ident(ruby_frame)operator(->)ident(prev)operator(->)ident(last_func)operator(;) + ident(data)operator(->)ident(frame)operator(.)ident(last_class) operator(=) ident(ruby_frame)operator(->)ident(prev)operator(->)ident(last_class)operator(;) + ident(data)operator(->)ident(frame)operator(.)ident(orig_func) operator(=) ident(ruby_frame)operator(->)ident(prev)operator(->)ident(orig_func)operator(;) + operator(}) + + reserved(if) operator(()ident(data)operator(->)ident(iter)operator(\)) operator({) + ident(blk_copy_prev)operator(()ident(data)operator(\);) + operator(}) + reserved(else) operator({) + ident(data)operator(->)ident(prev) operator(=) integer(0)operator(;) + operator(}) + + reserved(for) operator(()ident(p) operator(=) ident(data)operator(;) ident(p)operator(;) ident(p) operator(=) ident(p)operator(->)ident(prev)operator(\)) operator({) + reserved(for) operator(()ident(vars) operator(=) ident(p)operator(->)ident(dyna_vars)operator(;) ident(vars)operator(;) ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\)\)) reserved(break)operator(;) + ident(FL_SET)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\);) + operator(}) + operator(}) + ident(scope_dup)operator(()ident(data)operator(->)ident(scope)operator(\);) + ident(POP_BLOCK)operator((\);) + + reserved(return) ident(bind)operator(;) +operator(}) + +preprocessor(#define) ident(SAFE_LEVEL_MAX) ident(PROC_TMASK) + +directive(static) directive(void) +ident(proc_save_safe_level)operator(()ident(data)operator(\)) + ident(VALUE) ident(data)operator(;) +operator({) + pre_type(int) ident(safe) operator(=) ident(ruby_safe_level)operator(;) + reserved(if) operator(()ident(safe) operator(>) ident(PROC_TMAX)operator(\)) ident(safe) operator(=) ident(PROC_TMAX)operator(;) + ident(FL_SET)operator(()ident(data)operator(,) operator(()ident(safe) operator(<<) ident(PROC_TSHIFT)operator(\)) operator(&) ident(PROC_TMASK)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(proc_get_safe_level)operator(()ident(data)operator(\)) + ident(VALUE) ident(data)operator(;) +operator({) + reserved(return) operator(()ident(RBASIC)operator(()ident(data)operator(\)->)ident(flags) operator(&) ident(PROC_TMASK)operator(\)) operator(>>) ident(PROC_TSHIFT)operator(;) +operator(}) + +directive(static) directive(void) +ident(proc_set_safe_level)operator(()ident(data)operator(\)) + ident(VALUE) ident(data)operator(;) +operator({) + ident(ruby_safe_level) operator(=) ident(proc_get_safe_level)operator(()ident(data)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(proc_alloc)operator(()ident(klass)operator(,) ident(proc)operator(\)) + ident(VALUE) ident(klass)operator(;) + pre_type(int) ident(proc)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(block)operator(;) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(,) operator(*)ident(p)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(vars)operator(;) + + reserved(if) operator((!)ident(rb_block_given_p)operator((\)) operator(&&) operator(!)ident(rb_f_block_given_p)operator((\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(tried to create Proc object without a block)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(proc) operator(&&) operator(!)ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(tried to create Proc object without a block)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator((!)ident(proc) operator(&&) ident(ruby_block)operator(->)ident(block_obj) operator(&&) ident(CLASS_OF)operator(()ident(ruby_block)operator(->)ident(block_obj)operator(\)) operator(==) ident(klass)operator(\)) operator({) + reserved(return) ident(ruby_block)operator(->)ident(block_obj)operator(;) + operator(}) + ident(block) operator(=) ident(Data_Make_Struct)operator(()ident(klass)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(blk_mark)operator(,) ident(blk_free)operator(,) ident(data)operator(\);) + operator(*)ident(data) operator(=) operator(*)ident(ruby_block)operator(;) + + ident(data)operator(->)ident(orig_thread) operator(=) ident(rb_thread_current)operator((\);) + ident(data)operator(->)ident(wrapper) operator(=) ident(ruby_wrapper)operator(;) + ident(data)operator(->)ident(iter) operator(=) ident(data)operator(->)ident(prev)operator(?)label(Qtrue)operator(:)ident(Qfalse)operator(;) + ident(data)operator(->)ident(block_obj) operator(=) ident(block)operator(;) + ident(frame_dup)operator((&)ident(data)operator(->)ident(frame)operator(\);) + reserved(if) operator(()ident(data)operator(->)ident(iter)operator(\)) operator({) + ident(blk_copy_prev)operator(()ident(data)operator(\);) + operator(}) + reserved(else) operator({) + ident(data)operator(->)ident(prev) operator(=) integer(0)operator(;) + operator(}) + + reserved(for) operator(()ident(p) operator(=) ident(data)operator(;) ident(p)operator(;) ident(p) operator(=) ident(p)operator(->)ident(prev)operator(\)) operator({) + reserved(for) operator(()ident(vars) operator(=) ident(p)operator(->)ident(dyna_vars)operator(;) ident(vars)operator(;) ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\)\)) reserved(break)operator(;) + ident(FL_SET)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\);) + operator(}) + operator(}) + ident(scope_dup)operator(()ident(data)operator(->)ident(scope)operator(\);) + ident(proc_save_safe_level)operator(()ident(block)operator(\);) + reserved(if) operator(()ident(proc)operator(\)) operator({) + ident(data)operator(->)ident(flags) operator(|=) ident(BLOCK_LAMBDA)operator(;) + operator(}) + reserved(else) operator({) + ident(ruby_block)operator(->)ident(block_obj) operator(=) ident(block)operator(;) + operator(}) + + reserved(return) ident(block)operator(;) +operator(}) + +comment(/* + * call-seq: + * Proc.new {|...| block } => a_proc + * Proc.new => a_proc + * + * Creates a new <code>Proc</code> object, bound to the current + * context. <code>Proc::new</code> may be called without a block only + * within a method with an attached block, in which case that block is + * converted to the <code>Proc</code> object. + * + * def proc_from + * Proc.new + * end + * proc = proc_from { "hello" } + * proc.call #=> "hello" + */) + +directive(static) ident(VALUE) +ident(proc_s_new)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(block) operator(=) ident(proc_alloc)operator(()ident(klass)operator(,) ident(Qfalse)operator(\);) + + ident(rb_obj_call_init)operator(()ident(block)operator(,) ident(argc)operator(,) ident(argv)operator(\);) + reserved(return) ident(block)operator(;) +operator(}) + +ident(VALUE) +ident(rb_block_proc)operator((\)) +operator({) + reserved(return) ident(proc_alloc)operator(()ident(rb_cProc)operator(,) ident(Qfalse)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_f_lambda)operator((\)) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(rb_f_lambda(\) is deprecated; use rb_block_proc(\) instead)delimiter(")>operator(\);) + reserved(return) ident(proc_alloc)operator(()ident(rb_cProc)operator(,) ident(Qtrue)operator(\);) +operator(}) + +comment(/* + * call-seq: + * proc { |...| block } => a_proc + * lambda { |...| block } => a_proc + * + * Equivalent to <code>Proc.new</code>, except the resulting Proc objects + * check the number of parameters passed when called. + */) + +directive(static) ident(VALUE) +ident(proc_lambda)operator((\)) +operator({) + reserved(return) ident(proc_alloc)operator(()ident(rb_cProc)operator(,) ident(Qtrue)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(block_orphan)operator(()ident(data)operator(\)) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(;) +operator({) + reserved(if) operator(()ident(data)operator(->)ident(scope)operator(->)ident(flags) operator(&) ident(SCOPE_NOSTACK)operator(\)) operator({) + reserved(return) integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(data)operator(->)ident(orig_thread) operator(!=) ident(rb_thread_current)operator((\)\)) operator({) + reserved(return) integer(1)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(proc_invoke)operator(()ident(proc)operator(,) ident(args)operator(,) ident(self)operator(,) ident(klass)operator(\)) + ident(VALUE) ident(proc)operator(,) ident(args)operator(;) comment(/* OK */) + ident(VALUE) ident(self)operator(,) ident(klass)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*) directive(volatile) ident(old_block)operator(;) + reserved(struct) ident(BLOCK) ident(_block)operator(;) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(;) + directive(volatile) ident(VALUE) ident(result) operator(=) ident(Qundef)operator(;) + pre_type(int) ident(state)operator(;) + directive(volatile) pre_type(int) ident(safe) operator(=) ident(ruby_safe_level)operator(;) + directive(volatile) ident(VALUE) ident(old_wrapper) operator(=) ident(ruby_wrapper)operator(;) + directive(volatile) pre_type(int) ident(pcall)operator(,) ident(avalue) operator(=) ident(Qtrue)operator(;) + directive(volatile) ident(VALUE) ident(tmp) operator(=) ident(args)operator(;) + + reserved(if) operator(()ident(rb_block_given_p)operator((\)) operator(&&) ident(ruby_frame)operator(->)ident(last_func)operator(\)) operator({) + reserved(if) operator(()ident(klass) operator(!=) ident(ruby_frame)operator(->)ident(last_class)operator(\)) + ident(klass) operator(=) ident(rb_obj_class)operator(()ident(proc)operator(\);) + ident(rb_warning)operator(()string<delimiter(")content(block for %s#%s is useless)delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(klass)operator(\),) + ident(rb_id2name)operator(()ident(ruby_frame)operator(->)ident(last_func)operator(\)\);) + operator(}) + + ident(Data_Get_Struct)operator(()ident(proc)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(data)operator(\);) + ident(pcall) operator(=) operator(()ident(data)operator(->)ident(flags) operator(&) ident(BLOCK_LAMBDA)operator(\)) operator(?) ident(YIELD_LAMBDA_CALL) operator(:) integer(0)operator(;) + reserved(if) operator((!)ident(pcall) operator(&&) ident(RARRAY)operator(()ident(args)operator(\)->)ident(len) operator(==) integer(1)operator(\)) operator({) + ident(avalue) operator(=) ident(Qfalse)operator(;) + ident(args) operator(=) ident(RARRAY)operator(()ident(args)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + operator(}) + + ident(PUSH_VARS)operator((\);) + ident(ruby_wrapper) operator(=) ident(data)operator(->)ident(wrapper)operator(;) + ident(ruby_dyna_vars) operator(=) ident(data)operator(->)ident(dyna_vars)operator(;) + comment(/* PUSH BLOCK from data */) + ident(old_block) operator(=) ident(ruby_block)operator(;) + ident(_block) operator(=) operator(*)ident(data)operator(;) + reserved(if) operator(()ident(self) operator(!=) ident(Qundef)operator(\)) ident(_block)operator(.)ident(frame)operator(.)ident(self) operator(=) ident(self)operator(;) + reserved(if) operator(()ident(klass)operator(\)) ident(_block)operator(.)ident(frame)operator(.)ident(last_class) operator(=) ident(klass)operator(;) + ident(_block)operator(.)ident(frame)operator(.)ident(argc) operator(=) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len)operator(;) + ident(_block)operator(.)ident(frame)operator(.)ident(flags) operator(=) ident(ruby_frame)operator(->)ident(flags)operator(;) + reserved(if) operator(()ident(_block)operator(.)ident(frame)operator(.)ident(argc) operator(&&) ident(DMETHOD_P)operator((\)\)) operator({) + ident(NEWOBJ)operator(()ident(scope)operator(,) reserved(struct) ident(SCOPE)operator(\);) + ident(OBJSETUP)operator(()ident(scope)operator(,) ident(tmp)operator(,) ident(T_SCOPE)operator(\);) + ident(scope)operator(->)ident(local_tbl) operator(=) ident(_block)operator(.)ident(scope)operator(->)ident(local_tbl)operator(;) + ident(scope)operator(->)ident(local_vars) operator(=) ident(_block)operator(.)ident(scope)operator(->)ident(local_vars)operator(;) + ident(scope)operator(->)ident(flags) operator(|=) ident(SCOPE_CLONE) operator(|) operator(()ident(_block)operator(.)ident(scope)operator(->)ident(flags) operator(&) ident(SCOPE_MALLOC)operator(\);) + ident(_block)operator(.)ident(scope) operator(=) ident(scope)operator(;) + operator(}) + comment(/* modify current frame */) + ident(ruby_block) operator(=) operator(&)ident(_block)operator(;) + ident(PUSH_ITER)operator(()ident(ITER_CUR)operator(\);) + ident(ruby_frame)operator(->)ident(iter) operator(=) ident(ITER_CUR)operator(;) + ident(PUSH_TAG)operator(()ident(pcall) operator(?) ident(PROT_LAMBDA) operator(:) ident(PROT_NONE)operator(\);) + ident(state) operator(=) ident(EXEC_TAG)operator((\);) + reserved(if) operator(()ident(state) operator(==) integer(0)operator(\)) operator({) + ident(proc_set_safe_level)operator(()ident(proc)operator(\);) + ident(result) operator(=) ident(rb_yield_0)operator(()ident(args)operator(,) ident(self)operator(,) operator(()ident(self)operator(!=)ident(Qundef)operator(\)?)ident(CLASS_OF)operator(()ident(self)operator(\):)integer(0)operator(,) ident(pcall)operator(,) ident(avalue)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(TAG_DST)operator((\)\)) operator({) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + operator(}) + ident(POP_TAG)operator((\);) + ident(POP_ITER)operator((\);) + ident(ruby_block) operator(=) ident(old_block)operator(;) + ident(ruby_wrapper) operator(=) ident(old_wrapper)operator(;) + ident(POP_VARS)operator((\);) + ident(ruby_safe_level) operator(=) ident(safe)operator(;) + + reserved(switch) operator(()ident(state)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(break)operator(;) + reserved(case) label(TAG_RETRY)operator(:) + ident(proc_jump_error)operator(()ident(TAG_RETRY)operator(,) ident(Qnil)operator(\);) comment(/* xxx */) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + reserved(break)operator(;) + reserved(case) label(TAG_NEXT)operator(:) + reserved(case) label(TAG_BREAK)operator(:) + reserved(if) operator((!)ident(pcall) operator(&&) ident(result) operator(!=) ident(Qundef)operator(\)) operator({) + ident(proc_jump_error)operator(()ident(state)operator(,) ident(result)operator(\);) + operator(}) + reserved(case) label(TAG_RETURN)operator(:) + reserved(if) operator(()ident(result) operator(!=) ident(Qundef)operator(\)) operator({) + reserved(if) operator(()ident(pcall)operator(\)) reserved(break)operator(;) + ident(return_jump)operator(()ident(result)operator(\);) + operator(}) + reserved(default)operator(:) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* CHECKME: are the argument checking semantics correct? */) + +comment(/* + * call-seq: + * prc.call(params,...\) => obj + * prc[params,...] => obj + * + * Invokes the block, setting the block's parameters to the values in + * <i>params</i> using something close to method calling semantics. + * Generates a warning if multiple values are passed to a proc that + * expects just one (previously this silently converted the parameters + * to an array\). + * + * For procs created using <code>Kernel.proc</code>, generates an + * error if the wrong number of parameters + * are passed to a proc with multiple parameters. For procs created using + * <code>Proc.new</code>, extra parameters are silently discarded. + * + * Returns the value of the last expression evaluated in the block. See + * also <code>Proc#yield</code>. + * + * a_proc = Proc.new {|a, *b| b.collect {|i| i*a }} + * a_proc.call(9, 1, 2, 3\) #=> [9, 18, 27] + * a_proc[9, 1, 2, 3] #=> [9, 18, 27] + * a_proc = Proc.new {|a,b| a} + * a_proc.call(1,2,3\) + * + * <em>produces:</em> + * + * prog.rb:5: wrong number of arguments (3 for 2\) (ArgumentError\) + * from prog.rb:4:in `call' + * from prog.rb:5 + */) + +directive(static) ident(VALUE) +ident(proc_call)operator(()ident(proc)operator(,) ident(args)operator(\)) + ident(VALUE) ident(proc)operator(,) ident(args)operator(;) comment(/* OK */) +operator({) + reserved(return) ident(proc_invoke)operator(()ident(proc)operator(,) ident(args)operator(,) ident(Qundef)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(bmcall) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(method_arity) ident(_)operator((()ident(VALUE)operator(\)\);) + +comment(/* + * call-seq: + * prc.arity -> fixnum + * + * Returns the number of arguments that would not be ignored. If the block + * is declared to take no arguments, returns 0. If the block is known + * to take exactly n arguments, returns n. If the block has optional + * arguments, return -n-1, where n is the number of mandatory + * arguments. A <code>proc</code> with no argument declarations + * is the same a block declaring <code>||</code> as its arguments. + * + * Proc.new {}.arity #=> 0 + * Proc.new {||}.arity #=> 0 + * Proc.new {|a|}.arity #=> 1 + * Proc.new {|a,b|}.arity #=> 2 + * Proc.new {|a,b,c|}.arity #=> 3 + * Proc.new {|*a|}.arity #=> -1 + * Proc.new {|a,*b|}.arity #=> -2 + */) + +directive(static) ident(VALUE) +ident(proc_arity)operator(()ident(proc)operator(\)) + ident(VALUE) ident(proc)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(;) + ident(NODE) operator(*)ident(list)operator(;) + pre_type(int) ident(n)operator(;) + + ident(Data_Get_Struct)operator(()ident(proc)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(data)operator(\);) + reserved(if) operator(()ident(data)operator(->)ident(var) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(data)operator(->)ident(body) operator(&&) ident(nd_type)operator(()ident(data)operator(->)ident(body)operator(\)) operator(==) ident(NODE_IFUNC) operator(&&) + ident(data)operator(->)ident(body)operator(->)ident(nd_cfnc) operator(==) ident(bmcall)operator(\)) operator({) + reserved(return) ident(method_arity)operator(()ident(data)operator(->)ident(body)operator(->)ident(nd_tval)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(data)operator(->)ident(var) operator(==) operator(()ident(NODE)operator(*\))integer(1)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(data)operator(->)ident(var) operator(==) operator(()ident(NODE)operator(*\))integer(2)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(switch) operator(()ident(nd_type)operator(()ident(data)operator(->)ident(var)operator(\)\)) operator({) + reserved(default)operator(:) + reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(case) label(NODE_MASGN)operator(:) + ident(list) operator(=) ident(data)operator(->)ident(var)operator(->)ident(nd_head)operator(;) + ident(n) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(list)operator(\)) operator({) + ident(n)operator(++;) + ident(list) operator(=) ident(list)operator(->)ident(nd_next)operator(;) + operator(}) + reserved(if) operator(()ident(data)operator(->)ident(var)operator(->)ident(nd_args)operator(\)) reserved(return) ident(INT2FIX)operator((-)ident(n)operator(-)integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(n)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * prc == other_proc => true or false + * + * Return <code>true</code> if <i>prc</i> is the same object as + * <i>other_proc</i>, or if they are both procs with the same body. + */) + +directive(static) ident(VALUE) +ident(proc_eq)operator(()ident(self)operator(,) ident(other)operator(\)) + ident(VALUE) ident(self)operator(,) ident(other)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(,) operator(*)ident(data2)operator(;) + + reserved(if) operator(()ident(self) operator(==) ident(other)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(other)operator(\)) operator(!=) ident(T_DATA)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(RDATA)operator(()ident(other)operator(\)->)ident(dmark) operator(!=) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(blk_mark)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(CLASS_OF)operator(()ident(self)operator(\)) operator(!=) ident(CLASS_OF)operator(()ident(other)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + ident(Data_Get_Struct)operator(()ident(self)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(data)operator(\);) + ident(Data_Get_Struct)operator(()ident(other)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(data2)operator(\);) + reserved(if) operator(()ident(data)operator(->)ident(body) operator(!=) ident(data2)operator(->)ident(body)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(data)operator(->)ident(var) operator(!=) ident(data2)operator(->)ident(var)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(data)operator(->)ident(scope) operator(!=) ident(data2)operator(->)ident(scope)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(data)operator(->)ident(dyna_vars) operator(!=) ident(data2)operator(->)ident(dyna_vars)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(data)operator(->)ident(flags) operator(!=) ident(data2)operator(->)ident(flags)operator(\)) reserved(return) ident(Qfalse)operator(;) + + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * prc.to_s => string + * + * Shows the unique identifier for this proc, along with + * an indication of where the proc was defined. + */) + +directive(static) ident(VALUE) +ident(proc_to_s)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(;) + ident(NODE) operator(*)ident(node)operator(;) + pre_type(char) operator(*)ident(cname) operator(=) ident(rb_obj_classname)operator(()ident(self)operator(\);) + directive(const) pre_type(int) ident(w) operator(=) operator(()reserved(sizeof)operator(()ident(VALUE)operator(\)) operator(*) ident(CHAR_BIT)operator(\)) operator(/) integer(4)operator(;) + pre_type(long) ident(len) operator(=) ident(strlen)operator(()ident(cname)operator(\)+)integer(6)operator(+)ident(w)operator(;) comment(/* 6:tags 16:addr */) + ident(VALUE) ident(str)operator(;) + + ident(Data_Get_Struct)operator(()ident(self)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(data)operator(\);) + reserved(if) operator((()ident(node) operator(=) ident(data)operator(->)ident(frame)operator(.)ident(node)operator(\)) operator(||) operator(()ident(node) operator(=) ident(data)operator(->)ident(body)operator(\)\)) operator({) + ident(len) operator(+=) ident(strlen)operator(()ident(node)operator(->)ident(nd_file)operator(\)) operator(+) integer(2) operator(+) operator(()ident(SIZEOF_LONG)operator(*)ident(CHAR_BIT)operator(-)ident(NODE_LSHIFT)operator(\))operator(/)integer(3)operator(;) + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) + ident(snprintf)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(+)integer(1)operator(,) + string<delimiter(")content(#<%s:0x%.*lx@%s:%d>)delimiter(")>operator(,) ident(cname)operator(,) ident(w)operator(,) operator(()ident(VALUE)operator(\))ident(data)operator(->)ident(body)operator(,) + ident(node)operator(->)ident(nd_file)operator(,) ident(nd_line)operator(()ident(node)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) + ident(snprintf)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(+)integer(1)operator(,) + string<delimiter(")content(#<%s:0x%.*lx>)delimiter(")>operator(,) ident(cname)operator(,) ident(w)operator(,) operator(()ident(VALUE)operator(\))ident(data)operator(->)ident(body)operator(\);) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(strlen)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(self)operator(\)\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * prc.to_proc -> prc + * + * Part of the protocol for converting objects to <code>Proc</code> + * objects. Instances of class <code>Proc</code> simply return + * themselves. + */) + +directive(static) ident(VALUE) +ident(proc_to_self)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(self)operator(;) +operator(}) + +comment(/* + * call-seq: + * prc.binding => binding + * + * Returns the binding associated with <i>prc</i>. Note that + * <code>Kernel#eval</code> accepts either a <code>Proc</code> or a + * <code>Binding</code> object as its second parameter. + * + * def fred(param\) + * proc {} + * end + * + * b = fred(99\) + * eval("param", b.binding\) #=> 99 + * eval("param", b\) #=> 99 + */) + +directive(static) ident(VALUE) +ident(proc_binding)operator(()ident(proc)operator(\)) + ident(VALUE) ident(proc)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(orig)operator(,) operator(*)ident(data)operator(;) + ident(VALUE) ident(bind)operator(;) + + ident(Data_Get_Struct)operator(()ident(proc)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(orig)operator(\);) + ident(bind) operator(=) ident(Data_Make_Struct)operator(()ident(rb_cBinding)operator(,)reserved(struct) ident(BLOCK)operator(,)ident(blk_mark)operator(,)ident(blk_free)operator(,)ident(data)operator(\);) + ident(MEMCPY)operator(()ident(data)operator(,) ident(orig)operator(,) reserved(struct) ident(BLOCK)operator(,) integer(1)operator(\);) + ident(frame_dup)operator((&)ident(data)operator(->)ident(frame)operator(\);) + + reserved(if) operator(()ident(data)operator(->)ident(iter)operator(\)) operator({) + ident(blk_copy_prev)operator(()ident(data)operator(\);) + operator(}) + reserved(else) operator({) + ident(data)operator(->)ident(prev) operator(=) integer(0)operator(;) + operator(}) + + reserved(return) ident(bind)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(block_pass)operator(()ident(self)operator(,) ident(node)operator(\)) + ident(VALUE) ident(self)operator(;) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + ident(VALUE) ident(proc) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_body)operator(\);) comment(/* OK */) + ident(VALUE) ident(b)operator(;) + reserved(struct) ident(BLOCK) operator(*) directive(volatile) ident(old_block)operator(;) + reserved(struct) ident(BLOCK) ident(_block)operator(;) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(;) + directive(volatile) ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) + pre_type(int) ident(state)operator(;) + directive(volatile) pre_type(int) ident(orphan)operator(;) + directive(volatile) pre_type(int) ident(safe) operator(=) ident(ruby_safe_level)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(proc)operator(\)\)) operator({) + ident(PUSH_ITER)operator(()ident(ITER_NOT)operator(\);) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_iter)operator(\);) + ident(POP_ITER)operator((\);) + reserved(return) ident(result)operator(;) + operator(}) + reserved(if) operator((!)ident(rb_obj_is_proc)operator(()ident(proc)operator(\)\)) operator({) + ident(b) operator(=) ident(rb_check_convert_type)operator(()ident(proc)operator(,) ident(T_DATA)operator(,) string<delimiter(")content(Proc)delimiter(")>operator(,) string<delimiter(")content(to_proc)delimiter(")>operator(\);) + reserved(if) operator((!)ident(rb_obj_is_proc)operator(()ident(b)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type %s (expected Proc\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(proc)operator(\)\);) + operator(}) + ident(proc) operator(=) ident(b)operator(;) + operator(}) + + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(1) operator(&&) ident(OBJ_TAINTED)operator(()ident(proc)operator(\)) operator(&&) + ident(ruby_safe_level) operator(>) ident(proc_get_safe_level)operator(()ident(proc)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: tainted block value)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(ruby_block) operator(&&) ident(ruby_block)operator(->)ident(block_obj) operator(==) ident(proc)operator(\)) operator({) + ident(PUSH_ITER)operator(()ident(ITER_PAS)operator(\);) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_iter)operator(\);) + ident(POP_ITER)operator((\);) + reserved(return) ident(result)operator(;) + operator(}) + + ident(Data_Get_Struct)operator(()ident(proc)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(data)operator(\);) + ident(orphan) operator(=) ident(block_orphan)operator(()ident(data)operator(\);) + + comment(/* PUSH BLOCK from data */) + ident(old_block) operator(=) ident(ruby_block)operator(;) + ident(_block) operator(=) operator(*)ident(data)operator(;) + ident(_block)operator(.)ident(outer) operator(=) ident(ruby_block)operator(;) + reserved(if) operator(()ident(orphan)operator(\)) ident(_block)operator(.)ident(uniq) operator(=) ident(block_unique)operator(++;) + ident(ruby_block) operator(=) operator(&)ident(_block)operator(;) + ident(PUSH_ITER)operator(()ident(ITER_PRE)operator(\);) + reserved(if) operator(()ident(ruby_frame)operator(->)ident(iter) operator(==) ident(ITER_NOT)operator(\)) + ident(ruby_frame)operator(->)ident(iter) operator(=) ident(ITER_PRE)operator(;) + + ident(PUSH_TAG)operator(()ident(PROT_LOOP)operator(\);) + ident(state) operator(=) ident(EXEC_TAG)operator((\);) + reserved(if) operator(()ident(state) operator(==) integer(0)operator(\)) operator({) + label(retry)operator(:) + ident(proc_set_safe_level)operator(()ident(proc)operator(\);) + reserved(if) operator(()ident(safe) operator(>) ident(ruby_safe_level)operator(\)) + ident(ruby_safe_level) operator(=) ident(safe)operator(;) + ident(result) operator(=) ident(rb_eval)operator(()ident(self)operator(,) ident(node)operator(->)ident(nd_iter)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_BREAK) operator(&&) ident(TAG_DST)operator((\)\)) operator({) + ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + ident(state) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_RETRY)operator(\)) operator({) + ident(state) operator(=) integer(0)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) + ident(POP_TAG)operator((\);) + ident(POP_ITER)operator((\);) + ident(ruby_block) operator(=) ident(old_block)operator(;) + ident(ruby_safe_level) operator(=) ident(safe)operator(;) + + reserved(switch) operator(()ident(state)operator(\)) operator({)comment(/* escape from orphan block */) + reserved(case) integer(0)operator(:) + reserved(break)operator(;) + reserved(case) label(TAG_RETURN)operator(:) + reserved(if) operator(()ident(orphan)operator(\)) operator({) + ident(proc_jump_error)operator(()ident(state)operator(,) ident(prot_tag)operator(->)ident(retval)operator(\);) + operator(}) + reserved(default)operator(:) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + operator(}) + + reserved(return) ident(result)operator(;) +operator(}) + +reserved(struct) ident(METHOD) operator({) + ident(VALUE) ident(klass)operator(,) ident(rklass)operator(;) + ident(VALUE) ident(recv)operator(;) + ident(ID) ident(id)operator(,) ident(oid)operator(;) + pre_type(int) ident(safe_level)operator(;) + ident(NODE) operator(*)ident(body)operator(;) +operator(};) + +directive(static) directive(void) +ident(bm_mark)operator(()ident(data)operator(\)) + reserved(struct) ident(METHOD) operator(*)ident(data)operator(;) +operator({) + ident(rb_gc_mark)operator(()ident(data)operator(->)ident(rklass)operator(\);) + ident(rb_gc_mark)operator(()ident(data)operator(->)ident(klass)operator(\);) + ident(rb_gc_mark)operator(()ident(data)operator(->)ident(recv)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(data)operator(->)ident(body)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(mnew)operator(()ident(klass)operator(,) ident(obj)operator(,) ident(id)operator(,) ident(mklass)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(obj)operator(,) ident(mklass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(method)operator(;) + ident(NODE) operator(*)ident(body)operator(;) + pre_type(int) ident(noex)operator(;) + reserved(struct) ident(METHOD) operator(*)ident(data)operator(;) + ident(VALUE) ident(rklass) operator(=) ident(klass)operator(;) + ident(ID) ident(oid) operator(=) ident(id)operator(;) + + label(again)operator(:) + reserved(if) operator((()ident(body) operator(=) ident(rb_get_method_body)operator((&)ident(klass)operator(,) operator(&)ident(id)operator(,) operator(&)ident(noex)operator(\)\)) operator(==) integer(0)operator(\)) operator({) + ident(print_undef)operator(()ident(rklass)operator(,) ident(oid)operator(\);) + operator(}) + + reserved(if) operator(()ident(nd_type)operator(()ident(body)operator(\)) operator(==) ident(NODE_ZSUPER)operator(\)) operator({) + ident(klass) operator(=) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + + reserved(while) operator(()ident(rklass) operator(!=) ident(klass) operator(&&) + operator(()ident(FL_TEST)operator(()ident(rklass)operator(,) ident(FL_SINGLETON)operator(\)) operator(||) ident(TYPE)operator(()ident(rklass)operator(\)) operator(==) ident(T_ICLASS)operator(\)\)) operator({) + ident(rklass) operator(=) ident(RCLASS)operator(()ident(rklass)operator(\)->)ident(super)operator(;) + operator(}) + ident(method) operator(=) ident(Data_Make_Struct)operator(()ident(mklass)operator(,) reserved(struct) ident(METHOD)operator(,) ident(bm_mark)operator(,) ident(free)operator(,) ident(data)operator(\);) + ident(data)operator(->)ident(klass) operator(=) ident(klass)operator(;) + ident(data)operator(->)ident(recv) operator(=) ident(obj)operator(;) + ident(data)operator(->)ident(id) operator(=) ident(id)operator(;) + ident(data)operator(->)ident(body) operator(=) ident(body)operator(;) + ident(data)operator(->)ident(rklass) operator(=) ident(rklass)operator(;) + ident(data)operator(->)ident(oid) operator(=) ident(oid)operator(;) + ident(data)operator(->)ident(safe_level) operator(=) ident(NOEX_WITH_SAFE)operator(()ident(noex)operator(\);) + ident(OBJ_INFECT)operator(()ident(method)operator(,) ident(klass)operator(\);) + + reserved(return) ident(method)operator(;) +operator(}) + + +comment(/********************************************************************** + * + * Document-class : Method + * + * Method objects are created by <code>Object#method</code>, and are + * associated with a particular object (not just with a class\). They + * may be used to invoke the method within the object, and as a block + * associated with an iterator. They may also be unbound from one + * object (creating an <code>UnboundMethod</code>\) and bound to + * another. + * + * class Thing + * def square(n\) + * n*n + * end + * end + * thing = Thing.new + * meth = thing.method(:square\) + * + * meth.call(9\) #=> 81 + * [ 1, 2, 3 ].collect(&meth\) #=> [1, 4, 9] + * + */) + +comment(/* + * call-seq: + * meth == other_meth => true or false + * + * Two method objects are equal if that are bound to the same + * object and contain the same body. + */) + + +directive(static) ident(VALUE) +ident(method_eq)operator(()ident(method)operator(,) ident(other)operator(\)) + ident(VALUE) ident(method)operator(,) ident(other)operator(;) +operator({) + reserved(struct) ident(METHOD) operator(*)ident(m1)operator(,) operator(*)ident(m2)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(other)operator(\)) operator(!=) ident(T_DATA) operator(||) ident(RDATA)operator(()ident(other)operator(\)->)ident(dmark) operator(!=) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(bm_mark)operator(\)) + reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(CLASS_OF)operator(()ident(method)operator(\)) operator(!=) ident(CLASS_OF)operator(()ident(other)operator(\)\)) + reserved(return) ident(Qfalse)operator(;) + + ident(Data_Get_Struct)operator(()ident(method)operator(,) reserved(struct) ident(METHOD)operator(,) ident(m1)operator(\);) + ident(Data_Get_Struct)operator(()ident(other)operator(,) reserved(struct) ident(METHOD)operator(,) ident(m2)operator(\);) + + reserved(if) operator(()ident(m1)operator(->)ident(klass) operator(!=) ident(m2)operator(->)ident(klass) operator(||) ident(m1)operator(->)ident(rklass) operator(!=) ident(m2)operator(->)ident(rklass) operator(||) + ident(m1)operator(->)ident(recv) operator(!=) ident(m2)operator(->)ident(recv) operator(||) ident(m1)operator(->)ident(body) operator(!=) ident(m2)operator(->)ident(body)operator(\)) + reserved(return) ident(Qfalse)operator(;) + + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * meth.unbind => unbound_method + * + * Dissociates <i>meth</i> from it's current receiver. The resulting + * <code>UnboundMethod</code> can subsequently be bound to a new object + * of the same class (see <code>UnboundMethod</code>\). + */) + +directive(static) ident(VALUE) +ident(method_unbind)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(method)operator(;) + reserved(struct) ident(METHOD) operator(*)ident(orig)operator(,) operator(*)ident(data)operator(;) + + ident(Data_Get_Struct)operator(()ident(obj)operator(,) reserved(struct) ident(METHOD)operator(,) ident(orig)operator(\);) + ident(method) operator(=) ident(Data_Make_Struct)operator(()ident(rb_cUnboundMethod)operator(,) reserved(struct) ident(METHOD)operator(,) ident(bm_mark)operator(,) ident(free)operator(,) ident(data)operator(\);) + ident(data)operator(->)ident(klass) operator(=) ident(orig)operator(->)ident(klass)operator(;) + ident(data)operator(->)ident(recv) operator(=) ident(Qundef)operator(;) + ident(data)operator(->)ident(id) operator(=) ident(orig)operator(->)ident(id)operator(;) + ident(data)operator(->)ident(body) operator(=) ident(orig)operator(->)ident(body)operator(;) + ident(data)operator(->)ident(rklass) operator(=) ident(orig)operator(->)ident(rklass)operator(;) + ident(data)operator(->)ident(oid) operator(=) ident(orig)operator(->)ident(oid)operator(;) + ident(OBJ_INFECT)operator(()ident(method)operator(,) ident(obj)operator(\);) + + reserved(return) ident(method)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.method(sym\) => method + * + * Looks up the named method as a receiver in <i>obj</i>, returning a + * <code>Method</code> object (or raising <code>NameError</code>\). The + * <code>Method</code> object acts as a closure in <i>obj</i>'s object + * instance, so instance variables and the value of <code>self</code> + * remain available. + * + * class Demo + * def initialize(n\) + * @iv = n + * end + * def hello(\) + * "Hello, @iv = #{@iv}" + * end + * end + * + * k = Demo.new(99\) + * m = k.method(:hello\) + * m.call #=> "Hello, @iv = 99" + * + * l = Demo.new('Fred'\) + * m = l.method("hello"\) + * m.call #=> "Hello, @iv = Fred" + */) + +directive(static) ident(VALUE) +ident(rb_obj_method)operator(()ident(obj)operator(,) ident(vid)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(VALUE) ident(vid)operator(;) +operator({) + reserved(return) ident(mnew)operator(()ident(CLASS_OF)operator(()ident(obj)operator(\),) ident(obj)operator(,) ident(rb_to_id)operator(()ident(vid)operator(\),) ident(rb_cMethod)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod.instance_method(symbol\) => unbound_method + * + * Returns an +UnboundMethod+ representing the given + * instance method in _mod_. + * + * class Interpreter + * def do_a(\) print "there, "; end + * def do_d(\) print "Hello "; end + * def do_e(\) print "!\\n"; end + * def do_v(\) print "Dave"; end + * Dispatcher = { + * ?a => instance_method(:do_a\), + * ?d => instance_method(:do_d\), + * ?e => instance_method(:do_e\), + * ?v => instance_method(:do_v\) + * } + * def interpret(string\) + * string.each_byte {|b| Dispatcher[b].bind(self\).call } + * end + * end + * + * + * interpreter = Interpreter.new + * interpreter.interpret('dave'\) + * + * <em>produces:</em> + * + * Hello there, Dave! + */) + +directive(static) ident(VALUE) +ident(rb_mod_method)operator(()ident(mod)operator(,) ident(vid)operator(\)) + ident(VALUE) ident(mod)operator(;) + ident(VALUE) ident(vid)operator(;) +operator({) + reserved(return) ident(mnew)operator(()ident(mod)operator(,) ident(Qundef)operator(,) ident(rb_to_id)operator(()ident(vid)operator(\),) ident(rb_cUnboundMethod)operator(\);) +operator(}) + +comment(/* + * MISSING: documentation + */) + +directive(static) ident(VALUE) +ident(method_clone)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + ident(VALUE) ident(clone)operator(;) + reserved(struct) ident(METHOD) operator(*)ident(orig)operator(,) operator(*)ident(data)operator(;) + + ident(Data_Get_Struct)operator(()ident(self)operator(,) reserved(struct) ident(METHOD)operator(,) ident(orig)operator(\);) + ident(clone) operator(=) ident(Data_Make_Struct)operator(()ident(CLASS_OF)operator(()ident(self)operator(\),)reserved(struct) ident(METHOD)operator(,) ident(bm_mark)operator(,) ident(free)operator(,) ident(data)operator(\);) + ident(CLONESETUP)operator(()ident(clone)operator(,) ident(self)operator(\);) + operator(*)ident(data) operator(=) operator(*)ident(orig)operator(;) + + reserved(return) ident(clone)operator(;) +operator(}) + +comment(/* + * call-seq: + * meth.call(args, ...\) => obj + * meth[args, ...] => obj + * + * Invokes the <i>meth</i> with the specified arguments, returning the + * method's return value. + * + * m = 12.method("+"\) + * m.call(3\) #=> 15 + * m.call(20\) #=> 32 + */) + +directive(static) ident(VALUE) +ident(method_call)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(method)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(method)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(Qnil)operator(;) comment(/* OK */) + reserved(struct) ident(METHOD) operator(*)ident(data)operator(;) + pre_type(int) ident(safe)operator(;) + + ident(Data_Get_Struct)operator(()ident(method)operator(,) reserved(struct) ident(METHOD)operator(,) ident(data)operator(\);) + reserved(if) operator(()ident(data)operator(->)ident(recv) operator(==) ident(Qundef)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't call unbound method; bind first)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(method)operator(\)\)) operator({) + ident(safe) operator(=) ident(NOEX_WITH)operator(()ident(data)operator(->)ident(safe_level)operator(,) integer(4)operator(\)|)ident(NOEX_TAINTED)operator(;) + operator(}) + reserved(else) operator({) + ident(safe) operator(=) ident(data)operator(->)ident(safe_level)operator(;) + operator(}) + ident(PUSH_ITER)operator(()ident(rb_block_given_p)operator((\)?)label(ITER_PRE)operator(:)ident(ITER_NOT)operator(\);) + ident(result) operator(=) ident(rb_call0)operator(()ident(data)operator(->)ident(klass)operator(,)ident(data)operator(->)ident(recv)operator(,)ident(data)operator(->)ident(id)operator(,)ident(data)operator(->)ident(oid)operator(,)ident(argc)operator(,)ident(argv)operator(,)ident(data)operator(->)ident(body)operator(,)ident(safe)operator(\);) + ident(POP_ITER)operator((\);) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/********************************************************************** + * + * Document-class: UnboundMethod + * + * Ruby supports two forms of objectified methods. Class + * <code>Method</code> is used to represent methods that are associated + * with a particular object: these method objects are bound to that + * object. Bound method objects for an object can be created using + * <code>Object#method</code>. + * + * Ruby also supports unbound methods; methods objects that are not + * associated with a particular object. These can be created either by + * calling <code>Module#instance_method</code> or by calling + * <code>unbind</code> on a bound method object. The result of both of + * these is an <code>UnboundMethod</code> object. + * + * Unbound methods can only be called after they are bound to an + * object. That object must be be a kind_of? the method's original + * class. + * + * class Square + * def area + * @side * @side + * end + * def initialize(side\) + * @side = side + * end + * end + * + * area_un = Square.instance_method(:area\) + * + * s = Square.new(12\) + * area = area_un.bind(s\) + * area.call #=> 144 + * + * Unbound methods are a reference to the method at the time it was + * objectified: subsequent changes to the underlying class will not + * affect the unbound method. + * + * class Test + * def test + * :original + * end + * end + * um = Test.instance_method(:test\) + * class Test + * def test + * :modified + * end + * end + * t = Test.new + * t.test #=> :modified + * um.bind(t\).call #=> :original + * + */) + +comment(/* + * call-seq: + * umeth.bind(obj\) -> method + * + * Bind <i>umeth</i> to <i>obj</i>. If <code>Klass</code> was the class + * from which <i>umeth</i> was obtained, + * <code>obj.kind_of?(Klass\)</code> must be true. + * + * class A + * def test + * puts "In test, class = #{self.class}" + * end + * end + * class B < A + * end + * class C < B + * end + * + * + * um = B.instance_method(:test\) + * bm = um.bind(C.new\) + * bm.call + * bm = um.bind(B.new\) + * bm.call + * bm = um.bind(A.new\) + * bm.call + * + * <em>produces:</em> + * + * In test, class = C + * In test, class = B + * prog.rb:16:in `bind': bind argument must be an instance of B (TypeError\) + * from prog.rb:16 + */) + +directive(static) ident(VALUE) +ident(umethod_bind)operator(()ident(method)operator(,) ident(recv)operator(\)) + ident(VALUE) ident(method)operator(,) ident(recv)operator(;) +operator({) + reserved(struct) ident(METHOD) operator(*)ident(data)operator(,) operator(*)ident(bound)operator(;) + ident(VALUE) ident(rklass) operator(=) ident(CLASS_OF)operator(()ident(recv)operator(\);) + + ident(Data_Get_Struct)operator(()ident(method)operator(,) reserved(struct) ident(METHOD)operator(,) ident(data)operator(\);) + reserved(if) operator(()ident(data)operator(->)ident(rklass) operator(!=) ident(rklass)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(data)operator(->)ident(rklass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(singleton method bound for a different object)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(data)operator(->)ident(rklass)operator(\)) operator(==) ident(T_MODULE)operator(\)) operator({) + ident(st_table) operator(*)ident(m_tbl) operator(=) ident(RCLASS)operator(()ident(data)operator(->)ident(rklass)operator(\)->)ident(m_tbl)operator(;) + reserved(while) operator(()ident(RCLASS)operator(()ident(rklass)operator(\)->)ident(m_tbl) operator(!=) ident(m_tbl)operator(\)) operator({) + ident(rklass) operator(=) ident(RCLASS)operator(()ident(rklass)operator(\)->)ident(super)operator(;) + reserved(if) operator((!)ident(rklass)operator(\)) reserved(goto) ident(not_instace)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator((!)ident(rb_obj_is_kind_of)operator(()ident(recv)operator(,) ident(data)operator(->)ident(rklass)operator(\)\)) operator({) + label(not_instace)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(bind argument must be an instance of %s)delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(data)operator(->)ident(rklass)operator(\)\);) + operator(}) + operator(}) + + ident(method) operator(=) ident(Data_Make_Struct)operator(()ident(rb_cMethod)operator(,)reserved(struct) ident(METHOD)operator(,)ident(bm_mark)operator(,)ident(free)operator(,)ident(bound)operator(\);) + operator(*)ident(bound) operator(=) operator(*)ident(data)operator(;) + ident(bound)operator(->)ident(recv) operator(=) ident(recv)operator(;) + ident(bound)operator(->)ident(rklass) operator(=) ident(rklass)operator(;) + + reserved(return) ident(method)operator(;) +operator(}) + +comment(/* + * call-seq: + * meth.arity => fixnum + * + * Returns an indication of the number of arguments accepted by a + * method. Returns a nonnegative integer for methods that take a fixed + * number of arguments. For Ruby methods that take a variable number of + * arguments, returns -n-1, where n is the number of required + * arguments. For methods written in C, returns -1 if the call takes a + * variable number of arguments. + * + * class C + * def one; end + * def two(a\); end + * def three(*a\); end + * def four(a, b\); end + * def five(a, b, *c\); end + * def six(a, b, *c, &d\); end + * end + * c = C.new + * c.method(:one\).arity #=> 0 + * c.method(:two\).arity #=> 1 + * c.method(:three\).arity #=> -1 + * c.method(:four\).arity #=> 2 + * c.method(:five\).arity #=> -3 + * c.method(:six\).arity #=> -3 + * + * "cat".method(:size\).arity #=> 0 + * "cat".method(:replace\).arity #=> 1 + * "cat".method(:squeeze\).arity #=> -1 + * "cat".method(:count\).arity #=> -1 + */) + +directive(static) ident(VALUE) +ident(method_arity)operator(()ident(method)operator(\)) + ident(VALUE) ident(method)operator(;) +operator({) + reserved(struct) ident(METHOD) operator(*)ident(data)operator(;) + ident(NODE) operator(*)ident(body)operator(;) + pre_type(int) ident(n)operator(;) + + ident(Data_Get_Struct)operator(()ident(method)operator(,) reserved(struct) ident(METHOD)operator(,) ident(data)operator(\);) + + ident(body) operator(=) ident(data)operator(->)ident(body)operator(;) + reserved(switch) operator(()ident(nd_type)operator(()ident(body)operator(\)\)) operator({) + reserved(case) label(NODE_CFUNC)operator(:) + reserved(if) operator(()ident(body)operator(->)ident(nd_argc) operator(<) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(body)operator(->)ident(nd_argc)operator(\);) + reserved(case) label(NODE_ZSUPER)operator(:) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + reserved(case) label(NODE_ATTRSET)operator(:) + reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(case) label(NODE_IVAR)operator(:) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(case) label(NODE_BMETHOD)operator(:) + reserved(return) ident(proc_arity)operator(()ident(body)operator(->)ident(nd_cval)operator(\);) + reserved(case) label(NODE_DMETHOD)operator(:) + reserved(return) ident(method_arity)operator(()ident(body)operator(->)ident(nd_cval)operator(\);) + reserved(case) label(NODE_SCOPE)operator(:) + ident(body) operator(=) ident(body)operator(->)ident(nd_next)operator(;) comment(/* skip NODE_SCOPE */) + reserved(if) operator(()ident(nd_type)operator(()ident(body)operator(\)) operator(==) ident(NODE_BLOCK)operator(\)) + ident(body) operator(=) ident(body)operator(->)ident(nd_head)operator(;) + reserved(if) operator((!)ident(body)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + ident(n) operator(=) ident(body)operator(->)ident(nd_cnt)operator(;) + reserved(if) operator(()ident(body)operator(->)ident(nd_opt) operator(||) ident(body)operator(->)ident(nd_rest)operator(\)) + ident(n) operator(=) operator(-)ident(n)operator(-)integer(1)operator(;) + reserved(return) ident(INT2FIX)operator(()ident(n)operator(\);) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(invalid node 0x%x)delimiter(")>operator(,) ident(nd_type)operator(()ident(body)operator(\)\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * meth.to_s => string + * meth.inspect => string + * + * Show the name of the underlying method. + * + * "cat".method(:count\).inspect #=> "#<Method: String#count>" + */) + +directive(static) ident(VALUE) +ident(method_inspect)operator(()ident(method)operator(\)) + ident(VALUE) ident(method)operator(;) +operator({) + reserved(struct) ident(METHOD) operator(*)ident(data)operator(;) + ident(VALUE) ident(str)operator(;) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(char) operator(*)ident(sharp) operator(=) string<delimiter(")content(#)delimiter(")>operator(;) + + ident(Data_Get_Struct)operator(()ident(method)operator(,) reserved(struct) ident(METHOD)operator(,) ident(data)operator(\);) + ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content(#<)delimiter(")>operator(\);) + ident(s) operator(=) ident(rb_obj_classname)operator(()ident(method)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(s)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(: )delimiter(")>operator(\);) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(data)operator(->)ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(VALUE) ident(v) operator(=) ident(rb_iv_get)operator(()ident(data)operator(->)ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\);) + + reserved(if) operator(()ident(data)operator(->)ident(recv) operator(==) ident(Qundef)operator(\)) operator({) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(rb_inspect)operator(()ident(data)operator(->)ident(klass)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(data)operator(->)ident(recv) operator(==) ident(v)operator(\)) operator({) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(rb_inspect)operator(()ident(v)operator(\)\);) + ident(sharp) operator(=) string<delimiter(")content(.)delimiter(")>operator(;) + operator(}) + reserved(else) operator({) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(rb_inspect)operator(()ident(data)operator(->)ident(recv)operator(\)\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(()delimiter(")>operator(\);) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(rb_inspect)operator(()ident(v)operator(\)\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(\))delimiter(")>operator(\);) + ident(sharp) operator(=) string<delimiter(")content(.)delimiter(")>operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(rb_class2name)operator(()ident(data)operator(->)ident(rklass)operator(\)\);) + reserved(if) operator(()ident(data)operator(->)ident(rklass) operator(!=) ident(data)operator(->)ident(klass)operator(\)) operator({) + ident(VALUE) ident(klass) operator(=) ident(data) operator(->) ident(klass)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(klass) operator(=) ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass)operator(;) + operator(}) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(()delimiter(")>operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(rb_class2name)operator(()ident(klass)operator(\)\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(\))delimiter(")>operator(\);) + operator(}) + operator(}) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(sharp)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(rb_id2name)operator(()ident(data)operator(->)ident(oid)operator(\)\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(>)delimiter(")>operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(mproc)operator(()ident(method)operator(\)) + ident(VALUE) ident(method)operator(;) +operator({) + ident(VALUE) ident(proc)operator(;) + + comment(/* emulate ruby's method call */) + ident(PUSH_ITER)operator(()ident(ITER_CUR)operator(\);) + ident(PUSH_FRAME)operator((\);) + ident(proc) operator(=) ident(rb_block_proc)operator((\);) + ident(POP_FRAME)operator((\);) + ident(POP_ITER)operator((\);) + + reserved(return) ident(proc)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(bmcall)operator(()ident(args)operator(,) ident(method)operator(\)) + ident(VALUE) ident(args)operator(,) ident(method)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(a)operator(;) + ident(VALUE) ident(ret)operator(;) + + ident(a) operator(=) ident(svalue_to_avalue)operator(()ident(args)operator(\);) + ident(ret) operator(=) ident(method_call)operator(()ident(RARRAY)operator(()ident(a)operator(\)->)ident(len)operator(,) ident(RARRAY)operator(()ident(a)operator(\)->)ident(ptr)operator(,) ident(method)operator(\);) + ident(a) operator(=) ident(Qnil)operator(;) comment(/* prevent tail call */) + reserved(return) ident(ret)operator(;) +operator(}) + +ident(VALUE) +ident(rb_proc_new)operator(()ident(func)operator(,) ident(val)operator(\)) + ident(VALUE) operator((*)ident(func)operator(\)()ident(ANYARGS)operator(\);) comment(/* VALUE yieldarg[, VALUE procarg] */) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(struct) ident(BLOCK) operator(*)ident(data)operator(;) + ident(VALUE) ident(proc) operator(=) ident(rb_iterate)operator((()ident(VALUE)operator((*\))ident(_)operator((()ident(VALUE)operator(\)\)\))ident(mproc)operator(,) integer(0)operator(,) ident(func)operator(,) ident(val)operator(\);) + + ident(Data_Get_Struct)operator(()ident(proc)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(data)operator(\);) + ident(data)operator(->)ident(body)operator(->)ident(nd_state) operator(=) ident(YIELD_FUNC_AVALUE)operator(;) + reserved(return) ident(proc)operator(;) +operator(}) + +comment(/* + * call-seq: + * meth.to_proc => prc + * + * Returns a <code>Proc</code> object corresponding to this method. + */) + +directive(static) ident(VALUE) +ident(method_proc)operator(()ident(method)operator(\)) + ident(VALUE) ident(method)operator(;) +operator({) + ident(VALUE) ident(proc)operator(;) + reserved(struct) ident(METHOD) operator(*)ident(mdata)operator(;) + reserved(struct) ident(BLOCK) operator(*)ident(bdata)operator(;) + + ident(proc) operator(=) ident(rb_iterate)operator((()ident(VALUE)operator((*\))ident(_)operator((()ident(VALUE)operator(\)\)\))ident(mproc)operator(,) integer(0)operator(,) ident(bmcall)operator(,) ident(method)operator(\);) + ident(Data_Get_Struct)operator(()ident(method)operator(,) reserved(struct) ident(METHOD)operator(,) ident(mdata)operator(\);) + ident(Data_Get_Struct)operator(()ident(proc)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(bdata)operator(\);) + ident(bdata)operator(->)ident(body)operator(->)ident(nd_file) operator(=) ident(mdata)operator(->)ident(body)operator(->)ident(nd_file)operator(;) + ident(nd_set_line)operator(()ident(bdata)operator(->)ident(body)operator(,) ident(nd_line)operator(()ident(mdata)operator(->)ident(body)operator(\)\);) + ident(bdata)operator(->)ident(body)operator(->)ident(nd_state) operator(=) ident(YIELD_FUNC_SVALUE)operator(;) + + reserved(return) ident(proc)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_obj_is_method)operator(()ident(m)operator(\)) + ident(VALUE) ident(m)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(m)operator(\)) operator(==) ident(T_DATA) operator(&&) ident(RDATA)operator(()ident(m)operator(\)->)ident(dmark) operator(==) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(bm_mark)operator(\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * define_method(symbol, method\) => new_method + * define_method(symbol\) { block } => proc + * + * Defines an instance method in the receiver. The _method_ + * parameter can be a +Proc+ or +Method+ object. + * If a block is specified, it is used as the method body. This block + * is evaluated using <code>instance_eval</code>, a point that is + * tricky to demonstrate because <code>define_method</code> is private. + * (This is why we resort to the +send+ hack in this example.\) + * + * class A + * def fred + * puts "In Fred" + * end + * def create_method(name, &block\) + * self.class.send(:define_method, name, &block\) + * end + * define_method(:wilma\) { puts "Charge it!" } + * end + * class B < A + * define_method(:barney, instance_method(:fred\)\) + * end + * a = B.new + * a.barney + * a.wilma + * a.create_method(:betty\) { p self } + * a.betty + * + * <em>produces:</em> + * + * In Fred + * Charge it! + * #<B:0x401b39e8> + */) + +directive(static) ident(VALUE) +ident(rb_mod_define_method)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(mod)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(mod)operator(;) +operator({) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(body)operator(;) + ident(NODE) operator(*)ident(node)operator(;) + pre_type(int) ident(noex)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(id) operator(=) ident(rb_to_id)operator(()ident(argv)operator([)integer(0)operator(]\);) + ident(body) operator(=) ident(proc_lambda)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(id) operator(=) ident(rb_to_id)operator(()ident(argv)operator([)integer(0)operator(]\);) + ident(body) operator(=) ident(argv)operator([)integer(1)operator(];) + reserved(if) operator((!)ident(rb_obj_is_method)operator(()ident(body)operator(\)) operator(&&) operator(!)ident(rb_obj_is_proc)operator(()ident(body)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type %s (expected Proc/Method\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(body)operator(\)\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 1\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + reserved(if) operator(()ident(RDATA)operator(()ident(body)operator(\)->)ident(dmark) operator(==) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(bm_mark)operator(\)) operator({) + ident(node) operator(=) ident(NEW_DMETHOD)operator(()ident(method_unbind)operator(()ident(body)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(RDATA)operator(()ident(body)operator(\)->)ident(dmark) operator(==) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(blk_mark)operator(\)) operator({) + reserved(struct) ident(BLOCK) operator(*)ident(block)operator(;) + + ident(body) operator(=) ident(proc_clone)operator(()ident(body)operator(\);) + ident(Data_Get_Struct)operator(()ident(body)operator(,) reserved(struct) ident(BLOCK)operator(,) ident(block)operator(\);) + ident(block)operator(->)ident(frame)operator(.)ident(last_func) operator(=) ident(id)operator(;) + ident(block)operator(->)ident(frame)operator(.)ident(orig_func) operator(=) ident(id)operator(;) + ident(block)operator(->)ident(frame)operator(.)ident(last_class) operator(=) ident(mod)operator(;) + ident(node) operator(=) ident(NEW_BMETHOD)operator(()ident(body)operator(\);) + operator(}) + reserved(else) operator({) + comment(/* type error */) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type (expected Proc/Method\))delimiter(")>operator(\);) + operator(}) + + ident(noex) operator(=) ident(NOEX_PUBLIC)operator(;) + reserved(if) operator(()ident(ruby_cbase) operator(==) ident(mod)operator(\)) operator({) + reserved(if) operator(()ident(SCOPE_TEST)operator(()ident(SCOPE_PRIVATE)operator(\)\)) operator({) + ident(noex) operator(=) ident(NOEX_PRIVATE)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(SCOPE_TEST)operator(()ident(SCOPE_PROTECTED)operator(\)\)) operator({) + ident(noex) operator(=) ident(NOEX_PROTECTED)operator(;) + operator(}) + operator(}) + ident(rb_add_method)operator(()ident(mod)operator(,) ident(id)operator(,) ident(node)operator(,) ident(noex)operator(\);) + reserved(return) ident(body)operator(;) +operator(}) + +comment(/* + * <code>Proc</code> objects are blocks of code that have been bound to + * a set of local variables. Once bound, the code may be called in + * different contexts and still access those variables. + * + * def gen_times(factor\) + * return Proc.new {|n| n*factor } + * end + * + * times3 = gen_times(3\) + * times5 = gen_times(5\) + * + * times3.call(12\) #=> 36 + * times5.call(5\) #=> 25 + * times3.call(times5.call(4\)\) #=> 60 + * + */) + +directive(void) +ident(Init_Proc)operator((\)) +operator({) + ident(rb_eLocalJumpError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(LocalJumpError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_define_method)operator(()ident(rb_eLocalJumpError)operator(,) string<delimiter(")content(exit_value)delimiter(")>operator(,) ident(localjump_xvalue)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_eLocalJumpError)operator(,) string<delimiter(")content(reason)delimiter(")>operator(,) ident(localjump_reason)operator(,) integer(0)operator(\);) + + ident(rb_global_variable)operator((&)ident(exception_error)operator(\);) + ident(exception_error) operator(=) ident(rb_exc_new3)operator(()ident(rb_eFatal)operator(,) + ident(rb_obj_freeze)operator(()ident(rb_str_new2)operator(()string<delimiter(")content(exception reentered)delimiter(")>operator(\)\)\);) + ident(OBJ_TAINT)operator(()ident(exception_error)operator(\);) + ident(OBJ_FREEZE)operator(()ident(exception_error)operator(\);) + + ident(rb_eSysStackError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(SystemStackError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_global_variable)operator((&)ident(sysstack_error)operator(\);) + ident(sysstack_error) operator(=) ident(rb_exc_new3)operator(()ident(rb_eSysStackError)operator(,) + ident(rb_obj_freeze)operator(()ident(rb_str_new2)operator(()string<delimiter(")content(stack level too deep)delimiter(")>operator(\)\)\);) + ident(OBJ_TAINT)operator(()ident(sysstack_error)operator(\);) + ident(OBJ_FREEZE)operator(()ident(sysstack_error)operator(\);) + + ident(rb_cProc) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Proc)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cProc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(proc_s_new)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content(clone)delimiter(")>operator(,) ident(proc_clone)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content(dup)delimiter(")>operator(,) ident(proc_dup)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content(call)delimiter(")>operator(,) ident(proc_call)operator(,) operator(-)integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content(arity)delimiter(")>operator(,) ident(proc_arity)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(proc_call)operator(,) operator(-)integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(proc_eq)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(proc_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content(to_proc)delimiter(")>operator(,) ident(proc_to_self)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProc)operator(,) string<delimiter(")content(binding)delimiter(")>operator(,) ident(proc_binding)operator(,) integer(0)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(proc)delimiter(")>operator(,) ident(proc_lambda)operator(,) integer(0)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(lambda)delimiter(")>operator(,) ident(proc_lambda)operator(,) integer(0)operator(\);) + + ident(rb_cMethod) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Method)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cMethod)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cMethod)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + ident(rb_define_method)operator(()ident(rb_cMethod)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(method_eq)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMethod)operator(,) string<delimiter(")content(clone)delimiter(")>operator(,) ident(method_clone)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMethod)operator(,) string<delimiter(")content(call)delimiter(")>operator(,) ident(method_call)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMethod)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(method_call)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMethod)operator(,) string<delimiter(")content(arity)delimiter(")>operator(,) ident(method_arity)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMethod)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(method_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMethod)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(method_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMethod)operator(,) string<delimiter(")content(to_proc)delimiter(")>operator(,) ident(method_proc)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMethod)operator(,) string<delimiter(")content(unbind)delimiter(")>operator(,) ident(method_unbind)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(method)delimiter(")>operator(,) ident(rb_obj_method)operator(,) integer(1)operator(\);) + + ident(rb_cUnboundMethod) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(UnboundMethod)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cUnboundMethod)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cUnboundMethod)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + ident(rb_define_method)operator(()ident(rb_cUnboundMethod)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(method_eq)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cUnboundMethod)operator(,) string<delimiter(")content(clone)delimiter(")>operator(,) ident(method_clone)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cUnboundMethod)operator(,) string<delimiter(")content(arity)delimiter(")>operator(,) ident(method_arity)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cUnboundMethod)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(method_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cUnboundMethod)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(method_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cUnboundMethod)operator(,) string<delimiter(")content(bind)delimiter(")>operator(,) ident(umethod_bind)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(instance_method)delimiter(")>operator(,) ident(rb_mod_method)operator(,) integer(1)operator(\);) +operator(}) + +comment(/* + * Objects of class <code>Binding</code> encapsulate the execution + * context at some particular place in the code and retain this context + * for future use. The variables, methods, value of <code>self</code>, + * and possibly an iterator block that can be accessed in this context + * are all retained. Binding objects can be created using + * <code>Kernel#binding</code>, and are made available to the callback + * of <code>Kernel#set_trace_func</code>. + * + * These binding objects can be passed as the second argument of the + * <code>Kernel#eval</code> method, establishing an environment for the + * evaluation. + * + * class Demo + * def initialize(n\) + * @secret = n + * end + * def getBinding + * return binding(\) + * end + * end + * + * k1 = Demo.new(99\) + * b1 = k1.getBinding + * k2 = Demo.new(-3\) + * b2 = k2.getBinding + * + * eval("@secret", b1\) #=> 99 + * eval("@secret", b2\) #=> -3 + * eval("@secret"\) #=> nil + * + * Binding objects have no class-specific methods. + * + */) + +directive(void) +ident(Init_Binding)operator((\)) +operator({) + ident(rb_cBinding) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Binding)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cBinding)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cBinding)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + ident(rb_define_method)operator(()ident(rb_cBinding)operator(,) string<delimiter(")content(clone)delimiter(")>operator(,) ident(proc_clone)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cBinding)operator(,) string<delimiter(")content(dup)delimiter(")>operator(,) ident(proc_dup)operator(,) integer(0)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(binding)delimiter(")>operator(,) ident(rb_f_binding)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* Windows SEH refers data on the stack. */) +preprocessor(#undef) ident(SAVE_WIN32_EXCEPTION_LIST) +preprocessor(#if) ident(defined) ident(_WIN32) operator(||) ident(defined) ident(__CYGWIN__) +preprocessor(#if) ident(defined) ident(__CYGWIN__) +reserved(typedef) pre_type(unsigned) pre_type(long) ident(DWORD)operator(;) +preprocessor(#endif) + +directive(static) directive(inline) ident(DWORD) +ident(win32_get_exception_list)operator((\)) +operator({) + ident(DWORD) ident(p)operator(;) +preprocessor(# if) ident(defined) ident(_MSC_VER) +preprocessor(# ifdef) ident(_M_IX86) +preprocessor(# define) ident(SAVE_WIN32_EXCEPTION_LIST) +preprocessor(# if) ident(_MSC_VER) operator(>=) integer(1310) + comment(/* warning: unsafe assignment to fs:0 ... this is ok */) +preprocessor(# pragma) ident(warning)operator(()label(disable)operator(:) integer(4733)operator(\)) +preprocessor(# endif) + ident(__asm) ident(mov) ident(eax)operator(,) label(fs)operator(:[)integer(0)operator(];) + ident(__asm) ident(mov) ident(p)operator(,) ident(eax)operator(;) +preprocessor(# endif) +preprocessor(# elif) ident(defined) ident(__GNUC__) +preprocessor(# ifdef) ident(__i386__) +preprocessor(# define) ident(SAVE_WIN32_EXCEPTION_LIST) + ident(__asm__)operator(()string<delimiter(")content(movl %%fs:0,%0)delimiter(")> operator(:) string<delimiter(")content(=r)delimiter(")>operator(()ident(p)operator(\)\);) +preprocessor(# endif) +preprocessor(# elif) ident(defined) ident(__BORLANDC__) +preprocessor(# define) ident(SAVE_WIN32_EXCEPTION_LIST) + ident(__emit__)operator(()hex(0x64)operator(,) hex(0xA1)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(\);) comment(/* mov eax, fs:[0] */) + ident(p) operator(=) ident(_EAX)operator(;) +preprocessor(# endif) + reserved(return) ident(p)operator(;) +operator(}) + +directive(static) directive(inline) directive(void) +ident(win32_set_exception_list)operator(()ident(p)operator(\)) + ident(DWORD) ident(p)operator(;) +operator({) +preprocessor(# if) ident(defined) ident(_MSC_VER) +preprocessor(# ifdef) ident(_M_IX86) + ident(__asm) ident(mov) ident(eax)operator(,) ident(p)operator(;) + ident(__asm) ident(mov) label(fs)operator(:[)integer(0)operator(],) ident(eax)operator(;) +preprocessor(# endif) +preprocessor(# elif) ident(defined) ident(__GNUC__) +preprocessor(# ifdef) ident(__i386__) + ident(__asm__)operator(()string<delimiter(")content(movl %0,%%fs:0)delimiter(")> operator(::) string<delimiter(")content(r)delimiter(")>operator(()ident(p)operator(\)\);) +preprocessor(# endif) +preprocessor(# elif) ident(defined) ident(__BORLANDC__) + ident(_EAX) operator(=) ident(p)operator(;) + ident(__emit__)operator(()hex(0x64)operator(,) hex(0xA3)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(\);) comment(/* mov fs:[0], eax */) +preprocessor(# endif) +operator(}) + +preprocessor(#if) operator(!)ident(defined) ident(SAVE_WIN32_EXCEPTION_LIST) operator(&&) operator(!)ident(defined) ident(_WIN32_WCE) +preprocessor(# error) ident(unsupported) ident(platform) +preprocessor(#endif) +preprocessor(#endif) + +pre_type(int) ident(rb_thread_pending) operator(=) integer(0)operator(;) + +ident(VALUE) ident(rb_cThread)operator(;) + +directive(extern) ident(VALUE) ident(rb_last_status)operator(;) + +preprocessor(#define) ident(WAIT_FD) operator(()integer(1)operator(<<)integer(0)operator(\)) +preprocessor(#define) ident(WAIT_SELECT) operator(()integer(1)operator(<<)integer(1)operator(\)) +preprocessor(#define) ident(WAIT_TIME) operator(()integer(1)operator(<<)integer(2)operator(\)) +preprocessor(#define) ident(WAIT_JOIN) operator(()integer(1)operator(<<)integer(3)operator(\)) +preprocessor(#define) ident(WAIT_PID) operator(()integer(1)operator(<<)integer(4)operator(\)) + +comment(/* +infty, for this purpose */) +preprocessor(#define) ident(DELAY_INFTY) float(1)ident(E30) + +preprocessor(#if) operator(!)ident(defined) ident(HAVE_PAUSE) +preprocessor(# if) ident(defined) ident(_WIN32) operator(&&) operator(!)ident(defined) ident(__CYGWIN__) +preprocessor(# define) ident(pause)operator((\)) ident(Sleep)operator(()ident(INFINITE)operator(\)) +preprocessor(# else) +preprocessor(# define) ident(pause)operator((\)) ident(sleep)operator(()hex(0x7fffffff)operator(\)) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#define) ident(THREAD_TERMINATING) hex(0x400) comment(/* persistent flag */) +preprocessor(#define) ident(THREAD_NO_ENSURE) hex(0x800) comment(/* persistent flag */) +preprocessor(#define) ident(THREAD_FLAGS_MASK) hex(0xfc00) comment(/* mask for persistent flags */) + +preprocessor(#define) ident(FOREACH_THREAD_FROM)operator(()ident(f)operator(,)ident(x)operator(\)) ident(x) operator(=) ident(f)operator(;) reserved(do) operator({) ident(x) operator(=) ident(x)operator(->)ident(next)operator(;) +preprocessor(#define) ident(END_FOREACH_FROM)operator(()ident(f)operator(,)ident(x)operator(\)) operator(}) reserved(while) operator(()ident(x) operator(!=) ident(f)operator(\)) + +preprocessor(#define) ident(FOREACH_THREAD)operator(()ident(x)operator(\)) ident(FOREACH_THREAD_FROM)operator(()ident(curr_thread)operator(,)ident(x)operator(\)) +preprocessor(#define) ident(END_FOREACH)operator(()ident(x)operator(\)) ident(END_FOREACH_FROM)operator(()ident(curr_thread)operator(,)ident(x)operator(\)) + +reserved(struct) ident(thread_status_t) operator({) + ident(NODE) operator(*)ident(node)operator(;) + + pre_type(int) ident(tracing)operator(;) + ident(VALUE) ident(errinfo)operator(;) + ident(VALUE) ident(last_status)operator(;) + ident(VALUE) ident(last_line)operator(;) + ident(VALUE) ident(last_match)operator(;) + + pre_type(int) ident(safe)operator(;) + + reserved(enum) ident(rb_thread_status) ident(status)operator(;) + pre_type(int) ident(wait_for)operator(;) + pre_type(int) ident(fd)operator(;) + ident(fd_set) ident(readfds)operator(;) + ident(fd_set) ident(writefds)operator(;) + ident(fd_set) ident(exceptfds)operator(;) + pre_type(int) ident(select_value)operator(;) + pre_type(double) ident(delay)operator(;) + ident(rb_thread_t) ident(join)operator(;) +operator(};) + +preprocessor(#define) ident(THREAD_COPY_STATUS)operator(()ident(src)operator(,) ident(dst)operator(\)) operator(()directive(void)operator(\)() \ + operator(()ident(dst)operator(\)->)ident(node) operator(=) operator(()ident(src)operator(\)->)ident(node)operator(,) \ + \ + operator(()ident(dst)operator(\)->)ident(tracing) operator(=) operator(()ident(src)operator(\)->)ident(tracing)operator(,) \ + operator(()ident(dst)operator(\)->)ident(errinfo) operator(=) operator(()ident(src)operator(\)->)ident(errinfo)operator(,) \ + operator(()ident(dst)operator(\)->)ident(last_status) operator(=) operator(()ident(src)operator(\)->)ident(last_status)operator(,) \ + operator(()ident(dst)operator(\)->)ident(last_line) operator(=) operator(()ident(src)operator(\)->)ident(last_line)operator(,) \ + operator(()ident(dst)operator(\)->)ident(last_match) operator(=) operator(()ident(src)operator(\)->)ident(last_match)operator(,) \ + \ + operator(()ident(dst)operator(\)->)ident(safe) operator(=) operator(()ident(src)operator(\)->)ident(safe)operator(,) \ + \ + operator(()ident(dst)operator(\)->)ident(status) operator(=) operator(()ident(src)operator(\)->)ident(status)operator(,) \ + operator(()ident(dst)operator(\)->)ident(wait_for) operator(=) operator(()ident(src)operator(\)->)ident(wait_for)operator(,) \ + operator(()ident(dst)operator(\)->)ident(fd) operator(=) operator(()ident(src)operator(\)->)ident(fd)operator(,) \ + operator(()ident(dst)operator(\)->)ident(readfds) operator(=) operator(()ident(src)operator(\)->)ident(readfds)operator(,) \ + operator(()ident(dst)operator(\)->)ident(writefds) operator(=) operator(()ident(src)operator(\)->)ident(writefds)operator(,) \ + operator(()ident(dst)operator(\)->)ident(exceptfds) operator(=) operator(()ident(src)operator(\)->)ident(exceptfds)operator(,) \ + operator(()ident(dst)operator(\)->)ident(select_value) operator(=) operator(()ident(src)operator(\)->)ident(select_value)operator(,) \ + operator(()ident(dst)operator(\)->)ident(delay) operator(=) operator(()ident(src)operator(\)->)ident(delay)operator(,) \ + operator(()ident(dst)operator(\)->)ident(join) operator(=) operator(()ident(src)operator(\)->)ident(join)operator(,) \ + integer(0)operator(\)) + +pre_type(int) +ident(rb_thread_set_raised)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + reserved(if) operator(()ident(th)operator(->)ident(flags) operator(&) ident(RAISED_EXCEPTION)operator(\)) operator({) + reserved(return) integer(1)operator(;) + operator(}) + ident(th)operator(->)ident(flags) operator(|=) ident(RAISED_EXCEPTION)operator(;) + reserved(return) integer(0)operator(;) +operator(}) + +pre_type(int) +ident(rb_thread_reset_raised)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + reserved(if) operator((!()ident(th)operator(->)ident(flags) operator(&) ident(RAISED_EXCEPTION)operator(\)\)) operator({) + reserved(return) integer(0)operator(;) + operator(}) + ident(th)operator(->)ident(flags) operator(&=) operator(~)ident(RAISED_EXCEPTION)operator(;) + reserved(return) integer(1)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(thread_no_ensure)operator((\)) +operator({) + reserved(return) operator((()ident(curr_thread)operator(->)ident(flags) operator(&) ident(THREAD_NO_ENSURE)operator(\)) operator(==) ident(THREAD_NO_ENSURE)operator(\);) +operator(}) + +directive(static) directive(void) ident(rb_thread_ready) ident(_)operator((()ident(rb_thread_t)operator(\)\);) + +directive(static) ident(VALUE) ident(run_trap_eval) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(run_trap_eval)operator(()ident(arg)operator(\)) + ident(VALUE) ident(arg)operator(;) +operator({) + ident(VALUE) operator(*)ident(p) operator(=) operator(()ident(VALUE) operator(*\))ident(arg)operator(;) + reserved(return) ident(rb_eval_cmd)operator(()ident(p)operator([)integer(0)operator(],) ident(p)operator([)integer(1)operator(],) operator(()pre_type(int)operator(\))ident(p)operator([)integer(2)operator(]\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_trap_eval)operator(()ident(cmd)operator(,) ident(sig)operator(,) ident(safe)operator(\)) + ident(VALUE) ident(cmd)operator(;) + pre_type(int) ident(sig)operator(,) ident(safe)operator(;) +operator({) + pre_type(int) ident(state)operator(;) + ident(VALUE) ident(val) operator(=) ident(Qnil)operator(;) comment(/* OK */) + directive(volatile) reserved(struct) ident(thread_status_t) ident(save)operator(;) + ident(VALUE) ident(arg)operator([)integer(3)operator(];) + + ident(arg)operator([)integer(0)operator(]) operator(=) ident(cmd)operator(;) + ident(arg)operator([)integer(1)operator(]) operator(=) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(INT2FIX)operator(()ident(sig)operator(\)\);) + ident(arg)operator([)integer(2)operator(]) operator(=) operator(()ident(VALUE)operator(\))ident(safe)operator(;) + ident(THREAD_COPY_STATUS)operator(()ident(curr_thread)operator(,) operator(&)ident(save)operator(\);) + ident(rb_thread_ready)operator(()ident(curr_thread)operator(\);) + ident(PUSH_ITER)operator(()ident(ITER_NOT)operator(\);) + ident(val) operator(=) ident(rb_protect)operator(()ident(run_trap_eval)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(,) operator(&)ident(state)operator(\);) + ident(POP_ITER)operator((\);) + ident(THREAD_COPY_STATUS)operator((&)ident(save)operator(,) ident(curr_thread)operator(\);) + + reserved(if) operator(()ident(state)operator(\)) operator({) + ident(rb_trap_immediate) operator(=) integer(0)operator(;) + ident(rb_thread_ready)operator(()ident(curr_thread)operator(\);) + ident(JUMP_TAG)operator(()ident(state)operator(\);) + operator(}) + + reserved(if) operator(()ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_STOPPED)operator(\)) operator({) + ident(rb_thread_schedule)operator((\);) + operator(}) + ident(errno) operator(=) ident(EINTR)operator(;) + + reserved(return) ident(val)operator(;) +operator(}) + +directive(static) directive(const) pre_type(char) operator(*) +ident(thread_status_name)operator(()ident(status)operator(\)) + reserved(enum) ident(rb_thread_status) ident(status)operator(;) +operator({) + reserved(switch) operator(()ident(status)operator(\)) operator({) + reserved(case) label(THREAD_RUNNABLE)operator(:) + reserved(return) string<delimiter(")content(run)delimiter(")>operator(;) + reserved(case) label(THREAD_STOPPED)operator(:) + reserved(return) string<delimiter(")content(sleep)delimiter(")>operator(;) + reserved(case) label(THREAD_TO_KILL)operator(:) + reserved(return) string<delimiter(")content(aborting)delimiter(")>operator(;) + reserved(case) label(THREAD_KILLED)operator(:) + reserved(return) string<delimiter(")content(dead)delimiter(")>operator(;) + reserved(default)operator(:) + reserved(return) string<delimiter(")content(unknown)delimiter(")>operator(;) + operator(}) +operator(}) + +comment(/* $SAFE accessor */) +directive(void) +ident(rb_set_safe_level)operator(()ident(level)operator(\)) + pre_type(int) ident(level)operator(;) +operator({) + reserved(if) operator(()ident(level) operator(>) ident(ruby_safe_level)operator(\)) operator({) + reserved(if) operator(()ident(level) operator(>) ident(SAFE_LEVEL_MAX)operator(\)) ident(level) operator(=) ident(SAFE_LEVEL_MAX)operator(;) + ident(ruby_safe_level) operator(=) ident(level)operator(;) + ident(curr_thread)operator(->)ident(safe) operator(=) ident(level)operator(;) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(safe_getter)operator((\)) +operator({) + reserved(return) ident(INT2NUM)operator(()ident(ruby_safe_level)operator(\);) +operator(}) + +directive(static) directive(void) +ident(safe_setter)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(int) ident(level) operator(=) ident(NUM2INT)operator(()ident(val)operator(\);) + + reserved(if) operator(()ident(level) operator(<) ident(ruby_safe_level)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(tried to downgrade safe level from %d to %d)delimiter(")>operator(,) + ident(ruby_safe_level)operator(,) ident(level)operator(\);) + operator(}) + reserved(if) operator(()ident(level) operator(>) ident(SAFE_LEVEL_MAX)operator(\)) ident(level) operator(=) ident(SAFE_LEVEL_MAX)operator(;) + ident(ruby_safe_level) operator(=) ident(level)operator(;) + ident(curr_thread)operator(->)ident(safe) operator(=) ident(level)operator(;) +operator(}) + +comment(/* Return the current time as a floating-point number */) +directive(static) pre_type(double) +ident(timeofday)operator((\)) +operator({) + reserved(struct) ident(timeval) ident(tv)operator(;) +preprocessor(#ifdef) ident(CLOCK_MONOTONIC) + reserved(struct) ident(timespec) ident(tp)operator(;) + + reserved(if) operator(()ident(clock_gettime)operator(()ident(CLOCK_MONOTONIC)operator(,) operator(&)ident(tp)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(return) operator(()pre_type(double)operator(\))ident(tp)operator(.)ident(tv_sec) operator(+) operator(()pre_type(double)operator(\))ident(tp)operator(.)ident(tv_nsec) operator(*) float(1)ident(e)operator(-)integer(9)operator(;) + operator(}) +preprocessor(#endif) + ident(gettimeofday)operator((&)ident(tv)operator(,) pre_constant(NULL)operator(\);) + reserved(return) operator(()pre_type(double)operator(\))ident(tv)operator(.)ident(tv_sec) operator(+) operator(()pre_type(double)operator(\))ident(tv)operator(.)ident(tv_usec) operator(*) float(1)ident(e)operator(-)integer(6)operator(;) +operator(}) + +preprocessor(#define) ident(STACK)operator(()ident(addr)operator(\)) operator(()ident(th)operator(->)ident(stk_pos)operator(<()ident(VALUE)operator(*\)()ident(addr)operator(\)) operator(&&) operator(()ident(VALUE)operator(*\)()ident(addr)operator(\)<)ident(th)operator(->)ident(stk_pos)operator(+)ident(th)operator(->)ident(stk_len)operator(\)) +preprocessor(#define) ident(ADJ)operator(()ident(addr)operator(\)) operator(()directive(void)operator(*\)()ident(STACK)operator(()ident(addr)operator(\)?((()ident(VALUE)operator(*\)()ident(addr)operator(\)-)ident(th)operator(->)ident(stk_pos)operator(\)+)ident(th)operator(->)ident(stk_ptr)operator(\):()ident(VALUE)operator(*\)()ident(addr)operator(\)\)) +directive(static) directive(void) +ident(thread_mark)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + reserved(struct) ident(FRAME) operator(*)ident(frame)operator(;) + reserved(struct) ident(BLOCK) operator(*)ident(block)operator(;) + + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(result)operator(\);) + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(thread)operator(\);) + reserved(if) operator(()ident(th)operator(->)ident(join)operator(\)) ident(rb_gc_mark)operator(()ident(th)operator(->)ident(join)operator(->)ident(thread)operator(\);) + + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(klass)operator(\);) + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(wrapper)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(th)operator(->)ident(cref)operator(\);) + + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(th)operator(->)ident(scope)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(th)operator(->)ident(dyna_vars)operator(\);) + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(errinfo)operator(\);) + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(last_status)operator(\);) + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(last_line)operator(\);) + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(last_match)operator(\);) + ident(rb_mark_tbl)operator(()ident(th)operator(->)ident(locals)operator(\);) + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(thgroup)operator(\);) + ident(rb_gc_mark_maybe)operator(()ident(th)operator(->)ident(sandbox)operator(\);) + + comment(/* mark data in copied stack */) + reserved(if) operator(()ident(th) operator(==) ident(curr_thread)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(==) ident(THREAD_KILLED)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(th)operator(->)ident(stk_len) operator(==) integer(0)operator(\)) reserved(return)operator(;) comment(/* stack not active, no need to mark. */) + reserved(if) operator(()ident(th)operator(->)ident(stk_ptr)operator(\)) operator({) + ident(rb_gc_mark_locations)operator(()ident(th)operator(->)ident(stk_ptr)operator(,) ident(th)operator(->)ident(stk_ptr)operator(+)ident(th)operator(->)ident(stk_len)operator(\);) +preprocessor(#if) ident(defined)operator(()ident(THINK_C)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) + ident(rb_gc_mark_locations)operator(()ident(th)operator(->)ident(stk_ptr)operator(+)integer(2)operator(,) ident(th)operator(->)ident(stk_ptr)operator(+)ident(th)operator(->)ident(stk_len)operator(+)integer(2)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(__ia64) + reserved(if) operator(()ident(th)operator(->)ident(bstr_ptr)operator(\)) operator({) + ident(rb_gc_mark_locations)operator(()ident(th)operator(->)ident(bstr_ptr)operator(,) ident(th)operator(->)ident(bstr_ptr)operator(+)ident(th)operator(->)ident(bstr_len)operator(\);) + operator(}) +preprocessor(#endif) + operator(}) + ident(frame) operator(=) ident(th)operator(->)ident(frame)operator(;) + reserved(while) operator(()ident(frame) operator(&&) ident(frame) operator(!=) ident(top_frame)operator(\)) operator({) + ident(frame) operator(=) ident(ADJ)operator(()ident(frame)operator(\);) + ident(rb_gc_mark_frame)operator(()ident(frame)operator(\);) + reserved(if) operator(()ident(frame)operator(->)ident(tmp)operator(\)) operator({) + reserved(struct) ident(FRAME) operator(*)ident(tmp) operator(=) ident(frame)operator(->)ident(tmp)operator(;) + + reserved(while) operator(()ident(tmp) operator(&&) ident(tmp) operator(!=) ident(top_frame)operator(\)) operator({) + ident(tmp) operator(=) ident(ADJ)operator(()ident(tmp)operator(\);) + ident(rb_gc_mark_frame)operator(()ident(tmp)operator(\);) + ident(tmp) operator(=) ident(tmp)operator(->)ident(prev)operator(;) + operator(}) + operator(}) + ident(frame) operator(=) ident(frame)operator(->)ident(prev)operator(;) + operator(}) + ident(block) operator(=) ident(th)operator(->)ident(block)operator(;) + reserved(while) operator(()ident(block)operator(\)) operator({) + ident(block) operator(=) ident(ADJ)operator(()ident(block)operator(\);) + ident(rb_gc_mark_frame)operator((&)ident(block)operator(->)ident(frame)operator(\);) + ident(block) operator(=) ident(block)operator(->)ident(prev)operator(;) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(mark_loading_thread)operator(()ident(key)operator(,) ident(value)operator(,) ident(lev)operator(\)) + ident(ID) ident(key)operator(;) + ident(VALUE) ident(value)operator(;) + pre_type(int) ident(lev)operator(;) +operator({) + ident(rb_gc_mark)operator(((()ident(rb_thread_t)operator(\))ident(value)operator(\)->)ident(thread)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(void) +ident(rb_gc_mark_threads)operator((\)) +operator({) + ident(rb_thread_t) ident(th)operator(;) + + comment(/* static global mark */) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(ruby_cref)operator(\);) + + reserved(if) operator((!)ident(curr_thread)operator(\)) reserved(return)operator(;) + ident(rb_gc_mark)operator(()ident(main_thread)operator(->)ident(thread)operator(\);) + ident(rb_gc_mark)operator(()ident(curr_thread)operator(->)ident(thread)operator(\);) + ident(FOREACH_THREAD_FROM)operator(()ident(main_thread)operator(,) ident(th)operator(\)) operator({) + reserved(switch) operator(()ident(th)operator(->)ident(status)operator(\)) operator({) + reserved(case) label(THREAD_TO_KILL)operator(:) + reserved(case) label(THREAD_RUNNABLE)operator(:) + reserved(break)operator(;) + reserved(case) label(THREAD_STOPPED)operator(:) + reserved(if) operator(()ident(th)operator(->)ident(wait_for)operator(\)) reserved(break)operator(;) + reserved(default)operator(:) + reserved(continue)operator(;) + operator(}) + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(thread)operator(\);) + operator(}) ident(END_FOREACH_FROM)operator(()ident(main_thread)operator(,) ident(th)operator(\);) + reserved(if) operator(()ident(loading_tbl)operator(\)) ident(st_foreach)operator(()ident(loading_tbl)operator(,) ident(mark_loading_thread)operator(,) integer(0)operator(\);) +operator(}) + +directive(void) +ident(rb_gc_abort_threads)operator((\)) +operator({) + ident(rb_thread_t) ident(th)operator(;) + + reserved(if) operator((!)ident(main_thread)operator(\)) + reserved(return)operator(;) + + ident(FOREACH_THREAD_FROM)operator(()ident(main_thread)operator(,) ident(th)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(th)operator(->)ident(thread)operator(,) ident(FL_MARK)operator(\)\)) reserved(continue)operator(;) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(==) ident(THREAD_STOPPED)operator(\)) operator({) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_TO_KILL)operator(;) + ident(rb_gc_mark)operator(()ident(th)operator(->)ident(thread)operator(\);) + operator(}) + operator(}) ident(END_FOREACH_FROM)operator(()ident(main_thread)operator(,) ident(th)operator(\);) +operator(}) + +directive(static) directive(inline) directive(void) +ident(stack_free)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + reserved(if) operator(()ident(th)operator(->)ident(stk_ptr)operator(\)) ident(free)operator(()ident(th)operator(->)ident(stk_ptr)operator(\);) + ident(th)operator(->)ident(stk_ptr) operator(=) integer(0)operator(;) +preprocessor(#ifdef) ident(__ia64) + reserved(if) operator(()ident(th)operator(->)ident(bstr_ptr)operator(\)) ident(free)operator(()ident(th)operator(->)ident(bstr_ptr)operator(\);) + ident(th)operator(->)ident(bstr_ptr) operator(=) integer(0)operator(;) +preprocessor(#endif) +operator(}) + +directive(static) directive(void) +ident(thread_free)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + ident(stack_free)operator(()ident(th)operator(\);) + reserved(if) operator(()ident(th)operator(->)ident(locals)operator(\)) ident(st_free_table)operator(()ident(th)operator(->)ident(locals)operator(\);) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(!=) ident(THREAD_KILLED)operator(\)) operator({) + reserved(if) operator(()ident(th)operator(->)ident(prev)operator(\)) ident(th)operator(->)ident(prev)operator(->)ident(next) operator(=) ident(th)operator(->)ident(next)operator(;) + reserved(if) operator(()ident(th)operator(->)ident(next)operator(\)) ident(th)operator(->)ident(next)operator(->)ident(prev) operator(=) ident(th)operator(->)ident(prev)operator(;) + operator(}) + reserved(if) operator(()ident(th) operator(!=) ident(main_thread)operator(\)) ident(free)operator(()ident(th)operator(\);) +operator(}) + +directive(static) ident(rb_thread_t) +ident(rb_thread_check)operator(()ident(data)operator(\)) + ident(VALUE) ident(data)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(data)operator(\)) operator(!=) ident(T_DATA) operator(||) ident(RDATA)operator(()ident(data)operator(\)->)ident(dmark) operator(!=) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(thread_mark)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type %s (expected Thread\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(data)operator(\)\);) + operator(}) + reserved(return) operator(()ident(rb_thread_t)operator(\))ident(RDATA)operator(()ident(data)operator(\)->)ident(data)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(rb_thread_raise) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(rb_thread_t)operator(\)\);) + +directive(static) ident(VALUE) ident(th_raise_exception)operator(;) +directive(static) ident(NODE) operator(*)ident(th_raise_node)operator(;) +directive(static) ident(VALUE) ident(th_cmd)operator(;) +directive(static) pre_type(int) ident(th_sig)operator(,) ident(th_safe)operator(;) + +preprocessor(#define) ident(RESTORE_NORMAL) integer(1) +preprocessor(#define) ident(RESTORE_FATAL) integer(2) +preprocessor(#define) ident(RESTORE_INTERRUPT) integer(3) +preprocessor(#define) ident(RESTORE_TRAP) integer(4) +preprocessor(#define) ident(RESTORE_RAISE) integer(5) +preprocessor(#define) ident(RESTORE_SIGNAL) integer(6) +preprocessor(#define) ident(RESTORE_EXIT) integer(7) + +directive(extern) ident(VALUE) operator(*)ident(rb_gc_stack_start)operator(;) +preprocessor(#ifdef) ident(__ia64) +directive(extern) ident(VALUE) operator(*)ident(rb_gc_register_stack_start)operator(;) +preprocessor(#endif) + +directive(static) directive(void) +ident(rb_thread_save_context)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + ident(VALUE) operator(*)ident(pos)operator(;) + ident(size_t) ident(len)operator(;) + directive(static) ident(VALUE) ident(tval)operator(;) + + ident(len) operator(=) ident(ruby_stack_length)operator((&)ident(pos)operator(\);) + ident(th)operator(->)ident(stk_len) operator(=) integer(0)operator(;) + ident(th)operator(->)ident(stk_pos) operator(=) ident(pos)operator(;) + reserved(if) operator(()ident(len) operator(>) ident(th)operator(->)ident(stk_max)operator(\)) operator({) + ident(VALUE) operator(*)ident(ptr) operator(=) ident(realloc)operator(()ident(th)operator(->)ident(stk_ptr)operator(,) reserved(sizeof)operator(()ident(VALUE)operator(\)) operator(*) ident(len)operator(\);) + reserved(if) operator((!)ident(ptr)operator(\)) ident(rb_memerror)operator((\);) + ident(th)operator(->)ident(stk_ptr) operator(=) ident(ptr)operator(;) + ident(th)operator(->)ident(stk_max) operator(=) ident(len)operator(;) + operator(}) + ident(th)operator(->)ident(stk_len) operator(=) ident(len)operator(;) + ident(FLUSH_REGISTER_WINDOWS)operator(;) + ident(MEMCPY)operator(()ident(th)operator(->)ident(stk_ptr)operator(,) ident(th)operator(->)ident(stk_pos)operator(,) ident(VALUE)operator(,) ident(th)operator(->)ident(stk_len)operator(\);) +preprocessor(#ifdef) ident(__ia64) + ident(th)operator(->)ident(bstr_pos) operator(=) ident(rb_gc_register_stack_start)operator(;) + ident(len) operator(=) operator(()ident(VALUE)operator(*\))ident(rb_ia64_bsp)operator((\)) operator(-) ident(th)operator(->)ident(bstr_pos)operator(;) + ident(th)operator(->)ident(bstr_len) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(len) operator(>) ident(th)operator(->)ident(bstr_max)operator(\)) operator({) + ident(VALUE) operator(*)ident(ptr) operator(=) ident(realloc)operator(()ident(th)operator(->)ident(bstr_ptr)operator(,) reserved(sizeof)operator(()ident(VALUE)operator(\)) operator(*) ident(len)operator(\);) + reserved(if) operator((!)ident(ptr)operator(\)) ident(rb_memerror)operator((\);) + ident(th)operator(->)ident(bstr_ptr) operator(=) ident(ptr)operator(;) + ident(th)operator(->)ident(bstr_max) operator(=) ident(len)operator(;) + operator(}) + ident(th)operator(->)ident(bstr_len) operator(=) ident(len)operator(;) + ident(rb_ia64_flushrs)operator((\);) + ident(MEMCPY)operator(()ident(th)operator(->)ident(bstr_ptr)operator(,) ident(th)operator(->)ident(bstr_pos)operator(,) ident(VALUE)operator(,) ident(th)operator(->)ident(bstr_len)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SAVE_WIN32_EXCEPTION_LIST) + ident(th)operator(->)ident(win32_exception_list) operator(=) ident(win32_get_exception_list)operator((\);) +preprocessor(#endif) + + ident(th)operator(->)ident(frame) operator(=) ident(ruby_frame)operator(;) + ident(th)operator(->)ident(scope) operator(=) ident(ruby_scope)operator(;) + ident(ruby_scope)operator(->)ident(flags) operator(|=) ident(SCOPE_DONT_RECYCLE)operator(;) + ident(th)operator(->)ident(klass) operator(=) ident(ruby_class)operator(;) + ident(th)operator(->)ident(wrapper) operator(=) ident(ruby_wrapper)operator(;) + ident(th)operator(->)ident(cref) operator(=) ident(ruby_cref)operator(;) + ident(th)operator(->)ident(dyna_vars) operator(=) ident(ruby_dyna_vars)operator(;) + ident(th)operator(->)ident(block) operator(=) ident(ruby_block)operator(;) + ident(th)operator(->)ident(flags) operator(&=) ident(THREAD_FLAGS_MASK)operator(;) + ident(th)operator(->)ident(flags) operator(|=) operator(()ident(rb_trap_immediate)operator(<<)integer(8)operator(\)) operator(|) ident(scope_vmode)operator(;) + ident(th)operator(->)ident(iter) operator(=) ident(ruby_iter)operator(;) + ident(th)operator(->)ident(tag) operator(=) ident(prot_tag)operator(;) + ident(th)operator(->)ident(tracing) operator(=) ident(tracing)operator(;) + ident(th)operator(->)ident(errinfo) operator(=) ident(ruby_errinfo)operator(;) + ident(th)operator(->)ident(last_status) operator(=) ident(rb_last_status)operator(;) + ident(tval) operator(=) ident(rb_lastline_get)operator((\);) + ident(rb_lastline_set)operator(()ident(th)operator(->)ident(last_line)operator(\);) + ident(th)operator(->)ident(last_line) operator(=) ident(tval)operator(;) + ident(tval) operator(=) ident(rb_backref_get)operator((\);) + ident(rb_backref_set)operator(()ident(th)operator(->)ident(last_match)operator(\);) + ident(th)operator(->)ident(last_match) operator(=) ident(tval)operator(;) + ident(th)operator(->)ident(safe) operator(=) ident(ruby_safe_level)operator(;) + + ident(th)operator(->)ident(node) operator(=) ident(ruby_current_node)operator(;) + reserved(if) operator(()ident(ruby_sandbox_save) operator(!=) pre_constant(NULL)operator(\)) operator({) + ident(ruby_sandbox_save)operator(()ident(th)operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(rb_thread_switch)operator(()ident(n)operator(\)) + pre_type(int) ident(n)operator(;) +operator({) + ident(rb_trap_immediate) operator(=) operator(()ident(curr_thread)operator(->)ident(flags)operator(&)hex(0x100)operator(\)?)integer(1)operator(:)integer(0)operator(;) + reserved(switch) operator(()ident(n)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(return) integer(0)operator(;) + reserved(case) label(RESTORE_FATAL)operator(:) + ident(JUMP_TAG)operator(()ident(TAG_FATAL)operator(\);) + reserved(break)operator(;) + reserved(case) label(RESTORE_INTERRUPT)operator(:) + ident(rb_interrupt)operator((\);) + reserved(break)operator(;) + reserved(case) label(RESTORE_TRAP)operator(:) + ident(rb_trap_eval)operator(()ident(th_cmd)operator(,) ident(th_sig)operator(,) ident(th_safe)operator(\);) + reserved(break)operator(;) + reserved(case) label(RESTORE_RAISE)operator(:) + ident(ruby_frame)operator(->)ident(last_func) operator(=) integer(0)operator(;) + ident(ruby_current_node) operator(=) ident(th_raise_node)operator(;) + ident(rb_raise_jump)operator(()ident(th_raise_exception)operator(\);) + reserved(break)operator(;) + reserved(case) label(RESTORE_SIGNAL)operator(:) + ident(rb_thread_signal_raise)operator(()ident(th_sig)operator(\);) + reserved(break)operator(;) + reserved(case) label(RESTORE_EXIT)operator(:) + ident(ruby_errinfo) operator(=) ident(th_raise_exception)operator(;) + ident(ruby_current_node) operator(=) ident(th_raise_node)operator(;) + reserved(if) operator((!)ident(rb_obj_is_kind_of)operator(()ident(ruby_errinfo)operator(,) ident(rb_eSystemExit)operator(\)\)) operator({) + ident(terminate_process)operator(()ident(EXIT_FAILURE)operator(,) ident(ruby_errinfo)operator(\);) + operator(}) + ident(rb_exc_raise)operator(()ident(th_raise_exception)operator(\);) + reserved(break)operator(;) + reserved(case) label(RESTORE_NORMAL)operator(:) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + reserved(return) integer(1)operator(;) +operator(}) + +preprocessor(#define) ident(THREAD_SAVE_CONTEXT)operator(()ident(th)operator(\)) \ + operator(()ident(rb_thread_switch)operator((()ident(FLUSH_REGISTER_WINDOWS)operator(,) ident(ruby_setjmp)operator(()ident(rb_thread_save_context)operator(()ident(th)operator(\),) operator(()ident(th)operator(\)->)ident(context)operator(\)\)\)\)) + +ident(NORETURN)operator(()directive(static) directive(void) ident(rb_thread_restore_context) ident(_)operator((()ident(rb_thread_t)operator(,)pre_type(int)operator(\)\)\);) +ident(NORETURN)operator(()ident(NOINLINE)operator(()directive(static) directive(void) ident(rb_thread_restore_context_0)operator(()ident(rb_thread_t)operator(,)pre_type(int)operator(\)\)\);) +ident(NORETURN)operator(()ident(NOINLINE)operator(()directive(static) directive(void) ident(stack_extend)operator(()ident(rb_thread_t)operator(,) pre_type(int)operator(\)\)\);) + +directive(static) directive(void) +ident(rb_thread_restore_context_0)operator(()ident(rb_thread_t) ident(th)operator(,) pre_type(int) ident(exit)operator(\)) +operator({) + directive(static) ident(rb_thread_t) ident(tmp)operator(;) + directive(static) pre_type(int) ident(ex)operator(;) + directive(static) ident(VALUE) ident(tval)operator(;) + + ident(rb_trap_immediate) operator(=) integer(0)operator(;) comment(/* inhibit interrupts from here */) + reserved(if) operator(()ident(ruby_sandbox_restore) operator(!=) pre_constant(NULL)operator(\)) operator({) + ident(ruby_sandbox_restore)operator(()ident(th)operator(\);) + operator(}) + ident(ruby_frame) operator(=) ident(th)operator(->)ident(frame)operator(;) + ident(ruby_scope) operator(=) ident(th)operator(->)ident(scope)operator(;) + ident(ruby_class) operator(=) ident(th)operator(->)ident(klass)operator(;) + ident(ruby_wrapper) operator(=) ident(th)operator(->)ident(wrapper)operator(;) + ident(ruby_cref) operator(=) ident(th)operator(->)ident(cref)operator(;) + ident(ruby_dyna_vars) operator(=) ident(th)operator(->)ident(dyna_vars)operator(;) + ident(ruby_block) operator(=) ident(th)operator(->)ident(block)operator(;) + ident(scope_vmode) operator(=) ident(th)operator(->)ident(flags)operator(&)ident(SCOPE_MASK)operator(;) + ident(ruby_iter) operator(=) ident(th)operator(->)ident(iter)operator(;) + ident(prot_tag) operator(=) ident(th)operator(->)ident(tag)operator(;) + ident(tracing) operator(=) ident(th)operator(->)ident(tracing)operator(;) + ident(ruby_errinfo) operator(=) ident(th)operator(->)ident(errinfo)operator(;) + ident(rb_last_status) operator(=) ident(th)operator(->)ident(last_status)operator(;) + ident(ruby_safe_level) operator(=) ident(th)operator(->)ident(safe)operator(;) + + ident(ruby_current_node) operator(=) ident(th)operator(->)ident(node)operator(;) + +preprocessor(#ifdef) ident(SAVE_WIN32_EXCEPTION_LIST) + ident(win32_set_exception_list)operator(()ident(th)operator(->)ident(win32_exception_list)operator(\);) +preprocessor(#endif) + ident(tmp) operator(=) ident(th)operator(;) + ident(ex) operator(=) ident(exit)operator(;) + ident(FLUSH_REGISTER_WINDOWS)operator(;) + ident(MEMCPY)operator(()ident(tmp)operator(->)ident(stk_pos)operator(,) ident(tmp)operator(->)ident(stk_ptr)operator(,) ident(VALUE)operator(,) ident(tmp)operator(->)ident(stk_len)operator(\);) +preprocessor(#ifdef) ident(__ia64) + ident(MEMCPY)operator(()ident(tmp)operator(->)ident(bstr_pos)operator(,) ident(tmp)operator(->)ident(bstr_ptr)operator(,) ident(VALUE)operator(,) ident(tmp)operator(->)ident(bstr_len)operator(\);) +preprocessor(#endif) + + ident(tval) operator(=) ident(rb_lastline_get)operator((\);) + ident(rb_lastline_set)operator(()ident(tmp)operator(->)ident(last_line)operator(\);) + ident(tmp)operator(->)ident(last_line) operator(=) ident(tval)operator(;) + ident(tval) operator(=) ident(rb_backref_get)operator((\);) + ident(rb_backref_set)operator(()ident(tmp)operator(->)ident(last_match)operator(\);) + ident(tmp)operator(->)ident(last_match) operator(=) ident(tval)operator(;) + + ident(ruby_longjmp)operator(()ident(tmp)operator(->)ident(context)operator(,) ident(ex)operator(\);) +operator(}) + +preprocessor(#ifdef) ident(__ia64) +preprocessor(#define) ident(C)operator(()ident(a)operator(\)) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#0)operator(,) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#1)operator(,) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#2)operator(,) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#3)operator(,) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#4) +preprocessor(#define) ident(E)operator(()ident(a)operator(\)) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#0)operator(=) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#1)operator(=) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#2)operator(=) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#3)operator(=) ident(rse_)preprocessor(#)preprocessor(#a)preprocessor(#)preprocessor(#4) +directive(static) directive(volatile) pre_type(int) ident(C)operator(()ident(a)operator(\),) ident(C)operator(()ident(b)operator(\),) ident(C)operator(()ident(c)operator(\),) ident(C)operator(()ident(d)operator(\),) ident(C)operator(()ident(e)operator(\);) +directive(static) directive(volatile) pre_type(int) ident(C)operator(()ident(f)operator(\),) ident(C)operator(()ident(g)operator(\),) ident(C)operator(()ident(h)operator(\),) ident(C)operator(()ident(i)operator(\),) ident(C)operator(()ident(j)operator(\);) +directive(static) directive(volatile) pre_type(int) ident(C)operator(()ident(k)operator(\),) ident(C)operator(()ident(l)operator(\),) ident(C)operator(()ident(m)operator(\),) ident(C)operator(()ident(n)operator(\),) ident(C)operator(()ident(o)operator(\);) +directive(static) directive(volatile) pre_type(int) ident(C)operator(()ident(p)operator(\),) ident(C)operator(()ident(q)operator(\),) ident(C)operator(()ident(r)operator(\),) ident(C)operator(()ident(s)operator(\),) ident(C)operator(()ident(t)operator(\);) +pre_type(int) ident(rb_dummy_false) operator(=) integer(0)operator(;) +ident(NORETURN)operator(()ident(NOINLINE)operator(()directive(static) directive(void) ident(register_stack_extend)operator(()ident(rb_thread_t)operator(,) pre_type(int)operator(,) ident(VALUE) operator(*\)\)\);) +directive(static) directive(void) +ident(register_stack_extend)operator(()ident(rb_thread_t) ident(th)operator(,) pre_type(int) ident(exit)operator(,) ident(VALUE) operator(*)ident(curr_bsp)operator(\)) +operator({) + reserved(if) operator(()ident(rb_dummy_false)operator(\)) operator({) + comment(/* use registers as much as possible */) + ident(E)operator(()ident(a)operator(\)) operator(=) ident(E)operator(()ident(b)operator(\)) operator(=) ident(E)operator(()ident(c)operator(\)) operator(=) ident(E)operator(()ident(d)operator(\)) operator(=) ident(E)operator(()ident(e)operator(\)) operator(=) + ident(E)operator(()ident(f)operator(\)) operator(=) ident(E)operator(()ident(g)operator(\)) operator(=) ident(E)operator(()ident(h)operator(\)) operator(=) ident(E)operator(()ident(i)operator(\)) operator(=) ident(E)operator(()ident(j)operator(\)) operator(=) + ident(E)operator(()ident(k)operator(\)) operator(=) ident(E)operator(()ident(l)operator(\)) operator(=) ident(E)operator(()ident(m)operator(\)) operator(=) ident(E)operator(()ident(n)operator(\)) operator(=) ident(E)operator(()ident(o)operator(\)) operator(=) + ident(E)operator(()ident(p)operator(\)) operator(=) ident(E)operator(()ident(q)operator(\)) operator(=) ident(E)operator(()ident(r)operator(\)) operator(=) ident(E)operator(()ident(s)operator(\)) operator(=) ident(E)operator(()ident(t)operator(\)) operator(=) integer(0)operator(;) + ident(E)operator(()ident(a)operator(\)) operator(=) ident(E)operator(()ident(b)operator(\)) operator(=) ident(E)operator(()ident(c)operator(\)) operator(=) ident(E)operator(()ident(d)operator(\)) operator(=) ident(E)operator(()ident(e)operator(\)) operator(=) + ident(E)operator(()ident(f)operator(\)) operator(=) ident(E)operator(()ident(g)operator(\)) operator(=) ident(E)operator(()ident(h)operator(\)) operator(=) ident(E)operator(()ident(i)operator(\)) operator(=) ident(E)operator(()ident(j)operator(\)) operator(=) + ident(E)operator(()ident(k)operator(\)) operator(=) ident(E)operator(()ident(l)operator(\)) operator(=) ident(E)operator(()ident(m)operator(\)) operator(=) ident(E)operator(()ident(n)operator(\)) operator(=) ident(E)operator(()ident(o)operator(\)) operator(=) + ident(E)operator(()ident(p)operator(\)) operator(=) ident(E)operator(()ident(q)operator(\)) operator(=) ident(E)operator(()ident(r)operator(\)) operator(=) ident(E)operator(()ident(s)operator(\)) operator(=) ident(E)operator(()ident(t)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(curr_bsp) operator(<) ident(th)operator(->)ident(bstr_pos)operator(+)ident(th)operator(->)ident(bstr_len)operator(\)) operator({) + ident(register_stack_extend)operator(()ident(th)operator(,) ident(exit)operator(,) operator(()ident(VALUE)operator(*\))ident(rb_ia64_bsp)operator((\)\);) + operator(}) + ident(stack_extend)operator(()ident(th)operator(,) ident(exit)operator(\);) +operator(}) +preprocessor(#undef) ident(C) +preprocessor(#undef) ident(E) +preprocessor(#endif) + +directive(static) directive(void) +ident(stack_extend)operator(()ident(rb_thread_t) ident(th)operator(,) pre_type(int) ident(exit)operator(\)) +operator({) +preprocessor(#define) ident(STACK_PAD_SIZE) integer(1024) + directive(volatile) ident(VALUE) ident(space)operator([)ident(STACK_PAD_SIZE)operator(],) operator(*)ident(sp) operator(=) ident(space)operator(;) + +preprocessor(#if) operator(!)ident(STACK_GROW_DIRECTION) + reserved(if) operator(()ident(space) operator(<) ident(rb_gc_stack_start)operator(\)) operator({) + comment(/* Stack grows downward */) +preprocessor(#endif) +preprocessor(#if) ident(STACK_GROW_DIRECTION) operator(<=) integer(0) + reserved(if) operator(()ident(space) operator(>) ident(th)operator(->)ident(stk_pos)operator(\)) operator({) +preprocessor(# ifdef) ident(HAVE_ALLOCA) + ident(sp) operator(=) ident(ALLOCA_N)operator(()ident(VALUE)operator(,) operator(&)ident(space)operator([)integer(0)operator(]) operator(-) ident(th)operator(->)ident(stk_pos)operator(\);) +preprocessor(# else) + ident(stack_extend)operator(()ident(th)operator(,) ident(exit)operator(\);) +preprocessor(# endif) + operator(}) +preprocessor(#endif) +preprocessor(#if) operator(!)ident(STACK_GROW_DIRECTION) + operator(}) + reserved(else) operator({) + comment(/* Stack grows upward */) +preprocessor(#endif) +preprocessor(#if) ident(STACK_GROW_DIRECTION) operator(>=) integer(0) + reserved(if) operator((&)ident(space)operator([)ident(STACK_PAD_SIZE)operator(]) operator(<) ident(th)operator(->)ident(stk_pos) operator(+) ident(th)operator(->)ident(stk_len)operator(\)) operator({) +preprocessor(# ifdef) ident(HAVE_ALLOCA) + ident(sp) operator(=) ident(ALLOCA_N)operator(()ident(VALUE)operator(,) ident(th)operator(->)ident(stk_pos) operator(+) ident(th)operator(->)ident(stk_len) operator(-) operator(&)ident(space)operator([)ident(STACK_PAD_SIZE)operator(]\);) +preprocessor(# else) + ident(stack_extend)operator(()ident(th)operator(,) ident(exit)operator(\);) +preprocessor(# endif) + operator(}) +preprocessor(#endif) +preprocessor(#if) operator(!)ident(STACK_GROW_DIRECTION) + operator(}) +preprocessor(#endif) + ident(rb_thread_restore_context_0)operator(()ident(th)operator(,) ident(exit)operator(\);) +operator(}) +preprocessor(#ifdef) ident(__ia64) +preprocessor(#define) ident(stack_extend)operator(()ident(th)operator(,) ident(exit)operator(\)) ident(register_stack_extend)operator(()ident(th)operator(,) ident(exit)operator(,) operator(()ident(VALUE)operator(*\))ident(rb_ia64_bsp)operator((\)\)) +preprocessor(#endif) + +directive(static) directive(void) +ident(rb_thread_restore_context)operator(()ident(th)operator(,) ident(exit)operator(\)) + ident(rb_thread_t) ident(th)operator(;) + pre_type(int) ident(exit)operator(;) +operator({) + reserved(if) operator((!)ident(th)operator(->)ident(stk_ptr)operator(\)) ident(rb_bug)operator(()string<delimiter(")content(unsaved context)delimiter(")>operator(\);) + ident(stack_extend)operator(()ident(th)operator(,) ident(exit)operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_thread_ready)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + ident(th)operator(->)ident(wait_for) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(!=) ident(THREAD_TO_KILL)operator(\)) operator({) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_RUNNABLE)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(rb_thread_die)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + ident(th)operator(->)ident(thgroup) operator(=) integer(0)operator(;) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_KILLED)operator(;) + ident(stack_free)operator(()ident(th)operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_thread_remove)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(==) ident(THREAD_KILLED)operator(\)) reserved(return)operator(;) + + ident(rb_thread_ready)operator(()ident(th)operator(\);) + ident(rb_thread_die)operator(()ident(th)operator(\);) + ident(th)operator(->)ident(prev)operator(->)ident(next) operator(=) ident(th)operator(->)ident(next)operator(;) + ident(th)operator(->)ident(next)operator(->)ident(prev) operator(=) ident(th)operator(->)ident(prev)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(rb_thread_dead)operator(()ident(th)operator(\)) + ident(rb_thread_t) ident(th)operator(;) +operator({) + reserved(return) ident(th)operator(->)ident(status) operator(==) ident(THREAD_KILLED)operator(;) +operator(}) + +directive(void) +ident(rb_thread_fd_close)operator(()ident(fd)operator(\)) + pre_type(int) ident(fd)operator(;) +operator({) + ident(rb_thread_t) ident(th)operator(;) + + ident(FOREACH_THREAD)operator(()ident(th)operator(\)) operator({) + reserved(if) operator(((()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_FD)operator(\)) operator(&&) ident(fd) operator(==) ident(th)operator(->)ident(fd)operator(\)) operator(||) + operator((()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_SELECT)operator(\)) operator(&&) operator(()ident(fd) operator(<) ident(th)operator(->)ident(fd)operator(\)) operator(&&) + operator(()ident(FD_ISSET)operator(()ident(fd)operator(,) operator(&)ident(th)operator(->)ident(readfds)operator(\)) operator(||) + ident(FD_ISSET)operator(()ident(fd)operator(,) operator(&)ident(th)operator(->)ident(writefds)operator(\)) operator(||) + ident(FD_ISSET)operator(()ident(fd)operator(,) operator(&)ident(th)operator(->)ident(exceptfds)operator(\)\)\)\)) operator({) + ident(VALUE) ident(exc) operator(=) ident(rb_exc_new2)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(stream closed)delimiter(")>operator(\);) + ident(rb_thread_raise)operator(()integer(1)operator(,) operator(&)ident(exc)operator(,) ident(th)operator(\);) + operator(}) + operator(}) + ident(END_FOREACH)operator(()ident(th)operator(\);) +operator(}) + +ident(NORETURN)operator(()directive(static) directive(void) ident(rb_thread_main_jump) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(\)\)\);) +directive(static) directive(void) +ident(rb_thread_main_jump)operator(()ident(err)operator(,) ident(tag)operator(\)) + ident(VALUE) ident(err)operator(;) + pre_type(int) ident(tag)operator(;) +operator({) + ident(curr_thread) operator(=) ident(main_thread)operator(;) + ident(th_raise_exception) operator(=) ident(err)operator(;) + ident(th_raise_node) operator(=) ident(ruby_current_node)operator(;) + ident(rb_thread_restore_context)operator(()ident(main_thread)operator(,) ident(tag)operator(\);) +operator(}) + +ident(NORETURN)operator(()directive(static) directive(void) ident(rb_thread_deadlock) ident(_)operator((()directive(void)operator(\)\)\);) +directive(static) directive(void) +ident(rb_thread_deadlock)operator((\)) +operator({) + pre_type(char) ident(msg)operator([)integer(21)operator(+)ident(SIZEOF_LONG)operator(*)integer(2)operator(];) + ident(VALUE) ident(e)operator(;) + + ident(sprintf)operator(()ident(msg)operator(,) string<delimiter(")content(Thread(0x%lx\): deadlock)delimiter(")>operator(,) ident(curr_thread)operator(->)ident(thread)operator(\);) + ident(e) operator(=) ident(rb_exc_new2)operator(()ident(rb_eFatal)operator(,) ident(msg)operator(\);) + reserved(if) operator(()ident(curr_thread) operator(==) ident(main_thread)operator(\)) operator({) + ident(rb_exc_raise)operator(()ident(e)operator(\);) + operator(}) + ident(rb_thread_main_jump)operator(()ident(e)operator(,) ident(RESTORE_RAISE)operator(\);) +operator(}) + +directive(static) directive(void) +ident(copy_fds)operator(()ident(dst)operator(,) ident(src)operator(,) ident(max)operator(\)) + ident(fd_set) operator(*)ident(dst)operator(,) operator(*)ident(src)operator(;) + pre_type(int) ident(max)operator(;) +operator({) + pre_type(int) ident(n) operator(=) integer(0)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<=)ident(max)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(FD_ISSET)operator(()ident(i)operator(,) ident(src)operator(\)\)) operator({) + ident(n) operator(=) ident(i)operator(;) + ident(FD_SET)operator(()ident(i)operator(,) ident(dst)operator(\);) + operator(}) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(match_fds)operator(()ident(dst)operator(,) ident(src)operator(,) ident(max)operator(\)) + ident(fd_set) operator(*)ident(dst)operator(,) operator(*)ident(src)operator(;) + pre_type(int) ident(max)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<=)ident(max)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(FD_ISSET)operator(()ident(i)operator(,) ident(src)operator(\)) operator(&&) ident(FD_ISSET)operator(()ident(i)operator(,) ident(dst)operator(\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(intersect_fds)operator(()ident(src)operator(,) ident(dst)operator(,) ident(max)operator(\)) + ident(fd_set) operator(*)ident(src)operator(,) operator(*)ident(dst)operator(;) + pre_type(int) ident(max)operator(;) +operator({) + pre_type(int) ident(i)operator(,) ident(n) operator(=) integer(0)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<=)ident(max)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(FD_ISSET)operator(()ident(i)operator(,) ident(dst)operator(\)\)) operator({) + reserved(if) operator(()ident(FD_ISSET)operator(()ident(i)operator(,) ident(src)operator(\)\)) operator({) + comment(/* Wake up only one thread per fd. */) + ident(FD_CLR)operator(()ident(i)operator(,) ident(src)operator(\);) + ident(n)operator(++;) + operator(}) + reserved(else) operator({) + ident(FD_CLR)operator(()ident(i)operator(,) ident(dst)operator(\);) + operator(}) + operator(}) + operator(}) + reserved(return) ident(n)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(find_bad_fds)operator(()ident(dst)operator(,) ident(src)operator(,) ident(max)operator(\)) + ident(fd_set) operator(*)ident(dst)operator(,) operator(*)ident(src)operator(;) + pre_type(int) ident(max)operator(;) +operator({) + pre_type(int) ident(i)operator(,) ident(test) operator(=) ident(Qfalse)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<=)ident(max)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(FD_ISSET)operator(()ident(i)operator(,) ident(src)operator(\)) operator(&&) operator(!)ident(FD_ISSET)operator(()ident(i)operator(,) ident(dst)operator(\)\)) operator({) + ident(FD_CLR)operator(()ident(i)operator(,) ident(src)operator(\);) + ident(test) operator(=) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(return) ident(test)operator(;) +operator(}) + +directive(void) +ident(rb_thread_schedule)operator((\)) +operator({) + ident(rb_thread_t) ident(next)operator(;) comment(/* OK */) + ident(rb_thread_t) ident(th)operator(;) + ident(rb_thread_t) ident(curr)operator(;) + ident(rb_thread_t) ident(th_found) operator(=) integer(0)operator(;) + pre_type(int) ident(found) operator(=) integer(0)operator(;) + + ident(fd_set) ident(readfds)operator(;) + ident(fd_set) ident(writefds)operator(;) + ident(fd_set) ident(exceptfds)operator(;) + reserved(struct) ident(timeval) ident(delay_tv)operator(,) operator(*)ident(delay_ptr)operator(;) + pre_type(double) ident(delay)operator(,) ident(now)operator(;) comment(/* OK */) + pre_type(int) ident(n)operator(,) ident(max)operator(;) + pre_type(int) ident(need_select) operator(=) integer(0)operator(;) + pre_type(int) ident(select_timeout) operator(=) integer(0)operator(;) + +preprocessor(#ifdef) ident(HAVE_NATIVETHREAD) + reserved(if) operator((!)ident(is_ruby_native_thread)operator((\)\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(cross-thread violation on rb_thread_schedule(\))delimiter(")>operator(\);) + operator(}) +preprocessor(#endif) + ident(rb_thread_pending) operator(=) integer(0)operator(;) + ident(rb_gc_finalize_deferred)operator((\);) + reserved(if) operator(()ident(curr_thread) operator(==) ident(curr_thread)operator(->)ident(next) + operator(&&) ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_RUNNABLE)operator(\)) + reserved(return)operator(;) + + ident(next) operator(=) integer(0)operator(;) + ident(curr) operator(=) ident(curr_thread)operator(;) comment(/* starting thread */) + + reserved(while) operator(()ident(curr)operator(->)ident(status) operator(==) ident(THREAD_KILLED)operator(\)) operator({) + ident(curr) operator(=) ident(curr)operator(->)ident(prev)operator(;) + operator(}) + + label(again)operator(:) + ident(max) operator(=) operator(-)integer(1)operator(;) + ident(FD_ZERO)operator((&)ident(readfds)operator(\);) + ident(FD_ZERO)operator((&)ident(writefds)operator(\);) + ident(FD_ZERO)operator((&)ident(exceptfds)operator(\);) + ident(delay) operator(=) ident(DELAY_INFTY)operator(;) + ident(now) operator(=) operator(-)float(1)float(.0)operator(;) + + ident(FOREACH_THREAD_FROM)operator(()ident(curr)operator(,) ident(th)operator(\)) operator({) + reserved(if) operator((!)ident(found) operator(&&) ident(th)operator(->)ident(status) operator(<=) ident(THREAD_RUNNABLE)operator(\)) operator({) + ident(found) operator(=) integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(!=) ident(THREAD_STOPPED)operator(\)) reserved(continue)operator(;) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_JOIN)operator(\)) operator({) + reserved(if) operator(()ident(rb_thread_dead)operator(()ident(th)operator(->)ident(join)operator(\)\)) operator({) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_RUNNABLE)operator(;) + ident(found) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_FD)operator(\)) operator({) + ident(FD_SET)operator(()ident(th)operator(->)ident(fd)operator(,) operator(&)ident(readfds)operator(\);) + reserved(if) operator(()ident(max) operator(<) ident(th)operator(->)ident(fd)operator(\)) ident(max) operator(=) ident(th)operator(->)ident(fd)operator(;) + ident(need_select) operator(=) integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_SELECT)operator(\)) operator({) + ident(copy_fds)operator((&)ident(readfds)operator(,) operator(&)ident(th)operator(->)ident(readfds)operator(,) ident(th)operator(->)ident(fd)operator(\);) + ident(copy_fds)operator((&)ident(writefds)operator(,) operator(&)ident(th)operator(->)ident(writefds)operator(,) ident(th)operator(->)ident(fd)operator(\);) + ident(copy_fds)operator((&)ident(exceptfds)operator(,) operator(&)ident(th)operator(->)ident(exceptfds)operator(,) ident(th)operator(->)ident(fd)operator(\);) + reserved(if) operator(()ident(max) operator(<) ident(th)operator(->)ident(fd)operator(\)) ident(max) operator(=) ident(th)operator(->)ident(fd)operator(;) + ident(need_select) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_TIME)operator(\)) operator({) + ident(select_timeout) operator(=) integer(1)operator(;) + operator(}) + ident(th)operator(->)ident(select_value) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_TIME)operator(\)) operator({) + pre_type(double) ident(th_delay)operator(;) + + reserved(if) operator(()ident(now) operator(<) float(0)float(.0)operator(\)) ident(now) operator(=) ident(timeofday)operator((\);) + ident(th_delay) operator(=) ident(th)operator(->)ident(delay) operator(-) ident(now)operator(;) + reserved(if) operator(()ident(th_delay) operator(<=) float(0)float(.0)operator(\)) operator({) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_RUNNABLE)operator(;) + ident(found) operator(=) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(th_delay) operator(<) ident(delay)operator(\)) operator({) + ident(delay) operator(=) ident(th_delay)operator(;) + ident(need_select) operator(=) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(th)operator(->)ident(delay) operator(==) ident(DELAY_INFTY)operator(\)) operator({) + ident(need_select) operator(=) integer(1)operator(;) + operator(}) + operator(}) + operator(}) + ident(END_FOREACH_FROM)operator(()ident(curr)operator(,) ident(th)operator(\);) + + comment(/* Do the select if needed */) + reserved(if) operator(()ident(need_select)operator(\)) operator({) + comment(/* Convert delay to a timeval */) + comment(/* If a thread is runnable, just poll */) + reserved(if) operator(()ident(found)operator(\)) operator({) + ident(delay_tv)operator(.)ident(tv_sec) operator(=) integer(0)operator(;) + ident(delay_tv)operator(.)ident(tv_usec) operator(=) integer(0)operator(;) + ident(delay_ptr) operator(=) operator(&)ident(delay_tv)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(delay) operator(==) ident(DELAY_INFTY)operator(\)) operator({) + ident(delay_ptr) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(delay_tv)operator(.)ident(tv_sec) operator(=) ident(delay)operator(;) + ident(delay_tv)operator(.)ident(tv_usec) operator(=) operator(()ident(delay) operator(-) operator(()pre_type(double)operator(\))ident(delay_tv)operator(.)ident(tv_sec)operator(\)*)float(1)ident(e6)operator(;) + ident(delay_ptr) operator(=) operator(&)ident(delay_tv)operator(;) + operator(}) + + ident(n) operator(=) ident(select)operator(()ident(max)operator(+)integer(1)operator(,) operator(&)ident(readfds)operator(,) operator(&)ident(writefds)operator(,) operator(&)ident(exceptfds)operator(,) ident(delay_ptr)operator(\);) + reserved(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + pre_type(int) ident(e) operator(=) ident(errno)operator(;) + + reserved(if) operator(()ident(rb_trap_pending)operator(\)) ident(rb_trap_exec)operator((\);) + reserved(if) operator(()ident(e) operator(==) ident(EINTR)operator(\)) reserved(goto) ident(again)operator(;) +preprocessor(#ifdef) ident(ERESTART) + reserved(if) operator(()ident(e) operator(==) ident(ERESTART)operator(\)) reserved(goto) ident(again)operator(;) +preprocessor(#endif) + reserved(if) operator(()ident(e) operator(==) ident(EBADF)operator(\)) operator({) + pre_type(int) ident(badfd) operator(=) operator(-)integer(1)operator(;) + pre_type(int) ident(fd)operator(;) + pre_type(int) ident(dummy)operator(;) + reserved(for) operator(()ident(fd) operator(=) integer(0)operator(;) ident(fd) operator(<=) ident(max)operator(;) ident(fd)operator(++\)) operator({) + reserved(if) operator((()ident(FD_ISSET)operator(()ident(fd)operator(,) operator(&)ident(readfds)operator(\)) operator(||) + ident(FD_ISSET)operator(()ident(fd)operator(,) operator(&)ident(writefds)operator(\)) operator(||) + ident(FD_ISSET)operator(()ident(fd)operator(,) operator(&)ident(exceptfds)operator(\)\)) operator(&&) + ident(fcntl)operator(()ident(fd)operator(,) ident(F_GETFD)operator(,) operator(&)ident(dummy)operator(\)) operator(==) operator(-)integer(1) operator(&&) + ident(errno) operator(==) ident(EBADF)operator(\)) operator({) + ident(badfd) operator(=) ident(fd)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(badfd) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(FOREACH_THREAD_FROM)operator(()ident(curr)operator(,) ident(th)operator(\)) operator({) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_FD)operator(\)) operator({) + reserved(if) operator(()ident(th)operator(->)ident(fd) operator(==) ident(badfd)operator(\)) operator({) + ident(found) operator(=) integer(1)operator(;) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_RUNNABLE)operator(;) + ident(th)operator(->)ident(fd) operator(=) integer(0)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_SELECT)operator(\)) operator({) + reserved(if) operator(()ident(FD_ISSET)operator(()ident(badfd)operator(,) operator(&)ident(th)operator(->)ident(readfds)operator(\)) operator(||) + ident(FD_ISSET)operator(()ident(badfd)operator(,) operator(&)ident(th)operator(->)ident(writefds)operator(\)) operator(||) + ident(FD_ISSET)operator(()ident(badfd)operator(,) operator(&)ident(th)operator(->)ident(exceptfds)operator(\)\)) operator({) + ident(found) operator(=) integer(1)operator(;) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_RUNNABLE)operator(;) + ident(th)operator(->)ident(select_value) operator(=) operator(-)ident(EBADF)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + operator(}) + ident(END_FOREACH_FROM)operator(()ident(curr)operator(,) ident(th)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(FOREACH_THREAD_FROM)operator(()ident(curr)operator(,) ident(th)operator(\)) operator({) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_SELECT)operator(\)) operator({) + pre_type(int) ident(v) operator(=) integer(0)operator(;) + + ident(v) operator(|=) ident(find_bad_fds)operator((&)ident(readfds)operator(,) operator(&)ident(th)operator(->)ident(readfds)operator(,) ident(th)operator(->)ident(fd)operator(\);) + ident(v) operator(|=) ident(find_bad_fds)operator((&)ident(writefds)operator(,) operator(&)ident(th)operator(->)ident(writefds)operator(,) ident(th)operator(->)ident(fd)operator(\);) + ident(v) operator(|=) ident(find_bad_fds)operator((&)ident(exceptfds)operator(,) operator(&)ident(th)operator(->)ident(exceptfds)operator(,) ident(th)operator(->)ident(fd)operator(\);) + reserved(if) operator(()ident(v)operator(\)) operator({) + ident(th)operator(->)ident(select_value) operator(=) ident(n)operator(;) + ident(n) operator(=) ident(max)operator(;) + operator(}) + operator(}) + operator(}) + ident(END_FOREACH_FROM)operator(()ident(curr)operator(,) ident(th)operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(select_timeout) operator(&&) ident(n) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(now) operator(<) float(0)float(.0)operator(\)) ident(now) operator(=) ident(timeofday)operator((\);) + ident(FOREACH_THREAD_FROM)operator(()ident(curr)operator(,) ident(th)operator(\)) operator({) + reserved(if) operator(((()ident(th)operator(->)ident(wait_for)operator(&()ident(WAIT_SELECT)operator(|)ident(WAIT_TIME)operator(\)\)) operator(==) operator(()ident(WAIT_SELECT)operator(|)ident(WAIT_TIME)operator(\)\)) operator(&&) + ident(th)operator(->)ident(delay) operator(<=) ident(now)operator(\)) operator({) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_RUNNABLE)operator(;) + ident(th)operator(->)ident(wait_for) operator(=) integer(0)operator(;) + ident(th)operator(->)ident(select_value) operator(=) integer(0)operator(;) + ident(found) operator(=) integer(1)operator(;) + ident(intersect_fds)operator((&)ident(readfds)operator(,) operator(&)ident(th)operator(->)ident(readfds)operator(,) ident(max)operator(\);) + ident(intersect_fds)operator((&)ident(writefds)operator(,) operator(&)ident(th)operator(->)ident(writefds)operator(,) ident(max)operator(\);) + ident(intersect_fds)operator((&)ident(exceptfds)operator(,) operator(&)ident(th)operator(->)ident(exceptfds)operator(,) ident(max)operator(\);) + operator(}) + operator(}) + ident(END_FOREACH_FROM)operator(()ident(curr)operator(,) ident(th)operator(\);) + operator(}) + reserved(if) operator(()ident(n) operator(>) integer(0)operator(\)) operator({) + ident(now) operator(=) operator(-)float(1)float(.0)operator(;) + comment(/* Some descriptors are ready. + * Choose a thread which may run next. + * Don't change the status of threads which don't run next. + */) + ident(FOREACH_THREAD_FROM)operator(()ident(curr)operator(,) ident(th)operator(\)) operator({) + reserved(if) operator((()ident(th)operator(->)ident(wait_for)operator(&)ident(WAIT_FD)operator(\)) operator(&&) ident(FD_ISSET)operator(()ident(th)operator(->)ident(fd)operator(,) operator(&)ident(readfds)operator(\)\)) operator({) + ident(th_found) operator(=) ident(th)operator(;) + ident(found) operator(=) integer(1)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator((()ident(th)operator(->)ident(wait_for)operator(&)ident(WAIT_SELECT)operator(\)) operator(&&) + operator(()ident(match_fds)operator((&)ident(readfds)operator(,) operator(&)ident(th)operator(->)ident(readfds)operator(,) ident(max)operator(\)) operator(||) + ident(match_fds)operator((&)ident(writefds)operator(,) operator(&)ident(th)operator(->)ident(writefds)operator(,) ident(max)operator(\)) operator(||) + ident(match_fds)operator((&)ident(exceptfds)operator(,) operator(&)ident(th)operator(->)ident(exceptfds)operator(,) ident(max)operator(\)\)\)) operator({) + ident(th_found) operator(=) ident(th)operator(;) + ident(found) operator(=) integer(1)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + ident(END_FOREACH_FROM)operator(()ident(curr)operator(,) ident(th)operator(\);) + operator(}) + comment(/* The delays for some of the threads should have expired. + Go through the loop once more, to check the delays. */) + reserved(if) operator((!)ident(found) operator(&&) ident(delay) operator(!=) ident(DELAY_INFTY)operator(\)) + reserved(goto) ident(again)operator(;) + operator(}) + + ident(FOREACH_THREAD_FROM)operator(()ident(curr)operator(,) ident(th)operator(\)) operator({) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL)operator(\)) operator({) + ident(next) operator(=) ident(th)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator((()ident(th)operator(->)ident(status) operator(==) ident(THREAD_RUNNABLE) operator(||) ident(th) operator(==) ident(th_found)operator(\)) operator(&&) ident(th)operator(->)ident(stk_ptr)operator(\)) operator({) + reserved(if) operator((!)ident(next) operator(||) ident(next)operator(->)ident(priority) operator(<) ident(th)operator(->)ident(priority)operator(\)) operator({) + reserved(if) operator(()ident(th) operator(==) ident(th_found)operator(\)) operator({) + ident(th_found)operator(->)ident(status) operator(=) ident(THREAD_RUNNABLE)operator(;) + ident(th_found)operator(->)ident(wait_for) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(th)operator(->)ident(wait_for)operator(&)ident(WAIT_FD)operator(\)) operator({) + ident(th_found)operator(->)ident(fd) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) comment(/* th->wait_for&WAIT_SELECT */) + ident(n) operator(=) ident(intersect_fds)operator((&)ident(readfds)operator(,) operator(&)ident(th_found)operator(->)ident(readfds)operator(,) ident(max)operator(\)) operator(+) + ident(intersect_fds)operator((&)ident(writefds)operator(,) operator(&)ident(th_found)operator(->)ident(writefds)operator(,) ident(max)operator(\)) operator(+) + ident(intersect_fds)operator((&)ident(exceptfds)operator(,) operator(&)ident(th_found)operator(->)ident(exceptfds)operator(,) ident(max)operator(\);) + ident(th_found)operator(->)ident(select_value) operator(=) ident(n)operator(;) + operator(}) + operator(}) + ident(next) operator(=) ident(th)operator(;) + operator(}) + operator(}) + operator(}) + ident(END_FOREACH_FROM)operator(()ident(curr)operator(,) ident(th)operator(\);) + + reserved(if) operator((!)ident(next)operator(\)) operator({) + comment(/* raise fatal error to main thread */) + ident(curr_thread)operator(->)ident(node) operator(=) ident(ruby_current_node)operator(;) + reserved(if) operator(()ident(curr)operator(->)ident(next) operator(==) ident(curr)operator(\)) operator({) + ident(TRAP_BEG)operator(;) + ident(pause)operator((\);) + ident(TRAP_END)operator(;) + operator(}) + ident(FOREACH_THREAD_FROM)operator(()ident(curr)operator(,) ident(th)operator(\)) operator({) + ident(warn_printf)operator(()string<delimiter(")content(deadlock 0x%lx: %s:)delimiter(")>operator(,) + ident(th)operator(->)ident(thread)operator(,) ident(thread_status_name)operator(()ident(th)operator(->)ident(status)operator(\)\);) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_FD)operator(\)) ident(warn_printf)operator(()string<delimiter(")content(F(%d\))delimiter(")>operator(,) ident(th)operator(->)ident(fd)operator(\);) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_SELECT)operator(\)) ident(warn_printf)operator(()string<delimiter(")content(S)delimiter(")>operator(\);) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_TIME)operator(\)) ident(warn_printf)operator(()string<delimiter(")content(T(%f\))delimiter(")>operator(,) ident(th)operator(->)ident(delay)operator(\);) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_JOIN)operator(\)) + ident(warn_printf)operator(()string<delimiter(")content(J(0x%lx\))delimiter(")>operator(,) ident(th)operator(->)ident(join) operator(?) ident(th)operator(->)ident(join)operator(->)ident(thread) operator(:) integer(0)operator(\);) + reserved(if) operator(()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_PID)operator(\)) ident(warn_printf)operator(()string<delimiter(")content(P)delimiter(")>operator(\);) + reserved(if) operator((!)ident(th)operator(->)ident(wait_for)operator(\)) ident(warn_printf)operator(()string<delimiter(")content(-)delimiter(")>operator(\);) + ident(warn_printf)operator(()string<delimiter(")content( %s - %s:%d)char(\\n)delimiter(")>operator(,) + ident(th)operator(==)ident(main_thread) operator(?) string<delimiter(")content((main\))delimiter(")> operator(:) string<delimiter(")delimiter(")>operator(,) + ident(th)operator(->)ident(node)operator(->)ident(nd_file)operator(,) ident(nd_line)operator(()ident(th)operator(->)ident(node)operator(\)\);) + operator(}) + ident(END_FOREACH_FROM)operator(()ident(curr)operator(,) ident(th)operator(\);) + ident(next) operator(=) ident(main_thread)operator(;) + ident(rb_thread_ready)operator(()ident(next)operator(\);) + ident(next)operator(->)ident(status) operator(=) ident(THREAD_TO_KILL)operator(;) + reserved(if) operator((!)ident(rb_thread_dead)operator(()ident(curr_thread)operator(\)\)) operator({) + ident(rb_thread_save_context)operator(()ident(curr_thread)operator(\);) + operator(}) + ident(rb_thread_deadlock)operator((\);) + operator(}) + ident(next)operator(->)ident(wait_for) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(next)operator(->)ident(status) operator(==) ident(THREAD_RUNNABLE) operator(&&) ident(next) operator(==) ident(curr_thread)operator(\)) operator({) + reserved(return)operator(;) + operator(}) + + comment(/* context switch */) + reserved(if) operator(()ident(curr) operator(==) ident(curr_thread)operator(\)) operator({) + reserved(if) operator(()ident(THREAD_SAVE_CONTEXT)operator(()ident(curr)operator(\)\)) operator({) + reserved(return)operator(;) + operator(}) + operator(}) + + ident(curr_thread) operator(=) ident(next)operator(;) + reserved(if) operator(()ident(next)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL)operator(\)) operator({) + reserved(if) operator((!()ident(next)operator(->)ident(flags) operator(&) ident(THREAD_TERMINATING)operator(\)\)) operator({) + ident(next)operator(->)ident(flags) operator(|=) ident(THREAD_TERMINATING)operator(;) + comment(/* terminate; execute ensure-clause if any */) + ident(rb_thread_restore_context)operator(()ident(next)operator(,) ident(RESTORE_FATAL)operator(\);) + operator(}) + operator(}) + ident(rb_thread_restore_context)operator(()ident(next)operator(,) ident(RESTORE_NORMAL)operator(\);) +operator(}) + +directive(void) +ident(rb_thread_wait_fd)operator(()ident(fd)operator(\)) + pre_type(int) ident(fd)operator(;) +operator({) + reserved(if) operator(()ident(rb_thread_critical)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(ruby_in_compile)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(curr_thread) operator(==) ident(curr_thread)operator(->)ident(next)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL)operator(\)) reserved(return)operator(;) + + ident(curr_thread)operator(->)ident(status) operator(=) ident(THREAD_STOPPED)operator(;) + ident(curr_thread)operator(->)ident(fd) operator(=) ident(fd)operator(;) + ident(curr_thread)operator(->)ident(wait_for) operator(=) ident(WAIT_FD)operator(;) + ident(rb_thread_schedule)operator((\);) +operator(}) + +pre_type(int) +ident(rb_thread_fd_writable)operator(()ident(fd)operator(\)) + pre_type(int) ident(fd)operator(;) +operator({) + reserved(if) operator(()ident(rb_thread_critical)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(curr_thread) operator(==) ident(curr_thread)operator(->)ident(next)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_KILLED)operator(\)) reserved(return) ident(Qtrue)operator(;) + + ident(curr_thread)operator(->)ident(status) operator(=) ident(THREAD_STOPPED)operator(;) + ident(FD_ZERO)operator((&)ident(curr_thread)operator(->)ident(readfds)operator(\);) + ident(FD_ZERO)operator((&)ident(curr_thread)operator(->)ident(writefds)operator(\);) + ident(FD_SET)operator(()ident(fd)operator(,) operator(&)ident(curr_thread)operator(->)ident(writefds)operator(\);) + ident(FD_ZERO)operator((&)ident(curr_thread)operator(->)ident(exceptfds)operator(\);) + ident(curr_thread)operator(->)ident(fd) operator(=) ident(fd)operator(+)integer(1)operator(;) + ident(curr_thread)operator(->)ident(wait_for) operator(=) ident(WAIT_SELECT)operator(;) + ident(rb_thread_schedule)operator((\);) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(void) +ident(rb_thread_wait_for)operator(()ident(time)operator(\)) + reserved(struct) ident(timeval) ident(time)operator(;) +operator({) + pre_type(double) ident(date)operator(;) + + reserved(if) operator(()ident(rb_thread_critical) operator(||) + ident(curr_thread) operator(==) ident(curr_thread)operator(->)ident(next) operator(||) + ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL)operator(\)) operator({) + pre_type(int) ident(n)operator(;) + pre_type(int) ident(thr_critical) operator(=) ident(rb_thread_critical)operator(;) +preprocessor(#ifndef) ident(linux) + pre_type(double) ident(d)operator(,) ident(limit)operator(;) + ident(limit) operator(=) ident(timeofday)operator((\)+()pre_type(double)operator(\))ident(time)operator(.)ident(tv_sec)operator(+()pre_type(double)operator(\))ident(time)operator(.)ident(tv_usec)operator(*)float(1)ident(e)operator(-)integer(6)operator(;) +preprocessor(#endif) + reserved(for) operator((;;\)) operator({) + ident(rb_thread_critical) operator(=) ident(Qtrue)operator(;) + ident(TRAP_BEG)operator(;) + ident(n) operator(=) ident(select)operator(()integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(&)ident(time)operator(\);) + ident(rb_thread_critical) operator(=) ident(thr_critical)operator(;) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(n) operator(==) integer(0)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + reserved(switch) operator(()ident(errno)operator(\)) operator({) + reserved(case) label(EINTR)operator(:) +preprocessor(#ifdef) ident(ERESTART) + reserved(case) label(ERESTART)operator(:) +preprocessor(#endif) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_sys_fail)operator(()string<delimiter(")content(sleep)delimiter(")>operator(\);) + operator(}) + operator(}) +preprocessor(#ifndef) ident(linux) + ident(d) operator(=) ident(limit) operator(-) ident(timeofday)operator((\);) + + ident(time)operator(.)ident(tv_sec) operator(=) operator(()pre_type(int)operator(\))ident(d)operator(;) + ident(time)operator(.)ident(tv_usec) operator(=) operator(()pre_type(int)operator(\)(()ident(d) operator(-) operator(()pre_type(int)operator(\))ident(d)operator(\)*)float(1)ident(e6)operator(\);) + reserved(if) operator(()ident(time)operator(.)ident(tv_usec) operator(<) integer(0)operator(\)) operator({) + ident(time)operator(.)ident(tv_usec) operator(+=) operator(()pre_type(long)operator(\))float(1)ident(e6)operator(;) + ident(time)operator(.)ident(tv_sec) operator(-=) integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(time)operator(.)ident(tv_sec) operator(<) integer(0)operator(\)) reserved(return)operator(;) +preprocessor(#endif) + operator(}) + operator(}) + + ident(date) operator(=) ident(timeofday)operator((\)) operator(+) operator(()pre_type(double)operator(\))ident(time)operator(.)ident(tv_sec) operator(+) operator(()pre_type(double)operator(\))ident(time)operator(.)ident(tv_usec)operator(*)float(1)ident(e)operator(-)integer(6)operator(;) + ident(curr_thread)operator(->)ident(status) operator(=) ident(THREAD_STOPPED)operator(;) + ident(curr_thread)operator(->)ident(delay) operator(=) ident(date)operator(;) + ident(curr_thread)operator(->)ident(wait_for) operator(=) ident(WAIT_TIME)operator(;) + ident(rb_thread_schedule)operator((\);) +operator(}) + +directive(void) ident(rb_thread_sleep_forever) ident(_)operator((()directive(void)operator(\)\);) + +pre_type(int) +ident(rb_thread_alone)operator((\)) +operator({) + reserved(return) ident(curr_thread) operator(==) ident(curr_thread)operator(->)ident(next)operator(;) +operator(}) + +pre_type(int) +ident(rb_thread_select)operator(()ident(max)operator(,) ident(read)operator(,) ident(write)operator(,) ident(except)operator(,) ident(timeout)operator(\)) + pre_type(int) ident(max)operator(;) + ident(fd_set) operator(*)ident(read)operator(,) operator(*)ident(write)operator(,) operator(*)ident(except)operator(;) + reserved(struct) ident(timeval) operator(*)ident(timeout)operator(;) +operator({) +preprocessor(#ifndef) ident(linux) + pre_type(double) ident(limit)operator(;) +preprocessor(#endif) + pre_type(int) ident(n)operator(;) + + reserved(if) operator((!)ident(read) operator(&&) operator(!)ident(write) operator(&&) operator(!)ident(except)operator(\)) operator({) + reserved(if) operator((!)ident(timeout)operator(\)) operator({) + ident(rb_thread_sleep_forever)operator((\);) + reserved(return) integer(0)operator(;) + operator(}) + ident(rb_thread_wait_for)operator((*)ident(timeout)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + +preprocessor(#ifndef) ident(linux) + reserved(if) operator(()ident(timeout)operator(\)) operator({) + ident(limit) operator(=) ident(timeofday)operator((\)+) + operator(()pre_type(double)operator(\))ident(timeout)operator(->)ident(tv_sec)operator(+()pre_type(double)operator(\))ident(timeout)operator(->)ident(tv_usec)operator(*)float(1)ident(e)operator(-)integer(6)operator(;) + operator(}) +preprocessor(#endif) + + reserved(if) operator(()ident(rb_thread_critical) operator(||) + ident(curr_thread) operator(==) ident(curr_thread)operator(->)ident(next) operator(||) + ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL)operator(\)) operator({) +preprocessor(#ifndef) ident(linux) + reserved(struct) ident(timeval) ident(tv)operator(,) operator(*)ident(tvp) operator(=) ident(timeout)operator(;) + + reserved(if) operator(()ident(timeout)operator(\)) operator({) + ident(tv) operator(=) operator(*)ident(timeout)operator(;) + ident(tvp) operator(=) operator(&)ident(tv)operator(;) + operator(}) +preprocessor(#else) + reserved(struct) ident(timeval) operator(*)directive(const) ident(tvp) operator(=) ident(timeout)operator(;) +preprocessor(#endif) + reserved(for) operator((;;\)) operator({) + ident(TRAP_BEG)operator(;) + ident(n) operator(=) ident(select)operator(()ident(max)operator(,) ident(read)operator(,) ident(write)operator(,) ident(except)operator(,) ident(tvp)operator(\);) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + reserved(switch) operator(()ident(errno)operator(\)) operator({) + reserved(case) label(EINTR)operator(:) +preprocessor(#ifdef) ident(ERESTART) + reserved(case) label(ERESTART)operator(:) +preprocessor(#endif) +preprocessor(#ifndef) ident(linux) + reserved(if) operator(()ident(timeout)operator(\)) operator({) + pre_type(double) ident(d) operator(=) ident(limit) operator(-) ident(timeofday)operator((\);) + + ident(tv)operator(.)ident(tv_sec) operator(=) operator(()pre_type(unsigned) pre_type(int)operator(\))ident(d)operator(;) + ident(tv)operator(.)ident(tv_usec) operator(=) operator(()pre_type(long)operator(\)(()ident(d)operator(-()pre_type(double)operator(\))ident(tv)operator(.)ident(tv_sec)operator(\)*)float(1)ident(e6)operator(\);) + reserved(if) operator(()ident(tv)operator(.)ident(tv_sec) operator(<) integer(0)operator(\)) ident(tv)operator(.)ident(tv_sec) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(tv)operator(.)ident(tv_usec) operator(<) integer(0)operator(\)) ident(tv)operator(.)ident(tv_usec) operator(=) integer(0)operator(;) + operator(}) +preprocessor(#endif) + reserved(continue)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(return) ident(n)operator(;) + operator(}) + operator(}) + + ident(curr_thread)operator(->)ident(status) operator(=) ident(THREAD_STOPPED)operator(;) + reserved(if) operator(()ident(read)operator(\)) ident(curr_thread)operator(->)ident(readfds) operator(=) operator(*)ident(read)operator(;) + reserved(else) ident(FD_ZERO)operator((&)ident(curr_thread)operator(->)ident(readfds)operator(\);) + reserved(if) operator(()ident(write)operator(\)) ident(curr_thread)operator(->)ident(writefds) operator(=) operator(*)ident(write)operator(;) + reserved(else) ident(FD_ZERO)operator((&)ident(curr_thread)operator(->)ident(writefds)operator(\);) + reserved(if) operator(()ident(except)operator(\)) ident(curr_thread)operator(->)ident(exceptfds) operator(=) operator(*)ident(except)operator(;) + reserved(else) ident(FD_ZERO)operator((&)ident(curr_thread)operator(->)ident(exceptfds)operator(\);) + ident(curr_thread)operator(->)ident(fd) operator(=) ident(max)operator(;) + ident(curr_thread)operator(->)ident(wait_for) operator(=) ident(WAIT_SELECT)operator(;) + reserved(if) operator(()ident(timeout)operator(\)) operator({) + ident(curr_thread)operator(->)ident(delay) operator(=) ident(timeofday)operator((\)) operator(+) + operator(()pre_type(double)operator(\))ident(timeout)operator(->)ident(tv_sec) operator(+) operator(()pre_type(double)operator(\))ident(timeout)operator(->)ident(tv_usec)operator(*)float(1)ident(e)operator(-)integer(6)operator(;) + ident(curr_thread)operator(->)ident(wait_for) operator(|=) ident(WAIT_TIME)operator(;) + operator(}) + ident(rb_thread_schedule)operator((\);) + reserved(if) operator(()ident(read)operator(\)) operator(*)ident(read) operator(=) ident(curr_thread)operator(->)ident(readfds)operator(;) + reserved(if) operator(()ident(write)operator(\)) operator(*)ident(write) operator(=) ident(curr_thread)operator(->)ident(writefds)operator(;) + reserved(if) operator(()ident(except)operator(\)) operator(*)ident(except) operator(=) ident(curr_thread)operator(->)ident(exceptfds)operator(;) + reserved(if) operator(()ident(curr_thread)operator(->)ident(select_value) operator(<) integer(0)operator(\)) operator({) + ident(errno) operator(=) operator(-)ident(curr_thread)operator(->)ident(select_value)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(return) ident(curr_thread)operator(->)ident(select_value)operator(;) +operator(}) + +directive(static) pre_type(int) ident(rb_thread_join0) ident(_)operator((()ident(rb_thread_t)operator(,) pre_type(double)operator(\)\);) +pre_type(int) ident(rb_thread_join) ident(_)operator((()ident(VALUE)operator(,) pre_type(double)operator(\)\);) + +directive(static) pre_type(int) +ident(rb_thread_join0)operator(()ident(th)operator(,) ident(limit)operator(\)) + ident(rb_thread_t) ident(th)operator(;) + pre_type(double) ident(limit)operator(;) +operator({) + reserved(enum) ident(rb_thread_status) ident(last_status) operator(=) ident(THREAD_RUNNABLE)operator(;) + + reserved(if) operator(()ident(rb_thread_critical)operator(\)) ident(rb_thread_deadlock)operator((\);) + reserved(if) operator((!)ident(rb_thread_dead)operator(()ident(th)operator(\)\)) operator({) + reserved(if) operator(()ident(th) operator(==) ident(curr_thread)operator(\)) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(thread 0x%lx tried to join itself)delimiter(")>operator(,) + ident(th)operator(->)ident(thread)operator(\);) + reserved(if) operator((()ident(th)operator(->)ident(wait_for) operator(&) ident(WAIT_JOIN)operator(\)) operator(&&) ident(th)operator(->)ident(join) operator(==) ident(curr_thread)operator(\)) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(Thread#join: deadlock 0x%lx - mutual join(0x%lx\))delimiter(")>operator(,) + ident(curr_thread)operator(->)ident(thread)operator(,) ident(th)operator(->)ident(thread)operator(\);) + reserved(if) operator(()ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL)operator(\)) + ident(last_status) operator(=) ident(THREAD_TO_KILL)operator(;) + reserved(if) operator(()ident(limit) operator(==) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + ident(curr_thread)operator(->)ident(status) operator(=) ident(THREAD_STOPPED)operator(;) + ident(curr_thread)operator(->)ident(join) operator(=) ident(th)operator(;) + ident(curr_thread)operator(->)ident(wait_for) operator(=) ident(WAIT_JOIN)operator(;) + ident(curr_thread)operator(->)ident(delay) operator(=) ident(timeofday)operator((\)) operator(+) ident(limit)operator(;) + reserved(if) operator(()ident(limit) operator(<) ident(DELAY_INFTY)operator(\)) ident(curr_thread)operator(->)ident(wait_for) operator(|=) ident(WAIT_TIME)operator(;) + ident(rb_thread_schedule)operator((\);) + ident(curr_thread)operator(->)ident(status) operator(=) ident(last_status)operator(;) + reserved(if) operator((!)ident(rb_thread_dead)operator(()ident(th)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + operator(}) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(th)operator(->)ident(errinfo)operator(\)) operator(&&) operator(()ident(th)operator(->)ident(flags) operator(&) ident(RAISED_EXCEPTION)operator(\)\)) operator({) + ident(VALUE) ident(oldbt) operator(=) ident(get_backtrace)operator(()ident(th)operator(->)ident(errinfo)operator(\);) + ident(VALUE) ident(errat) operator(=) ident(make_backtrace)operator((\);) + ident(VALUE) ident(errinfo) operator(=) ident(rb_obj_dup)operator(()ident(th)operator(->)ident(errinfo)operator(\);) + + reserved(if) operator(()ident(TYPE)operator(()ident(oldbt)operator(\)) operator(==) ident(T_ARRAY) operator(&&) ident(RARRAY)operator(()ident(oldbt)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(rb_ary_unshift)operator(()ident(errat)operator(,) ident(rb_ary_entry)operator(()ident(oldbt)operator(,) integer(0)operator(\)\);) + operator(}) + ident(set_backtrace)operator(()ident(errinfo)operator(,) ident(errat)operator(\);) + ident(rb_exc_raise)operator(()ident(errinfo)operator(\);) + operator(}) + + reserved(return) ident(Qtrue)operator(;) +operator(}) + +pre_type(int) +ident(rb_thread_join)operator(()ident(thread)operator(,) ident(limit)operator(\)) + ident(VALUE) ident(thread)operator(;) + pre_type(double) ident(limit)operator(;) +operator({) + reserved(if) operator(()ident(limit) operator(<) integer(0)operator(\)) ident(limit) operator(=) ident(DELAY_INFTY)operator(;) + reserved(return) ident(rb_thread_join0)operator(()ident(rb_thread_check)operator(()ident(thread)operator(\),) ident(limit)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * thr.join => thr + * thr.join(limit\) => thr + * + * The calling thread will suspend execution and run <i>thr</i>. Does not + * return until <i>thr</i> exits or until <i>limit</i> seconds have passed. If + * the time limit expires, <code>nil</code> will be returned, otherwise + * <i>thr</i> is returned. + * + * Any threads not joined will be killed when the main program exits. If + * <i>thr</i> had previously raised an exception and the + * <code>abort_on_exception</code> and <code>$DEBUG</code> flags are not set + * (so the exception has not yet been processed\) it will be processed at this + * time. + * + * a = Thread.new { print "a"; sleep(10\); print "b"; print "c" } + * x = Thread.new { print "x"; Thread.pass; print "y"; print "z" } + * x.join # Let x thread finish, a will be killed on exit. + * + * <em>produces:</em> + * + * axyz + * + * The following example illustrates the <i>limit</i> parameter. + * + * y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }} + * puts "Waiting" until y.join(0.15\) + * + * <em>produces:</em> + * + * tick... + * Waiting + * tick... + * Waitingtick... + * + * + * tick... + */) + +directive(static) ident(VALUE) +ident(rb_thread_join_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(thread)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(VALUE) ident(limit)operator(;) + pre_type(double) ident(delay) operator(=) ident(DELAY_INFTY)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(limit)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(limit)operator(\)\)) ident(delay) operator(=) ident(rb_num2dbl)operator(()ident(limit)operator(\);) + reserved(if) operator((!)ident(rb_thread_join0)operator(()ident(rb_thread_check)operator(()ident(thread)operator(\),) ident(delay)operator(\)\)) + reserved(return) ident(Qnil)operator(;) + reserved(return) ident(thread)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Thread.current => thread + * + * Returns the currently executing thread. + * + * Thread.current #=> #<Thread:0x401bdf4c run> + */) + +ident(VALUE) +ident(rb_thread_current)operator((\)) +operator({) + reserved(return) ident(curr_thread)operator(->)ident(thread)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Thread.main => thread + * + * Returns the main thread for the process. + * + * Thread.main #=> #<Thread:0x401bdf4c run> + */) + +ident(VALUE) +ident(rb_thread_main)operator((\)) +operator({) + reserved(return) ident(main_thread)operator(->)ident(thread)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Thread.list => array + * + * Returns an array of <code>Thread</code> objects for all threads that are + * either runnable or stopped. + * + * Thread.new { sleep(200\) } + * Thread.new { 1000000.times {|i| i*i } } + * Thread.new { Thread.stop } + * Thread.list.each {|t| p t} + * + * <em>produces:</em> + * + * #<Thread:0x401b3e84 sleep> + * #<Thread:0x401b3f38 run> + * #<Thread:0x401b3fb0 sleep> + * #<Thread:0x401bdf4c run> + */) + +ident(VALUE) +ident(rb_thread_list)operator((\)) +operator({) + ident(rb_thread_t) ident(th)operator(;) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(FOREACH_THREAD)operator(()ident(th)operator(\)) operator({) + reserved(switch) operator(()ident(th)operator(->)ident(status)operator(\)) operator({) + reserved(case) label(THREAD_RUNNABLE)operator(:) + reserved(case) label(THREAD_STOPPED)operator(:) + reserved(case) label(THREAD_TO_KILL)operator(:) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(th)operator(->)ident(thread)operator(\);) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + ident(END_FOREACH)operator(()ident(th)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.wakeup => thr + * + * Marks <i>thr</i> as eligible for scheduling (it may still remain blocked on + * I/O, however\). Does not invoke the scheduler (see <code>Thread#run</code>\). + * + * c = Thread.new { Thread.stop; puts "hey!" } + * c.wakeup + * + * <em>produces:</em> + * + * hey! + */) + +ident(VALUE) +ident(rb_thread_wakeup)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + reserved(if) operator((!)ident(RTEST)operator(()ident(rb_thread_wakeup_alive)operator(()ident(thread)operator(\)\)\)) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(killed thread)delimiter(")>operator(\);) + reserved(return) ident(thread)operator(;) +operator(}) + +ident(VALUE) +ident(rb_thread_wakeup_alive)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + reserved(if) operator(()ident(th)operator(->)ident(status) operator(==) ident(THREAD_KILLED)operator(\)) + reserved(return) ident(Qnil)operator(;) + ident(rb_thread_ready)operator(()ident(th)operator(\);) + + reserved(return) ident(thread)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.run => thr + * + * Wakes up <i>thr</i>, making it eligible for scheduling. If not in a critical + * section, then invokes the scheduler. + * + * a = Thread.new { puts "a"; Thread.stop; puts "c" } + * Thread.pass + * puts "Got here" + * a.run + * a.join + * + * <em>produces:</em> + * + * a + * Got here + * c + */) + +ident(VALUE) +ident(rb_thread_run)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_wakeup)operator(()ident(thread)operator(\);) + reserved(if) operator((!)ident(rb_thread_critical)operator(\)) ident(rb_thread_schedule)operator((\);) + + reserved(return) ident(thread)operator(;) +operator(}) + + +directive(static) directive(void) +ident(rb_kill_thread)operator(()ident(th)operator(,) ident(flags)operator(\)) + ident(rb_thread_t) ident(th)operator(;) + pre_type(int) ident(flags)operator(;) +operator({) + reserved(if) operator(()ident(th) operator(!=) ident(curr_thread) operator(&&) ident(th)operator(->)ident(safe) operator(<) integer(4)operator(\)) operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + operator(}) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL) operator(||) ident(th)operator(->)ident(status) operator(==) ident(THREAD_KILLED)operator(\)) + reserved(return)operator(;) + reserved(if) operator(()ident(th) operator(==) ident(th)operator(->)ident(next) operator(||) ident(th) operator(==) ident(main_thread)operator(\)) ident(rb_exit)operator(()ident(EXIT_SUCCESS)operator(\);) + + ident(rb_thread_ready)operator(()ident(th)operator(\);) + ident(th)operator(->)ident(flags) operator(|=) ident(flags)operator(;) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_TO_KILL)operator(;) + reserved(if) operator((!)ident(rb_thread_critical)operator(\)) ident(rb_thread_schedule)operator((\);) +operator(}) + + +comment(/* + * call-seq: + * thr.exit => thr + * thr.kill => thr + * thr.terminate => thr + * + * Terminates <i>thr</i> and schedules another thread to be run, returning + * the terminated <code>Thread</code>. If this is the main thread, or the + * last thread, exits the process. + */) + +ident(VALUE) +ident(rb_thread_kill)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + ident(rb_kill_thread)operator(()ident(th)operator(,) integer(0)operator(\);) + reserved(return) ident(thread)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.exit! => thr + * thr.kill! => thr + * thr.terminate! => thr + * + * Terminates <i>thr</i> without calling ensure clauses and schedules + * another thread to be run, returning the terminated <code>Thread</code>. + * If this is the main thread, or the last thread, exits the process. + * + * See <code>Thread#exit</code> for the safer version. + */) + +directive(static) ident(VALUE) +ident(rb_thread_kill_bang)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + ident(rb_kill_thread)operator(()ident(th)operator(,) ident(THREAD_NO_ENSURE)operator(\);) + reserved(return) ident(thread)operator(;) +operator(}) + +comment(/* + * call-seq: + * Thread.kill(thread\) => thread + * + * Causes the given <em>thread</em> to exit (see <code>Thread::exit</code>\). + * + * count = 0 + * a = Thread.new { loop { count += 1 } } + * sleep(0.1\) #=> 0 + * Thread.kill(a\) #=> #<Thread:0x401b3d30 dead> + * count #=> 93947 + * a.alive? #=> false + */) + +directive(static) ident(VALUE) +ident(rb_thread_s_kill)operator(()ident(obj)operator(,) ident(th)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(th)operator(;) +operator({) + reserved(return) ident(rb_thread_kill)operator(()ident(th)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Thread.exit => thread + * + * Terminates the currently running thread and schedules another thread to be + * run. If this thread is already marked to be killed, <code>exit</code> + * returns the <code>Thread</code>. If this is the main thread, or the last + * thread, exit the process. + */) + +directive(static) ident(VALUE) +ident(rb_thread_exit)operator((\)) +operator({) + reserved(return) ident(rb_thread_kill)operator(()ident(curr_thread)operator(->)ident(thread)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Thread.pass => nil + * + * Invokes the thread scheduler to pass execution to another thread. + * + * a = Thread.new { print "a"; Thread.pass; + * print "b"; Thread.pass; + * print "c" } + * b = Thread.new { print "x"; Thread.pass; + * print "y"; Thread.pass; + * print "z" } + * a.join + * b.join + * + * <em>produces:</em> + * + * axbycz + */) + +directive(static) ident(VALUE) +ident(rb_thread_pass)operator((\)) +operator({) + ident(rb_thread_schedule)operator((\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Thread.stop => nil + * + * Stops execution of the current thread, putting it into a ``sleep'' state, + * and schedules execution of another thread. Resets the ``critical'' condition + * to <code>false</code>. + * + * a = Thread.new { print "a"; Thread.stop; print "c" } + * Thread.pass + * print "b" + * a.run + * a.join + * + * <em>produces:</em> + * + * abc + */) + +ident(VALUE) +ident(rb_thread_stop)operator((\)) +operator({) + reserved(enum) ident(rb_thread_status) ident(last_status) operator(=) ident(THREAD_RUNNABLE)operator(;) + + ident(rb_thread_critical) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(curr_thread) operator(==) ident(curr_thread)operator(->)ident(next)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(stopping only thread)char(\\n)char(\\t)content(note: use sleep to stop forever)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL)operator(\)) + ident(last_status) operator(=) ident(THREAD_TO_KILL)operator(;) + ident(curr_thread)operator(->)ident(status) operator(=) ident(THREAD_STOPPED)operator(;) + ident(rb_thread_schedule)operator((\);) + ident(curr_thread)operator(->)ident(status) operator(=) ident(last_status)operator(;) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +reserved(struct) ident(timeval) ident(rb_time_timeval)operator((\);) + +directive(void) +ident(rb_thread_polling)operator((\)) +operator({) + reserved(if) operator(()ident(curr_thread) operator(!=) ident(curr_thread)operator(->)ident(next)operator(\)) operator({) + ident(curr_thread)operator(->)ident(status) operator(=) ident(THREAD_STOPPED)operator(;) + ident(curr_thread)operator(->)ident(delay) operator(=) ident(timeofday)operator((\)) operator(+) operator(()pre_type(double)operator(\))float(0)float(.06)operator(;) + ident(curr_thread)operator(->)ident(wait_for) operator(=) ident(WAIT_TIME)operator(;) + ident(rb_thread_schedule)operator((\);) + operator(}) +operator(}) + +directive(void) +ident(rb_thread_sleep)operator(()ident(sec)operator(\)) + pre_type(int) ident(sec)operator(;) +operator({) + reserved(if) operator(()ident(curr_thread) operator(==) ident(curr_thread)operator(->)ident(next)operator(\)) operator({) + ident(TRAP_BEG)operator(;) + ident(sleep)operator(()ident(sec)operator(\);) + ident(TRAP_END)operator(;) + reserved(return)operator(;) + operator(}) + ident(rb_thread_wait_for)operator(()ident(rb_time_timeval)operator(()ident(INT2FIX)operator(()ident(sec)operator(\)\)\);) +operator(}) + +directive(void) +ident(rb_thread_sleep_forever)operator((\)) +operator({) + pre_type(int) ident(thr_critical) operator(=) ident(rb_thread_critical)operator(;) + reserved(if) operator(()ident(curr_thread) operator(==) ident(curr_thread)operator(->)ident(next) operator(||) + ident(curr_thread)operator(->)ident(status) operator(==) ident(THREAD_TO_KILL)operator(\)) operator({) + ident(rb_thread_critical) operator(=) ident(Qtrue)operator(;) + ident(TRAP_BEG)operator(;) + ident(pause)operator((\);) + ident(rb_thread_critical) operator(=) ident(thr_critical)operator(;) + ident(TRAP_END)operator(;) + reserved(return)operator(;) + operator(}) + + ident(curr_thread)operator(->)ident(delay) operator(=) ident(DELAY_INFTY)operator(;) + ident(curr_thread)operator(->)ident(wait_for) operator(=) ident(WAIT_TIME)operator(;) + ident(curr_thread)operator(->)ident(status) operator(=) ident(THREAD_STOPPED)operator(;) + ident(rb_thread_schedule)operator((\);) +operator(}) + + +comment(/* + * call-seq: + * thr.priority => integer + * + * Returns the priority of <i>thr</i>. Default is inherited from the + * current thread which creating the new thread, or zero for the + * initial main thread; higher-priority threads will run before + * lower-priority threads. + * + * Thread.current.priority #=> 0 + */) + +directive(static) ident(VALUE) +ident(rb_thread_priority)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + reserved(return) ident(INT2NUM)operator(()ident(rb_thread_check)operator(()ident(thread)operator(\)->)ident(priority)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * thr.priority= integer => thr + * + * Sets the priority of <i>thr</i> to <i>integer</i>. Higher-priority threads + * will run before lower-priority threads. + * + * count1 = count2 = 0 + * a = Thread.new do + * loop { count1 += 1 } + * end + * a.priority = -1 + * + * b = Thread.new do + * loop { count2 += 1 } + * end + * b.priority = -2 + * sleep 1 #=> 1 + * Thread.critical = 1 + * count1 #=> 622504 + * count2 #=> 5832 + */) + +directive(static) ident(VALUE) +ident(rb_thread_priority_set)operator(()ident(thread)operator(,) ident(prio)operator(\)) + ident(VALUE) ident(thread)operator(,) ident(prio)operator(;) +operator({) + ident(rb_thread_t) ident(th)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + ident(th)operator(->)ident(priority) operator(=) ident(NUM2INT)operator(()ident(prio)operator(\);) + ident(rb_thread_schedule)operator((\);) + reserved(return) ident(prio)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.safe_level => integer + * + * Returns the safe level in effect for <i>thr</i>. Setting thread-local safe + * levels can help when implementing sandboxes which run insecure code. + * + * thr = Thread.new { $SAFE = 3; sleep } + * Thread.current.safe_level #=> 0 + * thr.safe_level #=> 3 + */) + +directive(static) ident(VALUE) +ident(rb_thread_safe_level)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th)operator(;) + + ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + reserved(if) operator(()ident(th) operator(==) ident(curr_thread)operator(\)) operator({) + reserved(return) ident(INT2NUM)operator(()ident(ruby_safe_level)operator(\);) + operator(}) + reserved(return) ident(INT2NUM)operator(()ident(th)operator(->)ident(safe)operator(\);) +operator(}) + +directive(static) pre_type(int) ident(ruby_thread_abort)operator(;) +directive(static) ident(VALUE) ident(thgroup_default)operator(;) + + +comment(/* + * call-seq: + * Thread.abort_on_exception => true or false + * + * Returns the status of the global ``abort on exception'' condition. The + * default is <code>false</code>. When set to <code>true</code>, or if the + * global <code>$DEBUG</code> flag is <code>true</code> (perhaps because the + * command line option <code>-d</code> was specified\) all threads will abort + * (the process will <code>exit(0\)</code>\) if an exception is raised in any + * thread. See also <code>Thread::abort_on_exception=</code>. + */) + +directive(static) ident(VALUE) +ident(rb_thread_s_abort_exc)operator((\)) +operator({) + reserved(return) ident(ruby_thread_abort)operator(?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Thread.abort_on_exception= boolean => true or false + * + * When set to <code>true</code>, all threads will abort if an exception is + * raised. Returns the new state. + * + * Thread.abort_on_exception = true + * t1 = Thread.new do + * puts "In new thread" + * raise "Exception from thread" + * end + * sleep(1\) + * puts "not reached" + * + * <em>produces:</em> + * + * In new thread + * prog.rb:4: Exception from thread (RuntimeError\) + * from prog.rb:2:in `initialize' + * from prog.rb:2:in `new' + * from prog.rb:2 + */) + +directive(static) ident(VALUE) +ident(rb_thread_s_abort_exc_set)operator(()ident(self)operator(,) ident(val)operator(\)) + ident(VALUE) ident(self)operator(,) ident(val)operator(;) +operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + ident(ruby_thread_abort) operator(=) ident(RTEST)operator(()ident(val)operator(\);) + reserved(return) ident(val)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.abort_on_exception => true or false + * + * Returns the status of the thread-local ``abort on exception'' condition for + * <i>thr</i>. The default is <code>false</code>. See also + * <code>Thread::abort_on_exception=</code>. + */) + +directive(static) ident(VALUE) +ident(rb_thread_abort_exc)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + reserved(return) ident(rb_thread_check)operator(()ident(thread)operator(\)->)ident(abort)operator(?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.abort_on_exception= boolean => true or false + * + * When set to <code>true</code>, causes all threads (including the main + * program\) to abort if an exception is raised in <i>thr</i>. The process will + * effectively <code>exit(0\)</code>. + */) + +directive(static) ident(VALUE) +ident(rb_thread_abort_exc_set)operator(()ident(thread)operator(,) ident(val)operator(\)) + ident(VALUE) ident(thread)operator(,) ident(val)operator(;) +operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + ident(rb_thread_check)operator(()ident(thread)operator(\)->)ident(abort) operator(=) ident(RTEST)operator(()ident(val)operator(\);) + reserved(return) ident(val)operator(;) +operator(}) + + +reserved(enum) ident(rb_thread_status) +ident(rb_thread_status)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + reserved(return) ident(th)operator(->)ident(status)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.group => thgrp or nil + * + * Returns the <code>ThreadGroup</code> which contains <i>thr</i>, or nil if + * the thread is not a member of any group. + * + * Thread.main.group #=> #<ThreadGroup:0x4029d914> + */) + +ident(VALUE) +ident(rb_thread_group)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(VALUE) ident(group) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\)->)ident(thgroup)operator(;) + reserved(if) operator((!)ident(group)operator(\)) operator({) + ident(group) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(group)operator(;) +operator(}) + +preprocessor(#ifdef) ident(__ia64) +preprocessor(# define) ident(IA64_INIT)operator(()ident(x)operator(\)) ident(x) +preprocessor(#else) +preprocessor(# define) ident(IA64_INIT)operator(()ident(x)operator(\)) +preprocessor(#endif) + +preprocessor(#define) ident(THREAD_ALLOC)operator(()ident(th)operator(\)) reserved(do) operator({)\ + ident(th) operator(=) ident(ALLOC)operator(()reserved(struct) ident(rb_thread)operator(\);)\ +\ + ident(th)operator(->)ident(next) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(prev) operator(=) integer(0)operator(;)\ +\ + ident(th)operator(->)ident(status) operator(=) ident(THREAD_RUNNABLE)operator(;)\ + ident(th)operator(->)ident(result) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(flags) operator(=) integer(0)operator(;)\ +\ + ident(th)operator(->)ident(stk_ptr) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(stk_len) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(stk_max) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(wait_for) operator(=) integer(0)operator(;)\ + ident(IA64_INIT)operator(()ident(th)operator(->)ident(bstr_ptr) operator(=) integer(0)operator(\);)\ + ident(IA64_INIT)operator(()ident(th)operator(->)ident(bstr_len) operator(=) integer(0)operator(\);)\ + ident(IA64_INIT)operator(()ident(th)operator(->)ident(bstr_max) operator(=) integer(0)operator(\);)\ + ident(FD_ZERO)operator((&)ident(th)operator(->)ident(readfds)operator(\);)\ + ident(FD_ZERO)operator((&)ident(th)operator(->)ident(writefds)operator(\);)\ + ident(FD_ZERO)operator((&)ident(th)operator(->)ident(exceptfds)operator(\);)\ + ident(th)operator(->)ident(delay) operator(=) float(0)float(.0)operator(;)\ + ident(th)operator(->)ident(join) operator(=) integer(0)operator(;)\ +\ + ident(th)operator(->)ident(frame) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(scope) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(klass) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(wrapper) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(cref) operator(=) ident(ruby_cref)operator(;)\ + ident(th)operator(->)ident(dyna_vars) operator(=) ident(ruby_dyna_vars)operator(;)\ + ident(th)operator(->)ident(block) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(iter) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(tag) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(tracing) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(errinfo) operator(=) ident(Qnil)operator(;)\ + ident(th)operator(->)ident(last_status) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(last_line) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(last_match) operator(=) ident(Qnil)operator(;)\ + ident(th)operator(->)ident(abort) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(priority) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(thgroup) operator(=) ident(thgroup_default)operator(;)\ + ident(th)operator(->)ident(locals) operator(=) integer(0)operator(;)\ + ident(th)operator(->)ident(thread) operator(=) integer(0)operator(;)\ + reserved(if) operator(()ident(curr_thread) operator(==) integer(0)operator(\)) operator({)\ + ident(th)operator(->)ident(sandbox) operator(=) ident(Qnil)operator(;)\ + operator(}) reserved(else) operator({)\ + ident(th)operator(->)ident(sandbox) operator(=) ident(curr_thread)operator(->)ident(sandbox)operator(;)\ + operator(})\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +directive(static) ident(rb_thread_t) +ident(rb_thread_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(rb_thread_t) ident(th)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(vars)operator(;) + + ident(THREAD_ALLOC)operator(()ident(th)operator(\);) + ident(th)operator(->)ident(thread) operator(=) ident(Data_Wrap_Struct)operator(()ident(klass)operator(,) ident(thread_mark)operator(,) ident(thread_free)operator(,) ident(th)operator(\);) + + reserved(for) operator(()ident(vars) operator(=) ident(th)operator(->)ident(dyna_vars)operator(;) ident(vars)operator(;) ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\)\)) reserved(break)operator(;) + ident(FL_SET)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\);) + operator(}) + reserved(return) ident(th)operator(;) +operator(}) + +directive(static) pre_type(int) ident(thread_init)operator(;) + +preprocessor(#if) ident(defined)operator(()ident(_THREAD_SAFE)operator(\)) +directive(static) directive(void) +ident(catch_timer)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) +preprocessor(#if) operator(!)ident(defined)operator(()ident(POSIX_SIGNAL)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(BSD_SIGNAL)operator(\)) + ident(signal)operator(()ident(sig)operator(,) ident(catch_timer)operator(\);) +preprocessor(#endif) + comment(/* cause EINTR */) +operator(}) + +directive(static) pre_type(int) ident(time_thread_alive_p) operator(=) integer(0)operator(;) +directive(static) ident(pthread_t) ident(time_thread)operator(;) + +directive(static) directive(void)operator(*) +ident(thread_timer)operator(()ident(dummy)operator(\)) + directive(void) operator(*)ident(dummy)operator(;) +operator({) +preprocessor(#ifdef) ident(_THREAD_SAFE) +preprocessor(#define) ident(test_cancel)operator((\)) ident(pthread_testcancel)operator((\)) +preprocessor(#else) +preprocessor(#define) ident(test_cancel)operator((\)) comment(/* void */) +preprocessor(#endif) + + ident(sigset_t) ident(all_signals)operator(;) + + ident(sigfillset)operator((&)ident(all_signals)operator(\);) + ident(pthread_sigmask)operator(()ident(SIG_BLOCK)operator(,) operator(&)ident(all_signals)operator(,) integer(0)operator(\);) + + reserved(for) operator((;;\)) operator({) +preprocessor(#ifdef) ident(HAVE_NANOSLEEP) + reserved(struct) ident(timespec) ident(req)operator(,) ident(rem)operator(;) + + ident(test_cancel)operator((\);) + ident(req)operator(.)ident(tv_sec) operator(=) integer(0)operator(;) + ident(req)operator(.)ident(tv_nsec) operator(=) integer(10000000)operator(;) + ident(nanosleep)operator((&)ident(req)operator(,) operator(&)ident(rem)operator(\);) +preprocessor(#else) + reserved(struct) ident(timeval) ident(tv)operator(;) + + ident(test_cancel)operator((\);) + ident(tv)operator(.)ident(tv_sec) operator(=) integer(0)operator(;) + ident(tv)operator(.)ident(tv_usec) operator(=) integer(10000)operator(;) + ident(select)operator(()integer(0)operator(,) pre_constant(NULL)operator(,) pre_constant(NULL)operator(,) pre_constant(NULL)operator(,) operator(&)ident(tv)operator(\);) +preprocessor(#endif) + reserved(if) operator((!)ident(rb_thread_critical)operator(\)) operator({) + ident(rb_thread_pending) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(rb_trap_immediate)operator(\)) operator({) + ident(pthread_kill)operator(()ident(ruby_thid)operator(,) ident(SIGVTALRM)operator(\);) + operator(}) + operator(}) + operator(}) +preprocessor(#undef) ident(test_cancel) +operator(}) + +directive(void) +ident(rb_thread_start_timer)operator((\)) +operator({) +operator(}) + +directive(void) +ident(rb_thread_stop_timer)operator((\)) +operator({) +operator(}) + +directive(void) +ident(rb_child_atfork)operator((\)) +operator({) + ident(time_thread_alive_p) operator(=) integer(0)operator(;) +operator(}) + +directive(void) +ident(rb_thread_cancel_timer)operator((\)) +operator({) +preprocessor(#ifdef) ident(_THREAD_SAFE) + reserved(if)operator(() ident(time_thread_alive_p) operator(\)) + operator({) + ident(pthread_cancel)operator(() ident(time_thread) operator(\);) + ident(pthread_join)operator(() ident(time_thread)operator(,) pre_constant(NULL) operator(\);) + ident(time_thread_alive_p) operator(=) integer(0)operator(;) + operator(}) + ident(thread_init) operator(=) integer(0)operator(;) +preprocessor(#endif) +operator(}) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETITIMER)operator(\)) +directive(static) directive(void) +ident(catch_timer)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) +preprocessor(#if) operator(!)ident(defined)operator(()ident(POSIX_SIGNAL)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(BSD_SIGNAL)operator(\)) + ident(signal)operator(()ident(sig)operator(,) ident(catch_timer)operator(\);) +preprocessor(#endif) + reserved(if) operator((!)ident(rb_thread_critical)operator(\)) operator({) + ident(rb_thread_pending) operator(=) integer(1)operator(;) + operator(}) + comment(/* cause EINTR */) +operator(}) + +directive(void) +ident(rb_thread_start_timer)operator((\)) +operator({) + reserved(struct) ident(itimerval) ident(tval)operator(;) + + reserved(if) operator((!)ident(thread_init)operator(\)) reserved(return)operator(;) + ident(tval)operator(.)ident(it_interval)operator(.)ident(tv_sec) operator(=) integer(0)operator(;) + ident(tval)operator(.)ident(it_interval)operator(.)ident(tv_usec) operator(=) integer(10000)operator(;) + ident(tval)operator(.)ident(it_value) operator(=) ident(tval)operator(.)ident(it_interval)operator(;) + ident(setitimer)operator(()ident(ITIMER_VIRTUAL)operator(,) operator(&)ident(tval)operator(,) pre_constant(NULL)operator(\);) +operator(}) + +directive(void) +ident(rb_thread_stop_timer)operator((\)) +operator({) + reserved(struct) ident(itimerval) ident(tval)operator(;) + + reserved(if) operator((!)ident(thread_init)operator(\)) reserved(return)operator(;) + ident(tval)operator(.)ident(it_interval)operator(.)ident(tv_sec) operator(=) integer(0)operator(;) + ident(tval)operator(.)ident(it_interval)operator(.)ident(tv_usec) operator(=) integer(0)operator(;) + ident(tval)operator(.)ident(it_value) operator(=) ident(tval)operator(.)ident(it_interval)operator(;) + ident(setitimer)operator(()ident(ITIMER_VIRTUAL)operator(,) operator(&)ident(tval)operator(,) pre_constant(NULL)operator(\);) +operator(}) + +directive(void) +ident(rb_thread_cancel_timer)operator((\)) +operator({) +operator(}) + +preprocessor(#else) comment(/* !(_THREAD_SAFE || HAVE_SETITIMER\) */) +pre_type(int) ident(rb_thread_tick) operator(=) ident(THREAD_TICK)operator(;) + +directive(void) +ident(rb_thread_cancel_timer)operator((\)) +operator({) +operator(}) +preprocessor(#endif) + +directive(static) ident(VALUE) +ident(rb_thread_start_0)operator(()ident(fn)operator(,) ident(arg)operator(,) ident(th)operator(\)) + ident(VALUE) operator((*)ident(fn)operator(\)(\);) + directive(void) operator(*)ident(arg)operator(;) + ident(rb_thread_t) ident(th)operator(;) +operator({) + directive(volatile) ident(rb_thread_t) ident(th_save) operator(=) ident(th)operator(;) + directive(volatile) ident(VALUE) ident(thread) operator(=) ident(th)operator(->)ident(thread)operator(;) + reserved(struct) ident(BLOCK) operator(*)directive(volatile) ident(saved_block) operator(=) integer(0)operator(;) + reserved(enum) ident(rb_thread_status) ident(status)operator(;) + pre_type(int) ident(state)operator(;) + + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(curr_thread)operator(->)ident(thgroup)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) + string<delimiter(")content(can't start a new thread (frozen ThreadGroup\))delimiter(")>operator(\);) + operator(}) + + reserved(if) operator((!)ident(thread_init)operator(\)) operator({) + ident(thread_init) operator(=) integer(1)operator(;) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETITIMER)operator(\)) operator(||) ident(defined)operator(()ident(_THREAD_SAFE)operator(\)) +preprocessor(#if) ident(defined)operator(()ident(POSIX_SIGNAL)operator(\)) + ident(posix_signal)operator(()ident(SIGVTALRM)operator(,) ident(catch_timer)operator(\);) +preprocessor(#else) + ident(signal)operator(()ident(SIGVTALRM)operator(,) ident(catch_timer)operator(\);) +preprocessor(#endif) + +preprocessor(#ifdef) ident(_THREAD_SAFE) + ident(pthread_create)operator((&)ident(time_thread)operator(,) integer(0)operator(,) ident(thread_timer)operator(,) integer(0)operator(\);) + ident(time_thread_alive_p) operator(=) integer(1)operator(;) + ident(pthread_atfork)operator(()integer(0)operator(,) integer(0)operator(,) ident(rb_child_atfork)operator(\);) +preprocessor(#else) + ident(rb_thread_start_timer)operator((\);) +preprocessor(#endif) +preprocessor(#endif) + operator(}) + + reserved(if) operator(()ident(THREAD_SAVE_CONTEXT)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(return) ident(thread)operator(;) + operator(}) + + reserved(if) operator(()ident(ruby_block)operator(\)) operator({) comment(/* should nail down higher blocks */) + reserved(struct) ident(BLOCK) ident(dummy)operator(;) + + ident(dummy)operator(.)ident(prev) operator(=) ident(ruby_block)operator(;) + ident(blk_copy_prev)operator((&)ident(dummy)operator(\);) + ident(saved_block) operator(=) ident(ruby_block) operator(=) ident(dummy)operator(.)ident(prev)operator(;) + operator(}) + ident(scope_dup)operator(()ident(ruby_scope)operator(\);) + + reserved(if) operator((!)ident(th)operator(->)ident(next)operator(\)) operator({) + comment(/* merge in thread list */) + ident(th)operator(->)ident(prev) operator(=) ident(curr_thread)operator(;) + ident(curr_thread)operator(->)ident(next)operator(->)ident(prev) operator(=) ident(th)operator(;) + ident(th)operator(->)ident(next) operator(=) ident(curr_thread)operator(->)ident(next)operator(;) + ident(curr_thread)operator(->)ident(next) operator(=) ident(th)operator(;) + ident(th)operator(->)ident(priority) operator(=) ident(curr_thread)operator(->)ident(priority)operator(;) + ident(th)operator(->)ident(thgroup) operator(=) ident(curr_thread)operator(->)ident(thgroup)operator(;) + operator(}) + + ident(PUSH_TAG)operator(()ident(PROT_THREAD)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(THREAD_SAVE_CONTEXT)operator(()ident(th)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(curr_thread) operator(=) ident(th)operator(;) + ident(th)operator(->)ident(result) operator(=) operator((*)ident(fn)operator(\)()ident(arg)operator(,) ident(th)operator(\);) + operator(}) + ident(th) operator(=) ident(th_save)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(TAG_DST)operator((\)\)) operator({) + ident(th) operator(=) ident(th_save)operator(;) + ident(th)operator(->)ident(result) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + operator(}) + ident(POP_TAG)operator((\);) + ident(status) operator(=) ident(th)operator(->)ident(status)operator(;) + + reserved(if) operator(()ident(th) operator(==) ident(main_thread)operator(\)) ident(ruby_stop)operator(()ident(state)operator(\);) + ident(rb_thread_remove)operator(()ident(th)operator(\);) + + reserved(if) operator(()ident(saved_block)operator(\)) operator({) + ident(blk_free)operator(()ident(saved_block)operator(\);) + operator(}) + + reserved(if) operator(()ident(state) operator(&&) ident(status) operator(!=) ident(THREAD_TO_KILL) operator(&&) operator(!)ident(NIL_P)operator(()ident(ruby_errinfo)operator(\)\)) operator({) + ident(th)operator(->)ident(flags) operator(|=) ident(RAISED_EXCEPTION)operator(;) + reserved(if) operator(()ident(state) operator(==) ident(TAG_FATAL)operator(\)) operator({) + comment(/* fatal error within this thread, need to stop whole script */) + ident(main_thread)operator(->)ident(errinfo) operator(=) ident(ruby_errinfo)operator(;) + ident(rb_thread_cleanup)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(rb_obj_is_kind_of)operator(()ident(ruby_errinfo)operator(,) ident(rb_eSystemExit)operator(\)\)) operator({) + reserved(if) operator(()ident(th)operator(->)ident(safe) operator(>=) integer(4)operator(\)) operator({) + pre_type(char) ident(buf)operator([)integer(32)operator(];) + + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(Insecure exit at level %d)delimiter(")>operator(,) ident(th)operator(->)ident(safe)operator(\);) + ident(th)operator(->)ident(errinfo) operator(=) ident(rb_exc_new2)operator(()ident(rb_eSecurityError)operator(,) ident(buf)operator(\);) + operator(}) + reserved(else) operator({) + comment(/* delegate exception to main_thread */) + ident(rb_thread_main_jump)operator(()ident(ruby_errinfo)operator(,) ident(RESTORE_RAISE)operator(\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(th)operator(->)ident(safe) operator(<) integer(4) operator(&&) operator(()ident(ruby_thread_abort) operator(||) ident(th)operator(->)ident(abort) operator(||) ident(RTEST)operator(()ident(ruby_debug)operator(\)\)\)) operator({) + comment(/* exit on main_thread */) + ident(error_print)operator((\);) + ident(rb_thread_main_jump)operator(()ident(ruby_errinfo)operator(,) ident(RESTORE_EXIT)operator(\);) + operator(}) + reserved(else) operator({) + ident(th)operator(->)ident(errinfo) operator(=) ident(ruby_errinfo)operator(;) + operator(}) + operator(}) + ident(rb_thread_schedule)operator((\);) + ident(ruby_stop)operator(()integer(0)operator(\);) comment(/* last thread termination */) + reserved(return) integer(0)operator(;) comment(/* not reached */) +operator(}) + +ident(VALUE) +ident(rb_thread_create)operator(()ident(fn)operator(,) ident(arg)operator(\)) + ident(VALUE) operator((*)ident(fn)operator(\)(\);) + directive(void) operator(*)ident(arg)operator(;) +operator({) + ident(Init_stack)operator((()directive(void) operator(*\)&)ident(arg)operator(\);) + reserved(return) ident(rb_thread_start_0)operator(()ident(fn)operator(,) ident(arg)operator(,) ident(rb_thread_alloc)operator(()ident(rb_cThread)operator(\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_thread_yield)operator(()ident(arg)operator(,) ident(th)operator(\)) + ident(VALUE) ident(arg)operator(;) + ident(rb_thread_t) ident(th)operator(;) +operator({) + directive(const) ident(ID) operator(*)ident(tbl)operator(;) + + ident(scope_dup)operator(()ident(ruby_block)operator(->)ident(scope)operator(\);) + + ident(tbl) operator(=) ident(ruby_scope)operator(->)ident(local_tbl)operator(;) + reserved(if) operator(()ident(tbl)operator(\)) operator({) + pre_type(int) ident(n) operator(=) operator(*)ident(tbl)operator(++;) + reserved(for) operator(()ident(tbl) operator(+=) integer(2)operator(,) ident(n) operator(-=) integer(2)operator(;) ident(n) operator(>) integer(0)operator(;) operator(--)ident(n)operator(\)) operator({) comment(/* skip first 2 ($_ and $~\) */) + ident(ID) ident(id) operator(=) operator(*)ident(tbl)operator(++;) + reserved(if) operator(()ident(id) operator(!=) integer(0) operator(&&) operator(!)ident(rb_is_local_id)operator(()ident(id)operator(\)\)) comment(/* push flip states */) + ident(rb_dvar_push)operator(()ident(id)operator(,) ident(Qfalse)operator(\);) + operator(}) + operator(}) + ident(rb_dvar_push)operator(()char('_')operator(,) ident(Qnil)operator(\);) + ident(rb_dvar_push)operator(()char('~')operator(,) ident(Qnil)operator(\);) + ident(ruby_block)operator(->)ident(dyna_vars) operator(=) ident(ruby_dyna_vars)operator(;) + + reserved(return) ident(rb_yield_0)operator(()ident(arg)operator(,) integer(0)operator(,) integer(0)operator(,) ident(YIELD_LAMBDA_CALL)operator(,) ident(Qtrue)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Thread.new([arg]*\) {|args| block } => thread + * + * Creates and runs a new thread to execute the instructions given in + * <i>block</i>. Any arguments passed to <code>Thread::new</code> are passed + * into the block. + * + * x = Thread.new { sleep 0.1; print "x"; print "y"; print "z" } + * a = Thread.new { print "a"; print "b"; sleep 0.2; print "c" } + * x.join # Let the threads finish before + * a.join # main thread exits... + * + * <em>produces:</em> + * + * abxyzc + */) + +directive(static) ident(VALUE) +ident(rb_thread_s_new)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_alloc)operator(()ident(klass)operator(\);) + directive(volatile) ident(VALUE) operator(*)ident(pos)operator(;) + + ident(pos) operator(=) ident(th)operator(->)ident(stk_pos)operator(;) + ident(rb_obj_call_init)operator(()ident(th)operator(->)ident(thread)operator(,) ident(argc)operator(,) ident(argv)operator(\);) + reserved(if) operator(()ident(th)operator(->)ident(stk_pos) operator(==) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(uninitialized thread - check `%s#initialize')delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(klass)operator(\)\);) + operator(}) + + reserved(return) ident(th)operator(->)ident(thread)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Thread.new([arg]*\) {|args| block } => thread + * + * Creates and runs a new thread to execute the instructions given in + * <i>block</i>. Any arguments passed to <code>Thread::new</code> are passed + * into the block. + * + * x = Thread.new { sleep 0.1; print "x"; print "y"; print "z" } + * a = Thread.new { print "a"; print "b"; sleep 0.2; print "c" } + * x.join # Let the threads finish before + * a.join # main thread exits... + * + * <em>produces:</em> + * + * abxyzc + */) + +directive(static) ident(VALUE) +ident(rb_thread_initialize)operator(()ident(thread)operator(,) ident(args)operator(\)) + ident(VALUE) ident(thread)operator(,) ident(args)operator(;) +operator({) + ident(rb_thread_t) ident(th)operator(;) + + reserved(if) operator((!)ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(must be called with a block)delimiter(")>operator(\);) + operator(}) + ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + reserved(if) operator(()ident(th)operator(->)ident(stk_max)operator(\)) operator({) + ident(NODE) operator(*)ident(node) operator(=) ident(th)operator(->)ident(node)operator(;) + reserved(if) operator((!)ident(node)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(already initialized thread)delimiter(")>operator(\);) + operator(}) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(already initialized thread - %s:%d)delimiter(")>operator(,) + ident(node)operator(->)ident(nd_file)operator(,) ident(nd_line)operator(()ident(node)operator(\)\);) + operator(}) + reserved(return) ident(rb_thread_start_0)operator(()ident(rb_thread_yield)operator(,) ident(args)operator(,) ident(th)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Thread.start([args]*\) {|args| block } => thread + * Thread.fork([args]*\) {|args| block } => thread + * + * Basically the same as <code>Thread::new</code>. However, if class + * <code>Thread</code> is subclassed, then calling <code>start</code> in that + * subclass will not invoke the subclass's <code>initialize</code> method. + */) + +directive(static) ident(VALUE) +ident(rb_thread_start)operator(()ident(klass)operator(,) ident(args)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(args)operator(;) +operator({) + reserved(if) operator((!)ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(must be called with a block)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(rb_thread_start_0)operator(()ident(rb_thread_yield)operator(,) ident(args)operator(,) ident(rb_thread_alloc)operator(()ident(klass)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * thr.value => obj + * + * Waits for <i>thr</i> to complete (via <code>Thread#join</code>\) and returns + * its value. + * + * a = Thread.new { 2 + 2 } + * a.value #=> 4 + */) + +directive(static) ident(VALUE) +ident(rb_thread_value)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + reserved(while) operator((!)ident(rb_thread_join0)operator(()ident(th)operator(,) ident(DELAY_INFTY)operator(\)\);) + + reserved(return) ident(th)operator(->)ident(result)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.status => string, false or nil + * + * Returns the status of <i>thr</i>: ``<code>sleep</code>'' if <i>thr</i> is + * sleeping or waiting on I/O, ``<code>run</code>'' if <i>thr</i> is executing, + * ``<code>aborting</code>'' if <i>thr</i> is aborting, <code>false</code> if + * <i>thr</i> terminated normally, and <code>nil</code> if <i>thr</i> + * terminated with an exception. + * + * a = Thread.new { raise("die now"\) } + * b = Thread.new { Thread.stop } + * c = Thread.new { Thread.exit } + * d = Thread.new { sleep } + * Thread.critical = true + * d.kill #=> #<Thread:0x401b3678 aborting> + * a.status #=> nil + * b.status #=> "sleep" + * c.status #=> false + * d.status #=> "aborting" + * Thread.current.status #=> "run" + */) + +directive(static) ident(VALUE) +ident(rb_thread_status_name)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + reserved(if) operator(()ident(rb_thread_dead)operator(()ident(th)operator(\)\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(th)operator(->)ident(errinfo)operator(\)) operator(&&) operator(()ident(th)operator(->)ident(flags) operator(&) ident(RAISED_EXCEPTION)operator(\)\)) + reserved(return) ident(Qnil)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + + reserved(return) ident(rb_str_new2)operator(()ident(thread_status_name)operator(()ident(th)operator(->)ident(status)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * thr.alive? => true or false + * + * Returns <code>true</code> if <i>thr</i> is running or sleeping. + * + * thr = Thread.new { } + * thr.join #=> #<Thread:0x401b3fb0 dead> + * Thread.current.alive? #=> true + * thr.alive? #=> false + */) + +ident(VALUE) +ident(rb_thread_alive_p)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + reserved(if) operator(()ident(rb_thread_dead)operator(()ident(th)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.stop? => true or false + * + * Returns <code>true</code> if <i>thr</i> is dead or sleeping. + * + * a = Thread.new { Thread.stop } + * b = Thread.current + * a.stop? #=> true + * b.stop? #=> false + */) + +directive(static) ident(VALUE) +ident(rb_thread_stop_p)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + reserved(if) operator(()ident(rb_thread_dead)operator(()ident(th)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(==) ident(THREAD_STOPPED)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) directive(void) +ident(rb_thread_wait_other_threads)operator((\)) +operator({) + ident(rb_thread_t) ident(th)operator(;) + pre_type(int) ident(found)operator(;) + + comment(/* wait other threads to terminate */) + reserved(while) operator(()ident(curr_thread) operator(!=) ident(curr_thread)operator(->)ident(next)operator(\)) operator({) + ident(found) operator(=) integer(0)operator(;) + ident(FOREACH_THREAD)operator(()ident(th)operator(\)) operator({) + reserved(if) operator(()ident(th) operator(!=) ident(curr_thread) operator(&&) ident(th)operator(->)ident(status) operator(!=) ident(THREAD_STOPPED)operator(\)) operator({) + ident(found) operator(=) integer(1)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + ident(END_FOREACH)operator(()ident(th)operator(\);) + reserved(if) operator((!)ident(found)operator(\)) reserved(return)operator(;) + ident(rb_thread_schedule)operator((\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(rb_thread_cleanup)operator((\)) +operator({) + ident(rb_thread_t) ident(curr)operator(,) ident(th)operator(;) + + ident(curr) operator(=) ident(curr_thread)operator(;) + reserved(while) operator(()ident(curr)operator(->)ident(status) operator(==) ident(THREAD_KILLED)operator(\)) operator({) + ident(curr) operator(=) ident(curr)operator(->)ident(prev)operator(;) + operator(}) + + ident(FOREACH_THREAD_FROM)operator(()ident(curr)operator(,) ident(th)operator(\)) operator({) + reserved(if) operator(()ident(th)operator(->)ident(status) operator(!=) ident(THREAD_KILLED)operator(\)) operator({) + ident(rb_thread_ready)operator(()ident(th)operator(\);) + reserved(if) operator(()ident(th) operator(!=) ident(main_thread)operator(\)) operator({) + ident(th)operator(->)ident(thgroup) operator(=) integer(0)operator(;) + ident(th)operator(->)ident(priority) operator(=) integer(0)operator(;) + ident(th)operator(->)ident(status) operator(=) ident(THREAD_TO_KILL)operator(;) + ident(RDATA)operator(()ident(th)operator(->)ident(thread)operator(\)->)ident(dfree) operator(=) pre_constant(NULL)operator(;) + operator(}) + operator(}) + operator(}) + ident(END_FOREACH_FROM)operator(()ident(curr)operator(,) ident(th)operator(\);) +operator(}) + +pre_type(int) ident(rb_thread_critical)operator(;) + + +comment(/* + * call-seq: + * Thread.critical => true or false + * + * Returns the status of the global ``thread critical'' condition. + */) + +directive(static) ident(VALUE) +ident(rb_thread_critical_get)operator((\)) +operator({) + reserved(return) ident(rb_thread_critical)operator(?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Thread.critical= boolean => true or false + * + * Sets the status of the global ``thread critical'' condition and returns + * it. When set to <code>true</code>, prohibits scheduling of any existing + * thread. Does not block new threads from being created and run. Certain + * thread operations (such as stopping or killing a thread, sleeping in the + * current thread, and raising an exception\) may cause a thread to be scheduled + * even when in a critical section. <code>Thread::critical</code> is not + * intended for daily use: it is primarily there to support folks writing + * threading libraries. + */) + +directive(static) ident(VALUE) +ident(rb_thread_critical_set)operator(()ident(obj)operator(,) ident(val)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(val)operator(;) +operator({) + ident(rb_thread_critical) operator(=) ident(RTEST)operator(()ident(val)operator(\);) + reserved(return) ident(val)operator(;) +operator(}) + +directive(void) +ident(rb_thread_interrupt)operator((\)) +operator({) + ident(rb_thread_critical) operator(=) integer(0)operator(;) + ident(rb_thread_ready)operator(()ident(main_thread)operator(\);) + reserved(if) operator(()ident(curr_thread) operator(==) ident(main_thread)operator(\)) operator({) + ident(rb_interrupt)operator((\);) + operator(}) + reserved(if) operator((!)ident(rb_thread_dead)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(if) operator(()ident(THREAD_SAVE_CONTEXT)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(return)operator(;) + operator(}) + operator(}) + ident(curr_thread) operator(=) ident(main_thread)operator(;) + ident(rb_thread_restore_context)operator(()ident(curr_thread)operator(,) ident(RESTORE_INTERRUPT)operator(\);) +operator(}) + +directive(void) +ident(rb_thread_signal_raise)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) + ident(rb_thread_critical) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(curr_thread) operator(==) ident(main_thread)operator(\)) operator({) + ident(VALUE) ident(argv)operator([)integer(1)operator(];) + + ident(rb_thread_ready)operator(()ident(curr_thread)operator(\);) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(INT2FIX)operator(()ident(sig)operator(\);) + ident(rb_exc_raise)operator(()ident(rb_class_new_instance)operator(()integer(1)operator(,) ident(argv)operator(,) ident(rb_eSignal)operator(\)\);) + operator(}) + ident(rb_thread_ready)operator(()ident(main_thread)operator(\);) + reserved(if) operator((!)ident(rb_thread_dead)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(if) operator(()ident(THREAD_SAVE_CONTEXT)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(return)operator(;) + operator(}) + operator(}) + ident(th_sig) operator(=) ident(sig)operator(;) + ident(curr_thread) operator(=) ident(main_thread)operator(;) + ident(rb_thread_restore_context)operator(()ident(curr_thread)operator(,) ident(RESTORE_SIGNAL)operator(\);) +operator(}) + +directive(void) +ident(rb_thread_trap_eval)operator(()ident(cmd)operator(,) ident(sig)operator(,) ident(safe)operator(\)) + ident(VALUE) ident(cmd)operator(;) + pre_type(int) ident(sig)operator(,) ident(safe)operator(;) +operator({) + ident(rb_thread_critical) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(curr_thread) operator(==) ident(main_thread)operator(\)) operator({) + ident(rb_trap_eval)operator(()ident(cmd)operator(,) ident(sig)operator(,) ident(safe)operator(\);) + reserved(return)operator(;) + operator(}) + reserved(if) operator((!)ident(rb_thread_dead)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(if) operator(()ident(THREAD_SAVE_CONTEXT)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(return)operator(;) + operator(}) + operator(}) + ident(th_cmd) operator(=) ident(cmd)operator(;) + ident(th_sig) operator(=) ident(sig)operator(;) + ident(th_safe) operator(=) ident(safe)operator(;) + ident(curr_thread) operator(=) ident(main_thread)operator(;) + ident(rb_thread_restore_context)operator(()ident(curr_thread)operator(,) ident(RESTORE_TRAP)operator(\);) +operator(}) + +directive(void) +ident(rb_thread_signal_exit)operator((\)) +operator({) + ident(VALUE) ident(args)operator([)integer(2)operator(];) + + ident(rb_thread_critical) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(curr_thread) operator(==) ident(main_thread)operator(\)) operator({) + ident(rb_thread_ready)operator(()ident(curr_thread)operator(\);) + ident(rb_exit)operator(()ident(EXIT_SUCCESS)operator(\);) + operator(}) + ident(args)operator([)integer(0)operator(]) operator(=) ident(INT2NUM)operator(()ident(EXIT_SUCCESS)operator(\);) + ident(args)operator([)integer(1)operator(]) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(exit)delimiter(")>operator(\);) + ident(rb_thread_ready)operator(()ident(main_thread)operator(\);) + reserved(if) operator((!)ident(rb_thread_dead)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(if) operator(()ident(THREAD_SAVE_CONTEXT)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(return)operator(;) + operator(}) + operator(}) + ident(rb_thread_main_jump)operator(()ident(rb_class_new_instance)operator(()integer(2)operator(,) ident(args)operator(,) ident(rb_eSystemExit)operator(\),) + ident(RESTORE_EXIT)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_thread_raise)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(th)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(rb_thread_t) ident(th)operator(;) +operator({) + directive(volatile) ident(rb_thread_t) ident(th_save) operator(=) ident(th)operator(;) + ident(VALUE) ident(exc)operator(;) + + reserved(if) operator((!)ident(th)operator(->)ident(next)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(unstarted thread)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(rb_thread_dead)operator(()ident(th)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(exc) operator(=) ident(rb_make_exception)operator(()ident(argc)operator(,) ident(argv)operator(\);) + reserved(if) operator(()ident(curr_thread) operator(==) ident(th)operator(\)) operator({) + ident(rb_raise_jump)operator(()ident(exc)operator(\);) + operator(}) + + reserved(if) operator((!)ident(rb_thread_dead)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(if) operator(()ident(THREAD_SAVE_CONTEXT)operator(()ident(curr_thread)operator(\)\)) operator({) + reserved(return) ident(th_save)operator(->)ident(thread)operator(;) + operator(}) + operator(}) + + ident(rb_thread_ready)operator(()ident(th)operator(\);) + ident(curr_thread) operator(=) ident(th)operator(;) + + ident(th_raise_exception) operator(=) ident(exc)operator(;) + ident(th_raise_node) operator(=) ident(ruby_current_node)operator(;) + ident(rb_thread_restore_context)operator(()ident(curr_thread)operator(,) ident(RESTORE_RAISE)operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + + +comment(/* + * call-seq: + * thr.raise(exception\) + * + * Raises an exception (see <code>Kernel::raise</code>\) from <i>thr</i>. The + * caller does not have to be <i>thr</i>. + * + * Thread.abort_on_exception = true + * a = Thread.new { sleep(200\) } + * a.raise("Gotcha"\) + * + * <em>produces:</em> + * + * prog.rb:3: Gotcha (RuntimeError\) + * from prog.rb:2:in `initialize' + * from prog.rb:2:in `new' + * from prog.rb:2 + */) + +directive(static) ident(VALUE) +ident(rb_thread_raise_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(thread)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + reserved(if) operator(()ident(ruby_safe_level) operator(>) ident(th)operator(->)ident(safe)operator(\)) operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + operator(}) + ident(rb_thread_raise)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(th)operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +ident(VALUE) +ident(rb_thread_local_aref)operator(()ident(thread)operator(,) ident(id)operator(\)) + ident(VALUE) ident(thread)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(rb_thread_t) ident(th)operator(;) + ident(VALUE) ident(val)operator(;) + + ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4) operator(&&) ident(th) operator(!=) ident(curr_thread)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: thread locals)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!)ident(th)operator(->)ident(locals)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(st_lookup)operator(()ident(th)operator(->)ident(locals)operator(,) ident(id)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(return) ident(val)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr[sym] => obj or nil + * + * Attribute Reference---Returns the value of a thread-local variable, using + * either a symbol or a string name. If the specified variable does not exist, + * returns <code>nil</code>. + * + * a = Thread.new { Thread.current["name"] = "A"; Thread.stop } + * b = Thread.new { Thread.current[:name] = "B"; Thread.stop } + * c = Thread.new { Thread.current["name"] = "C"; Thread.stop } + * Thread.list.each {|x| puts "#{x.inspect}: #{x[:name]}" } + * + * <em>produces:</em> + * + * #<Thread:0x401b3b3c sleep>: C + * #<Thread:0x401b3bc8 sleep>: B + * #<Thread:0x401b3c68 sleep>: A + * #<Thread:0x401bdf4c run>: + */) + +directive(static) ident(VALUE) +ident(rb_thread_aref)operator(()ident(thread)operator(,) ident(id)operator(\)) + ident(VALUE) ident(thread)operator(,) ident(id)operator(;) +operator({) + reserved(return) ident(rb_thread_local_aref)operator(()ident(thread)operator(,) ident(rb_to_id)operator(()ident(id)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_thread_local_aset)operator(()ident(thread)operator(,) ident(id)operator(,) ident(val)operator(\)) + ident(VALUE) ident(thread)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + reserved(if) operator(()ident(ruby_safe_level) operator(>=) integer(4) operator(&&) ident(th) operator(!=) ident(curr_thread)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify thread locals)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(thread)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(thread locals)delimiter(")>operator(\);) + + reserved(if) operator((!)ident(th)operator(->)ident(locals)operator(\)) operator({) + ident(th)operator(->)ident(locals) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + ident(st_delete)operator(()ident(th)operator(->)ident(locals)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) integer(0)operator(\);) + reserved(return) ident(Qnil)operator(;) + operator(}) + ident(st_insert)operator(()ident(th)operator(->)ident(locals)operator(,) ident(id)operator(,) ident(val)operator(\);) + + reserved(return) ident(val)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr[sym] = obj => obj + * + * Attribute Assignment---Sets or creates the value of a thread-local variable, + * using either a symbol or a string. See also <code>Thread#[]</code>. + */) + +directive(static) ident(VALUE) +ident(rb_thread_aset)operator(()ident(thread)operator(,) ident(id)operator(,) ident(val)operator(\)) + ident(VALUE) ident(thread)operator(,) ident(id)operator(,) ident(val)operator(;) +operator({) + reserved(return) ident(rb_thread_local_aset)operator(()ident(thread)operator(,) ident(rb_to_id)operator(()ident(id)operator(\),) ident(val)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * thr.key?(sym\) => true or false + * + * Returns <code>true</code> if the given string (or symbol\) exists as a + * thread-local variable. + * + * me = Thread.current + * me[:oliver] = "a" + * me.key?(:oliver\) #=> true + * me.key?(:stanley\) #=> false + */) + +directive(static) ident(VALUE) +ident(rb_thread_key_p)operator(()ident(thread)operator(,) ident(id)operator(\)) + ident(VALUE) ident(thread)operator(,) ident(id)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + reserved(if) operator((!)ident(th)operator(->)ident(locals)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(st_lookup)operator(()ident(th)operator(->)ident(locals)operator(,) ident(rb_to_id)operator(()ident(id)operator(\),) integer(0)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(thread_keys_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(ary)operator(\)) + ident(ID) ident(key)operator(;) + ident(VALUE) ident(value)operator(,) ident(ary)operator(;) +operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(ID2SYM)operator(()ident(key)operator(\)\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thr.keys => array + * + * Returns an an array of the names of the thread-local variables (as Symbols\). + * + * thr = Thread.new do + * Thread.current[:cat] = 'meow' + * Thread.current["dog"] = 'woof' + * end + * thr.join #=> #<Thread:0x401b3f10 dead> + * thr.keys #=> [:dog, :cat] + */) + +directive(static) ident(VALUE) +ident(rb_thread_keys)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + reserved(if) operator(()ident(th)operator(->)ident(locals)operator(\)) operator({) + ident(st_foreach)operator(()ident(th)operator(->)ident(locals)operator(,) ident(thread_keys_i)operator(,) ident(ary)operator(\);) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * thr.inspect => string + * + * Dump the name, id, and status of _thr_ to a string. + */) + +directive(static) ident(VALUE) +ident(rb_thread_inspect)operator(()ident(thread)operator(\)) + ident(VALUE) ident(thread)operator(;) +operator({) + pre_type(char) operator(*)ident(cname) operator(=) ident(rb_obj_classname)operator(()ident(thread)operator(\);) + ident(rb_thread_t) ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + directive(const) pre_type(char) operator(*)ident(status) operator(=) ident(thread_status_name)operator(()ident(th)operator(->)ident(status)operator(\);) + ident(VALUE) ident(str)operator(;) + ident(size_t) ident(len) operator(=) ident(strlen)operator(()ident(cname)operator(\)+)integer(7)operator(+)integer(16)operator(+)integer(9)operator(+)integer(1)operator(;) + + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) comment(/* 7:tags 16:addr 9:status 1:nul */) + ident(snprintf)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(,) string<delimiter(")content(#<%s:0x%lx %s>)delimiter(")>operator(,) ident(cname)operator(,) ident(thread)operator(,) ident(status)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(strlen)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(thread)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +directive(void) +ident(rb_thread_atfork)operator((\)) +operator({) + ident(rb_thread_t) ident(th)operator(;) + + reserved(if) operator(()ident(rb_thread_alone)operator((\)\)) reserved(return)operator(;) + ident(FOREACH_THREAD)operator(()ident(th)operator(\)) operator({) + reserved(if) operator(()ident(th) operator(!=) ident(curr_thread)operator(\)) operator({) + ident(rb_thread_die)operator(()ident(th)operator(\);) + operator(}) + operator(}) + ident(END_FOREACH)operator(()ident(th)operator(\);) + ident(main_thread) operator(=) ident(curr_thread)operator(;) + ident(curr_thread)operator(->)ident(next) operator(=) ident(curr_thread)operator(;) + ident(curr_thread)operator(->)ident(prev) operator(=) ident(curr_thread)operator(;) +operator(}) + + +directive(static) directive(void) +ident(cc_purge)operator(()ident(cc)operator(\)) + ident(rb_thread_t) ident(cc)operator(;) +operator({) + comment(/* free continuation's stack if it has just died */) + reserved(if) operator(()ident(NIL_P)operator(()ident(cc)operator(->)ident(thread)operator(\)\)) reserved(return)operator(;) + reserved(if) operator(()ident(rb_thread_check)operator(()ident(cc)operator(->)ident(thread)operator(\)->)ident(status) operator(==) ident(THREAD_KILLED)operator(\)) operator({) + ident(cc)operator(->)ident(thread) operator(=) ident(Qnil)operator(;) + ident(rb_thread_die)operator(()ident(cc)operator(\);) comment(/* can't possibly activate this stack */) + operator(}) +operator(}) + +directive(static) directive(void) +ident(cc_mark)operator(()ident(cc)operator(\)) + ident(rb_thread_t) ident(cc)operator(;) +operator({) + comment(/* mark this continuation's stack only if its parent thread is still alive */) + ident(cc_purge)operator(()ident(cc)operator(\);) + ident(thread_mark)operator(()ident(cc)operator(\);) +operator(}) + +directive(static) ident(rb_thread_t) +ident(rb_cont_check)operator(()ident(data)operator(\)) + ident(VALUE) ident(data)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(data)operator(\)) operator(!=) ident(T_DATA) operator(||) ident(RDATA)operator(()ident(data)operator(\)->)ident(dmark) operator(!=) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(cc_mark)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type %s (expected Continuation\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(data)operator(\)\);) + operator(}) + reserved(return) operator(()ident(rb_thread_t)operator(\))ident(RDATA)operator(()ident(data)operator(\)->)ident(data)operator(;) +operator(}) + +comment(/* + * Document-class: Continuation + * + * Continuation objects are generated by + * <code>Kernel#callcc</code>. They hold a return address and execution + * context, allowing a nonlocal return to the end of the + * <code>callcc</code> block from anywhere within a program. + * Continuations are somewhat analogous to a structured version of C's + * <code>setjmp/longjmp</code> (although they contain more state, so + * you might consider them closer to threads\). + * + * For instance: + * + * arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ] + * callcc{|$cc|} + * puts(message = arr.shift\) + * $cc.call unless message =~ /Max/ + * + * <em>produces:</em> + * + * Freddie + * Herbie + * Ron + * Max + * + * This (somewhat contrived\) example allows the inner loop to abandon + * processing early: + * + * callcc {|cont| + * for i in 0..4 + * print "\\n#{i}: " + * for j in i*5...(i+1\)*5 + * cont.call(\) if j == 17 + * printf "%3d", j + * end + * end + * } + * print "\\n" + * + * <em>produces:</em> + * + * 0: 0 1 2 3 4 + * 1: 5 6 7 8 9 + * 2: 10 11 12 13 14 + * 3: 15 16 + */) + +ident(VALUE) ident(rb_cCont)operator(;) + +comment(/* + * call-seq: + * callcc {|cont| block } => obj + * + * Generates a <code>Continuation</code> object, which it passes to the + * associated block. Performing a <em>cont</em><code>.call</code> will + * cause the <code>callcc</code> to return (as will falling through the + * end of the block\). The value returned by the <code>callcc</code> is + * the value of the block, or the value passed to + * <em>cont</em><code>.call</code>. See class <code>Continuation</code> + * for more details. Also see <code>Kernel::throw</code> for + * an alternative mechanism for unwinding a call stack. + */) + +directive(static) ident(VALUE) +ident(rb_callcc)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(cont)operator(;) + ident(rb_thread_t) ident(th)operator(;) + directive(volatile) ident(rb_thread_t) ident(th_save)operator(;) + reserved(struct) ident(tag) operator(*)ident(tag)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(vars)operator(;) + + ident(THREAD_ALLOC)operator(()ident(th)operator(\);) + comment(/* must finish th initialization before any possible gc. + * brent@mbari.org */) + ident(th)operator(->)ident(thread) operator(=) ident(curr_thread)operator(->)ident(thread)operator(;) + ident(th)operator(->)ident(thgroup) operator(=) ident(cont_protect)operator(;) + ident(cont) operator(=) ident(Data_Wrap_Struct)operator(()ident(rb_cCont)operator(,) ident(cc_mark)operator(,) ident(thread_free)operator(,) ident(th)operator(\);) + + ident(scope_dup)operator(()ident(ruby_scope)operator(\);) + reserved(for) operator(()ident(tag)operator(=)ident(prot_tag)operator(;) ident(tag)operator(;) ident(tag)operator(=)ident(tag)operator(->)ident(prev)operator(\)) operator({) + ident(scope_dup)operator(()ident(tag)operator(->)ident(scope)operator(\);) + operator(}) + + reserved(for) operator(()ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) ident(vars)operator(;) ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\)\)) reserved(break)operator(;) + ident(FL_SET)operator(()ident(vars)operator(,) ident(DVAR_DONT_RECYCLE)operator(\);) + operator(}) + ident(th_save) operator(=) ident(th)operator(;) + reserved(if) operator(()ident(THREAD_SAVE_CONTEXT)operator(()ident(th)operator(\)\)) operator({) + reserved(return) ident(th_save)operator(->)ident(result)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_yield)operator(()ident(cont)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * cont.call(args, ...\) + * cont[args, ...] + * + * Invokes the continuation. The program continues from the end of the + * <code>callcc</code> block. If no arguments are given, the original + * <code>callcc</code> returns <code>nil</code>. If one argument is + * given, <code>callcc</code> returns it. Otherwise, an array + * containing <i>args</i> is returned. + * + * callcc {|cont| cont.call } #=> nil + * callcc {|cont| cont.call 1 } #=> 1 + * callcc {|cont| cont.call 1, 2, 3 } #=> [1, 2, 3] + */) + +directive(static) ident(VALUE) +ident(rb_cont_call)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(cont)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(cont)operator(;) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_cont_check)operator(()ident(cont)operator(\);) + + reserved(if) operator(()ident(th)operator(->)ident(thread) operator(!=) ident(curr_thread)operator(->)ident(thread)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(continuation called across threads)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(th)operator(->)ident(thgroup) operator(!=) ident(cont_protect)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(continuation called across trap)delimiter(")>operator(\);) + operator(}) + reserved(switch) operator(()ident(argc)operator(\)) operator({) + reserved(case) integer(0)operator(:) + ident(th)operator(->)ident(result) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + reserved(case) integer(1)operator(:) + ident(th)operator(->)ident(result) operator(=) ident(argv)operator([)integer(0)operator(];) + reserved(break)operator(;) + reserved(default)operator(:) + ident(th)operator(->)ident(result) operator(=) ident(rb_ary_new4)operator(()ident(argc)operator(,) ident(argv)operator(\);) + reserved(break)operator(;) + operator(}) + + ident(rb_thread_restore_context)operator(()ident(th)operator(,) ident(RESTORE_NORMAL)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +reserved(struct) ident(thgroup) operator({) + pre_type(int) ident(enclosed)operator(;) + ident(VALUE) ident(group)operator(;) +operator(};) + + +comment(/* + * Document-class: ThreadGroup + * + * <code>ThreadGroup</code> provides a means of keeping track of a number of + * threads as a group. A <code>Thread</code> can belong to only one + * <code>ThreadGroup</code> at a time; adding a thread to a new group will + * remove it from any previous group. + * + * Newly created threads belong to the same group as the thread from which they + * were created. + */) + +directive(static) ident(VALUE) ident(thgroup_s_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(thgroup_s_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(group)operator(;) + reserved(struct) ident(thgroup) operator(*)ident(data)operator(;) + + ident(group) operator(=) ident(Data_Make_Struct)operator(()ident(klass)operator(,) reserved(struct) ident(thgroup)operator(,) integer(0)operator(,) ident(free)operator(,) ident(data)operator(\);) + ident(data)operator(->)ident(enclosed) operator(=) integer(0)operator(;) + ident(data)operator(->)ident(group) operator(=) ident(group)operator(;) + + reserved(return) ident(group)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thgrp.list => array + * + * Returns an array of all existing <code>Thread</code> objects that belong to + * this group. + * + * ThreadGroup::Default.list #=> [#<Thread:0x401bdf4c run>] + */) + +directive(static) ident(VALUE) +ident(thgroup_list)operator(()ident(group)operator(\)) + ident(VALUE) ident(group)operator(;) +operator({) + reserved(struct) ident(thgroup) operator(*)ident(data)operator(;) + ident(rb_thread_t) ident(th)operator(;) + ident(VALUE) ident(ary)operator(;) + + ident(Data_Get_Struct)operator(()ident(group)operator(,) reserved(struct) ident(thgroup)operator(,) ident(data)operator(\);) + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(FOREACH_THREAD)operator(()ident(th)operator(\)) operator({) + reserved(if) operator(()ident(th)operator(->)ident(thgroup) operator(==) ident(data)operator(->)ident(group)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(th)operator(->)ident(thread)operator(\);) + operator(}) + operator(}) + ident(END_FOREACH)operator(()ident(th)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thgrp.enclose => thgrp + * + * Prevents threads from being added to or removed from the receiving + * <code>ThreadGroup</code>. New threads can still be started in an enclosed + * <code>ThreadGroup</code>. + * + * ThreadGroup::Default.enclose #=> #<ThreadGroup:0x4029d914> + * thr = Thread::new { Thread.stop } #=> #<Thread:0x402a7210 sleep> + * tg = ThreadGroup::new #=> #<ThreadGroup:0x402752d4> + * tg.add thr + * + * <em>produces:</em> + * + * ThreadError: can't move from the enclosed thread group + */) + +directive(static) ident(VALUE) +ident(thgroup_enclose)operator(()ident(group)operator(\)) + ident(VALUE) ident(group)operator(;) +operator({) + reserved(struct) ident(thgroup) operator(*)ident(data)operator(;) + + ident(Data_Get_Struct)operator(()ident(group)operator(,) reserved(struct) ident(thgroup)operator(,) ident(data)operator(\);) + ident(data)operator(->)ident(enclosed) operator(=) integer(1)operator(;) + + reserved(return) ident(group)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thgrp.enclosed? => true or false + * + * Returns <code>true</code> if <em>thgrp</em> is enclosed. See also + * ThreadGroup#enclose. + */) + +directive(static) ident(VALUE) +ident(thgroup_enclosed_p)operator(()ident(group)operator(\)) + ident(VALUE) ident(group)operator(;) +operator({) + reserved(struct) ident(thgroup) operator(*)ident(data)operator(;) + + ident(Data_Get_Struct)operator(()ident(group)operator(,) reserved(struct) ident(thgroup)operator(,) ident(data)operator(\);) + reserved(if) operator(()ident(data)operator(->)ident(enclosed)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * thgrp.add(thread\) => thgrp + * + * Adds the given <em>thread</em> to this group, removing it from any other + * group to which it may have previously belonged. + * + * puts "Initial group is #{ThreadGroup::Default.list}" + * tg = ThreadGroup.new + * t1 = Thread.new { sleep } + * t2 = Thread.new { sleep } + * puts "t1 is #{t1}" + * puts "t2 is #{t2}" + * tg.add(t1\) + * puts "Initial group now #{ThreadGroup::Default.list}" + * puts "tg group now #{tg.list}" + * + * <em>produces:</em> + * + * Initial group is #<Thread:0x401bdf4c> + * t1 is #<Thread:0x401b3c90> + * t2 is #<Thread:0x401b3c18> + * Initial group now #<Thread:0x401b3c18>#<Thread:0x401bdf4c> + * tg group now #<Thread:0x401b3c90> + */) + +directive(static) ident(VALUE) +ident(thgroup_add)operator(()ident(group)operator(,) ident(thread)operator(\)) + ident(VALUE) ident(group)operator(,) ident(thread)operator(;) +operator({) + ident(rb_thread_t) ident(th)operator(;) + reserved(struct) ident(thgroup) operator(*)ident(data)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + ident(th) operator(=) ident(rb_thread_check)operator(()ident(thread)operator(\);) + + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(group)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(can't move to the frozen thread group)delimiter(")>operator(\);) + operator(}) + ident(Data_Get_Struct)operator(()ident(group)operator(,) reserved(struct) ident(thgroup)operator(,) ident(data)operator(\);) + reserved(if) operator(()ident(data)operator(->)ident(enclosed)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(can't move to the enclosed thread group)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator((!)ident(th)operator(->)ident(thgroup)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(th)operator(->)ident(thgroup)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(can't move from the frozen thread group)delimiter(")>operator(\);) + operator(}) + ident(Data_Get_Struct)operator(()ident(th)operator(->)ident(thgroup)operator(,) reserved(struct) ident(thgroup)operator(,) ident(data)operator(\);) + reserved(if) operator(()ident(data)operator(->)ident(enclosed)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(can't move from the enclosed thread group)delimiter(")>operator(\);) + operator(}) + + ident(th)operator(->)ident(thgroup) operator(=) ident(group)operator(;) + reserved(return) ident(group)operator(;) +operator(}) + + +comment(/* + * +Thread+ encapsulates the behavior of a thread of + * execution, including the main thread of the Ruby script. + * + * In the descriptions of the methods in this class, the parameter _sym_ + * refers to a symbol, which is either a quoted string or a + * +Symbol+ (such as <code>:name</code>\). + */) + +directive(void) +ident(Init_Thread)operator((\)) +operator({) + ident(VALUE) ident(cThGroup)operator(;) + + ident(rb_eThreadError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(ThreadError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_cThread) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Thread)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cThread)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(rb_thread_s_new)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_thread_initialize)operator(,) operator(-)integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(start)delimiter(")>operator(,) ident(rb_thread_start)operator(,) operator(-)integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(fork)delimiter(")>operator(,) ident(rb_thread_start)operator(,) operator(-)integer(2)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(stop)delimiter(")>operator(,) ident(rb_thread_stop)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(kill)delimiter(")>operator(,) ident(rb_thread_s_kill)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(exit)delimiter(")>operator(,) ident(rb_thread_exit)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(pass)delimiter(")>operator(,) ident(rb_thread_pass)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(current)delimiter(")>operator(,) ident(rb_thread_current)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(main)delimiter(")>operator(,) ident(rb_thread_main)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(list)delimiter(")>operator(,) ident(rb_thread_list)operator(,) integer(0)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(critical)delimiter(")>operator(,) ident(rb_thread_critical_get)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(critical=)delimiter(")>operator(,) ident(rb_thread_critical_set)operator(,) integer(1)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(abort_on_exception)delimiter(")>operator(,) ident(rb_thread_s_abort_exc)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(abort_on_exception=)delimiter(")>operator(,) ident(rb_thread_s_abort_exc_set)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(run)delimiter(")>operator(,) ident(rb_thread_run)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(wakeup)delimiter(")>operator(,) ident(rb_thread_wakeup)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(kill)delimiter(")>operator(,) ident(rb_thread_kill)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(terminate)delimiter(")>operator(,) ident(rb_thread_kill)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(exit)delimiter(")>operator(,) ident(rb_thread_kill)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(kill!)delimiter(")>operator(,) ident(rb_thread_kill_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(terminate!)delimiter(")>operator(,) ident(rb_thread_kill_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(exit!)delimiter(")>operator(,) ident(rb_thread_kill_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(value)delimiter(")>operator(,) ident(rb_thread_value)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(status)delimiter(")>operator(,) ident(rb_thread_status_name)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(join)delimiter(")>operator(,) ident(rb_thread_join_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(alive?)delimiter(")>operator(,) ident(rb_thread_alive_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(stop?)delimiter(")>operator(,) ident(rb_thread_stop_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(raise)delimiter(")>operator(,) ident(rb_thread_raise_m)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(abort_on_exception)delimiter(")>operator(,) ident(rb_thread_abort_exc)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(abort_on_exception=)delimiter(")>operator(,) ident(rb_thread_abort_exc_set)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(priority)delimiter(")>operator(,) ident(rb_thread_priority)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(priority=)delimiter(")>operator(,) ident(rb_thread_priority_set)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(safe_level)delimiter(")>operator(,) ident(rb_thread_safe_level)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(group)delimiter(")>operator(,) ident(rb_thread_group)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(rb_thread_aref)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content([]=)delimiter(")>operator(,) ident(rb_thread_aset)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(key?)delimiter(")>operator(,) ident(rb_thread_key_p)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(keys)delimiter(")>operator(,) ident(rb_thread_keys)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cThread)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_thread_inspect)operator(,) integer(0)operator(\);) + + ident(rb_cCont) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Continuation)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cCont)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cCont)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + ident(rb_define_method)operator(()ident(rb_cCont)operator(,) string<delimiter(")content(call)delimiter(")>operator(,) ident(rb_cont_call)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cCont)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(rb_cont_call)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(callcc)delimiter(")>operator(,) ident(rb_callcc)operator(,) integer(0)operator(\);) + ident(rb_global_variable)operator((&)ident(cont_protect)operator(\);) + + ident(cThGroup) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(ThreadGroup)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_define_alloc_func)operator(()ident(cThGroup)operator(,) ident(thgroup_s_alloc)operator(\);) + ident(rb_define_method)operator(()ident(cThGroup)operator(,) string<delimiter(")content(list)delimiter(")>operator(,) ident(thgroup_list)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(cThGroup)operator(,) string<delimiter(")content(enclose)delimiter(")>operator(,) ident(thgroup_enclose)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(cThGroup)operator(,) string<delimiter(")content(enclosed?)delimiter(")>operator(,) ident(thgroup_enclosed_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(cThGroup)operator(,) string<delimiter(")content(add)delimiter(")>operator(,) ident(thgroup_add)operator(,) integer(1)operator(\);) + ident(rb_global_variable)operator((&)ident(thgroup_default)operator(\);) + ident(thgroup_default) operator(=) ident(rb_obj_alloc)operator(()ident(cThGroup)operator(\);) + ident(rb_define_const)operator(()ident(cThGroup)operator(,) string<delimiter(")content(Default)delimiter(")>operator(,) ident(thgroup_default)operator(\);) + + comment(/* allocate main thread */) + ident(main_thread) operator(=) ident(rb_thread_alloc)operator(()ident(rb_cThread)operator(\);) + ident(curr_thread) operator(=) ident(main_thread)operator(->)ident(prev) operator(=) ident(main_thread)operator(->)ident(next) operator(=) ident(main_thread)operator(;) +operator(}) + +comment(/* + * call-seq: + * catch(symbol\) {| | block } > obj + * + * +catch+ executes its block. If a +throw+ is + * executed, Ruby searches up its stack for a +catch+ block + * with a tag corresponding to the +throw+'s + * _symbol_. If found, that block is terminated, and + * +catch+ returns the value given to +throw+. If + * +throw+ is not called, the block terminates normally, and + * the value of +catch+ is the value of the last expression + * evaluated. +catch+ expressions may be nested, and the + * +throw+ call need not be in lexical scope. + * + * def routine(n\) + * puts n + * throw :done if n <= 0 + * routine(n-1\) + * end + * + * + * catch(:done\) { routine(3\) } + * + * <em>produces:</em> + * + * 3 + * 2 + * 1 + * 0 + */) + +directive(static) ident(VALUE) +ident(rb_f_catch)operator(()ident(dmy)operator(,) ident(tag)operator(\)) + ident(VALUE) ident(dmy)operator(,) ident(tag)operator(;) +operator({) + pre_type(int) ident(state)operator(;) + ident(VALUE) ident(val) operator(=) ident(Qnil)operator(;) comment(/* OK */) + + ident(tag) operator(=) ident(ID2SYM)operator(()ident(rb_to_id)operator(()ident(tag)operator(\)\);) + ident(PUSH_TAG)operator(()ident(tag)operator(\);) + reserved(if) operator((()ident(state) operator(=) ident(EXEC_TAG)operator((\)\)) operator(==) integer(0)operator(\)) operator({) + ident(val) operator(=) ident(rb_yield_0)operator(()ident(tag)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) ident(Qfalse)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(state) operator(==) ident(TAG_THROW) operator(&&) ident(tag) operator(==) ident(prot_tag)operator(->)ident(dst)operator(\)) operator({) + ident(val) operator(=) ident(prot_tag)operator(->)ident(retval)operator(;) + ident(state) operator(=) integer(0)operator(;) + operator(}) + ident(POP_TAG)operator((\);) + reserved(if) operator(()ident(state)operator(\)) ident(JUMP_TAG)operator(()ident(state)operator(\);) + + reserved(return) ident(val)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(catch_i)operator(()ident(tag)operator(\)) + ident(VALUE) ident(tag)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(Qnil)operator(,) ident(rb_intern)operator(()string<delimiter(")content(catch)delimiter(")>operator(\),) integer(1)operator(,) ident(tag)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_catch)operator(()ident(tag)operator(,) ident(func)operator(,) ident(data)operator(\)) + directive(const) pre_type(char) operator(*)ident(tag)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + ident(VALUE) ident(data)operator(;) +operator({) + reserved(return) ident(rb_iterate)operator((()ident(VALUE)operator((*\))ident(_)operator((()ident(VALUE)operator(\)\)\))ident(catch_i)operator(,) ident(ID2SYM)operator(()ident(rb_intern)operator(()ident(tag)operator(\)\),) ident(func)operator(,) ident(data)operator(\);) +operator(}) + +comment(/* + * call-seq: + * throw(symbol [, obj]\) + * + * Transfers control to the end of the active +catch+ block + * waiting for _symbol_. Raises +NameError+ if there + * is no +catch+ block for the symbol. The optional second + * parameter supplies a return value for the +catch+ block, + * which otherwise defaults to +nil+. For examples, see + * <code>Kernel::catch</code>. + */) + +directive(static) ident(VALUE) +ident(rb_f_throw)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(tag)operator(,) ident(value)operator(;) + reserved(struct) ident(tag) operator(*)ident(tt) operator(=) ident(prot_tag)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(tag)operator(,) operator(&)ident(value)operator(\);) + ident(tag) operator(=) ident(ID2SYM)operator(()ident(rb_to_id)operator(()ident(tag)operator(\)\);) + + reserved(while) operator(()ident(tt)operator(\)) operator({) + reserved(if) operator(()ident(tt)operator(->)ident(tag) operator(==) ident(tag)operator(\)) operator({) + ident(tt)operator(->)ident(dst) operator(=) ident(tag)operator(;) + ident(tt)operator(->)ident(retval) operator(=) ident(value)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(tt)operator(->)ident(tag) operator(==) ident(PROT_THREAD)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eThreadError)operator(,) string<delimiter(")content(uncaught throw `%s' in thread 0x%lx)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(SYM2ID)operator(()ident(tag)operator(\)\),) + ident(curr_thread)operator(\);) + operator(}) + ident(tt) operator(=) ident(tt)operator(->)ident(prev)operator(;) + operator(}) + reserved(if) operator((!)ident(tt)operator(\)) operator({) + ident(rb_name_error)operator(()ident(SYM2ID)operator(()ident(tag)operator(\),) string<delimiter(")content(uncaught throw `%s')delimiter(")>operator(,) ident(rb_id2name)operator(()ident(SYM2ID)operator(()ident(tag)operator(\)\)\);) + operator(}) + ident(rb_trap_restore_mask)operator((\);) + ident(JUMP_TAG)operator(()ident(TAG_THROW)operator(\);) +preprocessor(#ifndef) ident(__GNUC__) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +directive(void) +ident(rb_throw)operator(()ident(tag)operator(,) ident(val)operator(\)) + directive(const) pre_type(char) operator(*)ident(tag)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(VALUE) ident(argv)operator([)integer(2)operator(];) + + ident(argv)operator([)integer(0)operator(]) operator(=) ident(ID2SYM)operator(()ident(rb_intern)operator(()ident(tag)operator(\)\);) + ident(argv)operator([)integer(1)operator(]) operator(=) ident(val)operator(;) + ident(rb_f_throw)operator(()integer(2)operator(,) ident(argv)operator(\);) +operator(}) +comment(/********************************************************************** + + file.c - + + $Author: wyhaines $ + $Date: 2009-08-25 20:37:21 +0200 (Tue, 25 Aug 2009\) $ + created at: Mon Nov 15 12:24:34 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#ifdef) ident(_WIN32) +preprocessor(#include) include("missing/file.h") +preprocessor(#endif) +preprocessor(#ifdef) ident(__CYGWIN__) +preprocessor(#define) ident(OpenFile) ident(WINAPI_OpenFile) +preprocessor(#include) include(<windows.h>) +preprocessor(#include) include(<sys/cygwin.h>) +preprocessor(#undef) ident(OpenFile) +preprocessor(#endif) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("rubyio.h") +preprocessor(#include) include("rubysig.h") +preprocessor(#include) include("util.h") +preprocessor(#include) include("dln.h") +preprocessor(#include) include(<ctype.h>) + +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_SYS_FILE_H) +preprocessor(# include) include(<sys/file.h>) +preprocessor(#else) +pre_type(int) ident(flock) ident(_)operator((()pre_type(int)operator(,) pre_type(int)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_SYS_PARAM_H) +preprocessor(# include) include(<sys/param.h>) +preprocessor(#endif) +preprocessor(#ifndef) ident(MAXPATHLEN) +preprocessor(# define) ident(MAXPATHLEN) integer(1024) +preprocessor(#endif) + +preprocessor(#include) include(<time.h>) + +ident(VALUE) ident(rb_time_new) ident(_)operator((()ident(time_t)operator(,) ident(time_t)operator(\)\);) + +preprocessor(#ifdef) ident(HAVE_UTIME_H) +preprocessor(#include) include(<utime.h>) +preprocessor(#elif) ident(defined) ident(HAVE_SYS_UTIME_H) +preprocessor(#include) include(<sys/utime.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_PWD_H) +preprocessor(#include) include(<pwd.h>) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_STRING_H) +pre_type(char) operator(*)ident(strrchr) ident(_)operator((()directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(\)\);) +preprocessor(#endif) + +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<sys/stat.h>) + +preprocessor(#ifdef) ident(HAVE_SYS_MKDEV_H) +preprocessor(#include) include(<sys/mkdev.h>) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_FCNTL_H)operator(\)) +preprocessor(#include) include(<fcntl.h>) +preprocessor(#endif) + +preprocessor(#if) operator(!)ident(defined) ident(HAVE_LSTAT) operator(&&) operator(!)ident(defined) ident(lstat) +preprocessor(#define) ident(lstat) ident(stat) +preprocessor(#endif) +preprocessor(#if) operator(!)ident(HAVE_FSEEKO) operator(&&) operator(!)ident(defined)operator(()ident(fseeko)operator(\)) +preprocessor(# define) ident(fseeko) ident(fseek) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__BEOS__) comment(/* should not change ID if -1 */) +directive(static) pre_type(int) +ident(be_chown)operator(()directive(const) pre_type(char) operator(*)ident(path)operator(,) ident(uid_t) ident(owner)operator(,) ident(gid_t) ident(group)operator(\)) +operator({) + reserved(if) operator(()ident(owner) operator(==) operator(-)integer(1) operator(||) ident(group) operator(==) operator(-)integer(1)operator(\)) operator({) + reserved(struct) ident(stat) ident(st)operator(;) + reserved(if) operator(()ident(stat)operator(()ident(path)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator(()ident(owner) operator(==) operator(-)integer(1)operator(\)) ident(owner) operator(=) ident(st)operator(.)ident(st_uid)operator(;) + reserved(if) operator(()ident(group) operator(==) operator(-)integer(1)operator(\)) ident(group) operator(=) ident(st)operator(.)ident(st_gid)operator(;) + operator(}) + reserved(return) ident(chown)operator(()ident(path)operator(,) ident(owner)operator(,) ident(group)operator(\);) +operator(}) +preprocessor(#define) ident(chown) ident(be_chown) +directive(static) pre_type(int) +ident(be_fchown)operator(()pre_type(int) ident(fd)operator(,) ident(uid_t) ident(owner)operator(,) ident(gid_t) ident(group)operator(\)) +operator({) + reserved(if) operator(()ident(owner) operator(==) operator(-)integer(1) operator(||) ident(group) operator(==) operator(-)integer(1)operator(\)) operator({) + reserved(struct) ident(stat) ident(st)operator(;) + reserved(if) operator(()ident(fstat)operator(()ident(fd)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator(()ident(owner) operator(==) operator(-)integer(1)operator(\)) ident(owner) operator(=) ident(st)operator(.)ident(st_uid)operator(;) + reserved(if) operator(()ident(group) operator(==) operator(-)integer(1)operator(\)) ident(group) operator(=) ident(st)operator(.)ident(st_gid)operator(;) + operator(}) + reserved(return) ident(fchown)operator(()ident(fd)operator(,) ident(owner)operator(,) ident(group)operator(\);) +operator(}) +preprocessor(#define) ident(fchown) ident(be_fchown) +preprocessor(#endif) comment(/* __BEOS__ */) + +ident(VALUE) ident(rb_cFile)operator(;) +ident(VALUE) ident(rb_mFileTest)operator(;) +ident(VALUE) ident(rb_cStat)operator(;) + +directive(static) pre_type(long) ident(apply2files) ident(_)operator((()directive(void) operator((*\)()directive(const) pre_type(char) operator(*,) directive(void) operator(*\),) ident(VALUE)operator(,) directive(void) operator(*\)\);) +directive(static) pre_type(long) +ident(apply2files)operator(()ident(func)operator(,) ident(vargs)operator(,) ident(arg)operator(\)) + directive(void) operator((*)ident(func)operator(\))ident(_)operator((()directive(const) pre_type(char) operator(*,) directive(void) operator(*\)\);) + ident(VALUE) ident(vargs)operator(;) + directive(void) operator(*)ident(arg)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + ident(VALUE) ident(path)operator(;) + reserved(struct) ident(RArray) operator(*)ident(args) operator(=) ident(RARRAY)operator(()ident(vargs)operator(\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(args)operator(->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(path) operator(=) ident(args)operator(->)ident(ptr)operator([)ident(i)operator(];) + ident(SafeStringValue)operator(()ident(path)operator(\);) + operator((*)ident(func)operator(\)()ident(StringValueCStr)operator(()ident(path)operator(\),) ident(arg)operator(\);) + operator(}) + + reserved(return) ident(args)operator(->)ident(len)operator(;) +operator(}) + +comment(/* + * call-seq: + * file.path -> filename + * + * Returns the pathname used to create <i>file</i> as a string. Does + * not normalize the name. + * + * File.new("testfile"\).path #=> "testfile" + * File.new("/tmp/../tmp/xxx", "w"\).path #=> "/tmp/../tmp/xxx" + * + */) + +directive(static) ident(VALUE) +ident(rb_file_path)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(fptr) operator(=) ident(RFILE)operator(()ident(rb_io_taint_check)operator(()ident(obj)operator(\)\)->)ident(fptr)operator(;) + ident(rb_io_check_initialized)operator(()ident(fptr)operator(\);) + reserved(if) operator((!)ident(fptr)operator(->)ident(path)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(rb_tainted_str_new2)operator(()ident(fptr)operator(->)ident(path)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(stat_new_0)operator(()ident(klass)operator(,) ident(st)operator(\)) + ident(VALUE) ident(klass)operator(;) + reserved(struct) ident(stat) operator(*)ident(st)operator(;) +operator({) + reserved(struct) ident(stat) operator(*)ident(nst) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(st)operator(\)) operator({) + ident(nst) operator(=) ident(ALLOC)operator(()reserved(struct) ident(stat)operator(\);) + operator(*)ident(nst) operator(=) operator(*)ident(st)operator(;) + operator(}) + reserved(return) ident(Data_Wrap_Struct)operator(()ident(klass)operator(,) pre_constant(NULL)operator(,) ident(free)operator(,) ident(nst)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(stat_new)operator(()ident(st)operator(\)) + reserved(struct) ident(stat) operator(*)ident(st)operator(;) +operator({) + reserved(return) ident(stat_new_0)operator(()ident(rb_cStat)operator(,) ident(st)operator(\);) +operator(}) + +directive(static) reserved(struct) ident(stat)operator(*) +ident(get_stat)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(struct) ident(stat)operator(*) ident(st)operator(;) + ident(Data_Get_Struct)operator(()ident(self)operator(,) reserved(struct) ident(stat)operator(,) ident(st)operator(\);) + reserved(if) operator((!)ident(st)operator(\)) ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(uninitialized File::Stat)delimiter(")>operator(\);) + reserved(return) ident(st)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat <=> other_stat => -1, 0, 1 + * + * Compares <code>File::Stat</code> objects by comparing their + * respective modification times. + * + * f1 = File.new("f1", "w"\) + * sleep 1 + * f2 = File.new("f2", "w"\) + * f1.stat <=> f2.stat #=> -1 + */) + +directive(static) ident(VALUE) +ident(rb_stat_cmp)operator(()ident(self)operator(,) ident(other)operator(\)) + ident(VALUE) ident(self)operator(,) ident(other)operator(;) +operator({) + reserved(if) operator(()ident(rb_obj_is_kind_of)operator(()ident(other)operator(,) ident(rb_obj_class)operator(()ident(self)operator(\)\)\)) operator({) + ident(time_t) ident(t1) operator(=) ident(get_stat)operator(()ident(self)operator(\)->)ident(st_mtime)operator(;) + ident(time_t) ident(t2) operator(=) ident(get_stat)operator(()ident(other)operator(\)->)ident(st_mtime)operator(;) + reserved(if) operator(()ident(t1) operator(==) ident(t2)operator(\)) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(else) reserved(if) operator(()ident(t1) operator(<) ident(t2)operator(\)) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + reserved(else) + reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(rb_stat_dev) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_ino) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_mode) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_nlink) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_uid) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_gid) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_rdev) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_size) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_blksize) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_blocks) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_atime) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_mtime) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_stat_ctime) ident(_)operator((()ident(VALUE)operator(\)\);) + +comment(/* + * call-seq: + * stat.dev => fixnum + * + * Returns an integer representing the device on which <i>stat</i> + * resides. + * + * File.stat("testfile"\).dev #=> 774 + */) + +directive(static) ident(VALUE) +ident(rb_stat_dev)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(INT2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_dev)operator(\);) +operator(}) + +comment(/* + * call-seq: + * stat.dev_major => fixnum + * + * Returns the major part of <code>File_Stat#dev</code> or + * <code>nil</code>. + * + * File.stat("/dev/fd1"\).dev_major #=> 2 + * File.stat("/dev/tty"\).dev_major #=> 5 + */) + +directive(static) ident(VALUE) +ident(rb_stat_dev_major)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(major)operator(\)) + pre_type(long) ident(dev) operator(=) ident(get_stat)operator(()ident(self)operator(\)->)ident(st_dev)operator(;) + reserved(return) ident(ULONG2NUM)operator(()ident(major)operator(()ident(dev)operator(\)\);) +preprocessor(#else) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * stat.dev_minor => fixnum + * + * Returns the minor part of <code>File_Stat#dev</code> or + * <code>nil</code>. + * + * File.stat("/dev/fd1"\).dev_minor #=> 1 + * File.stat("/dev/tty"\).dev_minor #=> 0 + */) + +directive(static) ident(VALUE) +ident(rb_stat_dev_minor)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(minor)operator(\)) + pre_type(long) ident(dev) operator(=) ident(get_stat)operator(()ident(self)operator(\)->)ident(st_dev)operator(;) + reserved(return) ident(ULONG2NUM)operator(()ident(minor)operator(()ident(dev)operator(\)\);) +preprocessor(#else) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * stat.ino => fixnum + * + * Returns the inode number for <i>stat</i>. + * + * File.stat("testfile"\).ino #=> 1083669 + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_ino)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#ifdef) ident(HUGE_ST_INO) + reserved(return) ident(ULL2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_ino)operator(\);) +preprocessor(#else) + reserved(return) ident(ULONG2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_ino)operator(\);) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * stat.mode => fixnum + * + * Returns an integer representing the permission bits of + * <i>stat</i>. The meaning of the bits is platform dependent; on + * Unix systems, see <code>stat(2\)</code>. + * + * File.chmod(0644, "testfile"\) #=> 1 + * s = File.stat("testfile"\) + * sprintf("%o", s.mode\) #=> "100644" + */) + +directive(static) ident(VALUE) +ident(rb_stat_mode)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#ifdef) ident(__BORLANDC__) + reserved(return) ident(UINT2NUM)operator((()pre_type(unsigned) pre_type(short)operator(\)()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_mode)operator(\)\);) +preprocessor(#else) + reserved(return) ident(UINT2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_mode)operator(\);) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * stat.nlink => fixnum + * + * Returns the number of hard links to <i>stat</i>. + * + * File.stat("testfile"\).nlink #=> 1 + * File.link("testfile", "testfile.bak"\) #=> 0 + * File.stat("testfile"\).nlink #=> 2 + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_nlink)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(UINT2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_nlink)operator(\);) +operator(}) + +comment(/* + * call-seq: + * stat.uid => fixnum + * + * Returns the numeric user id of the owner of <i>stat</i>. + * + * File.stat("testfile"\).uid #=> 501 + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_uid)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(UINT2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_uid)operator(\);) +operator(}) + +comment(/* + * call-seq: + * stat.gid => fixnum + * + * Returns the numeric group id of the owner of <i>stat</i>. + * + * File.stat("testfile"\).gid #=> 500 + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_gid)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(UINT2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_gid)operator(\);) +operator(}) + +comment(/* + * call-seq: + * stat.rdev => fixnum or nil + * + * Returns an integer representing the device type on which + * <i>stat</i> resides. Returns <code>nil</code> if the operating + * system doesn't support this feature. + * + * File.stat("/dev/fd1"\).rdev #=> 513 + * File.stat("/dev/tty"\).rdev #=> 1280 + */) + +directive(static) ident(VALUE) +ident(rb_stat_rdev)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_ST_RDEV) + reserved(return) ident(ULONG2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_rdev)operator(\);) +preprocessor(#else) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * stat.rdev_major => fixnum + * + * Returns the major part of <code>File_Stat#rdev</code> or + * <code>nil</code>. + * + * File.stat("/dev/fd1"\).rdev_major #=> 2 + * File.stat("/dev/tty"\).rdev_major #=> 5 + */) + +directive(static) ident(VALUE) +ident(rb_stat_rdev_major)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_ST_RDEV)operator(\)) operator(&&) ident(defined)operator(()ident(major)operator(\)) + pre_type(long) ident(rdev) operator(=) ident(get_stat)operator(()ident(self)operator(\)->)ident(st_rdev)operator(;) + reserved(return) ident(ULONG2NUM)operator(()ident(major)operator(()ident(rdev)operator(\)\);) +preprocessor(#else) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * stat.rdev_minor => fixnum + * + * Returns the minor part of <code>File_Stat#rdev</code> or + * <code>nil</code>. + * + * File.stat("/dev/fd1"\).rdev_minor #=> 1 + * File.stat("/dev/tty"\).rdev_minor #=> 0 + */) + +directive(static) ident(VALUE) +ident(rb_stat_rdev_minor)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_ST_RDEV)operator(\)) operator(&&) ident(defined)operator(()ident(minor)operator(\)) + pre_type(long) ident(rdev) operator(=) ident(get_stat)operator(()ident(self)operator(\)->)ident(st_rdev)operator(;) + reserved(return) ident(ULONG2NUM)operator(()ident(minor)operator(()ident(rdev)operator(\)\);) +preprocessor(#else) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * stat.size => fixnum + * + * Returns the size of <i>stat</i> in bytes. + * + * File.stat("testfile"\).size #=> 66 + */) + +directive(static) ident(VALUE) +ident(rb_stat_size)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(OFFT2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_size)operator(\);) +operator(}) + +comment(/* + * call-seq: + * stat.blksize => integer or nil + * + * Returns the native file system's block size. Will return <code>nil</code> + * on platforms that don't support this information. + * + * File.stat("testfile"\).blksize #=> 4096 + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_blksize)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_ST_BLKSIZE) + reserved(return) ident(ULONG2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_blksize)operator(\);) +preprocessor(#else) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * stat.blocks => integer or nil + * + * Returns the number of native file system blocks allocated for this + * file, or <code>nil</code> if the operating system doesn't + * support this feature. + * + * File.stat("testfile"\).blocks #=> 2 + */) + +directive(static) ident(VALUE) +ident(rb_stat_blocks)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_ST_BLOCKS) + reserved(return) ident(ULONG2NUM)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_blocks)operator(\);) +preprocessor(#else) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * stat.atime => time + * + * Returns the last access time for this file as an object of class + * <code>Time</code>. + * + * File.stat("testfile"\).atime #=> Wed Dec 31 18:00:00 CST 1969 + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_atime)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(rb_time_new)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_atime)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * stat.mtime -> aTime + * + * Returns the modification time of <i>stat</i>. + * + * File.stat("testfile"\).mtime #=> Wed Apr 09 08:53:14 CDT 2003 + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_mtime)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(rb_time_new)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_mtime)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * stat.ctime -> aTime + * + * Returns the change time for <i>stat</i> (that is, the time + * directory information about the file was changed, not the file + * itself\). + * + * File.stat("testfile"\).ctime #=> Wed Apr 09 08:53:14 CDT 2003 + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_ctime)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(return) ident(rb_time_new)operator(()ident(get_stat)operator(()ident(self)operator(\)->)ident(st_ctime)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * stat.inspect => string + * + * Produce a nicely formatted description of <i>stat</i>. + * + * File.stat("/etc/passwd"\).inspect + * #=> "#<File::Stat dev=0xe000005, ino=1078078, mode=0100644, + * nlink=1, uid=0, gid=0, rdev=0x0, size=1374, blksize=4096, + * blocks=8, atime=Wed Dec 10 10:16:12 CST 2003, + * mtime=Fri Sep 12 15:41:41 CDT 2003, + * ctime=Mon Oct 27 11:20:27 CST 2003>" + */) + +directive(static) ident(VALUE) +ident(rb_stat_inspect)operator(()ident(self)operator(\)) + ident(VALUE) ident(self)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + pre_type(int) ident(i)operator(;) + directive(static) directive(const) reserved(struct) operator({) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator((*)ident(func)operator(\))ident(_)operator((()ident(VALUE)operator(\)\);) + operator(}) ident(member)operator([]) operator(=) operator({) + operator({)string<delimiter(")content(dev)delimiter(")>operator(,) ident(rb_stat_dev)operator(},) + operator({)string<delimiter(")content(ino)delimiter(")>operator(,) ident(rb_stat_ino)operator(},) + operator({)string<delimiter(")content(mode)delimiter(")>operator(,) ident(rb_stat_mode)operator(},) + operator({)string<delimiter(")content(nlink)delimiter(")>operator(,) ident(rb_stat_nlink)operator(},) + operator({)string<delimiter(")content(uid)delimiter(")>operator(,) ident(rb_stat_uid)operator(},) + operator({)string<delimiter(")content(gid)delimiter(")>operator(,) ident(rb_stat_gid)operator(},) + operator({)string<delimiter(")content(rdev)delimiter(")>operator(,) ident(rb_stat_rdev)operator(},) + operator({)string<delimiter(")content(size)delimiter(")>operator(,) ident(rb_stat_size)operator(},) + operator({)string<delimiter(")content(blksize)delimiter(")>operator(,) ident(rb_stat_blksize)operator(},) + operator({)string<delimiter(")content(blocks)delimiter(")>operator(,) ident(rb_stat_blocks)operator(},) + operator({)string<delimiter(")content(atime)delimiter(")>operator(,) ident(rb_stat_atime)operator(},) + operator({)string<delimiter(")content(mtime)delimiter(")>operator(,) ident(rb_stat_mtime)operator(},) + operator({)string<delimiter(")content(ctime)delimiter(")>operator(,) ident(rb_stat_ctime)operator(},) + operator(};) + + ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content(#<)delimiter(")>operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(rb_obj_classname)operator(()ident(self)operator(\)\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content( )delimiter(")>operator(\);) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) reserved(sizeof)operator(()ident(member)operator(\))operator(/)reserved(sizeof)operator(()ident(member)operator([)integer(0)operator(]\);) ident(i)operator(++\)) operator({) + ident(VALUE) ident(v)operator(;) + + reserved(if) operator(()ident(i) operator(>) integer(0)operator(\)) operator({) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(, )delimiter(")>operator(\);) + operator(}) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(member)operator([)ident(i)operator(])operator(.)ident(name)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(=)delimiter(")>operator(\);) + ident(v) operator(=) operator((*)ident(member)operator([)ident(i)operator(])operator(.)ident(func)operator(\)()ident(self)operator(\);) + reserved(if) operator(()ident(i) operator(==) integer(2)operator(\)) operator({) comment(/* mode */) + pre_type(char) ident(buf)operator([)integer(32)operator(];) + + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(0%lo)delimiter(")>operator(,) ident(NUM2ULONG)operator(()ident(v)operator(\)\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(buf)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(i) operator(==) integer(0) operator(||) ident(i) operator(==) integer(6)operator(\)) operator({) comment(/* dev/rdev */) + pre_type(char) ident(buf)operator([)integer(32)operator(];) + + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(0x%lx)delimiter(")>operator(,) ident(NUM2ULONG)operator(()ident(v)operator(\)\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(buf)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_append)operator(()ident(str)operator(,) ident(rb_inspect)operator(()ident(v)operator(\)\);) + operator(}) + operator(}) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(>)delimiter(")>operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(self)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(rb_stat)operator(()ident(file)operator(,) ident(st)operator(\)) + ident(VALUE) ident(file)operator(;) + reserved(struct) ident(stat) operator(*)ident(st)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + + ident(tmp) operator(=) ident(rb_check_convert_type)operator(()ident(file)operator(,) ident(T_FILE)operator(,) string<delimiter(")content(IO)delimiter(")>operator(,) string<delimiter(")content(to_io)delimiter(")>operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(GetOpenFile)operator(()ident(tmp)operator(,) ident(fptr)operator(\);) + reserved(return) ident(fstat)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(st)operator(\);) + operator(}) + ident(SafeStringValue)operator(()ident(file)operator(\);) + reserved(return) ident(stat)operator(()ident(StringValueCStr)operator(()ident(file)operator(\),) ident(st)operator(\);) +operator(}) + +preprocessor(#ifdef) ident(_WIN32) +directive(static) ident(HANDLE) +ident(w32_io_info)operator(()ident(file)operator(,) ident(st)operator(\)) + ident(VALUE) operator(*)ident(file)operator(;) + ident(BY_HANDLE_FILE_INFORMATION) operator(*)ident(st)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + ident(HANDLE) ident(f)operator(,) ident(ret) operator(=) integer(0)operator(;) + + ident(tmp) operator(=) ident(rb_check_convert_type)operator((*)ident(file)operator(,) ident(T_FILE)operator(,) string<delimiter(")content(IO)delimiter(")>operator(,) string<delimiter(")content(to_io)delimiter(")>operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(tmp)operator(,) ident(fptr)operator(\);) + ident(f) operator(=) operator(()ident(HANDLE)operator(\))ident(rb_w32_get_osfhandle)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)\);) + reserved(if) operator(()ident(f) operator(==) operator(()ident(HANDLE)operator(\)-)integer(1)operator(\)) reserved(return) ident(INVALID_HANDLE_VALUE)operator(;) + operator(}) + reserved(else) operator({) + ident(SafeStringValue)operator((*)ident(file)operator(\);) + ident(f) operator(=) ident(CreateFile)operator(()ident(StringValueCStr)operator((*)ident(file)operator(\),) integer(0)operator(,) + ident(FILE_SHARE_READ) operator(|) ident(FILE_SHARE_WRITE)operator(,) pre_constant(NULL)operator(,) ident(OPEN_EXISTING)operator(,) + ident(rb_w32_iswin95)operator((\)) operator(?) integer(0) operator(:) ident(FILE_FLAG_BACKUP_SEMANTICS)operator(,) pre_constant(NULL)operator(\);) + reserved(if) operator(()ident(f) operator(==) ident(INVALID_HANDLE_VALUE)operator(\)) reserved(return) ident(f)operator(;) + ident(ret) operator(=) ident(f)operator(;) + operator(}) + reserved(if) operator(()ident(GetFileType)operator(()ident(f)operator(\)) operator(==) ident(FILE_TYPE_DISK)operator(\)) operator({) + ident(ZeroMemory)operator(()ident(st)operator(,) reserved(sizeof)operator((*)ident(st)operator(\)\);) + reserved(if) operator(()ident(GetFileInformationByHandle)operator(()ident(f)operator(,) ident(st)operator(\)\)) reserved(return) ident(ret)operator(;) + operator(}) + reserved(if) operator(()ident(ret)operator(\)) ident(CloseHandle)operator(()ident(ret)operator(\);) + reserved(return) ident(INVALID_HANDLE_VALUE)operator(;) +operator(}) +preprocessor(#endif) + +comment(/* + * call-seq: + * File.stat(file_name\) => stat + * + * Returns a <code>File::Stat</code> object for the named file (see + * <code>File::Stat</code>\). + * + * File.stat("testfile"\).mtime #=> Tue Apr 08 12:58:04 CDT 2003 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_stat)operator(()ident(klass)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\)\);) + operator(}) + reserved(return) ident(stat_new)operator((&)ident(st)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.stat => stat + * + * Returns status information for <em>ios</em> as an object of type + * <code>File::Stat</code>. + * + * f = File.new("testfile"\) + * s = f.stat + * "%o" % s.mode #=> "100644" + * s.blksize #=> 4096 + * s.atime #=> Wed Apr 09 08:53:54 CDT 2003 + * + */) + +directive(static) ident(VALUE) +ident(rb_io_stat)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(GetOpenFile)operator(()ident(obj)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(fstat)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) operator(&)ident(st)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + reserved(return) ident(stat_new)operator((&)ident(st)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.lstat(file_name\) => stat + * + * Same as <code>File::stat</code>, but does not follow the last symbolic + * link. Instead, reports on the link itself. + * + * File.symlink("testfile", "link2test"\) #=> 0 + * File.stat("testfile"\).size #=> 66 + * File.lstat("link2test"\).size #=> 8 + * File.stat("link2test"\).size #=> 66 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_lstat)operator(()ident(klass)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_LSTAT) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(lstat)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) operator(&)ident(st)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\);) + operator(}) + reserved(return) ident(stat_new)operator((&)ident(st)operator(\);) +preprocessor(#else) + reserved(return) ident(rb_file_s_stat)operator(()ident(klass)operator(,) ident(fname)operator(\);) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * file.lstat => stat + * + * Same as <code>IO#stat</code>, but does not follow the last symbolic + * link. Instead, reports on the link itself. + * + * File.symlink("testfile", "link2test"\) #=> 0 + * File.stat("testfile"\).size #=> 66 + * f = File.new("link2test"\) + * f.lstat.size #=> 8 + * f.stat.size #=> 66 + */) + +directive(static) ident(VALUE) +ident(rb_file_lstat)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_LSTAT) + ident(OpenFile) operator(*)ident(fptr)operator(;) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(GetOpenFile)operator(()ident(obj)operator(,) ident(fptr)operator(\);) + reserved(if) operator((!)ident(fptr)operator(->)ident(path)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(lstat)operator(()ident(fptr)operator(->)ident(path)operator(,) operator(&)ident(st)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + reserved(return) ident(stat_new)operator((&)ident(st)operator(\);) +preprocessor(#else) + reserved(return) ident(rb_io_stat)operator(()ident(obj)operator(\);) +preprocessor(#endif) +operator(}) + +preprocessor(#ifndef) ident(HAVE_GROUP_MEMBER) +directive(static) pre_type(int) +ident(group_member)operator(()ident(gid)operator(\)) + ident(GETGROUPS_T) ident(gid)operator(;) +operator({) +preprocessor(#ifndef) ident(_WIN32) + reserved(if) operator(()ident(getgid)operator((\)) operator(==) ident(gid) operator(||) ident(getegid)operator((\)) operator(==) ident(gid)operator(\)) + reserved(return) ident(Qtrue)operator(;) + +preprocessor(# ifdef) ident(HAVE_GETGROUPS) +preprocessor(# ifndef) ident(NGROUPS) +preprocessor(# ifdef) ident(NGROUPS_MAX) +preprocessor(# define) ident(NGROUPS) ident(NGROUPS_MAX) +preprocessor(# else) +preprocessor(# define) ident(NGROUPS) integer(32) +preprocessor(# endif) +preprocessor(# endif) + operator({) + ident(GETGROUPS_T) ident(gary)operator([)ident(NGROUPS)operator(];) + pre_type(int) ident(anum)operator(;) + + ident(anum) operator(=) ident(getgroups)operator(()ident(NGROUPS)operator(,) ident(gary)operator(\);) + reserved(while) operator((--)ident(anum) operator(>=) integer(0)operator(\)) + reserved(if) operator(()ident(gary)operator([)ident(anum)operator(]) operator(==) ident(gid)operator(\)) + reserved(return) ident(Qtrue)operator(;) + operator(}) +preprocessor(# endif) +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) +preprocessor(#endif) + +preprocessor(#ifndef) ident(S_IXUGO) +preprocessor(# define) ident(S_IXUGO) operator(()ident(S_IXUSR) operator(|) ident(S_IXGRP) operator(|) ident(S_IXOTH)operator(\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(S_IXGRP)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CYGWIN__)operator(\)) +preprocessor(#define) ident(USE_GETEUID) integer(1) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_EACCESS) +pre_type(int) +ident(eaccess)operator(()ident(path)operator(,) ident(mode)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + pre_type(int) ident(mode)operator(;) +operator({) +preprocessor(#ifdef) ident(USE_GETEUID) + reserved(struct) ident(stat) ident(st)operator(;) + pre_type(int) ident(euid)operator(;) + + reserved(if) operator(()ident(stat)operator(()ident(path)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + + ident(euid) operator(=) ident(geteuid)operator((\);) + + reserved(if) operator(()ident(euid) operator(==) integer(0)operator(\)) operator({) + comment(/* Root can read or write any file. */) + reserved(if) operator((!()ident(mode) operator(&) ident(X_OK)operator(\)\)) + reserved(return) integer(0)operator(;) + + comment(/* Root can execute any file that has any one of the execute + bits set. */) + reserved(if) operator(()ident(st)operator(.)ident(st_mode) operator(&) ident(S_IXUGO)operator(\)) + reserved(return) integer(0)operator(;) + + reserved(return) operator(-)integer(1)operator(;) + operator(}) + + reserved(if) operator(()ident(st)operator(.)ident(st_uid) operator(==) ident(euid)operator(\)) comment(/* owner */) + ident(mode) operator(<<=) integer(6)operator(;) + reserved(else) reserved(if) operator(()ident(group_member)operator(()ident(st)operator(.)ident(st_gid)operator(\)\)) + ident(mode) operator(<<=) integer(3)operator(;) + + reserved(if) operator((()ident(st)operator(.)ident(st_mode) operator(&) ident(mode)operator(\)) operator(==) ident(mode)operator(\)) reserved(return) integer(0)operator(;) + + reserved(return) operator(-)integer(1)operator(;) +preprocessor(#else) +preprocessor(# if) ident(_MSC_VER) operator(>=) integer(1400) + ident(mode) operator(&=) integer(6)operator(;) +preprocessor(# endif) + reserved(return) ident(access)operator(()ident(path)operator(,) ident(mode)operator(\);) +preprocessor(#endif) +operator(}) +preprocessor(#endif) + + +comment(/* + * Document-class: FileTest + * + * <code>FileTest</code> implements file test operations similar to + * those used in <code>File::Stat</code>. It exists as a standalone + * module, and its methods are also insinuated into the <code>File</code> + * class. (Note that this is not done by inclusion: the interpreter cheats\). + * + */) + +comment(/* + * call-seq: + * File.directory?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is a directory, + * <code>false</code> otherwise. + * + * File.directory?("."\) + */) + +directive(static) ident(VALUE) +ident(test_d)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifndef) ident(S_ISDIR) +preprocessor(# define) ident(S_ISDIR)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFDIR)operator(\)) +preprocessor(#endif) + + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(S_ISDIR)operator(()ident(st)operator(.)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.pipe?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is a pipe. + */) + +directive(static) ident(VALUE) +ident(test_p)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifdef) ident(S_IFIFO) +preprocessor(# ifndef) ident(S_ISFIFO) +preprocessor(# define) ident(S_ISFIFO)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFIFO)operator(\)) +preprocessor(# endif) + + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(S_ISFIFO)operator(()ident(st)operator(.)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.symlink?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is a symbolic link. + */) + +directive(static) ident(VALUE) +ident(test_l)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifndef) ident(S_ISLNK) +preprocessor(# ifdef) ident(_S_ISLNK) +preprocessor(# define) ident(S_ISLNK)operator(()ident(m)operator(\)) ident(_S_ISLNK)operator(()ident(m)operator(\)) +preprocessor(# elif) ident(defined) ident(__BORLANDC__) +preprocessor(# ifdef) ident(_S_IFLNK) +preprocessor(# define) ident(S_ISLNK)operator(()ident(m)operator(\)) operator(((()pre_type(unsigned) pre_type(short)operator(\)()ident(m)operator(\)) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(_S_IFLNK)operator(\)) +preprocessor(# else) +preprocessor(# ifdef) ident(S_IFLNK) +preprocessor(# define) ident(S_ISLNK)operator(()ident(m)operator(\)) operator(((()pre_type(unsigned) pre_type(short)operator(\)()ident(m)operator(\)) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFLNK)operator(\)) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# else) +preprocessor(# ifdef) ident(_S_IFLNK) +preprocessor(# define) ident(S_ISLNK)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(_S_IFLNK)operator(\)) +preprocessor(# else) +preprocessor(# ifdef) ident(S_IFLNK) +preprocessor(# define) ident(S_ISLNK)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFLNK)operator(\)) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#ifdef) ident(S_ISLNK) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(lstat)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(S_ISLNK)operator(()ident(st)operator(.)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) + + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.socket?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is a socket. + */) + +directive(static) ident(VALUE) +ident(test_S)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifndef) ident(S_ISSOCK) +preprocessor(# ifdef) ident(_S_ISSOCK) +preprocessor(# define) ident(S_ISSOCK)operator(()ident(m)operator(\)) ident(_S_ISSOCK)operator(()ident(m)operator(\)) +preprocessor(# elif) ident(defined) ident(__BORLANDC__) +preprocessor(# ifdef) ident(_S_IFSOCK) +preprocessor(# define) ident(S_ISSOCK)operator(()ident(m)operator(\)) operator(((()pre_type(unsigned) pre_type(short)operator(\)()ident(m)operator(\)) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(_S_IFSOCK)operator(\)) +preprocessor(# else) +preprocessor(# ifdef) ident(S_IFSOCK) +preprocessor(# define) ident(S_ISSOCK)operator(()ident(m)operator(\)) operator(((()pre_type(unsigned) pre_type(short)operator(\)()ident(m)operator(\)) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFSOCK)operator(\)) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# else) +preprocessor(# ifdef) ident(_S_IFSOCK) +preprocessor(# define) ident(S_ISSOCK)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(_S_IFSOCK)operator(\)) +preprocessor(# else) +preprocessor(# ifdef) ident(S_IFSOCK) +preprocessor(# define) ident(S_ISSOCK)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFSOCK)operator(\)) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#ifdef) ident(S_ISSOCK) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(S_ISSOCK)operator(()ident(st)operator(.)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.blockdev?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is a block device. + */) + +directive(static) ident(VALUE) +ident(test_b)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifndef) ident(S_ISBLK) +preprocessor(# ifdef) ident(S_IFBLK) +preprocessor(# define) ident(S_ISBLK)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFBLK)operator(\)) +preprocessor(# else) +preprocessor(# define) ident(S_ISBLK)operator(()ident(m)operator(\)) operator(()integer(0)operator(\)) comment(/* anytime false */) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#ifdef) ident(S_ISBLK) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(S_ISBLK)operator(()ident(st)operator(.)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.chardev?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is a character device. + */) +directive(static) ident(VALUE) +ident(test_c)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifndef) ident(S_ISCHR) +preprocessor(# define) ident(S_ISCHR)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFCHR)operator(\)) +preprocessor(#endif) + + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(S_ISCHR)operator(()ident(st)operator(.)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.exist?(file_name\) => true or false + * File.exists?(file_name\) => true or false (obsolete\) + * + * Return <code>true</code> if the named file exists. + */) + +directive(static) ident(VALUE) +ident(test_e)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.readable?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is readable by the effective + * user id of this process. + */) + +directive(static) ident(VALUE) +ident(test_r)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(eaccess)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) ident(R_OK)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.readable_real?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is readable by the real + * user id of this process. + */) + +directive(static) ident(VALUE) +ident(test_R)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(access)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) ident(R_OK)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.writable?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is writable by the effective + * user id of this process. + */) + +directive(static) ident(VALUE) +ident(test_w)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(eaccess)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) ident(W_OK)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.writable_real?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is writable by the real + * user id of this process. + */) + +directive(static) ident(VALUE) +ident(test_W)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(access)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) ident(W_OK)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.executable?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is executable by the effective + * user id of this process. + */) + +directive(static) ident(VALUE) +ident(test_x)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(eaccess)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) ident(X_OK)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.executable_real?(file_name\) => true or false + * + * Returns <code>true</code> if the named file is executable by the real + * user id of this process. + */) + +directive(static) ident(VALUE) +ident(test_X)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(access)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) ident(X_OK)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +preprocessor(#ifndef) ident(S_ISREG) +preprocessor(# define) ident(S_ISREG)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFREG)operator(\)) +preprocessor(#endif) + +comment(/* + * call-seq: + * File.file?(file_name\) => true or false + * + * Returns <code>true</code> if the named file exists and is a + * regular file. + */) + +directive(static) ident(VALUE) +ident(test_f)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(S_ISREG)operator(()ident(st)operator(.)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.zero?(file_name\) => true or false + * + * Returns <code>true</code> if the named file exists and has + * a zero size. + */) + +directive(static) ident(VALUE) +ident(test_z)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(st)operator(.)ident(st_size) operator(==) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.size?(file_name\) => Integer or nil + * + * Returns +nil+ if +file_name+ doesn't exist or has zero size, the size of the + * file otherwise. + */) + +directive(static) ident(VALUE) +ident(test_s)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(st)operator(.)ident(st_size) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(OFFT2NUM)operator(()ident(st)operator(.)ident(st_size)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.owned?(file_name\) => true or false + * + * Returns <code>true</code> if the named file exists and the + * effective used id of the calling process is the owner of + * the file. + */) + +directive(static) ident(VALUE) +ident(test_owned)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(st)operator(.)ident(st_uid) operator(==) ident(geteuid)operator((\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(test_rowned)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(st)operator(.)ident(st_uid) operator(==) ident(getuid)operator((\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.grpowned?(file_name\) => true or false + * + * Returns <code>true</code> if the named file exists and the + * effective group id of the calling process is the owner of + * the file. Returns <code>false</code> on Windows. + */) + +directive(static) ident(VALUE) +ident(test_grpowned)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifndef) ident(_WIN32) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(group_member)operator(()ident(st)operator(.)ident(st_gid)operator(\)\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(S_ISUID)operator(\)) operator(||) ident(defined)operator(()ident(S_ISGID)operator(\)) operator(||) ident(defined)operator(()ident(S_ISVTX)operator(\)) +directive(static) ident(VALUE) +ident(check3rdbyte)operator(()ident(fname)operator(,) ident(mode)operator(\)) + ident(VALUE) ident(fname)operator(;) + pre_type(int) ident(mode)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(stat)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(st)operator(.)ident(st_mode) operator(&) ident(mode)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) +preprocessor(#endif) + +comment(/* + * call-seq: + * File.setuid?(file_name\) => true or false + * + * Returns <code>true</code> if the named file has the setuid bit set. + */) + +directive(static) ident(VALUE) +ident(test_suid)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifdef) ident(S_ISUID) + reserved(return) ident(check3rdbyte)operator(()ident(fname)operator(,) ident(S_ISUID)operator(\);) +preprocessor(#else) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * File.setgid?(file_name\) => true or false + * + * Returns <code>true</code> if the named file has the setgid bit set. + */) + +directive(static) ident(VALUE) +ident(test_sgid)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifdef) ident(S_ISGID) + reserved(return) ident(check3rdbyte)operator(()ident(fname)operator(,) ident(S_ISGID)operator(\);) +preprocessor(#else) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * File.sticky?(file_name\) => true or false + * + * Returns <code>true</code> if the named file has the sticky bit set. + */) + +directive(static) ident(VALUE) +ident(test_sticky)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) +preprocessor(#ifdef) ident(S_ISVTX) + reserved(return) ident(check3rdbyte)operator(()ident(fname)operator(,) ident(S_ISVTX)operator(\);) +preprocessor(#else) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * File.identical?(file_1, file_2\) => true or false + * + * Returns <code>true</code> if the named files are identical. + * + * open("a", "w"\) {} + * p File.identical?("a", "a"\) #=> true + * p File.identical?("a", "./a"\) #=> true + * File.link("a", "b"\) + * p File.identical?("a", "b"\) #=> true + * File.symlink("a", "c"\) + * p File.identical?("a", "c"\) #=> true + * open("d", "w"\) {} + * p File.identical?("a", "d"\) #=> false + */) + +directive(static) ident(VALUE) +ident(test_identical)operator(()ident(obj)operator(,) ident(fname1)operator(,) ident(fname2)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname1)operator(,) ident(fname2)operator(;) +operator({) +preprocessor(#ifndef) ident(DOSISH) + reserved(struct) ident(stat) ident(st1)operator(,) ident(st2)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname1)operator(,) operator(&)ident(st1)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(rb_stat)operator(()ident(fname2)operator(,) operator(&)ident(st2)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(st1)operator(.)ident(st_dev) operator(!=) ident(st2)operator(.)ident(st_dev)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(st1)operator(.)ident(st_ino) operator(!=) ident(st2)operator(.)ident(st_ino)operator(\)) reserved(return) ident(Qfalse)operator(;) +preprocessor(#else) +preprocessor(#ifdef) ident(_WIN32) + ident(BY_HANDLE_FILE_INFORMATION) ident(st1)operator(,) ident(st2)operator(;) + ident(HANDLE) ident(f1) operator(=) integer(0)operator(,) ident(f2) operator(=) integer(0)operator(;) +preprocessor(#endif) + + ident(rb_secure)operator(()integer(2)operator(\);) +preprocessor(#ifdef) ident(_WIN32) + ident(f1) operator(=) ident(w32_io_info)operator((&)ident(fname1)operator(,) operator(&)ident(st1)operator(\);) + reserved(if) operator(()ident(f1) operator(==) ident(INVALID_HANDLE_VALUE)operator(\)) reserved(return) ident(Qfalse)operator(;) + ident(f2) operator(=) ident(w32_io_info)operator((&)ident(fname2)operator(,) operator(&)ident(st2)operator(\);) + reserved(if) operator(()ident(f1)operator(\)) ident(CloseHandle)operator(()ident(f1)operator(\);) + reserved(if) operator(()ident(f2) operator(==) ident(INVALID_HANDLE_VALUE)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(f2)operator(\)) ident(CloseHandle)operator(()ident(f2)operator(\);) + + reserved(if) operator(()ident(st1)operator(.)ident(dwVolumeSerialNumber) operator(==) ident(st2)operator(.)ident(dwVolumeSerialNumber) operator(&&) + ident(st1)operator(.)ident(nFileIndexHigh) operator(==) ident(st2)operator(.)ident(nFileIndexHigh) operator(&&) + ident(st1)operator(.)ident(nFileIndexLow) operator(==) ident(st2)operator(.)ident(nFileIndexLow)operator(\)) + reserved(return) ident(Qtrue)operator(;) + reserved(if) operator((!)ident(f1) operator(||) operator(!)ident(f2)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(rb_w32_iswin95)operator((\)\)) reserved(return) ident(Qfalse)operator(;) +preprocessor(#else) + ident(SafeStringValue)operator(()ident(fname1)operator(\);) + ident(fname1) operator(=) ident(rb_str_new4)operator(()ident(fname1)operator(\);) + ident(SafeStringValue)operator(()ident(fname2)operator(\);) + reserved(if) operator(()ident(access)operator(()ident(RSTRING)operator(()ident(fname1)operator(\)->)ident(ptr)operator(,) integer(0)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(access)operator(()ident(RSTRING)operator(()ident(fname2)operator(\)->)ident(ptr)operator(,) integer(0)operator(\)\)) reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) + ident(fname1) operator(=) ident(rb_file_expand_path)operator(()ident(fname1)operator(,) ident(Qnil)operator(\);) + ident(fname2) operator(=) ident(rb_file_expand_path)operator(()ident(fname2)operator(,) ident(Qnil)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(fname1)operator(\)->)ident(len) operator(!=) ident(RSTRING)operator(()ident(fname2)operator(\)->)ident(len)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(rb_memcicmp)operator(()ident(RSTRING)operator(()ident(fname1)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(fname2)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(fname1)operator(\)->)ident(len)operator(\)\)) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.size(file_name\) => integer + * + * Returns the size of <code>file_name</code>. + */) + +directive(static) ident(VALUE) +ident(rb_file_s_size)operator(()ident(klass)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\)\);) + reserved(return) ident(OFFT2NUM)operator(()ident(st)operator(.)ident(st_size)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_file_ftype)operator(()ident(st)operator(\)) + reserved(struct) ident(stat) operator(*)ident(st)operator(;) +operator({) + pre_type(char) operator(*)ident(t)operator(;) + + reserved(if) operator(()ident(S_ISREG)operator(()ident(st)operator(->)ident(st_mode)operator(\)\)) operator({) + ident(t) operator(=) string<delimiter(")content(file)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(S_ISDIR)operator(()ident(st)operator(->)ident(st_mode)operator(\)\)) operator({) + ident(t) operator(=) string<delimiter(")content(directory)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(S_ISCHR)operator(()ident(st)operator(->)ident(st_mode)operator(\)\)) operator({) + ident(t) operator(=) string<delimiter(")content(characterSpecial)delimiter(")>operator(;) + operator(}) +preprocessor(#ifdef) ident(S_ISBLK) + reserved(else) reserved(if) operator(()ident(S_ISBLK)operator(()ident(st)operator(->)ident(st_mode)operator(\)\)) operator({) + ident(t) operator(=) string<delimiter(")content(blockSpecial)delimiter(")>operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_ISFIFO) + reserved(else) reserved(if) operator(()ident(S_ISFIFO)operator(()ident(st)operator(->)ident(st_mode)operator(\)\)) operator({) + ident(t) operator(=) string<delimiter(")content(fifo)delimiter(")>operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_ISLNK) + reserved(else) reserved(if) operator(()ident(S_ISLNK)operator(()ident(st)operator(->)ident(st_mode)operator(\)\)) operator({) + ident(t) operator(=) string<delimiter(")content(link)delimiter(")>operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_ISSOCK) + reserved(else) reserved(if) operator(()ident(S_ISSOCK)operator(()ident(st)operator(->)ident(st_mode)operator(\)\)) operator({) + ident(t) operator(=) string<delimiter(")content(socket)delimiter(")>operator(;) + operator(}) +preprocessor(#endif) + reserved(else) operator({) + ident(t) operator(=) string<delimiter(")content(unknown)delimiter(")>operator(;) + operator(}) + + reserved(return) ident(rb_str_new2)operator(()ident(t)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.ftype(file_name\) => string + * + * Identifies the type of the named file; the return string is one of + * ``<code>file</code>'', ``<code>directory</code>'', + * ``<code>characterSpecial</code>'', ``<code>blockSpecial</code>'', + * ``<code>fifo</code>'', ``<code>link</code>'', + * ``<code>socket</code>'', or ``<code>unknown</code>''. + * + * File.ftype("testfile"\) #=> "file" + * File.ftype("/dev/tty"\) #=> "characterSpecial" + * File.ftype("/tmp/.X11-unix/X0"\) #=> "socket" + */) + +directive(static) ident(VALUE) +ident(rb_file_s_ftype)operator(()ident(klass)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(SafeStringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(lstat)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) operator(&)ident(st)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\);) + operator(}) + + reserved(return) ident(rb_file_ftype)operator((&)ident(st)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.atime(file_name\) => time + * + * Returns the last access time for the named file as a Time object\). + * + * File.atime("testfile"\) #=> Wed Apr 09 08:51:48 CDT 2003 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_atime)operator(()ident(klass)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\)\);) + reserved(return) ident(rb_time_new)operator(()ident(st)operator(.)ident(st_atime)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * file.atime => time + * + * Returns the last access time (a <code>Time</code> object\) + * for <i>file</i>, or epoch if <i>file</i> has not been accessed. + * + * File.new("testfile"\).atime #=> Wed Dec 31 18:00:00 CST 1969 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_atime)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(GetOpenFile)operator(()ident(obj)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(fstat)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) operator(&)ident(st)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + reserved(return) ident(rb_time_new)operator(()ident(st)operator(.)ident(st_atime)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.mtime(file_name\) => time + * + * Returns the modification time for the named file as a Time object. + * + * File.mtime("testfile"\) #=> Tue Apr 08 12:58:04 CDT 2003 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_mtime)operator(()ident(klass)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\);) + reserved(return) ident(rb_time_new)operator(()ident(st)operator(.)ident(st_mtime)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * file.mtime -> time + * + * Returns the modification time for <i>file</i>. + * + * File.new("testfile"\).mtime #=> Wed Apr 09 08:53:14 CDT 2003 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_mtime)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(GetOpenFile)operator(()ident(obj)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(fstat)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) operator(&)ident(st)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + reserved(return) ident(rb_time_new)operator(()ident(st)operator(.)ident(st_mtime)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.ctime(file_name\) => time + * + * Returns the change time for the named file (the time at which + * directory information about the file was changed, not the file + * itself\). + * + * File.ctime("testfile"\) #=> Wed Apr 09 08:53:13 CDT 2003 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_ctime)operator(()ident(klass)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + reserved(if) operator(()ident(rb_stat)operator(()ident(fname)operator(,) operator(&)ident(st)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\);) + reserved(return) ident(rb_time_new)operator(()ident(st)operator(.)ident(st_ctime)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * file.ctime -> time + * + * Returns the change time for <i>file</i> (that is, the time directory + * information about the file was changed, not the file itself\). + * + * File.new("testfile"\).ctime #=> Wed Apr 09 08:53:14 CDT 2003 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_ctime)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(GetOpenFile)operator(()ident(obj)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(fstat)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) operator(&)ident(st)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + reserved(return) ident(rb_time_new)operator(()ident(st)operator(.)ident(st_ctime)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) directive(void) ident(chmod_internal) ident(_)operator((()directive(const) pre_type(char) operator(*,) directive(void) operator(*\)\);) +directive(static) directive(void) +ident(chmod_internal)operator(()ident(path)operator(,) ident(mode)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + directive(void) operator(*)ident(mode)operator(;) +operator({) + reserved(if) operator(()ident(chmod)operator(()ident(path)operator(,) operator(*()pre_type(int) operator(*\))ident(mode)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(path)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.chmod(mode_int, file_name, ... \) -> integer + * + * Changes permission bits on the named file(s\) to the bit pattern + * represented by <i>mode_int</i>. Actual effects are operating system + * dependent (see the beginning of this section\). On Unix systems, see + * <code>chmod(2\)</code> for details. Returns the number of files + * processed. + * + * File.chmod(0644, "testfile", "out"\) #=> 2 + */) + +directive(static) ident(VALUE) +ident(rb_file_s_chmod)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(vmode)operator(;) + ident(VALUE) ident(rest)operator(;) + pre_type(int) ident(mode)operator(;) + pre_type(long) ident(n)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(1*)delimiter(")>operator(,) operator(&)ident(vmode)operator(,) operator(&)ident(rest)operator(\);) + ident(mode) operator(=) ident(NUM2INT)operator(()ident(vmode)operator(\);) + + ident(n) operator(=) ident(apply2files)operator(()ident(chmod_internal)operator(,) ident(rest)operator(,) operator(&)ident(mode)operator(\);) + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) + +comment(/* + * call-seq: + * file.chmod(mode_int\) => 0 + * + * Changes permission bits on <i>file</i> to the bit pattern + * represented by <i>mode_int</i>. Actual effects are platform + * dependent; on Unix systems, see <code>chmod(2\)</code> for details. + * Follows symbolic links. Also see <code>File#lchmod</code>. + * + * f = File.new("out", "w"\); + * f.chmod(0644\) #=> 0 + */) + +directive(static) ident(VALUE) +ident(rb_file_chmod)operator(()ident(obj)operator(,) ident(vmode)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(vmode)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(mode)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(mode) operator(=) ident(NUM2INT)operator(()ident(vmode)operator(\);) + + ident(GetOpenFile)operator(()ident(obj)operator(,) ident(fptr)operator(\);) +preprocessor(#ifdef) ident(HAVE_FCHMOD) + reserved(if) operator(()ident(fchmod)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(mode)operator(\)) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) +preprocessor(#else) + reserved(if) operator((!)ident(fptr)operator(->)ident(path)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(chmod)operator(()ident(fptr)operator(->)ident(path)operator(,) ident(mode)operator(\)) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) +preprocessor(#endif) + + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_LCHMOD)operator(\)) +directive(static) directive(void) ident(lchmod_internal) ident(_)operator((()directive(const) pre_type(char) operator(*,) directive(void) operator(*\)\);) +directive(static) directive(void) +ident(lchmod_internal)operator(()ident(path)operator(,) ident(mode)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + directive(void) operator(*)ident(mode)operator(;) +operator({) + reserved(if) operator(()ident(lchmod)operator(()ident(path)operator(,) operator(()pre_type(int)operator(\))ident(mode)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(path)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.lchmod(mode_int, file_name, ...\) => integer + * + * Equivalent to <code>File::chmod</code>, but does not follow symbolic + * links (so it will change the permissions associated with the link, + * not the file referenced by the link\). Often not available. + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_lchmod)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(vmode)operator(;) + ident(VALUE) ident(rest)operator(;) + pre_type(long) ident(mode)operator(,) ident(n)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(1*)delimiter(")>operator(,) operator(&)ident(vmode)operator(,) operator(&)ident(rest)operator(\);) + ident(mode) operator(=) ident(NUM2INT)operator(()ident(vmode)operator(\);) + + ident(n) operator(=) ident(apply2files)operator(()ident(lchmod_internal)operator(,) ident(rest)operator(,) operator(()directive(void) operator(*\)()pre_type(long)operator(\))ident(mode)operator(\);) + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) +preprocessor(#else) +directive(static) ident(VALUE) +ident(rb_file_s_lchmod)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) +preprocessor(#endif) + +reserved(struct) ident(chown_args) operator({) + pre_type(int) ident(owner)operator(,) ident(group)operator(;) +operator(};) + +directive(static) directive(void) ident(chown_internal) ident(_)operator((()directive(const) pre_type(char) operator(*,) directive(void) operator(*\)\);) +directive(static) directive(void) +ident(chown_internal)operator(()ident(path)operator(,) ident(argp)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + directive(void) operator(*)ident(argp)operator(;) +operator({) + reserved(struct) ident(chown_args) operator(*)ident(args) operator(=) operator(()reserved(struct) ident(chown_args) operator(*\))ident(argp)operator(;) + reserved(if) operator(()ident(chown)operator(()ident(path)operator(,) ident(args)operator(->)ident(owner)operator(,) ident(args)operator(->)ident(group)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(path)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.chown(owner_int, group_int, file_name,... \) -> integer + * + * Changes the owner and group of the named file(s\) to the given + * numeric owner and group id's. Only a process with superuser + * privileges may change the owner of a file. The current owner of a + * file may change the file's group to any group to which the owner + * belongs. A <code>nil</code> or -1 owner or group id is ignored. + * Returns the number of files processed. + * + * File.chown(nil, 100, "testfile"\) + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_chown)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(o)operator(,) ident(g)operator(,) ident(rest)operator(;) + reserved(struct) ident(chown_args) ident(arg)operator(;) + pre_type(long) ident(n)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(2*)delimiter(")>operator(,) operator(&)ident(o)operator(,) operator(&)ident(g)operator(,) operator(&)ident(rest)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(o)operator(\)\)) operator({) + ident(arg)operator(.)ident(owner) operator(=) operator(-)integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(arg)operator(.)ident(owner) operator(=) ident(NUM2INT)operator(()ident(o)operator(\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(g)operator(\)\)) operator({) + ident(arg)operator(.)ident(group) operator(=) operator(-)integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(arg)operator(.)ident(group) operator(=) ident(NUM2INT)operator(()ident(g)operator(\);) + operator(}) + + ident(n) operator(=) ident(apply2files)operator(()ident(chown_internal)operator(,) ident(rest)operator(,) operator(&)ident(arg)operator(\);) + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) + +comment(/* + * call-seq: + * file.chown(owner_int, group_int \) => 0 + * + * Changes the owner and group of <i>file</i> to the given numeric + * owner and group id's. Only a process with superuser privileges may + * change the owner of a file. The current owner of a file may change + * the file's group to any group to which the owner belongs. A + * <code>nil</code> or -1 owner or group id is ignored. Follows + * symbolic links. See also <code>File#lchown</code>. + * + * File.new("testfile"\).chown(502, 1000\) + * + */) + +directive(static) ident(VALUE) +ident(rb_file_chown)operator(()ident(obj)operator(,) ident(owner)operator(,) ident(group)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(owner)operator(,) ident(group)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(o)operator(,) ident(g)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(o) operator(=) ident(NIL_P)operator(()ident(owner)operator(\)) operator(?) operator(-)integer(1) operator(:) ident(NUM2INT)operator(()ident(owner)operator(\);) + ident(g) operator(=) ident(NIL_P)operator(()ident(group)operator(\)) operator(?) operator(-)integer(1) operator(:) ident(NUM2INT)operator(()ident(group)operator(\);) + ident(GetOpenFile)operator(()ident(obj)operator(,) ident(fptr)operator(\);) +preprocessor(#if) ident(defined)operator(()ident(DJGPP)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN32__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(__EMX__)operator(\)) + reserved(if) operator((!)ident(fptr)operator(->)ident(path)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(chown)operator(()ident(fptr)operator(->)ident(path)operator(,) ident(o)operator(,) ident(g)operator(\)) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) +preprocessor(#else) + reserved(if) operator(()ident(fchown)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(o)operator(,) ident(g)operator(\)) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) +preprocessor(#endif) + + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_LCHOWN)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) +directive(static) directive(void) ident(lchown_internal) ident(_)operator((()directive(const) pre_type(char) operator(*,) directive(void) operator(*\)\);) +directive(static) directive(void) +ident(lchown_internal)operator(()ident(path)operator(,) ident(argp)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + directive(void) operator(*)ident(argp)operator(;) +operator({) + reserved(struct) ident(chown_args) operator(*)ident(args) operator(=) operator(()reserved(struct) ident(chown_args) operator(*\))ident(argp)operator(;) + reserved(if) operator(()ident(lchown)operator(()ident(path)operator(,) ident(args)operator(->)ident(owner)operator(,) ident(args)operator(->)ident(group)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(path)operator(\);) +operator(}) + +comment(/* + * call-seq: + * file.lchown(owner_int, group_int, file_name,..\) => integer + * + * Equivalent to <code>File::chown</code>, but does not follow symbolic + * links (so it will change the owner associated with the link, not the + * file referenced by the link\). Often not available. Returns number + * of files in the argument list. + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_lchown)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(o)operator(,) ident(g)operator(,) ident(rest)operator(;) + reserved(struct) ident(chown_args) ident(arg)operator(;) + pre_type(long) ident(n)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(2*)delimiter(")>operator(,) operator(&)ident(o)operator(,) operator(&)ident(g)operator(,) operator(&)ident(rest)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(o)operator(\)\)) operator({) + ident(arg)operator(.)ident(owner) operator(=) operator(-)integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(arg)operator(.)ident(owner) operator(=) ident(NUM2INT)operator(()ident(o)operator(\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(g)operator(\)\)) operator({) + ident(arg)operator(.)ident(group) operator(=) operator(-)integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(arg)operator(.)ident(group) operator(=) ident(NUM2INT)operator(()ident(g)operator(\);) + operator(}) + + ident(n) operator(=) ident(apply2files)operator(()ident(lchown_internal)operator(,) ident(rest)operator(,) operator(&)ident(arg)operator(\);) + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) +preprocessor(#else) +directive(static) ident(VALUE) +ident(rb_file_s_lchown)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(rb_notimplement)operator((\);) +operator(}) +preprocessor(#endif) + +reserved(struct) ident(timeval) ident(rb_time_timeval)operator((\);) + +directive(static) directive(void) ident(utime_internal) ident(_)operator((()directive(const) pre_type(char) operator(*,) directive(void) operator(*\)\);) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_UTIMES)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + +directive(static) directive(void) +ident(utime_internal)operator(()ident(path)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + directive(void) operator(*)ident(arg)operator(;) +operator({) + reserved(struct) ident(timeval) operator(*)ident(tvp) operator(=) ident(arg)operator(;) + reserved(if) operator(()ident(utimes)operator(()ident(path)operator(,) ident(tvp)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(path)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.utime(atime, mtime, file_name,...\) => integer + * + * Sets the access and modification times of each + * named file to the first two arguments. Returns + * the number of file names in the argument list. + */) + +directive(static) ident(VALUE) +ident(rb_file_s_utime)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(atime)operator(,) ident(mtime)operator(,) ident(rest)operator(;) + reserved(struct) ident(timeval) ident(tvs)operator([)integer(2)operator(],) operator(*)ident(tvp) operator(=) pre_constant(NULL)operator(;) + pre_type(long) ident(n)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(2*)delimiter(")>operator(,) operator(&)ident(atime)operator(,) operator(&)ident(mtime)operator(,) operator(&)ident(rest)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(atime)operator(\)) operator(||) operator(!)ident(NIL_P)operator(()ident(mtime)operator(\)\)) operator({) + ident(tvp) operator(=) ident(tvs)operator(;) + ident(tvp)operator([)integer(0)operator(]) operator(=) ident(rb_time_timeval)operator(()ident(atime)operator(\);) + ident(tvp)operator([)integer(1)operator(]) operator(=) ident(rb_time_timeval)operator(()ident(mtime)operator(\);) + operator(}) + + ident(n) operator(=) ident(apply2files)operator(()ident(utime_internal)operator(,) ident(rest)operator(,) ident(tvp)operator(\);) + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) + +preprocessor(#else) + +preprocessor(#if) operator(!)ident(defined) ident(HAVE_UTIME_H) operator(&&) operator(!)ident(defined) ident(HAVE_SYS_UTIME_H) +reserved(struct) ident(utimbuf) operator({) + pre_type(long) ident(actime)operator(;) + pre_type(long) ident(modtime)operator(;) +operator(};) +preprocessor(#endif) + +directive(static) directive(void) +ident(utime_internal)operator(()ident(path)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + directive(void) operator(*)ident(arg)operator(;) +operator({) + reserved(struct) ident(utimbuf) operator(*)ident(utp) operator(=) ident(arg)operator(;) + reserved(if) operator(()ident(utime)operator(()ident(path)operator(,) ident(utp)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(path)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_file_s_utime)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(atime)operator(,) ident(mtime)operator(,) ident(rest)operator(;) + pre_type(long) ident(n)operator(;) + reserved(struct) ident(timeval) ident(tv)operator(;) + reserved(struct) ident(utimbuf) ident(utbuf)operator(,) operator(*)ident(utp) operator(=) pre_constant(NULL)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(2*)delimiter(")>operator(,) operator(&)ident(atime)operator(,) operator(&)ident(mtime)operator(,) operator(&)ident(rest)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(atime)operator(\)) operator(||) operator(!)ident(NIL_P)operator(()ident(mtime)operator(\)\)) operator({) + ident(utp) operator(=) operator(&)ident(utbuf)operator(;) + ident(tv) operator(=) ident(rb_time_timeval)operator(()ident(atime)operator(\);) + ident(utp)operator(->)ident(actime) operator(=) ident(tv)operator(.)ident(tv_sec)operator(;) + ident(tv) operator(=) ident(rb_time_timeval)operator(()ident(mtime)operator(\);) + ident(utp)operator(->)ident(modtime) operator(=) ident(tv)operator(.)ident(tv_sec)operator(;) + operator(}) + + ident(n) operator(=) ident(apply2files)operator(()ident(utime_internal)operator(,) ident(rest)operator(,) ident(utp)operator(\);) + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) + +preprocessor(#endif) + +ident(NORETURN)operator(()directive(static) directive(void) ident(sys_fail2) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\)\);) +directive(static) directive(void) +ident(sys_fail2)operator(()ident(s1)operator(,) ident(s2)operator(\)) + ident(VALUE) ident(s1)operator(,) ident(s2)operator(;) +operator({) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(int) ident(len)operator(;) + + ident(len) operator(=) ident(RSTRING)operator(()ident(s1)operator(\)->)ident(len) operator(+) ident(RSTRING)operator(()ident(s2)operator(\)->)ident(len) operator(+) integer(5)operator(;) + ident(buf) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(len)operator(\);) + ident(snprintf)operator(()ident(buf)operator(,) ident(len)operator(,) string<delimiter(")content(%s or %s)delimiter(")>operator(,) ident(RSTRING)operator(()ident(s1)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(s2)operator(\)->)ident(ptr)operator(\);) + ident(rb_sys_fail)operator(()ident(buf)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.link(old_name, new_name\) => 0 + * + * Creates a new name for an existing file using a hard link. Will not + * overwrite <i>new_name</i> if it already exists (raising a subclass + * of <code>SystemCallError</code>\). Not available on all platforms. + * + * File.link("testfile", ".testfile"\) #=> 0 + * IO.readlines(".testfile"\)[0] #=> "This is line one\\n" + */) + +directive(static) ident(VALUE) +ident(rb_file_s_link)operator(()ident(klass)operator(,) ident(from)operator(,) ident(to)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(from)operator(,) ident(to)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_LINK) + ident(SafeStringValue)operator(()ident(from)operator(\);) + ident(SafeStringValue)operator(()ident(to)operator(\);) + + reserved(if) operator(()ident(link)operator(()ident(StringValueCStr)operator(()ident(from)operator(\),) ident(StringValueCStr)operator(()ident(to)operator(\)\)) operator(<) integer(0)operator(\)) operator({) + ident(sys_fail2)operator(()ident(from)operator(,) ident(to)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * File.symlink(old_name, new_name\) => 0 + * + * Creates a symbolic link called <i>new_name</i> for the existing file + * <i>old_name</i>. Raises a <code>NotImplemented</code> exception on + * platforms that do not support symbolic links. + * + * File.symlink("testfile", "link2test"\) #=> 0 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_symlink)operator(()ident(klass)operator(,) ident(from)operator(,) ident(to)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(from)operator(,) ident(to)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_SYMLINK) + ident(SafeStringValue)operator(()ident(from)operator(\);) + ident(SafeStringValue)operator(()ident(to)operator(\);) + + reserved(if) operator(()ident(symlink)operator(()ident(StringValueCStr)operator(()ident(from)operator(\),) ident(StringValueCStr)operator(()ident(to)operator(\)\)) operator(<) integer(0)operator(\)) operator({) + ident(sys_fail2)operator(()ident(from)operator(,) ident(to)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * File.readlink(link_name\) -> file_name + * + * Returns the name of the file referenced by the given link. + * Not available on all platforms. + * + * File.symlink("testfile", "link2test"\) #=> 0 + * File.readlink("link2test"\) #=> "testfile" + */) + +directive(static) ident(VALUE) +ident(rb_file_s_readlink)operator(()ident(klass)operator(,) ident(path)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(path)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_READLINK) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(int) ident(size) operator(=) integer(100)operator(;) + pre_type(int) ident(rv)operator(;) + ident(VALUE) ident(v)operator(;) + + ident(SafeStringValue)operator(()ident(path)operator(\);) + ident(buf) operator(=) ident(xmalloc)operator(()ident(size)operator(\);) + reserved(while) operator((()ident(rv) operator(=) ident(readlink)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(,) ident(buf)operator(,) ident(size)operator(\)\)) operator(==) ident(size) +preprocessor(#ifdef) ident(_AIX) + operator(||) operator(()ident(rv) operator(<) integer(0) operator(&&) ident(errno) operator(==) ident(ERANGE)operator(\)) comment(/* quirky behavior of GPFS */) +preprocessor(#endif) + operator(\)) operator({) + ident(size) operator(*=) integer(2)operator(;) + ident(buf) operator(=) ident(xrealloc)operator(()ident(buf)operator(,) ident(size)operator(\);) + operator(}) + reserved(if) operator(()ident(rv) operator(<) integer(0)operator(\)) operator({) + ident(free)operator(()ident(buf)operator(\);) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) + operator(}) + ident(v) operator(=) ident(rb_tainted_str_new)operator(()ident(buf)operator(,) ident(rv)operator(\);) + ident(free)operator(()ident(buf)operator(\);) + + reserved(return) ident(v)operator(;) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +directive(static) directive(void) ident(unlink_internal) ident(_)operator((()directive(const) pre_type(char) operator(*,) directive(void) operator(*\)\);) +directive(static) directive(void) +ident(unlink_internal)operator(()ident(path)operator(,) ident(arg)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) + directive(void) operator(*)ident(arg)operator(;) +operator({) + reserved(if) operator(()ident(unlink)operator(()ident(path)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(path)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.delete(file_name, ...\) => integer + * File.unlink(file_name, ...\) => integer + * + * Deletes the named files, returning the number of names + * passed as arguments. Raises an exception on any error. + * See also <code>Dir::rmdir</code>. + */) + +directive(static) ident(VALUE) +ident(rb_file_s_unlink)operator(()ident(klass)operator(,) ident(args)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(args)operator(;) +operator({) + pre_type(long) ident(n)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(n) operator(=) ident(apply2files)operator(()ident(unlink_internal)operator(,) ident(args)operator(,) integer(0)operator(\);) + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.rename(old_name, new_name\) => 0 + * + * Renames the given file to the new name. Raises a + * <code>SystemCallError</code> if the file cannot be renamed. + * + * File.rename("afile", "afile.bak"\) #=> 0 + */) + +directive(static) ident(VALUE) +ident(rb_file_s_rename)operator(()ident(klass)operator(,) ident(from)operator(,) ident(to)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(from)operator(,) ident(to)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(src)operator(,) operator(*)ident(dst)operator(;) + ident(SafeStringValue)operator(()ident(from)operator(\);) + ident(SafeStringValue)operator(()ident(to)operator(\);) + + ident(src) operator(=) ident(StringValueCStr)operator(()ident(from)operator(\);) + ident(dst) operator(=) ident(StringValueCStr)operator(()ident(to)operator(\);) +preprocessor(#if) ident(defined) ident(__CYGWIN__) + ident(errno) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(if) operator(()ident(rename)operator(()ident(src)operator(,) ident(dst)operator(\)) operator(<) integer(0)operator(\)) operator({) +preprocessor(#if) ident(defined) ident(DOSISH) operator(&&) operator(!)ident(defined) ident(_WIN32) + reserved(switch) operator(()ident(errno)operator(\)) operator({) + reserved(case) label(EEXIST)operator(:) +preprocessor(#if) ident(defined) operator(()ident(__EMX__)operator(\)) + reserved(case) label(EACCES)operator(:) +preprocessor(#endif) + reserved(if) operator(()ident(chmod)operator(()ident(dst)operator(,) oct(0666)operator(\)) operator(==) integer(0) operator(&&) + ident(unlink)operator(()ident(dst)operator(\)) operator(==) integer(0) operator(&&) + ident(rename)operator(()ident(src)operator(,) ident(dst)operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#endif) + ident(sys_fail2)operator(()ident(from)operator(,) ident(to)operator(\);) + operator(}) + + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.umask(\) => integer + * File.umask(integer\) => integer + * + * Returns the current umask value for this process. If the optional + * argument is given, set the umask to that value and return the + * previous value. Umask values are <em>subtracted</em> from the + * default permissions, so a umask of <code>0222</code> would make a + * file read-only for everyone. + * + * File.umask(0006\) #=> 18 + * File.umask #=> 6 + */) + +directive(static) ident(VALUE) +ident(rb_file_s_umask)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + pre_type(int) ident(omask) operator(=) integer(0)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(omask) operator(=) ident(umask)operator(()integer(0)operator(\);) + ident(umask)operator(()ident(omask)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(omask) operator(=) ident(umask)operator(()ident(NUM2INT)operator(()ident(argv)operator([)integer(0)operator(]\)\);) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(omask)operator(\);) +operator(}) + +preprocessor(#ifdef) ident(__CYGWIN__) +preprocessor(#undef) ident(DOSISH) +preprocessor(#endif) +preprocessor(#if) ident(defined) ident(__CYGWIN__) operator(||) ident(defined) ident(DOSISH) +preprocessor(#define) ident(DOSISH_UNC) +preprocessor(#define) ident(DOSISH_DRIVE_LETTER) +preprocessor(#define) ident(isdirsep)operator(()ident(x)operator(\)) operator((()ident(x)operator(\)) operator(==) char('/') operator(||) operator(()ident(x)operator(\)) operator(==) char('\\\\')operator(\)) +preprocessor(#else) +preprocessor(#define) ident(isdirsep)operator(()ident(x)operator(\)) operator((()ident(x)operator(\)) operator(==) char('/')operator(\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(_WIN32) operator(||) ident(defined) ident(__CYGWIN__) +preprocessor(#define) ident(USE_NTFS) integer(1) +preprocessor(#else) +preprocessor(#define) ident(USE_NTFS) integer(0) +preprocessor(#endif) + +preprocessor(#if) ident(USE_NTFS) +preprocessor(#define) ident(istrailinggabage)operator(()ident(x)operator(\)) operator((()ident(x)operator(\)) operator(==) char('.') operator(||) operator(()ident(x)operator(\)) operator(==) char(' ')operator(\)) +preprocessor(#else) +preprocessor(#define) ident(istrailinggabage)operator(()ident(x)operator(\)) integer(0) +preprocessor(#endif) + +preprocessor(#ifndef) ident(CharNext) comment(/* defined as CharNext[AW] on Windows. */) +preprocessor(# if) ident(defined)operator(()ident(DJGPP)operator(\)) +preprocessor(# define) ident(CharNext)operator(()ident(p)operator(\)) operator((()ident(p)operator(\)) operator(+) ident(mblen)operator(()ident(p)operator(,) ident(MB_CUR_MAX)operator(\)\)) +preprocessor(# else) +preprocessor(# define) ident(CharNext)operator(()ident(p)operator(\)) operator((()ident(p)operator(\)) operator(+) integer(1)operator(\)) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#ifdef) ident(DOSISH_DRIVE_LETTER) +directive(static) directive(inline) pre_type(int) +ident(has_drive_letter)operator(()ident(buf)operator(\)) + directive(const) pre_type(char) operator(*)ident(buf)operator(;) +operator({) + reserved(if) operator(()ident(ISALPHA)operator(()ident(buf)operator([)integer(0)operator(]\)) operator(&&) ident(buf)operator([)integer(1)operator(]) operator(==) char(':')operator(\)) operator({) + reserved(return) integer(1)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) integer(0)operator(;) + operator(}) +operator(}) + +directive(static) pre_type(char)operator(*) +ident(getcwdofdrv)operator(()ident(drv)operator(\)) + pre_type(int) ident(drv)operator(;) +operator({) + pre_type(char) ident(drive)operator([)integer(4)operator(];) + pre_type(char) operator(*)ident(drvcwd)operator(,) operator(*)ident(oldcwd)operator(;) + + ident(drive)operator([)integer(0)operator(]) operator(=) ident(drv)operator(;) + ident(drive)operator([)integer(1)operator(]) operator(=) char(':')operator(;) + ident(drive)operator([)integer(2)operator(]) operator(=) char('\\0')operator(;) + + comment(/* the only way that I know to get the current directory + of a particular drive is to change chdir(\) to that drive, + so save the old cwd before chdir(\) + */) + ident(oldcwd) operator(=) ident(my_getcwd)operator((\);) + reserved(if) operator(()ident(chdir)operator(()ident(drive)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(drvcwd) operator(=) ident(my_getcwd)operator((\);) + ident(chdir)operator(()ident(oldcwd)operator(\);) + ident(free)operator(()ident(oldcwd)operator(\);) + operator(}) + reserved(else) operator({) + comment(/* perhaps the drive is not exist. we return only drive letter */) + ident(drvcwd) operator(=) ident(strdup)operator(()ident(drive)operator(\);) + operator(}) + reserved(return) ident(drvcwd)operator(;) +operator(}) +preprocessor(#endif) + +directive(static) directive(inline) pre_type(char) operator(*) +ident(skiproot)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) +preprocessor(#ifdef) ident(DOSISH_DRIVE_LETTER) + reserved(if) operator(()ident(has_drive_letter)operator(()ident(path)operator(\)\)) ident(path) operator(+=) integer(2)operator(;) +preprocessor(#endif) + reserved(while) operator(()ident(isdirsep)operator((*)ident(path)operator(\)\)) ident(path)operator(++;) + reserved(return) operator(()pre_type(char) operator(*\))ident(path)operator(;) +operator(}) + +preprocessor(#define) ident(nextdirsep) ident(rb_path_next) +pre_type(char) operator(*) +ident(rb_path_next)operator(()ident(s)operator(\)) + directive(const) pre_type(char) operator(*)ident(s)operator(;) +operator({) + reserved(while) operator((*)ident(s) operator(&&) operator(!)ident(isdirsep)operator((*)ident(s)operator(\)\)) operator({) + ident(s) operator(=) ident(CharNext)operator(()ident(s)operator(\);) + operator(}) + reserved(return) operator(()pre_type(char) operator(*\))ident(s)operator(;) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(DOSISH_UNC)operator(\)) operator(||) ident(defined)operator(()ident(DOSISH_DRIVE_LETTER)operator(\)) +preprocessor(#define) ident(skipprefix) ident(rb_path_skip_prefix) +preprocessor(#else) +preprocessor(#define) ident(skipprefix)operator(()ident(path)operator(\)) operator(()ident(path)operator(\)) +preprocessor(#endif) +pre_type(char) operator(*) +ident(rb_path_skip_prefix)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(DOSISH_UNC)operator(\)) operator(||) ident(defined)operator(()ident(DOSISH_DRIVE_LETTER)operator(\)) +preprocessor(#ifdef) ident(DOSISH_UNC) + reserved(if) operator(()ident(isdirsep)operator(()ident(path)operator([)integer(0)operator(]\)) operator(&&) ident(isdirsep)operator(()ident(path)operator([)integer(1)operator(]\)\)) operator({) + ident(path) operator(+=) integer(2)operator(;) + reserved(while) operator(()ident(isdirsep)operator((*)ident(path)operator(\)\)) ident(path)operator(++;) + reserved(if) operator((*()ident(path) operator(=) ident(nextdirsep)operator(()ident(path)operator(\)\)) operator(&&) ident(path)operator([)integer(1)operator(]) operator(&&) operator(!)ident(isdirsep)operator(()ident(path)operator([)integer(1)operator(]\)\)) + ident(path) operator(=) ident(nextdirsep)operator(()ident(path) operator(+) integer(1)operator(\);) + reserved(return) operator(()pre_type(char) operator(*\))ident(path)operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#ifdef) ident(DOSISH_DRIVE_LETTER) + reserved(if) operator(()ident(has_drive_letter)operator(()ident(path)operator(\)\)) + reserved(return) operator(()pre_type(char) operator(*\)()ident(path) operator(+) integer(2)operator(\);) +preprocessor(#endif) +preprocessor(#endif) + reserved(return) operator(()pre_type(char) operator(*\))ident(path)operator(;) +operator(}) + +preprocessor(#define) ident(strrdirsep) ident(rb_path_last_separator) +pre_type(char) operator(*) +ident(rb_path_last_separator)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) + pre_type(char) operator(*)ident(last) operator(=) pre_constant(NULL)operator(;) + reserved(while) operator((*)ident(path)operator(\)) operator({) + reserved(if) operator(()ident(isdirsep)operator((*)ident(path)operator(\)\)) operator({) + directive(const) pre_type(char) operator(*)ident(tmp) operator(=) ident(path)operator(++;) + reserved(while) operator(()ident(isdirsep)operator((*)ident(path)operator(\)\)) ident(path)operator(++;) + reserved(if) operator((!*)ident(path)operator(\)) reserved(break)operator(;) + ident(last) operator(=) operator(()pre_type(char) operator(*\))ident(tmp)operator(;) + operator(}) + reserved(else) operator({) + ident(path) operator(=) ident(CharNext)operator(()ident(path)operator(\);) + operator(}) + operator(}) + reserved(return) ident(last)operator(;) +operator(}) + +directive(static) pre_type(char) operator(*) +ident(chompdirsep)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) + reserved(while) operator((*)ident(path)operator(\)) operator({) + reserved(if) operator(()ident(isdirsep)operator((*)ident(path)operator(\)\)) operator({) + directive(const) pre_type(char) operator(*)ident(last) operator(=) ident(path)operator(++;) + reserved(while) operator(()ident(isdirsep)operator((*)ident(path)operator(\)\)) ident(path)operator(++;) + reserved(if) operator((!*)ident(path)operator(\)) reserved(return) operator(()pre_type(char) operator(*\))ident(last)operator(;) + operator(}) + reserved(else) operator({) + ident(path) operator(=) ident(CharNext)operator(()ident(path)operator(\);) + operator(}) + operator(}) + reserved(return) operator(()pre_type(char) operator(*\))ident(path)operator(;) +operator(}) + +pre_type(char) operator(*) +ident(rb_path_end)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) + reserved(if) operator(()ident(isdirsep)operator((*)ident(path)operator(\)\)) ident(path)operator(++;) + reserved(return) ident(chompdirsep)operator(()ident(path)operator(\);) +operator(}) + +preprocessor(#if) ident(USE_NTFS) +directive(static) pre_type(char) operator(*) +ident(ntfs_tail)operator(()directive(const) pre_type(char) operator(*)ident(path)operator(\)) +operator({) + reserved(while) operator((*)ident(path) operator(==) char('.')operator(\)) ident(path)operator(++;) + reserved(while) operator((*)ident(path) operator(&&) operator(*)ident(path) operator(!=) char(':')operator(\)) operator({) + reserved(if) operator(()ident(istrailinggabage)operator((*)ident(path)operator(\)\)) operator({) + directive(const) pre_type(char) operator(*)ident(last) operator(=) ident(path)operator(++;) + reserved(while) operator(()ident(istrailinggabage)operator((*)ident(path)operator(\)\)) ident(path)operator(++;) + reserved(if) operator((!*)ident(path) operator(||) operator(*)ident(path) operator(==) char(':')operator(\)) reserved(return) operator(()pre_type(char) operator(*\))ident(last)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(isdirsep)operator((*)ident(path)operator(\)\)) operator({) + directive(const) pre_type(char) operator(*)ident(last) operator(=) ident(path)operator(++;) + reserved(while) operator(()ident(isdirsep)operator((*)ident(path)operator(\)\)) ident(path)operator(++;) + reserved(if) operator((!*)ident(path)operator(\)) reserved(return) operator(()pre_type(char) operator(*\))ident(last)operator(;) + reserved(if) operator((*)ident(path) operator(==) char(':')operator(\)) ident(path)operator(++;) + operator(}) + reserved(else) operator({) + ident(path) operator(=) ident(CharNext)operator(()ident(path)operator(\);) + operator(}) + operator(}) + reserved(return) operator(()pre_type(char) operator(*\))ident(path)operator(;) +operator(}) +preprocessor(#endif) + +preprocessor(#define) ident(BUFCHECK)operator(()ident(cond)operator(\)) reserved(do) operator({)\ + pre_type(long) ident(bdiff) operator(=) ident(p) operator(-) ident(buf)operator(;)\ + reserved(if) operator(()ident(cond)operator(\)) operator({)\ + reserved(do) operator({)ident(buflen) operator(*=) integer(2)operator(;}) reserved(while) operator(()ident(cond)operator(\);)\ + ident(rb_str_resize)operator(()ident(result)operator(,) ident(buflen)operator(\);)\ + ident(buf) operator(=) ident(RSTRING)operator(()ident(result)operator(\)->)ident(ptr)operator(;)\ + ident(p) operator(=) ident(buf) operator(+) ident(bdiff)operator(;)\ + ident(pend) operator(=) ident(buf) operator(+) ident(buflen)operator(;)\ + operator(})\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(BUFINIT)operator((\)) operator(()\ + ident(p) operator(=) ident(buf) operator(=) ident(RSTRING)operator(()ident(result)operator(\)->)ident(ptr)operator(,)\ + ident(buflen) operator(=) ident(RSTRING)operator(()ident(result)operator(\)->)ident(len)operator(,)\ + ident(pend) operator(=) ident(p) operator(+) ident(buflen)operator(\)) + +preprocessor(#if) operator(!)ident(defined)operator(()ident(TOLOWER)operator(\)) +preprocessor(#define) ident(TOLOWER)operator(()ident(c)operator(\)) operator(()ident(ISUPPER)operator(()ident(c)operator(\)) operator(?) ident(tolower)operator(()ident(c)operator(\)) operator(:) operator(()ident(c)operator(\)\)) +preprocessor(#endif) + +directive(static) pre_type(int) ident(is_absolute_path) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) + +directive(static) ident(VALUE) +ident(file_expand_path)operator(()ident(fname)operator(,) ident(dname)operator(,) ident(result)operator(\)) + ident(VALUE) ident(fname)operator(,) ident(dname)operator(,) ident(result)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(b)operator(;) + pre_type(char) operator(*)ident(buf)operator(,) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(,) operator(*)ident(root)operator(;) + pre_type(long) ident(buflen)operator(,) ident(dirlen)operator(;) + pre_type(int) ident(tainted)operator(;) + + ident(s) operator(=) ident(StringValuePtr)operator(()ident(fname)operator(\);) + ident(BUFINIT)operator((\);) + ident(tainted) operator(=) ident(OBJ_TAINTED)operator(()ident(fname)operator(\);) + + reserved(if) operator(()ident(s)operator([)integer(0)operator(]) operator(==) char('~')operator(\)) operator({) + reserved(if) operator(()ident(isdirsep)operator(()ident(s)operator([)integer(1)operator(]\)) operator(||) ident(s)operator([)integer(1)operator(]) operator(==) char('\\0')operator(\)) operator({) + pre_type(char) operator(*)ident(dir) operator(=) ident(getenv)operator(()string<delimiter(")content(HOME)delimiter(")>operator(\);) + + reserved(if) operator((!)ident(dir)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(couldn't find HOME environment -- expanding `%s')delimiter(")>operator(,) ident(s)operator(\);) + operator(}) + ident(dirlen) operator(=) ident(strlen)operator(()ident(dir)operator(\);) + ident(BUFCHECK)operator(()ident(dirlen) operator(>) ident(buflen)operator(\);) + ident(strcpy)operator(()ident(buf)operator(,) ident(dir)operator(\);) +preprocessor(#if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__CYGWIN__) + reserved(for) operator(()ident(p) operator(=) ident(buf)operator(;) operator(*)ident(p)operator(;) ident(p) operator(=) ident(CharNext)operator(()ident(p)operator(\)\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('\\\\')operator(\)) operator({) + operator(*)ident(p) operator(=) char('/')operator(;) + operator(}) + operator(}) +preprocessor(#else) + ident(p) operator(=) ident(buf) operator(+) ident(strlen)operator(()ident(dir)operator(\);) +preprocessor(#endif) + ident(s)operator(++;) + ident(tainted) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) +preprocessor(#ifdef) ident(HAVE_PWD_H) + reserved(struct) ident(passwd) operator(*)ident(pwPtr)operator(;) + ident(s)operator(++;) +preprocessor(#endif) + ident(s) operator(=) ident(nextdirsep)operator(()ident(b) operator(=) ident(s)operator(\);) + ident(BUFCHECK)operator(()ident(bdiff) operator(+) operator(()ident(s)operator(-)ident(b)operator(\)) operator(>=) ident(buflen)operator(\);) + ident(memcpy)operator(()ident(p)operator(,) ident(b)operator(,) ident(s)operator(-)ident(b)operator(\);) + ident(p) operator(+=) ident(s)operator(-)ident(b)operator(;) + operator(*)ident(p) operator(=) char('\\0')operator(;) +preprocessor(#ifdef) ident(HAVE_PWD_H) + ident(pwPtr) operator(=) ident(getpwnam)operator(()ident(buf)operator(\);) + reserved(if) operator((!)ident(pwPtr)operator(\)) operator({) + ident(endpwent)operator((\);) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(user %s doesn't exist)delimiter(")>operator(,) ident(buf)operator(\);) + operator(}) + ident(dirlen) operator(=) ident(strlen)operator(()ident(pwPtr)operator(->)ident(pw_dir)operator(\);) + ident(BUFCHECK)operator(()ident(dirlen) operator(>) ident(buflen)operator(\);) + ident(strcpy)operator(()ident(buf)operator(,) ident(pwPtr)operator(->)ident(pw_dir)operator(\);) + ident(p) operator(=) ident(buf) operator(+) ident(strlen)operator(()ident(pwPtr)operator(->)ident(pw_dir)operator(\);) + ident(endpwent)operator((\);) +preprocessor(#endif) + operator(}) + operator(}) +preprocessor(#ifdef) ident(DOSISH_DRIVE_LETTER) + comment(/* skip drive letter */) + reserved(else) reserved(if) operator(()ident(has_drive_letter)operator(()ident(s)operator(\)\)) operator({) + reserved(if) operator(()ident(isdirsep)operator(()ident(s)operator([)integer(2)operator(]\)\)) operator({) + comment(/* specified drive letter, and full path */) + comment(/* skip drive letter */) + ident(BUFCHECK)operator(()ident(bdiff) operator(+) integer(2) operator(>=) ident(buflen)operator(\);) + ident(memcpy)operator(()ident(p)operator(,) ident(s)operator(,) integer(2)operator(\);) + ident(p) operator(+=) integer(2)operator(;) + ident(s) operator(+=) integer(2)operator(;) + operator(}) + reserved(else) operator({) + comment(/* specified drive, but not full path */) + pre_type(int) ident(same) operator(=) integer(0)operator(;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(dname)operator(\)\)) operator({) + ident(file_expand_path)operator(()ident(dname)operator(,) ident(Qnil)operator(,) ident(result)operator(\);) + ident(BUFINIT)operator((\);) + reserved(if) operator(()ident(has_drive_letter)operator(()ident(p)operator(\)) operator(&&) ident(TOLOWER)operator(()ident(p)operator([)integer(0)operator(]\)) operator(==) ident(TOLOWER)operator(()ident(s)operator([)integer(0)operator(]\)\)) operator({) + comment(/* ok, same drive */) + ident(same) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(if) operator((!)ident(same)operator(\)) operator({) + pre_type(char) operator(*)ident(dir) operator(=) ident(getcwdofdrv)operator((*)ident(s)operator(\);) + + ident(tainted) operator(=) integer(1)operator(;) + ident(dirlen) operator(=) ident(strlen)operator(()ident(dir)operator(\);) + ident(BUFCHECK)operator(()ident(dirlen) operator(>) ident(buflen)operator(\);) + ident(strcpy)operator(()ident(buf)operator(,) ident(dir)operator(\);) + ident(free)operator(()ident(dir)operator(\);) + operator(}) + ident(p) operator(=) ident(chompdirsep)operator(()ident(skiproot)operator(()ident(buf)operator(\)\);) + ident(s) operator(+=) integer(2)operator(;) + operator(}) + operator(}) +preprocessor(#endif) + reserved(else) reserved(if) operator((!)ident(is_absolute_path)operator(()ident(s)operator(\)\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(dname)operator(\)\)) operator({) + ident(file_expand_path)operator(()ident(dname)operator(,) ident(Qnil)operator(,) ident(result)operator(\);) + ident(BUFINIT)operator((\);) + operator(}) + reserved(else) operator({) + pre_type(char) operator(*)ident(dir) operator(=) ident(my_getcwd)operator((\);) + + ident(tainted) operator(=) integer(1)operator(;) + ident(dirlen) operator(=) ident(strlen)operator(()ident(dir)operator(\);) + ident(BUFCHECK)operator(()ident(dirlen) operator(>) ident(buflen)operator(\);) + ident(strcpy)operator(()ident(buf)operator(,) ident(dir)operator(\);) + ident(free)operator(()ident(dir)operator(\);) + operator(}) +preprocessor(#if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__CYGWIN__) + reserved(if) operator(()ident(isdirsep)operator((*)ident(s)operator(\)\)) operator({) + comment(/* specified full path, but not drive letter nor UNC */) + comment(/* we need to get the drive letter or UNC share name */) + ident(p) operator(=) ident(skipprefix)operator(()ident(buf)operator(\);) + operator(}) + reserved(else) +preprocessor(#endif) + ident(p) operator(=) ident(chompdirsep)operator(()ident(skiproot)operator(()ident(buf)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(b) operator(=) ident(s)operator(;) + reserved(do) ident(s)operator(++;) reserved(while) operator(()ident(isdirsep)operator((*)ident(s)operator(\)\);) + ident(p) operator(=) ident(buf) operator(+) operator(()ident(s) operator(-) ident(b)operator(\);) + ident(BUFCHECK)operator(()ident(bdiff) operator(>=) ident(buflen)operator(\);) + ident(memset)operator(()ident(buf)operator(,) char('/')operator(,) ident(p) operator(-) ident(buf)operator(\);) + operator(}) + reserved(if) operator(()ident(p) operator(>) ident(buf) operator(&&) ident(p)operator([-)integer(1)operator(]) operator(==) char('/')operator(\)) + operator(--)ident(p)operator(;) + reserved(else) + operator(*)ident(p) operator(=) char('/')operator(;) + + ident(p)operator([)integer(1)operator(]) operator(=) integer(0)operator(;) + ident(root) operator(=) ident(skipprefix)operator(()ident(buf)operator(\);) + + ident(b) operator(=) ident(s)operator(;) + reserved(while) operator((*)ident(s)operator(\)) operator({) + reserved(switch) operator((*)ident(s)operator(\)) operator({) + reserved(case) char('.')operator(:) + reserved(if) operator(()ident(b) operator(==) ident(s)operator(++\)) operator({) comment(/* beginning of path element */) + reserved(switch) operator((*)ident(s)operator(\)) operator({) + reserved(case) char('\\0')operator(:) + ident(b) operator(=) ident(s)operator(;) + reserved(break)operator(;) + reserved(case) char('.')operator(:) + reserved(if) operator((*()ident(s)operator(+)integer(1)operator(\)) operator(==) char('\\0') operator(||) ident(isdirsep)operator((*()ident(s)operator(+)integer(1)operator(\)\)\)) operator({) + comment(/* We must go back to the parent */) + pre_type(char) operator(*)ident(n)operator(;) + operator(*)ident(p) operator(=) char('\\0')operator(;) + reserved(if) operator((!()ident(n) operator(=) ident(strrdirsep)operator(()ident(root)operator(\)\)\)) operator({) + operator(*)ident(p) operator(=) char('/')operator(;) + operator(}) + reserved(else) operator({) + ident(p) operator(=) ident(n)operator(;) + operator(}) + ident(b) operator(=) operator(++)ident(s)operator(;) + operator(}) +preprocessor(#if) ident(USE_NTFS) + reserved(else) operator({) + reserved(do) operator(*++)ident(s)operator(;) reserved(while) operator(()ident(istrailinggabage)operator((*)ident(s)operator(\)\);) + operator(}) +preprocessor(#endif) + reserved(break)operator(;) + reserved(case) char('/')operator(:) +preprocessor(#if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__CYGWIN__) + reserved(case) char('\\\\')operator(:) +preprocessor(#endif) + ident(b) operator(=) operator(++)ident(s)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + comment(/* ordinary path element, beginning don't move */) + reserved(break)operator(;) + operator(}) + operator(}) +preprocessor(#if) ident(USE_NTFS) + reserved(else) operator({) + operator(--)ident(s)operator(;) + reserved(case) char(' ')operator(:) operator({) + directive(const) pre_type(char) operator(*)ident(e) operator(=) ident(s)operator(;) + reserved(while) operator(()ident(istrailinggabage)operator((*)ident(s)operator(\)\)) ident(s)operator(++;) + reserved(if) operator((!*)ident(s)operator(\)) operator({) + ident(s) operator(=) ident(e)operator(;) + reserved(goto) ident(endpath)operator(;) + operator(}) + operator(}) + operator(}) +preprocessor(#endif) + reserved(break)operator(;) + reserved(case) char('/')operator(:) +preprocessor(#if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__CYGWIN__) + reserved(case) char('\\\\')operator(:) +preprocessor(#endif) + reserved(if) operator(()ident(s) operator(>) ident(b)operator(\)) operator({) + pre_type(long) ident(rootdiff) operator(=) ident(root) operator(-) ident(buf)operator(;) + ident(BUFCHECK)operator(()ident(bdiff) operator(+) operator(()ident(s)operator(-)ident(b)operator(+)integer(1)operator(\)) operator(>=) ident(buflen)operator(\);) + ident(root) operator(=) ident(buf) operator(+) ident(rootdiff)operator(;) + ident(memcpy)operator((++)ident(p)operator(,) ident(b)operator(,) ident(s)operator(-)ident(b)operator(\);) + ident(p) operator(+=) ident(s)operator(-)ident(b)operator(;) + operator(*)ident(p) operator(=) char('/')operator(;) + operator(}) + ident(b) operator(=) operator(++)ident(s)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(s) operator(=) ident(CharNext)operator(()ident(s)operator(\);) + reserved(break)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()ident(s) operator(>) ident(b)operator(\)) operator({) +preprocessor(#if) ident(USE_NTFS) + label(endpath)operator(:) + reserved(if) operator(()ident(s) operator(>) ident(b) operator(+) integer(6) operator(&&) ident(strncasecmp)operator(()ident(s) operator(-) integer(6)operator(,) string<delimiter(")content(:$DATA)delimiter(")>operator(,) integer(6)operator(\)) operator(==) integer(0)operator(\)) operator({) + comment(/* alias of stream */) + comment(/* get rid of a bug of x64 VC++ */) + reserved(if) operator((*()ident(s)operator(-)integer(7)operator(\)) operator(==) char(':')operator(\)) ident(s) operator(-=) integer(7)operator(;) comment(/* prime */) + reserved(else) reserved(if) operator(()ident(memchr)operator(()ident(b)operator(,) char(':')operator(,) ident(s) operator(-) integer(6) operator(-) ident(b)operator(\)\)) ident(s) operator(-=) integer(6)operator(;) comment(/* alternative */) + operator(}) +preprocessor(#endif) + ident(BUFCHECK)operator(()ident(bdiff) operator(+) operator(()ident(s)operator(-)ident(b)operator(\)) operator(>=) ident(buflen)operator(\);) + ident(memcpy)operator((++)ident(p)operator(,) ident(b)operator(,) ident(s)operator(-)ident(b)operator(\);) + ident(p) operator(+=) ident(s)operator(-)ident(b)operator(;) + operator(}) + reserved(if) operator(()ident(p) operator(==) ident(skiproot)operator(()ident(buf)operator(\)) operator(-) integer(1)operator(\)) ident(p)operator(++;) + +preprocessor(#if) ident(USE_NTFS) + operator(*)ident(p) operator(=) char('\\0')operator(;) + reserved(if) operator((()ident(s) operator(=) ident(strrdirsep)operator(()ident(b) operator(=) ident(buf)operator(\)\)) operator(!=) integer(0) operator(&&) operator(!)ident(strpbrk)operator(()ident(s)operator(,) string<delimiter(")content(*?)delimiter(")>operator(\)\)) operator({) + ident(size_t) ident(len)operator(;) + ident(WIN32_FIND_DATA) ident(wfd)operator(;) +preprocessor(#ifdef) ident(__CYGWIN__) + pre_type(int) ident(lnk_added) operator(=) integer(0)operator(,) ident(is_symlink) operator(=) integer(0)operator(;) + reserved(struct) ident(stat) ident(st)operator(;) + pre_type(char) ident(w32buf)operator([)ident(MAXPATHLEN)operator(];) + ident(p) operator(=) operator(()pre_type(char) operator(*\))ident(s)operator(;) + reserved(if) operator(()ident(lstat)operator(()ident(buf)operator(,) operator(&)ident(st)operator(\)) operator(==) integer(0) operator(&&) ident(S_ISLNK)operator(()ident(st)operator(.)ident(st_mode)operator(\)\)) operator({) + ident(is_symlink) operator(=) integer(1)operator(;) + operator(*)ident(p) operator(=) char('\\0')operator(;) + operator(}) + reserved(if) operator(()ident(cygwin_conv_to_win32_path)operator(((*)ident(buf) operator(?) ident(buf) operator(:) string<delimiter(")content(/)delimiter(")>operator(\),) ident(w32buf)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(b) operator(=) ident(w32buf)operator(;) + operator(}) + reserved(if) operator(()ident(is_symlink) operator(&&) ident(b) operator(==) ident(w32buf)operator(\)) operator({) + operator(*)ident(p) operator(=) char('\\\\')operator(;) + ident(strlcat)operator(()ident(w32buf)operator(,) ident(p)operator(,) reserved(sizeof)operator(()ident(w32buf)operator(\)\);) + ident(len) operator(=) ident(strlen)operator(()ident(p)operator(\);) + reserved(if) operator(()ident(len) operator(>) integer(4) operator(&&) ident(strcasecmp)operator(()ident(p) operator(+) ident(len) operator(-) integer(4)operator(,) string<delimiter(")content(.lnk)delimiter(")>operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(lnk_added) operator(=) integer(1)operator(;) + ident(strlcat)operator(()ident(w32buf)operator(,) string<delimiter(")content(.lnk)delimiter(")>operator(,) reserved(sizeof)operator(()ident(w32buf)operator(\)\);) + operator(}) + operator(}) + operator(*)ident(p) operator(=) char('/')operator(;) +preprocessor(#endif) + ident(HANDLE) ident(h) operator(=) ident(FindFirstFile)operator(()ident(b)operator(,) operator(&)ident(wfd)operator(\);) + reserved(if) operator(()ident(h) operator(!=) ident(INVALID_HANDLE_VALUE)operator(\)) operator({) + ident(FindClose)operator(()ident(h)operator(\);) + ident(len) operator(=) ident(strlen)operator(()ident(wfd)operator(.)ident(cFileName)operator(\);) +preprocessor(#ifdef) ident(__CYGWIN__) + reserved(if) operator(()ident(lnk_added) operator(&&) ident(len) operator(>) integer(4) operator(&&) + ident(strcasecmp)operator(()ident(wfd)operator(.)ident(cFileName) operator(+) ident(len) operator(-) integer(4)operator(,) string<delimiter(")content(.lnk)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(wfd)operator(.)ident(cFileName)operator([)ident(len) operator(-=) integer(4)operator(]) operator(=) char('\\0')operator(;) + operator(}) +preprocessor(#else) + ident(p) operator(=) operator(()pre_type(char) operator(*\))ident(s)operator(;) +preprocessor(#endif) + operator(++)ident(p)operator(;) + ident(BUFCHECK)operator(()ident(bdiff) operator(+) ident(len) operator(>=) ident(buflen)operator(\);) + ident(memcpy)operator(()ident(p)operator(,) ident(wfd)operator(.)ident(cFileName)operator(,) ident(len) operator(+) integer(1)operator(\);) + ident(p) operator(+=) ident(len)operator(;) + operator(}) +preprocessor(#ifdef) ident(__CYGWIN__) + reserved(else) operator({) + ident(p) operator(+=) ident(strlen)operator(()ident(p)operator(\);) + operator(}) +preprocessor(#endif) + operator(}) +preprocessor(#endif) + + reserved(if) operator(()ident(tainted)operator(\)) ident(OBJ_TAINT)operator(()ident(result)operator(\);) + ident(RSTRING)operator(()ident(result)operator(\)->)ident(len) operator(=) ident(p) operator(-) ident(buf)operator(;) + ident(RSTRING)operator(()ident(result)operator(\)->)ident(ptr)operator([)ident(p) operator(-) ident(buf)operator(]) operator(=) char('\\0')operator(;) + reserved(return) ident(result)operator(;) +operator(}) + +ident(VALUE) +ident(rb_file_expand_path)operator(()ident(fname)operator(,) ident(dname)operator(\)) + ident(VALUE) ident(fname)operator(,) ident(dname)operator(;) +operator({) + reserved(return) ident(file_expand_path)operator(()ident(fname)operator(,) ident(dname)operator(,) ident(rb_str_new)operator(()integer(0)operator(,) ident(MAXPATHLEN) operator(+) integer(2)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * File.expand_path(file_name [, dir_string] \) -> abs_file_name + * + * Converts a pathname to an absolute pathname. Relative paths are + * referenced from the current working directory of the process unless + * <i>dir_string</i> is given, in which case it will be used as the + * starting point. The given pathname may start with a + * ``<code>~</code>'', which expands to the process owner's home + * directory (the environment variable <code>HOME</code> must be set + * correctly\). ``<code>~</code><i>user</i>'' expands to the named + * user's home directory. + * + * File.expand_path("~oracle/bin"\) #=> "/home/oracle/bin" + * File.expand_path("../../bin", "/tmp/x"\) #=> "/bin" + */) + +ident(VALUE) +ident(rb_file_s_expand_path)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(fname)operator(,) ident(dname)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + reserved(return) ident(rb_file_expand_path)operator(()ident(argv)operator([)integer(0)operator(],) ident(Qnil)operator(\);) + operator(}) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(fname)operator(,) operator(&)ident(dname)operator(\);) + + reserved(return) ident(rb_file_expand_path)operator(()ident(fname)operator(,) ident(dname)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(rmext)operator(()ident(p)operator(,) ident(l1)operator(,) ident(e)operator(\)) + directive(const) pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(e)operator(;) + pre_type(int) ident(l1)operator(;) +operator({) + pre_type(int) ident(l2)operator(;) + + reserved(if) operator((!)ident(e)operator(\)) reserved(return) integer(0)operator(;) + + ident(l2) operator(=) ident(strlen)operator(()ident(e)operator(\);) + reserved(if) operator(()ident(l2) operator(==) integer(2) operator(&&) ident(e)operator([)integer(1)operator(]) operator(==) char('*')operator(\)) operator({) + pre_type(unsigned) pre_type(char) ident(c) operator(=) operator(*)ident(e)operator(;) + ident(e) operator(=) ident(p) operator(+) ident(l1)operator(;) + reserved(do) operator({) + reserved(if) operator(()ident(e) operator(<=) ident(p)operator(\)) reserved(return) integer(0)operator(;) + operator(}) reserved(while) operator((*--)ident(e) operator(!=) ident(c)operator(\);) + reserved(return) ident(e) operator(-) ident(p)operator(;) + operator(}) + reserved(if) operator(()ident(l1) operator(<) ident(l2)operator(\)) reserved(return) ident(l1)operator(;) + +preprocessor(#if) ident(CASEFOLD_FILESYSTEM) +preprocessor(#define) ident(fncomp) ident(strncasecmp) +preprocessor(#else) +preprocessor(#define) ident(fncomp) ident(strncmp) +preprocessor(#endif) + reserved(if) operator(()ident(fncomp)operator(()ident(p)operator(+)ident(l1)operator(-)ident(l2)operator(,) ident(e)operator(,) ident(l2)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(l1)operator(-)ident(l2)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.basename(file_name [, suffix] \) -> base_name + * + * Returns the last component of the filename given in <i>file_name</i>, + * which must be formed using forward slashes (``<code>/</code>''\) + * regardless of the separator used on the local file system. If + * <i>suffix</i> is given and present at the end of <i>file_name</i>, + * it is removed. + * + * File.basename("/home/gumby/work/ruby.rb"\) #=> "ruby.rb" + * File.basename("/home/gumby/work/ruby.rb", ".rb"\) #=> "ruby" + */) + +directive(static) ident(VALUE) +ident(rb_file_s_basename)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(fname)operator(,) ident(fext)operator(,) ident(basename)operator(;) + pre_type(char) operator(*)ident(name)operator(,) operator(*)ident(p)operator(;) +preprocessor(#if) ident(defined) ident(DOSISH_DRIVE_LETTER) operator(||) ident(defined) ident(DOSISH_UNC) + pre_type(char) operator(*)ident(root)operator(;) +preprocessor(#endif) + pre_type(int) ident(f)operator(,) ident(n)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(fname)operator(,) operator(&)ident(fext)operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(StringValue)operator(()ident(fext)operator(\);) + operator(}) + ident(StringValue)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(fname)operator(\)->)ident(len) operator(==) integer(0) operator(||) operator(!*()ident(name) operator(=) ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\)\)) + reserved(return) ident(fname)operator(;) + ident(name) operator(=) ident(skipprefix)operator(()ident(name)operator(\);) +preprocessor(#if) ident(defined) ident(DOSISH_DRIVE_LETTER) operator(||) ident(defined) ident(DOSISH_UNC) + ident(root) operator(=) ident(name)operator(;) +preprocessor(#endif) + reserved(while) operator(()ident(isdirsep)operator((*)ident(name)operator(\)\)) + ident(name)operator(++;) + reserved(if) operator((!*)ident(name)operator(\)) operator({) + ident(p) operator(=) ident(name) operator(-) integer(1)operator(;) + ident(f) operator(=) integer(1)operator(;) +preprocessor(#if) ident(defined) ident(DOSISH_DRIVE_LETTER) operator(||) ident(defined) ident(DOSISH_UNC) + reserved(if) operator(()ident(name) operator(!=) ident(root)operator(\)) operator({) + comment(/* has slashes */) + operator(}) +preprocessor(#ifdef) ident(DOSISH_DRIVE_LETTER) + reserved(else) reserved(if) operator((*)ident(p) operator(==) char(':')operator(\)) operator({) + ident(p)operator(++;) + ident(f) operator(=) integer(0)operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#ifdef) ident(DOSISH_UNC) + reserved(else) operator({) + ident(p) operator(=) string<delimiter(")content(/)delimiter(")>operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#endif) + operator(}) + reserved(else) operator({) + reserved(if) operator((!()ident(p) operator(=) ident(strrdirsep)operator(()ident(name)operator(\)\)\)) operator({) + ident(p) operator(=) ident(name)operator(;) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(isdirsep)operator((*)ident(p)operator(\)\)) ident(p)operator(++;) comment(/* skip last / */) + operator(}) +preprocessor(#if) ident(USE_NTFS) + ident(n) operator(=) ident(ntfs_tail)operator(()ident(p)operator(\)) operator(-) ident(p)operator(;) +preprocessor(#else) + ident(n) operator(=) ident(chompdirsep)operator(()ident(p)operator(\)) operator(-) ident(p)operator(;) +preprocessor(#endif) + reserved(if) operator(()ident(NIL_P)operator(()ident(fext)operator(\)) operator(||) operator(!()ident(f) operator(=) ident(rmext)operator(()ident(p)operator(,) ident(n)operator(,) ident(StringValueCStr)operator(()ident(fext)operator(\)\)\)\)) operator({) + ident(f) operator(=) ident(n)operator(;) + operator(}) + reserved(if) operator(()ident(f) operator(==) ident(RSTRING_LEN)operator(()ident(fname)operator(\)\)) reserved(return) ident(fname)operator(;) + operator(}) + ident(basename) operator(=) ident(rb_str_new)operator(()ident(p)operator(,) ident(f)operator(\);) + ident(OBJ_INFECT)operator(()ident(basename)operator(,) ident(fname)operator(\);) + reserved(return) ident(basename)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.dirname(file_name \) -> dir_name + * + * Returns all components of the filename given in <i>file_name</i> + * except the last one. The filename must be formed using forward + * slashes (``<code>/</code>''\) regardless of the separator used on the + * local file system. + * + * File.dirname("/home/gumby/work/ruby.rb"\) #=> "/home/gumby/work" + */) + +directive(static) ident(VALUE) +ident(rb_file_s_dirname)operator(()ident(klass)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(fname)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(name)operator(,) operator(*)ident(root)operator(,) operator(*)ident(p)operator(;) + ident(VALUE) ident(dirname)operator(;) + + ident(name) operator(=) ident(StringValueCStr)operator(()ident(fname)operator(\);) + ident(root) operator(=) ident(skiproot)operator(()ident(name)operator(\);) +preprocessor(#ifdef) ident(DOSISH_UNC) + reserved(if) operator(()ident(root) operator(>) ident(name) operator(+) integer(1) operator(&&) ident(isdirsep)operator((*)ident(name)operator(\)\)) + ident(root) operator(=) ident(skipprefix)operator(()ident(name) operator(=) ident(root) operator(-) integer(2)operator(\);) +preprocessor(#else) + reserved(if) operator(()ident(root) operator(>) ident(name) operator(+) integer(1)operator(\)) + ident(name) operator(=) ident(root) operator(-) integer(1)operator(;) +preprocessor(#endif) + ident(p) operator(=) ident(strrdirsep)operator(()ident(root)operator(\);) + reserved(if) operator((!)ident(p)operator(\)) operator({) + ident(p) operator(=) ident(root)operator(;) + operator(}) + reserved(if) operator(()ident(p) operator(==) ident(name)operator(\)) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(.)delimiter(")>operator(\);) +preprocessor(#ifdef) ident(DOSISH_DRIVE_LETTER) + reserved(if) operator(()ident(has_drive_letter)operator(()ident(name)operator(\)) operator(&&) ident(isdirsep)operator((*()ident(name) operator(+) integer(2)operator(\)\)\)) operator({) + directive(const) pre_type(char) operator(*)ident(top) operator(=) ident(skiproot)operator(()ident(name) operator(+) integer(2)operator(\);) + ident(dirname) operator(=) ident(rb_str_new)operator(()ident(name)operator(,) integer(3)operator(\);) + ident(rb_str_cat)operator(()ident(dirname)operator(,) ident(top)operator(,) ident(p) operator(-) ident(top)operator(\);) + operator(}) + reserved(else) +preprocessor(#endif) + ident(dirname) operator(=) ident(rb_str_new)operator(()ident(name)operator(,) ident(p) operator(-) ident(name)operator(\);) +preprocessor(#ifdef) ident(DOSISH_DRIVE_LETTER) + reserved(if) operator(()ident(has_drive_letter)operator(()ident(name)operator(\)) operator(&&) ident(root) operator(==) ident(name) operator(+) integer(2) operator(&&) ident(p) operator(-) ident(name) operator(==) integer(2)operator(\)) + ident(rb_str_cat)operator(()ident(dirname)operator(,) string<delimiter(")content(.)delimiter(")>operator(,) integer(1)operator(\);) +preprocessor(#endif) + ident(OBJ_INFECT)operator(()ident(dirname)operator(,) ident(fname)operator(\);) + reserved(return) ident(dirname)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.extname(path\) -> string + * + * Returns the extension (the portion of file name in <i>path</i> + * after the period\). + * + * File.extname("test.rb"\) #=> ".rb" + * File.extname("a/b/d/test.rb"\) #=> ".rb" + * File.extname("test"\) #=> "" + * File.extname(".profile"\) #=> "" + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_extname)operator(()ident(klass)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(fname)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(name)operator(,) operator(*)ident(p)operator(,) operator(*)ident(e)operator(;) + ident(VALUE) ident(extname)operator(;) + + ident(name) operator(=) ident(StringValueCStr)operator(()ident(fname)operator(\);) + ident(p) operator(=) ident(strrdirsep)operator(()ident(name)operator(\);) comment(/* get the last path component */) + reserved(if) operator((!)ident(p)operator(\)) + ident(p) operator(=) ident(name)operator(;) + reserved(else) + ident(name) operator(=) operator(++)ident(p)operator(;) + + ident(e) operator(=) integer(0)operator(;) + reserved(while) operator((*)ident(p)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('.') operator(||) ident(istrailinggabage)operator((*)ident(p)operator(\)\)) operator({) +preprocessor(#if) ident(USE_NTFS) + directive(const) pre_type(char) operator(*)ident(last) operator(=) ident(p)operator(++,) operator(*)ident(dot) operator(=) ident(last)operator(;) + reserved(while) operator(()ident(istrailinggabage)operator((*)ident(p)operator(\)\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('.')operator(\)) ident(dot) operator(=) ident(p)operator(;) + ident(p)operator(++;) + operator(}) + reserved(if) operator((!*)ident(p) operator(||) operator(*)ident(p) operator(==) char(':')operator(\)) operator({) + ident(p) operator(=) ident(last)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator((*)ident(last) operator(==) char('.') operator(||) ident(dot) operator(>) ident(last)operator(\)) ident(e) operator(=) ident(dot)operator(;) + reserved(continue)operator(;) +preprocessor(#else) + ident(e) operator(=) ident(p)operator(;) comment(/* get the last dot of the last component */) +preprocessor(#endif) + operator(}) +preprocessor(#if) ident(USE_NTFS) + reserved(else) reserved(if) operator((*)ident(p) operator(==) char(':')operator(\)) operator({) + reserved(break)operator(;) + operator(}) +preprocessor(#endif) + reserved(else) reserved(if) operator(()ident(isdirsep)operator((*)ident(p)operator(\)\)) + reserved(break)operator(;) + ident(p) operator(=) ident(CharNext)operator(()ident(p)operator(\);) + operator(}) + reserved(if) operator((!)ident(e) operator(||) ident(e) operator(==) ident(name) operator(||) ident(e)operator(+)integer(1) operator(==) ident(p)operator(\)) comment(/* no dot, or the only dot is first or end? */) + reserved(return) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\);) + ident(extname) operator(=) ident(rb_str_new)operator(()ident(e)operator(,) ident(p) operator(-) ident(e)operator(\);) comment(/* keep the dot, too! */) + ident(OBJ_INFECT)operator(()ident(extname)operator(,) ident(fname)operator(\);) + reserved(return) ident(extname)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.split(file_name\) => array + * + * Splits the given string into a directory and a file component and + * returns them in a two-element array. See also + * <code>File::dirname</code> and <code>File::basename</code>. + * + * File.split("/home/gumby/.profile"\) #=> ["/home/gumby", ".profile"] + */) + +directive(static) ident(VALUE) +ident(rb_file_s_split)operator(()ident(klass)operator(,) ident(path)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(path)operator(;) +operator({) + ident(StringValue)operator(()ident(path)operator(\);) comment(/* get rid of converting twice */) + reserved(return) ident(rb_assoc_new)operator(()ident(rb_file_s_dirname)operator(()ident(Qnil)operator(,) ident(path)operator(\),) ident(rb_file_s_basename)operator(()integer(1)operator(,&)ident(path)operator(\)\);) +operator(}) + +directive(static) ident(VALUE) ident(separator)operator(;) + +directive(static) ident(VALUE) ident(rb_file_join) ident(_)operator((()ident(VALUE) ident(ary)operator(,) ident(VALUE) ident(sep)operator(\)\);) + +directive(static) ident(VALUE) +ident(file_inspect_join)operator(()ident(ary)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) operator(*)ident(arg)operator(;) +operator({) + reserved(return) ident(rb_file_join)operator(()ident(arg)operator([)integer(0)operator(],) ident(arg)operator([)integer(1)operator(]\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_file_join)operator(()ident(ary)operator(,) ident(sep)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(sep)operator(;) +operator({) + pre_type(long) ident(len)operator(,) ident(i)operator(;) + pre_type(int) ident(taint) operator(=) integer(0)operator(;) + ident(VALUE) ident(result)operator(,) ident(tmp)operator(;) + pre_type(char) operator(*)ident(name)operator(,) operator(*)ident(tail)operator(;) + + reserved(if) operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(ary)operator(\)\)) ident(taint) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(sep)operator(\)\)) ident(taint) operator(=) integer(1)operator(;) + + ident(len) operator(=) integer(1)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(len) operator(+=) ident(RSTRING)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)->)ident(len)operator(;) + operator(}) + reserved(else) operator({) + ident(len) operator(+=) integer(10)operator(;) + operator(}) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(sep)operator(\)) operator(&&) ident(TYPE)operator(()ident(sep)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(len) operator(+=) ident(RSTRING)operator(()ident(sep)operator(\)->)ident(len) operator(*) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(-) integer(1)operator(;) + operator(}) + ident(result) operator(=) ident(rb_str_buf_new)operator(()ident(len)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(tmp) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + reserved(switch) operator(()ident(TYPE)operator(()ident(tmp)operator(\)\)) operator({) + reserved(case) label(T_STRING)operator(:) + reserved(break)operator(;) + reserved(case) label(T_ARRAY)operator(:) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(tmp)operator(\)\)) operator({) + ident(tmp) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content([...])delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(args)operator([)integer(2)operator(];) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(tmp)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(sep)operator(;) + ident(tmp) operator(=) ident(rb_protect_inspect)operator(()ident(file_inspect_join)operator(,) ident(ary)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(\);) + operator(}) + reserved(break)operator(;) + reserved(default)operator(:) + ident(StringValueCStr)operator(()ident(tmp)operator(\);) + operator(}) + ident(name) operator(=) ident(StringValueCStr)operator(()ident(result)operator(\);) + reserved(if) operator(()ident(i) operator(>) integer(0) operator(&&) operator(!)ident(NIL_P)operator(()ident(sep)operator(\)\)) operator({) + ident(tail) operator(=) ident(chompdirsep)operator(()ident(name)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr) operator(&&) ident(isdirsep)operator(()ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator([)integer(0)operator(]\)\)) operator({) + ident(RSTRING)operator(()ident(result)operator(\)->)ident(len) operator(=) ident(tail) operator(-) ident(name)operator(;) + operator(}) + reserved(else) reserved(if) operator((!*)ident(tail)operator(\)) operator({) + ident(rb_str_buf_append)operator(()ident(result)operator(,) ident(sep)operator(\);) + operator(}) + operator(}) + ident(rb_str_buf_append)operator(()ident(result)operator(,) ident(tmp)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(tmp)operator(\)\)) ident(taint) operator(=) integer(1)operator(;) + operator(}) + + reserved(if) operator(()ident(taint)operator(\)) ident(OBJ_TAINT)operator(()ident(result)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.join(string, ...\) -> path + * + * Returns a new string formed by joining the strings using + * <code>File::SEPARATOR</code>. + * + * File.join("usr", "mail", "gumby"\) #=> "usr/mail/gumby" + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_join)operator(()ident(klass)operator(,) ident(args)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(args)operator(;) +operator({) + reserved(return) ident(rb_file_join)operator(()ident(args)operator(,) ident(separator)operator(\);) +operator(}) + +comment(/* + * call-seq: + * File.truncate(file_name, integer\) => 0 + * + * Truncates the file <i>file_name</i> to be at most <i>integer</i> + * bytes long. Not available on all platforms. + * + * f = File.new("out", "w"\) + * f.write("1234567890"\) #=> 10 + * f.close #=> nil + * File.truncate("out", 5\) #=> 0 + * File.size("out"\) #=> 5 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_s_truncate)operator(()ident(klass)operator(,) ident(path)operator(,) ident(len)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(path)operator(,) ident(len)operator(;) +operator({) + ident(off_t) ident(pos)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(pos) operator(=) ident(NUM2OFFT)operator(()ident(len)operator(\);) + ident(SafeStringValue)operator(()ident(path)operator(\);) + +preprocessor(#ifdef) ident(HAVE_TRUNCATE) + reserved(if) operator(()ident(truncate)operator(()ident(StringValueCStr)operator(()ident(path)operator(\),) ident(pos)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) +preprocessor(#else) +preprocessor(# ifdef) ident(HAVE_CHSIZE) + operator({) + pre_type(int) ident(tmpfd)operator(;) + +preprocessor(# ifdef) ident(_WIN32) + reserved(if) operator((()ident(tmpfd) operator(=) ident(open)operator(()ident(StringValueCStr)operator(()ident(path)operator(\),) ident(O_RDWR)operator(\)\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) + operator(}) +preprocessor(# else) + reserved(if) operator((()ident(tmpfd) operator(=) ident(open)operator(()ident(StringValueCStr)operator(()ident(path)operator(\),) integer(0)operator(\)\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) + operator(}) +preprocessor(# endif) + reserved(if) operator(()ident(chsize)operator(()ident(tmpfd)operator(,) ident(pos)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(close)operator(()ident(tmpfd)operator(\);) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) + operator(}) + ident(close)operator(()ident(tmpfd)operator(\);) + operator(}) +preprocessor(# else) + ident(rb_notimplement)operator((\);) +preprocessor(# endif) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * file.truncate(integer\) => 0 + * + * Truncates <i>file</i> to at most <i>integer</i> bytes. The file + * must be opened for writing. Not available on all platforms. + * + * f = File.new("out", "w"\) + * f.syswrite("1234567890"\) #=> 10 + * f.truncate(5\) #=> 0 + * f.close(\) #=> nil + * File.size("out"\) #=> 5 + */) + +directive(static) ident(VALUE) +ident(rb_file_truncate)operator(()ident(obj)operator(,) ident(len)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(len)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(FILE) operator(*)ident(f)operator(;) + ident(off_t) ident(pos)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(pos) operator(=) ident(NUM2OFFT)operator(()ident(len)operator(\);) + ident(GetOpenFile)operator(()ident(obj)operator(,) ident(fptr)operator(\);) + reserved(if) operator((!()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WRITABLE)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(not opened for writing)delimiter(")>operator(\);) + operator(}) + ident(f) operator(=) ident(GetWriteFile)operator(()ident(fptr)operator(\);) + ident(fflush)operator(()ident(f)operator(\);) + ident(fseeko)operator(()ident(f)operator(,) operator(()ident(off_t)operator(\))integer(0)operator(,) ident(SEEK_CUR)operator(\);) +preprocessor(#ifdef) ident(HAVE_FTRUNCATE) + reserved(if) operator(()ident(ftruncate)operator(()ident(fileno)operator(()ident(f)operator(\),) ident(pos)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) +preprocessor(#else) +preprocessor(# ifdef) ident(HAVE_CHSIZE) + reserved(if) operator(()ident(chsize)operator(()ident(fileno)operator(()ident(f)operator(\),) ident(pos)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) +preprocessor(# else) + ident(rb_notimplement)operator((\);) +preprocessor(# endif) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +preprocessor(# ifndef) ident(LOCK_SH) +preprocessor(# define) ident(LOCK_SH) integer(1) +preprocessor(# endif) +preprocessor(# ifndef) ident(LOCK_EX) +preprocessor(# define) ident(LOCK_EX) integer(2) +preprocessor(# endif) +preprocessor(# ifndef) ident(LOCK_NB) +preprocessor(# define) ident(LOCK_NB) integer(4) +preprocessor(# endif) +preprocessor(# ifndef) ident(LOCK_UN) +preprocessor(# define) ident(LOCK_UN) integer(8) +preprocessor(# endif) + +preprocessor(#ifdef) ident(__CYGWIN__) +preprocessor(#include) include(<winerror.h>) +directive(extern) pre_type(unsigned) pre_type(long) ident(__attribute__)operator((()ident(stdcall)operator(\)\)) ident(GetLastError)operator(()directive(void)operator(\);) + +directive(static) pre_type(int) +ident(cygwin_flock)operator(()pre_type(int) ident(fd)operator(,) pre_type(int) ident(op)operator(\)) +operator({) + pre_type(int) ident(old_errno) operator(=) ident(errno)operator(;) + pre_type(int) ident(ret) operator(=) ident(flock)operator(()ident(fd)operator(,) ident(op)operator(\);) + reserved(if) operator(()ident(GetLastError)operator((\)) operator(==) ident(ERROR_NOT_LOCKED)operator(\)) operator({) + ident(ret) operator(=) integer(0)operator(;) + ident(errno) operator(=) ident(old_errno)operator(;) + operator(}) + reserved(return) ident(ret)operator(;) +operator(}) +preprocessor(# define) ident(flock)operator(()ident(fd)operator(,) ident(op)operator(\)) ident(cygwin_flock)operator(()ident(fd)operator(,) ident(op)operator(\)) +preprocessor(#endif) + +directive(static) pre_type(int) +ident(rb_thread_flock)operator(()ident(fd)operator(,) ident(op)operator(,) ident(fptr)operator(\)) + pre_type(int) ident(fd)operator(,) ident(op)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + reserved(if) operator(()ident(rb_thread_alone)operator((\)) operator(||) operator(()ident(op) operator(&) ident(LOCK_NB)operator(\)\)) operator({) + pre_type(int) ident(ret)operator(;) + ident(TRAP_BEG)operator(;) + ident(ret) operator(=) ident(flock)operator(()ident(fd)operator(,) ident(op)operator(\);) + ident(TRAP_END)operator(;) + reserved(return) ident(ret)operator(;) + operator(}) + ident(op) operator(|=) ident(LOCK_NB)operator(;) + reserved(while) operator(()ident(flock)operator(()ident(fd)operator(,) ident(op)operator(\)) operator(<) integer(0)operator(\)) operator({) + reserved(switch) operator(()ident(errno)operator(\)) operator({) + reserved(case) label(EAGAIN)operator(:) + reserved(case) label(EACCES)operator(:) +preprocessor(#if) ident(defined)operator(()ident(EWOULDBLOCK)operator(\)) operator(&&) ident(EWOULDBLOCK) operator(!=) ident(EAGAIN) + reserved(case) label(EWOULDBLOCK)operator(:) +preprocessor(#endif) + ident(rb_thread_polling)operator((\);) comment(/* busy wait */) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + reserved(continue)operator(;) + reserved(default)operator(:) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) +preprocessor(#ifdef) ident(__CYGWIN__) +preprocessor(# undef) ident(flock) +preprocessor(#endif) +preprocessor(#define) ident(flock)operator(()ident(fd)operator(,) ident(op)operator(\)) ident(rb_thread_flock)operator(()ident(fd)operator(,) ident(op)operator(,) ident(fptr)operator(\)) + +comment(/* + * call-seq: + * file.flock (locking_constant \) => 0 or false + * + * Locks or unlocks a file according to <i>locking_constant</i> (a + * logical <em>or</em> of the values in the table below\). + * Returns <code>false</code> if <code>File::LOCK_NB</code> is + * specified and the operation would otherwise have blocked. Not + * available on all platforms. + * + * Locking constants (in class File\): + * + * LOCK_EX | Exclusive lock. Only one process may hold an + * | exclusive lock for a given file at a time. + * ----------+------------------------------------------------ + * LOCK_NB | Don't block when locking. May be combined + * | with other lock options using logical or. + * ----------+------------------------------------------------ + * LOCK_SH | Shared lock. Multiple processes may each hold a + * | shared lock for a given file at the same time. + * ----------+------------------------------------------------ + * LOCK_UN | Unlock. + * + * Example: + * + * File.new("testfile"\).flock(File::LOCK_UN\) #=> 0 + * + */) + +directive(static) ident(VALUE) +ident(rb_file_flock)operator(()ident(obj)operator(,) ident(operation)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(VALUE) ident(operation)operator(;) +operator({) +preprocessor(#ifndef) ident(__CHECKER__) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(op)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(op) operator(=) ident(NUM2INT)operator(()ident(operation)operator(\);) + ident(GetOpenFile)operator(()ident(obj)operator(,) ident(fptr)operator(\);) + + reserved(if) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WRITABLE)operator(\)) operator({) + ident(fflush)operator(()ident(GetWriteFile)operator(()ident(fptr)operator(\)\);) + operator(}) + label(retry)operator(:) + reserved(if) operator(()ident(flock)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(op)operator(\)) operator(<) integer(0)operator(\)) operator({) + reserved(switch) operator(()ident(errno)operator(\)) operator({) + reserved(case) label(EAGAIN)operator(:) + reserved(case) label(EACCES)operator(:) +preprocessor(#if) ident(defined)operator(()ident(EWOULDBLOCK)operator(\)) operator(&&) ident(EWOULDBLOCK) operator(!=) ident(EAGAIN) + reserved(case) label(EWOULDBLOCK)operator(:) +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) + reserved(case) label(EINTR)operator(:) +preprocessor(#if) ident(defined)operator(()ident(ERESTART)operator(\)) + reserved(case) label(ERESTART)operator(:) +preprocessor(#endif) + reserved(goto) ident(retry)operator(;) + operator(}) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) +preprocessor(#undef) ident(flock) + +directive(static) directive(void) +ident(test_check)operator(()ident(n)operator(,) ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(n)operator(,) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + ident(n)operator(+=)integer(1)operator(;) + reserved(if) operator(()ident(n) operator(!=) ident(argc)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for %d\))delimiter(")>operator(,) ident(argc)operator(,) ident(n)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(1)operator(;) ident(i)operator(<)ident(n)operator(;) ident(i)operator(++\)) operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(argv)operator([)ident(i)operator(]\)\)) operator({) + reserved(case) label(T_STRING)operator(:) + reserved(default)operator(:) + ident(SafeStringValue)operator(()ident(argv)operator([)ident(i)operator(]\);) + reserved(break)operator(;) + reserved(case) label(T_FILE)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) +operator(}) + +preprocessor(#define) ident(CHECK)operator(()ident(n)operator(\)) ident(test_check)operator((()ident(n)operator(\),) ident(argc)operator(,) ident(argv)operator(\)) + +comment(/* + * call-seq: + * test(int_cmd, file1 [, file2] \) => obj + * + * Uses the integer <i>aCmd</i> to perform various tests on + * <i>file1</i> (first table below\) or on <i>file1</i> and + * <i>file2</i> (second table\). + * + * File tests on a single file: + * + * Test Returns Meaning + * ?A | Time | Last access time for file1 + * ?b | boolean | True if file1 is a block device + * ?c | boolean | True if file1 is a character device + * ?C | Time | Last change time for file1 + * ?d | boolean | True if file1 exists and is a directory + * ?e | boolean | True if file1 exists + * ?f | boolean | True if file1 exists and is a regular file + * ?g | boolean | True if file1 has the \\CF{setgid} bit + * | | set (false under NT\) + * ?G | boolean | True if file1 exists and has a group + * | | ownership equal to the caller's group + * ?k | boolean | True if file1 exists and has the sticky bit set + * ?l | boolean | True if file1 exists and is a symbolic link + * ?M | Time | Last modification time for file1 + * ?o | boolean | True if file1 exists and is owned by + * | | the caller's effective uid + * ?O | boolean | True if file1 exists and is owned by + * | | the caller's real uid + * ?p | boolean | True if file1 exists and is a fifo + * ?r | boolean | True if file1 is readable by the effective + * | | uid/gid of the caller + * ?R | boolean | True if file is readable by the real + * | | uid/gid of the caller + * ?s | int/nil | If file1 has nonzero size, return the size, + * | | otherwise return nil + * ?S | boolean | True if file1 exists and is a socket + * ?u | boolean | True if file1 has the setuid bit set + * ?w | boolean | True if file1 exists and is writable by + * | | the effective uid/gid + * ?W | boolean | True if file1 exists and is writable by + * | | the real uid/gid + * ?x | boolean | True if file1 exists and is executable by + * | | the effective uid/gid + * ?X | boolean | True if file1 exists and is executable by + * | | the real uid/gid + * ?z | boolean | True if file1 exists and has a zero length + * + * Tests that take two files: + * + * ?- | boolean | True if file1 and file2 are identical + * ?= | boolean | True if the modification times of file1 + * | | and file2 are equal + * ?< | boolean | True if the modification time of file1 + * | | is prior to that of file2 + * ?> | boolean | True if the modification time of file1 + * | | is after that of file2 + */) + +directive(static) ident(VALUE) +ident(rb_f_test)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + pre_type(int) ident(cmd)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) +comment(#if 0 /* 1.7 behavior? */ + if (argc == 1\) { + return RTEST(argv[0]\) ? Qtrue : Qfalse; + } +#endif) + ident(cmd) operator(=) ident(NUM2CHR)operator(()ident(argv)operator([)integer(0)operator(]\);) + reserved(if) operator(()ident(cmd) operator(==) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(strchr)operator(()string<delimiter(")content(bcdefgGkloOprRsSuwWxXz)delimiter(")>operator(,) ident(cmd)operator(\)\)) operator({) + ident(CHECK)operator(()integer(1)operator(\);) + reserved(switch) operator(()ident(cmd)operator(\)) operator({) + reserved(case) char('b')operator(:) + reserved(return) ident(test_b)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('c')operator(:) + reserved(return) ident(test_c)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('d')operator(:) + reserved(return) ident(test_d)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('a')operator(:) + reserved(case) char('e')operator(:) + reserved(return) ident(test_e)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('f')operator(:) + reserved(return) ident(test_f)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('g')operator(:) + reserved(return) ident(test_sgid)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('G')operator(:) + reserved(return) ident(test_grpowned)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('k')operator(:) + reserved(return) ident(test_sticky)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('l')operator(:) + reserved(return) ident(test_l)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('o')operator(:) + reserved(return) ident(test_owned)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('O')operator(:) + reserved(return) ident(test_rowned)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('p')operator(:) + reserved(return) ident(test_p)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('r')operator(:) + reserved(return) ident(test_r)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('R')operator(:) + reserved(return) ident(test_R)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('s')operator(:) + reserved(return) ident(test_s)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('S')operator(:) + reserved(return) ident(test_S)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('u')operator(:) + reserved(return) ident(test_suid)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('w')operator(:) + reserved(return) ident(test_w)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('W')operator(:) + reserved(return) ident(test_W)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('x')operator(:) + reserved(return) ident(test_x)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('X')operator(:) + reserved(return) ident(test_X)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + + reserved(case) char('z')operator(:) + reserved(return) ident(test_z)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(]\);) + operator(}) + operator(}) + + reserved(if) operator(()ident(strchr)operator(()string<delimiter(")content(MAC)delimiter(")>operator(,) ident(cmd)operator(\)\)) operator({) + reserved(struct) ident(stat) ident(st)operator(;) + + ident(CHECK)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(rb_stat)operator(()ident(argv)operator([)integer(1)operator(],) operator(&)ident(st)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(argv)operator([)integer(1)operator(]\)->)ident(ptr)operator(\);) + operator(}) + + reserved(switch) operator(()ident(cmd)operator(\)) operator({) + reserved(case) char('A')operator(:) + reserved(return) ident(rb_time_new)operator(()ident(st)operator(.)ident(st_atime)operator(,) integer(0)operator(\);) + reserved(case) char('M')operator(:) + reserved(return) ident(rb_time_new)operator(()ident(st)operator(.)ident(st_mtime)operator(,) integer(0)operator(\);) + reserved(case) char('C')operator(:) + reserved(return) ident(rb_time_new)operator(()ident(st)operator(.)ident(st_ctime)operator(,) integer(0)operator(\);) + operator(}) + operator(}) + + reserved(if) operator(()ident(cmd) operator(==) char('-')operator(\)) operator({) + ident(CHECK)operator(()integer(2)operator(\);) + reserved(return) ident(test_identical)operator(()integer(0)operator(,) ident(argv)operator([)integer(1)operator(],) ident(argv)operator([)integer(2)operator(]\);) + operator(}) + + reserved(if) operator(()ident(strchr)operator(()string<delimiter(")content(=<>)delimiter(")>operator(,) ident(cmd)operator(\)\)) operator({) + reserved(struct) ident(stat) ident(st1)operator(,) ident(st2)operator(;) + + ident(CHECK)operator(()integer(2)operator(\);) + reserved(if) operator(()ident(rb_stat)operator(()ident(argv)operator([)integer(1)operator(],) operator(&)ident(st1)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(rb_stat)operator(()ident(argv)operator([)integer(2)operator(],) operator(&)ident(st2)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + + reserved(switch) operator(()ident(cmd)operator(\)) operator({) + reserved(case) char('=')operator(:) + reserved(if) operator(()ident(st1)operator(.)ident(st_mtime) operator(==) ident(st2)operator(.)ident(st_mtime)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + + reserved(case) char('>')operator(:) + reserved(if) operator(()ident(st1)operator(.)ident(st_mtime) operator(>) ident(st2)operator(.)ident(st_mtime)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + + reserved(case) char('<')operator(:) + reserved(if) operator(()ident(st1)operator(.)ident(st_mtime) operator(<) ident(st2)operator(.)ident(st_mtime)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + operator(}) + comment(/* unknown command */) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(unknown command ?%c)delimiter(")>operator(,) ident(cmd)operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + + +comment(/* + * Document-class: File::Stat + * + * Objects of class <code>File::Stat</code> encapsulate common status + * information for <code>File</code> objects. The information is + * recorded at the moment the <code>File::Stat</code> object is + * created; changes made to the file after that point will not be + * reflected. <code>File::Stat</code> objects are returned by + * <code>IO#stat</code>, <code>File::stat</code>, + * <code>File#lstat</code>, and <code>File::lstat</code>. Many of these + * methods return platform-specific values, and not all values are + * meaningful on all systems. See also <code>Kernel#test</code>. + */) + +directive(static) ident(VALUE) ident(rb_stat_s_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(rb_stat_s_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(return) ident(stat_new_0)operator(()ident(klass)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * + * File::Stat.new(file_name\) => stat + * + * Create a File::Stat object for the given file name (raising an + * exception if the file doesn't exist\). + */) + +directive(static) ident(VALUE) +ident(rb_stat_init)operator(()ident(obj)operator(,) ident(fname)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(fname)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(,) operator(*)ident(nst)operator(;) + + ident(SafeStringValue)operator(()ident(fname)operator(\);) + + reserved(if) operator(()ident(stat)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) operator(&)ident(st)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\);) + operator(}) + reserved(if) operator(()ident(DATA_PTR)operator(()ident(obj)operator(\)\)) operator({) + ident(free)operator(()ident(DATA_PTR)operator(()ident(obj)operator(\)\);) + ident(DATA_PTR)operator(()ident(obj)operator(\)) operator(=) pre_constant(NULL)operator(;) + operator(}) + ident(nst) operator(=) ident(ALLOC)operator(()reserved(struct) ident(stat)operator(\);) + operator(*)ident(nst) operator(=) ident(st)operator(;) + ident(DATA_PTR)operator(()ident(obj)operator(\)) operator(=) ident(nst)operator(;) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(rb_stat_init_copy)operator(()ident(copy)operator(,) ident(orig)operator(\)) + ident(VALUE) ident(copy)operator(,) ident(orig)operator(;) +operator({) + reserved(struct) ident(stat) operator(*)ident(nst)operator(;) + + reserved(if) operator(()ident(copy) operator(==) ident(orig)operator(\)) reserved(return) ident(orig)operator(;) + ident(rb_check_frozen)operator(()ident(copy)operator(\);) + comment(/* need better argument type check */) + reserved(if) operator((!)ident(rb_obj_is_instance_of)operator(()ident(orig)operator(,) ident(rb_obj_class)operator(()ident(copy)operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument class)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(DATA_PTR)operator(()ident(copy)operator(\)\)) operator({) + ident(free)operator(()ident(DATA_PTR)operator(()ident(copy)operator(\)\);) + ident(DATA_PTR)operator(()ident(copy)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(DATA_PTR)operator(()ident(orig)operator(\)\)) operator({) + ident(nst) operator(=) ident(ALLOC)operator(()reserved(struct) ident(stat)operator(\);) + operator(*)ident(nst) operator(=) operator(*()reserved(struct) ident(stat)operator(*\))ident(DATA_PTR)operator(()ident(orig)operator(\);) + ident(DATA_PTR)operator(()ident(copy)operator(\)) operator(=) ident(nst)operator(;) + operator(}) + + reserved(return) ident(copy)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.ftype => string + * + * Identifies the type of <i>stat</i>. The return string is one of: + * ``<code>file</code>'', ``<code>directory</code>'', + * ``<code>characterSpecial</code>'', ``<code>blockSpecial</code>'', + * ``<code>fifo</code>'', ``<code>link</code>'', + * ``<code>socket</code>'', or ``<code>unknown</code>''. + * + * File.stat("/dev/tty"\).ftype #=> "characterSpecial" + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_ftype)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_file_ftype)operator(()ident(get_stat)operator(()ident(obj)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * stat.directory? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a directory, + * <code>false</code> otherwise. + * + * File.stat("testfile"\).directory? #=> false + * File.stat("."\).directory? #=> true + */) + +directive(static) ident(VALUE) +ident(rb_stat_d)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(S_ISDIR)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.pipe? => true or false + * + * Returns <code>true</code> if the operating system supports pipes and + * <i>stat</i> is a pipe; <code>false</code> otherwise. + */) + +directive(static) ident(VALUE) +ident(rb_stat_p)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#ifdef) ident(S_IFIFO) + reserved(if) operator(()ident(S_ISFIFO)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.symlink? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a symbolic link, + * <code>false</code> if it isn't or if the operating system doesn't + * support this feature. As <code>File::stat</code> automatically + * follows symbolic links, <code>symlink?</code> will always be + * <code>false</code> for an object returned by + * <code>File::stat</code>. + * + * File.symlink("testfile", "alink"\) #=> 0 + * File.stat("alink"\).symlink? #=> false + * File.lstat("alink"\).symlink? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_l)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#ifdef) ident(S_ISLNK) + reserved(if) operator(()ident(S_ISLNK)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.socket? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a socket, + * <code>false</code> if it isn't or if the operating system doesn't + * support this feature. + * + * File.stat("testfile"\).socket? #=> false + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_S)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#ifdef) ident(S_ISSOCK) + reserved(if) operator(()ident(S_ISSOCK)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.blockdev? => true or false + * + * Returns <code>true</code> if the file is a block device, + * <code>false</code> if it isn't or if the operating system doesn't + * support this feature. + * + * File.stat("testfile"\).blockdev? #=> false + * File.stat("/dev/hda1"\).blockdev? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_b)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#ifdef) ident(S_ISBLK) + reserved(if) operator(()ident(S_ISBLK)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.chardev? => true or false + * + * Returns <code>true</code> if the file is a character device, + * <code>false</code> if it isn't or if the operating system doesn't + * support this feature. + * + * File.stat("/dev/tty"\).chardev? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_c)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(S_ISCHR)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.owned? => true or false + * + * Returns <code>true</code> if the effective user id of the process is + * the same as the owner of <i>stat</i>. + * + * File.stat("testfile"\).owned? #=> true + * File.stat("/etc/passwd"\).owned? #=> false + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_owned)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_uid) operator(==) ident(geteuid)operator((\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_stat_rowned)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_uid) operator(==) ident(getuid)operator((\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.grpowned? => true or false + * + * Returns true if the effective group id of the process is the same as + * the group id of <i>stat</i>. On Windows NT, returns <code>false</code>. + * + * File.stat("testfile"\).grpowned? #=> true + * File.stat("/etc/passwd"\).grpowned? #=> false + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_grpowned)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#ifndef) ident(_WIN32) + reserved(if) operator(()ident(group_member)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_gid)operator(\)\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.readable? => true or false + * + * Returns <code>true</code> if <i>stat</i> is readable by the + * effective user id of this process. + * + * File.stat("testfile"\).readable? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_r)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(struct) ident(stat) operator(*)ident(st) operator(=) ident(get_stat)operator(()ident(obj)operator(\);) + +preprocessor(#ifdef) ident(USE_GETEUID) + reserved(if) operator(()ident(geteuid)operator((\)) operator(==) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IRUSR) + reserved(if) operator(()ident(rb_stat_owned)operator(()ident(obj)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IRUSR) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IRGRP) + reserved(if) operator(()ident(rb_stat_grpowned)operator(()ident(obj)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IRGRP) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IROTH) + reserved(if) operator((!()ident(st)operator(->)ident(st_mode) operator(&) ident(S_IROTH)operator(\)\)) reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.readable_real? -> true or false + * + * Returns <code>true</code> if <i>stat</i> is readable by the real + * user id of this process. + * + * File.stat("testfile"\).readable_real? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_R)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(struct) ident(stat) operator(*)ident(st) operator(=) ident(get_stat)operator(()ident(obj)operator(\);) + +preprocessor(#ifdef) ident(USE_GETEUID) + reserved(if) operator(()ident(getuid)operator((\)) operator(==) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IRUSR) + reserved(if) operator(()ident(rb_stat_rowned)operator(()ident(obj)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IRUSR) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IRGRP) + reserved(if) operator(()ident(group_member)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_gid)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IRGRP) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IROTH) + reserved(if) operator((!()ident(st)operator(->)ident(st_mode) operator(&) ident(S_IROTH)operator(\)\)) reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.writable? -> true or false + * + * Returns <code>true</code> if <i>stat</i> is writable by the + * effective user id of this process. + * + * File.stat("testfile"\).writable? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_w)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(struct) ident(stat) operator(*)ident(st) operator(=) ident(get_stat)operator(()ident(obj)operator(\);) + +preprocessor(#ifdef) ident(USE_GETEUID) + reserved(if) operator(()ident(geteuid)operator((\)) operator(==) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IWUSR) + reserved(if) operator(()ident(rb_stat_owned)operator(()ident(obj)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IWUSR) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IWGRP) + reserved(if) operator(()ident(rb_stat_grpowned)operator(()ident(obj)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IWGRP) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IWOTH) + reserved(if) operator((!()ident(st)operator(->)ident(st_mode) operator(&) ident(S_IWOTH)operator(\)\)) reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.writable_real? -> true or false + * + * Returns <code>true</code> if <i>stat</i> is writable by the real + * user id of this process. + * + * File.stat("testfile"\).writable_real? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_W)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(struct) ident(stat) operator(*)ident(st) operator(=) ident(get_stat)operator(()ident(obj)operator(\);) + +preprocessor(#ifdef) ident(USE_GETEUID) + reserved(if) operator(()ident(getuid)operator((\)) operator(==) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IWUSR) + reserved(if) operator(()ident(rb_stat_rowned)operator(()ident(obj)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IWUSR) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IWGRP) + reserved(if) operator(()ident(group_member)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_gid)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IWGRP) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IWOTH) + reserved(if) operator((!()ident(st)operator(->)ident(st_mode) operator(&) ident(S_IWOTH)operator(\)\)) reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.executable? => true or false + * + * Returns <code>true</code> if <i>stat</i> is executable or if the + * operating system doesn't distinguish executable files from + * nonexecutable files. The tests are made using the effective owner of + * the process. + * + * File.stat("testfile"\).executable? #=> false + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_x)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(struct) ident(stat) operator(*)ident(st) operator(=) ident(get_stat)operator(()ident(obj)operator(\);) + +preprocessor(#ifdef) ident(USE_GETEUID) + reserved(if) operator(()ident(geteuid)operator((\)) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IXUGO) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IXUSR) + reserved(if) operator(()ident(rb_stat_owned)operator(()ident(obj)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IXUSR) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IXGRP) + reserved(if) operator(()ident(rb_stat_grpowned)operator(()ident(obj)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IXGRP) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IXOTH) + reserved(if) operator((!()ident(st)operator(->)ident(st_mode) operator(&) ident(S_IXOTH)operator(\)\)) reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.executable_real? => true or false + * + * Same as <code>executable?</code>, but tests using the real owner of + * the process. + */) + +directive(static) ident(VALUE) +ident(rb_stat_X)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(struct) ident(stat) operator(*)ident(st) operator(=) ident(get_stat)operator(()ident(obj)operator(\);) + +preprocessor(#ifdef) ident(USE_GETEUID) + reserved(if) operator(()ident(getuid)operator((\)) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IXUGO) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IXUSR) + reserved(if) operator(()ident(rb_stat_rowned)operator(()ident(obj)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IXUSR) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IXGRP) + reserved(if) operator(()ident(group_member)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_gid)operator(\)\)) + reserved(return) ident(st)operator(->)ident(st_mode) operator(&) ident(S_IXGRP) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(S_IXOTH) + reserved(if) operator((!()ident(st)operator(->)ident(st_mode) operator(&) ident(S_IXOTH)operator(\)\)) reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.file? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a regular file (not + * a device file, pipe, socket, etc.\). + * + * File.stat("testfile"\).file? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_f)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(S_ISREG)operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.zero? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a zero-length file; + * <code>false</code> otherwise. + * + * File.stat("testfile"\).zero? #=> false + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_z)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_size) operator(==) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * state.size => integer + * + * Returns the size of <i>stat</i> in bytes. + * + * File.stat("testfile"\).size #=> 66 + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_s)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(off_t) ident(size) operator(=) ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_size)operator(;) + + reserved(if) operator(()ident(size) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(OFFT2NUM)operator(()ident(size)operator(\);) +operator(}) + +comment(/* + * call-seq: + * stat.setuid? => true or false + * + * Returns <code>true</code> if <i>stat</i> has the set-user-id + * permission bit set, <code>false</code> if it doesn't or if the + * operating system doesn't support this feature. + * + * File.stat("/bin/su"\).setuid? #=> true + */) + +directive(static) ident(VALUE) +ident(rb_stat_suid)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#ifdef) ident(S_ISUID) + reserved(if) operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode) operator(&) ident(S_ISUID)operator(\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.setgid? => true or false + * + * Returns <code>true</code> if <i>stat</i> has the set-group-id + * permission bit set, <code>false</code> if it doesn't or if the + * operating system doesn't support this feature. + * + * File.stat("/usr/sbin/lpc"\).setgid? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_sgid)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#ifdef) ident(S_ISGID) + reserved(if) operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode) operator(&) ident(S_ISGID)operator(\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * stat.sticky? => true or false + * + * Returns <code>true</code> if <i>stat</i> has its sticky bit set, + * <code>false</code> if it doesn't or if the operating system doesn't + * support this feature. + * + * File.stat("testfile"\).sticky? #=> false + * + */) + +directive(static) ident(VALUE) +ident(rb_stat_sticky)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#ifdef) ident(S_ISVTX) + reserved(if) operator(()ident(get_stat)operator(()ident(obj)operator(\)->)ident(st_mode) operator(&) ident(S_ISVTX)operator(\)) reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +ident(VALUE) ident(rb_mFConst)operator(;) + +directive(void) +ident(rb_file_const)operator(()ident(name)operator(,) ident(value)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(value)operator(;) +operator({) + ident(rb_define_const)operator(()ident(rb_mFConst)operator(,) ident(name)operator(,) ident(value)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(is_absolute_path)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) +preprocessor(#ifdef) ident(DOSISH_DRIVE_LETTER) + reserved(if) operator(()ident(has_drive_letter)operator(()ident(path)operator(\)) operator(&&) ident(isdirsep)operator(()ident(path)operator([)integer(2)operator(]\)\)) reserved(return) integer(1)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(DOSISH_UNC) + reserved(if) operator(()ident(isdirsep)operator(()ident(path)operator([)integer(0)operator(]\)) operator(&&) ident(isdirsep)operator(()ident(path)operator([)integer(1)operator(]\)\)) reserved(return) integer(1)operator(;) +preprocessor(#endif) +preprocessor(#ifndef) ident(DOSISH) + reserved(if) operator(()ident(path)operator([)integer(0)operator(]) operator(==) char('/')operator(\)) reserved(return) integer(1)operator(;) +preprocessor(#endif) + reserved(return) integer(0)operator(;) +operator(}) + +preprocessor(#ifndef) ident(ENABLE_PATH_CHECK) +preprocessor(# if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__CYGWIN__) +preprocessor(# define) ident(ENABLE_PATH_CHECK) integer(0) +preprocessor(# else) +preprocessor(# define) ident(ENABLE_PATH_CHECK) integer(1) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#if) ident(ENABLE_PATH_CHECK) +directive(static) pre_type(int) +ident(path_check_0)operator(()ident(fpath)operator(,) ident(execpath)operator(\)) + ident(VALUE) ident(fpath)operator(;) + pre_type(int) ident(execpath)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + pre_type(char) operator(*)ident(p0) operator(=) ident(StringValueCStr)operator(()ident(fpath)operator(\);) + pre_type(char) operator(*)ident(p) operator(=) integer(0)operator(,) operator(*)ident(s)operator(;) + + reserved(if) operator((!)ident(is_absolute_path)operator(()ident(p0)operator(\)\)) operator({) + pre_type(char) operator(*)ident(buf) operator(=) ident(my_getcwd)operator((\);) + ident(VALUE) ident(newpath)operator(;) + + ident(newpath) operator(=) ident(rb_str_new2)operator(()ident(buf)operator(\);) + ident(free)operator(()ident(buf)operator(\);) + + ident(rb_str_cat2)operator(()ident(newpath)operator(,) string<delimiter(")content(/)delimiter(")>operator(\);) + ident(rb_str_cat2)operator(()ident(newpath)operator(,) ident(p0)operator(\);) + ident(p0) operator(=) ident(RSTRING)operator(()ident(fpath) operator(=) ident(newpath)operator(\)->)ident(ptr)operator(;) + operator(}) + reserved(for) operator((;;\)) operator({) +preprocessor(#ifndef) ident(S_IWOTH) +preprocessor(# define) ident(S_IWOTH) oct(002) +preprocessor(#endif) + reserved(if) operator(()ident(stat)operator(()ident(p0)operator(,) operator(&)ident(st)operator(\)) operator(==) integer(0) operator(&&) ident(S_ISDIR)operator(()ident(st)operator(.)ident(st_mode)operator(\)) operator(&&) operator(()ident(st)operator(.)ident(st_mode) operator(&) ident(S_IWOTH)operator(\)) +preprocessor(#ifdef) ident(S_ISVTX) + operator(&&) operator(!()ident(p) operator(&&) ident(execpath) operator(&&) operator(()ident(st)operator(.)ident(st_mode) operator(&) ident(S_ISVTX)operator(\)\)) +preprocessor(#endif) + operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(Insecure world writable dir %s in %sPATH, mode 0%o)delimiter(")>operator(,) + ident(p0)operator(,) operator(()ident(execpath) operator(?) string<delimiter(")delimiter(")> operator(:) string<delimiter(")content(LOAD_)delimiter(")>operator(\),) ident(st)operator(.)ident(st_mode)operator(\);) + reserved(if) operator(()ident(p)operator(\)) operator(*)ident(p) operator(=) char('/')operator(;) + reserved(return) integer(0)operator(;) + operator(}) + ident(s) operator(=) ident(strrdirsep)operator(()ident(p0)operator(\);) + reserved(if) operator(()ident(p)operator(\)) operator(*)ident(p) operator(=) char('/')operator(;) + reserved(if) operator((!)ident(s) operator(||) ident(s) operator(==) ident(p0)operator(\)) reserved(return) integer(1)operator(;) + ident(p) operator(=) ident(s)operator(;) + operator(*)ident(p) operator(=) char('\\0')operator(;) + operator(}) +operator(}) +preprocessor(#endif) + +directive(static) pre_type(int) +ident(fpath_check)operator(()ident(path)operator(\)) + pre_type(char) operator(*)ident(path)operator(;) +operator({) +preprocessor(#if) ident(ENABLE_PATH_CHECK) + reserved(return) ident(path_check_0)operator(()ident(rb_str_new2)operator(()ident(path)operator(\),) ident(Qfalse)operator(\);) +preprocessor(#else) + reserved(return) integer(1)operator(;) +preprocessor(#endif) +operator(}) + +pre_type(int) +ident(rb_path_check)operator(()ident(path)operator(\)) + pre_type(char) operator(*)ident(path)operator(;) +operator({) +preprocessor(#if) ident(ENABLE_PATH_CHECK) + pre_type(char) operator(*)ident(p0)operator(,) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + directive(const) pre_type(char) ident(sep) operator(=) ident(PATH_SEP_CHAR)operator(;) + + reserved(if) operator((!)ident(path)operator(\)) reserved(return) integer(1)operator(;) + + ident(pend) operator(=) ident(path) operator(+) ident(strlen)operator(()ident(path)operator(\);) + ident(p0) operator(=) ident(path)operator(;) + ident(p) operator(=) ident(strchr)operator(()ident(path)operator(,) ident(sep)operator(\);) + reserved(if) operator((!)ident(p)operator(\)) ident(p) operator(=) ident(pend)operator(;) + + reserved(for) operator((;;\)) operator({) + reserved(if) operator((!)ident(path_check_0)operator(()ident(rb_str_new)operator(()ident(p0)operator(,) ident(p) operator(-) ident(p0)operator(\),) ident(Qtrue)operator(\)\)) operator({) + reserved(return) integer(0)operator(;) comment(/* not safe */) + operator(}) + ident(p0) operator(=) ident(p) operator(+) integer(1)operator(;) + reserved(if) operator(()ident(p0) operator(>) ident(pend)operator(\)) reserved(break)operator(;) + ident(p) operator(=) ident(strchr)operator(()ident(p0)operator(,) ident(sep)operator(\);) + reserved(if) operator((!)ident(p)operator(\)) ident(p) operator(=) ident(pend)operator(;) + operator(}) +preprocessor(#endif) + reserved(return) integer(1)operator(;) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(__MACOS__)operator(\)) operator(||) ident(defined)operator(()ident(riscos)operator(\)) +directive(static) pre_type(int) +ident(is_macos_native_path)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) + reserved(if) operator(()ident(strchr)operator(()ident(path)operator(,) char(':')operator(\)\)) reserved(return) integer(1)operator(;) + reserved(return) integer(0)operator(;) +operator(}) +preprocessor(#endif) + +directive(static) pre_type(int) +ident(file_load_ok)operator(()ident(file)operator(\)) + pre_type(char) operator(*)ident(file)operator(;) +operator({) + pre_type(int) ident(ret) operator(=) integer(1)operator(;) + pre_type(int) ident(fd) operator(=) ident(open)operator(()ident(file)operator(,) ident(O_RDONLY)operator(\);) + reserved(if) operator(()ident(fd) operator(==) operator(-)integer(1)operator(\)) reserved(return) integer(0)operator(;) +preprocessor(#if) operator(!)ident(defined) ident(DOSISH) + operator({) + reserved(struct) ident(stat) ident(st)operator(;) + reserved(if) operator(()ident(fstat)operator(()ident(fd)operator(,) operator(&)ident(st)operator(\)) operator(||) operator(!)ident(S_ISREG)operator(()ident(st)operator(.)ident(st_mode)operator(\)\)) operator({) + ident(ret) operator(=) integer(0)operator(;) + operator(}) + operator(}) +preprocessor(#endif) + operator(()directive(void)operator(\))ident(close)operator(()ident(fd)operator(\);) + reserved(return) ident(ret)operator(;) +operator(}) + +directive(extern) ident(VALUE) ident(rb_load_path)operator(;) + +pre_type(int) +ident(rb_find_file_ext)operator(()ident(filep)operator(,) ident(ext)operator(\)) + ident(VALUE) operator(*)ident(filep)operator(;) + directive(const) pre_type(char) operator(*) directive(const) operator(*)ident(ext)operator(;) +operator({) + pre_type(char) operator(*)ident(path)operator(,) operator(*)ident(found)operator(;) + pre_type(char) operator(*)ident(f) operator(=) ident(RSTRING)operator((*)ident(filep)operator(\)->)ident(ptr)operator(;) + ident(VALUE) ident(fname)operator(;) + pre_type(long) ident(i)operator(,) ident(j)operator(;) + + reserved(if) operator(()ident(f)operator([)integer(0)operator(]) operator(==) char('~')operator(\)) operator({) + ident(fname) operator(=) ident(rb_file_expand_path)operator((*)ident(filep)operator(,) ident(Qnil)operator(\);) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(2) operator(&&) ident(OBJ_TAINTED)operator(()ident(fname)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(loading from unsafe file %s)delimiter(")>operator(,) ident(f)operator(\);) + operator(}) + ident(OBJ_FREEZE)operator(()ident(fname)operator(\);) + ident(f) operator(=) ident(StringValueCStr)operator(()ident(fname)operator(\);) + operator(*)ident(filep) operator(=) ident(fname)operator(;) + operator(}) + + reserved(if) operator(()ident(is_absolute_path)operator(()ident(f)operator(\)\)) operator({) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(ext)operator([)ident(i)operator(];) ident(i)operator(++\)) operator({) + ident(fname) operator(=) ident(rb_str_dup)operator((*)ident(filep)operator(\);) + ident(rb_str_cat2)operator(()ident(fname)operator(,) ident(ext)operator([)ident(i)operator(]\);) + ident(OBJ_FREEZE)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(file_load_ok)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\)\)\)) operator({) + operator(*)ident(filep) operator(=) ident(fname)operator(;) + reserved(return) ident(i)operator(+)integer(1)operator(;) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) + operator(}) + + reserved(if) operator((!)ident(rb_load_path)operator(\)) reserved(return) integer(0)operator(;) + + ident(Check_Type)operator(()ident(rb_load_path)operator(,) ident(T_ARRAY)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(RARRAY)operator(()ident(rb_load_path)operator(\)->)ident(len)operator(;)ident(i)operator(++\)) operator({) + ident(VALUE) ident(str) operator(=) ident(RARRAY)operator(()ident(rb_load_path)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + + ident(SafeStringValue)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(continue)operator(;) + ident(path) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(ext)operator([)ident(j)operator(];) ident(j)operator(++\)) operator({) + ident(fname) operator(=) ident(rb_str_dup)operator((*)ident(filep)operator(\);) + ident(rb_str_cat2)operator(()ident(fname)operator(,) ident(ext)operator([)ident(j)operator(]\);) + ident(OBJ_FREEZE)operator(()ident(fname)operator(\);) + ident(found) operator(=) ident(dln_find_file)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) ident(path)operator(\);) + reserved(if) operator(()ident(found) operator(&&) ident(file_load_ok)operator(()ident(found)operator(\)\)) operator({) + operator(*)ident(filep) operator(=) ident(fname)operator(;) + reserved(return) ident(j)operator(+)integer(1)operator(;) + operator(}) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +ident(VALUE) +ident(rb_find_file)operator(()ident(path)operator(\)) + ident(VALUE) ident(path)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + pre_type(char) operator(*)ident(f) operator(=) ident(StringValueCStr)operator(()ident(path)operator(\);) + pre_type(char) operator(*)ident(lpath)operator(;) + + reserved(if) operator(()ident(f)operator([)integer(0)operator(]) operator(==) char('~')operator(\)) operator({) + ident(path) operator(=) ident(rb_file_expand_path)operator(()ident(path)operator(,) ident(Qnil)operator(\);) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(1) operator(&&) ident(OBJ_TAINTED)operator(()ident(path)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(loading from unsafe path %s)delimiter(")>operator(,) ident(f)operator(\);) + operator(}) + ident(OBJ_FREEZE)operator(()ident(path)operator(\);) + ident(f) operator(=) ident(StringValueCStr)operator(()ident(path)operator(\);) + operator(}) + +preprocessor(#if) ident(defined)operator(()ident(__MACOS__)operator(\)) operator(||) ident(defined)operator(()ident(riscos)operator(\)) + reserved(if) operator(()ident(is_macos_native_path)operator(()ident(f)operator(\)\)) operator({) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(1) operator(&&) operator(!)ident(fpath_check)operator(()ident(f)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(loading from unsafe file %s)delimiter(")>operator(,) ident(f)operator(\);) + operator(}) + reserved(if) operator(()ident(file_load_ok)operator(()ident(f)operator(\)\)) reserved(return) ident(path)operator(;) + operator(}) +preprocessor(#endif) + + reserved(if) operator(()ident(is_absolute_path)operator(()ident(f)operator(\)\)) operator({) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(1) operator(&&) operator(!)ident(fpath_check)operator(()ident(f)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(loading from unsafe file %s)delimiter(")>operator(,) ident(f)operator(\);) + operator(}) + reserved(if) operator(()ident(file_load_ok)operator(()ident(f)operator(\)\)) reserved(return) ident(path)operator(;) + operator(}) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(loading from non-absolute path %s)delimiter(")>operator(,) ident(f)operator(\);) + operator(}) + + reserved(if) operator(()ident(rb_load_path)operator(\)) operator({) + pre_type(long) ident(i)operator(;) + + ident(Check_Type)operator(()ident(rb_load_path)operator(,) ident(T_ARRAY)operator(\);) + ident(tmp) operator(=) ident(rb_ary_new)operator((\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(RARRAY)operator(()ident(rb_load_path)operator(\)->)ident(len)operator(;)ident(i)operator(++\)) operator({) + ident(VALUE) ident(str) operator(=) ident(RARRAY)operator(()ident(rb_load_path)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + ident(SafeStringValue)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(tmp)operator(,) ident(str)operator(\);) + operator(}) + operator(}) + ident(tmp) operator(=) ident(rb_ary_join)operator(()ident(tmp)operator(,) ident(rb_str_new2)operator(()ident(PATH_SEP)operator(\)\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + ident(lpath) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(lpath) operator(=) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(lpath) operator(=) integer(0)operator(;) + operator(}) + + reserved(if) operator((!)ident(lpath)operator(\)) operator({) + reserved(return) integer(0)operator(;) comment(/* no path, no load */) + operator(}) + reserved(if) operator((!()ident(f) operator(=) ident(dln_find_file)operator(()ident(f)operator(,) ident(lpath)operator(\)\)\)) operator({) + reserved(return) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(1) operator(&&) operator(!)ident(fpath_check)operator(()ident(f)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(loading from unsafe file %s)delimiter(")>operator(,) ident(f)operator(\);) + operator(}) + reserved(if) operator(()ident(file_load_ok)operator(()ident(f)operator(\)\)) operator({) + ident(tmp) operator(=) ident(rb_str_new2)operator(()ident(f)operator(\);) + ident(OBJ_FREEZE)operator(()ident(tmp)operator(\);) + reserved(return) ident(tmp)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) directive(void) +ident(define_filetest_function)operator(()ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator((*)ident(func)operator(\)(\);) + pre_type(int) ident(argc)operator(;) +operator({) + ident(rb_define_module_function)operator(()ident(rb_mFileTest)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) ident(name)operator(,) ident(func)operator(,) ident(argc)operator(\);) +operator(}) + + +comment(/* + * A <code>File</code> is an abstraction of any file object accessible + * by the program and is closely associated with class <code>IO</code> + * <code>File</code> includes the methods of module + * <code>FileTest</code> as class methods, allowing you to write (for + * example\) <code>File.exist?("foo"\)</code>. + * + * In the description of File methods, + * <em>permission bits</em> are a platform-specific + * set of bits that indicate permissions of a file. On Unix-based + * systems, permissions are viewed as a set of three octets, for the + * owner, the group, and the rest of the world. For each of these + * entities, permissions may be set to read, write, or execute the + * file: + * + * The permission bits <code>0644</code> (in octal\) would thus be + * interpreted as read/write for owner, and read-only for group and + * other. Higher-order bits may also be used to indicate the type of + * file (plain, directory, pipe, socket, and so on\) and various other + * special features. If the permissions are for a directory, the + * meaning of the execute bit changes; when set the directory can be + * searched. + * + * On non-Posix operating systems, there may be only the ability to + * make a file read-only or read-write. In this case, the remaining + * permission bits will be synthesized to resemble typical values. For + * instance, on Windows NT the default permission bits are + * <code>0644</code>, which means read/write for owner, read-only for + * all others. The only change that can be made is to make the file + * read-only, which is reported as <code>0444</code>. + */) + +directive(void) +ident(Init_File)operator((\)) +operator({) + ident(rb_mFileTest) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(FileTest)delimiter(")>operator(\);) + ident(rb_cFile) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(File)delimiter(")>operator(,) ident(rb_cIO)operator(\);) + + ident(define_filetest_function)operator(()string<delimiter(")content(directory?)delimiter(")>operator(,) ident(test_d)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(exist?)delimiter(")>operator(,) ident(test_e)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(exists?)delimiter(")>operator(,) ident(test_e)operator(,) integer(1)operator(\);) comment(/* temporary */) + ident(define_filetest_function)operator(()string<delimiter(")content(readable?)delimiter(")>operator(,) ident(test_r)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(readable_real?)delimiter(")>operator(,) ident(test_R)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(writable?)delimiter(")>operator(,) ident(test_w)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(writable_real?)delimiter(")>operator(,) ident(test_W)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(executable?)delimiter(")>operator(,) ident(test_x)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(executable_real?)delimiter(")>operator(,) ident(test_X)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(file?)delimiter(")>operator(,) ident(test_f)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(zero?)delimiter(")>operator(,) ident(test_z)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(size?)delimiter(")>operator(,) ident(test_s)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(size)delimiter(")>operator(,) ident(rb_file_s_size)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(owned?)delimiter(")>operator(,) ident(test_owned)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(grpowned?)delimiter(")>operator(,) ident(test_grpowned)operator(,) integer(1)operator(\);) + + ident(define_filetest_function)operator(()string<delimiter(")content(pipe?)delimiter(")>operator(,) ident(test_p)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(symlink?)delimiter(")>operator(,) ident(test_l)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(socket?)delimiter(")>operator(,) ident(test_S)operator(,) integer(1)operator(\);) + + ident(define_filetest_function)operator(()string<delimiter(")content(blockdev?)delimiter(")>operator(,) ident(test_b)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(chardev?)delimiter(")>operator(,) ident(test_c)operator(,) integer(1)operator(\);) + + ident(define_filetest_function)operator(()string<delimiter(")content(setuid?)delimiter(")>operator(,) ident(test_suid)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(setgid?)delimiter(")>operator(,) ident(test_sgid)operator(,) integer(1)operator(\);) + ident(define_filetest_function)operator(()string<delimiter(")content(sticky?)delimiter(")>operator(,) ident(test_sticky)operator(,) integer(1)operator(\);) + + ident(define_filetest_function)operator(()string<delimiter(")content(identical?)delimiter(")>operator(,) ident(test_identical)operator(,) integer(2)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(stat)delimiter(")>operator(,) ident(rb_file_s_stat)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(lstat)delimiter(")>operator(,) ident(rb_file_s_lstat)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(ftype)delimiter(")>operator(,) ident(rb_file_s_ftype)operator(,) integer(1)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(atime)delimiter(")>operator(,) ident(rb_file_s_atime)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(mtime)delimiter(")>operator(,) ident(rb_file_s_mtime)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(ctime)delimiter(")>operator(,) ident(rb_file_s_ctime)operator(,) integer(1)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(utime)delimiter(")>operator(,) ident(rb_file_s_utime)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(chmod)delimiter(")>operator(,) ident(rb_file_s_chmod)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(chown)delimiter(")>operator(,) ident(rb_file_s_chown)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(lchmod)delimiter(")>operator(,) ident(rb_file_s_lchmod)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(lchown)delimiter(")>operator(,) ident(rb_file_s_lchown)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(link)delimiter(")>operator(,) ident(rb_file_s_link)operator(,) integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(symlink)delimiter(")>operator(,) ident(rb_file_s_symlink)operator(,) integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(readlink)delimiter(")>operator(,) ident(rb_file_s_readlink)operator(,) integer(1)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(unlink)delimiter(")>operator(,) ident(rb_file_s_unlink)operator(,) operator(-)integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(delete)delimiter(")>operator(,) ident(rb_file_s_unlink)operator(,) operator(-)integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(rename)delimiter(")>operator(,) ident(rb_file_s_rename)operator(,) integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(umask)delimiter(")>operator(,) ident(rb_file_s_umask)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(truncate)delimiter(")>operator(,) ident(rb_file_s_truncate)operator(,) integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(expand_path)delimiter(")>operator(,) ident(rb_file_s_expand_path)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(basename)delimiter(")>operator(,) ident(rb_file_s_basename)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(dirname)delimiter(")>operator(,) ident(rb_file_s_dirname)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(extname)delimiter(")>operator(,) ident(rb_file_s_extname)operator(,) integer(1)operator(\);) + + ident(separator) operator(=) ident(rb_obj_freeze)operator(()ident(rb_str_new2)operator(()string<delimiter(")content(/)delimiter(")>operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(Separator)delimiter(")>operator(,) ident(separator)operator(\);) + ident(rb_define_const)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(SEPARATOR)delimiter(")>operator(,) ident(separator)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(split)delimiter(")>operator(,) ident(rb_file_s_split)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(join)delimiter(")>operator(,) ident(rb_file_s_join)operator(,) operator(-)integer(2)operator(\);) + +preprocessor(#ifdef) ident(DOSISH) + ident(rb_define_const)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(ALT_SEPARATOR)delimiter(")>operator(,) ident(rb_obj_freeze)operator(()ident(rb_str_new2)operator(()string<delimiter(")char(\\\\)delimiter(")>operator(\)\)\);) +preprocessor(#else) + ident(rb_define_const)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(ALT_SEPARATOR)delimiter(")>operator(,) ident(Qnil)operator(\);) +preprocessor(#endif) + ident(rb_define_const)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(PATH_SEPARATOR)delimiter(")>operator(,) ident(rb_obj_freeze)operator(()ident(rb_str_new2)operator(()ident(PATH_SEP)operator(\)\)\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(stat)delimiter(")>operator(,) ident(rb_io_stat)operator(,) integer(0)operator(\);) comment(/* this is IO's method */) + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(lstat)delimiter(")>operator(,) ident(rb_file_lstat)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(atime)delimiter(")>operator(,) ident(rb_file_atime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(mtime)delimiter(")>operator(,) ident(rb_file_mtime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(ctime)delimiter(")>operator(,) ident(rb_file_ctime)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(chmod)delimiter(")>operator(,) ident(rb_file_chmod)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(chown)delimiter(")>operator(,) ident(rb_file_chown)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(truncate)delimiter(")>operator(,) ident(rb_file_truncate)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(flock)delimiter(")>operator(,) ident(rb_file_flock)operator(,) integer(1)operator(\);) + + ident(rb_mFConst) operator(=) ident(rb_define_module_under)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(Constants)delimiter(")>operator(\);) + ident(rb_include_module)operator(()ident(rb_cIO)operator(,) ident(rb_mFConst)operator(\);) + ident(rb_file_const)operator(()string<delimiter(")content(LOCK_SH)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(LOCK_SH)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(LOCK_EX)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(LOCK_EX)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(LOCK_UN)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(LOCK_UN)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(LOCK_NB)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(LOCK_NB)operator(\)\);) + + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(path)delimiter(")>operator(,) ident(rb_file_path)operator(,) integer(0)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(test)delimiter(")>operator(,) ident(rb_f_test)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_cStat) operator(=) ident(rb_define_class_under)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(Stat)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_define_alloc_func)operator(()ident(rb_cStat)operator(,) ident(rb_stat_s_alloc)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_stat_init)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_stat_init_copy)operator(,) integer(1)operator(\);) + + ident(rb_include_module)operator(()ident(rb_cStat)operator(,) ident(rb_mComparable)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(rb_stat_cmp)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(dev)delimiter(")>operator(,) ident(rb_stat_dev)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(dev_major)delimiter(")>operator(,) ident(rb_stat_dev_major)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(dev_minor)delimiter(")>operator(,) ident(rb_stat_dev_minor)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(ino)delimiter(")>operator(,) ident(rb_stat_ino)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(mode)delimiter(")>operator(,) ident(rb_stat_mode)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(nlink)delimiter(")>operator(,) ident(rb_stat_nlink)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(uid)delimiter(")>operator(,) ident(rb_stat_uid)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(gid)delimiter(")>operator(,) ident(rb_stat_gid)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(rdev)delimiter(")>operator(,) ident(rb_stat_rdev)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(rdev_major)delimiter(")>operator(,) ident(rb_stat_rdev_major)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(rdev_minor)delimiter(")>operator(,) ident(rb_stat_rdev_minor)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(size)delimiter(")>operator(,) ident(rb_stat_size)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(blksize)delimiter(")>operator(,) ident(rb_stat_blksize)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(blocks)delimiter(")>operator(,) ident(rb_stat_blocks)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(atime)delimiter(")>operator(,) ident(rb_stat_atime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(mtime)delimiter(")>operator(,) ident(rb_stat_mtime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(ctime)delimiter(")>operator(,) ident(rb_stat_ctime)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_stat_inspect)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(ftype)delimiter(")>operator(,) ident(rb_stat_ftype)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(directory?)delimiter(")>operator(,) ident(rb_stat_d)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(readable?)delimiter(")>operator(,) ident(rb_stat_r)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(readable_real?)delimiter(")>operator(,) ident(rb_stat_R)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(writable?)delimiter(")>operator(,) ident(rb_stat_w)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(writable_real?)delimiter(")>operator(,) ident(rb_stat_W)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(executable?)delimiter(")>operator(,) ident(rb_stat_x)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(executable_real?)delimiter(")>operator(,) ident(rb_stat_X)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(file?)delimiter(")>operator(,) ident(rb_stat_f)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(zero?)delimiter(")>operator(,) ident(rb_stat_z)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(size?)delimiter(")>operator(,) ident(rb_stat_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(owned?)delimiter(")>operator(,) ident(rb_stat_owned)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(grpowned?)delimiter(")>operator(,) ident(rb_stat_grpowned)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(pipe?)delimiter(")>operator(,) ident(rb_stat_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(symlink?)delimiter(")>operator(,) ident(rb_stat_l)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(socket?)delimiter(")>operator(,) ident(rb_stat_S)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(blockdev?)delimiter(")>operator(,) ident(rb_stat_b)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(chardev?)delimiter(")>operator(,) ident(rb_stat_c)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(setuid?)delimiter(")>operator(,) ident(rb_stat_suid)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(setgid?)delimiter(")>operator(,) ident(rb_stat_sgid)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStat)operator(,) string<delimiter(")content(sticky?)delimiter(")>operator(,) ident(rb_stat_sticky)operator(,) integer(0)operator(\);) +operator(}) +comment(/********************************************************************** + + gc.c - + + $Author: wyhaines $ + $Date: 2009-07-10 20:31:58 +0200 (Fri, 10 Jul 2009\) $ + created at: Tue Oct 5 09:44:46 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("rubysig.h") +preprocessor(#include) include("st.h") +preprocessor(#include) include("node.h") +preprocessor(#include) include("env.h") +preprocessor(#include) include("re.h") +preprocessor(#include) include(<stdio.h>) +preprocessor(#include) include(<setjmp.h>) +preprocessor(#include) include(<sys/types.h>) + +preprocessor(#ifdef) ident(HAVE_SYS_TIME_H) +preprocessor(#include) include(<sys/time.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_SYS_RESOURCE_H) +preprocessor(#include) include(<sys/resource.h>) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(_WIN32) operator(||) ident(defined) ident(__CYGWIN__) +preprocessor(#include) include(<windows.h>) +preprocessor(#endif) + +directive(void) ident(re_free_registers) ident(_)operator((()reserved(struct) ident(re_registers)operator(*\)\);) +directive(void) ident(rb_io_fptr_finalize) ident(_)operator((()reserved(struct) ident(OpenFile)operator(*\)\);) + +preprocessor(#if) operator(!)ident(defined)operator(()ident(setjmp)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE__SETJMP)operator(\)) +preprocessor(#define) ident(setjmp)operator(()ident(env)operator(\)) ident(_setjmp)operator(()ident(env)operator(\)) +preprocessor(#endif) + +comment(/* Make alloca work the best possible way. */) +preprocessor(#ifdef) ident(__GNUC__) +preprocessor(# ifndef) ident(atarist) +preprocessor(# ifndef) ident(alloca) +preprocessor(# define) ident(alloca) ident(__builtin_alloca) +preprocessor(# endif) +preprocessor(# endif) comment(/* atarist */) +preprocessor(#else) +preprocessor(# ifdef) ident(HAVE_ALLOCA_H) +preprocessor(# include) include(<alloca.h>) +preprocessor(# else) +preprocessor(# ifndef) ident(_AIX) +preprocessor(# ifndef) ident(alloca) comment(/* predefined by HP cc +Olibcalls */) +directive(void) operator(*)ident(alloca) operator((\);) +preprocessor(# endif) +preprocessor(# endif) comment(/* AIX */) +preprocessor(# endif) comment(/* HAVE_ALLOCA_H */) +preprocessor(#endif) comment(/* __GNUC__ */) + +preprocessor(#ifndef) ident(GC_MALLOC_LIMIT) +preprocessor(#if) ident(defined)operator(()ident(MSDOS)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) +preprocessor(#define) ident(GC_MALLOC_LIMIT) integer(200000) +preprocessor(#else) +preprocessor(#define) ident(GC_MALLOC_LIMIT) integer(8000000) +preprocessor(#endif) +preprocessor(#endif) + +directive(static) pre_type(unsigned) pre_type(long) ident(malloc_increase) operator(=) integer(0)operator(;) +directive(static) pre_type(unsigned) pre_type(long) ident(malloc_limit) operator(=) ident(GC_MALLOC_LIMIT)operator(;) +directive(static) directive(void) ident(run_final)operator((\);) +directive(static) ident(VALUE) ident(nomem_error)operator(;) +directive(static) directive(void) ident(garbage_collect)operator((\);) + +ident(NORETURN)operator(()directive(void) ident(rb_exc_jump) ident(_)operator((()ident(VALUE)operator(\)\)\);) + +directive(void) +ident(rb_memerror)operator((\)) +operator({) + ident(rb_thread_t) ident(th) operator(=) ident(rb_curr_thread)operator(;) + + reserved(if) operator((!)ident(nomem_error) operator(||) + operator(()ident(rb_thread_raised_p)operator(()ident(th)operator(,) ident(RAISED_NOMEMORY)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(<) integer(4)operator(\)\)) operator({) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content([FATAL] failed to allocate memory)char(\\n)delimiter(")>operator(\);) + ident(exit)operator(()integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(rb_thread_raised_p)operator(()ident(th)operator(,) ident(RAISED_NOMEMORY)operator(\)\)) operator({) + ident(rb_exc_jump)operator(()ident(nomem_error)operator(\);) + operator(}) + ident(rb_thread_raised_set)operator(()ident(th)operator(,) ident(RAISED_NOMEMORY)operator(\);) + ident(rb_exc_raise)operator(()ident(nomem_error)operator(\);) +operator(}) + +directive(void) operator(*) +ident(ruby_xmalloc)operator(()ident(size)operator(\)) + pre_type(long) ident(size)operator(;) +operator({) + directive(void) operator(*)ident(mem)operator(;) + + reserved(if) operator(()ident(size) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eNoMemError)operator(,) string<delimiter(")content(negative allocation size (or too big\))delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(size) operator(==) integer(0)operator(\)) ident(size) operator(=) integer(1)operator(;) + + reserved(if) operator((()ident(malloc_increase)operator(+)ident(size)operator(\)) operator(>) ident(malloc_limit)operator(\)) operator({) + ident(garbage_collect)operator((\);) + operator(}) + ident(RUBY_CRITICAL)operator(()ident(mem) operator(=) ident(malloc)operator(()ident(size)operator(\)\);) + reserved(if) operator((!)ident(mem)operator(\)) operator({) + ident(garbage_collect)operator((\);) + ident(RUBY_CRITICAL)operator(()ident(mem) operator(=) ident(malloc)operator(()ident(size)operator(\)\);) + reserved(if) operator((!)ident(mem)operator(\)) operator({) + ident(rb_memerror)operator((\);) + operator(}) + operator(}) + ident(malloc_increase) operator(+=) ident(size)operator(;) + + reserved(return) ident(mem)operator(;) +operator(}) + +directive(void) operator(*) +ident(ruby_xcalloc)operator(()ident(n)operator(,) ident(size)operator(\)) + pre_type(long) ident(n)operator(,) ident(size)operator(;) +operator({) + directive(void) operator(*)ident(mem)operator(;) + + ident(mem) operator(=) ident(xmalloc)operator(()ident(n) operator(*) ident(size)operator(\);) + ident(memset)operator(()ident(mem)operator(,) integer(0)operator(,) ident(n) operator(*) ident(size)operator(\);) + + reserved(return) ident(mem)operator(;) +operator(}) + +directive(void) operator(*) +ident(ruby_xrealloc)operator(()ident(ptr)operator(,) ident(size)operator(\)) + directive(void) operator(*)ident(ptr)operator(;) + pre_type(long) ident(size)operator(;) +operator({) + directive(void) operator(*)ident(mem)operator(;) + + reserved(if) operator(()ident(size) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative re-allocation size)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!)ident(ptr)operator(\)) reserved(return) ident(xmalloc)operator(()ident(size)operator(\);) + reserved(if) operator(()ident(size) operator(==) integer(0)operator(\)) ident(size) operator(=) integer(1)operator(;) + ident(RUBY_CRITICAL)operator(()ident(mem) operator(=) ident(realloc)operator(()ident(ptr)operator(,) ident(size)operator(\)\);) + reserved(if) operator((!)ident(mem)operator(\)) operator({) + ident(garbage_collect)operator((\);) + ident(RUBY_CRITICAL)operator(()ident(mem) operator(=) ident(realloc)operator(()ident(ptr)operator(,) ident(size)operator(\)\);) + reserved(if) operator((!)ident(mem)operator(\)) operator({) + ident(rb_memerror)operator((\);) + operator(}) + operator(}) + ident(malloc_increase) operator(+=) ident(size)operator(;) + + reserved(return) ident(mem)operator(;) +operator(}) + +directive(void) +ident(ruby_xfree)operator(()ident(x)operator(\)) + directive(void) operator(*)ident(x)operator(;) +operator({) + reserved(if) operator(()ident(x)operator(\)) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(x)operator(\)\);) +operator(}) + +directive(extern) pre_type(int) ident(ruby_in_compile)operator(;) +directive(static) pre_type(int) ident(dont_gc)operator(;) +directive(static) pre_type(int) ident(during_gc)operator(;) +directive(static) pre_type(int) ident(need_call_final) operator(=) integer(0)operator(;) +directive(static) ident(st_table) operator(*)ident(finalizer_table) operator(=) integer(0)operator(;) + + +comment(/* + * call-seq: + * GC.enable => true or false + * + * Enables garbage collection, returning <code>true</code> if garbage + * collection was previously disabled. + * + * GC.disable #=> false + * GC.enable #=> true + * GC.enable #=> false + * + */) + +ident(VALUE) +ident(rb_gc_enable)operator((\)) +operator({) + pre_type(int) ident(old) operator(=) ident(dont_gc)operator(;) + + ident(dont_gc) operator(=) ident(Qfalse)operator(;) + reserved(return) ident(old)operator(;) +operator(}) + +comment(/* + * call-seq: + * GC.disable => true or false + * + * Disables garbage collection, returning <code>true</code> if garbage + * collection was already disabled. + * + * GC.disable #=> false + * GC.disable #=> true + * + */) + +ident(VALUE) +ident(rb_gc_disable)operator((\)) +operator({) + pre_type(int) ident(old) operator(=) ident(dont_gc)operator(;) + + ident(dont_gc) operator(=) ident(Qtrue)operator(;) + reserved(return) ident(old)operator(;) +operator(}) + +ident(VALUE) ident(rb_mGC)operator(;) + +directive(static) reserved(struct) ident(gc_list) operator({) + ident(VALUE) operator(*)ident(varptr)operator(;) + reserved(struct) ident(gc_list) operator(*)ident(next)operator(;) +operator(}) operator(*)ident(global_List) operator(=) integer(0)operator(;) + +directive(void) +ident(rb_gc_register_address)operator(()ident(addr)operator(\)) + ident(VALUE) operator(*)ident(addr)operator(;) +operator({) + reserved(struct) ident(gc_list) operator(*)ident(tmp)operator(;) + + ident(tmp) operator(=) ident(ALLOC)operator(()reserved(struct) ident(gc_list)operator(\);) + ident(tmp)operator(->)ident(next) operator(=) ident(global_List)operator(;) + ident(tmp)operator(->)ident(varptr) operator(=) ident(addr)operator(;) + ident(global_List) operator(=) ident(tmp)operator(;) +operator(}) + +directive(void) +ident(rb_gc_unregister_address)operator(()ident(addr)operator(\)) + ident(VALUE) operator(*)ident(addr)operator(;) +operator({) + reserved(struct) ident(gc_list) operator(*)ident(tmp) operator(=) ident(global_List)operator(;) + + reserved(if) operator(()ident(tmp)operator(->)ident(varptr) operator(==) ident(addr)operator(\)) operator({) + ident(global_List) operator(=) ident(tmp)operator(->)ident(next)operator(;) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(tmp)operator(\)\);) + reserved(return)operator(;) + operator(}) + reserved(while) operator(()ident(tmp)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(tmp)operator(->)ident(next)operator(->)ident(varptr) operator(==) ident(addr)operator(\)) operator({) + reserved(struct) ident(gc_list) operator(*)ident(t) operator(=) ident(tmp)operator(->)ident(next)operator(;) + + ident(tmp)operator(->)ident(next) operator(=) ident(tmp)operator(->)ident(next)operator(->)ident(next)operator(;) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(t)operator(\)\);) + reserved(break)operator(;) + operator(}) + ident(tmp) operator(=) ident(tmp)operator(->)ident(next)operator(;) + operator(}) +operator(}) + +preprocessor(#undef) ident(GC_DEBUG) + +directive(void) +ident(rb_global_variable)operator(()ident(var)operator(\)) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + ident(rb_gc_register_address)operator(()ident(var)operator(\);) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(_MSC_VER)operator(\)) operator(||) ident(defined)operator(()ident(__BORLANDC__)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN__)operator(\)) +preprocessor(#pragma) ident(pack)operator(()ident(push)operator(,) integer(1)operator(\)) comment(/* magic for reducing sizeof(RVALUE\): 24 -> 20 */) +preprocessor(#endif) + +reserved(typedef) reserved(struct) ident(RVALUE) operator({) + reserved(union) operator({) + reserved(struct) operator({) + pre_type(unsigned) pre_type(long) ident(flags)operator(;) comment(/* always 0 for freed obj */) + reserved(struct) ident(RVALUE) operator(*)ident(next)operator(;) + operator(}) ident(free)operator(;) + reserved(struct) ident(RBasic) ident(basic)operator(;) + reserved(struct) ident(RObject) ident(object)operator(;) + reserved(struct) ident(RClass) ident(klass)operator(;) + reserved(struct) ident(RFloat) ident(flonum)operator(;) + reserved(struct) ident(RString) ident(string)operator(;) + reserved(struct) ident(RArray) ident(array)operator(;) + reserved(struct) ident(RRegexp) ident(regexp)operator(;) + reserved(struct) ident(RHash) ident(hash)operator(;) + reserved(struct) ident(RData) ident(data)operator(;) + reserved(struct) ident(RStruct) ident(rstruct)operator(;) + reserved(struct) ident(RBignum) ident(bignum)operator(;) + reserved(struct) ident(RFile) ident(file)operator(;) + reserved(struct) ident(RNode) ident(node)operator(;) + reserved(struct) ident(RMatch) ident(match)operator(;) + reserved(struct) ident(RVarmap) ident(varmap)operator(;) + reserved(struct) ident(SCOPE) ident(scope)operator(;) + operator(}) ident(as)operator(;) +preprocessor(#ifdef) ident(GC_DEBUG) + pre_type(char) operator(*)ident(file)operator(;) + pre_type(int) ident(line)operator(;) +preprocessor(#endif) +operator(}) ident(RVALUE)operator(;) + +preprocessor(#if) ident(defined)operator(()ident(_MSC_VER)operator(\)) operator(||) ident(defined)operator(()ident(__BORLANDC__)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN__)operator(\)) +preprocessor(#pragma) ident(pack)operator(()ident(pop)operator(\)) +preprocessor(#endif) + +directive(static) ident(RVALUE) operator(*)ident(freelist) operator(=) integer(0)operator(;) +directive(static) ident(RVALUE) operator(*)ident(deferred_final_list) operator(=) integer(0)operator(;) + +preprocessor(#define) ident(HEAPS_INCREMENT) integer(10) +directive(static) reserved(struct) ident(heaps_slot) operator({) + directive(void) operator(*)ident(membase)operator(;) + ident(RVALUE) operator(*)ident(slot)operator(;) + pre_type(int) ident(limit)operator(;) +operator(}) operator(*)ident(heaps)operator(;) +directive(static) pre_type(int) ident(heaps_length) operator(=) integer(0)operator(;) +directive(static) pre_type(int) ident(heaps_used) operator(=) integer(0)operator(;) + +preprocessor(#define) ident(HEAP_MIN_SLOTS) integer(10000) +directive(static) pre_type(int) ident(heap_slots) operator(=) ident(HEAP_MIN_SLOTS)operator(;) + +preprocessor(#define) ident(FREE_MIN) integer(4096) + +directive(static) ident(RVALUE) operator(*)ident(himem)operator(,) operator(*)ident(lomem)operator(;) + +directive(static) directive(void) +ident(add_heap)operator((\)) +operator({) + ident(RVALUE) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + + reserved(if) operator(()ident(heaps_used) operator(==) ident(heaps_length)operator(\)) operator({) + comment(/* Realloc heaps */) + reserved(struct) ident(heaps_slot) operator(*)ident(p)operator(;) + pre_type(int) ident(length)operator(;) + + ident(heaps_length) operator(+=) ident(HEAPS_INCREMENT)operator(;) + ident(length) operator(=) ident(heaps_length)operator(*)reserved(sizeof)operator(()reserved(struct) ident(heaps_slot)operator(\);) + ident(RUBY_CRITICAL)operator(() + reserved(if) operator(()ident(heaps_used) operator(>) integer(0)operator(\)) operator({) + ident(p) operator(=) operator(()reserved(struct) ident(heaps_slot) operator(*\))ident(realloc)operator(()ident(heaps)operator(,) ident(length)operator(\);) + reserved(if) operator(()ident(p)operator(\)) ident(heaps) operator(=) ident(p)operator(;) + operator(}) + reserved(else) operator({) + ident(p) operator(=) ident(heaps) operator(=) operator(()reserved(struct) ident(heaps_slot) operator(*\))ident(malloc)operator(()ident(length)operator(\);) + operator(}\);) + reserved(if) operator(()ident(p) operator(==) integer(0)operator(\)) ident(rb_memerror)operator((\);) + operator(}) + + reserved(for) operator((;;\)) operator({) + ident(RUBY_CRITICAL)operator(()ident(p) operator(=) operator(()ident(RVALUE)operator(*\))ident(malloc)operator(()reserved(sizeof)operator(()ident(RVALUE)operator(\)*()ident(heap_slots)operator(+)integer(1)operator(\)\)\);) + reserved(if) operator(()ident(p) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(heap_slots) operator(==) ident(HEAP_MIN_SLOTS)operator(\)) operator({) + ident(rb_memerror)operator((\);) + operator(}) + ident(heap_slots) operator(=) ident(HEAP_MIN_SLOTS)operator(;) + reserved(continue)operator(;) + operator(}) + ident(heaps)operator([)ident(heaps_used)operator(])operator(.)ident(membase) operator(=) ident(p)operator(;) + reserved(if) operator((()ident(VALUE)operator(\))ident(p) operator(%) reserved(sizeof)operator(()ident(RVALUE)operator(\)) operator(==) integer(0)operator(\)) + ident(heap_slots) operator(+=) integer(1)operator(;) + reserved(else) + ident(p) operator(=) operator(()ident(RVALUE)operator(*\)(()ident(VALUE)operator(\))ident(p) operator(+) reserved(sizeof)operator(()ident(RVALUE)operator(\)) operator(-) operator((()ident(VALUE)operator(\))ident(p) operator(%) reserved(sizeof)operator(()ident(RVALUE)operator(\)\)\);) + ident(heaps)operator([)ident(heaps_used)operator(])operator(.)ident(slot) operator(=) ident(p)operator(;) + ident(heaps)operator([)ident(heaps_used)operator(])operator(.)ident(limit) operator(=) ident(heap_slots)operator(;) + reserved(break)operator(;) + operator(}) + ident(pend) operator(=) ident(p) operator(+) ident(heap_slots)operator(;) + reserved(if) operator(()ident(lomem) operator(==) integer(0) operator(||) ident(lomem) operator(>) ident(p)operator(\)) ident(lomem) operator(=) ident(p)operator(;) + reserved(if) operator(()ident(himem) operator(<) ident(pend)operator(\)) ident(himem) operator(=) ident(pend)operator(;) + ident(heaps_used)operator(++;) + ident(heap_slots) operator(*=) float(1)float(.8)operator(;) + reserved(if) operator(()ident(heap_slots) operator(<=) integer(0)operator(\)) ident(heap_slots) operator(=) ident(HEAP_MIN_SLOTS)operator(;) + + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(flags) operator(=) integer(0)operator(;) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(next) operator(=) ident(freelist)operator(;) + ident(freelist) operator(=) ident(p)operator(;) + ident(p)operator(++;) + operator(}) +operator(}) +preprocessor(#define) ident(RANY)operator(()ident(o)operator(\)) operator((()ident(RVALUE)operator(*\)()ident(o)operator(\)\)) + +pre_type(int) +ident(rb_during_gc)operator((\)) +operator({) + reserved(return) ident(during_gc)operator(;) +operator(}) + +ident(VALUE) +ident(rb_newobj)operator((\)) +operator({) + ident(VALUE) ident(obj)operator(;) + + reserved(if) operator(()ident(during_gc)operator(\)) + ident(rb_bug)operator(()string<delimiter(")content(object allocation during garbage collection phase)delimiter(")>operator(\);) + + reserved(if) operator((!)ident(freelist)operator(\)) ident(garbage_collect)operator((\);) + + ident(obj) operator(=) operator(()ident(VALUE)operator(\))ident(freelist)operator(;) + ident(freelist) operator(=) ident(freelist)operator(->)ident(as)operator(.)ident(free)operator(.)ident(next)operator(;) + ident(MEMZERO)operator((()directive(void)operator(*\))ident(obj)operator(,) ident(RVALUE)operator(,) integer(1)operator(\);) +preprocessor(#ifdef) ident(GC_DEBUG) + ident(RANY)operator(()ident(obj)operator(\)->)ident(file) operator(=) ident(ruby_sourcefile)operator(;) + ident(RANY)operator(()ident(obj)operator(\)->)ident(line) operator(=) ident(ruby_sourceline)operator(;) +preprocessor(#endif) + reserved(return) ident(obj)operator(;) +operator(}) + +ident(VALUE) +ident(rb_data_object_alloc)operator(()ident(klass)operator(,) ident(datap)operator(,) ident(dmark)operator(,) ident(dfree)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(void) operator(*)ident(datap)operator(;) + ident(RUBY_DATA_FUNC) ident(dmark)operator(;) + ident(RUBY_DATA_FUNC) ident(dfree)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(data)operator(,) reserved(struct) ident(RData)operator(\);) + reserved(if) operator(()ident(klass)operator(\)) ident(Check_Type)operator(()ident(klass)operator(,) ident(T_CLASS)operator(\);) + ident(OBJSETUP)operator(()ident(data)operator(,) ident(klass)operator(,) ident(T_DATA)operator(\);) + ident(data)operator(->)ident(data) operator(=) ident(datap)operator(;) + ident(data)operator(->)ident(dfree) operator(=) ident(dfree)operator(;) + ident(data)operator(->)ident(dmark) operator(=) ident(dmark)operator(;) + + reserved(return) operator(()ident(VALUE)operator(\))ident(data)operator(;) +operator(}) + +directive(extern) ident(st_table) operator(*)ident(rb_class_tbl)operator(;) +ident(VALUE) operator(*)ident(rb_gc_stack_start) operator(=) integer(0)operator(;) +preprocessor(#ifdef) ident(__ia64) +ident(VALUE) operator(*)ident(rb_gc_register_stack_start) operator(=) integer(0)operator(;) +preprocessor(#endif) + +preprocessor(#ifdef) ident(DJGPP) +comment(/* set stack size (http://www.delorie.com/djgpp/v2faq/faq15_9.html\) */) +pre_type(unsigned) pre_type(int) ident(_stklen) operator(=) hex(0x180000)operator(;) comment(/* 1.5 kB */) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(DJGPP)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32_WCE)operator(\)) +directive(static) pre_type(unsigned) pre_type(int) ident(STACK_LEVEL_MAX) operator(=) integer(65535)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(__human68k__)operator(\)) +pre_type(unsigned) pre_type(int) ident(_stacksize) operator(=) integer(262144)operator(;) +preprocessor(# define) ident(STACK_LEVEL_MAX) operator(()ident(_stacksize) operator(-) integer(4096)operator(\)) +preprocessor(# undef) ident(HAVE_GETRLIMIT) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_GETRLIMIT)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) +directive(static) ident(size_t) ident(STACK_LEVEL_MAX) operator(=) integer(655300)operator(;) +preprocessor(#else) +preprocessor(# define) ident(STACK_LEVEL_MAX) integer(655300) +preprocessor(#endif) + +preprocessor(#ifdef) ident(C_ALLOCA) +preprocessor(# define) ident(SET_STACK_END) ident(VALUE) ident(stack_end)operator(;) ident(alloca)operator(()integer(0)operator(\);) +preprocessor(# define) ident(STACK_END) operator((&)ident(stack_end)operator(\)) +preprocessor(#else) +preprocessor(# if) ident(defined)operator(()ident(__GNUC__)operator(\)) operator(&&) ident(defined)operator(()ident(USE_BUILTIN_FRAME_ADDRESS)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__ia64)operator(\)) +preprocessor(# if) operator(() ident(__GNUC__) operator(==) integer(3) operator(&&) ident(__GNUC_MINOR__) operator(>) integer(0) operator(\)) operator(||) ident(__GNUC__) operator(>) integer(3) +ident(__attribute__) operator((()ident(noinline)operator(\)\)) +preprocessor(# endif) +directive(static) directive(void) +ident(stack_end_address)operator(()ident(VALUE) operator(**)ident(stack_end_p)operator(\)) +operator({) + ident(VALUE) ident(stack_end)operator(;) + operator(*)ident(stack_end_p) operator(=) operator(&)ident(stack_end)operator(;) +operator(}) +preprocessor(# define) ident(SET_STACK_END) ident(VALUE) operator(*)ident(stack_end)operator(;) ident(stack_end_address)operator((&)ident(stack_end)operator(\)) +preprocessor(# else) +preprocessor(# define) ident(SET_STACK_END) ident(VALUE) operator(*)ident(stack_end) operator(=) ident(alloca)operator(()integer(1)operator(\)) +preprocessor(# endif) +preprocessor(# define) ident(STACK_END) operator(()ident(stack_end)operator(\)) +preprocessor(#endif) +preprocessor(#if) ident(STACK_GROW_DIRECTION) operator(<) integer(0) +preprocessor(# define) ident(STACK_LENGTH) operator(()ident(rb_gc_stack_start) operator(-) ident(STACK_END)operator(\)) +preprocessor(#elif) ident(STACK_GROW_DIRECTION) operator(>) integer(0) +preprocessor(# define) ident(STACK_LENGTH) operator(()ident(STACK_END) operator(-) ident(rb_gc_stack_start) operator(+) integer(1)operator(\)) +preprocessor(#else) +preprocessor(# define) ident(STACK_LENGTH) operator((()ident(STACK_END) operator(<) ident(rb_gc_stack_start)operator(\)) operator(?) ident(rb_gc_stack_start) operator(-) ident(STACK_END)\ + operator(:) ident(STACK_END) operator(-) ident(rb_gc_stack_start) operator(+) integer(1)operator(\)) +preprocessor(#endif) +preprocessor(#if) ident(STACK_GROW_DIRECTION) operator(>) integer(0) +preprocessor(# define) ident(STACK_UPPER)operator(()ident(x)operator(,) ident(a)operator(,) ident(b)operator(\)) ident(a) +preprocessor(#elif) ident(STACK_GROW_DIRECTION) operator(<) integer(0) +preprocessor(# define) ident(STACK_UPPER)operator(()ident(x)operator(,) ident(a)operator(,) ident(b)operator(\)) ident(b) +preprocessor(#else) +directive(static) pre_type(int) ident(grow_direction)operator(;) +directive(static) pre_type(int) +ident(stack_grow_direction)operator(()ident(addr)operator(\)) + ident(VALUE) operator(*)ident(addr)operator(;) +operator({) + ident(SET_STACK_END)operator(;) + + reserved(if) operator(()ident(STACK_END) operator(>) ident(addr)operator(\)) reserved(return) ident(grow_direction) operator(=) integer(1)operator(;) + reserved(return) ident(grow_direction) operator(=) operator(-)integer(1)operator(;) +operator(}) +preprocessor(# define) ident(stack_growup_p)operator(()ident(x)operator(\)) operator((()ident(grow_direction) operator(?) ident(grow_direction) operator(:) ident(stack_grow_direction)operator(()ident(x)operator(\)\)) operator(>) integer(0)operator(\)) +preprocessor(# define) ident(STACK_UPPER)operator(()ident(x)operator(,) ident(a)operator(,) ident(b)operator(\)) operator(()ident(stack_growup_p)operator(()ident(x)operator(\)) operator(?) ident(a) operator(:) ident(b)operator(\)) +preprocessor(#endif) + +preprocessor(#define) ident(GC_WATER_MARK) integer(512) + +preprocessor(#define) ident(CHECK_STACK)operator(()ident(ret)operator(\)) reserved(do) operator({)\ + ident(SET_STACK_END)operator(;)\ + operator(()ident(ret)operator(\)) operator(=) operator(()ident(STACK_LENGTH) operator(>) ident(STACK_LEVEL_MAX) operator(+) ident(GC_WATER_MARK)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +ident(size_t) +ident(ruby_stack_length)operator(()ident(p)operator(\)) + ident(VALUE) operator(**)ident(p)operator(;) +operator({) + ident(SET_STACK_END)operator(;) + reserved(if) operator(()ident(p)operator(\)) operator(*)ident(p) operator(=) ident(STACK_UPPER)operator(()ident(STACK_END)operator(,) ident(rb_gc_stack_start)operator(,) ident(STACK_END)operator(\);) + reserved(return) ident(STACK_LENGTH)operator(;) +operator(}) + +pre_type(int) +ident(ruby_stack_check)operator((\)) +operator({) + pre_type(int) ident(ret)operator(;) + + ident(CHECK_STACK)operator(()ident(ret)operator(\);) + reserved(return) ident(ret)operator(;) +operator(}) + +preprocessor(#define) ident(MARK_STACK_MAX) integer(1024) +directive(static) ident(VALUE) ident(mark_stack)operator([)ident(MARK_STACK_MAX)operator(];) +directive(static) ident(VALUE) operator(*)ident(mark_stack_ptr)operator(;) +directive(static) pre_type(int) ident(mark_stack_overflow)operator(;) + +directive(static) directive(void) +ident(init_mark_stack)operator((\)) +operator({) + ident(mark_stack_overflow) operator(=) integer(0)operator(;) + ident(mark_stack_ptr) operator(=) ident(mark_stack)operator(;) +operator(}) + +preprocessor(#define) ident(MARK_STACK_EMPTY) operator(()ident(mark_stack_ptr) operator(==) ident(mark_stack)operator(\)) + +directive(static) ident(st_table) operator(*)ident(source_filenames)operator(;) + +pre_type(char) operator(*) +ident(rb_source_filename)operator(()ident(f)operator(\)) + directive(const) pre_type(char) operator(*)ident(f)operator(;) +operator({) + ident(st_data_t) ident(name)operator(;) + + reserved(if) operator((!)ident(st_lookup)operator(()ident(source_filenames)operator(,) operator(()ident(st_data_t)operator(\))ident(f)operator(,) operator(&)ident(name)operator(\)\)) operator({) + pre_type(long) ident(len) operator(=) ident(strlen)operator(()ident(f)operator(\)) operator(+) integer(1)operator(;) + pre_type(char) operator(*)ident(ptr) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,) ident(len) operator(+) integer(1)operator(\);) + ident(name) operator(=) operator(()ident(st_data_t)operator(\))ident(ptr)operator(;) + operator(*)ident(ptr)operator(++) operator(=) integer(0)operator(;) + ident(MEMCPY)operator(()ident(ptr)operator(,) ident(f)operator(,) pre_type(char)operator(,) ident(len)operator(\);) + ident(st_add_direct)operator(()ident(source_filenames)operator(,) operator(()ident(st_data_t)operator(\))ident(ptr)operator(,) ident(name)operator(\);) + reserved(return) ident(ptr)operator(;) + operator(}) + reserved(return) operator(()pre_type(char) operator(*\))ident(name) operator(+) integer(1)operator(;) +operator(}) + +directive(static) directive(void) +ident(mark_source_filename)operator(()ident(f)operator(\)) + pre_type(char) operator(*)ident(f)operator(;) +operator({) + reserved(if) operator(()ident(f)operator(\)) operator({) + ident(f)operator([-)integer(1)operator(]) operator(=) integer(1)operator(;) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(sweep_source_filename)operator(()ident(key)operator(,) ident(value)operator(\)) + pre_type(char) operator(*)ident(key)operator(,) operator(*)ident(value)operator(;) +operator({) + reserved(if) operator((*)ident(value)operator(\)) operator({) + operator(*)ident(value) operator(=) integer(0)operator(;) + reserved(return) ident(ST_CONTINUE)operator(;) + operator(}) + reserved(else) operator({) + ident(free)operator(()ident(value)operator(\);) + reserved(return) ident(ST_DELETE)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) ident(gc_mark) ident(_)operator((()ident(VALUE) ident(ptr)operator(,) pre_type(int) ident(lev)operator(\)\);) +directive(static) directive(void) ident(gc_mark_children) ident(_)operator((()ident(VALUE) ident(ptr)operator(,) pre_type(int) ident(lev)operator(\)\);) + +directive(static) directive(void) +ident(gc_mark_all)operator((\)) +operator({) + ident(RVALUE) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + pre_type(int) ident(i)operator(;) + + ident(init_mark_stack)operator((\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(heaps_used)operator(;) ident(i)operator(++\)) operator({) + ident(p) operator(=) ident(heaps)operator([)ident(i)operator(])operator(.)ident(slot)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator((()ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) ident(FL_MARK)operator(\)) operator(&&) + operator(()ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(!=) ident(FL_MARK)operator(\)\)) operator({) + ident(gc_mark_children)operator((()ident(VALUE)operator(\))ident(p)operator(,) integer(0)operator(\);) + operator(}) + ident(p)operator(++;) + operator(}) + operator(}) +operator(}) + +directive(static) directive(void) +ident(gc_mark_rest)operator((\)) +operator({) + ident(VALUE) ident(tmp_arry)operator([)ident(MARK_STACK_MAX)operator(];) + ident(VALUE) operator(*)ident(p)operator(;) + + ident(p) operator(=) operator(()ident(mark_stack_ptr) operator(-) ident(mark_stack)operator(\)) operator(+) ident(tmp_arry)operator(;) + ident(MEMCPY)operator(()ident(tmp_arry)operator(,) ident(mark_stack)operator(,) ident(VALUE)operator(,) ident(MARK_STACK_MAX)operator(\);) + + ident(init_mark_stack)operator((\);) + reserved(while)operator(()ident(p) operator(!=) ident(tmp_arry)operator(\){) + ident(p)operator(--;) + ident(gc_mark_children)operator((*)ident(p)operator(,) integer(0)operator(\);) + operator(}) +operator(}) + +directive(static) directive(inline) pre_type(int) +ident(is_pointer_to_heap)operator(()ident(ptr)operator(\)) + directive(void) operator(*)ident(ptr)operator(;) +operator({) + directive(register) ident(RVALUE) operator(*)ident(p) operator(=) ident(RANY)operator(()ident(ptr)operator(\);) + directive(register) ident(RVALUE) operator(*)ident(heap_org)operator(;) + directive(register) pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(p) operator(<) ident(lomem) operator(||) ident(p) operator(>) ident(himem)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator((()ident(VALUE)operator(\))ident(p) operator(%) reserved(sizeof)operator(()ident(RVALUE)operator(\)) operator(!=) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + + comment(/* check if p looks like a pointer */) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i) operator(<) ident(heaps_used)operator(;) ident(i)operator(++\)) operator({) + ident(heap_org) operator(=) ident(heaps)operator([)ident(i)operator(])operator(.)ident(slot)operator(;) + reserved(if) operator(()ident(heap_org) operator(<=) ident(p) operator(&&) ident(p) operator(<) ident(heap_org) operator(+) ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit)operator(\)) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) directive(void) +ident(mark_locations_array)operator(()ident(x)operator(,) ident(n)operator(\)) + directive(register) ident(VALUE) operator(*)ident(x)operator(;) + directive(register) pre_type(long) ident(n)operator(;) +operator({) + ident(VALUE) ident(v)operator(;) + reserved(while) operator(()ident(n)operator(--\)) operator({) + ident(v) operator(=) operator(*)ident(x)operator(;) + reserved(if) operator(()ident(is_pointer_to_heap)operator((()directive(void) operator(*\))ident(v)operator(\)\)) operator({) + ident(gc_mark)operator(()ident(v)operator(,) integer(0)operator(\);) + operator(}) + ident(x)operator(++;) + operator(}) +operator(}) + +directive(void) +ident(rb_gc_mark_locations)operator(()ident(start)operator(,) ident(end)operator(\)) + ident(VALUE) operator(*)ident(start)operator(,) operator(*)ident(end)operator(;) +operator({) + pre_type(long) ident(n)operator(;) + + ident(n) operator(=) ident(end) operator(-) ident(start)operator(;) + ident(mark_locations_array)operator(()ident(start)operator(,)ident(n)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(mark_entry)operator(()ident(key)operator(,) ident(value)operator(,) ident(lev)operator(\)) + ident(ID) ident(key)operator(;) + ident(VALUE) ident(value)operator(;) + pre_type(int) ident(lev)operator(;) +operator({) + ident(gc_mark)operator(()ident(value)operator(,) ident(lev)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) directive(void) +ident(mark_tbl)operator(()ident(tbl)operator(,) ident(lev)operator(\)) + ident(st_table) operator(*)ident(tbl)operator(;) + pre_type(int) ident(lev)operator(;) +operator({) + reserved(if) operator((!)ident(tbl)operator(\)) reserved(return)operator(;) + ident(st_foreach)operator(()ident(tbl)operator(,) ident(mark_entry)operator(,) ident(lev)operator(\);) +operator(}) + +directive(void) +ident(rb_mark_tbl)operator(()ident(tbl)operator(\)) + ident(st_table) operator(*)ident(tbl)operator(;) +operator({) + ident(mark_tbl)operator(()ident(tbl)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(mark_key)operator(()ident(key)operator(,) ident(value)operator(,) ident(lev)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + pre_type(int) ident(lev)operator(;) +operator({) + ident(gc_mark)operator(()ident(key)operator(,) ident(lev)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) directive(void) +ident(mark_set)operator(()ident(tbl)operator(,) ident(lev)operator(\)) + ident(st_table) operator(*)ident(tbl)operator(;) + pre_type(int) ident(lev)operator(;) +operator({) + reserved(if) operator((!)ident(tbl)operator(\)) reserved(return)operator(;) + ident(st_foreach)operator(()ident(tbl)operator(,) ident(mark_key)operator(,) ident(lev)operator(\);) +operator(}) + +directive(void) +ident(rb_mark_set)operator(()ident(tbl)operator(\)) + ident(st_table) operator(*)ident(tbl)operator(;) +operator({) + ident(mark_set)operator(()ident(tbl)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(mark_keyvalue)operator(()ident(key)operator(,) ident(value)operator(,) ident(lev)operator(\)) + ident(VALUE) ident(key)operator(;) + ident(VALUE) ident(value)operator(;) + pre_type(int) ident(lev)operator(;) +operator({) + ident(gc_mark)operator(()ident(key)operator(,) ident(lev)operator(\);) + ident(gc_mark)operator(()ident(value)operator(,) ident(lev)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) directive(void) +ident(mark_hash)operator(()ident(tbl)operator(,) ident(lev)operator(\)) + ident(st_table) operator(*)ident(tbl)operator(;) + pre_type(int) ident(lev)operator(;) +operator({) + reserved(if) operator((!)ident(tbl)operator(\)) reserved(return)operator(;) + ident(st_foreach)operator(()ident(tbl)operator(,) ident(mark_keyvalue)operator(,) ident(lev)operator(\);) +operator(}) + +directive(void) +ident(rb_mark_hash)operator(()ident(tbl)operator(\)) + ident(st_table) operator(*)ident(tbl)operator(;) +operator({) + ident(mark_hash)operator(()ident(tbl)operator(,) integer(0)operator(\);) +operator(}) + +directive(void) +ident(rb_gc_mark_maybe)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(is_pointer_to_heap)operator((()directive(void) operator(*\))ident(obj)operator(\)\)) operator({) + ident(gc_mark)operator(()ident(obj)operator(,) integer(0)operator(\);) + operator(}) +operator(}) + +preprocessor(#define) ident(GC_LEVEL_MAX) integer(250) + +directive(static) directive(void) +ident(gc_mark)operator(()ident(ptr)operator(,) ident(lev)operator(\)) + ident(VALUE) ident(ptr)operator(;) + pre_type(int) ident(lev)operator(;) +operator({) + directive(register) ident(RVALUE) operator(*)ident(obj)operator(;) + + ident(obj) operator(=) ident(RANY)operator(()ident(ptr)operator(\);) + reserved(if) operator(()ident(rb_special_const_p)operator(()ident(ptr)operator(\)\)) reserved(return)operator(;) comment(/* special const not marked */) + reserved(if) operator(()ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(==) integer(0)operator(\)) reserved(return)operator(;) comment(/* free cell */) + reserved(if) operator(()ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) ident(FL_MARK)operator(\)) reserved(return)operator(;) comment(/* already marked */) + ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(|=) ident(FL_MARK)operator(;) + + reserved(if) operator(()ident(lev) operator(>) ident(GC_LEVEL_MAX) operator(||) operator(()ident(lev) operator(==) integer(0) operator(&&) ident(ruby_stack_check)operator((\)\)\)) operator({) + reserved(if) operator((!)ident(mark_stack_overflow)operator(\)) operator({) + reserved(if) operator(()ident(mark_stack_ptr) operator(-) ident(mark_stack) operator(<) ident(MARK_STACK_MAX)operator(\)) operator({) + operator(*)ident(mark_stack_ptr) operator(=) ident(ptr)operator(;) + ident(mark_stack_ptr)operator(++;) + operator(}) + reserved(else) operator({) + ident(mark_stack_overflow) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(return)operator(;) + operator(}) + ident(gc_mark_children)operator(()ident(ptr)operator(,) ident(lev)operator(+)integer(1)operator(\);) +operator(}) + +directive(void) +ident(rb_gc_mark)operator(()ident(ptr)operator(\)) + ident(VALUE) ident(ptr)operator(;) +operator({) + ident(gc_mark)operator(()ident(ptr)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) directive(void) +ident(gc_mark_children)operator(()ident(ptr)operator(,) ident(lev)operator(\)) + ident(VALUE) ident(ptr)operator(;) + pre_type(int) ident(lev)operator(;) +operator({) + directive(register) ident(RVALUE) operator(*)ident(obj) operator(=) ident(RANY)operator(()ident(ptr)operator(\);) + + reserved(goto) ident(marking)operator(;) comment(/* skip */) + + label(again)operator(:) + ident(obj) operator(=) ident(RANY)operator(()ident(ptr)operator(\);) + reserved(if) operator(()ident(rb_special_const_p)operator(()ident(ptr)operator(\)\)) reserved(return)operator(;) comment(/* special const not marked */) + reserved(if) operator(()ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(==) integer(0)operator(\)) reserved(return)operator(;) comment(/* free cell */) + reserved(if) operator(()ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) ident(FL_MARK)operator(\)) reserved(return)operator(;) comment(/* already marked */) + ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(|=) ident(FL_MARK)operator(;) + + label(marking)operator(:) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)\)) operator({) + ident(rb_mark_generic_ivar)operator(()ident(ptr)operator(\);) + operator(}) + + reserved(switch) operator(()ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) ident(T_MASK)operator(\)) operator({) + reserved(case) label(T_NIL)operator(:) + reserved(case) label(T_FIXNUM)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(rb_gc_mark(\) called for broken object)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_NODE)operator(:) + ident(mark_source_filename)operator(()ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(nd_file)operator(\);) + reserved(switch) operator(()ident(nd_type)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(NODE_IF)operator(:) comment(/* 1,2,3 */) + reserved(case) label(NODE_FOR)operator(:) + reserved(case) label(NODE_ITER)operator(:) + reserved(case) label(NODE_CREF)operator(:) + reserved(case) label(NODE_WHEN)operator(:) + reserved(case) label(NODE_MASGN)operator(:) + reserved(case) label(NODE_RESCUE)operator(:) + reserved(case) label(NODE_RESBODY)operator(:) + reserved(case) label(NODE_CLASS)operator(:) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u2)operator(.)ident(node)operator(,) ident(lev)operator(\);) + comment(/* fall through */) + reserved(case) label(NODE_BLOCK)operator(:) comment(/* 1,3 */) + reserved(case) label(NODE_ARRAY)operator(:) + reserved(case) label(NODE_DSTR)operator(:) + reserved(case) label(NODE_DXSTR)operator(:) + reserved(case) label(NODE_DREGX)operator(:) + reserved(case) label(NODE_DREGX_ONCE)operator(:) + reserved(case) label(NODE_FBODY)operator(:) + reserved(case) label(NODE_ENSURE)operator(:) + reserved(case) label(NODE_CALL)operator(:) + reserved(case) label(NODE_DEFS)operator(:) + reserved(case) label(NODE_OP_ASGN1)operator(:) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u1)operator(.)ident(node)operator(,) ident(lev)operator(\);) + comment(/* fall through */) + reserved(case) label(NODE_SUPER)operator(:) comment(/* 3 */) + reserved(case) label(NODE_FCALL)operator(:) + reserved(case) label(NODE_DEFN)operator(:) + reserved(case) label(NODE_NEWLINE)operator(:) + ident(ptr) operator(=) operator(()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u3)operator(.)ident(node)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_WHILE)operator(:) comment(/* 1,2 */) + reserved(case) label(NODE_UNTIL)operator(:) + reserved(case) label(NODE_AND)operator(:) + reserved(case) label(NODE_OR)operator(:) + reserved(case) label(NODE_CASE)operator(:) + reserved(case) label(NODE_SCLASS)operator(:) + reserved(case) label(NODE_DOT2)operator(:) + reserved(case) label(NODE_DOT3)operator(:) + reserved(case) label(NODE_FLIP2)operator(:) + reserved(case) label(NODE_FLIP3)operator(:) + reserved(case) label(NODE_MATCH2)operator(:) + reserved(case) label(NODE_MATCH3)operator(:) + reserved(case) label(NODE_OP_ASGN_OR)operator(:) + reserved(case) label(NODE_OP_ASGN_AND)operator(:) + reserved(case) label(NODE_MODULE)operator(:) + reserved(case) label(NODE_ALIAS)operator(:) + reserved(case) label(NODE_VALIAS)operator(:) + reserved(case) label(NODE_ARGS)operator(:) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u1)operator(.)ident(node)operator(,) ident(lev)operator(\);) + comment(/* fall through */) + reserved(case) label(NODE_METHOD)operator(:) comment(/* 2 */) + reserved(case) label(NODE_NOT)operator(:) + reserved(case) label(NODE_GASGN)operator(:) + reserved(case) label(NODE_LASGN)operator(:) + reserved(case) label(NODE_DASGN)operator(:) + reserved(case) label(NODE_DASGN_CURR)operator(:) + reserved(case) label(NODE_IASGN)operator(:) + reserved(case) label(NODE_CVDECL)operator(:) + reserved(case) label(NODE_CVASGN)operator(:) + reserved(case) label(NODE_COLON3)operator(:) + reserved(case) label(NODE_OPT_N)operator(:) + reserved(case) label(NODE_EVSTR)operator(:) + reserved(case) label(NODE_UNDEF)operator(:) + ident(ptr) operator(=) operator(()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u2)operator(.)ident(node)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_HASH)operator(:) comment(/* 1 */) + reserved(case) label(NODE_LIT)operator(:) + reserved(case) label(NODE_STR)operator(:) + reserved(case) label(NODE_XSTR)operator(:) + reserved(case) label(NODE_DEFINED)operator(:) + reserved(case) label(NODE_MATCH)operator(:) + reserved(case) label(NODE_RETURN)operator(:) + reserved(case) label(NODE_BREAK)operator(:) + reserved(case) label(NODE_NEXT)operator(:) + reserved(case) label(NODE_YIELD)operator(:) + reserved(case) label(NODE_COLON2)operator(:) + reserved(case) label(NODE_SPLAT)operator(:) + reserved(case) label(NODE_TO_ARY)operator(:) + reserved(case) label(NODE_SVALUE)operator(:) + ident(ptr) operator(=) operator(()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u1)operator(.)ident(node)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_SCOPE)operator(:) comment(/* 2,3 */) + reserved(case) label(NODE_BLOCK_PASS)operator(:) + reserved(case) label(NODE_CDECL)operator(:) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u3)operator(.)ident(node)operator(,) ident(lev)operator(\);) + ident(ptr) operator(=) operator(()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u2)operator(.)ident(node)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_ZARRAY)operator(:) comment(/* - */) + reserved(case) label(NODE_ZSUPER)operator(:) + reserved(case) label(NODE_CFUNC)operator(:) + reserved(case) label(NODE_VCALL)operator(:) + reserved(case) label(NODE_GVAR)operator(:) + reserved(case) label(NODE_LVAR)operator(:) + reserved(case) label(NODE_DVAR)operator(:) + reserved(case) label(NODE_IVAR)operator(:) + reserved(case) label(NODE_CVAR)operator(:) + reserved(case) label(NODE_NTH_REF)operator(:) + reserved(case) label(NODE_BACK_REF)operator(:) + reserved(case) label(NODE_REDO)operator(:) + reserved(case) label(NODE_RETRY)operator(:) + reserved(case) label(NODE_SELF)operator(:) + reserved(case) label(NODE_NIL)operator(:) + reserved(case) label(NODE_TRUE)operator(:) + reserved(case) label(NODE_FALSE)operator(:) + reserved(case) label(NODE_ATTRSET)operator(:) + reserved(case) label(NODE_BLOCK_ARG)operator(:) + reserved(case) label(NODE_POSTEXE)operator(:) + reserved(break)operator(;) + reserved(case) label(NODE_ALLOCA)operator(:) + ident(mark_locations_array)operator((()ident(VALUE)operator(*\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u1)operator(.)ident(value)operator(,) + ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u3)operator(.)ident(cnt)operator(\);) + ident(ptr) operator(=) operator(()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u2)operator(.)ident(node)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(default)operator(:) comment(/* unlisted NODE */) + reserved(if) operator(()ident(is_pointer_to_heap)operator(()ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u1)operator(.)ident(node)operator(\)\)) operator({) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u1)operator(.)ident(node)operator(,) ident(lev)operator(\);) + operator(}) + reserved(if) operator(()ident(is_pointer_to_heap)operator(()ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u2)operator(.)ident(node)operator(\)\)) operator({) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u2)operator(.)ident(node)operator(,) ident(lev)operator(\);) + operator(}) + reserved(if) operator(()ident(is_pointer_to_heap)operator(()ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u3)operator(.)ident(node)operator(\)\)) operator({) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(node)operator(.)ident(u3)operator(.)ident(node)operator(,) ident(lev)operator(\);) + operator(}) + operator(}) + reserved(return)operator(;) comment(/* no need to mark class. */) + operator(}) + + ident(gc_mark)operator(()ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(klass)operator(,) ident(lev)operator(\);) + reserved(switch) operator(()ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) ident(T_MASK)operator(\)) operator({) + reserved(case) label(T_ICLASS)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + ident(mark_tbl)operator(()ident(obj)operator(->)ident(as)operator(.)ident(klass)operator(.)ident(m_tbl)operator(,) ident(lev)operator(\);) + ident(mark_tbl)operator(()ident(obj)operator(->)ident(as)operator(.)ident(klass)operator(.)ident(iv_tbl)operator(,) ident(lev)operator(\);) + ident(ptr) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(klass)operator(.)ident(super)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(T_ARRAY)operator(:) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + ident(ptr) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(array)operator(.)ident(aux)operator(.)ident(shared)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + reserved(else) operator({) + pre_type(long) ident(i)operator(,) ident(len) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(array)operator(.)ident(len)operator(;) + ident(VALUE) operator(*)ident(ptr) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(array)operator(.)ident(ptr)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(gc_mark)operator((*)ident(ptr)operator(++,) ident(lev)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_HASH)operator(:) + ident(mark_hash)operator(()ident(obj)operator(->)ident(as)operator(.)ident(hash)operator(.)ident(tbl)operator(,) ident(lev)operator(\);) + ident(ptr) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(hash)operator(.)ident(ifnone)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(T_STRING)operator(:) +preprocessor(#define) ident(STR_ASSOC) ident(FL_USER3) comment(/* copied from string.c */) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(ELTS_SHARED)operator(|)ident(STR_ASSOC)operator(\)\)) operator({) + ident(ptr) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(string)operator(.)ident(aux)operator(.)ident(shared)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_DATA)operator(:) + reserved(if) operator(()ident(obj)operator(->)ident(as)operator(.)ident(data)operator(.)ident(dmark)operator(\)) operator((*)ident(obj)operator(->)ident(as)operator(.)ident(data)operator(.)ident(dmark)operator(\)()ident(DATA_PTR)operator(()ident(obj)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(T_OBJECT)operator(:) + ident(mark_tbl)operator(()ident(obj)operator(->)ident(as)operator(.)ident(object)operator(.)ident(iv_tbl)operator(,) ident(lev)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FILE)operator(:) + reserved(case) label(T_REGEXP)operator(:) + reserved(case) label(T_FLOAT)operator(:) + reserved(case) label(T_BIGNUM)operator(:) + reserved(case) label(T_BLKTAG)operator(:) + reserved(break)operator(;) + + reserved(case) label(T_MATCH)operator(:) + reserved(if) operator(()ident(obj)operator(->)ident(as)operator(.)ident(match)operator(.)ident(str)operator(\)) operator({) + ident(ptr) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(match)operator(.)ident(str)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_VARMAP)operator(:) + ident(gc_mark)operator(()ident(obj)operator(->)ident(as)operator(.)ident(varmap)operator(.)ident(val)operator(,) ident(lev)operator(\);) + ident(ptr) operator(=) operator(()ident(VALUE)operator(\))ident(obj)operator(->)ident(as)operator(.)ident(varmap)operator(.)ident(next)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(T_SCOPE)operator(:) + reserved(if) operator(()ident(obj)operator(->)ident(as)operator(.)ident(scope)operator(.)ident(local_vars) operator(&&) operator(()ident(obj)operator(->)ident(as)operator(.)ident(scope)operator(.)ident(flags) operator(&) ident(SCOPE_MALLOC)operator(\)\)) operator({) + pre_type(int) ident(n) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(scope)operator(.)ident(local_tbl)operator([)integer(0)operator(]+)integer(1)operator(;) + ident(VALUE) operator(*)ident(vars) operator(=) operator(&)ident(obj)operator(->)ident(as)operator(.)ident(scope)operator(.)ident(local_vars)operator([-)integer(1)operator(];) + + reserved(while) operator(()ident(n)operator(--\)) operator({) + ident(gc_mark)operator((*)ident(vars)operator(++,) ident(lev)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_STRUCT)operator(:) + operator({) + pre_type(long) ident(len) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(rstruct)operator(.)ident(len)operator(;) + ident(VALUE) operator(*)ident(ptr) operator(=) ident(obj)operator(->)ident(as)operator(.)ident(rstruct)operator(.)ident(ptr)operator(;) + + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(gc_mark)operator((*)ident(ptr)operator(++,) ident(lev)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(rb_gc_mark(\): unknown data type 0x%lx(0x%lx\) %s)delimiter(")>operator(,) + ident(obj)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) ident(T_MASK)operator(,) ident(obj)operator(,) + ident(is_pointer_to_heap)operator(()ident(obj)operator(\)) operator(?) string<delimiter(")content(corrupted object)delimiter(")> operator(:) string<delimiter(")content(non object)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) ident(obj_free) ident(_)operator((()ident(VALUE)operator(\)\);) + +directive(static) directive(inline) directive(void) +ident(add_freelist)operator(()ident(p)operator(\)) + ident(RVALUE) operator(*)ident(p)operator(;) +operator({) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(flags) operator(=) integer(0)operator(;) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(next) operator(=) ident(freelist)operator(;) + ident(freelist) operator(=) ident(p)operator(;) +operator(}) + +directive(static) directive(void) +ident(finalize_list)operator(()ident(p)operator(\)) + ident(RVALUE) operator(*)ident(p)operator(;) +operator({) + reserved(while) operator(()ident(p)operator(\)) operator({) + ident(RVALUE) operator(*)ident(tmp) operator(=) ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(next)operator(;) + ident(run_final)operator((()ident(VALUE)operator(\))ident(p)operator(\);) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(p)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) comment(/* not freeing page */) + ident(add_freelist)operator(()ident(p)operator(\);) + operator(}) + ident(p) operator(=) ident(tmp)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(free_unused_heaps)operator((\)) +operator({) + pre_type(int) ident(i)operator(,) ident(j)operator(;) + + reserved(for) operator(()ident(i) operator(=) ident(j) operator(=) integer(1)operator(;) ident(j) operator(<) ident(heaps_used)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit) operator(==) integer(0)operator(\)) operator({) + ident(free)operator(()ident(heaps)operator([)ident(i)operator(])operator(.)ident(membase)operator(\);) + ident(heaps_used)operator(--;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(i) operator(!=) ident(j)operator(\)) operator({) + ident(heaps)operator([)ident(j)operator(]) operator(=) ident(heaps)operator([)ident(i)operator(];) + operator(}) + ident(j)operator(++;) + operator(}) + operator(}) +operator(}) + +preprocessor(#define) ident(T_DEFERRED) hex(0x3a) + +directive(void) ident(rb_gc_abort_threads)operator(()directive(void)operator(\);) + +directive(static) directive(void) +ident(gc_sweep)operator((\)) +operator({) + ident(RVALUE) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(,) operator(*)ident(final_list)operator(;) + pre_type(int) ident(freed) operator(=) integer(0)operator(;) + pre_type(int) ident(i)operator(;) + pre_type(unsigned) pre_type(long) ident(live) operator(=) integer(0)operator(;) + pre_type(unsigned) pre_type(long) ident(free_min) operator(=) integer(0)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(heaps_used)operator(;) ident(i)operator(++\)) operator({) + ident(free_min) operator(+=) ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit)operator(;) + operator(}) + ident(free_min) operator(=) ident(free_min) operator(*) float(0)float(.2)operator(;) + reserved(if) operator(()ident(free_min) operator(<) ident(FREE_MIN)operator(\)) + ident(free_min) operator(=) ident(FREE_MIN)operator(;) + + reserved(if) operator(()ident(ruby_in_compile) operator(&&) ident(ruby_parser_stack_on_heap)operator((\)\)) operator({) + comment(/* should not reclaim nodes during compilation + if yacc's semantic stack is not allocated on machine stack */) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(heaps_used)operator(;) ident(i)operator(++\)) operator({) + ident(p) operator(=) ident(heaps)operator([)ident(i)operator(])operator(.)ident(slot)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator((!()ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags)operator(&)ident(FL_MARK)operator(\)) operator(&&) ident(BUILTIN_TYPE)operator(()ident(p)operator(\)) operator(==) ident(T_NODE)operator(\)) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(p)operator(,) integer(0)operator(\);) + ident(p)operator(++;) + operator(}) + operator(}) + operator(}) + + ident(mark_source_filename)operator(()ident(ruby_sourcefile)operator(\);) + reserved(if) operator(()ident(source_filenames)operator(\)) operator({) + ident(st_foreach)operator(()ident(source_filenames)operator(,) ident(sweep_source_filename)operator(,) integer(0)operator(\);) + operator(}) + + ident(freelist) operator(=) integer(0)operator(;) + ident(final_list) operator(=) ident(deferred_final_list)operator(;) + ident(deferred_final_list) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(heaps_used)operator(;) ident(i)operator(++\)) operator({) + pre_type(int) ident(n) operator(=) integer(0)operator(;) + ident(RVALUE) operator(*)ident(free) operator(=) ident(freelist)operator(;) + ident(RVALUE) operator(*)ident(final) operator(=) ident(final_list)operator(;) + pre_type(int) ident(deferred)operator(;) + + ident(p) operator(=) ident(heaps)operator([)ident(i)operator(])operator(.)ident(slot)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator((!()ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) ident(FL_MARK)operator(\)\)) operator({) + reserved(if) operator(()ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&&) + operator((()ident(deferred) operator(=) ident(obj_free)operator((()ident(VALUE)operator(\))ident(p)operator(\)\)) operator(||) + operator((()ident(FL_TEST)operator(()ident(p)operator(,) ident(FL_FINALIZE)operator(\)\)) operator(&&) ident(need_call_final)operator(\)\)\)) operator({) + reserved(if) operator((!)ident(deferred)operator(\)) operator({) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(flags) operator(=) ident(T_DEFERRED)operator(;) + ident(RDATA)operator(()ident(p)operator(\)->)ident(dfree) operator(=) integer(0)operator(;) + operator(}) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(flags) operator(|=) ident(FL_MARK)operator(;) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(next) operator(=) ident(final_list)operator(;) + ident(final_list) operator(=) ident(p)operator(;) + operator(}) + reserved(else) operator({) + ident(add_freelist)operator(()ident(p)operator(\);) + operator(}) + ident(n)operator(++;) + operator(}) + reserved(else) reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(p)operator(\)) operator(==) ident(T_DEFERRED)operator(\)) operator({) + comment(/* objects to be finalized */) + comment(/* do nothing remain marked */) + operator(}) + reserved(else) operator({) + ident(RBASIC)operator(()ident(p)operator(\)->)ident(flags) operator(&=) operator(~)ident(FL_MARK)operator(;) + ident(live)operator(++;) + operator(}) + ident(p)operator(++;) + operator(}) + reserved(if) operator(()ident(n) operator(==) ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit) operator(&&) ident(freed) operator(>) ident(free_min)operator(\)) operator({) + ident(RVALUE) operator(*)ident(pp)operator(;) + + ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(pp) operator(=) ident(final_list)operator(;) ident(pp) operator(!=) ident(final)operator(;) ident(pp) operator(=) ident(pp)operator(->)ident(as)operator(.)ident(free)operator(.)ident(next)operator(\)) operator({) + ident(pp)operator(->)ident(as)operator(.)ident(free)operator(.)ident(flags) operator(|=) ident(FL_SINGLETON)operator(;) comment(/* freeing page mark */) + operator(}) + ident(freelist) operator(=) ident(free)operator(;) comment(/* cancel this page from freelist */) + operator(}) + reserved(else) operator({) + ident(freed) operator(+=) ident(n)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(malloc_increase) operator(>) ident(malloc_limit)operator(\)) operator({) + ident(malloc_limit) operator(+=) operator(()ident(malloc_increase) operator(-) ident(malloc_limit)operator(\)) operator(*) operator(()pre_type(double)operator(\))ident(live) operator(/) operator(()ident(live) operator(+) ident(freed)operator(\);) + reserved(if) operator(()ident(malloc_limit) operator(<) ident(GC_MALLOC_LIMIT)operator(\)) ident(malloc_limit) operator(=) ident(GC_MALLOC_LIMIT)operator(;) + operator(}) + ident(malloc_increase) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(freed) operator(<) ident(free_min)operator(\)) operator({) + ident(add_heap)operator((\);) + operator(}) + ident(during_gc) operator(=) integer(0)operator(;) + + comment(/* clear finalization list */) + reserved(if) operator(()ident(final_list)operator(\)) operator({) + ident(deferred_final_list) operator(=) ident(final_list)operator(;) + ident(rb_thread_pending) operator(=) integer(1)operator(;) + reserved(return)operator(;) + operator(}) + ident(free_unused_heaps)operator((\);) +operator(}) + +directive(void) +ident(rb_gc_force_recycle)operator(()ident(p)operator(\)) + ident(VALUE) ident(p)operator(;) +operator({) + ident(add_freelist)operator((()ident(RVALUE)operator(*\))ident(p)operator(\);) +operator(}) + +directive(static) directive(inline) directive(void) +ident(make_deferred)operator(()ident(p)operator(\)) + ident(RVALUE) operator(*)ident(p)operator(;) +operator({) + ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(=) operator(()ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) operator(~)ident(T_MASK)operator(\)) operator(|) ident(T_DEFERRED)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(obj_free)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(switch) operator(()ident(BUILTIN_TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_NIL)operator(:) + reserved(case) label(T_FIXNUM)operator(:) + reserved(case) label(T_TRUE)operator(:) + reserved(case) label(T_FALSE)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(obj_free(\) called for broken object)delimiter(")>operator(\);) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)\)) operator({) + ident(rb_free_generic_ivar)operator((()ident(VALUE)operator(\))ident(obj)operator(\);) + operator(}) + + reserved(switch) operator(()ident(BUILTIN_TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_OBJECT)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(object)operator(.)ident(iv_tbl)operator(\)) operator({) + ident(st_free_table)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(object)operator(.)ident(iv_tbl)operator(\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_CLASS)operator(:) + ident(rb_clear_cache_by_class)operator((()ident(VALUE)operator(\))ident(obj)operator(\);) + ident(st_free_table)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(klass)operator(.)ident(m_tbl)operator(\);) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(object)operator(.)ident(iv_tbl)operator(\)) operator({) + ident(st_free_table)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(object)operator(.)ident(iv_tbl)operator(\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_STRING)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(string)operator(.)ident(ptr) operator(&&) operator(!)ident(FL_TEST)operator(()ident(obj)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(string)operator(.)ident(ptr)operator(\)\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_ARRAY)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(array)operator(.)ident(ptr) operator(&&) operator(!)ident(FL_TEST)operator(()ident(obj)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(array)operator(.)ident(ptr)operator(\)\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_HASH)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(hash)operator(.)ident(tbl)operator(\)) operator({) + ident(st_free_table)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(hash)operator(.)ident(tbl)operator(\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_REGEXP)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(regexp)operator(.)ident(ptr)operator(\)) operator({) + ident(re_free_pattern)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(regexp)operator(.)ident(ptr)operator(\);) + operator(}) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(regexp)operator(.)ident(str)operator(\)) operator({) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(regexp)operator(.)ident(str)operator(\)\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_DATA)operator(:) + reserved(if) operator(()ident(DATA_PTR)operator(()ident(obj)operator(\)\)) operator({) + reserved(if) operator((()pre_type(long)operator(\))ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(data)operator(.)ident(dfree) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(DATA_PTR)operator(()ident(obj)operator(\)\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(data)operator(.)ident(dfree)operator(\)) operator({) + ident(make_deferred)operator(()ident(RANY)operator(()ident(obj)operator(\)\);) + reserved(return) integer(1)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_MATCH)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(match)operator(.)ident(regs)operator(\)) operator({) + ident(re_free_registers)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(match)operator(.)ident(regs)operator(\);) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(match)operator(.)ident(regs)operator(\)\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_FILE)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(file)operator(.)ident(fptr)operator(\)) operator({) + reserved(struct) ident(rb_io_t) operator(*)ident(fptr) operator(=) ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(file)operator(.)ident(fptr)operator(;) + ident(make_deferred)operator(()ident(RANY)operator(()ident(obj)operator(\)\);) + ident(RDATA)operator(()ident(obj)operator(\)->)ident(dfree) operator(=) operator(()directive(void) operator((*\)()directive(void)operator(*\)\))ident(rb_io_fptr_finalize)operator(;) + ident(RDATA)operator(()ident(obj)operator(\)->)ident(data) operator(=) ident(fptr)operator(;) + reserved(return) integer(1)operator(;) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_ICLASS)operator(:) + comment(/* iClass shares table with the module */) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + reserved(case) label(T_VARMAP)operator(:) + reserved(case) label(T_BLKTAG)operator(:) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(bignum)operator(.)ident(digits)operator(\)) operator({) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(bignum)operator(.)ident(digits)operator(\)\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_NODE)operator(:) + reserved(switch) operator(()ident(nd_type)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(NODE_SCOPE)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(node)operator(.)ident(u1)operator(.)ident(tbl)operator(\)) operator({) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(node)operator(.)ident(u1)operator(.)ident(tbl)operator(\)\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(NODE_ALLOCA)operator(:) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(node)operator(.)ident(u1)operator(.)ident(node)operator(\)\);) + reserved(break)operator(;) + operator(}) + reserved(break)operator(;) comment(/* no need to free iv_tbl */) + + reserved(case) label(T_SCOPE)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(scope)operator(.)ident(local_vars) operator(&&) + ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(scope)operator(.)ident(flags) operator(!=) ident(SCOPE_ALLOCA)operator(\)) operator({) + ident(VALUE) operator(*)ident(vars) operator(=) ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(scope)operator(.)ident(local_vars)operator(-)integer(1)operator(;) + reserved(if) operator((!()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(scope)operator(.)ident(flags) operator(&) ident(SCOPE_CLONE)operator(\)) operator(&&) ident(vars)operator([)integer(0)operator(]) operator(==) integer(0)operator(\)) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(scope)operator(.)ident(local_tbl)operator(\)\);) + reserved(if) operator((()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(scope)operator(.)ident(flags) operator(&) operator(()ident(SCOPE_MALLOC)operator(|)ident(SCOPE_CLONE)operator(\)\)) operator(==) ident(SCOPE_MALLOC)operator(\)) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(vars)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_STRUCT)operator(:) + reserved(if) operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(rstruct)operator(.)ident(ptr)operator(\)) operator({) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(rstruct)operator(.)ident(ptr)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(gc_sweep(\): unknown data type 0x%lx(0x%lx\))delimiter(")>operator(,) + ident(RANY)operator(()ident(obj)operator(\)->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) ident(T_MASK)operator(,) ident(obj)operator(\);) + operator(}) + + reserved(return) integer(0)operator(;) +operator(}) + +directive(void) +ident(rb_gc_mark_frame)operator(()ident(frame)operator(\)) + reserved(struct) ident(FRAME) operator(*)ident(frame)operator(;) +operator({) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(frame)operator(->)ident(node)operator(,) integer(0)operator(\);) +operator(}) + +preprocessor(#ifdef) ident(__GNUC__) +preprocessor(#if) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(DJGPP)operator(\)) +preprocessor(#if) ident(defined)operator(()ident(__human68k__)operator(\)) +reserved(typedef) pre_type(unsigned) pre_type(long) ident(rb_jmp_buf)operator([)integer(8)operator(];) +ident(__asm__) operator(()string<delimiter(")content(.even)char(\\n)char(\\ +)content(_rb_setjmp:)char(\\n)char(\\ +)content( move.l 4(sp\),a0)char(\\n)char(\\ +)content( movem.l d3-d7/a3-a5,(a0\))char(\\n)char(\\ +)content( moveq.l #0,d0)char(\\n)char(\\ +)content( rts)delimiter(")>operator(\);) +preprocessor(#ifdef) ident(setjmp) +preprocessor(#undef) ident(setjmp) +preprocessor(#endif) +preprocessor(#else) +preprocessor(#if) ident(defined)operator(()ident(DJGPP)operator(\)) +reserved(typedef) pre_type(unsigned) pre_type(long) ident(rb_jmp_buf)operator([)integer(6)operator(];) +ident(__asm__) operator(()string<delimiter(")content(.align 4)char(\\n)char(\\ +)content(_rb_setjmp:)char(\\n)char(\\ +)content( pushl %ebp)char(\\n)char(\\ +)content( movl %esp,%ebp)char(\\n)char(\\ +)content( movl 8(%ebp\),%ebp)char(\\n)char(\\ +)content( movl %eax,(%ebp\))char(\\n)char(\\ +)content( movl %ebx,4(%ebp\))char(\\n)char(\\ +)content( movl %ecx,8(%ebp\))char(\\n)char(\\ +)content( movl %edx,12(%ebp\))char(\\n)char(\\ +)content( movl %esi,16(%ebp\))char(\\n)char(\\ +)content( movl %edi,20(%ebp\))char(\\n)char(\\ +)content( popl %ebp)char(\\n)char(\\ +)content( xorl %eax,%eax)char(\\n)char(\\ +)content( ret)delimiter(")>operator(\);) +preprocessor(#endif) +preprocessor(#endif) +pre_type(int) ident(rb_setjmp) operator(()ident(rb_jmp_buf)operator(\);) +preprocessor(#define) ident(jmp_buf) ident(rb_jmp_buf) +preprocessor(#define) ident(setjmp) ident(rb_setjmp) +preprocessor(#endif) comment(/* __human68k__ or DJGPP */) +preprocessor(#endif) comment(/* __GNUC__ */) + +directive(static) directive(void) +ident(garbage_collect)operator((\)) +operator({) + reserved(struct) ident(gc_list) operator(*)ident(list)operator(;) + reserved(struct) ident(FRAME) operator(*) directive(volatile) ident(frame)operator(;) comment(/* gcc 2.7.2.3 -O2 bug?? */) + ident(jmp_buf) ident(save_regs_gc_mark)operator(;) + ident(SET_STACK_END)operator(;) + +preprocessor(#ifdef) ident(HAVE_NATIVETHREAD) + reserved(if) operator((!)ident(is_ruby_native_thread)operator((\)\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(cross-thread violation on rb_gc(\))delimiter(")>operator(\);) + operator(}) +preprocessor(#endif) + reserved(if) operator(()ident(dont_gc) operator(||) ident(during_gc)operator(\)) operator({) + reserved(if) operator((!)ident(freelist)operator(\)) operator({) + ident(add_heap)operator((\);) + operator(}) + reserved(return)operator(;) + operator(}) + reserved(if) operator(()ident(during_gc)operator(\)) reserved(return)operator(;) + ident(during_gc)operator(++;) + + ident(init_mark_stack)operator((\);) + + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(ruby_current_node)operator(,) integer(0)operator(\);) + + comment(/* mark frame stack */) + reserved(for) operator(()ident(frame) operator(=) ident(ruby_frame)operator(;) ident(frame)operator(;) ident(frame) operator(=) ident(frame)operator(->)ident(prev)operator(\)) operator({) + ident(rb_gc_mark_frame)operator(()ident(frame)operator(\);) + reserved(if) operator(()ident(frame)operator(->)ident(tmp)operator(\)) operator({) + reserved(struct) ident(FRAME) operator(*)ident(tmp) operator(=) ident(frame)operator(->)ident(tmp)operator(;) + reserved(while) operator(()ident(tmp)operator(\)) operator({) + ident(rb_gc_mark_frame)operator(()ident(tmp)operator(\);) + ident(tmp) operator(=) ident(tmp)operator(->)ident(prev)operator(;) + operator(}) + operator(}) + operator(}) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(ruby_scope)operator(,) integer(0)operator(\);) + ident(gc_mark)operator((()ident(VALUE)operator(\))ident(ruby_dyna_vars)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(finalizer_table)operator(\)) operator({) + ident(mark_tbl)operator(()ident(finalizer_table)operator(,) integer(0)operator(\);) + operator(}) + + ident(FLUSH_REGISTER_WINDOWS)operator(;) + comment(/* This assumes that all registers are saved into the jmp_buf (and stack\) */) + ident(setjmp)operator(()ident(save_regs_gc_mark)operator(\);) + ident(mark_locations_array)operator((()ident(VALUE)operator(*\))ident(save_regs_gc_mark)operator(,) reserved(sizeof)operator(()ident(save_regs_gc_mark)operator(\)) operator(/) reserved(sizeof)operator(()ident(VALUE) operator(*\)\);) +preprocessor(#if) ident(STACK_GROW_DIRECTION) operator(<) integer(0) + ident(rb_gc_mark_locations)operator((()ident(VALUE)operator(*\))ident(STACK_END)operator(,) ident(rb_gc_stack_start)operator(\);) +preprocessor(#elif) ident(STACK_GROW_DIRECTION) operator(>) integer(0) + ident(rb_gc_mark_locations)operator(()ident(rb_gc_stack_start)operator(,) operator(()ident(VALUE)operator(*\))ident(STACK_END) operator(+) integer(1)operator(\);) +preprocessor(#else) + reserved(if) operator((()ident(VALUE)operator(*\))ident(STACK_END) operator(<) ident(rb_gc_stack_start)operator(\)) + ident(rb_gc_mark_locations)operator((()ident(VALUE)operator(*\))ident(STACK_END)operator(,) ident(rb_gc_stack_start)operator(\);) + reserved(else) + ident(rb_gc_mark_locations)operator(()ident(rb_gc_stack_start)operator(,) operator(()ident(VALUE)operator(*\))ident(STACK_END) operator(+) integer(1)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(__ia64) + comment(/* mark backing store (flushed register window on the stack\) */) + comment(/* the basic idea from guile GC code */) + ident(rb_gc_mark_locations)operator(()ident(rb_gc_register_stack_start)operator(,) operator(()ident(VALUE)operator(*\))ident(rb_ia64_bsp)operator((\)\);) +preprocessor(#endif) +preprocessor(#if) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__mc68000__)operator(\)) + ident(rb_gc_mark_locations)operator((()ident(VALUE)operator(*\)(()pre_type(char)operator(*\))ident(STACK_END) operator(+) integer(2)operator(\),) + operator(()ident(VALUE)operator(*\)(()pre_type(char)operator(*\))ident(rb_gc_stack_start) operator(+) integer(2)operator(\)\);) +preprocessor(#endif) + ident(rb_gc_mark_threads)operator((\);) + + comment(/* mark protected global variables */) + reserved(for) operator(()ident(list) operator(=) ident(global_List)operator(;) ident(list)operator(;) ident(list) operator(=) ident(list)operator(->)ident(next)operator(\)) operator({) + ident(rb_gc_mark_maybe)operator((*)ident(list)operator(->)ident(varptr)operator(\);) + operator(}) + ident(rb_mark_end_proc)operator((\);) + ident(rb_gc_mark_global_tbl)operator((\);) + + ident(rb_mark_tbl)operator(()ident(rb_class_tbl)operator(\);) + ident(rb_gc_mark_trap_list)operator((\);) + + comment(/* mark generic instance variables for special constants */) + ident(rb_mark_generic_ivar_tbl)operator((\);) + + ident(rb_gc_mark_parser)operator((\);) + + comment(/* gc_mark objects whose marking are not completed*/) + reserved(do) operator({) + reserved(while) operator((!)ident(MARK_STACK_EMPTY)operator(\)) operator({) + reserved(if) operator(()ident(mark_stack_overflow)operator(\){) + ident(gc_mark_all)operator((\);) + operator(}) + reserved(else) operator({) + ident(gc_mark_rest)operator((\);) + operator(}) + operator(}) + ident(rb_gc_abort_threads)operator((\);) + operator(}) reserved(while) operator((!)ident(MARK_STACK_EMPTY)operator(\);) + + ident(gc_sweep)operator((\);) +operator(}) + +directive(void) +ident(rb_gc)operator((\)) +operator({) + ident(garbage_collect)operator((\);) + ident(rb_gc_finalize_deferred)operator((\);) +operator(}) + +comment(/* + * call-seq: + * GC.start => nil + * gc.garbage_collect => nil + * ObjectSpace.garbage_collect => nil + * + * Initiates garbage collection, unless manually disabled. + * + */) + +ident(VALUE) +ident(rb_gc_start)operator((\)) +operator({) + ident(rb_gc)operator((\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(void) +ident(ruby_set_stack_size)operator(()ident(size)operator(\)) + ident(size_t) ident(size)operator(;) +operator({) +preprocessor(#ifndef) ident(STACK_LEVEL_MAX) + ident(STACK_LEVEL_MAX) operator(=) ident(size) operator(/) reserved(sizeof)operator(()ident(VALUE)operator(\);) +preprocessor(#endif) +operator(}) + +directive(void) +ident(Init_stack)operator(()ident(addr)operator(\)) + ident(VALUE) operator(*)ident(addr)operator(;) +operator({) +preprocessor(#ifdef) ident(__ia64) + reserved(if) operator(()ident(rb_gc_register_stack_start) operator(==) integer(0)operator(\)) operator({) +preprocessor(# if) ident(defined)operator(()ident(__FreeBSD__)operator(\)) + comment(/* + * FreeBSD/ia64 currently does not have a way for a process to get the + * base address for the RSE backing store, so hardcode it. + */) + ident(rb_gc_register_stack_start) operator(=) operator(()integer(4)ident(ULL)operator(<<)integer(61)operator(\);) +preprocessor(# elif) ident(defined)operator(()ident(HAVE___LIBC_IA64_REGISTER_BACKING_STORE_BASE)operator(\)) +preprocessor(# pragma) ident(weak) ident(__libc_ia64_register_backing_store_base) + directive(extern) pre_type(unsigned) pre_type(long) ident(__libc_ia64_register_backing_store_base)operator(;) + ident(rb_gc_register_stack_start) operator(=) operator(()ident(VALUE)operator(*\))ident(__libc_ia64_register_backing_store_base)operator(;) +preprocessor(# endif) + operator(}) + operator({) + ident(VALUE) operator(*)ident(bsp) operator(=) operator(()ident(VALUE)operator(*\))ident(rb_ia64_bsp)operator((\);) + reserved(if) operator(()ident(rb_gc_register_stack_start) operator(==) integer(0) operator(||) + ident(bsp) operator(<) ident(rb_gc_register_stack_start)operator(\)) operator({) + ident(rb_gc_register_stack_start) operator(=) ident(bsp)operator(;) + operator(}) + operator(}) +preprocessor(#endif) +preprocessor(#if) ident(defined)operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN__)operator(\)) + ident(MEMORY_BASIC_INFORMATION) ident(m)operator(;) + ident(memset)operator((&)ident(m)operator(,) integer(0)operator(,) reserved(sizeof)operator(()ident(m)operator(\)\);) + ident(VirtualQuery)operator((&)ident(m)operator(,) operator(&)ident(m)operator(,) reserved(sizeof)operator(()ident(m)operator(\)\);) + ident(rb_gc_stack_start) operator(=) + ident(STACK_UPPER)operator((()ident(VALUE) operator(*\)&)ident(m)operator(,) operator(()ident(VALUE) operator(*\))ident(m)operator(.)ident(BaseAddress)operator(,) + operator(()ident(VALUE) operator(*\)(()pre_type(char) operator(*\))ident(m)operator(.)ident(BaseAddress) operator(+) ident(m)operator(.)ident(RegionSize)operator(\)) operator(-) integer(1)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(STACK_END_ADDRESS)operator(\)) + operator({) + directive(extern) directive(void) operator(*)ident(STACK_END_ADDRESS)operator(;) + ident(rb_gc_stack_start) operator(=) ident(STACK_END_ADDRESS)operator(;) + operator(}) +preprocessor(#else) + reserved(if) operator((!)ident(addr)operator(\)) ident(addr) operator(=) operator(()directive(void) operator(*\)&)ident(addr)operator(;) + ident(STACK_UPPER)operator((&)ident(addr)operator(,) ident(addr)operator(,) operator(++)ident(addr)operator(\);) + reserved(if) operator(()ident(rb_gc_stack_start)operator(\)) operator({) + reserved(if) operator(()ident(STACK_UPPER)operator((&)ident(addr)operator(,) + ident(rb_gc_stack_start) operator(>) ident(addr)operator(,) + ident(rb_gc_stack_start) operator(<) ident(addr)operator(\)\)) + ident(rb_gc_stack_start) operator(=) ident(addr)operator(;) + reserved(return)operator(;) + operator(}) + ident(rb_gc_stack_start) operator(=) ident(addr)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_GETRLIMIT) + operator({) + reserved(struct) ident(rlimit) ident(rlim)operator(;) + + reserved(if) operator(()ident(getrlimit)operator(()ident(RLIMIT_STACK)operator(,) operator(&)ident(rlim)operator(\)) operator(==) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(int) ident(space) operator(=) ident(rlim)operator(.)ident(rlim_cur)operator(/)integer(5)operator(;) + + reserved(if) operator(()ident(space) operator(>) integer(1024)operator(*)integer(1024)operator(\)) ident(space) operator(=) integer(1024)operator(*)integer(1024)operator(;) + ident(STACK_LEVEL_MAX) operator(=) operator(()ident(rlim)operator(.)ident(rlim_cur) operator(-) ident(space)operator(\)) operator(/) reserved(sizeof)operator(()ident(VALUE)operator(\);) + operator(}) + operator(}) +preprocessor(#endif) +operator(}) + +directive(void) ident(ruby_init_stack)operator(()ident(VALUE) operator(*)ident(addr) +preprocessor(#ifdef) ident(__ia64) + operator(,) directive(void) operator(*)ident(bsp) +preprocessor(#endif) + operator(\)) +operator({) + reserved(if) operator((!)ident(rb_gc_stack_start) operator(||) + ident(STACK_UPPER)operator((&)ident(addr)operator(,) + ident(rb_gc_stack_start) operator(>) ident(addr)operator(,) + ident(rb_gc_stack_start) operator(<) ident(addr)operator(\)\)) operator({) + ident(rb_gc_stack_start) operator(=) ident(addr)operator(;) + operator(}) +preprocessor(#ifdef) ident(__ia64) + reserved(if) operator((!)ident(rb_gc_register_stack_start) operator(||) + operator(()ident(VALUE)operator(*\))ident(bsp) operator(<) ident(rb_gc_register_stack_start)operator(\)) operator({) + ident(rb_gc_register_stack_start) operator(=) operator(()ident(VALUE)operator(*\))ident(bsp)operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_GETRLIMIT) + operator({) + reserved(struct) ident(rlimit) ident(rlim)operator(;) + + reserved(if) operator(()ident(getrlimit)operator(()ident(RLIMIT_STACK)operator(,) operator(&)ident(rlim)operator(\)) operator(==) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(int) ident(space) operator(=) ident(rlim)operator(.)ident(rlim_cur)operator(/)integer(5)operator(;) + + reserved(if) operator(()ident(space) operator(>) integer(1024)operator(*)integer(1024)operator(\)) ident(space) operator(=) integer(1024)operator(*)integer(1024)operator(;) + ident(STACK_LEVEL_MAX) operator(=) operator(()ident(rlim)operator(.)ident(rlim_cur) operator(-) ident(space)operator(\)) operator(/) reserved(sizeof)operator(()ident(VALUE)operator(\);) + operator(}) + operator(}) +preprocessor(#elif) ident(defined) ident(_WIN32) + operator({) + ident(MEMORY_BASIC_INFORMATION) ident(mi)operator(;) + ident(DWORD) ident(size)operator(;) + ident(DWORD) ident(space)operator(;) + + reserved(if) operator(()ident(VirtualQuery)operator((&)ident(mi)operator(,) operator(&)ident(mi)operator(,) reserved(sizeof)operator(()ident(mi)operator(\)\)\)) operator({) + ident(size) operator(=) operator(()pre_type(char) operator(*\))ident(mi)operator(.)ident(BaseAddress) operator(-) operator(()pre_type(char) operator(*\))ident(mi)operator(.)ident(AllocationBase)operator(;) + ident(space) operator(=) ident(size) operator(/) integer(5)operator(;) + reserved(if) operator(()ident(space) operator(>) integer(1024)operator(*)integer(1024)operator(\)) ident(space) operator(=) integer(1024)operator(*)integer(1024)operator(;) + ident(STACK_LEVEL_MAX) operator(=) operator(()ident(size) operator(-) ident(space)operator(\)) operator(/) reserved(sizeof)operator(()ident(VALUE)operator(\);) + operator(}) + operator(}) +preprocessor(#endif) +operator(}) + +comment(/* + * Document-class: ObjectSpace + * + * The <code>ObjectSpace</code> module contains a number of routines + * that interact with the garbage collection facility and allow you to + * traverse all living objects with an iterator. + * + * <code>ObjectSpace</code> also provides support for object + * finalizers, procs that will be called when a specific object is + * about to be destroyed by garbage collection. + * + * include ObjectSpace + * + * + * a = "A" + * b = "B" + * c = "C" + * + * + * define_finalizer(a, proc {|id| puts "Finalizer one on #{id}" }\) + * define_finalizer(a, proc {|id| puts "Finalizer two on #{id}" }\) + * define_finalizer(b, proc {|id| puts "Finalizer three on #{id}" }\) + * + * <em>produces:</em> + * + * Finalizer three on 537763470 + * Finalizer one on 537763480 + * Finalizer two on 537763480 + * + */) + +directive(void) +ident(Init_heap)operator((\)) +operator({) + reserved(if) operator((!)ident(rb_gc_stack_start)operator(\)) operator({) + ident(Init_stack)operator(()integer(0)operator(\);) + operator(}) + ident(add_heap)operator((\);) +operator(}) + +directive(static) ident(VALUE) +ident(os_obj_of)operator(()ident(of)operator(\)) + ident(VALUE) ident(of)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + pre_type(int) ident(n) operator(=) integer(0)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(heaps_used)operator(;) ident(i)operator(++\)) operator({) + ident(RVALUE) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + + ident(p) operator(=) ident(heaps)operator([)ident(i)operator(])operator(.)ident(slot)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit)operator(;) + reserved(for) operator((;)ident(p) operator(<) ident(pend)operator(;) ident(p)operator(++\)) operator({) + reserved(if) operator(()ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags)operator(\)) operator({) + reserved(switch) operator(()ident(BUILTIN_TYPE)operator(()ident(p)operator(\)\)) operator({) + reserved(case) label(T_NONE)operator(:) + reserved(case) label(T_ICLASS)operator(:) + reserved(case) label(T_VARMAP)operator(:) + reserved(case) label(T_SCOPE)operator(:) + reserved(case) label(T_NODE)operator(:) + reserved(case) label(T_DEFERRED)operator(:) + reserved(continue)operator(;) + reserved(case) label(T_CLASS)operator(:) + reserved(if) operator(()ident(FL_TEST)operator(()ident(p)operator(,) ident(FL_SINGLETON)operator(\)\)) reserved(continue)operator(;) + reserved(default)operator(:) + reserved(if) operator((!)ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(klass)operator(\)) reserved(continue)operator(;) + reserved(if) operator((!)ident(of) operator(||) ident(rb_obj_is_kind_of)operator((()ident(VALUE)operator(\))ident(p)operator(,) ident(of)operator(\)\)) operator({) + ident(rb_yield)operator((()ident(VALUE)operator(\))ident(p)operator(\);) + ident(n)operator(++;) + operator(}) + operator(}) + operator(}) + operator(}) + operator(}) + + reserved(return) ident(INT2FIX)operator(()ident(n)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ObjectSpace.each_object([module]\) {|obj| ... } => fixnum + * + * Calls the block once for each living, nonimmediate object in this + * Ruby process. If <i>module</i> is specified, calls the block + * for only those classes or modules that match (or are a subclass of\) + * <i>module</i>. Returns the number of objects found. Immediate + * objects (<code>Fixnum</code>s, <code>Symbol</code>s + * <code>true</code>, <code>false</code>, and <code>nil</code>\) are + * never returned. In the example below, <code>each_object</code> + * returns both the numbers we defined and several constants defined in + * the <code>Math</code> module. + * + * a = 102.7 + * b = 95 # Won't be returned + * c = 12345678987654321 + * count = ObjectSpace.each_object(Numeric\) {|x| p x } + * puts "Total count: #{count}" + * + * <em>produces:</em> + * + * 12345678987654321 + * 102.7 + * 2.71828182845905 + * 3.14159265358979 + * 2.22044604925031e-16 + * 1.7976931348623157e+308 + * 2.2250738585072e-308 + * Total count: 7 + * + */) + +directive(static) ident(VALUE) +ident(os_each_obj)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(of)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(of)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(of) operator(=) integer(0)operator(;) + operator(}) + reserved(return) ident(os_obj_of)operator(()ident(of)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(finalizers)operator(;) + +comment(/* deprecated + */) + +directive(static) ident(VALUE) +ident(add_final)operator(()ident(os)operator(,) ident(block)operator(\)) + ident(VALUE) ident(os)operator(,) ident(block)operator(;) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(ObjectSpace::add_finalizer is deprecated; use define_finalizer)delimiter(")>operator(\);) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(block)operator(,) ident(rb_intern)operator(()string<delimiter(")content(call)delimiter(")>operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong type argument %s (should be callable\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(block)operator(\)\);) + operator(}) + ident(rb_ary_push)operator(()ident(finalizers)operator(,) ident(block)operator(\);) + reserved(return) ident(block)operator(;) +operator(}) + +comment(/* + * deprecated + */) +directive(static) ident(VALUE) +ident(rm_final)operator(()ident(os)operator(,) ident(block)operator(\)) + ident(VALUE) ident(os)operator(,) ident(block)operator(;) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(ObjectSpace::remove_finalizer is deprecated; use undefine_finalizer)delimiter(")>operator(\);) + ident(rb_ary_delete)operator(()ident(finalizers)operator(,) ident(block)operator(\);) + reserved(return) ident(block)operator(;) +operator(}) + +comment(/* + * deprecated + */) +directive(static) ident(VALUE) +ident(finals)operator((\)) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(ObjectSpace::finalizers is deprecated)delimiter(")>operator(\);) + reserved(return) ident(finalizers)operator(;) +operator(}) + +comment(/* + * deprecated + */) + +directive(static) ident(VALUE) +ident(call_final)operator(()ident(os)operator(,) ident(obj)operator(\)) + ident(VALUE) ident(os)operator(,) ident(obj)operator(;) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(ObjectSpace::call_finalizer is deprecated; use define_finalizer)delimiter(")>operator(\);) + ident(need_call_final) operator(=) integer(1)operator(;) + ident(FL_SET)operator(()ident(obj)operator(,) ident(FL_FINALIZE)operator(\);) + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * ObjectSpace.undefine_finalizer(obj\) + * + * Removes all finalizers for <i>obj</i>. + * + */) + +directive(static) ident(VALUE) +ident(undefine_final)operator(()ident(os)operator(,) ident(obj)operator(\)) + ident(VALUE) ident(os)operator(,) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(finalizer_table)operator(\)) operator({) + ident(st_delete)operator(()ident(finalizer_table)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(obj)operator(,) integer(0)operator(\);) + operator(}) + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * ObjectSpace.define_finalizer(obj, aProc=proc(\)\) + * + * Adds <i>aProc</i> as a finalizer, to be called after <i>obj</i> + * was destroyed. + * + */) + +directive(static) ident(VALUE) +ident(define_final)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(os)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(os)operator(;) +operator({) + ident(VALUE) ident(obj)operator(,) ident(block)operator(,) ident(table)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(obj)operator(,) operator(&)ident(block)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(block) operator(=) ident(rb_block_proc)operator((\);) + operator(}) + reserved(else) reserved(if) operator((!)ident(rb_respond_to)operator(()ident(block)operator(,) ident(rb_intern)operator(()string<delimiter(")content(call)delimiter(")>operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong type argument %s (should be callable\))delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(block)operator(\)\);) + operator(}) + ident(need_call_final) operator(=) integer(1)operator(;) + reserved(if) operator((!)ident(FL_ABLE)operator(()ident(obj)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(cannot define finalizer for %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(obj)operator(\)\);) + operator(}) + ident(RBASIC)operator(()ident(obj)operator(\)->)ident(flags) operator(|=) ident(FL_FINALIZE)operator(;) + + ident(block) operator(=) ident(rb_ary_new3)operator(()integer(2)operator(,) ident(INT2FIX)operator(()ident(ruby_safe_level)operator(\),) ident(block)operator(\);) + ident(OBJ_FREEZE)operator(()ident(block)operator(\);) + + reserved(if) operator((!)ident(finalizer_table)operator(\)) operator({) + ident(finalizer_table) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + reserved(if) operator(()ident(st_lookup)operator(()ident(finalizer_table)operator(,) ident(obj)operator(,) operator(&)ident(table)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(table)operator(,) ident(block)operator(\);) + operator(}) + reserved(else) operator({) + ident(table) operator(=) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(block)operator(\);) + ident(RBASIC)operator(()ident(table)operator(\)->)ident(klass) operator(=) integer(0)operator(;) + ident(st_add_direct)operator(()ident(finalizer_table)operator(,) ident(obj)operator(,) ident(table)operator(\);) + operator(}) + reserved(return) ident(block)operator(;) +operator(}) + +directive(void) +ident(rb_gc_copy_finalizer)operator(()ident(dest)operator(,) ident(obj)operator(\)) + ident(VALUE) ident(dest)operator(,) ident(obj)operator(;) +operator({) + ident(VALUE) ident(table)operator(;) + + reserved(if) operator((!)ident(finalizer_table)operator(\)) reserved(return)operator(;) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_FINALIZE)operator(\)\)) reserved(return)operator(;) + reserved(if) operator(()ident(st_lookup)operator(()ident(finalizer_table)operator(,) ident(obj)operator(,) operator(&)ident(table)operator(\)\)) operator({) + ident(st_insert)operator(()ident(finalizer_table)operator(,) ident(dest)operator(,) ident(table)operator(\);) + operator(}) + ident(RBASIC)operator(()ident(dest)operator(\)->)ident(flags) operator(|=) ident(FL_FINALIZE)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(run_single_final)operator(()ident(args)operator(\)) + ident(VALUE) operator(*)ident(args)operator(;) +operator({) + ident(rb_eval_cmd)operator(()ident(args)operator([)integer(0)operator(],) ident(args)operator([)integer(1)operator(],) operator(()pre_type(int)operator(\))ident(args)operator([)integer(2)operator(]\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) directive(void) +ident(run_final)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + pre_type(int) ident(status)operator(,) ident(critical_save) operator(=) ident(rb_thread_critical)operator(;) + ident(VALUE) ident(args)operator([)integer(3)operator(],) ident(table)operator(,) ident(objid)operator(;) + + ident(objid) operator(=) ident(rb_obj_id)operator(()ident(obj)operator(\);) comment(/* make obj into id */) + ident(rb_thread_critical) operator(=) ident(Qtrue)operator(;) + comment(/* NOTE: This change below, adding DATA_PTR(obj\) to the if line, is a stopgap fix for segfaults; the reason for DATA_PTR(obj\) == 0 needs to be found and fixed. */) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(obj)operator(\)) operator(==) ident(T_DEFERRED) operator(&&) ident(RDATA)operator(()ident(obj)operator(\)->)ident(dfree) operator(&&) ident(DATA_PTR)operator(()ident(obj)operator(\)\)) operator({) + operator((*)ident(RDATA)operator(()ident(obj)operator(\)->)ident(dfree)operator(\)()ident(DATA_PTR)operator(()ident(obj)operator(\)\);) + operator(}) + ident(args)operator([)integer(1)operator(]) operator(=) integer(0)operator(;) + ident(args)operator([)integer(2)operator(]) operator(=) operator(()ident(VALUE)operator(\))ident(ruby_safe_level)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(finalizers)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(args)operator([)integer(0)operator(]) operator(=) ident(RARRAY)operator(()ident(finalizers)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + reserved(if) operator((!)ident(args)operator([)integer(1)operator(]\)) ident(args)operator([)integer(1)operator(]) operator(=) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(objid)operator(\);) + ident(rb_protect)operator((()ident(VALUE)operator((*\))ident(_)operator((()ident(VALUE)operator(\)\)\))ident(run_single_final)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(,) operator(&)ident(status)operator(\);) + operator(}) + reserved(if) operator(()ident(finalizer_table) operator(&&) ident(st_delete)operator(()ident(finalizer_table)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(obj)operator(,) operator(&)ident(table)operator(\)\)) operator({) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(table)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(final) operator(=) ident(RARRAY)operator(()ident(table)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + ident(args)operator([)integer(0)operator(]) operator(=) ident(RARRAY)operator(()ident(final)operator(\)->)ident(ptr)operator([)integer(1)operator(];) + reserved(if) operator((!)ident(args)operator([)integer(1)operator(]\)) ident(args)operator([)integer(1)operator(]) operator(=) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(objid)operator(\);) + ident(args)operator([)integer(2)operator(]) operator(=) ident(FIX2INT)operator(()ident(RARRAY)operator(()ident(final)operator(\)->)ident(ptr)operator([)integer(0)operator(]\);) + ident(rb_protect)operator((()ident(VALUE)operator((*\))ident(_)operator((()ident(VALUE)operator(\)\)\))ident(run_single_final)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(,) operator(&)ident(status)operator(\);) + operator(}) + operator(}) + ident(rb_thread_critical) operator(=) ident(critical_save)operator(;) +operator(}) + +directive(void) +ident(rb_gc_finalize_deferred)operator((\)) +operator({) + ident(RVALUE) operator(*)ident(p) operator(=) ident(deferred_final_list)operator(;) + + ident(deferred_final_list) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(p)operator(\)) operator({) + ident(finalize_list)operator(()ident(p)operator(\);) + ident(free_unused_heaps)operator((\);) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(chain_finalized_object)operator(()ident(st_data_t) ident(key)operator(,) ident(st_data_t) ident(val)operator(,) ident(st_data_t) ident(arg)operator(\)) +operator({) + ident(RVALUE) operator(*)ident(p) operator(=) operator(()ident(RVALUE) operator(*\))ident(key)operator(,) operator(**)ident(final_list) operator(=) operator(()ident(RVALUE) operator(**\))ident(arg)operator(;) + reserved(if) operator((()ident(p)operator(->)ident(as)operator(.)ident(basic)operator(.)ident(flags) operator(&) operator(()ident(FL_FINALIZE)operator(|)ident(FL_MARK)operator(\)\)) operator(==) ident(FL_FINALIZE)operator(\)) operator({) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(p)operator(\)) operator(!=) ident(T_DEFERRED)operator(\)) operator({) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(flags) operator(=) ident(FL_MARK) operator(|) ident(T_DEFERRED)operator(;) comment(/* remain marked */) + ident(RDATA)operator(()ident(p)operator(\)->)ident(dfree) operator(=) integer(0)operator(;) + operator(}) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(next) operator(=) operator(*)ident(final_list)operator(;) + operator(*)ident(final_list) operator(=) ident(p)operator(;) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(void) +ident(rb_gc_call_finalizer_at_exit)operator((\)) +operator({) + ident(RVALUE) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + pre_type(int) ident(i)operator(;) + + comment(/* run finalizers */) + reserved(if) operator(()ident(need_call_final)operator(\)) operator({) + reserved(do) operator({) + ident(p) operator(=) ident(deferred_final_list)operator(;) + ident(deferred_final_list) operator(=) integer(0)operator(;) + ident(finalize_list)operator(()ident(p)operator(\);) + ident(mark_tbl)operator(()ident(finalizer_table)operator(,) integer(0)operator(\);) + ident(st_foreach)operator(()ident(finalizer_table)operator(,) ident(chain_finalized_object)operator(,) + operator(()ident(st_data_t)operator(\)&)ident(deferred_final_list)operator(\);) + operator(}) reserved(while) operator(()ident(deferred_final_list)operator(\);) + operator(}) + comment(/* run data object's finalizers */) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(heaps_used)operator(;) ident(i)operator(++\)) operator({) + ident(p) operator(=) ident(heaps)operator([)ident(i)operator(])operator(.)ident(slot)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(heaps)operator([)ident(i)operator(])operator(.)ident(limit)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(p)operator(\)) operator(==) ident(T_DATA) operator(&&) + ident(DATA_PTR)operator(()ident(p)operator(\)) operator(&&) ident(RANY)operator(()ident(p)operator(\)->)ident(as)operator(.)ident(data)operator(.)ident(dfree) operator(&&) + ident(RANY)operator(()ident(p)operator(\)->)ident(as)operator(.)ident(basic)operator(.)ident(klass) operator(!=) ident(rb_cThread)operator(\)) operator({) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(flags) operator(=) integer(0)operator(;) + reserved(if) operator((()pre_type(long)operator(\))ident(RANY)operator(()ident(p)operator(\)->)ident(as)operator(.)ident(data)operator(.)ident(dfree) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(RUBY_CRITICAL)operator(()ident(free)operator(()ident(DATA_PTR)operator(()ident(p)operator(\)\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(RANY)operator(()ident(p)operator(\)->)ident(as)operator(.)ident(data)operator(.)ident(dfree)operator(\)) operator({) + operator((*)ident(RANY)operator(()ident(p)operator(\)->)ident(as)operator(.)ident(data)operator(.)ident(dfree)operator(\)()ident(DATA_PTR)operator(()ident(p)operator(\)\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(p)operator(\)) operator(==) ident(T_FILE)operator(\)) operator({) + ident(p)operator(->)ident(as)operator(.)ident(free)operator(.)ident(flags) operator(=) integer(0)operator(;) + ident(rb_io_fptr_finalize)operator(()ident(RANY)operator(()ident(p)operator(\)->)ident(as)operator(.)ident(file)operator(.)ident(fptr)operator(\);) + operator(}) + ident(p)operator(++;) + operator(}) + operator(}) +operator(}) + +comment(/* + * call-seq: + * ObjectSpace._id2ref(object_id\) -> an_object + * + * Converts an object id to a reference to the object. May not be + * called on an object id passed as a parameter to a finalizer. + * + * s = "I am a string" #=> "I am a string" + * r = ObjectSpace._id2ref(s.object_id\) #=> "I am a string" + * r == s #=> true + * + */) + +directive(static) ident(VALUE) +ident(id2ref)operator(()ident(obj)operator(,) ident(objid)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(objid)operator(;) +operator({) + pre_type(unsigned) pre_type(long) ident(ptr)operator(,) ident(p0)operator(;) + pre_type(int) ident(type)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + ident(p0) operator(=) ident(ptr) operator(=) ident(NUM2ULONG)operator(()ident(objid)operator(\);) + reserved(if) operator(()ident(ptr) operator(==) ident(Qtrue)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(ptr) operator(==) ident(Qfalse)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(ptr) operator(==) ident(Qnil)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(ptr)operator(\)\)) reserved(return) operator(()ident(VALUE)operator(\))ident(ptr)operator(;) + ident(ptr) operator(=) ident(objid) operator(^) ident(FIXNUM_FLAG)operator(;) comment(/* unset FIXNUM_FLAG */) + + reserved(if) operator((()ident(ptr) operator(%) reserved(sizeof)operator(()ident(RVALUE)operator(\)\)) operator(==) operator(()integer(4) operator(<<) integer(2)operator(\)\)) operator({) + ident(ID) ident(symid) operator(=) ident(ptr) operator(/) reserved(sizeof)operator(()ident(RVALUE)operator(\);) + reserved(if) operator(()ident(rb_id2name)operator(()ident(symid)operator(\)) operator(==) integer(0)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(%p is not symbol id value)delimiter(")>operator(,) ident(p0)operator(\);) + reserved(return) ident(ID2SYM)operator(()ident(symid)operator(\);) + operator(}) + + reserved(if) operator((!)ident(is_pointer_to_heap)operator((()directive(void) operator(*\))ident(ptr)operator(\)||) + operator(()ident(type) operator(=) ident(BUILTIN_TYPE)operator(()ident(ptr)operator(\)\)) operator(>) ident(T_SYMBOL) operator(||) ident(type) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(0x%lx is not id value)delimiter(")>operator(,) ident(p0)operator(\);) + operator(}) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(ptr)operator(\)) operator(==) integer(0) operator(||) ident(RBASIC)operator(()ident(ptr)operator(\)->)ident(klass) operator(==) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(0x%lx is recycled object)delimiter(")>operator(,) ident(p0)operator(\);) + operator(}) + reserved(return) operator(()ident(VALUE)operator(\))ident(ptr)operator(;) +operator(}) + +comment(/* + * Document-method: __id__ + * Document-method: object_id + * + * call-seq: + * obj.__id__ => fixnum + * obj.object_id => fixnum + * + * Returns an integer identifier for <i>obj</i>. The same number will + * be returned on all calls to <code>id</code> for a given object, and + * no two active objects will share an id. + * <code>Object#object_id</code> is a different concept from the + * <code>:name</code> notation, which returns the symbol id of + * <code>name</code>. Replaces the deprecated <code>Object#id</code>. + */) + +comment(/* + * call-seq: + * obj.hash => fixnum + * + * Generates a <code>Fixnum</code> hash value for this object. This + * function must have the property that <code>a.eql?(b\)</code> implies + * <code>a.hash == b.hash</code>. The hash value is used by class + * <code>Hash</code>. Any hash value that exceeds the capacity of a + * <code>Fixnum</code> will be truncated before being used. + */) + +ident(VALUE) +ident(rb_obj_id)operator(()ident(VALUE) ident(obj)operator(\)) +operator({) + comment(/* + * 32-bit VALUE space + * MSB ------------------------ LSB + * false 00000000000000000000000000000000 + * true 00000000000000000000000000000010 + * nil 00000000000000000000000000000100 + * undef 00000000000000000000000000000110 + * symbol ssssssssssssssssssssssss00001110 + * object oooooooooooooooooooooooooooooo00 = 0 (mod sizeof(RVALUE\)\) + * fixnum fffffffffffffffffffffffffffffff1 + * + * object_id space + * LSB + * false 00000000000000000000000000000000 + * true 00000000000000000000000000000010 + * nil 00000000000000000000000000000100 + * undef 00000000000000000000000000000110 + * symbol 000SSSSSSSSSSSSSSSSSSSSSSSSSSS0 S...S % A = 4 (S...S = s...s * A + 4\) + * object oooooooooooooooooooooooooooooo0 o...o % A = 0 + * fixnum fffffffffffffffffffffffffffffff1 bignum if required + * + * where A = sizeof(RVALUE\)/4 + * + * sizeof(RVALUE\) is + * 20 if 32-bit, double is 4-byte aligned + * 24 if 32-bit, double is 8-byte aligned + * 40 if 64-bit + */) + reserved(if) operator(()ident(TYPE)operator(()ident(obj)operator(\)) operator(==) ident(T_SYMBOL)operator(\)) operator({) + reserved(return) operator(()ident(SYM2ID)operator(()ident(obj)operator(\)) operator(*) reserved(sizeof)operator(()ident(RVALUE)operator(\)) operator(+) operator(()integer(4) operator(<<) integer(2)operator(\)\)) operator(|) ident(FIXNUM_FLAG)operator(;) + operator(}) + reserved(if) operator(()ident(SPECIAL_CONST_P)operator(()ident(obj)operator(\)\)) operator({) + reserved(return) ident(LONG2NUM)operator((()pre_type(long)operator(\))ident(obj)operator(\);) + operator(}) + reserved(return) operator(()ident(VALUE)operator(\)(()pre_type(long)operator(\))ident(obj)operator(|)ident(FIXNUM_FLAG)operator(\);) +operator(}) + +comment(/* + * The <code>GC</code> module provides an interface to Ruby's mark and + * sweep garbage collection mechanism. Some of the underlying methods + * are also available via the <code>ObjectSpace</code> module. + */) + +directive(void) +ident(Init_GC)operator((\)) +operator({) + ident(VALUE) ident(rb_mObSpace)operator(;) + + ident(rb_mGC) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(GC)delimiter(")>operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_mGC)operator(,) string<delimiter(")content(start)delimiter(")>operator(,) ident(rb_gc_start)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_mGC)operator(,) string<delimiter(")content(enable)delimiter(")>operator(,) ident(rb_gc_enable)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_mGC)operator(,) string<delimiter(")content(disable)delimiter(")>operator(,) ident(rb_gc_disable)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mGC)operator(,) string<delimiter(")content(garbage_collect)delimiter(")>operator(,) ident(rb_gc_start)operator(,) integer(0)operator(\);) + + ident(rb_mObSpace) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(ObjectSpace)delimiter(")>operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mObSpace)operator(,) string<delimiter(")content(each_object)delimiter(")>operator(,) ident(os_each_obj)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mObSpace)operator(,) string<delimiter(")content(garbage_collect)delimiter(")>operator(,) ident(rb_gc_start)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mObSpace)operator(,) string<delimiter(")content(add_finalizer)delimiter(")>operator(,) ident(add_final)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mObSpace)operator(,) string<delimiter(")content(remove_finalizer)delimiter(")>operator(,) ident(rm_final)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mObSpace)operator(,) string<delimiter(")content(finalizers)delimiter(")>operator(,) ident(finals)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mObSpace)operator(,) string<delimiter(")content(call_finalizer)delimiter(")>operator(,) ident(call_final)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mObSpace)operator(,) string<delimiter(")content(define_finalizer)delimiter(")>operator(,) ident(define_final)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mObSpace)operator(,) string<delimiter(")content(undefine_finalizer)delimiter(")>operator(,) ident(undefine_final)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mObSpace)operator(,) string<delimiter(")content(_id2ref)delimiter(")>operator(,) ident(id2ref)operator(,) integer(1)operator(\);) + + ident(rb_gc_register_address)operator((&)ident(rb_mObSpace)operator(\);) + ident(rb_global_variable)operator((&)ident(finalizers)operator(\);) + ident(rb_gc_unregister_address)operator((&)ident(rb_mObSpace)operator(\);) + ident(finalizers) operator(=) ident(rb_ary_new)operator((\);) + + ident(source_filenames) operator(=) ident(st_init_strtable)operator((\);) + + ident(rb_global_variable)operator((&)ident(nomem_error)operator(\);) + ident(nomem_error) operator(=) ident(rb_exc_new3)operator(()ident(rb_eNoMemError)operator(,) + ident(rb_obj_freeze)operator(()ident(rb_str_new2)operator(()string<delimiter(")content(failed to allocate memory)delimiter(")>operator(\)\)\);) + ident(OBJ_TAINT)operator(()ident(nomem_error)operator(\);) + ident(OBJ_FREEZE)operator(()ident(nomem_error)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(hash)delimiter(")>operator(,) ident(rb_obj_id)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(__id__)delimiter(")>operator(,) ident(rb_obj_id)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(object_id)delimiter(")>operator(,) ident(rb_obj_id)operator(,) integer(0)operator(\);) +operator(}) +comment(/********************************************************************** + + hash.c - + + $Author: shyouhei $ + $Date: 2007-08-22 05:42:36 +0200 (Wed, 22 Aug 2007\) $ + created at: Mon Nov 22 18:51:18 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("st.h") +preprocessor(#include) include("util.h") +preprocessor(#include) include("rubysig.h") + +preprocessor(#ifdef) ident(__APPLE__) +preprocessor(#include) include(<crt_externs.h>) +preprocessor(#endif) + +preprocessor(#define) ident(HASH_DELETED) ident(FL_USER1) +preprocessor(#define) ident(HASH_PROC_DEFAULT) ident(FL_USER2) + +directive(static) directive(void) +ident(rb_hash_modify)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(if) operator((!)ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(\)) ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(uninitialized Hash)delimiter(")>operator(\);) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(hash)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(hash)delimiter(")>operator(\);) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(hash)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify hash)delimiter(")>operator(\);) +operator(}) + +ident(VALUE) +ident(rb_hash_freeze)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(return) ident(rb_obj_freeze)operator(()ident(hash)operator(\);) +operator(}) + +ident(VALUE) ident(rb_cHash)operator(;) + +directive(static) ident(VALUE) ident(envtbl)operator(;) +directive(static) ident(ID) ident(id_hash)operator(,) ident(id_call)operator(,) ident(id_default)operator(;) + +directive(static) ident(VALUE) +ident(eql)operator(()ident(args)operator(\)) + ident(VALUE) operator(*)ident(args)operator(;) +operator({) + reserved(return) operator(()ident(VALUE)operator(\))ident(rb_eql)operator(()ident(args)operator([)integer(0)operator(],) ident(args)operator([)integer(1)operator(]\);) +operator(}) + +directive(static) pre_type(int) +ident(rb_any_cmp)operator(()ident(a)operator(,) ident(b)operator(\)) + ident(VALUE) ident(a)operator(,) ident(b)operator(;) +operator({) + ident(VALUE) ident(args)operator([)integer(2)operator(];) + + reserved(if) operator(()ident(a) operator(==) ident(b)operator(\)) reserved(return) integer(0)operator(;) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(a)operator(\)) operator(&&) ident(FIXNUM_P)operator(()ident(b)operator(\)\)) operator({) + reserved(return) ident(a) operator(!=) ident(b)operator(;) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(a)operator(\)) operator(==) ident(T_STRING) operator(&&) ident(RBASIC)operator(()ident(a)operator(\)->)ident(klass) operator(==) ident(rb_cString) operator(&&) + ident(TYPE)operator(()ident(b)operator(\)) operator(==) ident(T_STRING) operator(&&) ident(RBASIC)operator(()ident(b)operator(\)->)ident(klass) operator(==) ident(rb_cString)operator(\)) operator({) + reserved(return) ident(rb_str_cmp)operator(()ident(a)operator(,) ident(b)operator(\);) + operator(}) + reserved(if) operator(()ident(a) operator(==) ident(Qundef) operator(||) ident(b) operator(==) ident(Qundef)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator(()ident(SYMBOL_P)operator(()ident(a)operator(\)) operator(&&) ident(SYMBOL_P)operator(()ident(b)operator(\)\)) operator({) + reserved(return) ident(a) operator(!=) ident(b)operator(;) + operator(}) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(a)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(b)operator(;) + reserved(return) operator(!)ident(rb_with_disable_interrupt)operator(()ident(eql)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_hash)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(obj)operator(,) ident(id_hash)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(rb_any_hash)operator(()ident(a)operator(\)) + ident(VALUE) ident(a)operator(;) +operator({) + ident(VALUE) ident(hval)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(a)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + reserved(case) label(T_SYMBOL)operator(:) + reserved(return) operator(()pre_type(int)operator(\))ident(a)operator(;) + reserved(break)operator(;) + + reserved(case) label(T_STRING)operator(:) + reserved(return) ident(rb_str_hash)operator(()ident(a)operator(\);) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(hval) operator(=) ident(rb_funcall)operator(()ident(a)operator(,) ident(id_hash)operator(,) integer(0)operator(\);) + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(hval)operator(\)\)) operator({) + ident(hval) operator(=) ident(rb_funcall)operator(()ident(hval)operator(,) char('%')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(536870923)operator(\)\);) + operator(}) + reserved(return) operator(()pre_type(int)operator(\))ident(FIX2LONG)operator(()ident(hval)operator(\);) + operator(}) +operator(}) + +directive(static) reserved(struct) ident(st_hash_type) ident(objhash) operator(=) operator({) + ident(rb_any_cmp)operator(,) + ident(rb_any_hash)operator(,) +operator(};) + +reserved(struct) ident(foreach_safe_arg) operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + pre_type(int) operator((*)ident(func)operator(\)(\);) + ident(st_data_t) ident(arg)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(foreach_safe_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(arg)operator(\)) + ident(st_data_t) ident(key)operator(,) ident(value)operator(;) + reserved(struct) ident(foreach_safe_arg) operator(*)ident(arg)operator(;) +operator({) + pre_type(int) ident(status)operator(;) + + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(status) operator(=) operator((*)ident(arg)operator(->)ident(func)operator(\)()ident(key)operator(,) ident(value)operator(,) ident(arg)operator(->)ident(arg)operator(\);) + reserved(if) operator(()ident(status) operator(==) ident(ST_CONTINUE)operator(\)) operator({) + reserved(return) ident(ST_CHECK)operator(;) + operator(}) + reserved(return) ident(status)operator(;) +operator(}) + +directive(void) +ident(st_foreach_safe)operator(()ident(table)operator(,) ident(func)operator(,) ident(a)operator(\)) + ident(st_table) operator(*)ident(table)operator(;) + pre_type(int) operator((*)ident(func)operator(\)(\);) + ident(st_data_t) ident(a)operator(;) +operator({) + reserved(struct) ident(foreach_safe_arg) ident(arg)operator(;) + + ident(arg)operator(.)ident(tbl) operator(=) ident(table)operator(;) + ident(arg)operator(.)ident(func) operator(=) ident(func)operator(;) + ident(arg)operator(.)ident(arg) operator(=) ident(a)operator(;) + reserved(if) operator(()ident(st_foreach)operator(()ident(table)operator(,) ident(foreach_safe_i)operator(,) operator(()ident(st_data_t)operator(\)&)ident(arg)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(hash modified during iteration)delimiter(")>operator(\);) + operator(}) +operator(}) + +reserved(struct) ident(hash_foreach_arg) operator({) + ident(VALUE) ident(hash)operator(;) + pre_type(int) operator((*)ident(func)operator(\)(\);) + ident(VALUE) ident(arg)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(hash_foreach_iter)operator(()ident(key)operator(,) ident(value)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + reserved(struct) ident(hash_foreach_arg) operator(*)ident(arg)operator(;) +operator({) + pre_type(int) ident(status)operator(;) + ident(st_table) operator(*)ident(tbl)operator(;) + + ident(tbl) operator(=) ident(RHASH)operator(()ident(arg)operator(->)ident(hash)operator(\)->)ident(tbl)operator(;) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(status) operator(=) operator((*)ident(arg)operator(->)ident(func)operator(\)()ident(key)operator(,) ident(value)operator(,) ident(arg)operator(->)ident(arg)operator(\);) + reserved(if) operator(()ident(RHASH)operator(()ident(arg)operator(->)ident(hash)operator(\)->)ident(tbl) operator(!=) ident(tbl)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(rehash occurred during iteration)delimiter(")>operator(\);) + operator(}) + reserved(switch) operator(()ident(status)operator(\)) operator({) + reserved(case) label(ST_DELETE)operator(:) + ident(st_delete_safe)operator(()ident(tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(key)operator(,) integer(0)operator(,) ident(Qundef)operator(\);) + ident(FL_SET)operator(()ident(arg)operator(->)ident(hash)operator(,) ident(HASH_DELETED)operator(\);) + reserved(case) label(ST_CONTINUE)operator(:) + reserved(break)operator(;) + reserved(case) label(ST_STOP)operator(:) + reserved(return) ident(ST_STOP)operator(;) + operator(}) + reserved(return) ident(ST_CHECK)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(hash_foreach_ensure)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(RHASH)operator(()ident(hash)operator(\)->)ident(iter_lev)operator(--;) + + reserved(if) operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(iter_lev) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(hash)operator(,) ident(HASH_DELETED)operator(\)\)) operator({) + ident(st_cleanup_safe)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) ident(Qundef)operator(\);) + ident(FL_UNSET)operator(()ident(hash)operator(,) ident(HASH_DELETED)operator(\);) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(hash_foreach_call)operator(()ident(arg)operator(\)) + reserved(struct) ident(hash_foreach_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(if) operator(()ident(st_foreach)operator(()ident(RHASH)operator(()ident(arg)operator(->)ident(hash)operator(\)->)ident(tbl)operator(,) ident(hash_foreach_iter)operator(,) operator(()ident(st_data_t)operator(\))ident(arg)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(hash modified during iteration)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(void) +ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(func)operator(,) ident(farg)operator(\)) + ident(VALUE) ident(hash)operator(;) + pre_type(int) operator((*)ident(func)operator(\)(\);) + ident(VALUE) ident(farg)operator(;) +operator({) + reserved(struct) ident(hash_foreach_arg) ident(arg)operator(;) + + ident(RHASH)operator(()ident(hash)operator(\)->)ident(iter_lev)operator(++;) + ident(arg)operator(.)ident(hash) operator(=) ident(hash)operator(;) + ident(arg)operator(.)ident(func) operator(=) ident(func)operator(;) + ident(arg)operator(.)ident(arg) operator(=) ident(farg)operator(;) + ident(rb_ensure)operator(()ident(hash_foreach_call)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(,) ident(hash_foreach_ensure)operator(,) ident(hash)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(hash_alloc0) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(hash_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(hash_alloc0)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(hash)operator(,) reserved(struct) ident(RHash)operator(\);) + ident(OBJSETUP)operator(()ident(hash)operator(,) ident(klass)operator(,) ident(T_HASH)operator(\);) + + ident(hash)operator(->)ident(ifnone) operator(=) ident(Qnil)operator(;) + + reserved(return) operator(()ident(VALUE)operator(\))ident(hash)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(hash_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(hash) operator(=) ident(hash_alloc0)operator(()ident(klass)operator(\);) + + ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl) operator(=) ident(st_init_table)operator((&)ident(objhash)operator(\);) + + reserved(return) ident(hash)operator(;) +operator(}) + +ident(VALUE) +ident(rb_hash_new)operator((\)) +operator({) + reserved(return) ident(hash_alloc)operator(()ident(rb_cHash)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Hash.new => hash + * Hash.new(obj\) => aHash + * Hash.new {|hash, key| block } => aHash + * + * Returns a new, empty hash. If this hash is subsequently accessed by + * a key that doesn't correspond to a hash entry, the value returned + * depends on the style of <code>new</code> used to create the hash. In + * the first form, the access returns <code>nil</code>. If + * <i>obj</i> is specified, this single object will be used for + * all <em>default values</em>. If a block is specified, it will be + * called with the hash object and the key, and should return the + * default value. It is the block's responsibility to store the value + * in the hash if required. + * + * h = Hash.new("Go Fish"\) + * h["a"] = 100 + * h["b"] = 200 + * h["a"] #=> 100 + * h["c"] #=> "Go Fish" + * # The following alters the single default object + * h["c"].upcase! #=> "GO FISH" + * h["d"] #=> "GO FISH" + * h.keys #=> ["a", "b"] + * + * # While this creates a new default object each time + * h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" } + * h["c"] #=> "Go Fish: c" + * h["c"].upcase! #=> "GO FISH: C" + * h["d"] #=> "Go Fish: d" + * h.keys #=> ["c", "d"] + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(hash)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(ifnone)operator(;) + + ident(rb_hash_modify)operator(()ident(hash)operator(\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + ident(RHASH)operator(()ident(hash)operator(\)->)ident(ifnone) operator(=) ident(rb_block_proc)operator((\);) + ident(FL_SET)operator(()ident(hash)operator(,) ident(HASH_PROC_DEFAULT)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(ifnone)operator(\);) + ident(RHASH)operator(()ident(hash)operator(\)->)ident(ifnone) operator(=) ident(ifnone)operator(;) + operator(}) + + reserved(return) ident(hash)operator(;) +operator(}) + +comment(/* + * call-seq: + * Hash[ [key =>|, value]* ] => hash + * + * Creates a new hash populated with the given objects. Equivalent to + * the literal <code>{ <i>key</i>, <i>value</i>, ... }</code>. Keys and + * values occur in pairs, so there must be an even number of arguments. + * + * Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200} + * Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200} + * { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200} + */) + +directive(static) ident(VALUE) +ident(rb_hash_s_create)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(hash)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(1) operator(&&) ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_HASH)operator(\)) operator({) + ident(hash) operator(=) ident(hash_alloc0)operator(()ident(klass)operator(\);) + ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl) operator(=) ident(st_copy)operator(()ident(RHASH)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(tbl)operator(\);) + + reserved(return) ident(hash)operator(;) + operator(}) + + reserved(if) operator(()ident(argc) operator(%) integer(2) operator(!=) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(odd number of arguments for Hash)delimiter(")>operator(\);) + operator(}) + + ident(hash) operator(=) ident(hash_alloc)operator(()ident(klass)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(+=)integer(2)operator(\)) operator({) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(argv)operator([)ident(i)operator(],) ident(argv)operator([)ident(i) operator(+) integer(1)operator(]\);) + operator(}) + + reserved(return) ident(hash)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(to_hash)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(return) ident(rb_convert_type)operator(()ident(hash)operator(,) ident(T_HASH)operator(,) string<delimiter(")content(Hash)delimiter(")>operator(,) string<delimiter(")content(to_hash)delimiter(")>operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(rb_hash_rehash_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(tbl)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + ident(st_table) operator(*)ident(tbl)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(!=) ident(Qundef)operator(\)) ident(st_insert)operator(()ident(tbl)operator(,) ident(key)operator(,) ident(value)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.rehash -> hsh + * + * Rebuilds the hash based on the current hash values for each key. If + * values of key objects have changed since they were inserted, this + * method will reindex <i>hsh</i>. If <code>Hash#rehash</code> is + * called while an iterator is traversing the hash, an + * <code>IndexError</code> will be raised in the iterator. + * + * a = [ "a", "b" ] + * c = [ "c", "d" ] + * h = { a => 100, c => 300 } + * h[a] #=> 100 + * a[0] = "z" + * h[a] #=> nil + * h.rehash #=> {["z", "b"]=>100, ["c", "d"]=>300} + * h[a] #=> 100 + */) + +directive(static) ident(VALUE) +ident(rb_hash_rehash)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + + ident(rb_hash_modify)operator(()ident(hash)operator(\);) + ident(tbl) operator(=) ident(st_init_table_with_size)operator((&)ident(objhash)operator(,) ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(->)ident(num_entries)operator(\);) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(rb_hash_rehash_i)operator(,) operator(()ident(st_data_t)operator(\))ident(tbl)operator(\);) + ident(st_free_table)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(\);) + ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl) operator(=) ident(tbl)operator(;) + + reserved(return) ident(hash)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh[key] => value + * + * Element Reference---Retrieves the <i>value</i> object corresponding + * to the <i>key</i> object. If not found, returns the a default value (see + * <code>Hash::new</code> for details\). + * + * h = { "a" => 100, "b" => 200 } + * h["a"] #=> 100 + * h["c"] #=> nil + * + */) + +ident(VALUE) +ident(rb_hash_aref)operator(()ident(hash)operator(,) ident(key)operator(\)) + ident(VALUE) ident(hash)operator(,) ident(key)operator(;) +operator({) + ident(VALUE) ident(val)operator(;) + + reserved(if) operator((!)ident(st_lookup)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) ident(key)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(return) ident(rb_funcall)operator(()ident(hash)operator(,) ident(id_default)operator(,) integer(1)operator(,) ident(key)operator(\);) + operator(}) + reserved(return) ident(val)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.fetch(key [, default] \) => obj + * hsh.fetch(key\) {| key | block } => obj + * + * Returns a value from the hash for the given key. If the key can't be + * found, there are several options: With no other arguments, it will + * raise an <code>IndexError</code> exception; if <i>default</i> is + * given, then that will be returned; if the optional code block is + * specified, then that will be run and its result returned. + * + * h = { "a" => 100, "b" => 200 } + * h.fetch("a"\) #=> 100 + * h.fetch("z", "go fish"\) #=> "go fish" + * h.fetch("z"\) { |el| "go fish, #{el}"} #=> "go fish, z" + * + * The following example shows that an exception is raised if the key + * is not found and a default value is not supplied. + * + * h = { "a" => 100, "b" => 200 } + * h.fetch("z"\) + * + * <em>produces:</em> + * + * prog.rb:2:in `fetch': key not found (IndexError\) + * from prog.rb:2 + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_fetch)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(hash)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(key)operator(,) ident(if_none)operator(;) + ident(VALUE) ident(val)operator(;) + pre_type(long) ident(block_given)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(key)operator(,) operator(&)ident(if_none)operator(\);) + + ident(block_given) operator(=) ident(rb_block_given_p)operator((\);) + reserved(if) operator(()ident(block_given) operator(&&) ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(block supersedes default value argument)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!)ident(st_lookup)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) ident(key)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(if) operator(()ident(block_given)operator(\)) reserved(return) ident(rb_yield)operator(()ident(key)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(key not found)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(if_none)operator(;) + operator(}) + reserved(return) ident(val)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.default(key=nil\) => obj + * + * Returns the default value, the value that would be returned by + * <i>hsh</i>[<i>key</i>] if <i>key</i> did not exist in <i>hsh</i>. + * See also <code>Hash::new</code> and <code>Hash#default=</code>. + * + * h = Hash.new #=> {} + * h.default #=> nil + * h.default(2\) #=> nil + * + * h = Hash.new("cat"\) #=> {} + * h.default #=> "cat" + * h.default(2\) #=> "cat" + * + * h = Hash.new {|h,k| h[k] = k.to_i*10} #=> {} + * h.default #=> 0 + * h.default(2\) #=> 20 + */) + +directive(static) ident(VALUE) +ident(rb_hash_default)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(hash)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(key)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(key)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(hash)operator(,) ident(HASH_PROC_DEFAULT)operator(\)\)) operator({) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(rb_funcall)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(ifnone)operator(,) ident(id_call)operator(,) integer(2)operator(,) ident(hash)operator(,) ident(key)operator(\);) + operator(}) + reserved(return) ident(RHASH)operator(()ident(hash)operator(\)->)ident(ifnone)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.default = obj => hsh + * + * Sets the default value, the value returned for a key that does not + * exist in the hash. It is not possible to set the a default to a + * <code>Proc</code> that will be executed on each key lookup. + * + * h = { "a" => 100, "b" => 200 } + * h.default = "Go fish" + * h["a"] #=> 100 + * h["z"] #=> "Go fish" + * # This doesn't do what you might hope... + * h.default = proc do |hash, key| + * hash[key] = key + key + * end + * h[2] #=> #<Proc:0x401b3948@-:6> + * h["cat"] #=> #<Proc:0x401b3948@-:6> + */) + +directive(static) ident(VALUE) +ident(rb_hash_set_default)operator(()ident(hash)operator(,) ident(ifnone)operator(\)) + ident(VALUE) ident(hash)operator(,) ident(ifnone)operator(;) +operator({) + ident(rb_hash_modify)operator(()ident(hash)operator(\);) + ident(RHASH)operator(()ident(hash)operator(\)->)ident(ifnone) operator(=) ident(ifnone)operator(;) + ident(FL_UNSET)operator(()ident(hash)operator(,) ident(HASH_PROC_DEFAULT)operator(\);) + reserved(return) ident(ifnone)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.default_proc -> anObject + * + * If <code>Hash::new</code> was invoked with a block, return that + * block, otherwise return <code>nil</code>. + * + * h = Hash.new {|h,k| h[k] = k*k } #=> {} + * p = h.default_proc #=> #<Proc:0x401b3d08@-:1> + * a = [] #=> [] + * p.call(a, 2\) + * a #=> [nil, nil, 4] + */) + + +directive(static) ident(VALUE) +ident(rb_hash_default_proc)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(hash)operator(,) ident(HASH_PROC_DEFAULT)operator(\)\)) operator({) + reserved(return) ident(RHASH)operator(()ident(hash)operator(\)->)ident(ifnone)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(index_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(args)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + ident(VALUE) operator(*)ident(args)operator(;) +operator({) + reserved(if) operator(()ident(rb_equal)operator(()ident(value)operator(,) ident(args)operator([)integer(0)operator(]\)\)) operator({) + ident(args)operator([)integer(1)operator(]) operator(=) ident(key)operator(;) + reserved(return) ident(ST_STOP)operator(;) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_hash_delete_key)operator(()ident(hash)operator(,) ident(key)operator(\)) + ident(VALUE) ident(hash)operator(,) ident(key)operator(;) +operator({) + ident(st_data_t) ident(ktmp) operator(=) operator(()ident(st_data_t)operator(\))ident(key)operator(,) ident(val)operator(;) + + reserved(if) operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(iter_lev) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(st_delete_safe)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) operator(&)ident(ktmp)operator(,) operator(&)ident(val)operator(,) ident(Qundef)operator(\)\)) operator({) + ident(FL_SET)operator(()ident(hash)operator(,) ident(HASH_DELETED)operator(\);) + reserved(return) operator(()ident(VALUE)operator(\))ident(val)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(st_delete)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) operator(&)ident(ktmp)operator(,) operator(&)ident(val)operator(\)\)) + reserved(return) operator(()ident(VALUE)operator(\))ident(val)operator(;) + reserved(return) ident(Qundef)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.index(value\) => key + * + * Returns the key for a given value. If not found, returns <code>nil</code>. + * + * h = { "a" => 100, "b" => 200 } + * h.index(200\) #=> "b" + * h.index(999\) #=> nil + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_index)operator(()ident(hash)operator(,) ident(value)operator(\)) + ident(VALUE) ident(hash)operator(,) ident(value)operator(;) +operator({) + ident(VALUE) ident(args)operator([)integer(2)operator(];) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(value)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(Qnil)operator(;) + + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(index_i)operator(,) operator(()ident(st_data_t)operator(\))ident(args)operator(\);) + + reserved(return) ident(args)operator([)integer(1)operator(];) +operator(}) + +comment(/* + * call-seq: + * hsh.indexes(key, ...\) => array + * hsh.indices(key, ...\) => array + * + * Deprecated in favor of <code>Hash#select</code>. + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_indexes)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(hash)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(indexes)operator(;) + pre_type(int) ident(i)operator(;) + + ident(rb_warn)operator(()string<delimiter(")content(Hash#%s is deprecated; use Hash#values_at)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(rb_frame_last_func)operator((\)\)\);) + ident(indexes) operator(=) ident(rb_ary_new2)operator(()ident(argc)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(RARRAY)operator(()ident(indexes)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(rb_hash_aref)operator(()ident(hash)operator(,) ident(argv)operator([)ident(i)operator(]\);) + ident(RARRAY)operator(()ident(indexes)operator(\)->)ident(len)operator(++;) + operator(}) + reserved(return) ident(indexes)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.delete(key\) => value + * hsh.delete(key\) {| key | block } => value + * + * Deletes and returns a key-value pair from <i>hsh</i> whose key is + * equal to <i>key</i>. If the key is not found, returns the + * <em>default value</em>. If the optional code block is given and the + * key is not found, pass in the key and return the result of + * <i>block</i>. + * + * h = { "a" => 100, "b" => 200 } + * h.delete("a"\) #=> 100 + * h.delete("z"\) #=> nil + * h.delete("z"\) { |el| "#{el} not found" } #=> "z not found" + * + */) + +ident(VALUE) +ident(rb_hash_delete)operator(()ident(hash)operator(,) ident(key)operator(\)) + ident(VALUE) ident(hash)operator(,) ident(key)operator(;) +operator({) + ident(VALUE) ident(val)operator(;) + + ident(rb_hash_modify)operator(()ident(hash)operator(\);) + ident(val) operator(=) ident(rb_hash_delete_key)operator(()ident(hash)operator(,) ident(key)operator(\);) + reserved(if) operator(()ident(val) operator(!=) ident(Qundef)operator(\)) reserved(return) ident(val)operator(;) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(return) ident(rb_yield)operator(()ident(key)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +reserved(struct) ident(shift_var) operator({) + ident(VALUE) ident(key)operator(;) + ident(VALUE) ident(val)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(shift_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(var)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + reserved(struct) ident(shift_var) operator(*)ident(var)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator(()ident(var)operator(->)ident(key) operator(!=) ident(Qundef)operator(\)) reserved(return) ident(ST_STOP)operator(;) + ident(var)operator(->)ident(key) operator(=) ident(key)operator(;) + ident(var)operator(->)ident(val) operator(=) ident(value)operator(;) + reserved(return) ident(ST_DELETE)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(shift_i_safe)operator(()ident(key)operator(,) ident(value)operator(,) ident(var)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + reserved(struct) ident(shift_var) operator(*)ident(var)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(var)operator(->)ident(key) operator(=) ident(key)operator(;) + ident(var)operator(->)ident(val) operator(=) ident(value)operator(;) + reserved(return) ident(ST_STOP)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.shift -> anArray or obj + * + * Removes a key-value pair from <i>hsh</i> and returns it as the + * two-item array <code>[</code> <i>key, value</i> <code>]</code>, or + * the hash's default value if the hash is empty. + * + * h = { 1 => "a", 2 => "b", 3 => "c" } + * h.shift #=> [1, "a"] + * h #=> {2=>"b", 3=>"c"} + */) + +directive(static) ident(VALUE) +ident(rb_hash_shift)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(struct) ident(shift_var) ident(var)operator(;) + + ident(rb_hash_modify)operator(()ident(hash)operator(\);) + ident(var)operator(.)ident(key) operator(=) ident(Qundef)operator(;) + reserved(if) operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(iter_lev) operator(>) integer(0)operator(\)) operator({) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(shift_i_safe)operator(,) operator(()ident(st_data_t)operator(\)&)ident(var)operator(\);) + reserved(if) operator(()ident(var)operator(.)ident(key) operator(!=) ident(Qundef)operator(\)) operator({) + ident(st_data_t) ident(key) operator(=) ident(var)operator(.)ident(key)operator(;) + reserved(if) operator(()ident(st_delete_safe)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) operator(&)ident(key)operator(,) integer(0)operator(,) ident(Qundef)operator(\)\)) operator({) + ident(FL_SET)operator(()ident(hash)operator(,) ident(HASH_DELETED)operator(\);) + operator(}) + operator(}) + operator(}) + reserved(else) operator({) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(shift_i)operator(,) operator(()ident(st_data_t)operator(\)&)ident(var)operator(\);) + operator(}) + + reserved(if) operator(()ident(var)operator(.)ident(key) operator(!=) ident(Qundef)operator(\)) operator({) + reserved(return) ident(rb_assoc_new)operator(()ident(var)operator(.)ident(key)operator(,) ident(var)operator(.)ident(val)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(FL_TEST)operator(()ident(hash)operator(,) ident(HASH_PROC_DEFAULT)operator(\)\)) operator({) + reserved(return) ident(rb_funcall)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(ifnone)operator(,) ident(id_call)operator(,) integer(2)operator(,) ident(hash)operator(,) ident(Qnil)operator(\);) + operator(}) + reserved(else) operator({) + reserved(return) ident(RHASH)operator(()ident(hash)operator(\)->)ident(ifnone)operator(;) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(delete_if_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(hash)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(,) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield_values)operator(()integer(2)operator(,) ident(key)operator(,) ident(value)operator(\)\)\)) operator({) + ident(rb_hash_delete_key)operator(()ident(hash)operator(,) ident(key)operator(\);) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.delete_if {| key, value | block } -> hsh + * + * Deletes every key-value pair from <i>hsh</i> for which <i>block</i> + * evaluates to <code>true</code>. + * + * h = { "a" => 100, "b" => 200, "c" => 300 } + * h.delete_if {|key, value| key >= "b" } #=> {"a"=>100} + * + */) + +ident(VALUE) +ident(rb_hash_delete_if)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(rb_hash_modify)operator(()ident(hash)operator(\);) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(delete_if_i)operator(,) ident(hash)operator(\);) + reserved(return) ident(hash)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.reject! {| key, value | block } -> hsh or nil + * + * Equivalent to <code>Hash#delete_if</code>, but returns + * <code>nil</code> if no changes were made. + */) + +ident(VALUE) +ident(rb_hash_reject_bang)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + pre_type(int) ident(n) operator(=) ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(->)ident(num_entries)operator(;) + ident(rb_hash_delete_if)operator(()ident(hash)operator(\);) + reserved(if) operator(()ident(n) operator(==) ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(->)ident(num_entries)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(hash)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.reject {| key, value | block } -> a_hash + * + * Same as <code>Hash#delete_if</code>, but works on (and returns\) a + * copy of the <i>hsh</i>. Equivalent to + * <code><i>hsh</i>.dup.delete_if</code>. + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_reject)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(return) ident(rb_hash_delete_if)operator(()ident(rb_obj_dup)operator(()ident(hash)operator(\)\);) +operator(}) + +directive(static) pre_type(int) +ident(select_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(result)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(,) ident(result)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield_values)operator(()integer(2)operator(,) ident(key)operator(,) ident(value)operator(\)\)\)) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_assoc_new)operator(()ident(key)operator(,) ident(value)operator(\)\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.values_at(key, ...\) => array + * + * Return an array containing the values associated with the given keys. + * Also see <code>Hash.select</code>. + * + * h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" } + * h.values_at("cow", "cat"\) #=> ["bovine", "feline"] +*/) + +ident(VALUE) +ident(rb_hash_values_at)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(hash)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(rb_ary_new)operator((\);) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_hash_aref)operator(()ident(hash)operator(,) ident(argv)operator([)ident(i)operator(]\)\);) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.select {|key, value| block} => array + * + * Returns a new array consisting of <code>[key,value]</code> + * pairs for which the block returns true. + * Also see <code>Hash.values_at</code>. + * + * h = { "a" => 100, "b" => 200, "c" => 300 } + * h.select {|k,v| k > "a"} #=> [["b", 200], ["c", 300]] + * h.select {|k,v| v < 200} #=> [["a", 100]] + */) + +ident(VALUE) +ident(rb_hash_select)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(hash)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(result)operator(;) + + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 0\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + ident(result) operator(=) ident(rb_ary_new)operator((\);) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(select_i)operator(,) ident(result)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(clear_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(dummy)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(,) ident(dummy)operator(;) +operator({) + reserved(return) ident(ST_DELETE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.clear -> hsh + * + * Removes all key-value pairs from <i>hsh</i>. + * + * h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200} + * h.clear #=> {} + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_clear)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(rb_hash_modify)operator(()ident(hash)operator(\);) + reserved(if) operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(->)ident(num_entries) operator(>) integer(0)operator(\)) operator({) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(clear_i)operator(,) integer(0)operator(\);) + operator(}) + + reserved(return) ident(hash)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh[key] = value => value + * hsh.store(key, value\) => value + * + * Element Assignment---Associates the value given by + * <i>value</i> with the key given by <i>key</i>. + * <i>key</i> should not have its value changed while it is in + * use as a key (a <code>String</code> passed as a key will be + * duplicated and frozen\). + * + * h = { "a" => 100, "b" => 200 } + * h["a"] = 9 + * h["c"] = 4 + * h #=> {"a"=>9, "b"=>200, "c"=>4} + * + */) + +ident(VALUE) +ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(key)operator(,) ident(val)operator(\)) + ident(VALUE) ident(hash)operator(,) ident(key)operator(,) ident(val)operator(;) +operator({) + ident(rb_hash_modify)operator(()ident(hash)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(key)operator(\)) operator(!=) ident(T_STRING) operator(||) ident(st_lookup)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) ident(key)operator(,) integer(0)operator(\)\)) operator({) + ident(st_insert)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) ident(key)operator(,) ident(val)operator(\);) + operator(}) + reserved(else) operator({) + ident(st_add_direct)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) ident(rb_str_new4)operator(()ident(key)operator(\),) ident(val)operator(\);) + operator(}) + reserved(return) ident(val)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(replace_i)operator(()ident(key)operator(,) ident(val)operator(,) ident(hash)operator(\)) + ident(VALUE) ident(key)operator(,) ident(val)operator(,) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(!=) ident(Qundef)operator(\)) operator({) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(key)operator(,) ident(val)operator(\);) + operator(}) + + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.replace(other_hash\) -> hsh + * + * Replaces the contents of <i>hsh</i> with the contents of + * <i>other_hash</i>. + * + * h = { "a" => 100, "b" => 200 } + * h.replace({ "c" => 300, "d" => 400 }\) #=> {"c"=>300, "d"=>400} + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_replace)operator(()ident(hash)operator(,) ident(hash2)operator(\)) + ident(VALUE) ident(hash)operator(,) ident(hash2)operator(;) +operator({) + ident(hash2) operator(=) ident(to_hash)operator(()ident(hash2)operator(\);) + reserved(if) operator(()ident(hash) operator(==) ident(hash2)operator(\)) reserved(return) ident(hash)operator(;) + ident(rb_hash_clear)operator(()ident(hash)operator(\);) + ident(rb_hash_foreach)operator(()ident(hash2)operator(,) ident(replace_i)operator(,) ident(hash)operator(\);) + ident(RHASH)operator(()ident(hash)operator(\)->)ident(ifnone) operator(=) ident(RHASH)operator(()ident(hash2)operator(\)->)ident(ifnone)operator(;) + reserved(if) operator(()ident(FL_TEST)operator(()ident(hash2)operator(,) ident(HASH_PROC_DEFAULT)operator(\)\)) operator({) + ident(FL_SET)operator(()ident(hash)operator(,) ident(HASH_PROC_DEFAULT)operator(\);) + operator(}) + reserved(else) operator({) + ident(FL_UNSET)operator(()ident(hash)operator(,) ident(HASH_PROC_DEFAULT)operator(\);) + operator(}) + + reserved(return) ident(hash)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.length => fixnum + * hsh.size => fixnum + * + * Returns the number of key-value pairs in the hash. + * + * h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 } + * h.length #=> 4 + * h.delete("a"\) #=> 200 + * h.length #=> 3 + */) + +directive(static) ident(VALUE) +ident(rb_hash_size)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(return) ident(INT2FIX)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(->)ident(num_entries)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * hsh.empty? => true or false + * + * Returns <code>true</code> if <i>hsh</i> contains no key-value pairs. + * + * {}.empty? #=> true + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_empty_p)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(->)ident(num_entries) operator(==) integer(0)operator(\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(each_value_i)operator(()ident(key)operator(,) ident(value)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(rb_yield)operator(()ident(value)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.each_value {| value | block } -> hsh + * + * Calls <i>block</i> once for each key in <i>hsh</i>, passing the + * value as a parameter. + * + * h = { "a" => 100, "b" => 200 } + * h.each_value {|value| puts value } + * + * <em>produces:</em> + * + * 100 + * 200 + */) + +directive(static) ident(VALUE) +ident(rb_hash_each_value)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(each_value_i)operator(,) integer(0)operator(\);) + reserved(return) ident(hash)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(each_key_i)operator(()ident(key)operator(,) ident(value)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(rb_yield)operator(()ident(key)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.each_key {| key | block } -> hsh + * + * Calls <i>block</i> once for each key in <i>hsh</i>, passing the key + * as a parameter. + * + * h = { "a" => 100, "b" => 200 } + * h.each_key {|key| puts key } + * + * <em>produces:</em> + * + * a + * b + */) +directive(static) ident(VALUE) +ident(rb_hash_each_key)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(each_key_i)operator(,) integer(0)operator(\);) + reserved(return) ident(hash)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(each_pair_i)operator(()ident(key)operator(,) ident(value)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(rb_yield_values)operator(()integer(2)operator(,) ident(key)operator(,) ident(value)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.each_pair {| key_value_array | block } -> hsh + * + * Calls <i>block</i> once for each key in <i>hsh</i>, passing the key + * and value as parameters. + * + * h = { "a" => 100, "b" => 200 } + * h.each_pair {|key, value| puts "#{key} is #{value}" } + * + * <em>produces:</em> + * + * a is 100 + * b is 200 + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_each_pair)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(each_pair_i)operator(,) integer(0)operator(\);) + reserved(return) ident(hash)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(each_i)operator(()ident(key)operator(,) ident(value)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(rb_yield)operator(()ident(rb_assoc_new)operator(()ident(key)operator(,) ident(value)operator(\)\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.each {| key, value | block } -> hsh + * + * Calls <i>block</i> once for each key in <i>hsh</i>, passing the key + * and value to the block as a two-element array. Because of the assignment + * semantics of block parameters, these elements will be split out if the + * block has two formal parameters. Also see <code>Hash.each_pair</code>, which + * will be marginally more efficient for blocks with two parameters. + * + * h = { "a" => 100, "b" => 200 } + * h.each {|key, value| puts "#{key} is #{value}" } + * + * <em>produces:</em> + * + * a is 100 + * b is 200 + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_each)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(each_i)operator(,) integer(0)operator(\);) + reserved(return) ident(hash)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(to_a_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(ary)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(,) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_assoc_new)operator(()ident(key)operator(,) ident(value)operator(\)\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.to_a -> array + * + * Converts <i>hsh</i> to a nested array of <code>[</code> <i>key, + * value</i> <code>]</code> arrays. + * + * h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 } + * h.to_a #=> [["a", 100], ["c", 300], ["d", 400]] + */) + +directive(static) ident(VALUE) +ident(rb_hash_to_a)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(ary)operator(;) + + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(to_a_i)operator(,) ident(ary)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(hash)operator(\)\)) ident(OBJ_TAINT)operator(()ident(ary)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.sort => array + * hsh.sort {| a, b | block } => array + * + * Converts <i>hsh</i> to a nested array of <code>[</code> <i>key, + * value</i> <code>]</code> arrays and sorts it, using + * <code>Array#sort</code>. + * + * h = { "a" => 20, "b" => 30, "c" => 10 } + * h.sort #=> [["a", 20], ["b", 30], ["c", 10]] + * h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]] + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_sort)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(entries) operator(=) ident(rb_hash_to_a)operator(()ident(hash)operator(\);) + ident(rb_ary_sort_bang)operator(()ident(entries)operator(\);) + reserved(return) ident(entries)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(inspect_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(str)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(,) ident(str)operator(;) +operator({) + ident(VALUE) ident(str2)operator(;) + + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(1)operator(\)) operator({) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(, )delimiter(")>operator(\);) + operator(}) + ident(str2) operator(=) ident(rb_inspect)operator(()ident(key)operator(\);) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(str2)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(str2)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(=>)delimiter(")>operator(\);) + ident(str2) operator(=) ident(rb_inspect)operator(()ident(value)operator(\);) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(str2)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(str2)operator(\);) + + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(inspect_hash)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content({)delimiter(")>operator(\);) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(inspect_i)operator(,) ident(str)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(})delimiter(")>operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(hash)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.inspect => string + * + * Return the contents of this hash as a string. + */) + +directive(static) ident(VALUE) +ident(rb_hash_inspect)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl) operator(==) integer(0) operator(||) ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(->)ident(num_entries) operator(==) integer(0)operator(\)) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content({})delimiter(")>operator(\);) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(hash)operator(\)\)) reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content({...})delimiter(")>operator(\);) + reserved(return) ident(rb_protect_inspect)operator(()ident(inspect_hash)operator(,) ident(hash)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(to_s_hash)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(return) ident(rb_ary_to_s)operator(()ident(rb_hash_to_a)operator(()ident(hash)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * hsh.to_s => string + * + * Converts <i>hsh</i> to a string by converting the hash to an array + * of <code>[</code> <i>key, value</i> <code>]</code> pairs and then + * converting that array to a string using <code>Array#join</code> with + * the default separator. + * + * h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 } + * h.to_s #=> "a100c300d400" + */) + +directive(static) ident(VALUE) +ident(rb_hash_to_s)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(hash)operator(\)\)) reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content({...})delimiter(")>operator(\);) + reserved(return) ident(rb_protect_inspect)operator(()ident(to_s_hash)operator(,) ident(hash)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * hsh.to_hash => hsh + * + * Returns <i>self</i>. + */) + +directive(static) ident(VALUE) +ident(rb_hash_to_hash)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(return) ident(hash)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(keys_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(ary)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(,) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(key)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.keys => array + * + * Returns a new array populated with the keys from this hash. See also + * <code>Hash#values</code>. + * + * h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 } + * h.keys #=> ["a", "b", "c", "d"] + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_keys)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(ary)operator(;) + + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(keys_i)operator(,) ident(ary)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(values_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(ary)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(,) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(value)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.values => array + * + * Returns a new array populated with the values from <i>hsh</i>. See + * also <code>Hash#keys</code>. + * + * h = { "a" => 100, "b" => 200, "c" => 300 } + * h.values #=> [100, 200, 300] + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_values)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(ary)operator(;) + + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(values_i)operator(,) ident(ary)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.has_key?(key\) => true or false + * hsh.include?(key\) => true or false + * hsh.key?(key\) => true or false + * hsh.member?(key\) => true or false + * + * Returns <code>true</code> if the given key is present in <i>hsh</i>. + * + * h = { "a" => 100, "b" => 200 } + * h.has_key?("a"\) #=> true + * h.has_key?("z"\) #=> false + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_has_key)operator(()ident(hash)operator(,) ident(key)operator(\)) + ident(VALUE) ident(hash)operator(;) + ident(VALUE) ident(key)operator(;) +operator({) + reserved(if) operator(()ident(st_lookup)operator(()ident(RHASH)operator(()ident(hash)operator(\)->)ident(tbl)operator(,) ident(key)operator(,) integer(0)operator(\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(rb_hash_search_value)operator(()ident(key)operator(,) ident(value)operator(,) ident(data)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(,) operator(*)ident(data)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator(()ident(rb_equal)operator(()ident(value)operator(,) ident(data)operator([)integer(1)operator(]\)\)) operator({) + ident(data)operator([)integer(0)operator(]) operator(=) ident(Qtrue)operator(;) + reserved(return) ident(ST_STOP)operator(;) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.has_value?(value\) => true or false + * hsh.value?(value\) => true or false + * + * Returns <code>true</code> if the given value is present for some key + * in <i>hsh</i>. + * + * h = { "a" => 100, "b" => 200 } + * h.has_value?(100\) #=> true + * h.has_value?(999\) #=> false + */) + +directive(static) ident(VALUE) +ident(rb_hash_has_value)operator(()ident(hash)operator(,) ident(val)operator(\)) + ident(VALUE) ident(hash)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(VALUE) ident(data)operator([)integer(2)operator(];) + + ident(data)operator([)integer(0)operator(]) operator(=) ident(Qfalse)operator(;) + ident(data)operator([)integer(1)operator(]) operator(=) ident(val)operator(;) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(rb_hash_search_value)operator(,) operator(()ident(st_data_t)operator(\))ident(data)operator(\);) + reserved(return) ident(data)operator([)integer(0)operator(];) +operator(}) + +reserved(struct) ident(equal_data) operator({) + pre_type(int) ident(result)operator(;) + ident(st_table) operator(*)ident(tbl)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(equal_i)operator(()ident(key)operator(,) ident(val1)operator(,) ident(data)operator(\)) + ident(VALUE) ident(key)operator(,) ident(val1)operator(;) + reserved(struct) ident(equal_data) operator(*)ident(data)operator(;) +operator({) + ident(VALUE) ident(val2)operator(;) + + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator((!)ident(st_lookup)operator(()ident(data)operator(->)ident(tbl)operator(,) ident(key)operator(,) operator(&)ident(val2)operator(\)\)) operator({) + ident(data)operator(->)ident(result) operator(=) ident(Qfalse)operator(;) + reserved(return) ident(ST_STOP)operator(;) + operator(}) + reserved(if) operator((!)ident(rb_equal)operator(()ident(val1)operator(,) ident(val2)operator(\)\)) operator({) + ident(data)operator(->)ident(result) operator(=) ident(Qfalse)operator(;) + reserved(return) ident(ST_STOP)operator(;) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(hash_equal)operator(()ident(hash1)operator(,) ident(hash2)operator(,) ident(eql)operator(\)) + ident(VALUE) ident(hash1)operator(,) ident(hash2)operator(;) + pre_type(int) ident(eql)operator(;) comment(/* compare default value if true */) +operator({) + reserved(struct) ident(equal_data) ident(data)operator(;) + + reserved(if) operator(()ident(hash1) operator(==) ident(hash2)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(hash2)operator(\)) operator(!=) ident(T_HASH)operator(\)) operator({) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(hash2)operator(,) ident(rb_intern)operator(()string<delimiter(")content(to_hash)delimiter(")>operator(\)\)\)) operator({) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(rb_equal)operator(()ident(hash2)operator(,) ident(hash1)operator(\);) + operator(}) + reserved(if) operator(()ident(RHASH)operator(()ident(hash1)operator(\)->)ident(tbl)operator(->)ident(num_entries) operator(!=) ident(RHASH)operator(()ident(hash2)operator(\)->)ident(tbl)operator(->)ident(num_entries)operator(\)) + reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(eql)operator(\)) operator({) + reserved(if) operator((!()ident(rb_equal)operator(()ident(RHASH)operator(()ident(hash1)operator(\)->)ident(ifnone)operator(,) ident(RHASH)operator(()ident(hash2)operator(\)->)ident(ifnone)operator(\)) operator(&&) + ident(FL_TEST)operator(()ident(hash1)operator(,) ident(HASH_PROC_DEFAULT)operator(\)) operator(==) ident(FL_TEST)operator(()ident(hash2)operator(,) ident(HASH_PROC_DEFAULT)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + operator(}) + + ident(data)operator(.)ident(tbl) operator(=) ident(RHASH)operator(()ident(hash2)operator(\)->)ident(tbl)operator(;) + ident(data)operator(.)ident(result) operator(=) ident(Qtrue)operator(;) + ident(rb_hash_foreach)operator(()ident(hash1)operator(,) ident(equal_i)operator(,) operator(()ident(st_data_t)operator(\)&)ident(data)operator(\);) + + reserved(return) ident(data)operator(.)ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh == other_hash => true or false + * + * Equality---Two hashes are equal if they each contain the same number + * of keys and if each key-value pair is equal to (according to + * <code>Object#==</code>\) the corresponding elements in the other + * hash. + * + * h1 = { "a" => 1, "c" => 2 } + * h2 = { 7 => 35, "c" => 2, "a" => 1 } + * h3 = { "a" => 1, "c" => 2, 7 => 35 } + * h4 = { "a" => 1, "d" => 2, "f" => 35 } + * h1 == h2 #=> false + * h2 == h3 #=> true + * h3 == h4 #=> false + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_equal)operator(()ident(hash1)operator(,) ident(hash2)operator(\)) + ident(VALUE) ident(hash1)operator(,) ident(hash2)operator(;) +operator({) + reserved(return) ident(hash_equal)operator(()ident(hash1)operator(,) ident(hash2)operator(,) ident(Qfalse)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(rb_hash_invert_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(hash)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(value)operator(,) ident(key)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.invert -> aHash + * + * Returns a new hash created by using <i>hsh</i>'s values as keys, and + * the keys as values. + * + * h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 } + * h.invert #=> {0=>"a", 100=>"n", 200=>"d", 300=>"y"} + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_invert)operator(()ident(hash)operator(\)) + ident(VALUE) ident(hash)operator(;) +operator({) + ident(VALUE) ident(h) operator(=) ident(rb_hash_new)operator((\);) + + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(rb_hash_invert_i)operator(,) ident(h)operator(\);) + reserved(return) ident(h)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(rb_hash_update_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(hash)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(key)operator(,) ident(value)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(rb_hash_update_block_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(hash)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + ident(VALUE) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(==) ident(Qundef)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator(()ident(rb_hash_has_key)operator(()ident(hash)operator(,) ident(key)operator(\)\)) operator({) + ident(value) operator(=) ident(rb_yield_values)operator(()integer(3)operator(,) ident(key)operator(,) ident(rb_hash_aref)operator(()ident(hash)operator(,) ident(key)operator(\),) ident(value)operator(\);) + operator(}) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(key)operator(,) ident(value)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.merge!(other_hash\) => hsh + * hsh.update(other_hash\) => hsh + * hsh.merge!(other_hash\){|key, oldval, newval| block} => hsh + * hsh.update(other_hash\){|key, oldval, newval| block} => hsh + * + * Adds the contents of <i>other_hash</i> to <i>hsh</i>, overwriting + * entries with duplicate keys with those from <i>other_hash</i>. + * + * h1 = { "a" => 100, "b" => 200 } + * h2 = { "b" => 254, "c" => 300 } + * h1.merge!(h2\) #=> {"a"=>100, "b"=>254, "c"=>300} + */) + +directive(static) ident(VALUE) +ident(rb_hash_update)operator(()ident(hash1)operator(,) ident(hash2)operator(\)) + ident(VALUE) ident(hash1)operator(,) ident(hash2)operator(;) +operator({) + ident(hash2) operator(=) ident(to_hash)operator(()ident(hash2)operator(\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_hash_foreach)operator(()ident(hash2)operator(,) ident(rb_hash_update_block_i)operator(,) ident(hash1)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_hash_foreach)operator(()ident(hash2)operator(,) ident(rb_hash_update_i)operator(,) ident(hash1)operator(\);) + operator(}) + reserved(return) ident(hash1)operator(;) +operator(}) + +comment(/* + * call-seq: + * hsh.merge(other_hash\) -> a_hash + * hsh.merge(other_hash\){|key, oldval, newval| block} -> a_hash + * + * Returns a new hash containing the contents of <i>other_hash</i> and + * the contents of <i>hsh</i>, overwriting entries in <i>hsh</i> with + * duplicate keys with those from <i>other_hash</i>. + * + * h1 = { "a" => 100, "b" => 200 } + * h2 = { "b" => 254, "c" => 300 } + * h1.merge(h2\) #=> {"a"=>100, "b"=>254, "c"=>300} + * h1 #=> {"a"=>100, "b"=>200} + * + */) + +directive(static) ident(VALUE) +ident(rb_hash_merge)operator(()ident(hash1)operator(,) ident(hash2)operator(\)) + ident(VALUE) ident(hash1)operator(,) ident(hash2)operator(;) +operator({) + reserved(return) ident(rb_hash_update)operator(()ident(rb_obj_dup)operator(()ident(hash1)operator(\),) ident(hash2)operator(\);) +operator(}) + +directive(static) pre_type(int) ident(path_tainted) operator(=) operator(-)integer(1)operator(;) + +directive(static) pre_type(char) operator(**)ident(origenviron)operator(;) +preprocessor(#ifdef) ident(_WIN32) +preprocessor(#define) ident(GET_ENVIRON)operator(()ident(e)operator(\)) operator(()ident(e) operator(=) ident(rb_w32_get_environ)operator((\)\)) +preprocessor(#define) ident(FREE_ENVIRON)operator(()ident(e)operator(\)) ident(rb_w32_free_environ)operator(()ident(e)operator(\)) +directive(static) pre_type(char) operator(**)ident(my_environ)operator(;) +preprocessor(#undef) ident(environ) +preprocessor(#define) ident(environ) ident(my_environ) +preprocessor(#elif) ident(defined)operator(()ident(__APPLE__)operator(\)) +preprocessor(#undef) ident(environ) +preprocessor(#define) ident(environ) operator((*)ident(_NSGetEnviron)operator((\)\)) +preprocessor(#define) ident(GET_ENVIRON)operator(()ident(e)operator(\)) operator(()ident(e)operator(\)) +preprocessor(#define) ident(FREE_ENVIRON)operator(()ident(e)operator(\)) +preprocessor(#else) +directive(extern) pre_type(char) operator(**)ident(environ)operator(;) +preprocessor(#define) ident(GET_ENVIRON)operator(()ident(e)operator(\)) operator(()ident(e)operator(\)) +preprocessor(#define) ident(FREE_ENVIRON)operator(()ident(e)operator(\)) +preprocessor(#endif) + +directive(static) ident(VALUE) +ident(env_str_new)operator(()ident(ptr)operator(,) ident(len)operator(\)) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(rb_tainted_str_new)operator(()ident(ptr)operator(,) ident(len)operator(\);) + + ident(rb_obj_freeze)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_str_new2)operator(()ident(ptr)operator(\)) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) +operator({) + reserved(if) operator((!)ident(ptr)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(env_str_new)operator(()ident(ptr)operator(,) ident(strlen)operator(()ident(ptr)operator(\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(env_delete)operator(()ident(obj)operator(,) ident(name)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(name)operator(;) +operator({) + pre_type(char) operator(*)ident(nam)operator(,) operator(*)ident(val)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + ident(SafeStringValue)operator(()ident(name)operator(\);) + ident(nam) operator(=) ident(RSTRING)operator(()ident(name)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(strlen)operator(()ident(nam)operator(\)) operator(!=) ident(RSTRING)operator(()ident(name)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad environment variable name)delimiter(")>operator(\);) + operator(}) + ident(val) operator(=) ident(getenv)operator(()ident(nam)operator(\);) + reserved(if) operator(()ident(val)operator(\)) operator({) + ident(VALUE) ident(value) operator(=) ident(env_str_new2)operator(()ident(val)operator(\);) + + ident(ruby_setenv)operator(()ident(nam)operator(,) integer(0)operator(\);) +preprocessor(#ifdef) ident(ENV_IGNORECASE) + reserved(if) operator(()ident(strcasecmp)operator(()ident(nam)operator(,) ident(PATH_ENV)operator(\)) operator(==) integer(0)operator(\)) +preprocessor(#else) + reserved(if) operator(()ident(strcmp)operator(()ident(nam)operator(,) ident(PATH_ENV)operator(\)) operator(==) integer(0)operator(\)) +preprocessor(#endif) + operator({) + ident(path_tainted) operator(=) integer(0)operator(;) + operator(}) + reserved(return) ident(value)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_delete_m)operator(()ident(obj)operator(,) ident(name)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(name)operator(;) +operator({) + ident(VALUE) ident(val)operator(;) + + ident(val) operator(=) ident(env_delete)operator(()ident(obj)operator(,) ident(name)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(val)operator(\)) operator(&&) ident(rb_block_given_p)operator((\)\)) ident(rb_yield)operator(()ident(name)operator(\);) + reserved(return) ident(val)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_f_getenv)operator(()ident(obj)operator(,) ident(name)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(name)operator(;) +operator({) + pre_type(char) operator(*)ident(nam)operator(,) operator(*)ident(env)operator(;) + + ident(StringValue)operator(()ident(name)operator(\);) + ident(nam) operator(=) ident(RSTRING)operator(()ident(name)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(strlen)operator(()ident(nam)operator(\)) operator(!=) ident(RSTRING)operator(()ident(name)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad environment variable name)delimiter(")>operator(\);) + operator(}) + ident(env) operator(=) ident(getenv)operator(()ident(nam)operator(\);) + reserved(if) operator(()ident(env)operator(\)) operator({) +preprocessor(#ifdef) ident(ENV_IGNORECASE) + reserved(if) operator(()ident(strcasecmp)operator(()ident(nam)operator(,) ident(PATH_ENV)operator(\)) operator(==) integer(0) operator(&&) operator(!)ident(rb_env_path_tainted)operator((\)\)) +preprocessor(#else) + reserved(if) operator(()ident(strcmp)operator(()ident(nam)operator(,) ident(PATH_ENV)operator(\)) operator(==) integer(0) operator(&&) operator(!)ident(rb_env_path_tainted)operator((\)\)) +preprocessor(#endif) + operator({) + ident(VALUE) ident(str) operator(=) ident(rb_str_new2)operator(()ident(env)operator(\);) + + ident(rb_obj_freeze)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) + operator(}) + reserved(return) ident(env_str_new2)operator(()ident(env)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_fetch)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(key)operator(,) ident(if_none)operator(;) + pre_type(long) ident(block_given)operator(;) + pre_type(char) operator(*)ident(nam)operator(,) operator(*)ident(env)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(key)operator(,) operator(&)ident(if_none)operator(\);) + ident(block_given) operator(=) ident(rb_block_given_p)operator((\);) + reserved(if) operator(()ident(block_given) operator(&&) ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(block supersedes default value argument)delimiter(")>operator(\);) + operator(}) + ident(StringValue)operator(()ident(key)operator(\);) + ident(nam) operator(=) ident(RSTRING)operator(()ident(key)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(strlen)operator(()ident(nam)operator(\)) operator(!=) ident(RSTRING)operator(()ident(key)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad environment variable name)delimiter(")>operator(\);) + operator(}) + ident(env) operator(=) ident(getenv)operator(()ident(nam)operator(\);) + reserved(if) operator((!)ident(env)operator(\)) operator({) + reserved(if) operator(()ident(block_given)operator(\)) reserved(return) ident(rb_yield)operator(()ident(key)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(key not found)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(if_none)operator(;) + operator(}) +preprocessor(#ifdef) ident(ENV_IGNORECASE) + reserved(if) operator(()ident(strcasecmp)operator(()ident(nam)operator(,) ident(PATH_ENV)operator(\)) operator(==) integer(0) operator(&&) operator(!)ident(rb_env_path_tainted)operator((\)\)) +preprocessor(#else) + reserved(if) operator(()ident(strcmp)operator(()ident(nam)operator(,) ident(PATH_ENV)operator(\)) operator(==) integer(0) operator(&&) operator(!)ident(rb_env_path_tainted)operator((\)\)) +preprocessor(#endif) + reserved(return) ident(rb_str_new2)operator(()ident(env)operator(\);) + reserved(return) ident(env_str_new2)operator(()ident(env)operator(\);) +operator(}) + +directive(static) directive(void) +ident(path_tainted_p)operator(()ident(path)operator(\)) + pre_type(char) operator(*)ident(path)operator(;) +operator({) + ident(path_tainted) operator(=) ident(rb_path_check)operator(()ident(path)operator(\)?)integer(0)operator(:)integer(1)operator(;) +operator(}) + +pre_type(int) +ident(rb_env_path_tainted)operator((\)) +operator({) + reserved(if) operator(()ident(path_tainted) operator(<) integer(0)operator(\)) operator({) + ident(path_tainted_p)operator(()ident(getenv)operator(()ident(PATH_ENV)operator(\)\);) + operator(}) + reserved(return) ident(path_tainted)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(envix)operator(()ident(nam)operator(\)) + directive(const) pre_type(char) operator(*)ident(nam)operator(;) +operator({) + directive(register) pre_type(int) ident(i)operator(,) ident(len) operator(=) ident(strlen)operator(()ident(nam)operator(\);) + pre_type(char) operator(**)ident(env)operator(;) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(env)operator([)ident(i)operator(];) ident(i)operator(++\)) operator({) + reserved(if) operator(() +preprocessor(#ifdef) ident(ENV_IGNORECASE) + ident(strncasecmp)operator(()ident(env)operator([)ident(i)operator(],)ident(nam)operator(,)ident(len)operator(\)) operator(==) integer(0) +preprocessor(#else) + ident(memcmp)operator(()ident(env)operator([)ident(i)operator(],)ident(nam)operator(,)ident(len)operator(\)) operator(==) integer(0) +preprocessor(#endif) + operator(&&) ident(env)operator([)ident(i)operator(][)ident(len)operator(]) operator(==) char('=')operator(\)) + reserved(break)operator(;) comment(/* memcmp must come first to avoid */) + operator(}) comment(/* potential SEGV's */) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(i)operator(;) +operator(}) + +directive(void) +ident(ruby_setenv)operator(()ident(name)operator(,) ident(value)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + directive(const) pre_type(char) operator(*)ident(value)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(_WIN32)operator(\)) + comment(/* The sane way to deal with the environment. + * Has these advantages over putenv(\) & co.: + * * enables us to store a truly empty value in the + * environment (like in UNIX\). + * * we don't have to deal with RTL globals, bugs and leaks. + * * Much faster. + * Why you may want to enable USE_WIN32_RTL_ENV: + * * environ[] and RTL functions will not reflect changes, + * which might be an issue if extensions want to access + * the env. via RTL. This cuts both ways, since RTL will + * not see changes made by extensions that call the Win32 + * functions directly, either. + * GSAR 97-06-07 + * + * REMARK: USE_WIN32_RTL_ENV is already obsoleted since we don't use + * RTL's environ global variable directly yet. + */) + ident(SetEnvironmentVariable)operator(()ident(name)operator(,)ident(value)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETENV)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_UNSETENV)operator(\)) +preprocessor(#undef) ident(setenv) +preprocessor(#undef) ident(unsetenv) + reserved(if) operator(()ident(value)operator(\)) + ident(setenv)operator(()ident(name)operator(,)ident(value)operator(,)integer(1)operator(\);) + reserved(else) + ident(unsetenv)operator(()ident(name)operator(\);) +preprocessor(#else) comment(/* WIN32 */) + ident(size_t) ident(len)operator(;) + pre_type(int) ident(i)operator(=)ident(envix)operator(()ident(name)operator(\);) comment(/* where does it go? */) + + reserved(if) operator(()ident(environ) operator(==) ident(origenviron)operator(\)) operator({) comment(/* need we copy environment? */) + pre_type(int) ident(j)operator(;) + pre_type(int) ident(max)operator(;) + pre_type(char) operator(**)ident(tmpenv)operator(;) + + reserved(for) operator(()ident(max) operator(=) ident(i)operator(;) ident(environ)operator([)ident(max)operator(];) ident(max)operator(++\)) operator(;) + ident(tmpenv) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(*,) ident(max)operator(+)integer(2)operator(\);) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(j)operator(<)ident(max)operator(;) ident(j)operator(++\)) comment(/* copy environment */) + ident(tmpenv)operator([)ident(j)operator(]) operator(=) ident(strdup)operator(()ident(environ)operator([)ident(j)operator(]\);) + ident(tmpenv)operator([)ident(max)operator(]) operator(=) integer(0)operator(;) + ident(environ) operator(=) ident(tmpenv)operator(;) comment(/* tell exec where it is now */) + operator(}) + reserved(if) operator(()ident(environ)operator([)ident(i)operator(]\)) operator({) + pre_type(char) operator(**)ident(envp) operator(=) ident(origenviron)operator(;) + reserved(while) operator((*)ident(envp) operator(&&) operator(*)ident(envp) operator(!=) ident(environ)operator([)ident(i)operator(]\)) ident(envp)operator(++;) + reserved(if) operator((!*)ident(envp)operator(\)) + ident(free)operator(()ident(environ)operator([)ident(i)operator(]\);) + reserved(if) operator((!)ident(value)operator(\)) operator({) + reserved(while) operator(()ident(environ)operator([)ident(i)operator(]\)) operator({) + ident(environ)operator([)ident(i)operator(]) operator(=) ident(environ)operator([)ident(i)operator(+)integer(1)operator(];) + ident(i)operator(++;) + operator(}) + reserved(return)operator(;) + operator(}) + operator(}) + reserved(else) operator({) comment(/* does not exist yet */) + reserved(if) operator((!)ident(value)operator(\)) reserved(return)operator(;) + ident(REALLOC_N)operator(()ident(environ)operator(,) pre_type(char)operator(*,) ident(i)operator(+)integer(2)operator(\);) comment(/* just expand it a bit */) + ident(environ)operator([)ident(i)operator(+)integer(1)operator(]) operator(=) integer(0)operator(;) comment(/* make sure it's null terminated */) + operator(}) + ident(len) operator(=) ident(strlen)operator(()ident(name)operator(\)) operator(+) ident(strlen)operator(()ident(value)operator(\)) operator(+) integer(2)operator(;) + ident(environ)operator([)ident(i)operator(]) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,) ident(len)operator(\);) +preprocessor(#ifndef) ident(MSDOS) + ident(snprintf)operator(()ident(environ)operator([)ident(i)operator(],)ident(len)operator(,)string<delimiter(")content(%s=%s)delimiter(")>operator(,)ident(name)operator(,)ident(value)operator(\);) comment(/* all that work just for this */) +preprocessor(#else) + comment(/* MS-DOS requires environment variable names to be in uppercase */) + comment(/* [Tom Dinger, 27 August 1990: Well, it doesn't _require_ it, but + * some utilities and applications may break because they only look + * for upper case strings. (Fixed strupr(\) bug here.\)] + */) + ident(strcpy)operator(()ident(environ)operator([)ident(i)operator(],)ident(name)operator(\);) ident(strupr)operator(()ident(environ)operator([)ident(i)operator(]\);) + ident(sprintf)operator(()ident(environ)operator([)ident(i)operator(]) operator(+) ident(strlen)operator(()ident(name)operator(\),)string<delimiter(")content(=%s)delimiter(")>operator(,) ident(value)operator(\);) +preprocessor(#endif) comment(/* MSDOS */) + +preprocessor(#endif) comment(/* WIN32 */) +operator(}) + +directive(void) +ident(ruby_unsetenv)operator(()ident(name)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(ruby_setenv)operator(()ident(name)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(env_aset)operator(()ident(obj)operator(,) ident(nm)operator(,) ident(val)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(nm)operator(,) ident(val)operator(;) +operator({) + pre_type(char) operator(*)ident(name)operator(,) operator(*)ident(value)operator(;) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(can't change environment variable)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + ident(env_delete)operator(()ident(obj)operator(,) ident(nm)operator(\);) + reserved(return) ident(Qnil)operator(;) + operator(}) + + ident(StringValue)operator(()ident(nm)operator(\);) + ident(StringValue)operator(()ident(val)operator(\);) + ident(name) operator(=) ident(RSTRING)operator(()ident(nm)operator(\)->)ident(ptr)operator(;) + ident(value) operator(=) ident(RSTRING)operator(()ident(val)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(strlen)operator(()ident(name)operator(\)) operator(!=) ident(RSTRING)operator(()ident(nm)operator(\)->)ident(len)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad environment variable name)delimiter(")>operator(\);) + reserved(if) operator(()ident(strlen)operator(()ident(value)operator(\)) operator(!=) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad environment variable value)delimiter(")>operator(\);) + + ident(ruby_setenv)operator(()ident(name)operator(,) ident(value)operator(\);) +preprocessor(#ifdef) ident(ENV_IGNORECASE) + reserved(if) operator(()ident(strcasecmp)operator(()ident(name)operator(,) ident(PATH_ENV)operator(\)) operator(==) integer(0)operator(\)) operator({) +preprocessor(#else) + reserved(if) operator(()ident(strcmp)operator(()ident(name)operator(,) ident(PATH_ENV)operator(\)) operator(==) integer(0)operator(\)) operator({) +preprocessor(#endif) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(val)operator(\)\)) operator({) + comment(/* already tainted, no check */) + ident(path_tainted) operator(=) integer(1)operator(;) + reserved(return) ident(val)operator(;) + operator(}) + reserved(else) operator({) + ident(path_tainted_p)operator(()ident(value)operator(\);) + operator(}) + operator(}) + reserved(return) ident(val)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_keys)operator((\)) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(while) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + reserved(if) operator(()ident(s)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(env_str_new)operator((*)ident(env)operator(,) ident(s)operator(-*)ident(env)operator(\)\);) + operator(}) + ident(env)operator(++;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_each_key)operator(()ident(ehash)operator(\)) + ident(VALUE) ident(ehash)operator(;) +operator({) + ident(VALUE) ident(keys) operator(=) ident(env_keys)operator((\);) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(keys)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(RARRAY)operator(()ident(keys)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + reserved(return) ident(ehash)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_values)operator((\)) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(while) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + reserved(if) operator(()ident(s)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(env_str_new2)operator(()ident(s)operator(+)integer(1)operator(\)\);) + operator(}) + ident(env)operator(++;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_each_value)operator(()ident(ehash)operator(\)) + ident(VALUE) ident(ehash)operator(;) +operator({) + ident(VALUE) ident(values) operator(=) ident(env_values)operator((\);) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(values)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(RARRAY)operator(()ident(values)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + reserved(return) ident(ehash)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_each_i)operator(()ident(ehash)operator(,) ident(values)operator(\)) + ident(VALUE) ident(ehash)operator(;) + pre_type(int) ident(values)operator(;) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + pre_type(long) ident(i)operator(;) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(while) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + reserved(if) operator(()ident(s)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(env_str_new)operator((*)ident(env)operator(,) ident(s)operator(-*)ident(env)operator(\)\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(env_str_new2)operator(()ident(s)operator(+)integer(1)operator(\)\);) + operator(}) + ident(env)operator(++;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(+=)integer(2)operator(\)) operator({) + reserved(if) operator(()ident(values)operator(\)) operator({) + ident(rb_yield_values)operator(()integer(2)operator(,) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(+)integer(1)operator(]\);) + operator(}) + reserved(else) operator({) + ident(rb_yield)operator(()ident(rb_assoc_new)operator(()ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(+)integer(1)operator(]\)\);) + operator(}) + operator(}) + reserved(return) ident(ehash)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_each)operator(()ident(ehash)operator(\)) + ident(VALUE) ident(ehash)operator(;) +operator({) + reserved(return) ident(env_each_i)operator(()ident(ehash)operator(,) ident(Qfalse)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(env_each_pair)operator(()ident(ehash)operator(\)) + ident(VALUE) ident(ehash)operator(;) +operator({) + reserved(return) ident(env_each_i)operator(()ident(ehash)operator(,) ident(Qtrue)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(env_reject_bang)operator((\)) +operator({) + directive(volatile) ident(VALUE) ident(keys)operator(;) + pre_type(long) ident(i)operator(;) + pre_type(int) ident(del) operator(=) integer(0)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + ident(keys) operator(=) ident(env_keys)operator((\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(keys)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(val) operator(=) ident(rb_f_getenv)operator(()ident(Qnil)operator(,) ident(RARRAY)operator(()ident(keys)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield_values)operator(()integer(2)operator(,) ident(RARRAY)operator(()ident(keys)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(val)operator(\)\)\)) operator({) + ident(FL_UNSET)operator(()ident(RARRAY)operator(()ident(keys)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(FL_TAINT)operator(\);) + ident(env_delete)operator(()ident(Qnil)operator(,) ident(RARRAY)operator(()ident(keys)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + ident(del)operator(++;) + operator(}) + operator(}) + operator(}) + reserved(if) operator(()ident(del) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(envtbl)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_delete_if)operator((\)) +operator({) + ident(env_reject_bang)operator((\);) + reserved(return) ident(envtbl)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_values_at)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(rb_ary_new)operator((\);) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_f_getenv)operator(()ident(Qnil)operator(,) ident(argv)operator([)ident(i)operator(]\)\);) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_select)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(result)operator(;) + pre_type(char) operator(**)ident(env)operator(;) + + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 0\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + ident(result) operator(=) ident(rb_ary_new)operator((\);) + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(while) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + reserved(if) operator(()ident(s)operator(\)) operator({) + ident(VALUE) ident(k) operator(=) ident(env_str_new)operator((*)ident(env)operator(,) ident(s)operator(-*)ident(env)operator(\);) + ident(VALUE) ident(v) operator(=) ident(env_str_new2)operator(()ident(s)operator(+)integer(1)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield_values)operator(()integer(2)operator(,) ident(k)operator(,) ident(v)operator(\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_assoc_new)operator(()ident(k)operator(,) ident(v)operator(\)\);) + operator(}) + operator(}) + ident(env)operator(++;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_clear)operator((\)) +operator({) + directive(volatile) ident(VALUE) ident(keys)operator(;) + pre_type(long) ident(i)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + ident(keys) operator(=) ident(env_keys)operator((\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(keys)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(val) operator(=) ident(rb_f_getenv)operator(()ident(Qnil)operator(,) ident(RARRAY)operator(()ident(keys)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + ident(env_delete)operator(()ident(Qnil)operator(,) ident(RARRAY)operator(()ident(keys)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + operator(}) + reserved(return) ident(envtbl)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_to_s)operator((\)) +operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(ENV)delimiter(")>operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(env_inspect)operator((\)) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + ident(VALUE) ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content({)delimiter(")>operator(\);) + ident(VALUE) ident(i)operator(;) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(while) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + + reserved(if) operator(()ident(env) operator(!=) ident(environ)operator(\)) operator({) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(, )delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(s)operator(\)) operator({) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")char(\\")delimiter(")>operator(\);) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) operator(*)ident(env)operator(,) ident(s)operator(-*)ident(env)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")char(\\")content(=>)delimiter(")>operator(\);) + ident(i) operator(=) ident(rb_inspect)operator(()ident(rb_str_new2)operator(()ident(s)operator(+)integer(1)operator(\)\);) + ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(i)operator(\);) + operator(}) + ident(env)operator(++;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(})delimiter(")>operator(\);) + ident(OBJ_TAINT)operator(()ident(str)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_to_a)operator((\)) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(while) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + reserved(if) operator(()ident(s)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_assoc_new)operator(()ident(env_str_new)operator((*)ident(env)operator(,) ident(s)operator(-*)ident(env)operator(\),) + ident(env_str_new2)operator(()ident(s)operator(+)integer(1)operator(\)\)\);) + operator(}) + ident(env)operator(++;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_none)operator((\)) +operator({) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_size)operator((\)) +operator({) + pre_type(int) ident(i)operator(;) + pre_type(char) operator(**)ident(env)operator(;) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(for)operator(()ident(i)operator(=)integer(0)operator(;) ident(env)operator([)ident(i)operator(];) ident(i)operator(++\)) + operator(;) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(i)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(env_empty_p)operator((\)) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(if) operator(()ident(env)operator([)integer(0)operator(]) operator(==) integer(0)operator(\)) operator({) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(Qtrue)operator(;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_has_key)operator(()ident(env)operator(,) ident(key)operator(\)) + ident(VALUE) ident(env)operator(,) ident(key)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(;) + + ident(s) operator(=) ident(StringValuePtr)operator(()ident(key)operator(\);) + reserved(if) operator(()ident(strlen)operator(()ident(s)operator(\)) operator(!=) ident(RSTRING)operator(()ident(key)operator(\)->)ident(len)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad environment variable name)delimiter(")>operator(\);) + reserved(if) operator(()ident(getenv)operator(()ident(s)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_has_value)operator(()ident(dmy)operator(,) ident(value)operator(\)) + ident(VALUE) ident(dmy)operator(,) ident(value)operator(;) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(value)operator(\)) operator(!=) ident(T_STRING)operator(\)) reserved(return) ident(Qfalse)operator(;) + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(while) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + reserved(if) operator(()ident(s)operator(++\)) operator({) + pre_type(long) ident(len) operator(=) ident(strlen)operator(()ident(s)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(value)operator(\)->)ident(len) operator(==) ident(len) operator(&&) ident(strncmp)operator(()ident(s)operator(,) ident(RSTRING)operator(()ident(value)operator(\)->)ident(ptr)operator(,) ident(len)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) + ident(env)operator(++;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_index)operator(()ident(dmy)operator(,) ident(value)operator(\)) + ident(VALUE) ident(dmy)operator(,) ident(value)operator(;) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + ident(VALUE) ident(str)operator(;) + + ident(StringValue)operator(()ident(value)operator(\);) + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(while) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + reserved(if) operator(()ident(s)operator(++\)) operator({) + pre_type(long) ident(len) operator(=) ident(strlen)operator(()ident(s)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(value)operator(\)->)ident(len) operator(==) ident(len) operator(&&) ident(strncmp)operator(()ident(s)operator(,) ident(RSTRING)operator(()ident(value)operator(\)->)ident(ptr)operator(,) ident(len)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(str) operator(=) ident(env_str_new)operator((*)ident(env)operator(,) ident(s)operator(-*)ident(env)operator(-)integer(1)operator(\);) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(str)operator(;) + operator(}) + operator(}) + ident(env)operator(++;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_indexes)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + ident(VALUE) ident(indexes) operator(=) ident(rb_ary_new2)operator(()ident(argc)operator(\);) + + ident(rb_warn)operator(()string<delimiter(")content(ENV.%s is deprecated; use ENV.values_at)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(rb_frame_last_func)operator((\)\)\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(argc)operator(;)ident(i)operator(++\)) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_check_string_type)operator(()ident(argv)operator([)ident(i)operator(]\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + ident(RARRAY)operator(()ident(indexes)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(else) operator({) + ident(RARRAY)operator(()ident(indexes)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(env_str_new2)operator(()ident(getenv)operator(()ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(\)\);) + operator(}) + ident(RARRAY)operator(()ident(indexes)operator(\)->)ident(len) operator(=) ident(i)operator(+)integer(1)operator(;) + operator(}) + + reserved(return) ident(indexes)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_to_hash)operator((\)) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + ident(VALUE) ident(hash) operator(=) ident(rb_hash_new)operator((\);) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(while) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + reserved(if) operator(()ident(s)operator(\)) operator({) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(env_str_new)operator((*)ident(env)operator(,) ident(s)operator(-*)ident(env)operator(\),) + ident(env_str_new2)operator(()ident(s)operator(+)integer(1)operator(\)\);) + operator(}) + ident(env)operator(++;) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(hash)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_reject)operator((\)) +operator({) + reserved(return) ident(rb_hash_delete_if)operator(()ident(env_to_hash)operator((\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(env_shift)operator((\)) +operator({) + pre_type(char) operator(**)ident(env)operator(;) + + ident(env) operator(=) ident(GET_ENVIRON)operator(()ident(environ)operator(\);) + reserved(if) operator((*)ident(env)operator(\)) operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(strchr)operator((*)ident(env)operator(,) char('=')operator(\);) + reserved(if) operator(()ident(s)operator(\)) operator({) + ident(VALUE) ident(key) operator(=) ident(env_str_new)operator((*)ident(env)operator(,) ident(s)operator(-*)ident(env)operator(\);) + ident(VALUE) ident(val) operator(=) ident(env_str_new2)operator(()ident(getenv)operator(()ident(RSTRING)operator(()ident(key)operator(\)->)ident(ptr)operator(\)\);) + ident(env_delete)operator(()ident(Qnil)operator(,) ident(key)operator(\);) + reserved(return) ident(rb_assoc_new)operator(()ident(key)operator(,) ident(val)operator(\);) + operator(}) + operator(}) + ident(FREE_ENVIRON)operator(()ident(environ)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_invert)operator((\)) +operator({) + reserved(return) ident(rb_hash_invert)operator(()ident(env_to_hash)operator((\)\);) +operator(}) + +directive(static) pre_type(int) +ident(env_replace_i)operator(()ident(key)operator(,) ident(val)operator(,) ident(keys)operator(\)) + ident(VALUE) ident(key)operator(,) ident(val)operator(,) ident(keys)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(!=) ident(Qundef)operator(\)) operator({) + ident(env_aset)operator(()ident(Qnil)operator(,) ident(key)operator(,) ident(val)operator(\);) + reserved(if) operator(()ident(rb_ary_includes)operator(()ident(keys)operator(,) ident(key)operator(\)\)) operator({) + ident(rb_ary_delete)operator(()ident(keys)operator(,) ident(key)operator(\);) + operator(}) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_replace)operator(()ident(env)operator(,) ident(hash)operator(\)) + ident(VALUE) ident(env)operator(,) ident(hash)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(keys) operator(=) ident(env_keys)operator((\);) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(env) operator(==) ident(hash)operator(\)) reserved(return) ident(env)operator(;) + ident(hash) operator(=) ident(to_hash)operator(()ident(hash)operator(\);) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(env_replace_i)operator(,) ident(keys)operator(\);) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(keys)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(env_delete)operator(()ident(env)operator(,) ident(RARRAY)operator(()ident(keys)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + reserved(return) ident(env)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(env_update_i)operator(()ident(key)operator(,) ident(val)operator(\)) + ident(VALUE) ident(key)operator(,) ident(val)operator(;) +operator({) + reserved(if) operator(()ident(key) operator(!=) ident(Qundef)operator(\)) operator({) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(val) operator(=) ident(rb_yield_values)operator(()integer(3)operator(,) ident(key)operator(,) ident(rb_f_getenv)operator(()ident(Qnil)operator(,) ident(key)operator(\),) ident(val)operator(\);) + operator(}) + ident(env_aset)operator(()ident(Qnil)operator(,) ident(key)operator(,) ident(val)operator(\);) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(env_update)operator(()ident(env)operator(,) ident(hash)operator(\)) + ident(VALUE) ident(env)operator(,) ident(hash)operator(;) +operator({) + reserved(if) operator(()ident(env) operator(==) ident(hash)operator(\)) reserved(return) ident(env)operator(;) + ident(hash) operator(=) ident(to_hash)operator(()ident(hash)operator(\);) + ident(rb_hash_foreach)operator(()ident(hash)operator(,) ident(env_update_i)operator(,) integer(0)operator(\);) + reserved(return) ident(env)operator(;) +operator(}) + +comment(/* + * A <code>Hash</code> is a collection of key-value pairs. It is + * similar to an <code>Array</code>, except that indexing is done via + * arbitrary keys of any object type, not an integer index. The order + * in which you traverse a hash by either key or value may seem + * arbitrary, and will generally not be in the insertion order. + * + * Hashes have a <em>default value</em> that is returned when accessing + * keys that do not exist in the hash. By default, that value is + * <code>nil</code>. + * + * <code>Hash</code> uses <code>key.eql?</code> to test keys for equality. + * If you need to use instances of your own classes as keys in a <code>Hash</code>, + * it is recommended that you define both the <code>eql?</code> and <code>hash</code> + * methods. The <code>hash</code> method must have the property that + * <code>a.eql?(b\)</code> implies <code>a.hash == b.hash</code>. + * + * class MyClass + * attr_reader :str + * def initialize(str\) + * @str = str + * end + * def eql?(o\) + * o.is_a?(MyClass\) && str == o.str + * end + * def hash + * @str.hash + * end + * end + * + * a = MyClass.new("some string"\) + * b = MyClass.new("some string"\) + * a.eql? b #=> true + * + * h = {} + * + * h[a] = 1 + * h[a] #=> 1 + * h[b] #=> 1 + * + * h[b] = 2 + * h[a] #=> 2 + * h[b] #=> 2 + */) + +directive(void) +ident(Init_Hash)operator((\)) +operator({) + ident(id_hash) operator(=) ident(rb_intern)operator(()string<delimiter(")content(hash)delimiter(")>operator(\);) + ident(id_call) operator(=) ident(rb_intern)operator(()string<delimiter(")content(call)delimiter(")>operator(\);) + ident(id_default) operator(=) ident(rb_intern)operator(()string<delimiter(")content(default)delimiter(")>operator(\);) + + ident(rb_cHash) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Hash)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + + ident(rb_include_module)operator(()ident(rb_cHash)operator(,) ident(rb_mEnumerable)operator(\);) + + ident(rb_define_alloc_func)operator(()ident(rb_cHash)operator(,) ident(hash_alloc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cHash)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(rb_hash_s_create)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_hash_initialize)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_hash_replace)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(rehash)delimiter(")>operator(,) ident(rb_hash_rehash)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(to_hash)delimiter(")>operator(,) ident(rb_hash_to_hash)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(to_a)delimiter(")>operator(,) ident(rb_hash_to_a)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(to_s)delimiter(")>operator(,) ident(rb_hash_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_hash_inspect)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(==)delimiter(")>operator(,) ident(rb_hash_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content([])delimiter(")>operator(,) ident(rb_hash_aref)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(fetch)delimiter(")>operator(,) ident(rb_hash_fetch)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content([]=)delimiter(")>operator(,) ident(rb_hash_aset)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(store)delimiter(")>operator(,) ident(rb_hash_aset)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(default)delimiter(")>operator(,) ident(rb_hash_default)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(default=)delimiter(")>operator(,) ident(rb_hash_set_default)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(default_proc)delimiter(")>operator(,) ident(rb_hash_default_proc)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(index)delimiter(")>operator(,) ident(rb_hash_index)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(indexes)delimiter(")>operator(,) ident(rb_hash_indexes)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(indices)delimiter(")>operator(,) ident(rb_hash_indexes)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(size)delimiter(")>operator(,) ident(rb_hash_size)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(length)delimiter(")>operator(,) ident(rb_hash_size)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(empty?)delimiter(")>operator(,) ident(rb_hash_empty_p)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(each)delimiter(")>operator(,) ident(rb_hash_each)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(each_value)delimiter(")>operator(,) ident(rb_hash_each_value)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(each_key)delimiter(")>operator(,) ident(rb_hash_each_key)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(each_pair)delimiter(")>operator(,) ident(rb_hash_each_pair)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(sort)delimiter(")>operator(,) ident(rb_hash_sort)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(keys)delimiter(")>operator(,) ident(rb_hash_keys)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(values)delimiter(")>operator(,) ident(rb_hash_values)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(values_at)delimiter(")>operator(,) ident(rb_hash_values_at)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(shift)delimiter(")>operator(,) ident(rb_hash_shift)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(delete)delimiter(")>operator(,) ident(rb_hash_delete)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(delete_if)delimiter(")>operator(,) ident(rb_hash_delete_if)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(select)delimiter(")>operator(,) ident(rb_hash_select)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(reject)delimiter(")>operator(,) ident(rb_hash_reject)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(reject!)delimiter(")>operator(,) ident(rb_hash_reject_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(clear)delimiter(")>operator(,) ident(rb_hash_clear)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(invert)delimiter(")>operator(,) ident(rb_hash_invert)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(update)delimiter(")>operator(,) ident(rb_hash_update)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(replace)delimiter(")>operator(,) ident(rb_hash_replace)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(merge!)delimiter(")>operator(,) ident(rb_hash_update)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(merge)delimiter(")>operator(,) ident(rb_hash_merge)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(include?)delimiter(")>operator(,) ident(rb_hash_has_key)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(member?)delimiter(")>operator(,) ident(rb_hash_has_key)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(has_key?)delimiter(")>operator(,) ident(rb_hash_has_key)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(has_value?)delimiter(")>operator(,) ident(rb_hash_has_value)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(key?)delimiter(")>operator(,) ident(rb_hash_has_key)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cHash)operator(,)string<delimiter(")content(value?)delimiter(")>operator(,) ident(rb_hash_has_value)operator(,) integer(1)operator(\);) + +preprocessor(#ifndef) ident(__MACOS__) comment(/* environment variables nothing on MacOS. */) + ident(origenviron) operator(=) ident(environ)operator(;) + ident(envtbl) operator(=) ident(rb_obj_alloc)operator(()ident(rb_cObject)operator(\);) + ident(rb_extend_object)operator(()ident(envtbl)operator(,) ident(rb_mEnumerable)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content([])delimiter(")>operator(,) ident(rb_f_getenv)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(fetch)delimiter(")>operator(,) ident(env_fetch)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content([]=)delimiter(")>operator(,) ident(env_aset)operator(,) integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(store)delimiter(")>operator(,) ident(env_aset)operator(,) integer(2)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(each)delimiter(")>operator(,) ident(env_each)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(each_pair)delimiter(")>operator(,) ident(env_each_pair)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(each_key)delimiter(")>operator(,) ident(env_each_key)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(each_value)delimiter(")>operator(,) ident(env_each_value)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(delete)delimiter(")>operator(,) ident(env_delete_m)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(delete_if)delimiter(")>operator(,) ident(env_delete_if)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(clear)delimiter(")>operator(,) ident(env_clear)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(reject)delimiter(")>operator(,) ident(env_reject)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(reject!)delimiter(")>operator(,) ident(env_reject_bang)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(select)delimiter(")>operator(,) ident(env_select)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(shift)delimiter(")>operator(,) ident(env_shift)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(invert)delimiter(")>operator(,) ident(env_invert)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(replace)delimiter(")>operator(,) ident(env_replace)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(update)delimiter(")>operator(,) ident(env_update)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(inspect)delimiter(")>operator(,) ident(env_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(rehash)delimiter(")>operator(,) ident(env_none)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(to_a)delimiter(")>operator(,) ident(env_to_a)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(to_s)delimiter(")>operator(,) ident(env_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(index)delimiter(")>operator(,) ident(env_index)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(indexes)delimiter(")>operator(,) ident(env_indexes)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(indices)delimiter(")>operator(,) ident(env_indexes)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(size)delimiter(")>operator(,) ident(env_size)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(length)delimiter(")>operator(,) ident(env_size)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(empty?)delimiter(")>operator(,) ident(env_empty_p)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(keys)delimiter(")>operator(,) ident(env_keys)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(values)delimiter(")>operator(,) ident(env_values)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(values_at)delimiter(")>operator(,) ident(env_values_at)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(include?)delimiter(")>operator(,) ident(env_has_key)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(member?)delimiter(")>operator(,) ident(env_has_key)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(has_key?)delimiter(")>operator(,) ident(env_has_key)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(has_value?)delimiter(")>operator(,) ident(env_has_value)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(key?)delimiter(")>operator(,) ident(env_has_key)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(value?)delimiter(")>operator(,) ident(env_has_value)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(envtbl)operator(,)string<delimiter(")content(to_hash)delimiter(")>operator(,) ident(env_to_hash)operator(,) integer(0)operator(\);) + + ident(rb_define_global_const)operator(()string<delimiter(")content(ENV)delimiter(")>operator(,) ident(envtbl)operator(\);) +preprocessor(#else) comment(/* __MACOS__ */) + ident(envtbl) operator(=) ident(rb_hash_s_new)operator(()integer(0)operator(,) pre_constant(NULL)operator(,) ident(rb_cHash)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(ENV)delimiter(")>operator(,) ident(envtbl)operator(\);) +preprocessor(#endif) comment(/* ifndef __MACOS__ environment variables nothing on MacOS. */) +operator(}) +comment(/********************************************************************** + + inits.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Tue Dec 28 16:01:58 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") + +directive(void) ident(Init_Array) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Bignum) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Binding) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Comparable) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Dir) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Enumerable) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Exception) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_syserr) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_eval) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_load) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Proc) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Thread) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_File) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_GC) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Hash) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_IO) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Math) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_marshal) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Numeric) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Object) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_pack) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Precision) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_sym) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_process) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Random) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Range) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Regexp) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_signal) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_String) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Struct) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_Time) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_var_tables) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(Init_version) ident(_)operator((()directive(void)operator(\)\);) + +directive(void) +ident(rb_call_inits)operator((\)) +operator({) + ident(Init_sym)operator((\);) + ident(Init_var_tables)operator((\);) + ident(Init_Object)operator((\);) + ident(Init_Comparable)operator((\);) + ident(Init_Enumerable)operator((\);) + ident(Init_Precision)operator((\);) + ident(Init_eval)operator((\);) + ident(Init_String)operator((\);) + ident(Init_Exception)operator((\);) + ident(Init_Thread)operator((\);) + ident(Init_Numeric)operator((\);) + ident(Init_Bignum)operator((\);) + ident(Init_syserr)operator((\);) + ident(Init_Array)operator((\);) + ident(Init_Hash)operator((\);) + ident(Init_Struct)operator((\);) + ident(Init_Regexp)operator((\);) + ident(Init_pack)operator((\);) + ident(Init_Range)operator((\);) + ident(Init_IO)operator((\);) + ident(Init_Dir)operator((\);) + ident(Init_Time)operator((\);) + ident(Init_Random)operator((\);) + ident(Init_signal)operator((\);) + ident(Init_process)operator((\);) + ident(Init_load)operator((\);) + ident(Init_Proc)operator((\);) + ident(Init_Binding)operator((\);) + ident(Init_Math)operator((\);) + ident(Init_GC)operator((\);) + ident(Init_marshal)operator((\);) + ident(Init_version)operator((\);) +operator(}) +comment(/********************************************************************** + + io.c - + + $Author: shyouhei $ + $Date: 2009-03-09 01:52:15 +0100 (Mon, 09 Mar 2009\) $ + created at: Fri Oct 15 18:08:59 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#if) ident(defined)operator(()ident(__VMS)operator(\)) +preprocessor(#define) ident(_XOPEN_SOURCE) +preprocessor(#define) ident(_POSIX_C_SOURCE) integer(2) +preprocessor(#endif) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("rubyio.h") +preprocessor(#include) include("rubysig.h") +preprocessor(#include) include("env.h") +preprocessor(#include) include(<ctype.h>) +preprocessor(#include) include(<errno.h>) + +preprocessor(#if) ident(defined)operator(()ident(MSDOS)operator(\)) operator(||) ident(defined)operator(()ident(__BOW__)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__EMX__)operator(\)) operator(||) ident(defined)operator(()ident(__BEOS__)operator(\)) +preprocessor(# define) ident(NO_SAFE_RENAME) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(MSDOS)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) +preprocessor(# define) ident(NO_LONG_FNAME) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__FreeBSD__)operator(\)) operator(||) ident(defined)operator(()ident(__NetBSD__)operator(\)) operator(||) ident(defined)operator(()ident(__OpenBSD__)operator(\)) operator(||) ident(defined)operator(()ident(__DragonFly__)operator(\)) operator(||) ident(defined)operator(()ident(sun)operator(\)) operator(||) ident(defined)operator(()ident(_nec_ews)operator(\)) +preprocessor(# define) ident(USE_SETVBUF) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__QNXNTO__) +preprocessor(#include) include("unix.h") +preprocessor(#endif) + +preprocessor(#include) include(<sys/types.h>) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SYS_IOCTL_H)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(DJGPP)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__human68k__)operator(\)) +preprocessor(#include) include(<sys/ioctl.h>) +preprocessor(#endif) +preprocessor(#if) ident(defined)operator(()ident(HAVE_FCNTL_H)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) +preprocessor(#include) include(<fcntl.h>) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SYS_FCNTL_H)operator(\)) +preprocessor(#include) include(<sys/fcntl.h>) +preprocessor(#endif) + +preprocessor(#if) operator(!)ident(HAVE_OFF_T) operator(&&) operator(!)ident(defined)operator(()ident(off_t)operator(\)) +preprocessor(# define) ident(off_t) pre_type(long) +preprocessor(#endif) +preprocessor(#if) operator(!)ident(HAVE_FSEEKO) operator(&&) operator(!)ident(defined)operator(()ident(fseeko)operator(\)) +preprocessor(# define) ident(fseeko) ident(fseek) +preprocessor(#endif) +preprocessor(#if) operator(!)ident(HAVE_FTELLO) operator(&&) operator(!)ident(defined)operator(()ident(ftello)operator(\)) +preprocessor(# define) ident(ftello) ident(ftell) +preprocessor(#endif) + +preprocessor(#include) include(<sys/stat.h>) + +comment(/* EMX has sys/param.h, but.. */) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SYS_PARAM_H)operator(\)) operator(&&) operator(!()ident(defined)operator(()ident(__EMX__)operator(\)) operator(||) ident(defined)operator(()ident(__HIUX_MPP__)operator(\)\)) +preprocessor(# include) include(<sys/param.h>) +preprocessor(#endif) + +preprocessor(#if) operator(!)ident(defined) ident(NOFILE) +preprocessor(# define) ident(NOFILE) integer(64) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#ifdef) ident(HAVE_SYSCALL_H) +preprocessor(#include) include(<syscall.h>) +preprocessor(#elif) ident(defined) ident(HAVE_SYS_SYSCALL_H) +preprocessor(#include) include(<sys/syscall.h>) +preprocessor(#endif) + +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) + +directive(extern) directive(void) ident(Init_File) ident(_)operator((()directive(void)operator(\)\);) + +preprocessor(#ifdef) ident(__BEOS__) +preprocessor(# ifndef) ident(NOFILE) +preprocessor(# define) ident(NOFILE) operator(()ident(OPEN_MAX)operator(\)) +preprocessor(# endif) +preprocessor(#include) include(<net/socket.h>) +preprocessor(#endif) + +preprocessor(#include) include("util.h") + +preprocessor(#ifndef) ident(O_ACCMODE) +preprocessor(#define) ident(O_ACCMODE) operator(()ident(O_RDONLY) operator(|) ident(O_WRONLY) operator(|) ident(O_RDWR)operator(\)) +preprocessor(#endif) + +preprocessor(#if) ident(SIZEOF_OFF_T) operator(>) ident(SIZEOF_LONG) operator(&&) operator(!)ident(defined)operator(()ident(HAVE_LONG_LONG)operator(\)) +preprocessor(# error) ident(off_t) ident(is) ident(bigger) ident(than) pre_type(long)operator(,) ident(but) ident(you) ident(have) ident(no) pre_type(long) pre_type(long)operator(.)operator(.)operator(.) +preprocessor(#endif) + +preprocessor(#ifndef) ident(PIPE_BUF) +preprocessor(# ifdef) ident(_POSIX_PIPE_BUF) +preprocessor(# define) ident(PIPE_BUF) ident(_POSIX_PIPE_BUF) +preprocessor(# else) +preprocessor(# define) ident(PIPE_BUF) integer(512) comment(/* is this ok? */) +preprocessor(# endif) +preprocessor(#endif) + +ident(VALUE) ident(rb_cIO)operator(;) +ident(VALUE) ident(rb_eEOFError)operator(;) +ident(VALUE) ident(rb_eIOError)operator(;) + +ident(VALUE) ident(rb_stdin)operator(,) ident(rb_stdout)operator(,) ident(rb_stderr)operator(;) +ident(VALUE) ident(rb_deferr)operator(;) comment(/* rescue VIM plugin */) +directive(static) ident(VALUE) ident(orig_stdout)operator(,) ident(orig_stderr)operator(;) + +ident(VALUE) ident(rb_output_fs)operator(;) +ident(VALUE) ident(rb_rs)operator(;) +ident(VALUE) ident(rb_output_rs)operator(;) +ident(VALUE) ident(rb_default_rs)operator(;) + +directive(static) ident(VALUE) ident(argf)operator(;) + +directive(static) ident(ID) ident(id_write)operator(,) ident(id_read)operator(,) ident(id_getc)operator(;) + +directive(extern) pre_type(char) operator(*)ident(ruby_inplace_mode)operator(;) + +reserved(struct) ident(timeval) ident(rb_time_interval) ident(_)operator((()ident(VALUE)operator(\)\);) + +directive(static) ident(VALUE) ident(filename)operator(,) ident(current_file)operator(;) +directive(static) pre_type(int) ident(gets_lineno)operator(;) +directive(static) pre_type(int) ident(init_p) operator(=) integer(0)operator(,) ident(next_p) operator(=) integer(0)operator(;) +directive(static) ident(VALUE) ident(lineno) operator(=) ident(INT2FIX)operator(()integer(0)operator(\);) + +preprocessor(#ifdef) ident(_STDIO_USES_IOSTREAM) comment(/* GNU libc */) +preprocessor(# ifdef) ident(_IO_fpos_t) +preprocessor(# define) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(_IO_read_ptr) operator(!=) operator(()ident(fp)operator(\)->)ident(_IO_read_end)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_COUNT)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(_IO_read_end) operator(-) operator(()ident(fp)operator(\)->)ident(_IO_read_ptr)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_PTR)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(_IO_read_ptr)operator(\)) +preprocessor(# else) +preprocessor(# define) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(_gptr) operator(<) operator(()ident(fp)operator(\)->)ident(_egptr)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_COUNT)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(_egptr) operator(-) operator(()ident(fp)operator(\)->)ident(_gptr)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_PTR)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(_gptr)operator(\)) +preprocessor(# endif) +preprocessor(#elif) ident(defined)operator(()ident(_LP64)operator(\)) operator(&&) operator(()ident(defined)operator(()ident(__sun__)operator(\)) operator(||) ident(defined)operator(()ident(__sun)operator(\)\)) +reserved(typedef) reserved(struct) ident(_FILE64) operator({) + pre_type(unsigned) pre_type(char) operator(*)ident(_ptr)operator(;) comment(/* next character from/to here in buffer */) + pre_type(unsigned) pre_type(char) operator(*)ident(_base)operator(;) comment(/* the buffer */) + pre_type(unsigned) pre_type(char) operator(*)ident(_end)operator(;) comment(/* the end of the buffer */) + ident(ssize_t) ident(_cnt)operator(;) comment(/* number of available characters in buffer */) + pre_type(int) ident(_file)operator(;) comment(/* UNIX System file descriptor */) + pre_type(unsigned) pre_type(int) ident(_flag)operator(;) comment(/* the state of the stream */) + pre_type(char) ident(__fill)operator([)integer(80)operator(];) comment(/* filler to bring size to 128 bytes */) +operator(}) ident(FILE64)operator(;) +preprocessor(# define) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) operator(((()ident(FILE64)operator(*\)()ident(fp)operator(\)\)->)ident(_cnt) operator(>) integer(0)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_COUNT)operator(()ident(fp)operator(\)) operator(((()ident(FILE64)operator(*\)()ident(fp)operator(\)\)->)ident(_cnt)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_PTR)operator(()ident(fp)operator(\)) operator((()pre_type(char) operator(*\)(()ident(FILE64)operator(*\)()ident(fp)operator(\)\)->)ident(_ptr)operator(\)) +preprocessor(#elif) ident(defined)operator(()ident(FILE_COUNT)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(FILE_COUNT) operator(>) integer(0)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_COUNT)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(FILE_COUNT)operator(\)) +preprocessor(#elif) ident(defined)operator(()ident(FILE_READEND)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(FILE_READPTR) operator(<) operator(()ident(fp)operator(\)->)ident(FILE_READEND)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_COUNT)operator(()ident(fp)operator(\)) operator((()ident(fp)operator(\)->)ident(FILE_READEND) operator(-) operator(()ident(fp)operator(\)->)ident(FILE_READPTR)operator(\)) +preprocessor(#elif) ident(defined)operator(()ident(__BEOS__)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) operator(()ident(fp)operator(->)ident(_state)operator(.)ident(_eof) operator(==) integer(0)operator(\)) +preprocessor(#elif) ident(defined)operator(()ident(__VMS)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_COUNT)operator(()ident(fp)operator(\)) operator((()pre_type(unsigned) pre_type(int)operator(\)(*()ident(fp)operator(\)\)->)ident(_cnt)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) operator(((()pre_type(unsigned) pre_type(int)operator(\)(*()ident(fp)operator(\)\)->)ident(_cnt)operator(\)) operator(>) integer(0)operator(\)) +preprocessor(# define) ident(READ_DATA_BUFFERED)operator(()ident(fp)operator(\)) integer(0) +preprocessor(#elif) ident(defined)operator(()ident(__DragonFly__)operator(\)) +comment(/* FILE is an incomplete struct type since DragonFly BSD 1.4.0 */) +preprocessor(# define) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) operator(((()reserved(struct) ident(__FILE_public) operator(*\)()ident(fp)operator(\)\)->)ident(_r) operator(>) integer(0)operator(\)) +preprocessor(# define) ident(READ_DATA_PENDING_COUNT)operator(()ident(fp)operator(\)) operator(((()reserved(struct) ident(__FILE_public) operator(*\)()ident(fp)operator(\)\)->)ident(_r)operator(\)) +preprocessor(#else) +comment(/* requires systems own version of the ReadDataPending(\) */) +directive(extern) pre_type(int) ident(ReadDataPending)operator((\);) +preprocessor(# define) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) operator((!)ident(feof)operator(()ident(fp)operator(\)\)) +preprocessor(# define) ident(READ_DATA_BUFFERED)operator(()ident(fp)operator(\)) integer(0) +preprocessor(#endif) +preprocessor(#ifndef) ident(READ_DATA_BUFFERED) +preprocessor(# define) ident(READ_DATA_BUFFERED)operator(()ident(fp)operator(\)) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)) +preprocessor(#endif) + +preprocessor(#ifndef) ident(READ_DATA_PENDING_PTR) +preprocessor(# ifdef) ident(FILE_READPTR) +preprocessor(# define) ident(READ_DATA_PENDING_PTR)operator(()ident(fp)operator(\)) operator((()pre_type(char) operator(*\)()ident(fp)operator(\)->)ident(FILE_READPTR)operator(\)) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(__DJGPP__) +preprocessor(# undef) ident(READ_DATA_PENDING_COUNT) +preprocessor(# undef) ident(READ_DATA_PENDING_PTR) +preprocessor(#endif) + +preprocessor(#define) ident(READ_CHECK)operator(()ident(fp)operator(\)) reserved(do) operator({)\ + reserved(if) operator((!)ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)\)) operator({)\ + ident(rb_thread_wait_fd)operator(()ident(fileno)operator(()ident(fp)operator(\)\);)\ + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);)\ + operator(})\ +operator(}) reserved(while)operator(()integer(0)operator(\)) + +directive(void) +ident(rb_eof_error)operator((\)) +operator({) + ident(rb_raise)operator(()ident(rb_eEOFError)operator(,) string<delimiter(")content(end of file reached)delimiter(")>operator(\);) +operator(}) + +ident(VALUE) +ident(rb_io_taint_check)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(io)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: operation on untainted IO)delimiter(")>operator(\);) + ident(rb_check_frozen)operator(()ident(io)operator(\);) + reserved(return) ident(io)operator(;) +operator(}) + +directive(void) +ident(rb_io_check_initialized)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + reserved(if) operator((!)ident(fptr)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(uninitialized stream)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(void) +ident(rb_io_check_closed)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + ident(rb_io_check_initialized)operator(()ident(fptr)operator(\);) + reserved(if) operator((!)ident(fptr)operator(->)ident(f) operator(&&) operator(!)ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(closed stream)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) ident(io_fflush) ident(_)operator((()ident(FILE) operator(*,) ident(OpenFile) operator(*\)\);) + +directive(static) ident(OpenFile) operator(*) +ident(flush_before_seek)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + reserved(if) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WBUF)operator(\)) operator({) + ident(io_fflush)operator(()ident(GetWriteFile)operator(()ident(fptr)operator(\),) ident(fptr)operator(\);) + operator(}) + ident(errno) operator(=) integer(0)operator(;) + reserved(return) ident(fptr)operator(;) +operator(}) + +preprocessor(#define) ident(io_seek)operator(()ident(fptr)operator(,) ident(ofs)operator(,) ident(whence)operator(\)) ident(fseeko)operator(()ident(flush_before_seek)operator(()ident(fptr)operator(\)->)ident(f)operator(,) ident(ofs)operator(,) ident(whence)operator(\)) +preprocessor(#define) ident(io_tell)operator(()ident(fptr)operator(\)) ident(ftello)operator(()ident(flush_before_seek)operator(()ident(fptr)operator(\)->)ident(f)operator(\)) + +preprocessor(#ifndef) ident(SEEK_CUR) +preprocessor(# define) ident(SEEK_SET) integer(0) +preprocessor(# define) ident(SEEK_CUR) integer(1) +preprocessor(# define) ident(SEEK_END) integer(2) +preprocessor(#endif) + +preprocessor(#define) ident(FMODE_SYNCWRITE) operator(()ident(FMODE_SYNC)operator(|)ident(FMODE_WRITABLE)operator(\)) + +directive(void) +ident(rb_io_check_readable)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + reserved(if) operator((!()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_READABLE)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(not opened for reading)delimiter(")>operator(\);) + operator(}) +preprocessor(#ifdef) ident(NEED_IO_SEEK_BETWEEN_RW) + reserved(if) operator(((()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WBUF)operator(\)) operator(||) + operator(()ident(fptr)operator(->)ident(mode) operator(&) operator(()ident(FMODE_SYNCWRITE)operator(|)ident(FMODE_RBUF)operator(\)\)) operator(==) ident(FMODE_SYNCWRITE)operator(\)) operator(&&) + operator(!)ident(feof)operator(()ident(fptr)operator(->)ident(f)operator(\)) operator(&&) + operator(!)ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(io_seek)operator(()ident(fptr)operator(,) integer(0)operator(,) ident(SEEK_CUR)operator(\);) + operator(}) +preprocessor(#endif) + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_RBUF)operator(;) +operator(}) + +directive(void) +ident(rb_io_check_writable)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + reserved(if) operator((!()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WRITABLE)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(not opened for writing)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_RBUF)operator(\)) operator(&&) operator(!)ident(feof)operator(()ident(fptr)operator(->)ident(f)operator(\)) operator(&&) operator(!)ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(io_seek)operator(()ident(fptr)operator(,) integer(0)operator(,) ident(SEEK_CUR)operator(\);) + operator(}) + reserved(if) operator((!)ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(fptr)operator(->)ident(mode) operator(&=) operator(~)ident(FMODE_RBUF)operator(;) + operator(}) +operator(}) + +pre_type(int) +ident(rb_read_pending)operator(()ident(fp)operator(\)) + ident(FILE) operator(*)ident(fp)operator(;) +operator({) + reserved(return) ident(READ_DATA_PENDING)operator(()ident(fp)operator(\);) +operator(}) + +directive(void) +ident(rb_read_check)operator(()ident(fp)operator(\)) + ident(FILE) operator(*)ident(fp)operator(;) +operator({) + reserved(if) operator((!)ident(READ_DATA_PENDING)operator(()ident(fp)operator(\)\)) operator({) + ident(rb_thread_wait_fd)operator(()ident(fileno)operator(()ident(fp)operator(\)\);) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(ruby_dup)operator(()ident(orig)operator(\)) + pre_type(int) ident(orig)operator(;) +operator({) + pre_type(int) ident(fd)operator(;) + + ident(fd) operator(=) ident(dup)operator(()ident(orig)operator(\);) + reserved(if) operator(()ident(fd) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(errno) operator(==) ident(EMFILE) operator(||) ident(errno) operator(==) ident(ENFILE) operator(||) ident(errno) operator(==) ident(ENOMEM)operator(\)) operator({) + ident(rb_gc)operator((\);) + ident(fd) operator(=) ident(dup)operator(()ident(orig)operator(\);) + operator(}) + reserved(if) operator(()ident(fd) operator(<) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + operator(}) + reserved(return) ident(fd)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(io_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(io_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(io)operator(,) reserved(struct) ident(RFile)operator(\);) + ident(OBJSETUP)operator(()ident(io)operator(,) ident(klass)operator(,) ident(T_FILE)operator(\);) + + ident(io)operator(->)ident(fptr) operator(=) integer(0)operator(;) + + reserved(return) operator(()ident(VALUE)operator(\))ident(io)operator(;) +operator(}) + +directive(static) directive(void) +ident(io_fflush)operator(()ident(f)operator(,) ident(fptr)operator(\)) + ident(FILE) operator(*)ident(f)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + pre_type(int) ident(n)operator(;) + + reserved(if) operator((!)ident(rb_thread_fd_writable)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) operator({) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + operator(}) + reserved(for) operator((;;\)) operator({) + ident(TRAP_BEG)operator(;) + ident(n) operator(=) ident(fflush)operator(()ident(f)operator(\);) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(n) operator(!=) pre_constant(EOF)operator(\)) reserved(break)operator(;) + reserved(if) operator((!)ident(rb_io_wait_writable)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + ident(fptr)operator(->)ident(mode) operator(&=) operator(~)ident(FMODE_WBUF)operator(;) +operator(}) + +pre_type(int) +ident(rb_io_wait_readable)operator(()ident(f)operator(\)) + pre_type(int) ident(f)operator(;) +operator({) + ident(fd_set) ident(rfds)operator(;) + + reserved(switch) operator(()ident(errno)operator(\)) operator({) + reserved(case) label(EINTR)operator(:) +preprocessor(#if) ident(defined)operator(()ident(ERESTART)operator(\)) + reserved(case) label(ERESTART)operator(:) +preprocessor(#endif) + ident(rb_thread_wait_fd)operator(()ident(f)operator(\);) + reserved(return) ident(Qtrue)operator(;) + + reserved(case) label(EAGAIN)operator(:) +preprocessor(#if) ident(defined)operator(()ident(EWOULDBLOCK)operator(\)) operator(&&) ident(EWOULDBLOCK) operator(!=) ident(EAGAIN) + reserved(case) label(EWOULDBLOCK)operator(:) +preprocessor(#endif) + ident(FD_ZERO)operator((&)ident(rfds)operator(\);) + ident(FD_SET)operator(()ident(f)operator(,) operator(&)ident(rfds)operator(\);) + ident(rb_thread_select)operator(()ident(f) operator(+) integer(1)operator(,) operator(&)ident(rfds)operator(,) pre_constant(NULL)operator(,) pre_constant(NULL)operator(,) pre_constant(NULL)operator(\);) + reserved(return) ident(Qtrue)operator(;) + + reserved(default)operator(:) + reserved(return) ident(Qfalse)operator(;) + operator(}) +operator(}) + +pre_type(int) +ident(rb_io_wait_writable)operator(()ident(f)operator(\)) + pre_type(int) ident(f)operator(;) +operator({) + ident(fd_set) ident(wfds)operator(;) + + reserved(switch) operator(()ident(errno)operator(\)) operator({) + reserved(case) label(EINTR)operator(:) +preprocessor(#if) ident(defined)operator(()ident(ERESTART)operator(\)) + reserved(case) label(ERESTART)operator(:) +preprocessor(#endif) + ident(rb_thread_fd_writable)operator(()ident(f)operator(\);) + reserved(return) ident(Qtrue)operator(;) + + reserved(case) label(EAGAIN)operator(:) +preprocessor(#if) ident(defined)operator(()ident(EWOULDBLOCK)operator(\)) operator(&&) ident(EWOULDBLOCK) operator(!=) ident(EAGAIN) + reserved(case) label(EWOULDBLOCK)operator(:) +preprocessor(#endif) + ident(FD_ZERO)operator((&)ident(wfds)operator(\);) + ident(FD_SET)operator(()ident(f)operator(,) operator(&)ident(wfds)operator(\);) + ident(rb_thread_select)operator(()ident(f) operator(+) integer(1)operator(,) pre_constant(NULL)operator(,) operator(&)ident(wfds)operator(,) pre_constant(NULL)operator(,) pre_constant(NULL)operator(\);) + reserved(return) ident(Qtrue)operator(;) + + reserved(default)operator(:) + reserved(return) ident(Qfalse)operator(;) + operator(}) +operator(}) + +preprocessor(#ifndef) ident(S_ISREG) +preprocessor(# define) ident(S_ISREG)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFREG)operator(\)) +preprocessor(#endif) + +directive(static) pre_type(int) +ident(wsplit_p)operator(()ident(OpenFile) operator(*)ident(fptr)operator(\)) +operator({) + ident(FILE) operator(*)ident(f) operator(=) ident(GetWriteFile)operator(()ident(fptr)operator(\);) + pre_type(int) ident(r)operator(;) + reserved(if) operator((!()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WSPLIT_INITIALIZED)operator(\)\)) operator({) + reserved(struct) ident(stat) ident(buf)operator(;) + reserved(if) operator(()ident(fstat)operator(()ident(fileno)operator(()ident(f)operator(\),) operator(&)ident(buf)operator(\)) operator(==) integer(0) operator(&&) + operator(!)ident(S_ISREG)operator(()ident(buf)operator(.)ident(st_mode)operator(\)) +preprocessor(#if) ident(defined)operator(()ident(HAVE_FCNTL)operator(\)) operator(&&) ident(defined)operator(()ident(F_GETFL)operator(\)) operator(&&) ident(defined)operator(()ident(O_NONBLOCK)operator(\)) + operator(&&) operator(()ident(r) operator(=) ident(fcntl)operator(()ident(fileno)operator(()ident(f)operator(\),) ident(F_GETFL)operator(\)\)) operator(!=) operator(-)integer(1) operator(&&) + operator(!()ident(r) operator(&) ident(O_NONBLOCK)operator(\)) +preprocessor(#endif) + operator(\)) operator({) + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_WSPLIT)operator(;) + operator(}) + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_WSPLIT_INITIALIZED)operator(;) + operator(}) + reserved(return) ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WSPLIT)operator(;) +operator(}) + +comment(/* writing functions */) +directive(static) pre_type(long) +ident(io_fwrite)operator(()ident(str)operator(,) ident(fptr)operator(\)) + ident(VALUE) ident(str)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + pre_type(long) ident(len)operator(,) ident(n)operator(,) ident(r)operator(,) ident(l)operator(,) ident(offset) operator(=) integer(0)operator(;) + ident(FILE) operator(*)ident(f) operator(=) ident(GetWriteFile)operator(()ident(fptr)operator(\);) + + ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator((()ident(n) operator(=) ident(len)operator(\)) operator(<=) integer(0)operator(\)) reserved(return) ident(n)operator(;) + reserved(if) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_SYNC)operator(\)) operator({) + ident(io_fflush)operator(()ident(f)operator(,) ident(fptr)operator(\);) + reserved(if) operator((!)ident(rb_thread_fd_writable)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) operator({) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + operator(}) + label(retry)operator(:) + ident(l) operator(=) ident(n)operator(;) + reserved(if) operator(()ident(PIPE_BUF) operator(<) ident(l) operator(&&) + operator(!)ident(rb_thread_critical) operator(&&) + operator(!)ident(rb_thread_alone)operator((\)) operator(&&) + ident(wsplit_p)operator(()ident(fptr)operator(\)\)) operator({) + ident(l) operator(=) ident(PIPE_BUF)operator(;) + operator(}) + ident(TRAP_BEG)operator(;) + ident(r) operator(=) ident(write)operator(()ident(fileno)operator(()ident(f)operator(\),) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(+)ident(offset)operator(,) ident(l)operator(\);) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(r) operator(==) ident(n)operator(\)) reserved(return) ident(len)operator(;) + reserved(if) operator(()integer(0) operator(<=) ident(r)operator(\)) operator({) + ident(offset) operator(+=) ident(r)operator(;) + ident(n) operator(-=) ident(r)operator(;) + ident(errno) operator(=) ident(EAGAIN)operator(;) + operator(}) + reserved(if) operator(()ident(rb_io_wait_writable)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) operator({) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + reserved(if) operator(()ident(offset) operator(<) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) + reserved(goto) ident(retry)operator(;) + operator(}) + reserved(return) operator(-)integer(1L)operator(;) + operator(}) +preprocessor(#if) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__vms)operator(\)) + reserved(do) operator({) + reserved(if) operator(()ident(fputc)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(offset)operator(++],) ident(f)operator(\)) operator(==) pre_constant(EOF)operator(\)) operator({) + reserved(if) operator(()ident(ferror)operator(()ident(f)operator(\)\)) reserved(return) operator(-)integer(1L)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) reserved(while) operator((--)ident(n) operator(>) integer(0)operator(\);) +preprocessor(#else) + reserved(while) operator(()ident(errno) operator(=) integer(0)operator(,) ident(offset) operator(+=) operator(()ident(r) operator(=) ident(fwrite)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(+)ident(offset)operator(,) integer(1)operator(,) ident(n)operator(,) ident(f)operator(\)\),) operator(()ident(n) operator(-=) ident(r)operator(\)) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(ferror)operator(()ident(f)operator(\)) +preprocessor(#if) ident(defined) ident(__BORLANDC__) + operator(||) ident(errno) +preprocessor(#endif) + operator(\)) operator({) +preprocessor(#ifdef) ident(__hpux) + reserved(if) operator((!)ident(errno)operator(\)) ident(errno) operator(=) ident(EAGAIN)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(_WIN32)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__BORLANDC__)operator(\)) + comment(/* workaround for MSVCRT's bug */) + reserved(if) operator((!)ident(errno)operator(\)) operator({) + reserved(if) operator(()ident(GetLastError)operator((\)) operator(==) ident(ERROR_NO_DATA)operator(\)) + ident(errno) operator(=) ident(EPIPE)operator(;) + reserved(else) + ident(errno) operator(=) ident(EBADF)operator(;) + operator(}) +preprocessor(#endif) + reserved(if) operator(()ident(rb_io_wait_writable)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) operator({) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + ident(clearerr)operator(()ident(f)operator(\);) + reserved(if) operator(()ident(offset) operator(<) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) + reserved(continue)operator(;) + operator(}) + reserved(return) operator(-)integer(1L)operator(;) + operator(}) + operator(}) +preprocessor(#endif) + reserved(return) ident(len) operator(-) ident(n)operator(;) +operator(}) + +pre_type(long) +ident(rb_io_fwrite)operator(()ident(ptr)operator(,) ident(len)operator(,) ident(f)operator(\)) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) + ident(FILE) operator(*)ident(f)operator(;) +operator({) + ident(OpenFile) ident(of)operator(;) + + ident(of)operator(.)ident(f) operator(=) ident(f)operator(;) + ident(of)operator(.)ident(f2) operator(=) pre_constant(NULL)operator(;) + ident(of)operator(.)ident(mode) operator(=) ident(FMODE_WRITABLE)operator(;) + ident(of)operator(.)ident(path) operator(=) pre_constant(NULL)operator(;) + reserved(return) ident(io_fwrite)operator(()ident(rb_str_new)operator(()ident(ptr)operator(,) ident(len)operator(\),) operator(&)ident(of)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.write(string\) => integer + * + * Writes the given string to <em>ios</em>. The stream must be opened + * for writing. If the argument is not a string, it will be converted + * to a string using <code>to_s</code>. Returns the number of bytes + * written. + * + * count = $stdout.write( "This is a test\\n" \) + * puts "That was #{count} bytes of data" + * + * <em>produces:</em> + * + * This is a test + * That was 15 bytes of data + */) + +directive(static) ident(VALUE) +ident(io_write)operator(()ident(io)operator(,) ident(str)operator(\)) + ident(VALUE) ident(io)operator(,) ident(str)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(long) ident(n)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(str)operator(\)) operator(!=) ident(T_STRING)operator(\)) + ident(str) operator(=) ident(rb_obj_as_string)operator(()ident(str)operator(\);) + + reserved(if) operator(()ident(TYPE)operator(()ident(io)operator(\)) operator(!=) ident(T_FILE)operator(\)) operator({) + comment(/* port is not IO, call write method for it. */) + reserved(return) ident(rb_funcall)operator(()ident(io)operator(,) ident(id_write)operator(,) integer(1)operator(,) ident(str)operator(\);) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_writable)operator(()ident(fptr)operator(\);) + + ident(n) operator(=) ident(io_fwrite)operator(()ident(str)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(n) operator(==) operator(-)integer(1L)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(if) operator((!()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_SYNC)operator(\)\)) operator({) + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_WBUF)operator(;) + operator(}) + + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_io_write)operator(()ident(io)operator(,) ident(str)operator(\)) + ident(VALUE) ident(io)operator(,) ident(str)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(io)operator(,) ident(id_write)operator(,) integer(1)operator(,) ident(str)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios << obj => ios + * + * String Output---Writes <i>obj</i> to <em>ios</em>. + * <i>obj</i> will be converted to a string using + * <code>to_s</code>. + * + * $stdout << "Hello " << "world!\\n" + * + * <em>produces:</em> + * + * Hello world! + */) + +ident(VALUE) +ident(rb_io_addstr)operator(()ident(io)operator(,) ident(str)operator(\)) + ident(VALUE) ident(io)operator(,) ident(str)operator(;) +operator({) + ident(rb_io_write)operator(()ident(io)operator(,) ident(str)operator(\);) + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.flush => ios + * + * Flushes any buffered data within <em>ios</em> to the underlying + * operating system (note that this is Ruby internal buffering only; + * the OS may buffer the data as well\). + * + * $stdout.print "no newline" + * $stdout.flush + * + * <em>produces:</em> + * + * no newline + */) + +directive(static) ident(VALUE) +ident(rb_io_flush)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(FILE) operator(*)ident(f)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_writable)operator(()ident(fptr)operator(\);) + ident(f) operator(=) ident(GetWriteFile)operator(()ident(fptr)operator(\);) + + ident(io_fflush)operator(()ident(f)operator(,) ident(fptr)operator(\);) + + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.pos => integer + * ios.tell => integer + * + * Returns the current offset (in bytes\) of <em>ios</em>. + * + * f = File.new("testfile"\) + * f.pos #=> 0 + * f.gets #=> "This is line one\\n" + * f.pos #=> 17 + */) + +directive(static) ident(VALUE) +ident(rb_io_tell)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(off_t) ident(pos)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(pos) operator(=) ident(io_tell)operator(()ident(fptr)operator(\);) + reserved(if) operator(()ident(pos) operator(<) integer(0) operator(&&) ident(errno)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(return) ident(OFFT2NUM)operator(()ident(pos)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_io_seek)operator(()ident(io)operator(,) ident(offset)operator(,) ident(whence)operator(\)) + ident(VALUE) ident(io)operator(,) ident(offset)operator(;) + pre_type(int) ident(whence)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(off_t) ident(pos)operator(;) + + ident(pos) operator(=) ident(NUM2OFFT)operator(()ident(offset)operator(\);) + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(pos) operator(=) ident(io_seek)operator(()ident(fptr)operator(,) ident(pos)operator(,) ident(whence)operator(\);) + reserved(if) operator(()ident(pos) operator(<) integer(0) operator(&&) ident(errno)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.seek(amount, whence=SEEK_SET\) -> 0 + * + * Seeks to a given offset <i>anInteger</i> in the stream according to + * the value of <i>whence</i>: + * + * IO::SEEK_CUR | Seeks to _amount_ plus current position + * --------------+---------------------------------------------------- + * IO::SEEK_END | Seeks to _amount_ plus end of stream (you probably + * | want a negative value for _amount_\) + * --------------+---------------------------------------------------- + * IO::SEEK_SET | Seeks to the absolute location given by _amount_ + * + * Example: + * + * f = File.new("testfile"\) + * f.seek(-13, IO::SEEK_END\) #=> 0 + * f.readline #=> "And so on...\\n" + */) + +directive(static) ident(VALUE) +ident(rb_io_seek_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(offset)operator(,) ident(ptrname)operator(;) + pre_type(int) ident(whence) operator(=) ident(SEEK_SET)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(offset)operator(,) operator(&)ident(ptrname)operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(whence) operator(=) ident(NUM2INT)operator(()ident(ptrname)operator(\);) + operator(}) + + reserved(return) ident(rb_io_seek)operator(()ident(io)operator(,) ident(offset)operator(,) ident(whence)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.pos = integer => integer + * + * Seeks to the given position (in bytes\) in <em>ios</em>. + * + * f = File.new("testfile"\) + * f.pos = 17 + * f.gets #=> "This is line two\\n" + */) + +directive(static) ident(VALUE) +ident(rb_io_set_pos)operator(()ident(io)operator(,) ident(offset)operator(\)) + ident(VALUE) ident(io)operator(,) ident(offset)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(off_t) ident(pos)operator(;) + + ident(pos) operator(=) ident(NUM2OFFT)operator(()ident(offset)operator(\);) + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(pos) operator(=) ident(io_seek)operator(()ident(fptr)operator(,) ident(pos)operator(,) ident(SEEK_SET)operator(\);) + reserved(if) operator(()ident(pos) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + + reserved(return) ident(OFFT2NUM)operator(()ident(pos)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.rewind => 0 + * + * Positions <em>ios</em> to the beginning of input, resetting + * <code>lineno</code> to zero. + * + * f = File.new("testfile"\) + * f.readline #=> "This is line one\\n" + * f.rewind #=> 0 + * f.lineno #=> 0 + * f.readline #=> "This is line one\\n" + */) + +directive(static) ident(VALUE) +ident(rb_io_rewind)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(io_seek)operator(()ident(fptr)operator(,) integer(0L)operator(,) integer(0)operator(\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + reserved(if) operator(()ident(io) operator(==) ident(current_file)operator(\)) operator({) + ident(gets_lineno) operator(-=) ident(fptr)operator(->)ident(lineno)operator(;) + operator(}) + ident(fptr)operator(->)ident(lineno) operator(=) integer(0)operator(;) + + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.eof => true or false + * ios.eof? => true or false + * + * Returns true if <em>ios</em> is at end of file that means + * there are no more data to read. + * The stream must be opened for reading or an <code>IOError</code> will be + * raised. + * + * f = File.new("testfile"\) + * dummy = f.readlines + * f.eof #=> true + * + * If <em>ios</em> is a stream such as pipe or socket, <code>IO#eof?</code> + * blocks until the other end sends some data or closes it. + * + * r, w = IO.pipe + * Thread.new { sleep 1; w.close } + * r.eof? #=> true after 1 second blocking + * + * r, w = IO.pipe + * Thread.new { sleep 1; w.puts "a" } + * r.eof? #=> false after 1 second blocking + * + * r, w = IO.pipe + * r.eof? # blocks forever + * + * Note that <code>IO#eof?</code> reads data to a input buffer. + * So <code>IO#sysread</code> doesn't work with <code>IO#eof?</code>. + */) + +ident(VALUE) +ident(rb_io_eof)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(ch)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + + reserved(if) operator(()ident(feof)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(READ_DATA_PENDING)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + ident(READ_CHECK)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(TRAP_BEG)operator(;) + ident(ch) operator(=) ident(getc)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(TRAP_END)operator(;) + + reserved(if) operator(()ident(ch) operator(!=) pre_constant(EOF)operator(\)) operator({) + ident(ungetc)operator(()ident(ch)operator(,) ident(fptr)operator(->)ident(f)operator(\);) + reserved(return) ident(Qfalse)operator(;) + operator(}) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.sync => true or false + * + * Returns the current ``sync mode'' of <em>ios</em>. When sync mode is + * true, all output is immediately flushed to the underlying operating + * system and is not buffered by Ruby internally. See also + * <code>IO#fsync</code>. + * + * f = File.new("testfile"\) + * f.sync #=> false + */) + +directive(static) ident(VALUE) +ident(rb_io_sync)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(return) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_SYNC)operator(\)) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.sync = boolean => boolean + * + * Sets the ``sync mode'' to <code>true</code> or <code>false</code>. + * When sync mode is true, all output is immediately flushed to the + * underlying operating system and is not buffered internally. Returns + * the new state. See also <code>IO#fsync</code>. + * + * f = File.new("testfile"\) + * f.sync = true + * + * <em>(produces no output\)</em> + */) + +directive(static) ident(VALUE) +ident(rb_io_set_sync)operator(()ident(io)operator(,) ident(mode)operator(\)) + ident(VALUE) ident(io)operator(,) ident(mode)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(mode)operator(\)\)) operator({) + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_SYNC)operator(;) + operator(}) + reserved(else) operator({) + ident(fptr)operator(->)ident(mode) operator(&=) operator(~)ident(FMODE_SYNC)operator(;) + operator(}) + reserved(return) ident(mode)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.fsync => 0 or nil + * + * Immediately writes all buffered data in <em>ios</em> to disk. + * Returns <code>nil</code> if the underlying operating system does not + * support <em>fsync(2\)</em>. Note that <code>fsync</code> differs from + * using <code>IO#sync=</code>. The latter ensures that data is flushed + * from Ruby's buffers, but doesn't not guarantee that the underlying + * operating system actually writes it to disk. + */) + +directive(static) ident(VALUE) +ident(rb_io_fsync)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_FSYNC) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(FILE) operator(*)ident(f)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(f) operator(=) ident(GetWriteFile)operator(()ident(fptr)operator(\);) + + ident(io_fflush)operator(()ident(f)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(fsync)operator(()ident(fileno)operator(()ident(f)operator(\)\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * ios.fileno => fixnum + * ios.to_i => fixnum + * + * Returns an integer representing the numeric file descriptor for + * <em>ios</em>. + * + * $stdin.fileno #=> 0 + * $stdout.fileno #=> 1 + */) + +directive(static) ident(VALUE) +ident(rb_io_fileno)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(fd)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(fd) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(fd)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.pid => fixnum + * + * Returns the process ID of a child process associated with + * <em>ios</em>. This will be set by <code>IO::popen</code>. + * + * pipe = IO.popen("-"\) + * if pipe + * $stderr.puts "In parent, child pid is #{pipe.pid}" + * else + * $stderr.puts "In child, pid is #{$$}" + * end + * + * <em>produces:</em> + * + * In child, pid is 26209 + * In parent, child pid is 26209 + */) + +directive(static) ident(VALUE) +ident(rb_io_pid)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(if) operator((!)ident(fptr)operator(->)ident(pid)operator(\)) + reserved(return) ident(Qnil)operator(;) + reserved(return) ident(INT2FIX)operator(()ident(fptr)operator(->)ident(pid)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.inspect => string + * + * Return a string describing this IO object. + */) + +directive(static) ident(VALUE) +ident(rb_io_inspect)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(char) operator(*)ident(buf)operator(,) operator(*)ident(cname)operator(,) operator(*)ident(st) operator(=) string<delimiter(")delimiter(")>operator(;) + pre_type(long) ident(len)operator(;) + + ident(fptr) operator(=) ident(RFILE)operator(()ident(rb_io_taint_check)operator(()ident(obj)operator(\)\)->)ident(fptr)operator(;) + reserved(if) operator((!)ident(fptr) operator(||) operator(!)ident(fptr)operator(->)ident(path)operator(\)) reserved(return) ident(rb_any_to_s)operator(()ident(obj)operator(\);) + ident(cname) operator(=) ident(rb_obj_classname)operator(()ident(obj)operator(\);) + ident(len) operator(=) ident(strlen)operator(()ident(cname)operator(\)) operator(+) ident(strlen)operator(()ident(fptr)operator(->)ident(path)operator(\)) operator(+) integer(5)operator(;) + reserved(if) operator((!()ident(fptr)operator(->)ident(f) operator(||) ident(fptr)operator(->)ident(f2)operator(\)\)) operator({) + ident(st) operator(=) string<delimiter(")content( (closed\))delimiter(")>operator(;) + ident(len) operator(+=) integer(9)operator(;) + operator(}) + ident(buf) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(len)operator(\);) + ident(snprintf)operator(()ident(buf)operator(,) ident(len)operator(,) string<delimiter(")content(#<%s:%s%s>)delimiter(")>operator(,) ident(cname)operator(,) ident(fptr)operator(->)ident(path)operator(,) ident(st)operator(\);) + reserved(return) ident(rb_str_new2)operator(()ident(buf)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.to_io -> ios + * + * Returns <em>ios</em>. + */) + +directive(static) ident(VALUE) +ident(rb_io_to_io)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* reading functions */) +directive(static) pre_type(long) +ident(read_buffered_data)operator(()ident(ptr)operator(,) ident(len)operator(,) ident(f)operator(\)) + pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) + ident(FILE) operator(*)ident(f)operator(;) +operator({) + pre_type(long) ident(n)operator(;) + +preprocessor(#ifdef) ident(READ_DATA_PENDING_COUNT) + ident(n) operator(=) ident(READ_DATA_PENDING_COUNT)operator(()ident(f)operator(\);) + reserved(if) operator(()ident(n) operator(<=) integer(0)operator(\)) reserved(return) integer(0)operator(;) + reserved(if) operator(()ident(n) operator(>) ident(len)operator(\)) ident(n) operator(=) ident(len)operator(;) + reserved(return) ident(fread)operator(()ident(ptr)operator(,) integer(1)operator(,) ident(n)operator(,) ident(f)operator(\);) +preprocessor(#else) + pre_type(int) ident(c)operator(;) + + reserved(for) operator(()ident(n) operator(=) integer(0)operator(;) ident(n) operator(<) ident(len) operator(&&) ident(READ_DATA_PENDING)operator(()ident(f)operator(\)) operator(&&) operator(()ident(c) operator(=) ident(getc)operator(()ident(f)operator(\)\)) operator(!=) pre_constant(EOF)operator(;) operator(++)ident(n)operator(\)) operator({) + operator(*)ident(ptr)operator(++) operator(=) ident(c)operator(;) + operator(}) + reserved(return) ident(n)operator(;) +preprocessor(#endif) +operator(}) + +directive(static) pre_type(long) +ident(io_fread)operator(()ident(ptr)operator(,) ident(len)operator(,) ident(fptr)operator(\)) + pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + pre_type(long) ident(n) operator(=) ident(len)operator(;) + pre_type(int) ident(c)operator(;) + pre_type(int) ident(saved_errno)operator(;) + + reserved(while) operator(()ident(n) operator(>) integer(0)operator(\)) operator({) + ident(c) operator(=) ident(read_buffered_data)operator(()ident(ptr)operator(,) ident(n)operator(,) ident(fptr)operator(->)ident(f)operator(\);) + reserved(if) operator(()ident(c) operator(<) integer(0)operator(\)) reserved(goto) ident(eof)operator(;) + reserved(if) operator(()ident(c) operator(>) integer(0)operator(\)) operator({) + ident(ptr) operator(+=) ident(c)operator(;) + reserved(if) operator((()ident(n) operator(-=) ident(c)operator(\)) operator(<=) integer(0)operator(\)) reserved(break)operator(;) + operator(}) + ident(rb_thread_wait_fd)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)\);) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(TRAP_BEG)operator(;) + ident(c) operator(=) ident(getc)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(c) operator(==) pre_constant(EOF)operator(\)) operator({) + label(eof)operator(:) + reserved(if) operator(()ident(ferror)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) operator({) + reserved(switch) operator(()ident(errno)operator(\)) operator({) + reserved(case) label(EINTR)operator(:) +preprocessor(#if) ident(defined)operator(()ident(ERESTART)operator(\)) + reserved(case) label(ERESTART)operator(:) +preprocessor(#endif) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + reserved(continue)operator(;) + reserved(case) label(EAGAIN)operator(:) +preprocessor(#if) ident(defined)operator(()ident(EWOULDBLOCK)operator(\)) operator(&&) ident(EWOULDBLOCK) operator(!=) ident(EAGAIN) + reserved(case) label(EWOULDBLOCK)operator(:) +preprocessor(#endif) + reserved(if) operator(()ident(len) operator(>) ident(n)operator(\)) operator({) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + operator(}) + ident(saved_errno) operator(=) ident(errno)operator(;) + ident(rb_warning)operator(()string<delimiter(")content(nonblocking IO#read is obsolete; use IO#readpartial or IO#sysread)delimiter(")>operator(\);) + ident(errno) operator(=) ident(saved_errno)operator(;) + operator(}) + reserved(if) operator(()ident(len) operator(==) ident(n)operator(\)) reserved(return) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + operator(*)ident(ptr)operator(++) operator(=) ident(c)operator(;) + ident(n)operator(--;) + operator(}) + reserved(return) ident(len) operator(-) ident(n)operator(;) +operator(}) + +pre_type(long) +ident(rb_io_fread)operator(()ident(ptr)operator(,) ident(len)operator(,) ident(f)operator(\)) + pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) + ident(FILE) operator(*)ident(f)operator(;) +operator({) + ident(OpenFile) ident(of)operator(;) + + ident(of)operator(.)ident(f) operator(=) ident(f)operator(;) + ident(of)operator(.)ident(f2) operator(=) pre_constant(NULL)operator(;) + reserved(return) ident(io_fread)operator(()ident(ptr)operator(,) ident(len)operator(,) operator(&)ident(of)operator(\);) +operator(}) + +preprocessor(#define) ident(SMALLBUF) integer(100) + +directive(static) pre_type(long) +ident(remain_size)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + reserved(struct) ident(stat) ident(st)operator(;) + ident(off_t) ident(siz) operator(=) ident(BUFSIZ)operator(;) + ident(off_t) ident(pos)operator(;) + + reserved(if) operator(()ident(feof)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) reserved(return) integer(0)operator(;) + reserved(if) operator(()ident(fstat)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) operator(&)ident(st)operator(\)) operator(==) integer(0) operator(&&) ident(S_ISREG)operator(()ident(st)operator(.)ident(st_mode)operator(\)) +preprocessor(#ifdef) ident(__BEOS__) + operator(&&) operator(()ident(st)operator(.)ident(st_dev) operator(>) integer(3)operator(\)) +preprocessor(#endif) + operator(\)) + operator({) + ident(pos) operator(=) ident(io_tell)operator(()ident(fptr)operator(\);) + reserved(if) operator(()ident(st)operator(.)ident(st_size) operator(>=) ident(pos) operator(&&) ident(pos) operator(>=) integer(0)operator(\)) operator({) + ident(siz) operator(=) ident(st)operator(.)ident(st_size) operator(-) ident(pos) operator(+) integer(1)operator(;) + reserved(if) operator(()ident(siz) operator(>) ident(LONG_MAX)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(file too big for single read)delimiter(")>operator(\);) + operator(}) + operator(}) + operator(}) + reserved(return) operator(()pre_type(long)operator(\))ident(siz)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(read_all)operator(()ident(fptr)operator(,) ident(siz)operator(,) ident(str)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(long) ident(siz)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(long) ident(bytes) operator(=) integer(0)operator(;) + pre_type(long) ident(n)operator(;) + + reserved(if) operator(()ident(siz) operator(==) integer(0)operator(\)) ident(siz) operator(=) ident(BUFSIZ)operator(;) + reserved(if) operator(()ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(siz)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(siz)operator(\);) + operator(}) + reserved(for) operator((;;\)) operator({) + ident(rb_str_locktmp)operator(()ident(str)operator(\);) + ident(READ_CHECK)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(n) operator(=) ident(io_fread)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(+)ident(bytes)operator(,) ident(siz)operator(-)ident(bytes)operator(,) ident(fptr)operator(\);) + ident(rb_str_unlocktmp)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(n) operator(==) integer(0) operator(&&) ident(bytes) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator((!)ident(fptr)operator(->)ident(f)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(feof)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) reserved(break)operator(;) + reserved(if) operator((!)ident(ferror)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) reserved(break)operator(;) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + ident(bytes) operator(+=) ident(n)operator(;) + reserved(if) operator(()ident(bytes) operator(<) ident(siz)operator(\)) reserved(break)operator(;) + ident(siz) operator(+=) ident(BUFSIZ)operator(;) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(siz)operator(\);) + operator(}) + reserved(if) operator(()ident(bytes) operator(!=) ident(siz)operator(\)) ident(rb_str_resize)operator(()ident(str)operator(,) ident(bytes)operator(\);) + ident(OBJ_TAINT)operator(()ident(str)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +directive(void) ident(rb_io_set_nonblock)operator(()ident(OpenFile) operator(*)ident(fptr)operator(\)) +operator({) + pre_type(int) ident(flags)operator(;) +preprocessor(#ifdef) ident(F_GETFL) + ident(flags) operator(=) ident(fcntl)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(F_GETFL)operator(\);) + reserved(if) operator(()ident(flags) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) +preprocessor(#else) + ident(flags) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(if) operator((()ident(flags) operator(&) ident(O_NONBLOCK)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(flags) operator(|=) ident(O_NONBLOCK)operator(;) + reserved(if) operator(()ident(fcntl)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(F_SETFL)operator(,) ident(flags)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator({) +preprocessor(#ifdef) ident(F_GETFL) + ident(flags) operator(=) ident(fcntl)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\),) ident(F_GETFL)operator(\);) + reserved(if) operator(()ident(flags) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) +preprocessor(#else) + ident(flags) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(if) operator((()ident(flags) operator(&) ident(O_NONBLOCK)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(flags) operator(|=) ident(O_NONBLOCK)operator(;) + reserved(if) operator(()ident(fcntl)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\),) ident(F_SETFL)operator(,) ident(flags)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + operator(}) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(io_getpartial)operator(()pre_type(int) ident(argc)operator(,) ident(VALUE) operator(*)ident(argv)operator(,) ident(VALUE) ident(io)operator(,) pre_type(int) ident(nonblock)operator(\)) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(VALUE) ident(length)operator(,) ident(str)operator(;) + pre_type(long) ident(n)operator(,) ident(len)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(length)operator(,) operator(&)ident(str)operator(\);) + + reserved(if) operator((()ident(len) operator(=) ident(NUM2LONG)operator(()ident(length)operator(\)\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative length %ld given)delimiter(")>operator(,) ident(len)operator(\);) + operator(}) + + reserved(if) operator(()ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) + operator(}) + reserved(else) operator({) + ident(StringValue)operator(()ident(str)operator(\);) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(len)operator(\);) + operator(}) + ident(OBJ_TAINT)operator(()ident(str)operator(\);) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) + reserved(return) ident(str)operator(;) + + reserved(if) operator((!)ident(nonblock)operator(\)) operator({) + ident(READ_CHECK)operator(()ident(fptr)operator(->)ident(f)operator(\);) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(!=) ident(len)operator(\)) operator({) + label(modified)operator(:) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(buffer string modified)delimiter(")>operator(\);) + operator(}) + ident(n) operator(=) ident(read_buffered_data)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(,) ident(fptr)operator(->)ident(f)operator(\);) + reserved(if) operator(()ident(n) operator(<=) integer(0)operator(\)) operator({) + label(again)operator(:) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(!=) ident(len)operator(\)) reserved(goto) ident(modified)operator(;) + reserved(if) operator(()ident(nonblock)operator(\)) operator({) + ident(rb_io_set_nonblock)operator(()ident(fptr)operator(\);) + ident(n) operator(=) ident(read)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(\);) + operator(}) + reserved(else) operator({) + ident(TRAP_BEG)operator(;) + ident(n) operator(=) ident(read)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(\);) + ident(TRAP_END)operator(;) + operator(}) + reserved(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator((!)ident(nonblock) operator(&&) ident(rb_io_wait_readable)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)\)\)) + reserved(goto) ident(again)operator(;) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + reserved(if) operator(()ident(fptr)operator(->)ident(f)operator(\)) comment(/* update pos in FILE structure [ruby-core:21561] */) + ident(fflush)operator(()ident(fptr)operator(->)ident(f)operator(\);) + operator(}) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(n)operator(\);) + + reserved(if) operator(()ident(n) operator(==) integer(0)operator(\)) + reserved(return) ident(Qnil)operator(;) + reserved(else) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.readpartial(maxlen\) => string + * ios.readpartial(maxlen, outbuf\) => outbuf + * + * Reads at most <i>maxlen</i> bytes from the I/O stream. + * It blocks only if <em>ios</em> has no data immediately available. + * It doesn't block if some data available. + * If the optional <i>outbuf</i> argument is present, + * it must reference a String, which will receive the data. + * It raises <code>EOFError</code> on end of file. + * + * readpartial is designed for streams such as pipe, socket, tty, etc. + * It blocks only when no data immediately available. + * This means that it blocks only when following all conditions hold. + * * the buffer in the IO object is empty. + * * the content of the stream is empty. + * * the stream is not reached to EOF. + * + * When readpartial blocks, it waits data or EOF on the stream. + * If some data is reached, readpartial returns with the data. + * If EOF is reached, readpartial raises EOFError. + * + * When readpartial doesn't blocks, it returns or raises immediately. + * If the buffer is not empty, it returns the data in the buffer. + * Otherwise if the stream has some content, + * it returns the data in the stream. + * Otherwise if the stream is reached to EOF, it raises EOFError. + * + * r, w = IO.pipe # buffer pipe content + * w << "abc" # "" "abc". + * r.readpartial(4096\) #=> "abc" "" "" + * r.readpartial(4096\) # blocks because buffer and pipe is empty. + * + * r, w = IO.pipe # buffer pipe content + * w << "abc" # "" "abc" + * w.close # "" "abc" EOF + * r.readpartial(4096\) #=> "abc" "" EOF + * r.readpartial(4096\) # raises EOFError + * + * r, w = IO.pipe # buffer pipe content + * w << "abc\\ndef\\n" # "" "abc\\ndef\\n" + * r.gets #=> "abc\\n" "def\\n" "" + * w << "ghi\\n" # "def\\n" "ghi\\n" + * r.readpartial(4096\) #=> "def\\n" "" "ghi\\n" + * r.readpartial(4096\) #=> "ghi\\n" "" "" + * + * Note that readpartial behaves similar to sysread. + * The differences are: + * * If the buffer is not empty, read from the buffer instead of "sysread for buffered IO (IOError\)". + * * It doesn't cause Errno::EAGAIN and Errno::EINTR. When readpartial meets EAGAIN and EINTR by read system call, readpartial retry the system call. + * + * The later means that readpartial is nonblocking-flag insensitive. + * It blocks on the situation IO#sysread causes Errno::EAGAIN as if the fd is blocking mode. + * + */) + +directive(static) ident(VALUE) +ident(io_readpartial)operator(()pre_type(int) ident(argc)operator(,) ident(VALUE) operator(*)ident(argv)operator(,) ident(VALUE) ident(io)operator(\)) +operator({) + ident(VALUE) ident(ret)operator(;) + + ident(ret) operator(=) ident(io_getpartial)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(ret)operator(\)\)) + ident(rb_eof_error)operator((\);) + reserved(else) + reserved(return) ident(ret)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.read_nonblock(maxlen\) => string + * ios.read_nonblock(maxlen, outbuf\) => outbuf + * + * Reads at most <i>maxlen</i> bytes from <em>ios</em> using + * read(2\) system call after O_NONBLOCK is set for + * the underlying file descriptor. + * + * If the optional <i>outbuf</i> argument is present, + * it must reference a String, which will receive the data. + * + * read_nonblock just calls read(2\). + * It causes all errors read(2\) causes: EAGAIN, EINTR, etc. + * The caller should care such errors. + * + * read_nonblock causes EOFError on EOF. + * + * If the read buffer is not empty, + * read_nonblock reads from the buffer like readpartial. + * In this case, read(2\) is not called. + * + */) + +directive(static) ident(VALUE) +ident(io_read_nonblock)operator(()pre_type(int) ident(argc)operator(,) ident(VALUE) operator(*)ident(argv)operator(,) ident(VALUE) ident(io)operator(\)) +operator({) + ident(VALUE) ident(ret)operator(;) + + ident(ret) operator(=) ident(io_getpartial)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(,) integer(1)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(ret)operator(\)\)) + ident(rb_eof_error)operator((\);) + reserved(else) + reserved(return) ident(ret)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.write_nonblock(string\) => integer + * + * Writes the given string to <em>ios</em> using + * write(2\) system call after O_NONBLOCK is set for + * the underlying file descriptor. + * + * write_nonblock just calls write(2\). + * It causes all errors write(2\) causes: EAGAIN, EINTR, etc. + * The result may also be smaller than string.length (partial write\). + * The caller should care such errors and partial write. + * + */) + +directive(static) ident(VALUE) +ident(rb_io_write_nonblock)operator(()ident(VALUE) ident(io)operator(,) ident(VALUE) ident(str)operator(\)) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(FILE) operator(*)ident(f)operator(;) + pre_type(long) ident(n)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(str)operator(\)) operator(!=) ident(T_STRING)operator(\)) + ident(str) operator(=) ident(rb_obj_as_string)operator(()ident(str)operator(\);) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_writable)operator(()ident(fptr)operator(\);) + + ident(f) operator(=) ident(GetWriteFile)operator(()ident(fptr)operator(\);) + + ident(rb_io_set_nonblock)operator(()ident(fptr)operator(\);) + ident(n) operator(=) ident(write)operator(()ident(fileno)operator(()ident(f)operator(\),) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + + reserved(if) operator(()ident(n) operator(==) operator(-)integer(1)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.read([length [, buffer]]\) => string, buffer, or nil + * + * Reads at most <i>length</i> bytes from the I/O stream, or to the + * end of file if <i>length</i> is omitted or is <code>nil</code>. + * <i>length</i> must be a non-negative integer or nil. + * If the optional <i>buffer</i> argument is present, it must reference + * a String, which will receive the data. + * + * At end of file, it returns <code>nil</code> or <code>""</code> + * depend on <i>length</i>. + * <code><i>ios</i>.read(\)</code> and + * <code><i>ios</i>.read(nil\)</code> returns <code>""</code>. + * <code><i>ios</i>.read(<i>positive-integer</i>\)</code> returns nil. + * + * f = File.new("testfile"\) + * f.read(16\) #=> "This is line one" + */) + +directive(static) ident(VALUE) +ident(io_read)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(long) ident(n)operator(,) ident(len)operator(;) + ident(VALUE) ident(length)operator(,) ident(str)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(02)delimiter(")>operator(,) operator(&)ident(length)operator(,) operator(&)ident(str)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(length)operator(\)\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)\)) ident(StringValue)operator(()ident(str)operator(\);) + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + reserved(return) ident(read_all)operator(()ident(fptr)operator(,) ident(remain_size)operator(()ident(fptr)operator(\),) ident(str)operator(\);) + operator(}) + ident(len) operator(=) ident(NUM2LONG)operator(()ident(length)operator(\);) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative length %ld given)delimiter(")>operator(,) ident(len)operator(\);) + operator(}) + + reserved(if) operator(()ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(str) operator(=) ident(rb_tainted_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) + operator(}) + reserved(else) operator({) + ident(StringValue)operator(()ident(str)operator(\);) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(rb_str_resize)operator(()ident(str)operator(,)ident(len)operator(\);) + operator(}) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + reserved(if) operator(()ident(feof)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(str)operator(;) + + ident(rb_str_locktmp)operator(()ident(str)operator(\);) + ident(READ_CHECK)operator(()ident(fptr)operator(->)ident(f)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(!=) ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(buffer string modified)delimiter(")>operator(\);) + operator(}) + ident(n) operator(=) ident(io_fread)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(,) ident(fptr)operator(\);) + ident(rb_str_unlocktmp)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(n) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator((!)ident(fptr)operator(->)ident(f)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(feof)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) operator({) + ident(rb_str_resize)operator(()ident(str)operator(,) integer(0)operator(\);) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(if) operator(()ident(len) operator(>) integer(0)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(n)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(n)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(n)operator(]) operator(=) char('\\0')operator(;) + ident(OBJ_TAINT)operator(()ident(str)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(appendline)operator(()ident(fptr)operator(,) ident(delim)operator(,) ident(strp)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(delim)operator(;) + ident(VALUE) operator(*)ident(strp)operator(;) +operator({) + ident(FILE) operator(*)ident(f) operator(=) ident(fptr)operator(->)ident(f)operator(;) + ident(VALUE) ident(str) operator(=) operator(*)ident(strp)operator(;) + pre_type(int) ident(c) operator(=) pre_constant(EOF)operator(;) +preprocessor(#ifndef) ident(READ_DATA_PENDING_PTR) + pre_type(char) ident(buf)operator([)integer(8192)operator(];) + pre_type(char) operator(*)ident(bp) operator(=) ident(buf)operator(,) operator(*)ident(bpe) operator(=) ident(buf) operator(+) reserved(sizeof) ident(buf) operator(-) integer(3)operator(;) + pre_type(int) ident(update) operator(=) ident(Qfalse)operator(;) +preprocessor(#endif) + + reserved(do) operator({) +preprocessor(#ifdef) ident(READ_DATA_PENDING_PTR) + pre_type(long) ident(pending) operator(=) ident(READ_DATA_PENDING_COUNT)operator(()ident(f)operator(\);) + reserved(if) operator(()ident(pending) operator(>) integer(0)operator(\)) operator({) + directive(const) pre_type(char) operator(*)ident(p) operator(=) ident(READ_DATA_PENDING_PTR)operator(()ident(f)operator(\);) + directive(const) pre_type(char) operator(*)ident(e) operator(=) ident(memchr)operator(()ident(p)operator(,) ident(delim)operator(,) ident(pending)operator(\);) + pre_type(long) ident(last) operator(=) integer(0)operator(,) ident(len) operator(=) operator(()ident(c) operator(!=) pre_constant(EOF)operator(\);) + reserved(if) operator(()ident(e)operator(\)) ident(pending) operator(=) ident(e) operator(-) ident(p) operator(+) integer(1)operator(;) + ident(len) operator(+=) ident(pending)operator(;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(last) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(last) operator(+) ident(len)operator(\);) + operator(}) + reserved(else) operator({) + operator(*)ident(strp) operator(=) ident(str) operator(=) ident(rb_str_buf_new)operator(()ident(len)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(len)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(!=) pre_constant(EOF)operator(\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(last)operator(++]) operator(=) ident(c)operator(;) + operator(}) + ident(fread)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(last)operator(,) integer(1)operator(,) ident(pending)operator(,) ident(f)operator(\);) comment(/* must not fail */) + reserved(if) operator(()ident(e)operator(\)) reserved(return) ident(delim)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(!=) pre_constant(EOF)operator(\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + pre_type(char) ident(ch) operator(=) ident(c)operator(;) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) operator(&)ident(ch)operator(,) integer(1)operator(\);) + operator(}) + reserved(else) operator({) + operator(*)ident(strp) operator(=) ident(str) operator(=) ident(rb_str_buf_new)operator(()integer(1)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(++]) operator(=) ident(c)operator(;) + operator(}) + operator(}) + ident(rb_thread_wait_fd)operator(()ident(fileno)operator(()ident(f)operator(\)\);) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) +preprocessor(#else) + ident(READ_CHECK)operator(()ident(f)operator(\);) +preprocessor(#endif) + ident(clearerr)operator(()ident(f)operator(\);) + ident(TRAP_BEG)operator(;) + ident(c) operator(=) ident(getc)operator(()ident(f)operator(\);) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(c) operator(==) pre_constant(EOF)operator(\)) operator({) + reserved(if) operator(()ident(ferror)operator(()ident(f)operator(\)\)) operator({) + ident(clearerr)operator(()ident(f)operator(\);) + reserved(if) operator((!)ident(rb_io_wait_readable)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(continue)operator(;) + operator(}) +preprocessor(#ifdef) ident(READ_DATA_PENDING_PTR) + reserved(return) ident(c)operator(;) +preprocessor(#endif) + operator(}) +preprocessor(#ifndef) ident(READ_DATA_PENDING_PTR) + reserved(if) operator(()ident(c) operator(==) pre_constant(EOF) operator(||) operator((*)ident(bp)operator(++) operator(=) ident(c)operator(\)) operator(==) ident(delim) operator(||) ident(bp) operator(==) ident(bpe)operator(\)) operator({) + pre_type(int) ident(cnt) operator(=) ident(bp) operator(-) ident(buf)operator(;) + + reserved(if) operator(()ident(cnt) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)\)) + ident(rb_str_cat)operator(()ident(str)operator(,) ident(buf)operator(,) ident(cnt)operator(\);) + reserved(else) + operator(*)ident(strp) operator(=) ident(str) operator(=) ident(rb_str_new)operator(()ident(buf)operator(,) ident(cnt)operator(\);) + operator(}) + reserved(if) operator(()ident(c) operator(==) pre_constant(EOF)operator(\)) operator({) + reserved(if) operator(()ident(update)operator(\)) + reserved(return) operator(()pre_type(int)operator(\))ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(-)integer(1)operator(];) + reserved(return) ident(c)operator(;) + operator(}) + ident(bp) operator(=) ident(buf)operator(;) + operator(}) + ident(update) operator(=) ident(Qtrue)operator(;) +preprocessor(#endif) + operator(}) reserved(while) operator(()ident(c) operator(!=) ident(delim)operator(\);) + +preprocessor(#ifdef) ident(READ_DATA_PENDING_PTR) + operator({) + pre_type(char) ident(ch) operator(=) ident(c)operator(;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(rb_str_cat)operator(()ident(str)operator(,) operator(&)ident(ch)operator(,) integer(1)operator(\);) + operator(}) + reserved(else) operator({) + operator(*)ident(strp) operator(=) ident(str) operator(=) ident(rb_str_new)operator((&)ident(ch)operator(,) integer(1)operator(\);) + operator(}) + operator(}) +preprocessor(#endif) + + reserved(return) ident(c)operator(;) +operator(}) + +directive(static) directive(inline) pre_type(int) +ident(swallow)operator(()ident(fptr)operator(,) ident(term)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(term)operator(;) +operator({) + ident(FILE) operator(*)ident(f) operator(=) ident(fptr)operator(->)ident(f)operator(;) + pre_type(int) ident(c)operator(;) + + reserved(do) operator({) +preprocessor(#ifdef) ident(READ_DATA_PENDING_PTR) + pre_type(long) ident(cnt)operator(;) + reserved(while) operator((()ident(cnt) operator(=) ident(READ_DATA_PENDING_COUNT)operator(()ident(f)operator(\)\)) operator(>) integer(0)operator(\)) operator({) + pre_type(char) ident(buf)operator([)integer(1024)operator(];) + directive(const) pre_type(char) operator(*)ident(p) operator(=) ident(READ_DATA_PENDING_PTR)operator(()ident(f)operator(\);) + pre_type(int) ident(i)operator(;) + reserved(if) operator(()ident(cnt) operator(>) reserved(sizeof) ident(buf)operator(\)) ident(cnt) operator(=) reserved(sizeof) ident(buf)operator(;) + reserved(if) operator((*)ident(p) operator(!=) ident(term)operator(\)) reserved(return) ident(Qtrue)operator(;) + ident(i) operator(=) ident(cnt)operator(;) + reserved(while) operator((--)ident(i) operator(&&) operator(*++)ident(p) operator(==) ident(term)operator(\);) + reserved(if) operator((!)ident(fread)operator(()ident(buf)operator(,) integer(1)operator(,) ident(cnt) operator(-) ident(i)operator(,) ident(f)operator(\)\)) comment(/* must not fail */) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + ident(rb_thread_wait_fd)operator(()ident(fileno)operator(()ident(f)operator(\)\);) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) +preprocessor(#else) + ident(READ_CHECK)operator(()ident(f)operator(\);) +preprocessor(#endif) + ident(clearerr)operator(()ident(f)operator(\);) + ident(TRAP_BEG)operator(;) + ident(c) operator(=) ident(getc)operator(()ident(f)operator(\);) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(c) operator(!=) ident(term)operator(\)) operator({) + ident(ungetc)operator(()ident(c)operator(,) ident(f)operator(\);) + reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) reserved(while) operator(()ident(c) operator(!=) pre_constant(EOF)operator(\);) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_io_getline_fast)operator(()ident(fptr)operator(,) ident(delim)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(unsigned) pre_type(char) ident(delim)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(Qnil)operator(;) + pre_type(int) ident(c)operator(;) + + reserved(while) operator((()ident(c) operator(=) ident(appendline)operator(()ident(fptr)operator(,) ident(delim)operator(,) operator(&)ident(str)operator(\)\)) operator(!=) pre_constant(EOF) operator(&&) ident(c) operator(!=) ident(delim)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(fptr)operator(->)ident(lineno)operator(++;) + ident(lineno) operator(=) ident(INT2FIX)operator(()ident(fptr)operator(->)ident(lineno)operator(\);) + ident(OBJ_TAINT)operator(()ident(str)operator(\);) + operator(}) + + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(rscheck)operator(()ident(rsptr)operator(,) ident(rslen)operator(,) ident(rs)operator(\)) + pre_type(char) operator(*)ident(rsptr)operator(;) + pre_type(long) ident(rslen)operator(;) + ident(VALUE) ident(rs)operator(;) +operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(rs)operator(\)->)ident(ptr) operator(!=) ident(rsptr) operator(&&) ident(RSTRING)operator(()ident(rs)operator(\)->)ident(len) operator(!=) ident(rslen)operator(\)) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(rs modified)delimiter(")>operator(\);) + reserved(return) integer(1)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(rb_io_getline)operator(()ident(VALUE) ident(rs)operator(,) ident(VALUE) ident(io)operator(\);) + +directive(static) ident(VALUE) +ident(rb_io_getline)operator(()ident(rs)operator(,) ident(io)operator(\)) + ident(VALUE) ident(rs)operator(,) ident(io)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(Qnil)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(rs)operator(\)\)) operator({) + ident(str) operator(=) ident(read_all)operator(()ident(fptr)operator(,) integer(0)operator(,) ident(Qnil)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(rs) operator(==) ident(rb_default_rs)operator(\)) operator({) + reserved(return) ident(rb_io_getline_fast)operator(()ident(fptr)operator(,) char('\\n')operator(\);) + operator(}) + reserved(else) operator({) + pre_type(int) ident(c)operator(,) ident(newline)operator(;) + pre_type(char) operator(*)ident(rsptr)operator(;) + pre_type(long) ident(rslen)operator(;) + pre_type(int) ident(rspara) operator(=) integer(0)operator(;) + + ident(rslen) operator(=) ident(RSTRING)operator(()ident(rs)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(rslen) operator(==) integer(0)operator(\)) operator({) + ident(rsptr) operator(=) string<delimiter(")char(\\n)char(\\n)delimiter(")>operator(;) + ident(rslen) operator(=) integer(2)operator(;) + ident(rspara) operator(=) integer(1)operator(;) + ident(swallow)operator(()ident(fptr)operator(,) char('\\n')operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(rslen) operator(==) integer(1)operator(\)) operator({) + reserved(return) ident(rb_io_getline_fast)operator(()ident(fptr)operator(,) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(RSTRING)operator(()ident(rs)operator(\)->)ident(ptr)operator([)integer(0)operator(]\);) + operator(}) + reserved(else) operator({) + ident(rsptr) operator(=) ident(RSTRING)operator(()ident(rs)operator(\)->)ident(ptr)operator(;) + operator(}) + ident(newline) operator(=) ident(rsptr)operator([)ident(rslen) operator(-) integer(1)operator(];) + + reserved(while) operator((()ident(c) operator(=) ident(appendline)operator(()ident(fptr)operator(,) ident(newline)operator(,) operator(&)ident(str)operator(\)\)) operator(!=) pre_constant(EOF) operator(&&) + operator(()ident(c) operator(!=) ident(newline) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<) ident(rslen) operator(||) + operator((()ident(rspara) operator(||) ident(rscheck)operator(()ident(rsptr)operator(,)ident(rslen)operator(,)ident(rs)operator(\)\)) operator(&&) integer(0)operator(\)) operator(||) + ident(memcmp)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(+)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(-)ident(rslen)operator(,)ident(rsptr)operator(,)ident(rslen)operator(\)\)\);) + + reserved(if) operator(()ident(rspara)operator(\)) operator({) + reserved(if) operator(()ident(c) operator(!=) pre_constant(EOF)operator(\)) operator({) + ident(swallow)operator(()ident(fptr)operator(,) char('\\n')operator(\);) + operator(}) + operator(}) + operator(}) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(fptr)operator(->)ident(lineno)operator(++;) + ident(lineno) operator(=) ident(INT2FIX)operator(()ident(fptr)operator(->)ident(lineno)operator(\);) + ident(OBJ_TAINT)operator(()ident(str)operator(\);) + operator(}) + + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_io_gets)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + reserved(return) ident(rb_io_getline_fast)operator(()ident(fptr)operator(,) char('\\n')operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.gets(sep_string=$/\) => string or nil + * + * Reads the next ``line'' from the I/O stream; lines are separated by + * <i>sep_string</i>. A separator of <code>nil</code> reads the entire + * contents, and a zero-length separator reads the input a paragraph at + * a time (two successive newlines in the input separate paragraphs\). + * The stream must be opened for reading or an <code>IOError</code> + * will be raised. The line read in will be returned and also assigned + * to <code>$_</code>. Returns <code>nil</code> if called at end of + * file. + * + * File.new("testfile"\).gets #=> "This is line one\\n" + * $_ #=> "This is line one\\n" + */) + +directive(static) ident(VALUE) +ident(rb_io_gets_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(rs)operator(,) ident(str)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rs) operator(=) ident(rb_rs)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(1)delimiter(")>operator(,) operator(&)ident(rs)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(rs)operator(\)\)) ident(StringValue)operator(()ident(rs)operator(\);) + operator(}) + ident(str) operator(=) ident(rb_io_getline)operator(()ident(rs)operator(,) ident(io)operator(\);) + ident(rb_lastline_set)operator(()ident(str)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.lineno => integer + * + * Returns the current line number in <em>ios</em>. The stream must be + * opened for reading. <code>lineno</code> counts the number of times + * <code>gets</code> is called, rather than the number of newlines + * encountered. The two values will differ if <code>gets</code> is + * called with a separator other than newline. See also the + * <code>$.</code> variable. + * + * f = File.new("testfile"\) + * f.lineno #=> 0 + * f.gets #=> "This is line one\\n" + * f.lineno #=> 1 + * f.gets #=> "This is line two\\n" + * f.lineno #=> 2 + */) + +directive(static) ident(VALUE) +ident(rb_io_lineno)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + reserved(return) ident(INT2NUM)operator(()ident(fptr)operator(->)ident(lineno)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.lineno = integer => integer + * + * Manually sets the current line number to the given value. + * <code>$.</code> is updated only on the next read. + * + * f = File.new("testfile"\) + * f.gets #=> "This is line one\\n" + * $. #=> 1 + * f.lineno = 1000 + * f.lineno #=> 1000 + * $. # lineno of last read #=> 1 + * f.gets #=> "This is line two\\n" + * $. # lineno of last read #=> 1001 + */) + +directive(static) ident(VALUE) +ident(rb_io_set_lineno)operator(()ident(io)operator(,) ident(lineno)operator(\)) + ident(VALUE) ident(io)operator(,) ident(lineno)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + ident(fptr)operator(->)ident(lineno) operator(=) ident(NUM2INT)operator(()ident(lineno)operator(\);) + reserved(return) ident(lineno)operator(;) +operator(}) + +directive(static) directive(void) +ident(lineno_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(var)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + ident(gets_lineno) operator(=) ident(NUM2INT)operator(()ident(val)operator(\);) + operator(*)ident(var) operator(=) ident(INT2FIX)operator(()ident(gets_lineno)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(argf_set_lineno)operator(()ident(argf)operator(,) ident(val)operator(\)) + ident(VALUE) ident(argf)operator(,) ident(val)operator(;) +operator({) + ident(gets_lineno) operator(=) ident(NUM2INT)operator(()ident(val)operator(\);) + ident(lineno) operator(=) ident(INT2FIX)operator(()ident(gets_lineno)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_lineno)operator((\)) +operator({) + reserved(return) ident(lineno)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.readline(sep_string=$/\) => string + * + * Reads a line as with <code>IO#gets</code>, but raises an + * <code>EOFError</code> on end of file. + */) + +directive(static) ident(VALUE) +ident(rb_io_readline)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(line) operator(=) ident(rb_io_gets_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(line)operator(\)\)) operator({) + ident(rb_eof_error)operator((\);) + operator(}) + reserved(return) ident(line)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.readlines(sep_string=$/\) => array + * + * Reads all of the lines in <em>ios</em>, and returns them in + * <i>anArray</i>. Lines are separated by the optional + * <i>sep_string</i>. If <i>sep_string</i> is <code>nil</code>, the + * rest of the stream is returned as a single record. + * The stream must be opened for reading or an + * <code>IOError</code> will be raised. + * + * f = File.new("testfile"\) + * f.readlines[0] #=> "This is line one\\n" + */) + +directive(static) ident(VALUE) +ident(rb_io_readlines)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(line)operator(,) ident(ary)operator(;) + ident(VALUE) ident(rs)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rs) operator(=) ident(rb_rs)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(1)delimiter(")>operator(,) operator(&)ident(rs)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(rs)operator(\)\)) ident(StringValue)operator(()ident(rs)operator(\);) + operator(}) + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + reserved(while) operator((!)ident(NIL_P)operator(()ident(line) operator(=) ident(rb_io_getline)operator(()ident(rs)operator(,) ident(io)operator(\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(line)operator(\);) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.each(sep_string=$/\) {|line| block } => ios + * ios.each_line(sep_string=$/\) {|line| block } => ios + * + * Executes the block for every line in <em>ios</em>, where lines are + * separated by <i>sep_string</i>. <em>ios</em> must be opened for + * reading or an <code>IOError</code> will be raised. + * + * f = File.new("testfile"\) + * f.each {|line| puts "#{f.lineno}: #{line}" } + * + * <em>produces:</em> + * + * 1: This is line one + * 2: This is line two + * 3: This is line three + * 4: And so on... + */) + +directive(static) ident(VALUE) +ident(rb_io_each_line)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + ident(VALUE) ident(rs)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rs) operator(=) ident(rb_rs)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(1)delimiter(")>operator(,) operator(&)ident(rs)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(rs)operator(\)\)) ident(StringValue)operator(()ident(rs)operator(\);) + operator(}) + reserved(while) operator((!)ident(NIL_P)operator(()ident(str) operator(=) ident(rb_io_getline)operator(()ident(rs)operator(,) ident(io)operator(\)\)\)) operator({) + ident(rb_yield)operator(()ident(str)operator(\);) + operator(}) + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.each_byte {|byte| block } => nil + * + * Calls the given block once for each byte (0..255\) in <em>ios</em>, + * passing the byte as an argument. The stream must be opened for + * reading or an <code>IOError</code> will be raised. + * + * f = File.new("testfile"\) + * checksum = 0 + * f.each_byte {|x| checksum ^= x } #=> #<File:testfile> + * checksum #=> 12 + */) + +directive(static) ident(VALUE) +ident(rb_io_each_byte)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(FILE) operator(*)ident(f)operator(;) + pre_type(int) ident(c)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + + reserved(for) operator((;;\)) operator({) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + ident(f) operator(=) ident(fptr)operator(->)ident(f)operator(;) + ident(READ_CHECK)operator(()ident(f)operator(\);) + ident(clearerr)operator(()ident(f)operator(\);) + ident(TRAP_BEG)operator(;) + ident(c) operator(=) ident(getc)operator(()ident(f)operator(\);) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(c) operator(==) pre_constant(EOF)operator(\)) operator({) + reserved(if) operator(()ident(ferror)operator(()ident(f)operator(\)\)) operator({) + ident(clearerr)operator(()ident(f)operator(\);) + reserved(if) operator((!)ident(rb_io_wait_readable)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(continue)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + ident(rb_yield)operator(()ident(INT2FIX)operator(()ident(c) operator(&) hex(0xff)operator(\)\);) + operator(}) + reserved(if) operator(()ident(ferror)operator(()ident(f)operator(\)\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.getc => fixnum or nil + * + * Gets the next 8-bit byte (0..255\) from <em>ios</em>. Returns + * <code>nil</code> if called at end of file. + * + * f = File.new("testfile"\) + * f.getc #=> 84 + * f.getc #=> 104 + */) + +ident(VALUE) +ident(rb_io_getc)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(FILE) operator(*)ident(f)operator(;) + pre_type(int) ident(c)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + ident(f) operator(=) ident(fptr)operator(->)ident(f)operator(;) + + label(retry)operator(:) + ident(READ_CHECK)operator(()ident(f)operator(\);) + ident(clearerr)operator(()ident(f)operator(\);) + ident(TRAP_BEG)operator(;) + ident(c) operator(=) ident(getc)operator(()ident(f)operator(\);) + ident(TRAP_END)operator(;) + + reserved(if) operator(()ident(c) operator(==) pre_constant(EOF)operator(\)) operator({) + reserved(if) operator(()ident(ferror)operator(()ident(f)operator(\)\)) operator({) + ident(clearerr)operator(()ident(f)operator(\);) + reserved(if) operator((!)ident(rb_io_wait_readable)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(goto) ident(retry)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(c) operator(&) hex(0xff)operator(\);) +operator(}) + +pre_type(int) +ident(rb_getc)operator(()ident(f)operator(\)) + ident(FILE) operator(*)ident(f)operator(;) +operator({) + pre_type(int) ident(c)operator(;) + + reserved(if) operator((!)ident(READ_DATA_PENDING)operator(()ident(f)operator(\)\)) operator({) + ident(rb_thread_wait_fd)operator(()ident(fileno)operator(()ident(f)operator(\)\);) + operator(}) + ident(clearerr)operator(()ident(f)operator(\);) + ident(TRAP_BEG)operator(;) + ident(c) operator(=) ident(getc)operator(()ident(f)operator(\);) + ident(TRAP_END)operator(;) + + reserved(return) ident(c)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.readchar => fixnum + * + * Reads a character as with <code>IO#getc</code>, but raises an + * <code>EOFError</code> on end of file. + */) + +directive(static) ident(VALUE) +ident(rb_io_readchar)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(c) operator(=) ident(rb_io_getc)operator(()ident(io)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) operator({) + ident(rb_eof_error)operator((\);) + operator(}) + reserved(return) ident(c)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.ungetc(integer\) => nil + * + * Pushes back one character (passed as a parameter\) onto <em>ios</em>, + * such that a subsequent buffered read will return it. Only one character + * may be pushed back before a subsequent read operation (that is, + * you will be able to read only the last of several characters that have been pushed + * back\). Has no effect with unbuffered reads (such as <code>IO#sysread</code>\). + * + * f = File.new("testfile"\) #=> #<File:testfile> + * c = f.getc #=> 84 + * f.ungetc(c\) #=> nil + * f.getc #=> 84 + */) + +ident(VALUE) +ident(rb_io_ungetc)operator(()ident(io)operator(,) ident(c)operator(\)) + ident(VALUE) ident(io)operator(,) ident(c)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(cc) operator(=) ident(NUM2INT)operator(()ident(c)operator(\);) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(if) operator((!()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_RBUF)operator(\)\)) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(unread stream)delimiter(")>operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + + reserved(if) operator(()ident(ungetc)operator(()ident(cc)operator(,) ident(fptr)operator(->)ident(f)operator(\)) operator(==) pre_constant(EOF) operator(&&) ident(cc) operator(!=) pre_constant(EOF)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(ungetc failed)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.isatty => true or false + * ios.tty? => true or false + * + * Returns <code>true</code> if <em>ios</em> is associated with a + * terminal device (tty\), <code>false</code> otherwise. + * + * File.new("testfile"\).isatty #=> false + * File.new("/dev/tty"\).isatty #=> true + */) + +directive(static) ident(VALUE) +ident(rb_io_isatty)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(isatty)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) operator(==) integer(0)operator(\)) + reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +directive(static) directive(void) +ident(fptr_finalize)operator(()ident(fptr)operator(,) ident(noraise)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(noraise)operator(;) +operator({) + pre_type(int) ident(n1) operator(=) integer(0)operator(,) ident(n2) operator(=) integer(0)operator(,) ident(f1)operator(,) ident(f2) operator(=) operator(-)integer(1)operator(;) + + ident(errno) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(f2) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + reserved(while) operator(()ident(n2) operator(=) integer(0)operator(,) ident(fflush)operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(n2) operator(=) ident(errno)operator(;) + reserved(if) operator((!)ident(rb_io_wait_writable)operator(()ident(f2)operator(\)\)) operator({) + reserved(break)operator(;) + operator(}) + reserved(if) operator((!)ident(fptr)operator(->)ident(f2)operator(\)) reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(fclose)operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator(<) integer(0) operator(&&) ident(n2) operator(==) integer(0)operator(\)) operator({) + ident(n2) operator(=) ident(errno)operator(;) + operator(}) + ident(fptr)operator(->)ident(f2) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(fptr)operator(->)ident(f)operator(\)) operator({) + ident(f1) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\);) + reserved(if) operator((()ident(f2) operator(==) operator(-)integer(1)operator(\)) operator(&&) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WBUF)operator(\)\)) operator({) + reserved(while) operator(()ident(n1) operator(=) integer(0)operator(,) ident(fflush)operator(()ident(fptr)operator(->)ident(f)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(n1) operator(=) ident(errno)operator(;) + reserved(if) operator((!)ident(rb_io_wait_writable)operator(()ident(f1)operator(\)\)) reserved(break)operator(;) + reserved(if) operator((!)ident(fptr)operator(->)ident(f)operator(\)) reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(fclose)operator(()ident(fptr)operator(->)ident(f)operator(\)) operator(<) integer(0) operator(&&) ident(n1) operator(==) integer(0)operator(\)) operator({) + ident(n1) operator(=) ident(errno)operator(;) + operator(}) + ident(fptr)operator(->)ident(f) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(n1) operator(==) ident(EBADF) operator(&&) ident(f1) operator(==) ident(f2)operator(\)) operator({) + ident(n1) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(if) operator((!)ident(noraise) operator(&&) operator(()ident(n1) operator(||) ident(n2)operator(\)\)) operator({) + ident(errno) operator(=) operator(()ident(n1) operator(?) ident(n1) operator(:) ident(n2)operator(\);) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(rb_io_fptr_cleanup)operator(()ident(fptr)operator(,) ident(noraise)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(noraise)operator(;) +operator({) + reserved(if) operator(()ident(fptr)operator(->)ident(finalize)operator(\)) operator({) + operator((*)ident(fptr)operator(->)ident(finalize)operator(\)()ident(fptr)operator(,) ident(noraise)operator(\);) + operator(}) + reserved(else) operator({) + ident(fptr_finalize)operator(()ident(fptr)operator(,) ident(noraise)operator(\);) + operator(}) +operator(}) + +directive(void) +ident(rb_io_fptr_finalize)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + reserved(if) operator((!)ident(fptr)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(fptr)operator(->)ident(path)operator(\)) operator({) + ident(free)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + reserved(if) operator((!)ident(fptr)operator(->)ident(f) operator(&&) operator(!)ident(fptr)operator(->)ident(f2)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)) operator(<) integer(3)operator(\)) reserved(return)operator(;) + + ident(rb_io_fptr_cleanup)operator(()ident(fptr)operator(,) ident(Qtrue)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_io_close)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(fd)operator(,) ident(fd2)operator(;) + + ident(fptr) operator(=) ident(RFILE)operator(()ident(io)operator(\)->)ident(fptr)operator(;) + reserved(if) operator((!)ident(fptr)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(fd2) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator((!)ident(fptr)operator(->)ident(f)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(fd2) operator(=) operator(-)integer(1)operator(;) + operator(}) + + ident(fd) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(rb_io_fptr_cleanup)operator(()ident(fptr)operator(,) ident(Qfalse)operator(\);) + ident(rb_thread_fd_close)operator(()ident(fd)operator(\);) + reserved(if) operator(()ident(fd2) operator(>=) integer(0)operator(\)) ident(rb_thread_fd_close)operator(()ident(fd2)operator(\);) + + reserved(if) operator(()ident(fptr)operator(->)ident(pid)operator(\)) operator({) + ident(rb_syswait)operator(()ident(fptr)operator(->)ident(pid)operator(\);) + ident(fptr)operator(->)ident(pid) operator(=) integer(0)operator(;) + operator(}) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.close => nil + * + * Closes <em>ios</em> and flushes any pending writes to the operating + * system. The stream is unavailable for any further data operations; + * an <code>IOError</code> is raised if such an attempt is made. I/O + * streams are automatically closed when they are claimed by the + * garbage collector. + * + * If <em>ios</em> is opened by <code>IO.popen</code>, + * <code>close</code> sets <code>$?</code>. + */) + +directive(static) ident(VALUE) +ident(rb_io_close_m)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(io)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't close)delimiter(")>operator(\);) + operator(}) + ident(rb_io_check_closed)operator(()ident(RFILE)operator(()ident(io)operator(\)->)ident(fptr)operator(\);) + ident(rb_io_close)operator(()ident(io)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(io_call_close)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(io)operator(,) ident(rb_intern)operator(()string<delimiter(")content(close)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(io_close)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + reserved(return) ident(rb_rescue)operator(()ident(io_call_close)operator(,) ident(io)operator(,) integer(0)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.closed? => true or false + * + * Returns <code>true</code> if <em>ios</em> is completely closed (for + * duplex streams, both reader and writer\), <code>false</code> + * otherwise. + * + * f = File.new("testfile"\) + * f.close #=> nil + * f.closed? #=> true + * f = IO.popen("/bin/sh","r+"\) + * f.close_write #=> nil + * f.closed? #=> false + * f.close_read #=> nil + * f.closed? #=> true + */) + +directive(static) ident(VALUE) +ident(rb_io_closed)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(fptr) operator(=) ident(RFILE)operator(()ident(io)operator(\)->)ident(fptr)operator(;) + ident(rb_io_check_initialized)operator(()ident(fptr)operator(\);) + reserved(return) operator(()ident(fptr)operator(->)ident(f) operator(||) ident(fptr)operator(->)ident(f2)operator(\)?)label(Qfalse)operator(:)ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.close_read => nil + * + * Closes the read end of a duplex I/O stream (i.e., one that contains + * both a read and a write stream, such as a pipe\). Will raise an + * <code>IOError</code> if the stream is not duplexed. + * + * f = IO.popen("/bin/sh","r+"\) + * f.close_read + * f.readlines + * + * <em>produces:</em> + * + * prog.rb:3:in `readlines': not opened for reading (IOError\) + * from prog.rb:3 + */) + +directive(static) ident(VALUE) +ident(rb_io_close_read)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(n)operator(;) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(io)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't close)delimiter(")>operator(\);) + operator(}) + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(fptr)operator(->)ident(f2) operator(==) integer(0) operator(&&) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WRITABLE)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(closing non-duplex IO for reading)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(fptr)operator(->)ident(f2) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(rb_io_close)operator(()ident(io)operator(\);) + operator(}) + ident(n) operator(=) ident(fclose)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(fptr)operator(->)ident(mode) operator(&=) operator(~)ident(FMODE_READABLE)operator(;) + ident(fptr)operator(->)ident(f) operator(=) ident(fptr)operator(->)ident(f2)operator(;) + ident(fptr)operator(->)ident(f2) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(n) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.close_write => nil + * + * Closes the write end of a duplex I/O stream (i.e., one that contains + * both a read and a write stream, such as a pipe\). Will raise an + * <code>IOError</code> if the stream is not duplexed. + * + * f = IO.popen("/bin/sh","r+"\) + * f.close_write + * f.print "nowhere" + * + * <em>produces:</em> + * + * prog.rb:3:in `write': not opened for writing (IOError\) + * from prog.rb:3:in `print' + * from prog.rb:3 + */) + +directive(static) ident(VALUE) +ident(rb_io_close_write)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(n)operator(;) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(io)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't close)delimiter(")>operator(\);) + operator(}) + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(fptr)operator(->)ident(f2) operator(==) integer(0) operator(&&) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_READABLE)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(closing non-duplex IO for writing)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(fptr)operator(->)ident(f2) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(rb_io_close)operator(()ident(io)operator(\);) + operator(}) + ident(n) operator(=) ident(fclose)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + ident(fptr)operator(->)ident(f2) operator(=) integer(0)operator(;) + ident(fptr)operator(->)ident(mode) operator(&=) operator(~)ident(FMODE_WRITABLE)operator(;) + reserved(if) operator(()ident(n) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.sysseek(offset, whence=SEEK_SET\) => integer + * + * Seeks to a given <i>offset</i> in the stream according to the value + * of <i>whence</i> (see <code>IO#seek</code> for values of + * <i>whence</i>\). Returns the new offset into the file. + * + * f = File.new("testfile"\) + * f.sysseek(-13, IO::SEEK_END\) #=> 53 + * f.sysread(10\) #=> "And so on." + */) + +directive(static) ident(VALUE) +ident(rb_io_sysseek)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(offset)operator(,) ident(ptrname)operator(;) + pre_type(int) ident(whence) operator(=) ident(SEEK_SET)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(off_t) ident(pos)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(offset)operator(,) operator(&)ident(ptrname)operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(whence) operator(=) ident(NUM2INT)operator(()ident(ptrname)operator(\);) + operator(}) + ident(pos) operator(=) ident(NUM2OFFT)operator(()ident(offset)operator(\);) + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(if) operator((()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_READABLE)operator(\)) operator(&&) ident(READ_DATA_BUFFERED)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(sysseek for buffered IO)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WRITABLE)operator(\)) operator(&&) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WBUF)operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(sysseek for buffered IO)delimiter(")>operator(\);) + operator(}) + ident(pos) operator(=) ident(lseek)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(pos)operator(,) ident(whence)operator(\);) + reserved(if) operator(()ident(pos) operator(==) operator(-)integer(1)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + + reserved(return) ident(OFFT2NUM)operator(()ident(pos)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.syswrite(string\) => integer + * + * Writes the given string to <em>ios</em> using a low-level write. + * Returns the number of bytes written. Do not mix with other methods + * that write to <em>ios</em> or you may get unpredictable results. + * Raises <code>SystemCallError</code> on error. + * + * f = File.new("out", "w"\) + * f.syswrite("ABCDEF"\) #=> 6 + */) + +directive(static) ident(VALUE) +ident(rb_io_syswrite)operator(()ident(io)operator(,) ident(str)operator(\)) + ident(VALUE) ident(io)operator(,) ident(str)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + ident(FILE) operator(*)ident(f)operator(;) + pre_type(long) ident(n)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(str)operator(\)) operator(!=) ident(T_STRING)operator(\)) + ident(str) operator(=) ident(rb_obj_as_string)operator(()ident(str)operator(\);) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_writable)operator(()ident(fptr)operator(\);) + ident(f) operator(=) ident(GetWriteFile)operator(()ident(fptr)operator(\);) + + reserved(if) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WBUF)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(syswrite for buffered IO)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!)ident(rb_thread_fd_writable)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) operator({) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + operator(}) + ident(TRAP_BEG)operator(;) + ident(n) operator(=) ident(write)operator(()ident(fileno)operator(()ident(f)operator(\),) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + ident(TRAP_END)operator(;) + + reserved(if) operator(()ident(n) operator(==) operator(-)integer(1)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + + reserved(return) ident(LONG2FIX)operator(()ident(n)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.sysread(integer \) => string + * + * Reads <i>integer</i> bytes from <em>ios</em> using a low-level + * read and returns them as a string. Do not mix with other methods + * that read from <em>ios</em> or you may get unpredictable results. + * Raises <code>SystemCallError</code> on error and + * <code>EOFError</code> at end of file. + * + * f = File.new("testfile"\) + * f.sysread(16\) #=> "This is line one" + */) + +directive(static) ident(VALUE) +ident(rb_io_sysread)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(len)operator(,) ident(str)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(long) ident(n)operator(,) ident(ilen)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(len)operator(,) operator(&)ident(str)operator(\);) + ident(ilen) operator(=) ident(NUM2LONG)operator(()ident(len)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(ilen)operator(\);) + operator(}) + reserved(else) operator({) + ident(StringValue)operator(()ident(str)operator(\);) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(ilen)operator(\);) + operator(}) + reserved(if) operator(()ident(ilen) operator(==) integer(0)operator(\)) reserved(return) ident(str)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(rb_io_check_readable)operator(()ident(fptr)operator(\);) + + reserved(if) operator(()ident(READ_DATA_BUFFERED)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eIOError)operator(,) string<delimiter(")content(sysread for buffered IO)delimiter(")>operator(\);) + operator(}) + ident(rb_str_locktmp)operator(()ident(str)operator(\);) + + ident(n) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(rb_thread_wait_fd)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)\);) + ident(rb_io_check_closed)operator(()ident(fptr)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(!=) ident(ilen)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(buffer string modified)delimiter(")>operator(\);) + operator(}) + ident(TRAP_BEG)operator(;) + ident(n) operator(=) ident(read)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(ilen)operator(\);) + ident(TRAP_END)operator(;) + + ident(rb_str_unlocktmp)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(n) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(n)operator(\);) + reserved(if) operator(()ident(n) operator(==) integer(0) operator(&&) ident(ilen) operator(>) integer(0)operator(\)) operator({) + ident(rb_eof_error)operator((\);) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(n)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(n)operator(]) operator(=) char('\\0')operator(;) + ident(OBJ_TAINT)operator(()ident(str)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.binmode => ios + * + * Puts <em>ios</em> into binary mode. This is useful only in + * MS-DOS/Windows environments. Once a stream is in binary mode, it + * cannot be reset to nonbinary mode. + */) + +ident(VALUE) +ident(rb_io_binmode)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(DJGPP)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN__)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__EMX__)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) +preprocessor(#ifdef) ident(__human68k__) + reserved(if) operator(()ident(fptr)operator(->)ident(f)operator(\)) + ident(fmode)operator(()ident(fptr)operator(->)ident(f)operator(,) ident(_IOBIN)operator(\);) + reserved(if) operator(()ident(fptr)operator(->)ident(f2)operator(\)) + ident(fmode)operator(()ident(fptr)operator(->)ident(f2)operator(,) ident(_IOBIN)operator(\);) +preprocessor(#else) + reserved(if) operator(()ident(fptr)operator(->)ident(f) operator(&&) ident(setmode)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(O_BINARY)operator(\)) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(if) operator(()ident(fptr)operator(->)ident(f2) operator(&&) ident(setmode)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\),) ident(O_BINARY)operator(\)) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) +preprocessor(#endif) + + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_BINMODE)operator(;) +preprocessor(#endif) + reserved(return) ident(io)operator(;) +operator(}) + +pre_type(char)operator(*) +ident(rb_io_flags_mode)operator(()ident(flags)operator(\)) + pre_type(int) ident(flags)operator(;) +operator({) +preprocessor(#ifdef) ident(O_BINARY) +preprocessor(# define) ident(MODE_BINMODE)operator(()ident(a)operator(,)ident(b)operator(\)) operator((()ident(flags) operator(&) ident(FMODE_BINMODE)operator(\)) operator(?) operator(()ident(b)operator(\)) operator(:) operator(()ident(a)operator(\)\)) +preprocessor(#else) +preprocessor(# define) ident(MODE_BINMODE)operator(()ident(a)operator(,)ident(b)operator(\)) operator(()ident(a)operator(\)) +preprocessor(#endif) + reserved(if) operator(()ident(flags) operator(&) ident(FMODE_APPEND)operator(\)) operator({) + reserved(if) operator((()ident(flags) operator(&) ident(FMODE_READWRITE)operator(\)) operator(==) ident(FMODE_READWRITE)operator(\)) operator({) + reserved(return) ident(MODE_BINMODE)operator(()string<delimiter(")content(a+)delimiter(")>operator(,) string<delimiter(")content(ab+)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(MODE_BINMODE)operator(()string<delimiter(")content(a)delimiter(")>operator(,) string<delimiter(")content(ab)delimiter(")>operator(\);) + operator(}) + reserved(switch) operator(()ident(flags) operator(&) ident(FMODE_READWRITE)operator(\)) operator({) + reserved(case) label(FMODE_READABLE)operator(:) + reserved(return) ident(MODE_BINMODE)operator(()string<delimiter(")content(r)delimiter(")>operator(,) string<delimiter(")content(rb)delimiter(")>operator(\);) + reserved(case) label(FMODE_WRITABLE)operator(:) + reserved(return) ident(MODE_BINMODE)operator(()string<delimiter(")content(w)delimiter(")>operator(,) string<delimiter(")content(wb)delimiter(")>operator(\);) + reserved(case) label(FMODE_READWRITE)operator(:) + reserved(if) operator(()ident(flags) operator(&) ident(FMODE_CREATE)operator(\)) operator({) + reserved(return) ident(MODE_BINMODE)operator(()string<delimiter(")content(w+)delimiter(")>operator(,) string<delimiter(")content(wb+)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(MODE_BINMODE)operator(()string<delimiter(")content(r+)delimiter(")>operator(,) string<delimiter(")content(rb+)delimiter(")>operator(\);) + operator(}) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(illegal access modenum %o)delimiter(")>operator(,) ident(flags)operator(\);) + reserved(return) pre_constant(NULL)operator(;) comment(/* not reached */) +operator(}) + +pre_type(int) +ident(rb_io_mode_flags)operator(()ident(mode)operator(\)) + directive(const) pre_type(char) operator(*)ident(mode)operator(;) +operator({) + pre_type(int) ident(flags) operator(=) integer(0)operator(;) + directive(const) pre_type(char) operator(*)ident(m) operator(=) ident(mode)operator(;) + + reserved(switch) operator((*)ident(m)operator(++\)) operator({) + reserved(case) char('r')operator(:) + ident(flags) operator(|=) ident(FMODE_READABLE)operator(;) + reserved(break)operator(;) + reserved(case) char('w')operator(:) + ident(flags) operator(|=) ident(FMODE_WRITABLE) operator(|) ident(FMODE_CREATE)operator(;) + reserved(break)operator(;) + reserved(case) char('a')operator(:) + ident(flags) operator(|=) ident(FMODE_WRITABLE) operator(|) ident(FMODE_APPEND) operator(|) ident(FMODE_CREATE)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + label(error)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(illegal access mode %s)delimiter(")>operator(,) ident(mode)operator(\);) + operator(}) + + reserved(while) operator((*)ident(m)operator(\)) operator({) + reserved(switch) operator((*)ident(m)operator(++\)) operator({) + reserved(case) char('b')operator(:) + ident(flags) operator(|=) ident(FMODE_BINMODE)operator(;) + reserved(break)operator(;) + reserved(case) char('+')operator(:) + ident(flags) operator(|=) ident(FMODE_READWRITE)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(goto) ident(error)operator(;) + operator(}) + operator(}) + + reserved(return) ident(flags)operator(;) +operator(}) + +pre_type(int) +ident(rb_io_modenum_flags)operator(()ident(mode)operator(\)) + pre_type(int) ident(mode)operator(;) +operator({) + pre_type(int) ident(flags) operator(=) integer(0)operator(;) + + reserved(switch) operator(()ident(mode) operator(&) operator(()ident(O_RDONLY)operator(|)ident(O_WRONLY)operator(|)ident(O_RDWR)operator(\)\)) operator({) + reserved(case) label(O_RDONLY)operator(:) + ident(flags) operator(=) ident(FMODE_READABLE)operator(;) + reserved(break)operator(;) + reserved(case) label(O_WRONLY)operator(:) + ident(flags) operator(=) ident(FMODE_WRITABLE)operator(;) + reserved(break)operator(;) + reserved(case) label(O_RDWR)operator(:) + ident(flags) operator(=) ident(FMODE_READWRITE)operator(;) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(mode) operator(&) ident(O_APPEND)operator(\)) operator({) + ident(flags) operator(|=) ident(FMODE_APPEND)operator(;) + operator(}) + reserved(if) operator(()ident(mode) operator(&) ident(O_CREAT)operator(\)) operator({) + ident(flags) operator(|=) ident(FMODE_CREATE)operator(;) + operator(}) +preprocessor(#ifdef) ident(O_BINARY) + reserved(if) operator(()ident(mode) operator(&) ident(O_BINARY)operator(\)) operator({) + ident(flags) operator(|=) ident(FMODE_BINMODE)operator(;) + operator(}) +preprocessor(#endif) + + reserved(return) ident(flags)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(rb_io_mode_modenum)operator(()ident(mode)operator(\)) + directive(const) pre_type(char) operator(*)ident(mode)operator(;) +operator({) + pre_type(int) ident(flags) operator(=) integer(0)operator(;) + directive(const) pre_type(char) operator(*)ident(m) operator(=) ident(mode)operator(;) + + reserved(switch) operator((*)ident(m)operator(++\)) operator({) + reserved(case) char('r')operator(:) + ident(flags) operator(|=) ident(O_RDONLY)operator(;) + reserved(break)operator(;) + reserved(case) char('w')operator(:) + ident(flags) operator(|=) ident(O_WRONLY) operator(|) ident(O_CREAT) operator(|) ident(O_TRUNC)operator(;) + reserved(break)operator(;) + reserved(case) char('a')operator(:) + ident(flags) operator(|=) ident(O_WRONLY) operator(|) ident(O_CREAT) operator(|) ident(O_APPEND)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + label(error)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(illegal access mode %s)delimiter(")>operator(,) ident(mode)operator(\);) + operator(}) + + reserved(while) operator((*)ident(m)operator(\)) operator({) + reserved(switch) operator((*)ident(m)operator(++\)) operator({) + reserved(case) char('b')operator(:) +preprocessor(#ifdef) ident(O_BINARY) + ident(flags) operator(|=) ident(O_BINARY)operator(;) +preprocessor(#endif) + reserved(break)operator(;) + reserved(case) char('+')operator(:) + ident(flags) operator(=) operator(()ident(flags) operator(&) operator(~)ident(O_ACCMODE)operator(\)) operator(|) ident(O_RDWR)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(goto) ident(error)operator(;) + operator(}) + operator(}) + + reserved(return) ident(flags)operator(;) +operator(}) + +preprocessor(#define) ident(MODENUM_MAX) integer(4) + +directive(static) pre_type(char)operator(*) +ident(rb_io_modenum_mode)operator(()ident(flags)operator(\)) + pre_type(int) ident(flags)operator(;) +operator({) +preprocessor(#ifdef) ident(O_BINARY) +preprocessor(# define) ident(MODE_BINARY)operator(()ident(a)operator(,)ident(b)operator(\)) operator((()ident(flags) operator(&) ident(O_BINARY)operator(\)) operator(?) operator(()ident(b)operator(\)) operator(:) operator(()ident(a)operator(\)\)) +preprocessor(#else) +preprocessor(# define) ident(MODE_BINARY)operator(()ident(a)operator(,)ident(b)operator(\)) operator(()ident(a)operator(\)) +preprocessor(#endif) + reserved(if) operator(()ident(flags) operator(&) ident(O_APPEND)operator(\)) operator({) + reserved(if) operator((()ident(flags) operator(&) ident(O_RDWR)operator(\)) operator(==) ident(O_RDWR)operator(\)) operator({) + reserved(return) ident(MODE_BINARY)operator(()string<delimiter(")content(a+)delimiter(")>operator(,) string<delimiter(")content(ab+)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(MODE_BINARY)operator(()string<delimiter(")content(a)delimiter(")>operator(,) string<delimiter(")content(ab)delimiter(")>operator(\);) + operator(}) + reserved(switch) operator(()ident(flags) operator(&) operator(()ident(O_RDONLY)operator(|)ident(O_WRONLY)operator(|)ident(O_RDWR)operator(\)\)) operator({) + reserved(case) label(O_RDONLY)operator(:) + reserved(return) ident(MODE_BINARY)operator(()string<delimiter(")content(r)delimiter(")>operator(,) string<delimiter(")content(rb)delimiter(")>operator(\);) + reserved(case) label(O_WRONLY)operator(:) + reserved(return) ident(MODE_BINARY)operator(()string<delimiter(")content(w)delimiter(")>operator(,) string<delimiter(")content(wb)delimiter(")>operator(\);) + reserved(case) label(O_RDWR)operator(:) + reserved(return) ident(MODE_BINARY)operator(()string<delimiter(")content(r+)delimiter(")>operator(,) string<delimiter(")content(rb+)delimiter(")>operator(\);) + operator(}) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(illegal access modenum %o)delimiter(")>operator(,) ident(flags)operator(\);) + reserved(return) pre_constant(NULL)operator(;) comment(/* not reached */) +operator(}) + +directive(static) pre_type(int) +ident(rb_sysopen)operator(()ident(fname)operator(,) ident(flags)operator(,) ident(mode)operator(\)) + pre_type(char) operator(*)ident(fname)operator(;) + pre_type(int) ident(flags)operator(;) + pre_type(unsigned) pre_type(int) ident(mode)operator(;) +operator({) + pre_type(int) ident(fd)operator(;) + + ident(fd) operator(=) ident(open)operator(()ident(fname)operator(,) ident(flags)operator(,) ident(mode)operator(\);) + reserved(if) operator(()ident(fd) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(errno) operator(==) ident(EMFILE) operator(||) ident(errno) operator(==) ident(ENFILE)operator(\)) operator({) + ident(rb_gc)operator((\);) + ident(fd) operator(=) ident(open)operator(()ident(fname)operator(,) ident(flags)operator(,) ident(mode)operator(\);) + operator(}) + reserved(if) operator(()ident(fd) operator(<) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fname)operator(\);) + operator(}) + operator(}) + reserved(return) ident(fd)operator(;) +operator(}) + +ident(FILE) operator(*) +ident(rb_fopen)operator(()ident(fname)operator(,) ident(mode)operator(\)) + directive(const) pre_type(char) operator(*)ident(fname)operator(;) + directive(const) pre_type(char) operator(*)ident(mode)operator(;) +operator({) + ident(FILE) operator(*)ident(file)operator(;) + + ident(file) operator(=) ident(fopen)operator(()ident(fname)operator(,) ident(mode)operator(\);) + reserved(if) operator((!)ident(file)operator(\)) operator({) + reserved(if) operator(()ident(errno) operator(==) ident(EMFILE) operator(||) ident(errno) operator(==) ident(ENFILE)operator(\)) operator({) + ident(rb_gc)operator((\);) + ident(file) operator(=) ident(fopen)operator(()ident(fname)operator(,) ident(mode)operator(\);) + operator(}) + reserved(if) operator((!)ident(file)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fname)operator(\);) + operator(}) + operator(}) +preprocessor(#ifdef) ident(USE_SETVBUF) + reserved(if) operator(()ident(setvbuf)operator(()ident(file)operator(,) pre_constant(NULL)operator(,) ident(_IOFBF)operator(,) integer(0)operator(\)) operator(!=) integer(0)operator(\)) + ident(rb_warn)operator(()string<delimiter(")content(setvbuf(\) can't be honoured for %s)delimiter(")>operator(,) ident(fname)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(__human68k__) + ident(fmode)operator(()ident(file)operator(,) ident(_IOTEXT)operator(\);) +preprocessor(#endif) + reserved(return) ident(file)operator(;) +operator(}) + +ident(FILE) operator(*) +ident(rb_fdopen)operator(()ident(fd)operator(,) ident(mode)operator(\)) + pre_type(int) ident(fd)operator(;) + directive(const) pre_type(char) operator(*)ident(mode)operator(;) +operator({) + ident(FILE) operator(*)ident(file)operator(;) + +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) + ident(errno) operator(=) integer(0)operator(;) +preprocessor(#endif) + ident(file) operator(=) ident(fdopen)operator(()ident(fd)operator(,) ident(mode)operator(\);) + reserved(if) operator((!)ident(file)operator(\)) operator({) +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) + reserved(if) operator(()ident(errno) operator(==) integer(0) operator(||) ident(errno) operator(==) ident(EMFILE) operator(||) ident(errno) operator(==) ident(ENFILE)operator(\)) operator({) +preprocessor(#else) + reserved(if) operator(()ident(errno) operator(==) ident(EMFILE) operator(||) ident(errno) operator(==) ident(ENFILE)operator(\)) operator({) +preprocessor(#endif) + ident(rb_gc)operator((\);) +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) + ident(errno) operator(=) integer(0)operator(;) +preprocessor(#endif) + ident(file) operator(=) ident(fdopen)operator(()ident(fd)operator(,) ident(mode)operator(\);) + operator(}) + reserved(if) operator((!)ident(file)operator(\)) operator({) +preprocessor(#ifdef) ident(_WIN32) + reserved(if) operator(()ident(errno) operator(==) integer(0)operator(\)) ident(errno) operator(=) ident(EINVAL)operator(;) +preprocessor(#endif) +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) + reserved(if) operator(()ident(errno) operator(==) integer(0)operator(\)) ident(errno) operator(=) ident(EMFILE)operator(;) +preprocessor(#endif) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + operator(}) + +preprocessor(#ifdef) ident(USE_SETVBUF) + reserved(if) operator(()ident(setvbuf)operator(()ident(file)operator(,) pre_constant(NULL)operator(,) ident(_IOFBF)operator(,) integer(0)operator(\)) operator(!=) integer(0)operator(\)) + ident(rb_warn)operator(()string<delimiter(")content(setvbuf(\) can't be honoured (fd=%d\))delimiter(")>operator(,) ident(fd)operator(\);) +preprocessor(#endif) + reserved(return) ident(file)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_file_open_internal)operator(()ident(io)operator(,) ident(fname)operator(,) ident(mode)operator(\)) + ident(VALUE) ident(io)operator(;) + directive(const) pre_type(char) operator(*)ident(fname)operator(,) operator(*)ident(mode)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(MakeOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + + ident(fptr)operator(->)ident(mode) operator(=) ident(rb_io_mode_flags)operator(()ident(mode)operator(\);) + ident(fptr)operator(->)ident(path) operator(=) ident(strdup)operator(()ident(fname)operator(\);) + ident(fptr)operator(->)ident(f) operator(=) ident(rb_fopen)operator(()ident(fptr)operator(->)ident(path)operator(,) ident(rb_io_flags_mode)operator(()ident(fptr)operator(->)ident(mode)operator(\)\);) + + reserved(return) ident(io)operator(;) +operator(}) + +ident(VALUE) +ident(rb_file_open)operator(()ident(fname)operator(,) ident(mode)operator(\)) + directive(const) pre_type(char) operator(*)ident(fname)operator(,) operator(*)ident(mode)operator(;) +operator({) + reserved(return) ident(rb_file_open_internal)operator(()ident(io_alloc)operator(()ident(rb_cFile)operator(\),) ident(fname)operator(,) ident(mode)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_file_sysopen_internal)operator(()ident(io)operator(,) ident(fname)operator(,) ident(flags)operator(,) ident(mode)operator(\)) + ident(VALUE) ident(io)operator(;) + pre_type(char) operator(*)ident(fname)operator(;) + pre_type(int) ident(flags)operator(,) ident(mode)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(fd)operator(;) + pre_type(char) operator(*)ident(m)operator(;) + + ident(MakeOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + + ident(fptr)operator(->)ident(path) operator(=) ident(strdup)operator(()ident(fname)operator(\);) + ident(m) operator(=) ident(rb_io_modenum_mode)operator(()ident(flags)operator(\);) + ident(fptr)operator(->)ident(mode) operator(=) ident(rb_io_modenum_flags)operator(()ident(flags)operator(\);) + ident(fd) operator(=) ident(rb_sysopen)operator(()ident(fptr)operator(->)ident(path)operator(,) ident(flags)operator(,) ident(mode)operator(\);) + ident(fptr)operator(->)ident(f) operator(=) ident(rb_fdopen)operator(()ident(fd)operator(,) ident(m)operator(\);) + + reserved(return) ident(io)operator(;) +operator(}) + +ident(VALUE) +ident(rb_file_sysopen)operator(()ident(fname)operator(,) ident(flags)operator(,) ident(mode)operator(\)) + directive(const) pre_type(char) operator(*)ident(fname)operator(;) + pre_type(int) ident(flags)operator(,) ident(mode)operator(;) +operator({) + reserved(return) ident(rb_file_sysopen_internal)operator(()ident(io_alloc)operator(()ident(rb_cFile)operator(\),) ident(fname)operator(,) ident(flags)operator(,) ident(mode)operator(\);) +operator(}) + +preprocessor(#if) ident(defined) operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(DJGPP)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN__)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__VMS)operator(\)) +directive(static) reserved(struct) ident(pipe_list) operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + reserved(struct) ident(pipe_list) operator(*)ident(next)operator(;) +operator(}) operator(*)ident(pipe_list)operator(;) + +directive(static) directive(void) +ident(pipe_add_fptr)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + reserved(struct) ident(pipe_list) operator(*)ident(list)operator(;) + + ident(list) operator(=) ident(ALLOC)operator(()reserved(struct) ident(pipe_list)operator(\);) + ident(list)operator(->)ident(fptr) operator(=) ident(fptr)operator(;) + ident(list)operator(->)ident(next) operator(=) ident(pipe_list)operator(;) + ident(pipe_list) operator(=) ident(list)operator(;) +operator(}) + +directive(static) directive(void) +ident(pipe_del_fptr)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + reserved(struct) ident(pipe_list) operator(*)ident(list) operator(=) ident(pipe_list)operator(;) + reserved(struct) ident(pipe_list) operator(*)ident(tmp)operator(;) + + reserved(if) operator(()ident(list)operator(->)ident(fptr) operator(==) ident(fptr)operator(\)) operator({) + ident(pipe_list) operator(=) ident(list)operator(->)ident(next)operator(;) + ident(free)operator(()ident(list)operator(\);) + reserved(return)operator(;) + operator(}) + + reserved(while) operator(()ident(list)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(list)operator(->)ident(next)operator(->)ident(fptr) operator(==) ident(fptr)operator(\)) operator({) + ident(tmp) operator(=) ident(list)operator(->)ident(next)operator(;) + ident(list)operator(->)ident(next) operator(=) ident(list)operator(->)ident(next)operator(->)ident(next)operator(;) + ident(free)operator(()ident(tmp)operator(\);) + reserved(return)operator(;) + operator(}) + ident(list) operator(=) ident(list)operator(->)ident(next)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(pipe_atexit) ident(_)operator((()directive(void)operator(\)\)) +operator({) + reserved(struct) ident(pipe_list) operator(*)ident(list) operator(=) ident(pipe_list)operator(;) + reserved(struct) ident(pipe_list) operator(*)ident(tmp)operator(;) + + reserved(while) operator(()ident(list)operator(\)) operator({) + ident(tmp) operator(=) ident(list)operator(->)ident(next)operator(;) + ident(rb_io_fptr_finalize)operator(()ident(list)operator(->)ident(fptr)operator(\);) + ident(list) operator(=) ident(tmp)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) ident(pipe_finalize) ident(_)operator((()ident(OpenFile) operator(*)ident(fptr)operator(,)pre_type(int)operator(\)\);) + +directive(static) directive(void) +ident(pipe_finalize)operator(()ident(fptr)operator(,) ident(noraise)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(noraise)operator(;) +operator({) +preprocessor(#if) operator(!)ident(defined) operator(()ident(__CYGWIN__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) + directive(extern) ident(VALUE) ident(rb_last_status)operator(;) + pre_type(int) ident(status)operator(;) + reserved(if) operator(()ident(fptr)operator(->)ident(f)operator(\)) operator({) + ident(status) operator(=) ident(pclose)operator(()ident(fptr)operator(->)ident(f)operator(\);) + operator(}) + reserved(if) operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(status) operator(=) ident(pclose)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + operator(}) + ident(fptr)operator(->)ident(f) operator(=) ident(fptr)operator(->)ident(f2) operator(=) integer(0)operator(;) +preprocessor(#if) ident(defined) ident(DJGPP) + ident(status) operator(<<=) integer(8)operator(;) +preprocessor(#endif) + ident(rb_last_status) operator(=) ident(INT2FIX)operator(()ident(status)operator(\);) +preprocessor(#else) + ident(fptr_finalize)operator(()ident(fptr)operator(,) ident(noraise)operator(\);) +preprocessor(#endif) + ident(pipe_del_fptr)operator(()ident(fptr)operator(\);) +operator(}) +preprocessor(#endif) + +directive(void) +ident(rb_io_synchronized)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_SYNC)operator(;) +operator(}) + +directive(void) +ident(rb_io_unbuffered)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + ident(rb_io_synchronized)operator(()ident(fptr)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(pipe_open)operator(()ident(VALUE) ident(pstr)operator(,) pre_type(char) operator(*)ident(pname)operator(,) pre_type(char) operator(*)ident(mode)operator(\);) + +directive(static) ident(VALUE) +ident(pipe_open)operator(()ident(pstr)operator(,) ident(pname)operator(,) ident(mode)operator(\)) + ident(VALUE) ident(pstr)operator(;) + pre_type(char) operator(*)ident(pname)operator(,) operator(*)ident(mode)operator(;) +operator({) + pre_type(int) ident(modef) operator(=) ident(rb_io_mode_flags)operator(()ident(mode)operator(\);) + ident(OpenFile) operator(*)ident(fptr)operator(;) +preprocessor(#if) ident(defined)operator(()ident(DJGPP)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__VMS)operator(\)) + ident(FILE) operator(*)ident(f)operator(;) +preprocessor(#else) + pre_type(int) ident(pid)operator(;) +preprocessor(#ifdef) ident(_WIN32) + ident(FILE) operator(*)ident(fpr)operator(,) operator(*)ident(fpw)operator(;) +preprocessor(#else) + pre_type(int) ident(pr)operator([)integer(2)operator(],) ident(pw)operator([)integer(2)operator(];) +preprocessor(#endif) +preprocessor(#endif) + directive(volatile) pre_type(int) ident(doexec)operator(;) + + reserved(if) operator((!)ident(pname)operator(\)) ident(pname) operator(=) ident(StringValueCStr)operator(()ident(pstr)operator(\);) + ident(doexec) operator(=) operator(()ident(strcmp)operator(()string<delimiter(")content(-)delimiter(")>operator(,) ident(pname)operator(\)) operator(!=) integer(0)operator(\);) + +preprocessor(#if) ident(defined)operator(()ident(DJGPP)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__VMS)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) + reserved(if) operator((!)ident(doexec)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eNotImpError)operator(,) + string<delimiter(")content(fork(\) function is unimplemented on this machine)delimiter(")>operator(\);) + operator(}) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(DJGPP)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__VMS)operator(\)) + ident(f) operator(=) ident(popen)operator(()ident(pname)operator(,) ident(mode)operator(\);) + + reserved(if) operator((!)ident(f)operator(\)) ident(rb_sys_fail)operator(()ident(pname)operator(\);) + reserved(else) operator({) + ident(VALUE) ident(port) operator(=) ident(io_alloc)operator(()ident(rb_cIO)operator(\);) + + ident(MakeOpenFile)operator(()ident(port)operator(,) ident(fptr)operator(\);) + ident(fptr)operator(->)ident(finalize) operator(=) ident(pipe_finalize)operator(;) + ident(fptr)operator(->)ident(mode) operator(=) ident(modef)operator(;) + + ident(pipe_add_fptr)operator(()ident(fptr)operator(\);) + reserved(if) operator(()ident(modef) operator(&) ident(FMODE_READABLE)operator(\)) ident(fptr)operator(->)ident(f) operator(=) ident(f)operator(;) + reserved(if) operator(()ident(modef) operator(&) ident(FMODE_WRITABLE)operator(\)) operator({) + reserved(if) operator(()ident(fptr)operator(->)ident(f)operator(\)) ident(fptr)operator(->)ident(f2) operator(=) ident(f)operator(;) + reserved(else) ident(fptr)operator(->)ident(f) operator(=) ident(f)operator(;) + ident(rb_io_synchronized)operator(()ident(fptr)operator(\);) + operator(}) + reserved(return) operator(()ident(VALUE)operator(\))ident(port)operator(;) + operator(}) +preprocessor(#else) +preprocessor(#ifdef) ident(_WIN32) +label(retry)operator(:) + ident(pid) operator(=) ident(pipe_exec)operator(()ident(pname)operator(,) ident(rb_io_mode_modenum)operator(()ident(mode)operator(\),) operator(&)ident(fpr)operator(,) operator(&)ident(fpw)operator(\);) + reserved(if) operator(()ident(pid) operator(==) operator(-)integer(1)operator(\)) operator({) comment(/* exec failed */) + reserved(if) operator(()ident(errno) operator(==) ident(EAGAIN)operator(\)) operator({) + ident(rb_thread_sleep)operator(()integer(1)operator(\);) + reserved(goto) ident(retry)operator(;) + operator(}) + ident(rb_sys_fail)operator(()ident(pname)operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(port) operator(=) ident(io_alloc)operator(()ident(rb_cIO)operator(\);) + + ident(MakeOpenFile)operator(()ident(port)operator(,) ident(fptr)operator(\);) + ident(fptr)operator(->)ident(mode) operator(=) ident(modef)operator(;) + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_SYNC)operator(;) + ident(fptr)operator(->)ident(pid) operator(=) ident(pid)operator(;) + + reserved(if) operator(()ident(modef) operator(&) ident(FMODE_READABLE)operator(\)) operator({) + ident(fptr)operator(->)ident(f) operator(=) ident(fpr)operator(;) + operator(}) + reserved(if) operator(()ident(modef) operator(&) ident(FMODE_WRITABLE)operator(\)) operator({) + reserved(if) operator(()ident(fptr)operator(->)ident(f)operator(\)) ident(fptr)operator(->)ident(f2) operator(=) ident(fpw)operator(;) + reserved(else) ident(fptr)operator(->)ident(f) operator(=) ident(fpw)operator(;) + operator(}) + ident(fptr)operator(->)ident(finalize) operator(=) ident(pipe_finalize)operator(;) + ident(pipe_add_fptr)operator(()ident(fptr)operator(\);) + reserved(return) operator(()ident(VALUE)operator(\))ident(port)operator(;) + operator(}) +preprocessor(#else) + reserved(if) operator(((()ident(modef) operator(&) ident(FMODE_READABLE)operator(\)) operator(&&) ident(pipe)operator(()ident(pr)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator(||) + operator((()ident(modef) operator(&) ident(FMODE_WRITABLE)operator(\)) operator(&&) ident(pipe)operator(()ident(pw)operator(\)) operator(==) operator(-)integer(1)operator(\)\)) + ident(rb_sys_fail)operator(()ident(pname)operator(\);) + + reserved(if) operator((!)ident(doexec)operator(\)) operator({) + ident(fflush)operator(()ident(stdin)operator(\);) comment(/* is it really needed? */) + ident(fflush)operator(()ident(stdout)operator(\);) + ident(fflush)operator(()ident(stderr)operator(\);) + operator(}) + + label(retry)operator(:) + reserved(switch) operator((()ident(pid) operator(=) ident(fork)operator((\)\)\)) operator({) + reserved(case) integer(0)operator(:) comment(/* child */) + reserved(if) operator(()ident(modef) operator(&) ident(FMODE_READABLE)operator(\)) operator({) + ident(close)operator(()ident(pr)operator([)integer(0)operator(]\);) + reserved(if) operator(()ident(pr)operator([)integer(1)operator(]) operator(!=) integer(1)operator(\)) operator({) + ident(dup2)operator(()ident(pr)operator([)integer(1)operator(],) integer(1)operator(\);) + ident(close)operator(()ident(pr)operator([)integer(1)operator(]\);) + operator(}) + operator(}) + reserved(if) operator(()ident(modef) operator(&) ident(FMODE_WRITABLE)operator(\)) operator({) + ident(close)operator(()ident(pw)operator([)integer(1)operator(]\);) + reserved(if) operator(()ident(pw)operator([)integer(0)operator(]) operator(!=) integer(0)operator(\)) operator({) + ident(dup2)operator(()ident(pw)operator([)integer(0)operator(],) integer(0)operator(\);) + ident(close)operator(()ident(pw)operator([)integer(0)operator(]\);) + operator(}) + operator(}) + + reserved(if) operator(()ident(doexec)operator(\)) operator({) + pre_type(int) ident(fd)operator(;) + + reserved(for) operator(()ident(fd) operator(=) integer(3)operator(;) ident(fd) operator(<) ident(NOFILE)operator(;) ident(fd)operator(++\)) + ident(close)operator(()ident(fd)operator(\);) + ident(rb_proc_exec)operator(()ident(pname)operator(\);) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content(%s:%d: command not found: %s)char(\\n)delimiter(")>operator(,) + ident(ruby_sourcefile)operator(,) ident(ruby_sourceline)operator(,) ident(pname)operator(\);) + ident(_exit)operator(()integer(127)operator(\);) + operator(}) + ident(rb_io_synchronized)operator(()ident(RFILE)operator(()ident(orig_stdout)operator(\)->)ident(fptr)operator(\);) + ident(rb_io_synchronized)operator(()ident(RFILE)operator(()ident(orig_stderr)operator(\)->)ident(fptr)operator(\);) + reserved(return) ident(Qnil)operator(;) + + reserved(case) operator(-)integer(1)operator(:) comment(/* fork failed */) + reserved(if) operator(()ident(errno) operator(==) ident(EAGAIN)operator(\)) operator({) + ident(rb_thread_sleep)operator(()integer(1)operator(\);) + reserved(goto) ident(retry)operator(;) + operator(}) + reserved(else) operator({) + pre_type(int) ident(e) operator(=) ident(errno)operator(;) + reserved(if) operator((()ident(modef) operator(&) ident(FMODE_READABLE)operator(\)\)) operator({) + ident(close)operator(()ident(pr)operator([)integer(0)operator(]\);) + ident(close)operator(()ident(pr)operator([)integer(1)operator(]\);) + operator(}) + reserved(if) operator((()ident(modef) operator(&) ident(FMODE_WRITABLE)operator(\)\)) operator({) + ident(close)operator(()ident(pw)operator([)integer(0)operator(]\);) + ident(close)operator(()ident(pw)operator([)integer(1)operator(]\);) + operator(}) + ident(errno) operator(=) ident(e)operator(;) + ident(rb_sys_fail)operator(()ident(pname)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) comment(/* parent */) + reserved(if) operator(()ident(pid) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()ident(pname)operator(\);) + reserved(else) operator({) + ident(VALUE) ident(port) operator(=) ident(io_alloc)operator(()ident(rb_cIO)operator(\);) + + ident(MakeOpenFile)operator(()ident(port)operator(,) ident(fptr)operator(\);) + ident(fptr)operator(->)ident(mode) operator(=) ident(modef)operator(;) + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_SYNC)operator(;) + ident(fptr)operator(->)ident(pid) operator(=) ident(pid)operator(;) + + reserved(if) operator(()ident(modef) operator(&) ident(FMODE_READABLE)operator(\)) operator({) + ident(close)operator(()ident(pr)operator([)integer(1)operator(]\);) + ident(fptr)operator(->)ident(f) operator(=) ident(rb_fdopen)operator(()ident(pr)operator([)integer(0)operator(],) string<delimiter(")content(r)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(modef) operator(&) ident(FMODE_WRITABLE)operator(\)) operator({) + ident(FILE) operator(*)ident(f) operator(=) ident(rb_fdopen)operator(()ident(pw)operator([)integer(1)operator(],) string<delimiter(")content(w)delimiter(")>operator(\);) + + ident(close)operator(()ident(pw)operator([)integer(0)operator(]\);) + reserved(if) operator(()ident(fptr)operator(->)ident(f)operator(\)) ident(fptr)operator(->)ident(f2) operator(=) ident(f)operator(;) + reserved(else) ident(fptr)operator(->)ident(f) operator(=) ident(f)operator(;) + operator(}) +preprocessor(#if) ident(defined) operator(()ident(__CYGWIN__)operator(\)) + ident(fptr)operator(->)ident(finalize) operator(=) ident(pipe_finalize)operator(;) + ident(pipe_add_fptr)operator(()ident(fptr)operator(\);) +preprocessor(#endif) + reserved(return) ident(port)operator(;) + operator(}) + operator(}) +preprocessor(#endif) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * IO.popen(cmd_string, mode="r" \) => io + * IO.popen(cmd_string, mode="r" \) {|io| block } => obj + * + * Runs the specified command string as a subprocess; the subprocess's + * standard input and output will be connected to the returned + * <code>IO</code> object. If <i>cmd_string</i> starts with a + * ``<code>-</code>'', then a new instance of Ruby is started as the + * subprocess. The default mode for the new file object is ``r'', but + * <i>mode</i> may be set to any of the modes listed in the description + * for class IO. + * + * If a block is given, Ruby will run the command as a child connected + * to Ruby with a pipe. Ruby's end of the pipe will be passed as a + * parameter to the block. + * At the end of block, Ruby close the pipe and sets <code>$?</code>. + * In this case <code>IO::popen</code> returns + * the value of the block. + * + * If a block is given with a <i>cmd_string</i> of ``<code>-</code>'', + * the block will be run in two separate processes: once in the parent, + * and once in a child. The parent process will be passed the pipe + * object as a parameter to the block, the child version of the block + * will be passed <code>nil</code>, and the child's standard in and + * standard out will be connected to the parent through the pipe. Not + * available on all platforms. + * + * f = IO.popen("uname"\) + * p f.readlines + * puts "Parent is #{Process.pid}" + * IO.popen ("date"\) { |f| puts f.gets } + * IO.popen("-"\) {|f| $stderr.puts "#{Process.pid} is here, f is #{f}"} + * p $? + * + * <em>produces:</em> + * + * ["Linux\\n"] + * Parent is 26166 + * Wed Apr 9 08:53:52 CDT 2003 + * 26169 is here, f is + * 26166 is here, f is #<IO:0x401b3d44> + * #<Process::Status: pid=26166,exited(0\)> + */) + +directive(static) ident(VALUE) +ident(rb_io_s_popen)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + pre_type(char) operator(*)ident(mode)operator(;) + ident(VALUE) ident(pname)operator(,) ident(pmode)operator(,) ident(port)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(pname)operator(,) operator(&)ident(pmode)operator(\)) operator(==) integer(1)operator(\)) operator({) + ident(mode) operator(=) string<delimiter(")content(r)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(FIXNUM_P)operator(()ident(pmode)operator(\)\)) operator({) + ident(mode) operator(=) ident(rb_io_modenum_mode)operator(()ident(FIX2INT)operator(()ident(pmode)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(mode) operator(=) ident(rb_io_flags_mode)operator(()ident(rb_io_mode_flags)operator(()ident(StringValueCStr)operator(()ident(pmode)operator(\)\)\);) + operator(}) + ident(SafeStringValue)operator(()ident(pname)operator(\);) + ident(port) operator(=) ident(pipe_open)operator(()ident(pname)operator(,) integer(0)operator(,) ident(mode)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(port)operator(\)\)) operator({) + comment(/* child */) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_yield)operator(()ident(Qnil)operator(\);) + ident(fflush)operator(()ident(stdout)operator(\);) + ident(fflush)operator(()ident(stderr)operator(\);) + ident(_exit)operator(()integer(0)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) + operator(}) + ident(RBASIC)operator(()ident(port)operator(\)->)ident(klass) operator(=) ident(klass)operator(;) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(return) ident(rb_ensure)operator(()ident(rb_yield)operator(,) ident(port)operator(,) ident(io_close)operator(,) ident(port)operator(\);) + operator(}) + reserved(return) ident(port)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_open_file)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(fname)operator(,) ident(vmode)operator(,) ident(perm)operator(;) + pre_type(char) operator(*)ident(path)operator(,) operator(*)ident(mode)operator(;) + pre_type(int) ident(flags)operator(;) + pre_type(unsigned) pre_type(int) ident(fmode)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(12)delimiter(")>operator(,) operator(&)ident(fname)operator(,) operator(&)ident(vmode)operator(,) operator(&)ident(perm)operator(\);) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + + ident(path) operator(=) ident(StringValueCStr)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(vmode)operator(\)) operator(||) operator(!)ident(NIL_P)operator(()ident(perm)operator(\)\)) operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(vmode)operator(\)\)) operator({) + ident(flags) operator(=) ident(FIX2INT)operator(()ident(vmode)operator(\);) + operator(}) + reserved(else) operator({) + ident(SafeStringValue)operator(()ident(vmode)operator(\);) + ident(flags) operator(=) ident(rb_io_mode_modenum)operator(()ident(RSTRING)operator(()ident(vmode)operator(\)->)ident(ptr)operator(\);) + operator(}) + ident(fmode) operator(=) ident(NIL_P)operator(()ident(perm)operator(\)) operator(?) oct(0666) operator(:) ident(NUM2UINT)operator(()ident(perm)operator(\);) + + ident(rb_file_sysopen_internal)operator(()ident(io)operator(,) ident(path)operator(,) ident(flags)operator(,) ident(fmode)operator(\);) + operator(}) + reserved(else) operator({) + ident(mode) operator(=) ident(NIL_P)operator(()ident(vmode)operator(\)) operator(?) string<delimiter(")content(r)delimiter(")> operator(:) ident(StringValueCStr)operator(()ident(vmode)operator(\);) + ident(rb_file_open_internal)operator(()ident(io)operator(,) ident(path)operator(,) ident(mode)operator(\);) + operator(}) + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* + * call-seq: + * IO.open(fd, mode_string="r" \) => io + * IO.open(fd, mode_string="r" \) {|io| block } => obj + * + * With no associated block, <code>open</code> is a synonym for + * <code>IO::new</code>. If the optional code block is given, it will + * be passed <i>io</i> as an argument, and the IO object will + * automatically be closed when the block terminates. In this instance, + * <code>IO::open</code> returns the value of the block. + * + */) + +directive(static) ident(VALUE) +ident(rb_io_s_open)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(io) operator(=) ident(rb_class_new_instance)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\);) + + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + reserved(return) ident(rb_ensure)operator(()ident(rb_yield)operator(,) ident(io)operator(,) ident(io_close)operator(,) ident(io)operator(\);) + operator(}) + + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* + * call-seq: + * IO.sysopen(path, [mode, [perm]]\) => fixnum + * + * Opens the given path, returning the underlying file descriptor as a + * <code>Fixnum</code>. + * + * IO.sysopen("testfile"\) #=> 3 + * + */) + +directive(static) ident(VALUE) +ident(rb_io_s_sysopen)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(fname)operator(,) ident(vmode)operator(,) ident(perm)operator(;) + pre_type(int) ident(flags)operator(,) ident(fd)operator(;) + pre_type(unsigned) pre_type(int) ident(fmode)operator(;) + pre_type(char) operator(*)ident(path)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(12)delimiter(")>operator(,) operator(&)ident(fname)operator(,) operator(&)ident(vmode)operator(,) operator(&)ident(perm)operator(\);) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(vmode)operator(\)\)) ident(flags) operator(=) ident(O_RDONLY)operator(;) + reserved(else) reserved(if) operator(()ident(FIXNUM_P)operator(()ident(vmode)operator(\)\)) ident(flags) operator(=) ident(FIX2INT)operator(()ident(vmode)operator(\);) + reserved(else) operator({) + ident(SafeStringValue)operator(()ident(vmode)operator(\);) + ident(flags) operator(=) ident(rb_io_mode_modenum)operator(()ident(RSTRING)operator(()ident(vmode)operator(\)->)ident(ptr)operator(\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(perm)operator(\)\)) ident(fmode) operator(=) oct(0666)operator(;) + reserved(else) ident(fmode) operator(=) ident(NUM2UINT)operator(()ident(perm)operator(\);) + + ident(path) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(strlen)operator(()ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\)+)integer(1)operator(\);) + ident(strcpy)operator(()ident(path)operator(,) ident(RSTRING)operator(()ident(fname)operator(\)->)ident(ptr)operator(\);) + ident(fd) operator(=) ident(rb_sysopen)operator(()ident(path)operator(,) ident(flags)operator(,) ident(fmode)operator(\);) + reserved(return) ident(INT2NUM)operator(()ident(fd)operator(\);) +operator(}) + +comment(/* + * call-seq: + * open(path [, mode [, perm]] \) => io or nil + * open(path [, mode [, perm]] \) {|io| block } => obj + * + * Creates an <code>IO</code> object connected to the given stream, + * file, or subprocess. + * + * If <i>path</i> does not start with a pipe character + * (``<code>|</code>''\), treat it as the name of a file to open using + * the specified mode (defaulting to ``<code>r</code>''\). (See the table + * of valid modes on page 331.\) If a file is being created, its initial + * permissions may be set using the integer third parameter. + * + * If a block is specified, it will be invoked with the + * <code>File</code> object as a parameter, and the file will be + * automatically closed when the block terminates. The call + * returns the value of the block. + * + * If <i>path</i> starts with a pipe character, a subprocess is + * created, connected to the caller by a pair of pipes. The returned + * <code>IO</code> object may be used to write to the standard input + * and read from the standard output of this subprocess. If the command + * following the ``<code>|</code>'' is a single minus sign, Ruby forks, + * and this subprocess is connected to the parent. In the subprocess, + * the <code>open</code> call returns <code>nil</code>. If the command + * is not ``<code>-</code>'', the subprocess runs the command. If a + * block is associated with an <code>open("|-"\)</code> call, that block + * will be run twice---once in the parent and once in the child. The + * block parameter will be an <code>IO</code> object in the parent and + * <code>nil</code> in the child. The parent's <code>IO</code> object + * will be connected to the child's <code>$stdin</code> and + * <code>$stdout</code>. The subprocess will be terminated at the end + * of the block. + * + * open("testfile"\) do |f| + * print f.gets + * end + * + * <em>produces:</em> + * + * This is line one + * + * Open a subprocess and read its output: + * + * cmd = open("|date"\) + * print cmd.gets + * cmd.close + * + * <em>produces:</em> + * + * Wed Apr 9 08:56:31 CDT 2003 + * + * Open a subprocess running the same Ruby program: + * + * f = open("|-", "w+"\) + * if f == nil + * puts "in Child" + * exit + * else + * puts "Got: #{f.gets}" + * end + * + * <em>produces:</em> + * + * Got: in Child + * + * Open a subprocess using a block to receive the I/O object: + * + * open("|-"\) do |f| + * if f == nil + * puts "in Child" + * else + * puts "Got: #{f.gets}" + * end + * end + * + * <em>produces:</em> + * + * Got: in Child + */) + +directive(static) ident(VALUE) +ident(rb_f_open)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(>=) integer(1)operator(\)) operator({) + pre_type(char) operator(*)ident(str) operator(=) ident(StringValuePtr)operator(()ident(argv)operator([)integer(0)operator(]\);) + + reserved(if) operator(()ident(str)operator([)integer(0)operator(]) operator(==) char('|')operator(\)) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_str_new)operator(()ident(str)operator(+)integer(1)operator(,) ident(RSTRING)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(len)operator(-)integer(1)operator(\);) + ident(OBJ_INFECT)operator(()ident(tmp)operator(,) ident(argv)operator([)integer(0)operator(]\);) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(tmp)operator(;) + reserved(return) ident(rb_io_s_popen)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(rb_cIO)operator(\);) + operator(}) + operator(}) + reserved(return) ident(rb_io_s_open)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(rb_cFile)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_io_open)operator(()ident(fname)operator(,) ident(mode)operator(\)) + pre_type(char) operator(*)ident(fname)operator(,) operator(*)ident(mode)operator(;) +operator({) + reserved(if) operator(()ident(fname)operator([)integer(0)operator(]) operator(==) char('|')operator(\)) operator({) + reserved(return) ident(pipe_open)operator(()integer(0)operator(,) ident(fname)operator(+)integer(1)operator(,) ident(mode)operator(\);) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_file_open)operator(()ident(fname)operator(,) ident(mode)operator(\);) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(rb_io_get_io)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + reserved(return) ident(rb_convert_type)operator(()ident(io)operator(,) ident(T_FILE)operator(,) string<delimiter(")content(IO)delimiter(")>operator(,) string<delimiter(")content(to_io)delimiter(")>operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_io_check_io)operator(()ident(io)operator(\)) + ident(VALUE) ident(io)operator(;) +operator({) + reserved(return) ident(rb_check_convert_type)operator(()ident(io)operator(,) ident(T_FILE)operator(,) string<delimiter(")content(IO)delimiter(")>operator(,) string<delimiter(")content(to_io)delimiter(")>operator(\);) +operator(}) + +directive(static) pre_type(char)operator(*) +ident(rb_io_mode_string)operator(()ident(fptr)operator(\)) + ident(OpenFile) operator(*)ident(fptr)operator(;) +operator({) + reserved(switch) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_READWRITE)operator(\)) operator({) + reserved(case) label(FMODE_READABLE)operator(:) + reserved(default)operator(:) + reserved(return) string<delimiter(")content(r)delimiter(")>operator(;) + reserved(case) label(FMODE_WRITABLE)operator(:) + reserved(return) string<delimiter(")content(w)delimiter(")>operator(;) + reserved(case) label(FMODE_READWRITE)operator(:) + reserved(return) string<delimiter(")content(r+)delimiter(")>operator(;) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(io_reopen)operator(()ident(io)operator(,) ident(nfile)operator(\)) + ident(VALUE) ident(io)operator(,) ident(nfile)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(,) operator(*)ident(orig)operator(;) + pre_type(char) operator(*)ident(mode)operator(;) + pre_type(int) ident(fd)operator(,) ident(fd2)operator(;) + ident(off_t) ident(pos) operator(=) integer(0)operator(;) + + ident(nfile) operator(=) ident(rb_io_get_io)operator(()ident(nfile)operator(\);) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4) operator(&&) operator((!)ident(OBJ_TAINTED)operator(()ident(io)operator(\)) operator(||) operator(!)ident(OBJ_TAINTED)operator(()ident(nfile)operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't reopen)delimiter(")>operator(\);) + operator(}) + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(GetOpenFile)operator(()ident(nfile)operator(,) ident(orig)operator(\);) + + reserved(if) operator(()ident(fptr) operator(==) ident(orig)operator(\)) reserved(return) ident(io)operator(;) + reserved(if) operator(()ident(orig)operator(->)ident(mode) operator(&) ident(FMODE_READABLE)operator(\)) operator({) + ident(pos) operator(=) ident(io_tell)operator(()ident(orig)operator(\);) + operator(}) + reserved(if) operator(()ident(orig)operator(->)ident(f2)operator(\)) operator({) + ident(io_fflush)operator(()ident(orig)operator(->)ident(f2)operator(,) ident(orig)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(orig)operator(->)ident(mode) operator(&) ident(FMODE_WRITABLE)operator(\)) operator({) + ident(io_fflush)operator(()ident(orig)operator(->)ident(f)operator(,) ident(orig)operator(\);) + operator(}) + reserved(if) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_WRITABLE)operator(\)) operator({) + ident(io_fflush)operator(()ident(GetWriteFile)operator(()ident(fptr)operator(\),) ident(fptr)operator(\);) + operator(}) + + comment(/* copy OpenFile structure */) + ident(fptr)operator(->)ident(mode) operator(=) ident(orig)operator(->)ident(mode)operator(;) + ident(fptr)operator(->)ident(pid) operator(=) ident(orig)operator(->)ident(pid)operator(;) + ident(fptr)operator(->)ident(lineno) operator(=) ident(orig)operator(->)ident(lineno)operator(;) + reserved(if) operator(()ident(fptr)operator(->)ident(path)operator(\)) ident(free)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(if) operator(()ident(orig)operator(->)ident(path)operator(\)) ident(fptr)operator(->)ident(path) operator(=) ident(strdup)operator(()ident(orig)operator(->)ident(path)operator(\);) + reserved(else) ident(fptr)operator(->)ident(path) operator(=) integer(0)operator(;) + ident(fptr)operator(->)ident(finalize) operator(=) ident(orig)operator(->)ident(finalize)operator(;) + + ident(mode) operator(=) ident(rb_io_mode_string)operator(()ident(fptr)operator(\);) + ident(fd) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(fd2) operator(=) ident(fileno)operator(()ident(orig)operator(->)ident(f)operator(\);) + reserved(if) operator(()ident(fd) operator(!=) ident(fd2)operator(\)) operator({) + reserved(if) operator(()ident(fptr)operator(->)ident(f) operator(==) ident(stdin) operator(||) ident(fptr)operator(->)ident(f) operator(==) ident(stdout) operator(||) ident(fptr)operator(->)ident(f) operator(==) ident(stderr)operator(\)) operator({) + ident(clearerr)operator(()ident(fptr)operator(->)ident(f)operator(\);) + comment(/* need to keep stdio objects */) + reserved(if) operator(()ident(dup2)operator(()ident(fd2)operator(,) ident(fd)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(orig)operator(->)ident(path)operator(\);) + operator(}) + reserved(else) operator({) + ident(FILE) operator(*)ident(f2) operator(=) ident(fptr)operator(->)ident(f2)operator(;) + pre_type(int) ident(m) operator(=) ident(fptr)operator(->)ident(mode)operator(;) + ident(fclose)operator(()ident(fptr)operator(->)ident(f)operator(\);) + ident(fptr)operator(->)ident(f) operator(=) ident(f2)operator(;) + ident(fptr)operator(->)ident(f2) operator(=) pre_constant(NULL)operator(;) + ident(fptr)operator(->)ident(mode) operator(&=) operator(()ident(m) operator(&) ident(FMODE_READABLE)operator(\)) operator(?) operator(~)ident(FMODE_READABLE) operator(:) operator(~)ident(FMODE_WRITABLE)operator(;) + reserved(if) operator(()ident(dup2)operator(()ident(fd2)operator(,) ident(fd)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(orig)operator(->)ident(path)operator(\);) + reserved(if) operator(()ident(f2)operator(\)) operator({) + ident(fptr)operator(->)ident(f) operator(=) ident(rb_fdopen)operator(()ident(fd)operator(,) string<delimiter(")content(r)delimiter(")>operator(\);) + ident(fptr)operator(->)ident(f2) operator(=) ident(f2)operator(;) + operator(}) + reserved(else) operator({) + ident(fptr)operator(->)ident(f) operator(=) ident(rb_fdopen)operator(()ident(fd)operator(,) ident(mode)operator(\);) + operator(}) + ident(fptr)operator(->)ident(mode) operator(=) ident(m)operator(;) + operator(}) + ident(rb_thread_fd_close)operator(()ident(fd)operator(\);) + reserved(if) operator((()ident(orig)operator(->)ident(mode) operator(&) ident(FMODE_READABLE)operator(\)) operator(&&) ident(pos) operator(>=) integer(0)operator(\)) operator({) + ident(io_seek)operator(()ident(fptr)operator(,) ident(pos)operator(,) ident(SEEK_SET)operator(\);) + ident(io_seek)operator(()ident(orig)operator(,) ident(pos)operator(,) ident(SEEK_SET)operator(\);) + operator(}) + operator(}) + + reserved(if) operator(()ident(fptr)operator(->)ident(f2) operator(&&) ident(fd) operator(!=) ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\)\)) operator({) + ident(fd) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + reserved(if) operator((!)ident(orig)operator(->)ident(f2)operator(\)) operator({) + ident(fclose)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + ident(rb_thread_fd_close)operator(()ident(fd)operator(\);) + ident(fptr)operator(->)ident(f2) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(fd) operator(!=) operator(()ident(fd2) operator(=) ident(fileno)operator(()ident(orig)operator(->)ident(f2)operator(\)\)\)) operator({) + ident(fclose)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + ident(rb_thread_fd_close)operator(()ident(fd)operator(\);) + reserved(if) operator(()ident(dup2)operator(()ident(fd2)operator(,) ident(fd)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()ident(orig)operator(->)ident(path)operator(\);) + ident(fptr)operator(->)ident(f2) operator(=) ident(rb_fdopen)operator(()ident(fd)operator(,) string<delimiter(")content(w)delimiter(")>operator(\);) + operator(}) + operator(}) + + reserved(if) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_BINMODE)operator(\)) operator({) + ident(rb_io_binmode)operator(()ident(io)operator(\);) + operator(}) + + ident(RBASIC)operator(()ident(io)operator(\)->)ident(klass) operator(=) ident(RBASIC)operator(()ident(nfile)operator(\)->)ident(klass)operator(;) + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.reopen(other_IO\) => ios + * ios.reopen(path, mode_str\) => ios + * + * Reassociates <em>ios</em> with the I/O stream given in + * <i>other_IO</i> or to a new stream opened on <i>path</i>. This may + * dynamically change the actual class of this stream. + * + * f1 = File.new("testfile"\) + * f2 = File.new("testfile"\) + * f2.readlines[0] #=> "This is line one\\n" + * f2.reopen(f1\) #=> #<File:testfile> + * f2.readlines[0] #=> "This is line one\\n" + */) + +directive(static) ident(VALUE) +ident(rb_io_reopen)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(file)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(file)operator(;) +operator({) + ident(VALUE) ident(fname)operator(,) ident(nmode)operator(;) + pre_type(char) operator(*)ident(mode)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(fname)operator(,) operator(&)ident(nmode)operator(\)) operator(==) integer(1)operator(\)) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_io_check_io)operator(()ident(fname)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(return) ident(io_reopen)operator(()ident(file)operator(,) ident(tmp)operator(\);) + operator(}) + operator(}) + + ident(SafeStringValue)operator(()ident(fname)operator(\);) + ident(rb_io_taint_check)operator(()ident(file)operator(\);) + ident(fptr) operator(=) ident(RFILE)operator(()ident(file)operator(\)->)ident(fptr)operator(;) + reserved(if) operator((!)ident(fptr)operator(\)) operator({) + ident(fptr) operator(=) ident(RFILE)operator(()ident(file)operator(\)->)ident(fptr) operator(=) ident(ALLOC)operator(()ident(OpenFile)operator(\);) + ident(MEMZERO)operator(()ident(fptr)operator(,) ident(OpenFile)operator(,) integer(1)operator(\);) + operator(}) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(nmode)operator(\)\)) operator({) + ident(fptr)operator(->)ident(mode) operator(=) ident(rb_io_mode_flags)operator(()ident(StringValueCStr)operator(()ident(nmode)operator(\)\);) + operator(}) + + reserved(if) operator(()ident(fptr)operator(->)ident(path)operator(\)) operator({) + ident(free)operator(()ident(fptr)operator(->)ident(path)operator(\);) + ident(fptr)operator(->)ident(path) operator(=) integer(0)operator(;) + operator(}) + + ident(fptr)operator(->)ident(path) operator(=) ident(strdup)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\)\);) + ident(mode) operator(=) ident(rb_io_flags_mode)operator(()ident(fptr)operator(->)ident(mode)operator(\);) + reserved(if) operator((!)ident(fptr)operator(->)ident(f)operator(\)) operator({) + ident(fptr)operator(->)ident(f) operator(=) ident(rb_fopen)operator(()ident(fptr)operator(->)ident(path)operator(,) ident(mode)operator(\);) + reserved(if) operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(fclose)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + ident(fptr)operator(->)ident(f2) operator(=) integer(0)operator(;) + operator(}) + reserved(return) ident(file)operator(;) + operator(}) + + reserved(if) operator(()ident(freopen)operator(()ident(fptr)operator(->)ident(path)operator(,) ident(mode)operator(,) ident(fptr)operator(->)ident(f)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) +preprocessor(#ifdef) ident(USE_SETVBUF) + reserved(if) operator(()ident(setvbuf)operator(()ident(fptr)operator(->)ident(f)operator(,) pre_constant(NULL)operator(,) ident(_IOFBF)operator(,) integer(0)operator(\)) operator(!=) integer(0)operator(\)) + ident(rb_warn)operator(()string<delimiter(")content(setvbuf(\) can't be honoured for %s)delimiter(")>operator(,) ident(fptr)operator(->)ident(path)operator(\);) +preprocessor(#endif) + + reserved(if) operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator({) + reserved(if) operator(()ident(freopen)operator(()ident(fptr)operator(->)ident(path)operator(,) string<delimiter(")content(w)delimiter(")>operator(,) ident(fptr)operator(->)ident(f2)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + operator(}) + operator(}) + + reserved(return) ident(file)operator(;) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(rb_io_init_copy)operator(()ident(dest)operator(,) ident(io)operator(\)) + ident(VALUE) ident(dest)operator(,) ident(io)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(,) operator(*)ident(orig)operator(;) + pre_type(int) ident(fd)operator(;) + pre_type(char) operator(*)ident(mode)operator(;) + + ident(io) operator(=) ident(rb_io_get_io)operator(()ident(io)operator(\);) + reserved(if) operator(()ident(dest) operator(==) ident(io)operator(\)) reserved(return) ident(dest)operator(;) + ident(GetOpenFile)operator(()ident(io)operator(,) ident(orig)operator(\);) + ident(MakeOpenFile)operator(()ident(dest)operator(,) ident(fptr)operator(\);) + + reserved(if) operator(()ident(orig)operator(->)ident(f2)operator(\)) operator({) + ident(io_fflush)operator(()ident(orig)operator(->)ident(f2)operator(,) ident(orig)operator(\);) + ident(fseeko)operator(()ident(orig)operator(->)ident(f)operator(,) integer(0L)operator(,) ident(SEEK_CUR)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(orig)operator(->)ident(mode) operator(&) ident(FMODE_WRITABLE)operator(\)) operator({) + ident(io_fflush)operator(()ident(orig)operator(->)ident(f)operator(,) ident(orig)operator(\);) + operator(}) + reserved(else) operator({) + ident(fseeko)operator(()ident(orig)operator(->)ident(f)operator(,) integer(0L)operator(,) ident(SEEK_CUR)operator(\);) + operator(}) + + comment(/* copy OpenFile structure */) + ident(fptr)operator(->)ident(mode) operator(=) ident(orig)operator(->)ident(mode)operator(;) + ident(fptr)operator(->)ident(pid) operator(=) ident(orig)operator(->)ident(pid)operator(;) + ident(fptr)operator(->)ident(lineno) operator(=) ident(orig)operator(->)ident(lineno)operator(;) + reserved(if) operator(()ident(orig)operator(->)ident(path)operator(\)) ident(fptr)operator(->)ident(path) operator(=) ident(strdup)operator(()ident(orig)operator(->)ident(path)operator(\);) + ident(fptr)operator(->)ident(finalize) operator(=) ident(orig)operator(->)ident(finalize)operator(;) + + reserved(switch) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_READWRITE)operator(\)) operator({) + reserved(case) label(FMODE_READABLE)operator(:) + reserved(default)operator(:) + ident(mode) operator(=) string<delimiter(")content(r)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) label(FMODE_WRITABLE)operator(:) + ident(mode) operator(=) string<delimiter(")content(w)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) label(FMODE_READWRITE)operator(:) + reserved(if) operator(()ident(orig)operator(->)ident(f2)operator(\)) ident(mode) operator(=) string<delimiter(")content(r)delimiter(")>operator(;) + reserved(else) ident(mode) operator(=) string<delimiter(")content(r+)delimiter(")>operator(;) + reserved(break)operator(;) + operator(}) + ident(fd) operator(=) ident(ruby_dup)operator(()ident(fileno)operator(()ident(orig)operator(->)ident(f)operator(\)\);) + ident(fptr)operator(->)ident(f) operator(=) ident(rb_fdopen)operator(()ident(fd)operator(,) ident(mode)operator(\);) + ident(fseeko)operator(()ident(fptr)operator(->)ident(f)operator(,) ident(ftello)operator(()ident(orig)operator(->)ident(f)operator(\),) ident(SEEK_SET)operator(\);) + reserved(if) operator(()ident(orig)operator(->)ident(f2)operator(\)) operator({) + reserved(if) operator(()ident(fileno)operator(()ident(orig)operator(->)ident(f)operator(\)) operator(!=) ident(fileno)operator(()ident(orig)operator(->)ident(f2)operator(\)\)) operator({) + ident(fd) operator(=) ident(ruby_dup)operator(()ident(fileno)operator(()ident(orig)operator(->)ident(f2)operator(\)\);) + operator(}) + ident(fptr)operator(->)ident(f2) operator(=) ident(rb_fdopen)operator(()ident(fd)operator(,) string<delimiter(")content(w)delimiter(")>operator(\);) + ident(fseeko)operator(()ident(fptr)operator(->)ident(f2)operator(,) ident(ftello)operator(()ident(orig)operator(->)ident(f2)operator(\),) ident(SEEK_SET)operator(\);) + operator(}) + reserved(if) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_BINMODE)operator(\)) operator({) + ident(rb_io_binmode)operator(()ident(dest)operator(\);) + operator(}) + + reserved(return) ident(dest)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.printf(format_string [, obj, ...] \) => nil + * + * Formats and writes to <em>ios</em>, converting parameters under + * control of the format string. See <code>Kernel#sprintf</code> + * for details. + */) + +ident(VALUE) +ident(rb_io_printf)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(out)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) ident(argv)operator([];) + ident(VALUE) ident(out)operator(;) +operator({) + ident(rb_io_write)operator(()ident(out)operator(,) ident(rb_f_sprintf)operator(()ident(argc)operator(,) ident(argv)operator(\)\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * printf(io, string [, obj ... ] \) => nil + * printf(string [, obj ... ] \) => nil + * + * Equivalent to: + * io.write(sprintf(string, obj, ...\) + * or + * $stdout.write(sprintf(string, obj, ...\) + */) + +directive(static) ident(VALUE) +ident(rb_f_printf)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) ident(argv)operator([];) +operator({) + ident(VALUE) ident(out)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(out) operator(=) ident(rb_stdout)operator(;) + operator(}) + reserved(else) operator({) + ident(out) operator(=) ident(argv)operator([)integer(0)operator(];) + ident(argv)operator(++;) + ident(argc)operator(--;) + operator(}) + ident(rb_io_write)operator(()ident(out)operator(,) ident(rb_f_sprintf)operator(()ident(argc)operator(,) ident(argv)operator(\)\);) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.print(\) => nil + * ios.print(obj, ...\) => nil + * + * Writes the given object(s\) to <em>ios</em>. The stream must be + * opened for writing. If the output record separator (<code>$\\\\</code>\) + * is not <code>nil</code>, it will be appended to the output. If no + * arguments are given, prints <code>$_</code>. Objects that aren't + * strings will be converted by calling their <code>to_s</code> method. + * With no argument, prints the contents of the variable <code>$_</code>. + * Returns <code>nil</code>. + * + * $stdout.print("This is ", 100, " percent.\\n"\) + * + * <em>produces:</em> + * + * This is 100 percent. + */) + +ident(VALUE) +ident(rb_io_print)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(out)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(out)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + ident(VALUE) ident(line)operator(;) + + comment(/* if no argument given, print `$_' */) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(argc) operator(=) integer(1)operator(;) + ident(line) operator(=) ident(rb_lastline_get)operator((\);) + ident(argv) operator(=) operator(&)ident(line)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(rb_output_fs)operator(\)) operator(&&) ident(i)operator(>)integer(0)operator(\)) operator({) + ident(rb_io_write)operator(()ident(out)operator(,) ident(rb_output_fs)operator(\);) + operator(}) + reserved(switch) operator(()ident(TYPE)operator(()ident(argv)operator([)ident(i)operator(]\)\)) operator({) + reserved(case) label(T_NIL)operator(:) + ident(rb_io_write)operator(()ident(out)operator(,) ident(rb_str_new2)operator(()string<delimiter(")content(nil)delimiter(")>operator(\)\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_io_write)operator(()ident(out)operator(,) ident(argv)operator([)ident(i)operator(]\);) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(rb_output_rs)operator(\)\)) operator({) + ident(rb_io_write)operator(()ident(out)operator(,) ident(rb_output_rs)operator(\);) + operator(}) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * print(obj, ...\) => nil + * + * Prints each object in turn to <code>$stdout</code>. If the output + * field separator (<code>$,</code>\) is not +nil+, its + * contents will appear between each field. If the output record + * separator (<code>$\\\\</code>\) is not +nil+, it will be + * appended to the output. If no arguments are given, prints + * <code>$_</code>. Objects that aren't strings will be converted by + * calling their <code>to_s</code> method. + * + * print "cat", [1,2,3], 99, "\\n" + * $, = ", " + * $\\ = "\\n" + * print "cat", [1,2,3], 99 + * + * <em>produces:</em> + * + * cat12399 + * cat, 1, 2, 3, 99 + */) + +directive(static) ident(VALUE) +ident(rb_f_print)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(rb_io_print)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(rb_stdout)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.putc(obj\) => obj + * + * If <i>obj</i> is <code>Numeric</code>, write the character whose + * code is <i>obj</i>, otherwise write the first character of the + * string representation of <i>obj</i> to <em>ios</em>. + * + * $stdout.putc "A" + * $stdout.putc 65 + * + * <em>produces:</em> + * + * AA + */) + +directive(static) ident(VALUE) +ident(rb_io_putc)operator(()ident(io)operator(,) ident(ch)operator(\)) + ident(VALUE) ident(io)operator(,) ident(ch)operator(;) +operator({) + pre_type(char) ident(c) operator(=) ident(NUM2CHR)operator(()ident(ch)operator(\);) + + ident(rb_io_write)operator(()ident(io)operator(,) ident(rb_str_new)operator((&)ident(c)operator(,) integer(1)operator(\)\);) + reserved(return) ident(ch)operator(;) +operator(}) + +comment(/* + * call-seq: + * putc(int\) => int + * + * Equivalent to: + * + * $stdout.putc(int\) + */) + +directive(static) ident(VALUE) +ident(rb_f_putc)operator(()ident(recv)operator(,) ident(ch)operator(\)) + ident(VALUE) ident(recv)operator(,) ident(ch)operator(;) +operator({) + reserved(return) ident(rb_io_putc)operator(()ident(rb_stdout)operator(,) ident(ch)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(io_puts_ary)operator(()ident(ary)operator(,) ident(out)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(out)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(tmp) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(tmp)operator(\)\)) operator({) + ident(tmp) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content([...])delimiter(")>operator(\);) + operator(}) + ident(rb_io_puts)operator(()integer(1)operator(,) operator(&)ident(tmp)operator(,) ident(out)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * ios.puts(obj, ...\) => nil + * + * Writes the given objects to <em>ios</em> as with + * <code>IO#print</code>. Writes a record separator (typically a + * newline\) after any that do not already end with a newline sequence. + * If called with an array argument, writes each element on a new line. + * If called without arguments, outputs a single record separator. + * + * $stdout.puts("this", "is", "a", "test"\) + * + * <em>produces:</em> + * + * this + * is + * a + * test + */) + +ident(VALUE) +ident(rb_io_puts)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(out)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(out)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + ident(VALUE) ident(line)operator(;) + + comment(/* if no argument given, print newline. */) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rb_io_write)operator(()ident(out)operator(,) ident(rb_default_rs)operator(\);) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(argv)operator([)ident(i)operator(]\)\)) operator({) + ident(line) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(nil)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(line) operator(=) ident(rb_check_array_type)operator(()ident(argv)operator([)ident(i)operator(]\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(line)operator(\)\)) operator({) + ident(rb_protect_inspect)operator(()ident(io_puts_ary)operator(,) ident(line)operator(,) ident(out)operator(\);) + reserved(continue)operator(;) + operator(}) + ident(line) operator(=) ident(rb_obj_as_string)operator(()ident(argv)operator([)ident(i)operator(]\);) + operator(}) + ident(rb_io_write)operator(()ident(out)operator(,) ident(line)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(line)operator(\)->)ident(len) operator(==) integer(0) operator(||) + ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(line)operator(\)->)ident(len)operator(-)integer(1)operator(]) operator(!=) char('\\n')operator(\)) operator({) + ident(rb_io_write)operator(()ident(out)operator(,) ident(rb_default_rs)operator(\);) + operator(}) + operator(}) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * puts(obj, ...\) => nil + * + * Equivalent to + * + * $stdout.puts(obj, ...\) + */) + +directive(static) ident(VALUE) +ident(rb_f_puts)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(rb_io_puts)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(rb_stdout)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(void) +ident(rb_p)operator(()ident(obj)operator(\)) comment(/* for debug print within C code */) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(rb_io_write)operator(()ident(rb_stdout)operator(,) ident(rb_obj_as_string)operator(()ident(rb_inspect)operator(()ident(obj)operator(\)\)\);) + ident(rb_io_write)operator(()ident(rb_stdout)operator(,) ident(rb_default_rs)operator(\);) +operator(}) + +comment(/* + * call-seq: + * p(obj, ...\) => nil + * + * For each object, directly writes + * _obj_.+inspect+ followed by the current output + * record separator to the program's standard output. + * + * S = Struct.new(:name, :state\) + * s = S['dave', 'TX'] + * p s + * + * <em>produces:</em> + * + * #<S name="dave", state="TX"> + */) + +directive(static) ident(VALUE) +ident(rb_f_p)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(rb_p)operator(()ident(argv)operator([)ident(i)operator(]\);) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(rb_stdout)operator(\)) operator(==) ident(T_FILE)operator(\)) operator({) + ident(rb_io_flush)operator(()ident(rb_stdout)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.display(port=$>\) => nil + * + * Prints <i>obj</i> on the given port (default <code>$></code>\). + * Equivalent to: + * + * def display(port=$>\) + * port.write self + * end + * + * For example: + * + * 1.display + * "cat".display + * [ 4, 5, 6 ].display + * puts + * + * <em>produces:</em> + * + * 1cat456 + */) + +directive(static) ident(VALUE) +ident(rb_obj_display)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + ident(VALUE) ident(out)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(out)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(out) operator(=) ident(rb_stdout)operator(;) + operator(}) + + ident(rb_io_write)operator(()ident(out)operator(,) ident(self)operator(\);) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(void) +ident(rb_write_error2)operator(()ident(mesg)operator(,) ident(len)operator(\)) + directive(const) pre_type(char) operator(*)ident(mesg)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + ident(rb_io_write)operator(()ident(rb_stderr)operator(,) ident(rb_str_new)operator(()ident(mesg)operator(,) ident(len)operator(\)\);) +operator(}) + +directive(void) +ident(rb_write_error)operator(()ident(mesg)operator(\)) + directive(const) pre_type(char) operator(*)ident(mesg)operator(;) +operator({) + ident(rb_write_error2)operator(()ident(mesg)operator(,) ident(strlen)operator(()ident(mesg)operator(\)\);) +operator(}) + +directive(static) directive(void) +ident(must_respond_to)operator(()ident(mid)operator(,) ident(val)operator(,) ident(id)operator(\)) + ident(ID) ident(mid)operator(;) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(val)operator(,) ident(mid)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s must have %s method, %s given)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\),) ident(rb_id2name)operator(()ident(mid)operator(\),) + ident(rb_obj_classname)operator(()ident(val)operator(\)\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(stdout_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(variable)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(variable)operator(;) +operator({) + ident(must_respond_to)operator(()ident(id_write)operator(,) ident(val)operator(,) ident(id)operator(\);) + operator(*)ident(variable) operator(=) ident(val)operator(;) +operator(}) + +directive(static) directive(void) +ident(defout_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(variable)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(variable)operator(;) +operator({) + ident(stdout_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(variable)operator(\);) + ident(rb_warn)operator(()string<delimiter(")content($defout is obsolete; use $stdout instead)delimiter(")>operator(\);) +operator(}) + +directive(static) directive(void) +ident(deferr_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(variable)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(variable)operator(;) +operator({) + ident(stdout_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(variable)operator(\);) + ident(rb_warn)operator(()string<delimiter(")content($deferr is obsolete; use $stderr instead)delimiter(")>operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(prep_stdio)operator(()ident(f)operator(,) ident(mode)operator(,) ident(klass)operator(\)) + ident(FILE) operator(*)ident(f)operator(;) + pre_type(int) ident(mode)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fp)operator(;) + ident(VALUE) ident(io) operator(=) ident(io_alloc)operator(()ident(klass)operator(\);) + + ident(MakeOpenFile)operator(()ident(io)operator(,) ident(fp)operator(\);) +preprocessor(#ifdef) ident(__CYGWIN__) + reserved(if) operator((!)ident(isatty)operator(()ident(fileno)operator(()ident(f)operator(\)\)\)) operator({) + ident(mode) operator(|=) ident(O_BINARY)operator(;) + ident(setmode)operator(()ident(fileno)operator(()ident(f)operator(\),) ident(O_BINARY)operator(\);) + operator(}) +preprocessor(#endif) + ident(fp)operator(->)ident(f) operator(=) ident(f)operator(;) + ident(fp)operator(->)ident(mode) operator(=) ident(mode)operator(;) + + reserved(return) ident(io)operator(;) +operator(}) + +directive(static) directive(void) +ident(prep_path)operator(()ident(io)operator(,) ident(path)operator(\)) + ident(VALUE) ident(io)operator(;) + pre_type(char) operator(*)ident(path)operator(;) +operator({) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(fptr)operator(->)ident(path)operator(\)) ident(rb_bug)operator(()string<delimiter(")content(illegal prep_path(\) call)delimiter(")>operator(\);) + ident(fptr)operator(->)ident(path) operator(=) ident(strdup)operator(()ident(path)operator(\);) +operator(}) + +comment(/* + * call-seq: + * IO.new(fd, mode\) => io + * + * Returns a new <code>IO</code> object (a stream\) for the given + * integer file descriptor and mode string. See also + * <code>IO#fileno</code> and <code>IO::for_fd</code>. + * + * a = IO.new(2,"w"\) # '2' is standard error + * $stderr.puts "Hello" + * a.puts "World" + * + * <em>produces:</em> + * + * Hello + * World + */) + +directive(static) ident(VALUE) +ident(rb_io_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(fnum)operator(,) ident(mode)operator(;) + ident(OpenFile) operator(*)ident(fp)operator(;) + pre_type(int) ident(fd)operator(,) ident(flags)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(fnum)operator(,) operator(&)ident(mode)operator(\);) + ident(fd) operator(=) ident(NUM2INT)operator(()ident(fnum)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(mode)operator(\)\)) operator({) + ident(flags) operator(=) ident(FIX2LONG)operator(()ident(mode)operator(\);) + operator(}) + reserved(else) operator({) + ident(SafeStringValue)operator(()ident(mode)operator(\);) + ident(flags) operator(=) ident(rb_io_mode_modenum)operator(()ident(StringValueCStr)operator(()ident(mode)operator(\)\);) + operator(}) + operator(}) + reserved(else) operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_FCNTL)operator(\)) operator(&&) ident(defined)operator(()ident(F_GETFL)operator(\)) + ident(flags) operator(=) ident(fcntl)operator(()ident(fd)operator(,) ident(F_GETFL)operator(\);) + reserved(if) operator(()ident(flags) operator(==) operator(-)integer(1)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(flags) operator(=) ident(O_RDONLY)operator(;) +preprocessor(#endif) + operator(}) + ident(MakeOpenFile)operator(()ident(io)operator(,) ident(fp)operator(\);) + ident(fp)operator(->)ident(mode) operator(=) ident(rb_io_modenum_flags)operator(()ident(flags)operator(\);) + ident(fp)operator(->)ident(f) operator(=) ident(rb_fdopen)operator(()ident(fd)operator(,) ident(rb_io_modenum_mode)operator(()ident(flags)operator(\)\);) + + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* + * call-seq: + * File.new(filename, mode="r"\) => file + * File.new(filename [, mode [, perm]]\) => file + * + + * Opens the file named by _filename_ according to + * _mode_ (default is ``r''\) and returns a new + * <code>File</code> object. See the description of class +IO+ for + * a description of _mode_. The file mode may optionally be + * specified as a +Fixnum+ by _or_-ing together the + * flags (O_RDONLY etc, again described under +IO+\). Optional + * permission bits may be given in _perm_. These mode and permission + * bits are platform dependent; on Unix systems, see + * <code>open(2\)</code> for details. + * + * f = File.new("testfile", "r"\) + * f = File.new("newfile", "w+"\) + * f = File.new("newfile", File::CREAT|File::TRUNC|File::RDWR, 0644\) + */) + +directive(static) ident(VALUE) +ident(rb_file_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + reserved(if) operator(()ident(RFILE)operator(()ident(io)operator(\)->)ident(fptr)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(reinitializing File)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()integer(0) operator(<) ident(argc) operator(&&) ident(argc) operator(<) integer(3)operator(\)) operator({) + ident(VALUE) ident(fd) operator(=) ident(rb_check_convert_type)operator(()ident(argv)operator([)integer(0)operator(],) ident(T_FIXNUM)operator(,) string<delimiter(")content(Fixnum)delimiter(")>operator(,) string<delimiter(")content(to_int)delimiter(")>operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(fd)operator(\)\)) operator({) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(fd)operator(;) + reserved(return) ident(rb_io_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\);) + operator(}) + operator(}) + ident(rb_open_file)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\);) + + reserved(return) ident(io)operator(;) +operator(}) + +comment(/* + * call-seq: + * IO.new(fd, mode_string\) => io + * + * Returns a new <code>IO</code> object (a stream\) for the given + * integer file descriptor and mode string. See also + * <code>IO#fileno</code> and <code>IO::for_fd</code>. + * + * a = IO.new(2,"w"\) # '2' is standard error + * $stderr.puts "Hello" + * a.puts "World" + * + * <em>produces:</em> + * + * Hello + * World + */) + +directive(static) ident(VALUE) +ident(rb_io_s_new)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + pre_type(char) operator(*)ident(cname) operator(=) ident(rb_class2name)operator(()ident(klass)operator(\);) + + ident(rb_warn)operator(()string<delimiter(")content(%s::new(\) does not take block; use %s::open(\) instead)delimiter(")>operator(,) + ident(cname)operator(,) ident(cname)operator(\);) + operator(}) + reserved(return) ident(rb_class_new_instance)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\);) +operator(}) + +comment(/* + * call-seq: + * IO.for_fd(fd, mode\) => io + * + * Synonym for <code>IO::new</code>. + * + */) + +directive(static) ident(VALUE) +ident(rb_io_s_for_fd)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(io) operator(=) ident(rb_obj_alloc)operator(()ident(klass)operator(\);) + ident(rb_io_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\);) + reserved(return) ident(io)operator(;) +operator(}) + +directive(static) pre_type(int) ident(binmode) operator(=) integer(0)operator(;) + +directive(static) ident(VALUE) +ident(argf_forward)operator(()pre_type(int) ident(argc)operator(,) ident(VALUE) operator(*)ident(argv)operator(\)) +operator({) + reserved(return) ident(rb_funcall3)operator(()ident(current_file)operator(,) ident(ruby_frame)operator(->)ident(last_func)operator(,) ident(argc)operator(,) ident(argv)operator(\);) +operator(}) + +preprocessor(#define) ident(ARGF_FORWARD)operator(()ident(argc)operator(,) ident(argv)operator(\)) reserved(do) operator({)\ + reserved(if) operator(()ident(TYPE)operator(()ident(current_file)operator(\)) operator(!=) ident(T_FILE)operator(\))\ + reserved(return) ident(argf_forward)operator(()ident(argc)operator(,) ident(argv)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#define) ident(NEXT_ARGF_FORWARD)operator(()ident(argc)operator(,) ident(argv)operator(\)) reserved(do) operator({)\ + reserved(if) operator((!)ident(next_argv)operator((\)\)) reserved(return) ident(Qnil)operator(;)\ + ident(ARGF_FORWARD)operator(()ident(argc)operator(,) ident(argv)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +directive(static) directive(void) +ident(argf_close)operator(()ident(file)operator(\)) + ident(VALUE) ident(file)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(file)operator(\)) operator(==) ident(T_FILE)operator(\)) + ident(rb_io_close)operator(()ident(file)operator(\);) + reserved(else) + ident(rb_funcall3)operator(()ident(file)operator(,) ident(rb_intern)operator(()string<delimiter(")content(close)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(next_argv)operator((\)) +operator({) + directive(extern) ident(VALUE) ident(rb_argv)operator(;) + pre_type(char) operator(*)ident(fn)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(int) ident(stdout_binmode) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(rb_stdout)operator(\)) operator(==) ident(T_FILE)operator(\)) operator({) + ident(GetOpenFile)operator(()ident(rb_stdout)operator(,) ident(fptr)operator(\);) + reserved(if) operator(()ident(fptr)operator(->)ident(mode) operator(&) ident(FMODE_BINMODE)operator(\)) + ident(stdout_binmode) operator(=) integer(1)operator(;) + operator(}) + + reserved(if) operator(()ident(init_p) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(rb_argv)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(next_p) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(next_p) operator(=) operator(-)integer(1)operator(;) + operator(}) + ident(init_p) operator(=) integer(1)operator(;) + ident(gets_lineno) operator(=) integer(0)operator(;) + operator(}) + + reserved(if) operator(()ident(next_p) operator(==) integer(1)operator(\)) operator({) + ident(next_p) operator(=) integer(0)operator(;) + label(retry)operator(:) + reserved(if) operator(()ident(RARRAY)operator(()ident(rb_argv)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(filename) operator(=) ident(rb_ary_shift)operator(()ident(rb_argv)operator(\);) + ident(fn) operator(=) ident(StringValueCStr)operator(()ident(filename)operator(\);) + reserved(if) operator(()ident(strlen)operator(()ident(fn)operator(\)) operator(==) integer(1) operator(&&) ident(fn)operator([)integer(0)operator(]) operator(==) char('-')operator(\)) operator({) + ident(current_file) operator(=) ident(rb_stdin)operator(;) + reserved(if) operator(()ident(ruby_inplace_mode)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(Can't do inplace edit for stdio; skipping)delimiter(")>operator(\);) + reserved(goto) ident(retry)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(FILE) operator(*)ident(fr) operator(=) ident(rb_fopen)operator(()ident(fn)operator(,) string<delimiter(")content(r)delimiter(")>operator(\);) + + reserved(if) operator(()ident(ruby_inplace_mode)operator(\)) operator({) + reserved(struct) ident(stat) ident(st)operator(,) ident(st2)operator(;) + ident(VALUE) ident(str)operator(;) + ident(FILE) operator(*)ident(fw)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(rb_stdout)operator(\)) operator(==) ident(T_FILE) operator(&&) ident(rb_stdout) operator(!=) ident(orig_stdout)operator(\)) operator({) + ident(rb_io_close)operator(()ident(rb_stdout)operator(\);) + operator(}) + ident(fstat)operator(()ident(fileno)operator(()ident(fr)operator(\),) operator(&)ident(st)operator(\);) + reserved(if) operator((*)ident(ruby_inplace_mode)operator(\)) operator({) + ident(str) operator(=) ident(rb_str_new2)operator(()ident(fn)operator(\);) +preprocessor(#ifdef) ident(NO_LONG_FNAME) + ident(ruby_add_suffix)operator(()ident(str)operator(,) ident(ruby_inplace_mode)operator(\);) +preprocessor(#else) + ident(rb_str_cat2)operator(()ident(str)operator(,) ident(ruby_inplace_mode)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(NO_SAFE_RENAME) + operator(()directive(void)operator(\))ident(fclose)operator(()ident(fr)operator(\);) + operator(()directive(void)operator(\))ident(unlink)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + operator(()directive(void)operator(\))ident(rename)operator(()ident(fn)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(fr) operator(=) ident(rb_fopen)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) string<delimiter(")content(r)delimiter(")>operator(\);) +preprocessor(#else) + reserved(if) operator(()ident(rename)operator(()ident(fn)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(Can't rename %s to %s: %s, skipping file)delimiter(")>operator(,) + ident(fn)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(strerror)operator(()ident(errno)operator(\)\);) + ident(fclose)operator(()ident(fr)operator(\);) + reserved(goto) ident(retry)operator(;) + operator(}) +preprocessor(#endif) + operator(}) + reserved(else) operator({) +preprocessor(#ifdef) ident(NO_SAFE_RENAME) + ident(rb_fatal)operator(()string<delimiter(")content(Can't do inplace edit without backup)delimiter(")>operator(\);) +preprocessor(#else) + reserved(if) operator(()ident(unlink)operator(()ident(fn)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(Can't remove %s: %s, skipping file)delimiter(")>operator(,) + ident(fn)operator(,) ident(strerror)operator(()ident(errno)operator(\)\);) + ident(fclose)operator(()ident(fr)operator(\);) + reserved(goto) ident(retry)operator(;) + operator(}) +preprocessor(#endif) + operator(}) + ident(fw) operator(=) ident(rb_fopen)operator(()ident(fn)operator(,) string<delimiter(")content(w)delimiter(")>operator(\);) +preprocessor(#ifndef) ident(NO_SAFE_RENAME) + ident(fstat)operator(()ident(fileno)operator(()ident(fw)operator(\),) operator(&)ident(st2)operator(\);) +preprocessor(#ifdef) ident(HAVE_FCHMOD) + ident(fchmod)operator(()ident(fileno)operator(()ident(fw)operator(\),) ident(st)operator(.)ident(st_mode)operator(\);) +preprocessor(#else) + ident(chmod)operator(()ident(fn)operator(,) ident(st)operator(.)ident(st_mode)operator(\);) +preprocessor(#endif) + reserved(if) operator(()ident(st)operator(.)ident(st_uid)operator(!=)ident(st2)operator(.)ident(st_uid) operator(||) ident(st)operator(.)ident(st_gid)operator(!=)ident(st2)operator(.)ident(st_gid)operator(\)) operator({) + ident(fchown)operator(()ident(fileno)operator(()ident(fw)operator(\),) ident(st)operator(.)ident(st_uid)operator(,) ident(st)operator(.)ident(st_gid)operator(\);) + operator(}) +preprocessor(#endif) + ident(rb_stdout) operator(=) ident(prep_stdio)operator(()ident(fw)operator(,) ident(FMODE_WRITABLE)operator(,) ident(rb_cFile)operator(\);) + ident(prep_path)operator(()ident(rb_stdout)operator(,) ident(fn)operator(\);) + reserved(if) operator(()ident(stdout_binmode)operator(\)) ident(rb_io_binmode)operator(()ident(rb_stdout)operator(\);) + operator(}) + ident(current_file) operator(=) ident(prep_stdio)operator(()ident(fr)operator(,) ident(FMODE_READABLE)operator(,) ident(rb_cFile)operator(\);) + ident(prep_path)operator(()ident(current_file)operator(,) ident(fn)operator(\);) + operator(}) + reserved(if) operator(()ident(binmode)operator(\)) ident(rb_io_binmode)operator(()ident(current_file)operator(\);) + operator(}) + reserved(else) operator({) + ident(next_p) operator(=) integer(1)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(next_p) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(current_file) operator(=) ident(rb_stdin)operator(;) + ident(filename) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(-)delimiter(")>operator(\);) + reserved(if) operator(()ident(ruby_inplace_mode)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(Can't do inplace edit for stdio)delimiter(")>operator(\);) + ident(rb_stdout) operator(=) ident(orig_stdout)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_getline)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(line)operator(;) + + label(retry)operator(:) + reserved(if) operator((!)ident(next_argv)operator((\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(argc) operator(==) integer(0) operator(&&) ident(rb_rs) operator(==) ident(rb_default_rs)operator(\)) operator({) + ident(line) operator(=) ident(rb_io_gets)operator(()ident(current_file)operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(rs)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rs) operator(=) ident(rb_rs)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(1)delimiter(")>operator(,) operator(&)ident(rs)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(rs)operator(\)\)) ident(StringValue)operator(()ident(rs)operator(\);) + operator(}) + ident(line) operator(=) ident(rb_io_getline)operator(()ident(rs)operator(,) ident(current_file)operator(\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(line)operator(\)) operator(&&) ident(next_p) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(argf_close)operator(()ident(current_file)operator(\);) + ident(next_p) operator(=) integer(1)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(line)operator(\)\)) operator({) + ident(gets_lineno)operator(++;) + ident(lineno) operator(=) ident(INT2FIX)operator(()ident(gets_lineno)operator(\);) + operator(}) + reserved(return) ident(line)operator(;) +operator(}) + +comment(/* + * call-seq: + * gets(separator=$/\) => string or nil + * + * Returns (and assigns to <code>$_</code>\) the next line from the list + * of files in +ARGV+ (or <code>$*</code>\), or from standard + * input if no files are present on the command line. Returns + * +nil+ at end of file. The optional argument specifies the + * record separator. The separator is included with the contents of + * each record. A separator of +nil+ reads the entire + * contents, and a zero-length separator reads the input one paragraph + * at a time, where paragraphs are divided by two consecutive newlines. + * If multiple filenames are present in +ARGV+, + * +gets(nil\)+ will read the contents one file at a time. + * + * ARGV << "testfile" + * print while gets + * + * <em>produces:</em> + * + * This is line one + * This is line two + * This is line three + * And so on... + * + * The style of programming using <code>$_</code> as an implicit + * parameter is gradually losing favor in the Ruby community. + */) + +directive(static) ident(VALUE) +ident(rb_f_gets)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(line)operator(;) + + reserved(if) operator((!)ident(next_argv)operator((\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(current_file)operator(\)) operator(!=) ident(T_FILE)operator(\)) operator({) + ident(line) operator(=) ident(rb_funcall3)operator(()ident(current_file)operator(,) ident(rb_intern)operator(()string<delimiter(")content(gets)delimiter(")>operator(\),) ident(argc)operator(,) ident(argv)operator(\);) + operator(}) + reserved(else) operator({) + ident(line) operator(=) ident(argf_getline)operator(()ident(argc)operator(,) ident(argv)operator(\);) + operator(}) + ident(rb_lastline_set)operator(()ident(line)operator(\);) + reserved(return) ident(line)operator(;) +operator(}) + +ident(VALUE) +ident(rb_gets)operator((\)) +operator({) + ident(VALUE) ident(line)operator(;) + + reserved(if) operator(()ident(rb_rs) operator(!=) ident(rb_default_rs)operator(\)) operator({) + reserved(return) ident(rb_f_gets)operator(()integer(0)operator(,) integer(0)operator(\);) + operator(}) + + label(retry)operator(:) + reserved(if) operator((!)ident(next_argv)operator((\)\)) reserved(return) ident(Qnil)operator(;) + ident(line) operator(=) ident(rb_io_gets)operator(()ident(current_file)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(line)operator(\)) operator(&&) ident(next_p) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(argf_close)operator(()ident(current_file)operator(\);) + ident(next_p) operator(=) integer(1)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) + ident(rb_lastline_set)operator(()ident(line)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(line)operator(\)\)) operator({) + ident(gets_lineno)operator(++;) + ident(lineno) operator(=) ident(INT2FIX)operator(()ident(gets_lineno)operator(\);) + operator(}) + + reserved(return) ident(line)operator(;) +operator(}) + +comment(/* + * call-seq: + * readline(separator=$/\) => string + * + * Equivalent to <code>Kernel::gets</code>, except + * +readline+ raises +EOFError+ at end of file. + */) + +directive(static) ident(VALUE) +ident(rb_f_readline)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(line)operator(;) + + reserved(if) operator((!)ident(next_argv)operator((\)\)) ident(rb_eof_error)operator((\);) + ident(ARGF_FORWARD)operator(()ident(argc)operator(,) ident(argv)operator(\);) + ident(line) operator(=) ident(rb_f_gets)operator(()ident(argc)operator(,) ident(argv)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(line)operator(\)\)) operator({) + ident(rb_eof_error)operator((\);) + operator(}) + + reserved(return) ident(line)operator(;) +operator(}) + +comment(/* + * obsolete + */) + +directive(static) ident(VALUE) +ident(rb_f_getc)operator((\)) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(getc is obsolete; use STDIN.getc instead)delimiter(")>operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(rb_stdin)operator(\)) operator(!=) ident(T_FILE)operator(\)) operator({) + reserved(return) ident(rb_funcall3)operator(()ident(rb_stdin)operator(,) ident(rb_intern)operator(()string<delimiter(")content(getc)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(return) ident(rb_io_getc)operator(()ident(rb_stdin)operator(\);) +operator(}) + +comment(/* + * call-seq: + * readlines(separator=$/\) => array + * + * Returns an array containing the lines returned by calling + * <code>Kernel.gets(<i>separator</i>\)</code> until the end of file. + */) + +directive(static) ident(VALUE) +ident(rb_f_readlines)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(line)operator(,) ident(ary)operator(;) + + ident(NEXT_ARGF_FORWARD)operator(()ident(argc)operator(,) ident(argv)operator(\);) + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + reserved(while) operator((!)ident(NIL_P)operator(()ident(line) operator(=) ident(argf_getline)operator(()ident(argc)operator(,) ident(argv)operator(\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(line)operator(\);) + operator(}) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * `cmd` => string + * + * Returns the standard output of running _cmd_ in a subshell. + * The built-in syntax <code>%x{...}</code> uses + * this method. Sets <code>$?</code> to the process status. + * + * `date` #=> "Wed Apr 9 08:56:30 CDT 2003\\n" + * `ls testdir`.split[1] #=> "main.rb" + * `echo oops && exit 99` #=> "oops\\n" + * $?.exitstatus #=> 99 + */) + +directive(static) ident(VALUE) +ident(rb_f_backquote)operator(()ident(obj)operator(,) ident(str)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(str)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(port)operator(;) + ident(VALUE) ident(result)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) + + ident(SafeStringValue)operator(()ident(str)operator(\);) + ident(port) operator(=) ident(pipe_open)operator(()ident(str)operator(,) integer(0)operator(,) string<delimiter(")content(r)delimiter(")>operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(port)operator(\)\)) reserved(return) ident(rb_str_new)operator(()integer(0)operator(,)integer(0)operator(\);) + + ident(GetOpenFile)operator(()ident(port)operator(,) ident(fptr)operator(\);) + ident(result) operator(=) ident(read_all)operator(()ident(fptr)operator(,) ident(remain_size)operator(()ident(fptr)operator(\),) ident(Qnil)operator(\);) + ident(rb_io_close)operator(()ident(port)operator(\);) + + reserved(return) ident(result)operator(;) +operator(}) + +preprocessor(#ifdef) ident(HAVE_SYS_SELECT_H) +preprocessor(#include) include(<sys/select.h>) +preprocessor(#endif) + +comment(/* + * call-seq: + * IO.select(read_array + * [, write_array + * [, error_array + * [, timeout]]] \) => array or nil + * + * See <code>Kernel#select</code>. + */) + +directive(static) ident(VALUE) +ident(rb_f_select)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(read)operator(,) ident(write)operator(,) ident(except)operator(,) ident(timeout)operator(,) ident(res)operator(,) ident(list)operator(;) + ident(fd_set) ident(rset)operator(,) ident(wset)operator(,) ident(eset)operator(,) ident(pset)operator(;) + ident(fd_set) operator(*)ident(rp)operator(,) operator(*)ident(wp)operator(,) operator(*)ident(ep)operator(;) + reserved(struct) ident(timeval) operator(*)ident(tp)operator(,) ident(timerec)operator(;) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(long) ident(i)operator(;) + pre_type(int) ident(max) operator(=) integer(0)operator(,) ident(n)operator(;) + pre_type(int) ident(interrupt_flag) operator(=) integer(0)operator(;) + pre_type(int) ident(pending) operator(=) integer(0)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(13)delimiter(")>operator(,) operator(&)ident(read)operator(,) operator(&)ident(write)operator(,) operator(&)ident(except)operator(,) operator(&)ident(timeout)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(timeout)operator(\)\)) operator({) + ident(tp) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(timerec) operator(=) ident(rb_time_interval)operator(()ident(timeout)operator(\);) + ident(tp) operator(=) operator(&)ident(timerec)operator(;) + operator(}) + + ident(FD_ZERO)operator((&)ident(pset)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(read)operator(\)\)) operator({) + ident(Check_Type)operator(()ident(read)operator(,) ident(T_ARRAY)operator(\);) + ident(rp) operator(=) operator(&)ident(rset)operator(;) + ident(FD_ZERO)operator(()ident(rp)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(read)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(GetOpenFile)operator(()ident(rb_io_get_io)operator(()ident(RARRAY)operator(()ident(read)operator(\)->)ident(ptr)operator([)ident(i)operator(]\),) ident(fptr)operator(\);) + ident(FD_SET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(rp)operator(\);) + reserved(if) operator(()ident(READ_DATA_PENDING)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) operator({) comment(/* check for buffered data */) + ident(pending)operator(++;) + ident(FD_SET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) operator(&)ident(pset)operator(\);) + operator(}) + reserved(if) operator(()ident(max) operator(<) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) ident(max) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\);) + operator(}) + reserved(if) operator(()ident(pending)operator(\)) operator({) comment(/* no blocking if there's buffered data */) + ident(timerec)operator(.)ident(tv_sec) operator(=) ident(timerec)operator(.)ident(tv_usec) operator(=) integer(0)operator(;) + ident(tp) operator(=) operator(&)ident(timerec)operator(;) + operator(}) + operator(}) + reserved(else) + ident(rp) operator(=) integer(0)operator(;) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(write)operator(\)\)) operator({) + ident(Check_Type)operator(()ident(write)operator(,) ident(T_ARRAY)operator(\);) + ident(wp) operator(=) operator(&)ident(wset)operator(;) + ident(FD_ZERO)operator(()ident(wp)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(write)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(GetOpenFile)operator(()ident(rb_io_get_io)operator(()ident(RARRAY)operator(()ident(write)operator(\)->)ident(ptr)operator([)ident(i)operator(]\),) ident(fptr)operator(\);) + ident(FD_SET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(wp)operator(\);) + reserved(if) operator(()ident(max) operator(<) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) ident(max) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\);) + reserved(if) operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(FD_SET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\),) ident(wp)operator(\);) + reserved(if) operator(()ident(max) operator(<) ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\)\)) ident(max) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + operator(}) + operator(}) + operator(}) + reserved(else) + ident(wp) operator(=) integer(0)operator(;) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(except)operator(\)\)) operator({) + ident(Check_Type)operator(()ident(except)operator(,) ident(T_ARRAY)operator(\);) + ident(ep) operator(=) operator(&)ident(eset)operator(;) + ident(FD_ZERO)operator(()ident(ep)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(except)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(GetOpenFile)operator(()ident(rb_io_get_io)operator(()ident(RARRAY)operator(()ident(except)operator(\)->)ident(ptr)operator([)ident(i)operator(]\),) ident(fptr)operator(\);) + ident(FD_SET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(ep)operator(\);) + reserved(if) operator(()ident(max) operator(<) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)\)) ident(max) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\);) + reserved(if) operator(()ident(fptr)operator(->)ident(f2)operator(\)) operator({) + ident(FD_SET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\),) ident(ep)operator(\);) + reserved(if) operator(()ident(max) operator(<) ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\)\)) ident(max) operator(=) ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\);) + operator(}) + operator(}) + operator(}) + reserved(else) operator({) + ident(ep) operator(=) integer(0)operator(;) + operator(}) + + ident(max)operator(++;) + + ident(n) operator(=) ident(rb_thread_select)operator(()ident(max)operator(,) ident(rp)operator(,) ident(wp)operator(,) ident(ep)operator(,) ident(tp)operator(\);) + reserved(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator((!)ident(pending) operator(&&) ident(n) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) comment(/* returns nil on timeout */) + + ident(res) operator(=) ident(rb_ary_new2)operator(()integer(3)operator(\);) + ident(rb_ary_push)operator(()ident(res)operator(,) ident(rp)operator(?)ident(rb_ary_new)operator((\):)ident(rb_ary_new2)operator(()integer(0)operator(\)\);) + ident(rb_ary_push)operator(()ident(res)operator(,) ident(wp)operator(?)ident(rb_ary_new)operator((\):)ident(rb_ary_new2)operator(()integer(0)operator(\)\);) + ident(rb_ary_push)operator(()ident(res)operator(,) ident(ep)operator(?)ident(rb_ary_new)operator((\):)ident(rb_ary_new2)operator(()integer(0)operator(\)\);) + + reserved(if) operator(()ident(interrupt_flag) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(rp)operator(\)) operator({) + ident(list) operator(=) ident(RARRAY)operator(()ident(res)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<) ident(RARRAY)operator(()ident(read)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(GetOpenFile)operator(()ident(rb_io_get_io)operator(()ident(RARRAY)operator(()ident(read)operator(\)->)ident(ptr)operator([)ident(i)operator(]\),) ident(fptr)operator(\);) + reserved(if) operator(()ident(FD_ISSET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(rp)operator(\)) + operator(||) ident(FD_ISSET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) operator(&)ident(pset)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(list)operator(,) ident(rb_ary_entry)operator(()ident(read)operator(,) ident(i)operator(\)\);) + operator(}) + operator(}) + operator(}) + + reserved(if) operator(()ident(wp)operator(\)) operator({) + ident(list) operator(=) ident(RARRAY)operator(()ident(res)operator(\)->)ident(ptr)operator([)integer(1)operator(];) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<) ident(RARRAY)operator(()ident(write)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(GetOpenFile)operator(()ident(rb_io_get_io)operator(()ident(RARRAY)operator(()ident(write)operator(\)->)ident(ptr)operator([)ident(i)operator(]\),) ident(fptr)operator(\);) + reserved(if) operator(()ident(FD_ISSET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(wp)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(list)operator(,) ident(rb_ary_entry)operator(()ident(write)operator(,) ident(i)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(fptr)operator(->)ident(f2) operator(&&) ident(FD_ISSET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\),) ident(wp)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(list)operator(,) ident(rb_ary_entry)operator(()ident(write)operator(,) ident(i)operator(\)\);) + operator(}) + operator(}) + operator(}) + + reserved(if) operator(()ident(ep)operator(\)) operator({) + ident(list) operator(=) ident(RARRAY)operator(()ident(res)operator(\)->)ident(ptr)operator([)integer(2)operator(];) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<) ident(RARRAY)operator(()ident(except)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(GetOpenFile)operator(()ident(rb_io_get_io)operator(()ident(RARRAY)operator(()ident(except)operator(\)->)ident(ptr)operator([)ident(i)operator(]\),) ident(fptr)operator(\);) + reserved(if) operator(()ident(FD_ISSET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(ep)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(list)operator(,) ident(rb_ary_entry)operator(()ident(except)operator(,) ident(i)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(fptr)operator(->)ident(f2) operator(&&) ident(FD_ISSET)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\),) ident(ep)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(list)operator(,) ident(rb_ary_entry)operator(()ident(except)operator(,) ident(i)operator(\)\);) + operator(}) + operator(}) + operator(}) + operator(}) + + reserved(return) ident(res)operator(;) comment(/* returns an empty array on interrupt */) +operator(}) + +preprocessor(#if) operator(!)ident(defined)operator(()ident(MSDOS)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__human68k__)operator(\)) +directive(static) pre_type(int) +ident(io_cntl)operator(()ident(fd)operator(,) ident(cmd)operator(,) ident(narg)operator(,) ident(io_p)operator(\)) + pre_type(int) ident(fd)operator(,) ident(cmd)operator(,) ident(io_p)operator(;) + pre_type(long) ident(narg)operator(;) +operator({) + pre_type(int) ident(retval)operator(;) + +preprocessor(#ifdef) ident(HAVE_FCNTL) + ident(TRAP_BEG)operator(;) +preprocessor(# if) ident(defined)operator(()ident(__CYGWIN__)operator(\)) + ident(retval) operator(=) ident(io_p)operator(?)ident(ioctl)operator(()ident(fd)operator(,) ident(cmd)operator(,) operator(()directive(void)operator(*\))ident(narg)operator(\):)ident(fcntl)operator(()ident(fd)operator(,) ident(cmd)operator(,) ident(narg)operator(\);) +preprocessor(# else) + ident(retval) operator(=) ident(io_p)operator(?)ident(ioctl)operator(()ident(fd)operator(,) ident(cmd)operator(,) ident(narg)operator(\):)ident(fcntl)operator(()ident(fd)operator(,) ident(cmd)operator(,) ident(narg)operator(\);) +preprocessor(# endif) + ident(TRAP_END)operator(;) +preprocessor(#else) + reserved(if) operator((!)ident(io_p)operator(\)) operator({) + ident(rb_notimplement)operator((\);) + operator(}) + ident(TRAP_BEG)operator(;) + ident(retval) operator(=) ident(ioctl)operator(()ident(fd)operator(,) ident(cmd)operator(,) ident(narg)operator(\);) + ident(TRAP_END)operator(;) +preprocessor(#endif) + reserved(return) ident(retval)operator(;) +operator(}) +preprocessor(#endif) + +directive(static) ident(VALUE) +ident(rb_io_ctl)operator(()ident(io)operator(,) ident(req)operator(,) ident(arg)operator(,) ident(io_p)operator(\)) + ident(VALUE) ident(io)operator(,) ident(req)operator(,) ident(arg)operator(;) + pre_type(int) ident(io_p)operator(;) +operator({) +preprocessor(#if) operator(!)ident(defined)operator(()ident(MSDOS)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__human68k__)operator(\)) + pre_type(int) ident(cmd) operator(=) ident(NUM2ULONG)operator(()ident(req)operator(\);) + ident(OpenFile) operator(*)ident(fptr)operator(;) + pre_type(long) ident(len) operator(=) integer(0)operator(;) + pre_type(long) ident(narg) operator(=) integer(0)operator(;) + pre_type(int) ident(retval)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(arg)operator(\)) operator(||) ident(arg) operator(==) ident(Qfalse)operator(\)) operator({) + ident(narg) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(FIXNUM_P)operator(()ident(arg)operator(\)\)) operator({) + ident(narg) operator(=) ident(FIX2LONG)operator(()ident(arg)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(arg) operator(==) ident(Qtrue)operator(\)) operator({) + ident(narg) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_check_string_type)operator(()ident(arg)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + ident(narg) operator(=) ident(NUM2LONG)operator(()ident(arg)operator(\);) + operator(}) + reserved(else) operator({) + ident(arg) operator(=) ident(tmp)operator(;) +preprocessor(#ifdef) ident(IOCPARM_MASK) +preprocessor(#ifndef) ident(IOCPARM_LEN) +preprocessor(#define) ident(IOCPARM_LEN)operator(()ident(x)operator(\)) operator(((()ident(x)operator(\)) operator(>>) integer(16)operator(\)) operator(&) ident(IOCPARM_MASK)operator(\)) +preprocessor(#endif) +preprocessor(#endif) +preprocessor(#ifdef) ident(IOCPARM_LEN) + ident(len) operator(=) ident(IOCPARM_LEN)operator(()ident(cmd)operator(\);) comment(/* on BSDish systems we're safe */) +preprocessor(#else) + ident(len) operator(=) integer(256)operator(;) comment(/* otherwise guess at what's safe */) +preprocessor(#endif) + ident(rb_str_modify)operator(()ident(arg)operator(\);) + + reserved(if) operator(()ident(len) operator(<=) ident(RSTRING)operator(()ident(arg)operator(\)->)ident(len)operator(\)) operator({) + ident(len) operator(=) ident(RSTRING)operator(()ident(arg)operator(\)->)ident(len)operator(;) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(arg)operator(\)->)ident(len) operator(<) ident(len)operator(\)) operator({) + ident(rb_str_resize)operator(()ident(arg)operator(,) ident(len)operator(+)integer(1)operator(\);) + operator(}) + ident(RSTRING)operator(()ident(arg)operator(\)->)ident(ptr)operator([)ident(len)operator(]) operator(=) integer(17)operator(;) comment(/* a little sanity check here */) + ident(narg) operator(=) operator(()pre_type(long)operator(\))ident(RSTRING)operator(()ident(arg)operator(\)->)ident(ptr)operator(;) + operator(}) + operator(}) + ident(GetOpenFile)operator(()ident(io)operator(,) ident(fptr)operator(\);) + ident(retval) operator(=) ident(io_cntl)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\),) ident(cmd)operator(,) ident(narg)operator(,) ident(io_p)operator(\);) + reserved(if) operator(()ident(retval) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()ident(fptr)operator(->)ident(path)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(arg)operator(\)) operator(==) ident(T_STRING) operator(&&) ident(RSTRING)operator(()ident(arg)operator(\)->)ident(ptr)operator([)ident(len)operator(]) operator(!=) integer(17)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(return value overflowed string)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(fptr)operator(->)ident(f2) operator(&&) ident(fileno)operator(()ident(fptr)operator(->)ident(f)operator(\)) operator(!=) ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\)\)) operator({) + comment(/* call on f2 too; ignore result */) + ident(io_cntl)operator(()ident(fileno)operator(()ident(fptr)operator(->)ident(f2)operator(\),) ident(cmd)operator(,) ident(narg)operator(,) ident(io_p)operator(\);) + operator(}) + + reserved(if) operator((!)ident(io_p) operator(&&) ident(cmd) operator(==) ident(F_SETFL)operator(\)) operator({) + reserved(if) operator(()ident(narg) operator(&) ident(O_NONBLOCK)operator(\)) operator({) + ident(fptr)operator(->)ident(mode) operator(|=) ident(FMODE_WSPLIT_INITIALIZED)operator(;) + ident(fptr)operator(->)ident(mode) operator(&=) operator(~)ident(FMODE_WSPLIT)operator(;) + operator(}) + reserved(else) operator({) + ident(fptr)operator(->)ident(mode) operator(&=) operator(~()ident(FMODE_WSPLIT_INITIALIZED)operator(|)ident(FMODE_WSPLIT)operator(\);) + operator(}) + operator(}) + + reserved(return) ident(INT2NUM)operator(()ident(retval)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * ios.ioctl(integer_cmd, arg\) => integer + * + * Provides a mechanism for issuing low-level commands to control or + * query I/O devices. Arguments and results are platform dependent. If + * <i>arg</i> is a number, its value is passed directly. If it is a + * string, it is interpreted as a binary sequence of bytes. On Unix + * platforms, see <code>ioctl(2\)</code> for details. Not implemented on + * all platforms. + */) + +directive(static) ident(VALUE) +ident(rb_io_ioctl)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(req)operator(,) ident(arg)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(req)operator(,) operator(&)ident(arg)operator(\);) + reserved(return) ident(rb_io_ctl)operator(()ident(io)operator(,) ident(req)operator(,) ident(arg)operator(,) integer(1)operator(\);) +operator(}) + +comment(/* + * call-seq: + * ios.fcntl(integer_cmd, arg\) => integer + * + * Provides a mechanism for issuing low-level commands to control or + * query file-oriented I/O streams. Arguments and results are platform + * dependent. If <i>arg</i> is a number, its value is passed + * directly. If it is a string, it is interpreted as a binary sequence + * of bytes (<code>Array#pack</code> might be a useful way to build this + * string\). On Unix platforms, see <code>fcntl(2\)</code> for details. + * Not implemented on all platforms. + */) + +directive(static) ident(VALUE) +ident(rb_io_fcntl)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_FCNTL) + ident(VALUE) ident(req)operator(,) ident(arg)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(req)operator(,) operator(&)ident(arg)operator(\);) + reserved(return) ident(rb_io_ctl)operator(()ident(io)operator(,) ident(req)operator(,) ident(arg)operator(,) integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * syscall(fixnum [, args...]\) => integer + * + * Calls the operating system function identified by _fixnum_, + * passing in the arguments, which must be either +String+ + * objects, or +Integer+ objects that ultimately fit within + * a native +long+. Up to nine parameters may be passed (14 + * on the Atari-ST\). The function identified by _fixnum_ is system + * dependent. On some Unix systems, the numbers may be obtained from a + * header file called <code>syscall.h</code>. + * + * syscall 4, 1, "hello\\n", 6 # '4' is write(2\) on our box + * + * <em>produces:</em> + * + * hello + */) + +directive(static) ident(VALUE) +ident(rb_f_syscall)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SYSCALL)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) +preprocessor(#ifdef) ident(atarist) + pre_type(unsigned) pre_type(long) ident(arg)operator([)integer(14)operator(];) comment(/* yes, we really need that many ! */) +preprocessor(#else) + pre_type(unsigned) pre_type(long) ident(arg)operator([)integer(8)operator(];) +preprocessor(#endif) + pre_type(int) ident(retval) operator(=) operator(-)integer(1)operator(;) + pre_type(int) ident(i) operator(=) integer(1)operator(;) + pre_type(int) ident(items) operator(=) ident(argc) operator(-) integer(1)operator(;) + + comment(/* This probably won't work on machines where sizeof(long\) != sizeof(int\) + * or where sizeof(long\) != sizeof(char*\). But such machines will + * not likely have syscall implemented either, so who cares? + */) + + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(too few arguments for syscall)delimiter(")>operator(\);) + reserved(if) operator(()ident(argc) operator(>) reserved(sizeof)operator(()ident(arg)operator(\)) operator(/) reserved(sizeof)operator(()ident(arg)operator([)integer(0)operator(]\)\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(too many arguments for syscall)delimiter(")>operator(\);) + ident(arg)operator([)integer(0)operator(]) operator(=) ident(NUM2LONG)operator(()ident(argv)operator([)integer(0)operator(]\);) ident(argv)operator(++;) + reserved(while) operator(()ident(items)operator(--\)) operator({) + ident(VALUE) ident(v) operator(=) ident(rb_check_string_type)operator((*)ident(argv)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(v)operator(\)\)) operator({) + ident(StringValue)operator(()ident(v)operator(\);) + ident(rb_str_modify)operator(()ident(v)operator(\);) + ident(arg)operator([)ident(i)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(long)operator(\))ident(StringValueCStr)operator(()ident(v)operator(\);) + operator(}) + reserved(else) operator({) + ident(arg)operator([)ident(i)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(long)operator(\))ident(NUM2LONG)operator((*)ident(argv)operator(\);) + operator(}) + ident(argv)operator(++;) + ident(i)operator(++;) + operator(}) + ident(TRAP_BEG)operator(;) + reserved(switch) operator(()ident(argc)operator(\)) operator({) + reserved(case) integer(1)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(2)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(3)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(4)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(5)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(6)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(],)ident(arg)operator([)integer(5)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(7)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(],)ident(arg)operator([)integer(5)operator(],)ident(arg)operator([)integer(6)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(8)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(],)ident(arg)operator([)integer(5)operator(],)ident(arg)operator([)integer(6)operator(],) + ident(arg)operator([)integer(7)operator(]\);) + reserved(break)operator(;) +preprocessor(#ifdef) ident(atarist) + reserved(case) integer(9)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(],)ident(arg)operator([)integer(5)operator(],)ident(arg)operator([)integer(6)operator(],) + ident(arg)operator([)integer(7)operator(],) ident(arg)operator([)integer(8)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(10)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(],)ident(arg)operator([)integer(5)operator(],)ident(arg)operator([)integer(6)operator(],) + ident(arg)operator([)integer(7)operator(],) ident(arg)operator([)integer(8)operator(],) ident(arg)operator([)integer(9)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(11)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(],)ident(arg)operator([)integer(5)operator(],)ident(arg)operator([)integer(6)operator(],) + ident(arg)operator([)integer(7)operator(],) ident(arg)operator([)integer(8)operator(],) ident(arg)operator([)integer(9)operator(],) ident(arg)operator([)integer(10)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(12)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(],)ident(arg)operator([)integer(5)operator(],)ident(arg)operator([)integer(6)operator(],) + ident(arg)operator([)integer(7)operator(],) ident(arg)operator([)integer(8)operator(],) ident(arg)operator([)integer(9)operator(],) ident(arg)operator([)integer(10)operator(],) ident(arg)operator([)integer(11)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(13)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(],)ident(arg)operator([)integer(5)operator(],)ident(arg)operator([)integer(6)operator(],) + ident(arg)operator([)integer(7)operator(],) ident(arg)operator([)integer(8)operator(],) ident(arg)operator([)integer(9)operator(],) ident(arg)operator([)integer(10)operator(],) ident(arg)operator([)integer(11)operator(],) ident(arg)operator([)integer(12)operator(]\);) + reserved(break)operator(;) + reserved(case) integer(14)operator(:) + ident(retval) operator(=) ident(syscall)operator(()ident(arg)operator([)integer(0)operator(],)ident(arg)operator([)integer(1)operator(],)ident(arg)operator([)integer(2)operator(],)ident(arg)operator([)integer(3)operator(],)ident(arg)operator([)integer(4)operator(],)ident(arg)operator([)integer(5)operator(],)ident(arg)operator([)integer(6)operator(],) + ident(arg)operator([)integer(7)operator(],) ident(arg)operator([)integer(8)operator(],) ident(arg)operator([)integer(9)operator(],) ident(arg)operator([)integer(10)operator(],) ident(arg)operator([)integer(11)operator(],) ident(arg)operator([)integer(12)operator(],) ident(arg)operator([)integer(13)operator(]\);) + reserved(break)operator(;) +preprocessor(#endif) comment(/* atarist */) + operator(}) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(retval) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(return) ident(INT2NUM)operator(()ident(retval)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +directive(static) ident(VALUE) ident(io_new_instance) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(io_new_instance)operator(()ident(args)operator(\)) + ident(VALUE) ident(args)operator(;) +operator({) + reserved(return) ident(rb_class_new_instance)operator(()integer(2)operator(,) operator(()ident(VALUE)operator(*\))ident(args)operator(+)integer(1)operator(,) operator(*()ident(VALUE)operator(*\))ident(args)operator(\);) +operator(}) + +comment(/* + * call-seq: + * IO.pipe -> array + * + * Creates a pair of pipe endpoints (connected to each other\) and + * returns them as a two-element array of <code>IO</code> objects: + * <code>[</code> <i>read_file</i>, <i>write_file</i> <code>]</code>. Not + * available on all platforms. + * + * In the example below, the two processes close the ends of the pipe + * that they are not using. This is not just a cosmetic nicety. The + * read end of a pipe will not generate an end of file condition if + * there are any writers with the pipe still open. In the case of the + * parent process, the <code>rd.read</code> will never return if it + * does not first issue a <code>wr.close</code>. + * + * rd, wr = IO.pipe + * + * if fork + * wr.close + * puts "Parent got: <#{rd.read}>" + * rd.close + * Process.wait + * else + * rd.close + * puts "Sending message to parent" + * wr.write "Hi Dad" + * wr.close + * end + * + * <em>produces:</em> + * + * Sending message to parent + * Parent got: <Hi Dad> + */) + +directive(static) ident(VALUE) +ident(rb_io_s_pipe)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) +preprocessor(#ifndef) ident(__human68k__) + pre_type(int) ident(pipes)operator([)integer(2)operator(],) ident(state)operator(;) + ident(VALUE) ident(r)operator(,) ident(w)operator(,) ident(args)operator([)integer(3)operator(];) + +preprocessor(#ifdef) ident(_WIN32) + reserved(if) operator(()ident(_pipe)operator(()ident(pipes)operator(,) integer(1024)operator(,) ident(O_BINARY)operator(\)) operator(==) operator(-)integer(1)operator(\)) +preprocessor(#else) + reserved(if) operator(()ident(pipe)operator(()ident(pipes)operator(\)) operator(==) operator(-)integer(1)operator(\)) +preprocessor(#endif) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(klass)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(INT2NUM)operator(()ident(pipes)operator([)integer(0)operator(]\);) + ident(args)operator([)integer(2)operator(]) operator(=) ident(INT2FIX)operator(()ident(O_RDONLY)operator(\);) + ident(r) operator(=) ident(rb_protect)operator(()ident(io_new_instance)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(,) operator(&)ident(state)operator(\);) + reserved(if) operator(()ident(state)operator(\)) operator({) + ident(close)operator(()ident(pipes)operator([)integer(0)operator(]\);) + ident(close)operator(()ident(pipes)operator([)integer(1)operator(]\);) + ident(rb_jump_tag)operator(()ident(state)operator(\);) + operator(}) + ident(args)operator([)integer(1)operator(]) operator(=) ident(INT2NUM)operator(()ident(pipes)operator([)integer(1)operator(]\);) + ident(args)operator([)integer(2)operator(]) operator(=) ident(INT2FIX)operator(()ident(O_WRONLY)operator(\);) + ident(w) operator(=) ident(rb_protect)operator(()ident(io_new_instance)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(,) operator(&)ident(state)operator(\);) + reserved(if) operator(()ident(state)operator(\)) operator({) + ident(close)operator(()ident(pipes)operator([)integer(1)operator(]\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(r)operator(\)\)) ident(rb_io_close)operator(()ident(r)operator(\);) + ident(rb_jump_tag)operator(()ident(state)operator(\);) + operator(}) + ident(rb_io_synchronized)operator(()ident(RFILE)operator(()ident(w)operator(\)->)ident(fptr)operator(\);) + + reserved(return) ident(rb_assoc_new)operator(()ident(r)operator(,) ident(w)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + +reserved(struct) ident(foreach_arg) operator({) + pre_type(int) ident(argc)operator(;) + ident(VALUE) ident(sep)operator(;) + ident(VALUE) ident(io)operator(;) +operator(};) + +directive(static) ident(VALUE) +ident(io_s_foreach)operator(()ident(arg)operator(\)) + reserved(struct) ident(foreach_arg) operator(*)ident(arg)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + reserved(while) operator((!)ident(NIL_P)operator(()ident(str) operator(=) ident(rb_io_getline)operator(()ident(arg)operator(->)ident(sep)operator(,) ident(arg)operator(->)ident(io)operator(\)\)\)) operator({) + ident(rb_yield)operator(()ident(str)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * IO.foreach(name, sep_string=$/\) {|line| block } => nil + * + * Executes the block for every line in the named I/O port, where lines + * are separated by <em>sep_string</em>. + * + * IO.foreach("testfile"\) {|x| print "GOT ", x } + * + * <em>produces:</em> + * + * GOT This is line one + * GOT This is line two + * GOT This is line three + * GOT And so on... + */) + +directive(static) ident(VALUE) +ident(rb_io_s_foreach)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(fname)operator(;) + reserved(struct) ident(foreach_arg) ident(arg)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(fname)operator(,) operator(&)ident(arg)operator(.)ident(sep)operator(\);) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(arg)operator(.)ident(sep) operator(=) ident(rb_default_rs)operator(;) + operator(}) + reserved(else) reserved(if) operator((!)ident(NIL_P)operator(()ident(arg)operator(.)ident(sep)operator(\)\)) operator({) + ident(StringValue)operator(()ident(arg)operator(.)ident(sep)operator(\);) + operator(}) + ident(arg)operator(.)ident(io) operator(=) ident(rb_io_open)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) string<delimiter(")content(r)delimiter(")>operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(arg)operator(.)ident(io)operator(\)\)) reserved(return) ident(Qnil)operator(;) + + reserved(return) ident(rb_ensure)operator(()ident(io_s_foreach)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(,) ident(rb_io_close)operator(,) ident(arg)operator(.)ident(io)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(io_s_readlines)operator(()ident(arg)operator(\)) + reserved(struct) ident(foreach_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(return) ident(rb_io_readlines)operator(()ident(arg)operator(->)ident(argc)operator(,) operator(&)ident(arg)operator(->)ident(sep)operator(,) ident(arg)operator(->)ident(io)operator(\);) +operator(}) + +comment(/* + * call-seq: + * IO.readlines(name, sep_string=$/\) => array + * + * Reads the entire file specified by <i>name</i> as individual + * lines, and returns those lines in an array. Lines are separated by + * <i>sep_string</i>. + * + * a = IO.readlines("testfile"\) + * a[0] #=> "This is line one\\n" + * + */) + +directive(static) ident(VALUE) +ident(rb_io_s_readlines)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(fname)operator(;) + reserved(struct) ident(foreach_arg) ident(arg)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(fname)operator(,) operator(&)ident(arg)operator(.)ident(sep)operator(\);) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + + ident(arg)operator(.)ident(argc) operator(=) ident(argc) operator(-) integer(1)operator(;) + ident(arg)operator(.)ident(io) operator(=) ident(rb_io_open)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) string<delimiter(")content(r)delimiter(")>operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(arg)operator(.)ident(io)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(rb_ensure)operator(()ident(io_s_readlines)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(,) ident(rb_io_close)operator(,) ident(arg)operator(.)ident(io)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(io_s_read)operator(()ident(arg)operator(\)) + reserved(struct) ident(foreach_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(return) ident(io_read)operator(()ident(arg)operator(->)ident(argc)operator(,) operator(&)ident(arg)operator(->)ident(sep)operator(,) ident(arg)operator(->)ident(io)operator(\);) +operator(}) + +comment(/* + * call-seq: + * IO.read(name, [length [, offset]] \) => string + * + * Opens the file, optionally seeks to the given offset, then returns + * <i>length</i> bytes (defaulting to the rest of the file\). + * <code>read</code> ensures the file is closed before returning. + * + * IO.read("testfile"\) #=> "This is line one\\nThis is line two\\nThis is line three\\nAnd so on...\\n" + * IO.read("testfile", 20\) #=> "This is line one\\nThi" + * IO.read("testfile", 20, 10\) #=> "ne one\\nThis is line " + */) + +directive(static) ident(VALUE) +ident(rb_io_s_read)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(io)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(io)operator(;) +operator({) + ident(VALUE) ident(fname)operator(,) ident(offset)operator(;) + reserved(struct) ident(foreach_arg) ident(arg)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(12)delimiter(")>operator(,) operator(&)ident(fname)operator(,) operator(&)ident(arg)operator(.)ident(sep)operator(,) operator(&)ident(offset)operator(\);) + ident(SafeStringValue)operator(()ident(fname)operator(\);) + + ident(arg)operator(.)ident(argc) operator(=) ident(argc) operator(?) integer(1) operator(:) integer(0)operator(;) + ident(arg)operator(.)ident(io) operator(=) ident(rb_io_open)operator(()ident(StringValueCStr)operator(()ident(fname)operator(\),) string<delimiter(")content(r)delimiter(")>operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(arg)operator(.)ident(io)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(offset)operator(\)\)) operator({) + ident(rb_io_seek)operator(()ident(arg)operator(.)ident(io)operator(,) ident(offset)operator(,) ident(SEEK_SET)operator(\);) + operator(}) + reserved(return) ident(rb_ensure)operator(()ident(io_s_read)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(,) ident(rb_io_close)operator(,) ident(arg)operator(.)ident(io)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(argf_tell)operator((\)) +operator({) + reserved(if) operator((!)ident(next_argv)operator((\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(no stream to tell)delimiter(")>operator(\);) + operator(}) + ident(ARGF_FORWARD)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(return) ident(rb_io_tell)operator(()ident(current_file)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(argf_seek_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + reserved(if) operator((!)ident(next_argv)operator((\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(no stream to seek)delimiter(")>operator(\);) + operator(}) + ident(ARGF_FORWARD)operator(()ident(argc)operator(,) ident(argv)operator(\);) + reserved(return) ident(rb_io_seek_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(current_file)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(argf_set_pos)operator(()ident(self)operator(,) ident(offset)operator(\)) + ident(VALUE) ident(self)operator(,) ident(offset)operator(;) +operator({) + reserved(if) operator((!)ident(next_argv)operator((\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(no stream to set position)delimiter(")>operator(\);) + operator(}) + ident(ARGF_FORWARD)operator(()integer(1)operator(,) operator(&)ident(offset)operator(\);) + reserved(return) ident(rb_io_set_pos)operator(()ident(current_file)operator(,) ident(offset)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(argf_rewind)operator((\)) +operator({) + reserved(if) operator((!)ident(next_argv)operator((\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(no stream to rewind)delimiter(")>operator(\);) + operator(}) + ident(ARGF_FORWARD)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(return) ident(rb_io_rewind)operator(()ident(current_file)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(argf_fileno)operator((\)) +operator({) + reserved(if) operator((!)ident(next_argv)operator((\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(no stream)delimiter(")>operator(\);) + operator(}) + ident(ARGF_FORWARD)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(return) ident(rb_io_fileno)operator(()ident(current_file)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(argf_to_io)operator((\)) +operator({) + ident(next_argv)operator((\);) + ident(ARGF_FORWARD)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(return) ident(current_file)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_eof)operator((\)) +operator({) + reserved(if) operator(()ident(current_file)operator(\)) operator({) + reserved(if) operator(()ident(init_p) operator(==) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + ident(ARGF_FORWARD)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(rb_io_eof)operator(()ident(current_file)operator(\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_read)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(,) ident(str)operator(,) ident(length)operator(;) + pre_type(long) ident(len) operator(=) integer(0)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(02)delimiter(")>operator(,) operator(&)ident(length)operator(,) operator(&)ident(str)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(length)operator(\)\)) operator({) + ident(len) operator(=) ident(NUM2LONG)operator(()ident(argv)operator([)integer(0)operator(]\);) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(StringValue)operator(()ident(str)operator(\);) + ident(rb_str_resize)operator(()ident(str)operator(,)integer(0)operator(\);) + ident(argv)operator([)integer(1)operator(]) operator(=) ident(Qnil)operator(;) + operator(}) + + label(retry)operator(:) + reserved(if) operator((!)ident(next_argv)operator((\)\)) operator({) + reserved(return) ident(str)operator(;) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(current_file)operator(\)) operator(!=) ident(T_FILE)operator(\)) operator({) + ident(tmp) operator(=) ident(argf_forward)operator(()ident(argc)operator(,) ident(argv)operator(\);) + operator(}) + reserved(else) operator({) + ident(tmp) operator(=) ident(io_read)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(current_file)operator(\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(str)operator(\)\)) ident(str) operator(=) ident(tmp)operator(;) + reserved(else) reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) ident(rb_str_append)operator(()ident(str)operator(,) ident(tmp)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)) operator(||) ident(NIL_P)operator(()ident(length)operator(\)\)) operator({) + reserved(if) operator(()ident(next_p) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(argf_close)operator(()ident(current_file)operator(\);) + ident(next_p) operator(=) integer(1)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(>=) integer(1)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<) ident(len)operator(\)) operator({) + ident(len) operator(-=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(INT2NUM)operator(()ident(len)operator(\);) + reserved(goto) ident(retry)operator(;) + operator(}) + operator(}) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_getc)operator((\)) +operator({) + ident(VALUE) ident(byte)operator(;) + + label(retry)operator(:) + reserved(if) operator((!)ident(next_argv)operator((\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(current_file)operator(\)) operator(!=) ident(T_FILE)operator(\)) operator({) + ident(byte) operator(=) ident(rb_funcall3)operator(()ident(current_file)operator(,) ident(rb_intern)operator(()string<delimiter(")content(getc)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(else) operator({) + ident(byte) operator(=) ident(rb_io_getc)operator(()ident(current_file)operator(\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(byte)operator(\)) operator(&&) ident(next_p) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(argf_close)operator(()ident(current_file)operator(\);) + ident(next_p) operator(=) integer(1)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) + + reserved(return) ident(byte)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_readchar)operator((\)) +operator({) + ident(VALUE) ident(c)operator(;) + + ident(NEXT_ARGF_FORWARD)operator(()integer(0)operator(,) integer(0)operator(\);) + ident(c) operator(=) ident(argf_getc)operator((\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) operator({) + ident(rb_eof_error)operator((\);) + operator(}) + reserved(return) ident(c)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_each_line)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + reserved(if) operator((!)ident(next_argv)operator((\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(current_file)operator(\)) operator(!=) ident(T_FILE)operator(\)) operator({) + reserved(for) operator((;;\)) operator({) + reserved(if) operator((!)ident(next_argv)operator((\)\)) reserved(return) ident(argf)operator(;) + ident(rb_iterate)operator(()ident(rb_each)operator(,) ident(current_file)operator(,) ident(rb_yield)operator(,) integer(0)operator(\);) + ident(next_p) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(while) operator((!)ident(NIL_P)operator(()ident(str) operator(=) ident(argf_getline)operator(()ident(argc)operator(,) ident(argv)operator(\)\)\)) operator({) + ident(rb_yield)operator(()ident(str)operator(\);) + operator(}) + reserved(return) ident(argf)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_each_byte)operator((\)) +operator({) + ident(VALUE) ident(byte)operator(;) + + reserved(while) operator((!)ident(NIL_P)operator(()ident(byte) operator(=) ident(argf_getc)operator((\)\)\)) operator({) + ident(rb_yield)operator(()ident(byte)operator(\);) + operator(}) + reserved(return) ident(argf)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_filename)operator((\)) +operator({) + ident(next_argv)operator((\);) + reserved(return) ident(filename)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_file)operator((\)) +operator({) + ident(next_argv)operator((\);) + reserved(return) ident(current_file)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_binmode)operator((\)) +operator({) + ident(binmode) operator(=) integer(1)operator(;) + ident(next_argv)operator((\);) + ident(ARGF_FORWARD)operator(()integer(0)operator(,) integer(0)operator(\);) + ident(rb_io_binmode)operator(()ident(current_file)operator(\);) + reserved(return) ident(argf)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_skip)operator((\)) +operator({) + reserved(if) operator(()ident(next_p) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(argf_close)operator(()ident(current_file)operator(\);) + ident(next_p) operator(=) integer(1)operator(;) + operator(}) + reserved(return) ident(argf)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_close_m)operator((\)) +operator({) + ident(next_argv)operator((\);) + ident(argf_close)operator(()ident(current_file)operator(\);) + reserved(if) operator(()ident(next_p) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(next_p) operator(=) integer(1)operator(;) + operator(}) + ident(gets_lineno) operator(=) integer(0)operator(;) + reserved(return) ident(argf)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(argf_closed)operator((\)) +operator({) + ident(next_argv)operator((\);) + ident(ARGF_FORWARD)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(return) ident(rb_io_closed)operator(()ident(current_file)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(argf_to_s)operator((\)) +operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(ARGF)delimiter(")>operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(opt_i_get)operator((\)) +operator({) + reserved(if) operator((!)ident(ruby_inplace_mode)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(rb_str_new2)operator(()ident(ruby_inplace_mode)operator(\);) +operator(}) + +directive(static) directive(void) +ident(opt_i_set)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(if) operator((!)ident(RTEST)operator(()ident(val)operator(\)\)) operator({) + reserved(if) operator(()ident(ruby_inplace_mode)operator(\)) ident(free)operator(()ident(ruby_inplace_mode)operator(\);) + ident(ruby_inplace_mode) operator(=) integer(0)operator(;) + reserved(return)operator(;) + operator(}) + ident(StringValue)operator(()ident(val)operator(\);) + reserved(if) operator(()ident(ruby_inplace_mode)operator(\)) ident(free)operator(()ident(ruby_inplace_mode)operator(\);) + ident(ruby_inplace_mode) operator(=) integer(0)operator(;) + ident(ruby_inplace_mode) operator(=) ident(strdup)operator(()ident(StringValueCStr)operator(()ident(val)operator(\)\);) +operator(}) + +comment(/* + * Class <code>IO</code> is the basis for all input and output in Ruby. + * An I/O stream may be <em>duplexed</em> (that is, bidirectional\), and + * so may use more than one native operating system stream. + * + * Many of the examples in this section use class <code>File</code>, + * the only standard subclass of <code>IO</code>. The two classes are + * closely associated. + * + * As used in this section, <em>portname</em> may take any of the + * following forms. + * + * * A plain string represents a filename suitable for the underlying + * operating system. + * + * * A string starting with ``<code>|</code>'' indicates a subprocess. + * The remainder of the string following the ``<code>|</code>'' is + * invoked as a process with appropriate input/output channels + * connected to it. + * + * * A string equal to ``<code>|-</code>'' will create another Ruby + * instance as a subprocess. + * + * Ruby will convert pathnames between different operating system + * conventions if possible. For instance, on a Windows system the + * filename ``<code>/gumby/ruby/test.rb</code>'' will be opened as + * ``<code>\\gumby\\ruby\\test.rb</code>''. When specifying a + * Windows-style filename in a Ruby string, remember to escape the + * backslashes: + * + * "c:\\\\gumby\\\\ruby\\\\test.rb" + * + * Our examples here will use the Unix-style forward slashes; + * <code>File::SEPARATOR</code> can be used to get the + * platform-specific separator character. + * + * I/O ports may be opened in any one of several different modes, which + * are shown in this section as <em>mode</em>. The mode may + * either be a Fixnum or a String. If numeric, it should be + * one of the operating system specific constants (O_RDONLY, + * O_WRONLY, O_RDWR, O_APPEND and so on\). See man open(2\) for + * more information. + * + * If the mode is given as a String, it must be one of the + * values listed in the following table. + * + * Mode | Meaning + * -----+-------------------------------------------------------- + * "r" | Read-only, starts at beginning of file (default mode\). + * -----+-------------------------------------------------------- + * "r+" | Read-write, starts at beginning of file. + * -----+-------------------------------------------------------- + * "w" | Write-only, truncates existing file + * | to zero length or creates a new file for writing. + * -----+-------------------------------------------------------- + * "w+" | Read-write, truncates existing file to zero length + * | or creates a new file for reading and writing. + * -----+-------------------------------------------------------- + * "a" | Write-only, starts at end of file if file exists, + * | otherwise creates a new file for writing. + * -----+-------------------------------------------------------- + * "a+" | Read-write, starts at end of file if file exists, + * | otherwise creates a new file for reading and + * | writing. + * -----+-------------------------------------------------------- + * "b" | (DOS/Windows only\) Binary file mode (may appear with + * | any of the key letters listed above\). + * + * + * The global constant ARGF (also accessible as $<\) provides an + * IO-like stream which allows access to all files mentioned on the + * command line (or STDIN if no files are mentioned\). ARGF provides + * the methods <code>#path</code> and <code>#filename</code> to access + * the name of the file currently being read. + */) + +directive(void) +ident(Init_IO)operator((\)) +operator({) +preprocessor(#ifdef) ident(__CYGWIN__) +preprocessor(#include) include(<sys/cygwin.h>) + directive(static) reserved(struct) ident(__cygwin_perfile) ident(pf)operator([]) operator(=) + operator({) + operator({)string<delimiter(")delimiter(")>operator(,) ident(O_RDONLY) operator(|) ident(O_BINARY)operator(},) + operator({)string<delimiter(")delimiter(")>operator(,) ident(O_WRONLY) operator(|) ident(O_BINARY)operator(},) + operator({)string<delimiter(")delimiter(")>operator(,) ident(O_RDWR) operator(|) ident(O_BINARY)operator(},) + operator({)string<delimiter(")delimiter(")>operator(,) ident(O_APPEND) operator(|) ident(O_BINARY)operator(},) + operator({)pre_constant(NULL)operator(,) integer(0)operator(}) + operator(};) + ident(cygwin_internal)operator(()ident(CW_PERFILE)operator(,) ident(pf)operator(\);) +preprocessor(#endif) + + ident(rb_eIOError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(IOError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_eEOFError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(EOFError)delimiter(")>operator(,) ident(rb_eIOError)operator(\);) + + ident(id_write) operator(=) ident(rb_intern)operator(()string<delimiter(")content(write)delimiter(")>operator(\);) + ident(id_read) operator(=) ident(rb_intern)operator(()string<delimiter(")content(read)delimiter(")>operator(\);) + ident(id_getc) operator(=) ident(rb_intern)operator(()string<delimiter(")content(getc)delimiter(")>operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(syscall)delimiter(")>operator(,) ident(rb_f_syscall)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(open)delimiter(")>operator(,) ident(rb_f_open)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(printf)delimiter(")>operator(,) ident(rb_f_printf)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(print)delimiter(")>operator(,) ident(rb_f_print)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(putc)delimiter(")>operator(,) ident(rb_f_putc)operator(,) integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(puts)delimiter(")>operator(,) ident(rb_f_puts)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(gets)delimiter(")>operator(,) ident(rb_f_gets)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(readline)delimiter(")>operator(,) ident(rb_f_readline)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(getc)delimiter(")>operator(,) ident(rb_f_getc)operator(,) integer(0)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(select)delimiter(")>operator(,) ident(rb_f_select)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(readlines)delimiter(")>operator(,) ident(rb_f_readlines)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(`)delimiter(")>operator(,) ident(rb_f_backquote)operator(,) integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(p)delimiter(")>operator(,) ident(rb_f_p)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(display)delimiter(")>operator(,) ident(rb_obj_display)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_cIO) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(IO)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_include_module)operator(()ident(rb_cIO)operator(,) ident(rb_mEnumerable)operator(\);) + + ident(rb_define_alloc_func)operator(()ident(rb_cIO)operator(,) ident(io_alloc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(rb_io_s_new)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(open)delimiter(")>operator(,) ident(rb_io_s_open)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(sysopen)delimiter(")>operator(,) ident(rb_io_s_sysopen)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(for_fd)delimiter(")>operator(,) ident(rb_io_s_for_fd)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(popen)delimiter(")>operator(,) ident(rb_io_s_popen)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(foreach)delimiter(")>operator(,) ident(rb_io_s_foreach)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(readlines)delimiter(")>operator(,) ident(rb_io_s_readlines)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(read)delimiter(")>operator(,) ident(rb_io_s_read)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(select)delimiter(")>operator(,) ident(rb_f_select)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(pipe)delimiter(")>operator(,) ident(rb_io_s_pipe)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_io_initialize)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_output_fs) operator(=) ident(Qnil)operator(;) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($,)delimiter(")>operator(,) operator(&)ident(rb_output_fs)operator(,) integer(0)operator(,) ident(rb_str_setter)operator(\);) + + ident(rb_global_variable)operator((&)ident(rb_default_rs)operator(\);) + ident(rb_rs) operator(=) ident(rb_default_rs) operator(=) ident(rb_str_new2)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\);) + ident(rb_output_rs) operator(=) ident(Qnil)operator(;) + ident(OBJ_FREEZE)operator(()ident(rb_default_rs)operator(\);) comment(/* avoid modifying RS_default */) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($/)delimiter(")>operator(,) operator(&)ident(rb_rs)operator(,) integer(0)operator(,) ident(rb_str_setter)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($-0)delimiter(")>operator(,) operator(&)ident(rb_rs)operator(,) integer(0)operator(,) ident(rb_str_setter)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($)char(\\\\)delimiter(")>operator(,) operator(&)ident(rb_output_rs)operator(,) integer(0)operator(,) ident(rb_str_setter)operator(\);) + + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($.)delimiter(")>operator(,) operator(&)ident(lineno)operator(,) integer(0)operator(,) ident(lineno_setter)operator(\);) + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($_)delimiter(")>operator(,) ident(rb_lastline_get)operator(,) ident(rb_lastline_set)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_io_init_copy)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(reopen)delimiter(")>operator(,) ident(rb_io_reopen)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(print)delimiter(")>operator(,) ident(rb_io_print)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(putc)delimiter(")>operator(,) ident(rb_io_putc)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(puts)delimiter(")>operator(,) ident(rb_io_puts)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(printf)delimiter(")>operator(,) ident(rb_io_printf)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(each)delimiter(")>operator(,) ident(rb_io_each_line)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(each_line)delimiter(")>operator(,) ident(rb_io_each_line)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(each_byte)delimiter(")>operator(,) ident(rb_io_each_byte)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(syswrite)delimiter(")>operator(,) ident(rb_io_syswrite)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(sysread)delimiter(")>operator(,) ident(rb_io_sysread)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(fileno)delimiter(")>operator(,) ident(rb_io_fileno)operator(,) integer(0)operator(\);) + ident(rb_define_alias)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) string<delimiter(")content(fileno)delimiter(")>operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(to_io)delimiter(")>operator(,) ident(rb_io_to_io)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(fsync)delimiter(")>operator(,) ident(rb_io_fsync)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(sync)delimiter(")>operator(,) ident(rb_io_sync)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(sync=)delimiter(")>operator(,) ident(rb_io_set_sync)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(lineno)delimiter(")>operator(,) ident(rb_io_lineno)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(lineno=)delimiter(")>operator(,) ident(rb_io_set_lineno)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(readlines)delimiter(")>operator(,) ident(rb_io_readlines)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(read_nonblock)delimiter(")>operator(,) ident(io_read_nonblock)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(write_nonblock)delimiter(")>operator(,) ident(rb_io_write_nonblock)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(readpartial)delimiter(")>operator(,) ident(io_readpartial)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(read)delimiter(")>operator(,) ident(io_read)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(io_write)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(gets)delimiter(")>operator(,) ident(rb_io_gets_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(readline)delimiter(")>operator(,) ident(rb_io_readline)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(getc)delimiter(")>operator(,) ident(rb_io_getc)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(readchar)delimiter(")>operator(,) ident(rb_io_readchar)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(ungetc)delimiter(")>operator(,)ident(rb_io_ungetc)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(<<)delimiter(")>operator(,) ident(rb_io_addstr)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(flush)delimiter(")>operator(,) ident(rb_io_flush)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(tell)delimiter(")>operator(,) ident(rb_io_tell)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(seek)delimiter(")>operator(,) ident(rb_io_seek_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_const)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(SEEK_SET)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(SEEK_SET)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(SEEK_CUR)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(SEEK_CUR)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(SEEK_END)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(SEEK_END)operator(\)\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(rewind)delimiter(")>operator(,) ident(rb_io_rewind)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(pos)delimiter(")>operator(,) ident(rb_io_tell)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(pos=)delimiter(")>operator(,) ident(rb_io_set_pos)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(eof)delimiter(")>operator(,) ident(rb_io_eof)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(eof?)delimiter(")>operator(,) ident(rb_io_eof)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(close)delimiter(")>operator(,) ident(rb_io_close_m)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(closed?)delimiter(")>operator(,) ident(rb_io_closed)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(close_read)delimiter(")>operator(,) ident(rb_io_close_read)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(close_write)delimiter(")>operator(,) ident(rb_io_close_write)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(isatty)delimiter(")>operator(,) ident(rb_io_isatty)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(tty?)delimiter(")>operator(,) ident(rb_io_isatty)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(binmode)delimiter(")>operator(,) ident(rb_io_binmode)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(sysseek)delimiter(")>operator(,) ident(rb_io_sysseek)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(ioctl)delimiter(")>operator(,) ident(rb_io_ioctl)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(fcntl)delimiter(")>operator(,) ident(rb_io_fcntl)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(pid)delimiter(")>operator(,) ident(rb_io_pid)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cIO)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_io_inspect)operator(,) integer(0)operator(\);) + + ident(rb_define_variable)operator(()string<delimiter(")content($stdin)delimiter(")>operator(,) operator(&)ident(rb_stdin)operator(\);) + ident(rb_stdin) operator(=) ident(prep_stdio)operator(()ident(stdin)operator(,) ident(FMODE_READABLE)operator(,) ident(rb_cIO)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($stdout)delimiter(")>operator(,) operator(&)ident(rb_stdout)operator(,) integer(0)operator(,) ident(stdout_setter)operator(\);) + ident(rb_stdout) operator(=) ident(prep_stdio)operator(()ident(stdout)operator(,) ident(FMODE_WRITABLE)operator(,) ident(rb_cIO)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($stderr)delimiter(")>operator(,) operator(&)ident(rb_stderr)operator(,) integer(0)operator(,) ident(stdout_setter)operator(\);) + ident(rb_stderr) operator(=) ident(prep_stdio)operator(()ident(stderr)operator(,) ident(FMODE_WRITABLE)operator(,) ident(rb_cIO)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($>)delimiter(")>operator(,) operator(&)ident(rb_stdout)operator(,) integer(0)operator(,) ident(stdout_setter)operator(\);) + ident(orig_stdout) operator(=) ident(rb_stdout)operator(;) + ident(rb_deferr) operator(=) ident(orig_stderr) operator(=) ident(rb_stderr)operator(;) + + comment(/* variables to be removed in 1.8.1 */) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($defout)delimiter(")>operator(,) operator(&)ident(rb_stdout)operator(,) integer(0)operator(,) ident(defout_setter)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($deferr)delimiter(")>operator(,) operator(&)ident(rb_stderr)operator(,) integer(0)operator(,) ident(deferr_setter)operator(\);) + + comment(/* constants to hold original stdin/stdout/stderr */) + ident(rb_define_global_const)operator(()string<delimiter(")content(STDIN)delimiter(")>operator(,) ident(rb_stdin)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(STDOUT)delimiter(")>operator(,) ident(rb_stdout)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(STDERR)delimiter(")>operator(,) ident(rb_stderr)operator(\);) + + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($<)delimiter(")>operator(,) operator(&)ident(argf)operator(\);) + ident(argf) operator(=) ident(rb_obj_alloc)operator(()ident(rb_cObject)operator(\);) + ident(rb_extend_object)operator(()ident(argf)operator(,) ident(rb_mEnumerable)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(ARGF)delimiter(")>operator(,) ident(argf)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(argf_to_s)operator(,) integer(0)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(fileno)delimiter(")>operator(,) ident(argf_fileno)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) ident(argf_fileno)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(to_io)delimiter(")>operator(,) ident(argf_to_io)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(each)delimiter(")>operator(,) ident(argf_each_line)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(each_line)delimiter(")>operator(,) ident(argf_each_line)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(each_byte)delimiter(")>operator(,) ident(argf_each_byte)operator(,) integer(0)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(read)delimiter(")>operator(,) ident(argf_read)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(readlines)delimiter(")>operator(,) ident(rb_f_readlines)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(to_a)delimiter(")>operator(,) ident(rb_f_readlines)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(gets)delimiter(")>operator(,) ident(rb_f_gets)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(readline)delimiter(")>operator(,) ident(rb_f_readline)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(getc)delimiter(")>operator(,) ident(argf_getc)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(readchar)delimiter(")>operator(,) ident(argf_readchar)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(tell)delimiter(")>operator(,) ident(argf_tell)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(seek)delimiter(")>operator(,) ident(argf_seek_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(rewind)delimiter(")>operator(,) ident(argf_rewind)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(pos)delimiter(")>operator(,) ident(argf_tell)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(pos=)delimiter(")>operator(,) ident(argf_set_pos)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(eof)delimiter(")>operator(,) ident(argf_eof)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(eof?)delimiter(")>operator(,) ident(argf_eof)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(binmode)delimiter(")>operator(,) ident(argf_binmode)operator(,) integer(0)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(filename)delimiter(")>operator(,) ident(argf_filename)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(path)delimiter(")>operator(,) ident(argf_filename)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(file)delimiter(")>operator(,) ident(argf_file)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(skip)delimiter(")>operator(,) ident(argf_skip)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(close)delimiter(")>operator(,) ident(argf_close_m)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(closed?)delimiter(")>operator(,) ident(argf_closed)operator(,) integer(0)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(lineno)delimiter(")>operator(,) ident(argf_lineno)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(argf)operator(,) string<delimiter(")content(lineno=)delimiter(")>operator(,) ident(argf_set_lineno)operator(,) integer(1)operator(\);) + + ident(rb_global_variable)operator((&)ident(current_file)operator(\);) + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($FILENAME)delimiter(")>operator(,) operator(&)ident(filename)operator(\);) + ident(filename) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(-)delimiter(")>operator(\);) + + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($-i)delimiter(")>operator(,) ident(opt_i_get)operator(,) ident(opt_i_set)operator(\);) + +preprocessor(#if) ident(defined) operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(DJGPP)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN__)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) + ident(atexit)operator(()ident(pipe_atexit)operator(\);) +preprocessor(#endif) + + ident(Init_File)operator((\);) + + ident(rb_define_method)operator(()ident(rb_cFile)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_file_initialize)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_file_const)operator(()string<delimiter(")content(RDONLY)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_RDONLY)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(WRONLY)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_WRONLY)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(RDWR)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_RDWR)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(APPEND)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_APPEND)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(CREAT)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_CREAT)operator(\)\);) + ident(rb_file_const)operator(()string<delimiter(")content(EXCL)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_EXCL)operator(\)\);) +preprocessor(#if) ident(defined)operator(()ident(O_NDELAY)operator(\)) operator(||) ident(defined)operator(()ident(O_NONBLOCK)operator(\)) +preprocessor(# ifdef) ident(O_NONBLOCK) + ident(rb_file_const)operator(()string<delimiter(")content(NONBLOCK)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_NONBLOCK)operator(\)\);) +preprocessor(# else) + ident(rb_file_const)operator(()string<delimiter(")content(NONBLOCK)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_NDELAY)operator(\)\);) +preprocessor(# endif) +preprocessor(#endif) + ident(rb_file_const)operator(()string<delimiter(")content(TRUNC)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_TRUNC)operator(\)\);) +preprocessor(#ifdef) ident(O_NOCTTY) + ident(rb_file_const)operator(()string<delimiter(")content(NOCTTY)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_NOCTTY)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(O_BINARY) + ident(rb_file_const)operator(()string<delimiter(")content(BINARY)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_BINARY)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(O_SYNC) + ident(rb_file_const)operator(()string<delimiter(")content(SYNC)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(O_SYNC)operator(\)\);) +preprocessor(#endif) +operator(}) +comment(/* C code produced by gperf version 2.7.2 */) +comment(/* Command-line: gperf -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' ./keywords */) +reserved(struct) ident(kwtable) operator({)pre_type(char) operator(*)ident(name)operator(;) pre_type(int) ident(id)operator([)integer(2)operator(];) reserved(enum) ident(lex_state) ident(state)operator(;};) + +preprocessor(#define) ident(TOTAL_KEYWORDS) integer(40) +preprocessor(#define) ident(MIN_WORD_LENGTH) integer(2) +preprocessor(#define) ident(MAX_WORD_LENGTH) integer(8) +preprocessor(#define) ident(MIN_HASH_VALUE) integer(6) +preprocessor(#define) ident(MAX_HASH_VALUE) integer(55) +comment(/* maximum key range = 50, duplicates = 0 */) + +preprocessor(#ifdef) ident(__GNUC__) +ident(__inline) +preprocessor(#else) +preprocessor(#ifdef) ident(__cplusplus) +directive(inline) +preprocessor(#endif) +preprocessor(#endif) +directive(static) pre_type(unsigned) pre_type(int) +ident(hash) operator(()ident(str)operator(,) ident(len)operator(\)) + directive(register) directive(const) pre_type(char) operator(*)ident(str)operator(;) + directive(register) pre_type(unsigned) pre_type(int) ident(len)operator(;) +operator({) + directive(static) pre_type(unsigned) pre_type(char) ident(asso_values)operator([]) operator(=) + operator({) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(11)operator(,) integer(56)operator(,) integer(56)operator(,) integer(36)operator(,) integer(56)operator(,) integer(1)operator(,) integer(37)operator(,) + integer(31)operator(,) integer(1)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(29)operator(,) integer(56)operator(,) integer(1)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(1)operator(,) integer(56)operator(,) integer(32)operator(,) integer(1)operator(,) integer(2)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(4)operator(,) integer(23)operator(,) integer(56)operator(,) integer(17)operator(,) integer(56)operator(,) integer(20)operator(,) integer(9)operator(,) integer(2)operator(,) + integer(9)operator(,) integer(26)operator(,) integer(14)operator(,) integer(56)operator(,) integer(5)operator(,) integer(1)operator(,) integer(1)operator(,) integer(16)operator(,) integer(56)operator(,) integer(21)operator(,) + integer(20)operator(,) integer(9)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) + integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56)operator(,) integer(56) + operator(};) + directive(register) pre_type(int) ident(hval) operator(=) ident(len)operator(;) + + reserved(switch) operator(()ident(hval)operator(\)) + operator({) + reserved(default)operator(:) + reserved(case) integer(3)operator(:) + ident(hval) operator(+=) ident(asso_values)operator([()pre_type(unsigned) pre_type(char)operator(\))ident(str)operator([)integer(2)operator(]];) + reserved(case) integer(2)operator(:) + reserved(case) integer(1)operator(:) + ident(hval) operator(+=) ident(asso_values)operator([()pre_type(unsigned) pre_type(char)operator(\))ident(str)operator([)integer(0)operator(]];) + reserved(break)operator(;) + operator(}) + reserved(return) ident(hval) operator(+) ident(asso_values)operator([()pre_type(unsigned) pre_type(char)operator(\))ident(str)operator([)ident(len) operator(-) integer(1)operator(]];) +operator(}) + +preprocessor(#ifdef) ident(__GNUC__) +ident(__inline) +preprocessor(#endif) +reserved(struct) ident(kwtable) operator(*) +ident(rb_reserved_word) operator(()ident(str)operator(,) ident(len)operator(\)) + directive(register) directive(const) pre_type(char) operator(*)ident(str)operator(;) + directive(register) pre_type(unsigned) pre_type(int) ident(len)operator(;) +operator({) + directive(static) reserved(struct) ident(kwtable) ident(wordlist)operator([]) operator(=) + operator({) + operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) + operator({)string<delimiter(")content(end)delimiter(")>operator(,) operator({)ident(kEND)operator(,) ident(kEND)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(else)delimiter(")>operator(,) operator({)ident(kELSE)operator(,) ident(kELSE)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(case)delimiter(")>operator(,) operator({)ident(kCASE)operator(,) ident(kCASE)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(ensure)delimiter(")>operator(,) operator({)ident(kENSURE)operator(,) ident(kENSURE)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(module)delimiter(")>operator(,) operator({)ident(kMODULE)operator(,) ident(kMODULE)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(elsif)delimiter(")>operator(,) operator({)ident(kELSIF)operator(,) ident(kELSIF)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(def)delimiter(")>operator(,) operator({)ident(kDEF)operator(,) ident(kDEF)operator(},) ident(EXPR_FNAME)operator(},) + operator({)string<delimiter(")content(rescue)delimiter(")>operator(,) operator({)ident(kRESCUE)operator(,) ident(kRESCUE_MOD)operator(},) ident(EXPR_MID)operator(},) + operator({)string<delimiter(")content(not)delimiter(")>operator(,) operator({)ident(kNOT)operator(,) ident(kNOT)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(then)delimiter(")>operator(,) operator({)ident(kTHEN)operator(,) ident(kTHEN)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(yield)delimiter(")>operator(,) operator({)ident(kYIELD)operator(,) ident(kYIELD)operator(},) ident(EXPR_ARG)operator(},) + operator({)string<delimiter(")content(for)delimiter(")>operator(,) operator({)ident(kFOR)operator(,) ident(kFOR)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(self)delimiter(")>operator(,) operator({)ident(kSELF)operator(,) ident(kSELF)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(false)delimiter(")>operator(,) operator({)ident(kFALSE)operator(,) ident(kFALSE)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(retry)delimiter(")>operator(,) operator({)ident(kRETRY)operator(,) ident(kRETRY)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(return)delimiter(")>operator(,) operator({)ident(kRETURN)operator(,) ident(kRETURN)operator(},) ident(EXPR_MID)operator(},) + operator({)string<delimiter(")content(true)delimiter(")>operator(,) operator({)ident(kTRUE)operator(,) ident(kTRUE)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(if)delimiter(")>operator(,) operator({)ident(kIF)operator(,) ident(kIF_MOD)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(defined?)delimiter(")>operator(,) operator({)ident(kDEFINED)operator(,) ident(kDEFINED)operator(},) ident(EXPR_ARG)operator(},) + operator({)string<delimiter(")content(super)delimiter(")>operator(,) operator({)ident(kSUPER)operator(,) ident(kSUPER)operator(},) ident(EXPR_ARG)operator(},) + operator({)string<delimiter(")content(undef)delimiter(")>operator(,) operator({)ident(kUNDEF)operator(,) ident(kUNDEF)operator(},) ident(EXPR_FNAME)operator(},) + operator({)string<delimiter(")content(break)delimiter(")>operator(,) operator({)ident(kBREAK)operator(,) ident(kBREAK)operator(},) ident(EXPR_MID)operator(},) + operator({)string<delimiter(")content(in)delimiter(")>operator(,) operator({)ident(kIN)operator(,) ident(kIN)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(do)delimiter(")>operator(,) operator({)ident(kDO)operator(,) ident(kDO)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(nil)delimiter(")>operator(,) operator({)ident(kNIL)operator(,) ident(kNIL)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(until)delimiter(")>operator(,) operator({)ident(kUNTIL)operator(,) ident(kUNTIL_MOD)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(unless)delimiter(")>operator(,) operator({)ident(kUNLESS)operator(,) ident(kUNLESS_MOD)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(or)delimiter(")>operator(,) operator({)ident(kOR)operator(,) ident(kOR)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(next)delimiter(")>operator(,) operator({)ident(kNEXT)operator(,) ident(kNEXT)operator(},) ident(EXPR_MID)operator(},) + operator({)string<delimiter(")content(when)delimiter(")>operator(,) operator({)ident(kWHEN)operator(,) ident(kWHEN)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(redo)delimiter(")>operator(,) operator({)ident(kREDO)operator(,) ident(kREDO)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(and)delimiter(")>operator(,) operator({)ident(kAND)operator(,) ident(kAND)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(begin)delimiter(")>operator(,) operator({)ident(kBEGIN)operator(,) ident(kBEGIN)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")content(__LINE__)delimiter(")>operator(,) operator({)ident(k__LINE__)operator(,) ident(k__LINE__)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(class)delimiter(")>operator(,) operator({)ident(kCLASS)operator(,) ident(kCLASS)operator(},) ident(EXPR_CLASS)operator(},) + operator({)string<delimiter(")content(__FILE__)delimiter(")>operator(,) operator({)ident(k__FILE__)operator(,) ident(k__FILE__)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(END)delimiter(")>operator(,) operator({)ident(klEND)operator(,) ident(klEND)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(BEGIN)delimiter(")>operator(,) operator({)ident(klBEGIN)operator(,) ident(klBEGIN)operator(},) ident(EXPR_END)operator(},) + operator({)string<delimiter(")content(while)delimiter(")>operator(,) operator({)ident(kWHILE)operator(,) ident(kWHILE_MOD)operator(},) ident(EXPR_BEG)operator(},) + operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) operator({)string<delimiter(")delimiter(")>operator(},) + operator({)string<delimiter(")delimiter(")>operator(},) + operator({)string<delimiter(")content(alias)delimiter(")>operator(,) operator({)ident(kALIAS)operator(,) ident(kALIAS)operator(},) ident(EXPR_FNAME)operator(}) + operator(};) + + reserved(if) operator(()ident(len) operator(<=) ident(MAX_WORD_LENGTH) operator(&&) ident(len) operator(>=) ident(MIN_WORD_LENGTH)operator(\)) + operator({) + directive(register) pre_type(int) ident(key) operator(=) ident(hash) operator(()ident(str)operator(,) ident(len)operator(\);) + + reserved(if) operator(()ident(key) operator(<=) ident(MAX_HASH_VALUE) operator(&&) ident(key) operator(>=) integer(0)operator(\)) + operator({) + directive(register) directive(const) pre_type(char) operator(*)ident(s) operator(=) ident(wordlist)operator([)ident(key)operator(])operator(.)ident(name)operator(;) + + reserved(if) operator((*)ident(str) operator(==) operator(*)ident(s) operator(&&) operator(!)ident(strcmp) operator(()ident(str) operator(+) integer(1)operator(,) ident(s) operator(+) integer(1)operator(\)\)) + reserved(return) operator(&)ident(wordlist)operator([)ident(key)operator(];) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) +comment(/********************************************************************** + + main.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Fri Aug 19 13:19:58 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") + +preprocessor(#ifdef) ident(__human68k__) +pre_type(int) ident(_stacksize) operator(=) integer(262144)operator(;) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(__MINGW32__) +pre_type(int) ident(_CRT_glob) operator(=) integer(0)operator(;) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__MACOS__)operator(\)) operator(&&) ident(defined)operator(()ident(__MWERKS__)operator(\)) +preprocessor(#include) include(<console.h>) +preprocessor(#endif) + +comment(/* to link startup code with ObjC support */) +preprocessor(#if) operator(()ident(defined)operator(()ident(__APPLE__)operator(\)) operator(||) ident(defined)operator(()ident(__NeXT__)operator(\)\)) operator(&&) ident(defined)operator(()ident(__MACH__)operator(\)) +directive(static) directive(void) ident(objcdummyfunction)operator(() directive(void) operator(\)) operator({) ident(objc_msgSend)operator((\);) operator(}) +preprocessor(#endif) + +pre_type(int) +ident(main)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(envp)operator(\)) + pre_type(int) ident(argc)operator(;) + pre_type(char) operator(**)ident(argv)operator(,) operator(**)ident(envp)operator(;) +operator({) +preprocessor(#ifdef) ident(_WIN32) + ident(NtInitialize)operator((&)ident(argc)operator(,) operator(&)ident(argv)operator(\);) +preprocessor(#endif) +preprocessor(#if) ident(defined)operator(()ident(__MACOS__)operator(\)) operator(&&) ident(defined)operator(()ident(__MWERKS__)operator(\)) + ident(argc) operator(=) ident(ccommand)operator((&)ident(argv)operator(\);) +preprocessor(#endif) + + operator({) + ident(RUBY_INIT_STACK) + ident(ruby_init)operator((\);) + ident(ruby_options)operator(()ident(argc)operator(,) ident(argv)operator(\);) + ident(ruby_run)operator((\);) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) +comment(/********************************************************************** + + marshal.c - + + $Author: shyouhei $ + $Date: 2009-01-28 12:59:58 +0100 (Wed, 28 Jan 2009\) $ + created at: Thu Apr 27 16:30:01 JST 1995 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("rubyio.h") +preprocessor(#include) include("st.h") +preprocessor(#include) include("util.h") + +preprocessor(#include) include(<math.h>) +preprocessor(#ifdef) ident(HAVE_FLOAT_H) +preprocessor(#include) include(<float.h>) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_IEEEFP_H) +preprocessor(#include) include(<ieeefp.h>) +preprocessor(#endif) + +preprocessor(#define) ident(BITSPERSHORT) operator(()integer(2)operator(*)ident(CHAR_BIT)operator(\)) +preprocessor(#define) ident(SHORTMASK) operator((()integer(1)operator(<<)ident(BITSPERSHORT)operator(\)-)integer(1)operator(\)) +preprocessor(#define) ident(SHORTDN)operator(()ident(x)operator(\)) ident(RSHIFT)operator(()ident(x)operator(,)ident(BITSPERSHORT)operator(\)) + +preprocessor(#if) ident(SIZEOF_SHORT) operator(==) ident(SIZEOF_BDIGITS) +preprocessor(#define) ident(SHORTLEN)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#else) +directive(static) pre_type(int) +ident(shortlen)operator(()ident(len)operator(,) ident(ds)operator(\)) + pre_type(long) ident(len)operator(;) + ident(BDIGIT) operator(*)ident(ds)operator(;) +operator({) + ident(BDIGIT) ident(num)operator(;) + pre_type(int) ident(offset) operator(=) integer(0)operator(;) + + ident(num) operator(=) ident(ds)operator([)ident(len)operator(-)integer(1)operator(];) + reserved(while) operator(()ident(num)operator(\)) operator({) + ident(num) operator(=) ident(SHORTDN)operator(()ident(num)operator(\);) + ident(offset)operator(++;) + operator(}) + reserved(return) operator(()ident(len) operator(-) integer(1)operator(\)*)reserved(sizeof)operator(()ident(BDIGIT)operator(\))operator(/)integer(2) operator(+) ident(offset)operator(;) +operator(}) +preprocessor(#define) ident(SHORTLEN)operator(()ident(x)operator(\)) ident(shortlen)operator((()ident(x)operator(\),)ident(d)operator(\)) +preprocessor(#endif) + +preprocessor(#define) ident(MARSHAL_MAJOR) integer(4) +preprocessor(#define) ident(MARSHAL_MINOR) integer(8) + +preprocessor(#define) ident(TYPE_NIL) char('0') +preprocessor(#define) ident(TYPE_TRUE) char('T') +preprocessor(#define) ident(TYPE_FALSE) char('F') +preprocessor(#define) ident(TYPE_FIXNUM) char('i') + +preprocessor(#define) ident(TYPE_EXTENDED) char('e') +preprocessor(#define) ident(TYPE_UCLASS) char('C') +preprocessor(#define) ident(TYPE_OBJECT) char('o') +preprocessor(#define) ident(TYPE_DATA) char('d') +preprocessor(#define) ident(TYPE_USERDEF) char('u') +preprocessor(#define) ident(TYPE_USRMARSHAL) char('U') +preprocessor(#define) ident(TYPE_FLOAT) char('f') +preprocessor(#define) ident(TYPE_BIGNUM) char('l') +preprocessor(#define) ident(TYPE_STRING) char('"') +preprocessor(#define) ident(TYPE_REGEXP) char('/') +preprocessor(#define) ident(TYPE_ARRAY) char('[') +preprocessor(#define) ident(TYPE_HASH) char('{') +preprocessor(#define) ident(TYPE_HASH_DEF) char('}') +preprocessor(#define) ident(TYPE_STRUCT) char('S') +preprocessor(#define) ident(TYPE_MODULE_OLD) char('M') +preprocessor(#define) ident(TYPE_CLASS) char('c') +preprocessor(#define) ident(TYPE_MODULE) char('m') + +preprocessor(#define) ident(TYPE_SYMBOL) char(':') +preprocessor(#define) ident(TYPE_SYMLINK) char(';') + +preprocessor(#define) ident(TYPE_IVAR) char('I') +preprocessor(#define) ident(TYPE_LINK) char('@') + +directive(static) ident(ID) ident(s_dump)operator(,) ident(s_load)operator(,) ident(s_mdump)operator(,) ident(s_mload)operator(;) +directive(static) ident(ID) ident(s_dump_data)operator(,) ident(s_load_data)operator(,) ident(s_alloc)operator(,) ident(s_call)operator(;) +directive(static) ident(ID) ident(s_getc)operator(,) ident(s_read)operator(,) ident(s_write)operator(,) ident(s_binmode)operator(;) + +reserved(struct) ident(dump_arg) operator({) + ident(VALUE) ident(obj)operator(;) + ident(VALUE) ident(str)operator(,) ident(dest)operator(;) + ident(st_table) operator(*)ident(symbols)operator(;) + ident(st_table) operator(*)ident(data)operator(;) + pre_type(int) ident(taint)operator(;) + ident(VALUE) ident(wrapper)operator(;) +operator(};) + +reserved(struct) ident(dump_call_arg) operator({) + ident(VALUE) ident(obj)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) + pre_type(int) ident(limit)operator(;) +operator(};) + +directive(static) directive(void) +ident(check_dump_arg)operator(()ident(arg)operator(,) ident(sym)operator(\)) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) + ident(ID) ident(sym)operator(;) +operator({) + reserved(if) operator((!)ident(DATA_PTR)operator(()ident(arg)operator(->)ident(wrapper)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(Marshal.dump reentered at %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(sym)operator(\)\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(mark_dump_arg)operator(()ident(ptr)operator(\)) + directive(void) operator(*)ident(ptr)operator(;) +operator({) + reserved(struct) ident(dump_arg) operator(*)ident(p) operator(=) ident(ptr)operator(;) + reserved(if) operator((!)ident(ptr)operator(\)) + reserved(return)operator(;) + ident(rb_mark_set)operator(()ident(p)operator(->)ident(data)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(class2path)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(path) operator(=) ident(rb_class_path)operator(()ident(klass)operator(\);) + pre_type(char) operator(*)ident(n) operator(=) ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(;) + + reserved(if) operator(()ident(n)operator([)integer(0)operator(]) operator(==) char('#')operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't dump anonymous %s %s)delimiter(")>operator(,) + operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_CLASS) operator(?) string<delimiter(")content(class)delimiter(")> operator(:) string<delimiter(")content(module)delimiter(")>operator(\),) + ident(n)operator(\);) + operator(}) + reserved(if) operator(()ident(rb_path2class)operator(()ident(n)operator(\)) operator(!=) ident(rb_class_real)operator(()ident(klass)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s can't be referred)delimiter(")>operator(,) ident(n)operator(\);) + operator(}) + reserved(return) ident(path)operator(;) +operator(}) + +directive(static) directive(void) ident(w_long) ident(_)operator((()pre_type(long)operator(,) reserved(struct) ident(dump_arg)operator(*\)\);) + +directive(static) directive(void) +ident(w_nbyte)operator(()ident(s)operator(,) ident(n)operator(,) ident(arg)operator(\)) + pre_type(char) operator(*)ident(s)operator(;) + pre_type(int) ident(n)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + ident(VALUE) ident(buf) operator(=) ident(arg)operator(->)ident(str)operator(;) + ident(rb_str_buf_cat)operator(()ident(buf)operator(,) ident(s)operator(,) ident(n)operator(\);) + reserved(if) operator(()ident(arg)operator(->)ident(dest) operator(&&) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len) operator(>=) ident(BUFSIZ)operator(\)) operator({) + reserved(if) operator(()ident(arg)operator(->)ident(taint)operator(\)) ident(OBJ_TAINT)operator(()ident(buf)operator(\);) + ident(rb_io_write)operator(()ident(arg)operator(->)ident(dest)operator(,) ident(buf)operator(\);) + ident(rb_str_resize)operator(()ident(buf)operator(,) integer(0)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(w_byte)operator(()ident(c)operator(,) ident(arg)operator(\)) + pre_type(char) ident(c)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + ident(w_nbyte)operator((&)ident(c)operator(,) integer(1)operator(,) ident(arg)operator(\);) +operator(}) + +directive(static) directive(void) +ident(w_bytes)operator(()ident(s)operator(,) ident(n)operator(,) ident(arg)operator(\)) + pre_type(char) operator(*)ident(s)operator(;) + pre_type(int) ident(n)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + ident(w_long)operator(()ident(n)operator(,) ident(arg)operator(\);) + ident(w_nbyte)operator(()ident(s)operator(,) ident(n)operator(,) ident(arg)operator(\);) +operator(}) + +directive(static) directive(void) +ident(w_short)operator(()ident(x)operator(,) ident(arg)operator(\)) + pre_type(int) ident(x)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + ident(w_byte)operator((()ident(x) operator(>>) integer(0)operator(\)) operator(&) hex(0xff)operator(,) ident(arg)operator(\);) + ident(w_byte)operator((()ident(x) operator(>>) integer(8)operator(\)) operator(&) hex(0xff)operator(,) ident(arg)operator(\);) +operator(}) + +directive(static) directive(void) +ident(w_long)operator(()ident(x)operator(,) ident(arg)operator(\)) + pre_type(long) ident(x)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + pre_type(char) ident(buf)operator([)reserved(sizeof)operator(()pre_type(long)operator(\)+)integer(1)operator(];) + pre_type(int) ident(i)operator(,) ident(len) operator(=) integer(0)operator(;) + +preprocessor(#if) ident(SIZEOF_LONG) operator(>) integer(4) + reserved(if) operator((!()ident(RSHIFT)operator(()ident(x)operator(,) integer(31)operator(\)) operator(==) integer(0) operator(||) ident(RSHIFT)operator(()ident(x)operator(,) integer(31)operator(\)) operator(==) operator(-)integer(1)operator(\)\)) operator({) + comment(/* big long does not fit in 4 bytes */) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(long too big to dump)delimiter(")>operator(\);) + operator(}) +preprocessor(#endif) + + reserved(if) operator(()ident(x) operator(==) integer(0)operator(\)) operator({) + ident(w_byte)operator(()integer(0)operator(,) ident(arg)operator(\);) + reserved(return)operator(;) + operator(}) + reserved(if) operator(()integer(0) operator(<) ident(x) operator(&&) ident(x) operator(<) integer(123)operator(\)) operator({) + ident(w_byte)operator(()ident(x) operator(+) integer(5)operator(,) ident(arg)operator(\);) + reserved(return)operator(;) + operator(}) + reserved(if) operator((-)integer(124) operator(<) ident(x) operator(&&) ident(x) operator(<) integer(0)operator(\)) operator({) + ident(w_byte)operator((()ident(x) operator(-) integer(5)operator(\)&)hex(0xff)operator(,) ident(arg)operator(\);) + reserved(return)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(1)operator(;)ident(i)operator(<)reserved(sizeof)operator(()pre_type(long)operator(\)+)integer(1)operator(;)ident(i)operator(++\)) operator({) + ident(buf)operator([)ident(i)operator(]) operator(=) ident(x) operator(&) hex(0xff)operator(;) + ident(x) operator(=) ident(RSHIFT)operator(()ident(x)operator(,)integer(8)operator(\);) + reserved(if) operator(()ident(x) operator(==) integer(0)operator(\)) operator({) + ident(buf)operator([)integer(0)operator(]) operator(=) ident(i)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(x) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(buf)operator([)integer(0)operator(]) operator(=) operator(-)ident(i)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + ident(len) operator(=) ident(i)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<=)ident(len)operator(;)ident(i)operator(++\)) operator({) + ident(w_byte)operator(()ident(buf)operator([)ident(i)operator(],) ident(arg)operator(\);) + operator(}) +operator(}) + +preprocessor(#ifdef) ident(DBL_MANT_DIG) +preprocessor(#define) ident(DECIMAL_MANT) operator(()integer(53)operator(-)integer(16)operator(\)) comment(/* from IEEE754 double precision */) + +preprocessor(#if) ident(DBL_MANT_DIG) operator(>) integer(32) +preprocessor(#define) ident(MANT_BITS) integer(32) +preprocessor(#elif) ident(DBL_MANT_DIG) operator(>) integer(24) +preprocessor(#define) ident(MANT_BITS) integer(24) +preprocessor(#elif) ident(DBL_MANT_DIG) operator(>) integer(16) +preprocessor(#define) ident(MANT_BITS) integer(16) +preprocessor(#else) +preprocessor(#define) ident(MANT_BITS) integer(8) +preprocessor(#endif) + +directive(static) pre_type(int) +ident(save_mantissa)operator(()ident(d)operator(,) ident(buf)operator(\)) + pre_type(double) ident(d)operator(;) + pre_type(char) operator(*)ident(buf)operator(;) +operator({) + pre_type(int) ident(e)operator(,) ident(i) operator(=) integer(0)operator(;) + pre_type(unsigned) pre_type(long) ident(m)operator(;) + pre_type(double) ident(n)operator(;) + + ident(d) operator(=) ident(modf)operator(()ident(ldexp)operator(()ident(frexp)operator(()ident(fabs)operator(()ident(d)operator(\),) operator(&)ident(e)operator(\),) ident(DECIMAL_MANT)operator(\),) operator(&)ident(d)operator(\);) + reserved(if) operator(()ident(d) operator(>) integer(0)operator(\)) operator({) + ident(buf)operator([)ident(i)operator(++]) operator(=) integer(0)operator(;) + reserved(do) operator({) + ident(d) operator(=) ident(modf)operator(()ident(ldexp)operator(()ident(d)operator(,) ident(MANT_BITS)operator(\),) operator(&)ident(n)operator(\);) + ident(m) operator(=) operator(()pre_type(unsigned) pre_type(long)operator(\))ident(n)operator(;) +preprocessor(#if) ident(MANT_BITS) operator(>) integer(24) + ident(buf)operator([)ident(i)operator(++]) operator(=) ident(m) operator(>>) integer(24)operator(;) +preprocessor(#endif) +preprocessor(#if) ident(MANT_BITS) operator(>) integer(16) + ident(buf)operator([)ident(i)operator(++]) operator(=) ident(m) operator(>>) integer(16)operator(;) +preprocessor(#endif) +preprocessor(#if) ident(MANT_BITS) operator(>) integer(8) + ident(buf)operator([)ident(i)operator(++]) operator(=) ident(m) operator(>>) integer(8)operator(;) +preprocessor(#endif) + ident(buf)operator([)ident(i)operator(++]) operator(=) ident(m)operator(;) + operator(}) reserved(while) operator(()ident(d) operator(>) integer(0)operator(\);) + reserved(while) operator((!)ident(buf)operator([)ident(i) operator(-) integer(1)operator(]\)) operator(--)ident(i)operator(;) + operator(}) + reserved(return) ident(i)operator(;) +operator(}) + +directive(static) pre_type(double) +ident(load_mantissa)operator(()ident(d)operator(,) ident(buf)operator(,) ident(len)operator(\)) + pre_type(double) ident(d)operator(;) + directive(const) pre_type(char) operator(*)ident(buf)operator(;) + pre_type(int) ident(len)operator(;) +operator({) + reserved(if) operator((--)ident(len) operator(>) integer(0) operator(&&) operator(!*)ident(buf)operator(++\)) operator({) comment(/* binary mantissa mark */) + pre_type(int) ident(e)operator(,) ident(s) operator(=) ident(d) operator(<) integer(0)operator(,) ident(dig) operator(=) integer(0)operator(;) + pre_type(unsigned) pre_type(long) ident(m)operator(;) + + ident(modf)operator(()ident(ldexp)operator(()ident(frexp)operator(()ident(fabs)operator(()ident(d)operator(\),) operator(&)ident(e)operator(\),) ident(DECIMAL_MANT)operator(\),) operator(&)ident(d)operator(\);) + reserved(do) operator({) + ident(m) operator(=) integer(0)operator(;) + reserved(switch) operator(()ident(len)operator(\)) operator({) + reserved(default)operator(:) ident(m) operator(=) operator(*)ident(buf)operator(++) operator(&) hex(0xff)operator(;) +preprocessor(#if) ident(MANT_BITS) operator(>) integer(24) + reserved(case) integer(3)operator(:) ident(m) operator(=) operator(()ident(m) operator(<<) integer(8)operator(\)) operator(|) operator((*)ident(buf)operator(++) operator(&) hex(0xff)operator(\);) +preprocessor(#endif) +preprocessor(#if) ident(MANT_BITS) operator(>) integer(16) + reserved(case) integer(2)operator(:) ident(m) operator(=) operator(()ident(m) operator(<<) integer(8)operator(\)) operator(|) operator((*)ident(buf)operator(++) operator(&) hex(0xff)operator(\);) +preprocessor(#endif) +preprocessor(#if) ident(MANT_BITS) operator(>) integer(8) + reserved(case) integer(1)operator(:) ident(m) operator(=) operator(()ident(m) operator(<<) integer(8)operator(\)) operator(|) operator((*)ident(buf)operator(++) operator(&) hex(0xff)operator(\);) +preprocessor(#endif) + operator(}) + ident(dig) operator(-=) ident(len) operator(<) ident(MANT_BITS) operator(/) integer(8) operator(?) integer(8) operator(*) operator(()pre_type(unsigned)operator(\))ident(len) operator(:) ident(MANT_BITS)operator(;) + ident(d) operator(+=) ident(ldexp)operator((()pre_type(double)operator(\))ident(m)operator(,) ident(dig)operator(\);) + operator(}) reserved(while) operator((()ident(len) operator(-=) ident(MANT_BITS) operator(/) integer(8)operator(\)) operator(>) integer(0)operator(\);) + ident(d) operator(=) ident(ldexp)operator(()ident(d)operator(,) ident(e) operator(-) ident(DECIMAL_MANT)operator(\);) + reserved(if) operator(()ident(s)operator(\)) ident(d) operator(=) operator(-)ident(d)operator(;) + operator(}) + reserved(return) ident(d)operator(;) +operator(}) +preprocessor(#else) +preprocessor(#define) ident(load_mantissa)operator(()ident(d)operator(,) ident(buf)operator(,) ident(len)operator(\)) operator(()ident(d)operator(\)) +preprocessor(#define) ident(save_mantissa)operator(()ident(d)operator(,) ident(buf)operator(\)) integer(0) +preprocessor(#endif) + +preprocessor(#ifdef) ident(DBL_DIG) +preprocessor(#define) ident(FLOAT_DIG) operator(()ident(DBL_DIG)operator(+)integer(2)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(FLOAT_DIG) integer(17) +preprocessor(#endif) + +directive(static) directive(void) +ident(w_float)operator(()ident(d)operator(,) ident(arg)operator(\)) + pre_type(double) ident(d)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + pre_type(char) ident(buf)operator([)integer(100)operator(];) + + reserved(if) operator(()ident(isinf)operator(()ident(d)operator(\)\)) operator({) + reserved(if) operator(()ident(d) operator(<) integer(0)operator(\)) ident(strcpy)operator(()ident(buf)operator(,) string<delimiter(")content(-inf)delimiter(")>operator(\);) + reserved(else) ident(strcpy)operator(()ident(buf)operator(,) string<delimiter(")content(inf)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(isnan)operator(()ident(d)operator(\)\)) operator({) + ident(strcpy)operator(()ident(buf)operator(,) string<delimiter(")content(nan)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(d) operator(==) float(0)float(.0)operator(\)) operator({) + reserved(if) operator(()float(1)float(.0)operator(/)ident(d) operator(<) integer(0)operator(\)) ident(strcpy)operator(()ident(buf)operator(,) string<delimiter(")content(-0)delimiter(")>operator(\);) + reserved(else) ident(strcpy)operator(()ident(buf)operator(,) string<delimiter(")content(0)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + pre_type(int) ident(len)operator(;) + + comment(/* xxx: should not use system's sprintf(3\) */) + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(%.*g)delimiter(")>operator(,) ident(FLOAT_DIG)operator(,) ident(d)operator(\);) + ident(len) operator(=) ident(strlen)operator(()ident(buf)operator(\);) + ident(w_bytes)operator(()ident(buf)operator(,) ident(len) operator(+) ident(save_mantissa)operator(()ident(d)operator(,) ident(buf) operator(+) ident(len)operator(\),) ident(arg)operator(\);) + reserved(return)operator(;) + operator(}) + ident(w_bytes)operator(()ident(buf)operator(,) ident(strlen)operator(()ident(buf)operator(\),) ident(arg)operator(\);) +operator(}) + +directive(static) directive(void) +ident(w_symbol)operator(()ident(id)operator(,) ident(arg)operator(\)) + ident(ID) ident(id)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + pre_type(char) operator(*)ident(sym) operator(=) ident(rb_id2name)operator(()ident(id)operator(\);) + ident(st_data_t) ident(num)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(arg)operator(->)ident(symbols)operator(,) ident(id)operator(,) operator(&)ident(num)operator(\)\)) operator({) + ident(w_byte)operator(()ident(TYPE_SYMLINK)operator(,) ident(arg)operator(\);) + ident(w_long)operator((()pre_type(long)operator(\))ident(num)operator(,) ident(arg)operator(\);) + operator(}) + reserved(else) operator({) + ident(w_byte)operator(()ident(TYPE_SYMBOL)operator(,) ident(arg)operator(\);) + ident(w_bytes)operator(()ident(sym)operator(,) ident(strlen)operator(()ident(sym)operator(\),) ident(arg)operator(\);) + ident(st_add_direct)operator(()ident(arg)operator(->)ident(symbols)operator(,) ident(id)operator(,) ident(arg)operator(->)ident(symbols)operator(->)ident(num_entries)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(w_unique)operator(()ident(s)operator(,) ident(arg)operator(\)) + pre_type(char) operator(*)ident(s)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(if) operator(()ident(s)operator([)integer(0)operator(]) operator(==) char('#')operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't dump anonymous class %s)delimiter(")>operator(,) ident(s)operator(\);) + operator(}) + ident(w_symbol)operator(()ident(rb_intern)operator(()ident(s)operator(\),) ident(arg)operator(\);) +operator(}) + +directive(static) directive(void) ident(w_object) ident(_)operator((()ident(VALUE)operator(,)reserved(struct) ident(dump_arg)operator(*,)pre_type(int)operator(\)\);) + +directive(static) pre_type(int) +ident(hash_each)operator(()ident(key)operator(,) ident(value)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(key)operator(,) ident(value)operator(;) + reserved(struct) ident(dump_call_arg) operator(*)ident(arg)operator(;) +operator({) + ident(w_object)operator(()ident(key)operator(,) ident(arg)operator(->)ident(arg)operator(,) ident(arg)operator(->)ident(limit)operator(\);) + ident(w_object)operator(()ident(value)operator(,) ident(arg)operator(->)ident(arg)operator(,) ident(arg)operator(->)ident(limit)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) directive(void) +ident(w_extended)operator(()ident(klass)operator(,) ident(arg)operator(,) ident(check)operator(\)) + ident(VALUE) ident(klass)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) + pre_type(int) ident(check)operator(;) +operator({) + pre_type(char) operator(*)ident(path)operator(;) + + reserved(if) operator(()ident(check) operator(&&) ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(m_tbl)operator(->)ident(num_entries) operator(||) + operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl) operator(&&) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(->)ident(num_entries) operator(>) integer(1)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(singleton can't be dumped)delimiter(")>operator(\);) + operator(}) + ident(klass) operator(=) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) + operator(}) + reserved(while) operator(()ident(BUILTIN_TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(path) operator(=) ident(rb_class2name)operator(()ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass)operator(\);) + ident(w_byte)operator(()ident(TYPE_EXTENDED)operator(,) ident(arg)operator(\);) + ident(w_unique)operator(()ident(path)operator(,) ident(arg)operator(\);) + ident(klass) operator(=) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(w_class)operator(()ident(type)operator(,) ident(obj)operator(,) ident(arg)operator(,) ident(check)operator(\)) + pre_type(int) ident(type)operator(;) + ident(VALUE) ident(obj)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) + pre_type(int) ident(check)operator(;) +operator({) + pre_type(char) operator(*)ident(path)operator(;) + + ident(VALUE) ident(klass) operator(=) ident(CLASS_OF)operator(()ident(obj)operator(\);) + ident(w_extended)operator(()ident(klass)operator(,) ident(arg)operator(,) ident(check)operator(\);) + ident(w_byte)operator(()ident(type)operator(,) ident(arg)operator(\);) + ident(path) operator(=) ident(RSTRING)operator(()ident(class2path)operator(()ident(rb_class_real)operator(()ident(klass)operator(\)\)\)->)ident(ptr)operator(;) + ident(w_unique)operator(()ident(path)operator(,) ident(arg)operator(\);) +operator(}) + +directive(static) directive(void) +ident(w_uclass)operator(()ident(obj)operator(,) ident(base_klass)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(base_klass)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + ident(VALUE) ident(klass) operator(=) ident(CLASS_OF)operator(()ident(obj)operator(\);) + + ident(w_extended)operator(()ident(klass)operator(,) ident(arg)operator(,) ident(Qtrue)operator(\);) + ident(klass) operator(=) ident(rb_class_real)operator(()ident(klass)operator(\);) + reserved(if) operator(()ident(klass) operator(!=) ident(base_klass)operator(\)) operator({) + ident(w_byte)operator(()ident(TYPE_UCLASS)operator(,) ident(arg)operator(\);) + ident(w_unique)operator(()ident(RSTRING)operator(()ident(class2path)operator(()ident(klass)operator(\)\)->)ident(ptr)operator(,) ident(arg)operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(w_obj_each)operator(()ident(id)operator(,) ident(value)operator(,) ident(arg)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(value)operator(;) + reserved(struct) ident(dump_call_arg) operator(*)ident(arg)operator(;) +operator({) + ident(w_symbol)operator(()ident(id)operator(,) ident(arg)operator(->)ident(arg)operator(\);) + ident(w_object)operator(()ident(value)operator(,) ident(arg)operator(->)ident(arg)operator(,) ident(arg)operator(->)ident(limit)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) directive(void) +ident(w_ivar)operator(()ident(tbl)operator(,) ident(arg)operator(\)) + ident(st_table) operator(*)ident(tbl)operator(;) + reserved(struct) ident(dump_call_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(if) operator(()ident(tbl)operator(\)) operator({) + ident(w_long)operator(()ident(tbl)operator(->)ident(num_entries)operator(,) ident(arg)operator(->)ident(arg)operator(\);) + ident(st_foreach_safe)operator(()ident(tbl)operator(,) ident(w_obj_each)operator(,) operator(()ident(st_data_t)operator(\))ident(arg)operator(\);) + operator(}) + reserved(else) operator({) + ident(w_long)operator(()integer(0)operator(,) ident(arg)operator(->)ident(arg)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(w_object)operator(()ident(obj)operator(,) ident(arg)operator(,) ident(limit)operator(\)) + ident(VALUE) ident(obj)operator(;) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) + pre_type(int) ident(limit)operator(;) +operator({) + reserved(struct) ident(dump_call_arg) ident(c_arg)operator(;) + ident(st_table) operator(*)ident(ivtbl) operator(=) integer(0)operator(;) + ident(st_data_t) ident(num)operator(;) + + reserved(if) operator(()ident(limit) operator(==) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(exceed depth limit)delimiter(")>operator(\);) + operator(}) + + ident(limit)operator(--;) + ident(c_arg)operator(.)ident(limit) operator(=) ident(limit)operator(;) + ident(c_arg)operator(.)ident(arg) operator(=) ident(arg)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(arg)operator(->)ident(data)operator(,) ident(obj)operator(,) operator(&)ident(num)operator(\)\)) operator({) + ident(w_byte)operator(()ident(TYPE_LINK)operator(,) ident(arg)operator(\);) + ident(w_long)operator((()pre_type(long)operator(\))ident(num)operator(,) ident(arg)operator(\);) + reserved(return)operator(;) + operator(}) + + reserved(if) operator((()ident(ivtbl) operator(=) ident(rb_generic_ivar_table)operator(()ident(obj)operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + ident(w_byte)operator(()ident(TYPE_IVAR)operator(,) ident(arg)operator(\);) + operator(}) + reserved(if) operator(()ident(obj) operator(==) ident(Qnil)operator(\)) operator({) + ident(w_byte)operator(()ident(TYPE_NIL)operator(,) ident(arg)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(obj) operator(==) ident(Qtrue)operator(\)) operator({) + ident(w_byte)operator(()ident(TYPE_TRUE)operator(,) ident(arg)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(obj) operator(==) ident(Qfalse)operator(\)) operator({) + ident(w_byte)operator(()ident(TYPE_FALSE)operator(,) ident(arg)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(FIXNUM_P)operator(()ident(obj)operator(\)\)) operator({) +preprocessor(#if) ident(SIZEOF_LONG) operator(<=) integer(4) + ident(w_byte)operator(()ident(TYPE_FIXNUM)operator(,) ident(arg)operator(\);) + ident(w_long)operator(()ident(FIX2INT)operator(()ident(obj)operator(\),) ident(arg)operator(\);) +preprocessor(#else) + reserved(if) operator(()ident(RSHIFT)operator((()pre_type(long)operator(\))ident(obj)operator(,) integer(31)operator(\)) operator(==) integer(0) operator(||) ident(RSHIFT)operator((()pre_type(long)operator(\))ident(obj)operator(,) integer(31)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(w_byte)operator(()ident(TYPE_FIXNUM)operator(,) ident(arg)operator(\);) + ident(w_long)operator(()ident(FIX2LONG)operator(()ident(obj)operator(\),) ident(arg)operator(\);) + operator(}) + reserved(else) operator({) + ident(w_object)operator(()ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(obj)operator(\)\),) ident(arg)operator(,) ident(limit)operator(\);) + operator(}) +preprocessor(#endif) + operator(}) + reserved(else) reserved(if) operator(()ident(SYMBOL_P)operator(()ident(obj)operator(\)\)) operator({) + ident(w_symbol)operator(()ident(SYM2ID)operator(()ident(obj)operator(\),) ident(arg)operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) ident(arg)operator(->)ident(taint) operator(=) ident(Qtrue)operator(;) + + ident(st_add_direct)operator(()ident(arg)operator(->)ident(data)operator(,) ident(obj)operator(,) ident(arg)operator(->)ident(data)operator(->)ident(num_entries)operator(\);) + reserved(if) operator(()ident(rb_respond_to)operator(()ident(obj)operator(,) ident(s_mdump)operator(\)\)) operator({) + directive(volatile) ident(VALUE) ident(v)operator(;) + + ident(v) operator(=) ident(rb_funcall)operator(()ident(obj)operator(,) ident(s_mdump)operator(,) integer(0)operator(,) integer(0)operator(\);) + ident(check_dump_arg)operator(()ident(arg)operator(,) ident(s_mdump)operator(\);) + ident(w_class)operator(()ident(TYPE_USRMARSHAL)operator(,) ident(obj)operator(,) ident(arg)operator(,) ident(Qfalse)operator(\);) + ident(w_object)operator(()ident(v)operator(,) ident(arg)operator(,) ident(limit)operator(\);) + reserved(if) operator(()ident(ivtbl)operator(\)) ident(w_ivar)operator(()integer(0)operator(,) operator(&)ident(c_arg)operator(\);) + reserved(return)operator(;) + operator(}) + reserved(if) operator(()ident(rb_respond_to)operator(()ident(obj)operator(,) ident(s_dump)operator(\)\)) operator({) + ident(VALUE) ident(v)operator(;) + + ident(v) operator(=) ident(rb_funcall)operator(()ident(obj)operator(,) ident(s_dump)operator(,) integer(1)operator(,) ident(INT2NUM)operator(()ident(limit)operator(\)\);) + ident(check_dump_arg)operator(()ident(arg)operator(,) ident(s_dump)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(_dump(\) must return string)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!)ident(ivtbl) operator(&&) operator(()ident(ivtbl) operator(=) ident(rb_generic_ivar_table)operator(()ident(v)operator(\)\)\)) operator({) + ident(w_byte)operator(()ident(TYPE_IVAR)operator(,) ident(arg)operator(\);) + operator(}) + ident(w_class)operator(()ident(TYPE_USERDEF)operator(,) ident(obj)operator(,) ident(arg)operator(,) ident(Qfalse)operator(\);) + ident(w_bytes)operator(()ident(RSTRING)operator(()ident(v)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(v)operator(\)->)ident(len)operator(,) ident(arg)operator(\);) + reserved(if) operator(()ident(ivtbl)operator(\)) operator({) + ident(w_ivar)operator(()ident(ivtbl)operator(,) operator(&)ident(c_arg)operator(\);) + operator(}) + reserved(return)operator(;) + operator(}) + + reserved(switch) operator(()ident(BUILTIN_TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_CLASS)operator(:) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(singleton class can't be dumped)delimiter(")>operator(\);) + operator(}) + ident(w_byte)operator(()ident(TYPE_CLASS)operator(,) ident(arg)operator(\);) + operator({) + ident(VALUE) ident(path) operator(=) ident(class2path)operator(()ident(obj)operator(\);) + ident(w_bytes)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(path)operator(\)->)ident(len)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_MODULE)operator(:) + ident(w_byte)operator(()ident(TYPE_MODULE)operator(,) ident(arg)operator(\);) + operator({) + ident(VALUE) ident(path) operator(=) ident(class2path)operator(()ident(obj)operator(\);) + ident(w_bytes)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(path)operator(\)->)ident(len)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + ident(w_byte)operator(()ident(TYPE_FLOAT)operator(,) ident(arg)operator(\);) + ident(w_float)operator(()ident(RFLOAT)operator(()ident(obj)operator(\)->)ident(value)operator(,) ident(arg)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + ident(w_byte)operator(()ident(TYPE_BIGNUM)operator(,) ident(arg)operator(\);) + operator({) + pre_type(char) ident(sign) operator(=) ident(RBIGNUM)operator(()ident(obj)operator(\)->)ident(sign) operator(?) char('+') operator(:) char('-')operator(;) + pre_type(long) ident(len) operator(=) ident(RBIGNUM)operator(()ident(obj)operator(\)->)ident(len)operator(;) + ident(BDIGIT) operator(*)ident(d) operator(=) ident(RBIGNUM)operator(()ident(obj)operator(\)->)ident(digits)operator(;) + + ident(w_byte)operator(()ident(sign)operator(,) ident(arg)operator(\);) + ident(w_long)operator(()ident(SHORTLEN)operator(()ident(len)operator(\),) ident(arg)operator(\);) comment(/* w_short? */) + reserved(while) operator(()ident(len)operator(--\)) operator({) +preprocessor(#if) ident(SIZEOF_BDIGITS) operator(>) ident(SIZEOF_SHORT) + ident(BDIGIT) ident(num) operator(=) operator(*)ident(d)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(SIZEOF_BDIGITS)operator(;) ident(i)operator(+=)ident(SIZEOF_SHORT)operator(\)) operator({) + ident(w_short)operator(()ident(num) operator(&) ident(SHORTMASK)operator(,) ident(arg)operator(\);) + ident(num) operator(=) ident(SHORTDN)operator(()ident(num)operator(\);) + reserved(if) operator(()ident(len) operator(==) integer(0) operator(&&) ident(num) operator(==) integer(0)operator(\)) reserved(break)operator(;) + operator(}) +preprocessor(#else) + ident(w_short)operator((*)ident(d)operator(,) ident(arg)operator(\);) +preprocessor(#endif) + ident(d)operator(++;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_STRING)operator(:) + ident(w_uclass)operator(()ident(obj)operator(,) ident(rb_cString)operator(,) ident(arg)operator(\);) + ident(w_byte)operator(()ident(TYPE_STRING)operator(,) ident(arg)operator(\);) + ident(w_bytes)operator(()ident(RSTRING)operator(()ident(obj)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(obj)operator(\)->)ident(len)operator(,) ident(arg)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_REGEXP)operator(:) + ident(w_uclass)operator(()ident(obj)operator(,) ident(rb_cRegexp)operator(,) ident(arg)operator(\);) + ident(w_byte)operator(()ident(TYPE_REGEXP)operator(,) ident(arg)operator(\);) + ident(w_bytes)operator(()ident(RREGEXP)operator(()ident(obj)operator(\)->)ident(str)operator(,) ident(RREGEXP)operator(()ident(obj)operator(\)->)ident(len)operator(,) ident(arg)operator(\);) + ident(w_byte)operator(()ident(rb_reg_options)operator(()ident(obj)operator(\),) ident(arg)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_ARRAY)operator(:) + ident(w_uclass)operator(()ident(obj)operator(,) ident(rb_cArray)operator(,) ident(arg)operator(\);) + ident(w_byte)operator(()ident(TYPE_ARRAY)operator(,) ident(arg)operator(\);) + operator({) + pre_type(long) ident(len) operator(=) ident(RARRAY)operator(()ident(obj)operator(\)->)ident(len)operator(;) + ident(VALUE) operator(*)ident(ptr) operator(=) ident(RARRAY)operator(()ident(obj)operator(\)->)ident(ptr)operator(;) + + ident(w_long)operator(()ident(len)operator(,) ident(arg)operator(\);) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(w_object)operator((*)ident(ptr)operator(,) ident(arg)operator(,) ident(limit)operator(\);) + ident(ptr)operator(++;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_HASH)operator(:) + ident(w_uclass)operator(()ident(obj)operator(,) ident(rb_cHash)operator(,) ident(arg)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(RHASH)operator(()ident(obj)operator(\)->)ident(ifnone)operator(\)\)) operator({) + ident(w_byte)operator(()ident(TYPE_HASH)operator(,) ident(arg)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_USER2)operator(\)\)) operator({) + comment(/* FL_USER2 means HASH_PROC_DEFAULT (see hash.c\) */) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't dump hash with default proc)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(w_byte)operator(()ident(TYPE_HASH_DEF)operator(,) ident(arg)operator(\);) + operator(}) + ident(w_long)operator(()ident(RHASH)operator(()ident(obj)operator(\)->)ident(tbl)operator(->)ident(num_entries)operator(,) ident(arg)operator(\);) + ident(rb_hash_foreach)operator(()ident(obj)operator(,) ident(hash_each)operator(,) operator(()ident(st_data_t)operator(\)&)ident(c_arg)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(RHASH)operator(()ident(obj)operator(\)->)ident(ifnone)operator(\)\)) operator({) + ident(w_object)operator(()ident(RHASH)operator(()ident(obj)operator(\)->)ident(ifnone)operator(,) ident(arg)operator(,) ident(limit)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_STRUCT)operator(:) + ident(w_class)operator(()ident(TYPE_STRUCT)operator(,) ident(obj)operator(,) ident(arg)operator(,) ident(Qtrue)operator(\);) + operator({) + pre_type(long) ident(len) operator(=) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(len)operator(;) + ident(VALUE) ident(mem)operator(;) + pre_type(long) ident(i)operator(;) + + ident(w_long)operator(()ident(len)operator(,) ident(arg)operator(\);) + ident(mem) operator(=) ident(rb_struct_members)operator(()ident(obj)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(w_symbol)operator(()ident(SYM2ID)operator(()ident(RARRAY)operator(()ident(mem)operator(\)->)ident(ptr)operator([)ident(i)operator(]\),) ident(arg)operator(\);) + ident(w_object)operator(()ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(arg)operator(,) ident(limit)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_OBJECT)operator(:) + ident(w_class)operator(()ident(TYPE_OBJECT)operator(,) ident(obj)operator(,) ident(arg)operator(,) ident(Qtrue)operator(\);) + ident(w_ivar)operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(,) operator(&)ident(c_arg)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_DATA)operator(:) + operator({) + ident(VALUE) ident(v)operator(;) + + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(obj)operator(,) ident(s_dump_data)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) + string<delimiter(")content(no marshal_dump is defined for class %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(obj)operator(\)\);) + operator(}) + ident(v) operator(=) ident(rb_funcall)operator(()ident(obj)operator(,) ident(s_dump_data)operator(,) integer(0)operator(\);) + ident(check_dump_arg)operator(()ident(arg)operator(,) ident(s_dump_data)operator(\);) + ident(w_class)operator(()ident(TYPE_DATA)operator(,) ident(obj)operator(,) ident(arg)operator(,) ident(Qtrue)operator(\);) + ident(w_object)operator(()ident(v)operator(,) ident(arg)operator(,) ident(limit)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't dump %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(obj)operator(\)\);) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(ivtbl)operator(\)) operator({) + ident(w_ivar)operator(()ident(ivtbl)operator(,) operator(&)ident(c_arg)operator(\);) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(dump)operator(()ident(arg)operator(\)) + reserved(struct) ident(dump_call_arg) operator(*)ident(arg)operator(;) +operator({) + ident(w_object)operator(()ident(arg)operator(->)ident(obj)operator(,) ident(arg)operator(->)ident(arg)operator(,) ident(arg)operator(->)ident(limit)operator(\);) + reserved(if) operator(()ident(arg)operator(->)ident(arg)operator(->)ident(dest)operator(\)) operator({) + ident(rb_io_write)operator(()ident(arg)operator(->)ident(arg)operator(->)ident(dest)operator(,) ident(arg)operator(->)ident(arg)operator(->)ident(str)operator(\);) + ident(rb_str_resize)operator(()ident(arg)operator(->)ident(arg)operator(->)ident(str)operator(,) integer(0)operator(\);) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(dump_ensure)operator(()ident(arg)operator(\)) + reserved(struct) ident(dump_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(if) operator((!)ident(DATA_PTR)operator(()ident(arg)operator(->)ident(wrapper)operator(\)\)) reserved(return) integer(0)operator(;) + ident(st_free_table)operator(()ident(arg)operator(->)ident(symbols)operator(\);) + ident(st_free_table)operator(()ident(arg)operator(->)ident(data)operator(\);) + ident(DATA_PTR)operator(()ident(arg)operator(->)ident(wrapper)operator(\)) operator(=) integer(0)operator(;) + ident(arg)operator(->)ident(wrapper) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(arg)operator(->)ident(taint)operator(\)) operator({) + ident(OBJ_TAINT)operator(()ident(arg)operator(->)ident(str)operator(\);) + operator(}) + + reserved(return) integer(0)operator(;) +operator(}) + +comment(/* + * call-seq: + * dump( obj [, anIO] , limit=--1 \) => anIO + * + * Serializes obj and all descendent objects. If anIO is + * specified, the serialized data will be written to it, otherwise the + * data will be returned as a String. If limit is specified, the + * traversal of subobjects will be limited to that depth. If limit is + * negative, no checking of depth will be performed. + * + * class Klass + * def initialize(str\) + * @str = str + * end + * def sayHello + * @str + * end + * end + * + * (produces no output\) + * + * o = Klass.new("hello\\n"\) + * data = Marshal.dump(o\) + * obj = Marshal.load(data\) + * obj.sayHello #=> "hello\\n" + */) +directive(static) ident(VALUE) +ident(marshal_dump)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE)operator(*) ident(argv)operator(;) +operator({) + ident(VALUE) ident(obj)operator(,) ident(port)operator(,) ident(a1)operator(,) ident(a2)operator(;) + pre_type(int) ident(limit) operator(=) operator(-)integer(1)operator(;) + reserved(struct) ident(dump_arg) ident(arg)operator(;) + reserved(struct) ident(dump_call_arg) ident(c_arg)operator(;) + + ident(port) operator(=) ident(Qnil)operator(;) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(12)delimiter(")>operator(,) operator(&)ident(obj)operator(,) operator(&)ident(a1)operator(,) operator(&)ident(a2)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(3)operator(\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(a2)operator(\)\)) ident(limit) operator(=) ident(NUM2INT)operator(()ident(a2)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(a1)operator(\)\)) reserved(goto) ident(type_error)operator(;) + ident(port) operator(=) ident(a1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(a1)operator(\)\)) ident(limit) operator(=) ident(FIX2INT)operator(()ident(a1)operator(\);) + reserved(else) reserved(if) operator(()ident(NIL_P)operator(()ident(a1)operator(\)\)) reserved(goto) ident(type_error)operator(;) + reserved(else) ident(port) operator(=) ident(a1)operator(;) + operator(}) + ident(arg)operator(.)ident(dest) operator(=) integer(0)operator(;) + ident(arg)operator(.)ident(symbols) operator(=) ident(st_init_numtable)operator((\);) + ident(arg)operator(.)ident(data) operator(=) ident(st_init_numtable)operator((\);) + ident(arg)operator(.)ident(taint) operator(=) ident(Qfalse)operator(;) + ident(arg)operator(.)ident(str) operator(=) ident(rb_str_buf_new)operator(()integer(0)operator(\);) + ident(RBASIC)operator(()ident(arg)operator(.)ident(str)operator(\)->)ident(klass) operator(=) integer(0)operator(;) + ident(arg)operator(.)ident(wrapper) operator(=) ident(Data_Wrap_Struct)operator(()ident(rb_cData)operator(,) ident(mark_dump_arg)operator(,) integer(0)operator(,) operator(&)ident(arg)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(port)operator(\)\)) operator({) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(port)operator(,) ident(s_write)operator(\)\)) operator({) + label(type_error)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(instance of IO needed)delimiter(")>operator(\);) + operator(}) + ident(arg)operator(.)ident(dest) operator(=) ident(port)operator(;) + reserved(if) operator(()ident(rb_respond_to)operator(()ident(port)operator(,) ident(s_binmode)operator(\)\)) operator({) + ident(rb_funcall2)operator(()ident(port)operator(,) ident(s_binmode)operator(,) integer(0)operator(,) integer(0)operator(\);) + ident(check_dump_arg)operator((&)ident(arg)operator(,) ident(s_binmode)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(port) operator(=) ident(arg)operator(.)ident(str)operator(;) + operator(}) + + ident(c_arg)operator(.)ident(obj) operator(=) ident(obj)operator(;) + ident(c_arg)operator(.)ident(arg) operator(=) operator(&)ident(arg)operator(;) + ident(c_arg)operator(.)ident(limit) operator(=) ident(limit)operator(;) + + ident(w_byte)operator(()ident(MARSHAL_MAJOR)operator(,) operator(&)ident(arg)operator(\);) + ident(w_byte)operator(()ident(MARSHAL_MINOR)operator(,) operator(&)ident(arg)operator(\);) + + ident(rb_ensure)operator(()ident(dump)operator(,) operator(()ident(VALUE)operator(\)&)ident(c_arg)operator(,) ident(dump_ensure)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(\);) + ident(RBASIC)operator(()ident(arg)operator(.)ident(str)operator(\)->)ident(klass) operator(=) ident(rb_cString)operator(;) + + reserved(return) ident(port)operator(;) +operator(}) + +reserved(struct) ident(load_arg) operator({) + ident(VALUE) ident(src)operator(;) + pre_type(long) ident(offset)operator(;) + ident(st_table) operator(*)ident(symbols)operator(;) + ident(st_table) operator(*)ident(data)operator(;) + ident(VALUE) ident(proc)operator(;) + pre_type(int) ident(taint)operator(;) + ident(VALUE) ident(wrapper)operator(;) +operator(};) + +directive(static) directive(void) +ident(check_load_arg)operator(()ident(arg)operator(,) ident(sym)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) + ident(ID) ident(sym)operator(;) +operator({) + reserved(if) operator((!)ident(DATA_PTR)operator(()ident(arg)operator(->)ident(wrapper)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(Marshal.load reentered at %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(sym)operator(\)\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(mark_load_arg)operator(()ident(ptr)operator(\)) + directive(void) operator(*)ident(ptr)operator(;) +operator({) + reserved(struct) ident(load_arg) operator(*)ident(p) operator(=) ident(ptr)operator(;) + reserved(if) operator((!)ident(ptr)operator(\)) + reserved(return)operator(;) + ident(rb_mark_tbl)operator(()ident(p)operator(->)ident(data)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(r_object) ident(_)operator((()reserved(struct) ident(load_arg) operator(*)ident(arg)operator(\)\);) + +directive(static) pre_type(int) +ident(r_byte)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + pre_type(int) ident(c)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(arg)operator(->)ident(src)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(arg)operator(->)ident(src)operator(\)->)ident(len) operator(>) ident(arg)operator(->)ident(offset)operator(\)) operator({) + ident(c) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(RSTRING)operator(()ident(arg)operator(->)ident(src)operator(\)->)ident(ptr)operator([)ident(arg)operator(->)ident(offset)operator(++];) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(marshal data too short)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(src) operator(=) ident(arg)operator(->)ident(src)operator(;) + ident(VALUE) ident(v) operator(=) ident(rb_funcall2)operator(()ident(src)operator(,) ident(s_getc)operator(,) integer(0)operator(,) integer(0)operator(\);) + ident(check_load_arg)operator(()ident(arg)operator(,) ident(s_getc)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(v)operator(\)\)) ident(rb_eof_error)operator((\);) + ident(c) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(FIX2INT)operator(()ident(v)operator(\);) + operator(}) + reserved(return) ident(c)operator(;) +operator(}) + +directive(static) directive(void) +ident(long_toobig)operator(()ident(size)operator(\)) + pre_type(int) ident(size)operator(;) +operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(long too big for this architecture (size %d, given %d\))delimiter(")>operator(,) + reserved(sizeof)operator(()pre_type(long)operator(\),) ident(size)operator(\);) +operator(}) + +preprocessor(#undef) ident(SIGN_EXTEND_CHAR) +preprocessor(#if) ident(__STDC__) +preprocessor(# define) ident(SIGN_EXTEND_CHAR)operator(()ident(c)operator(\)) operator((()pre_type(signed) pre_type(char)operator(\)()ident(c)operator(\)\)) +preprocessor(#else) comment(/* not __STDC__ */) +comment(/* As in Harbison and Steele. */) +preprocessor(# define) ident(SIGN_EXTEND_CHAR)operator(()ident(c)operator(\)) operator((((()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)) operator(^) integer(128)operator(\)) operator(-) integer(128)operator(\)) +preprocessor(#endif) + +directive(static) pre_type(long) +ident(r_long)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + directive(register) pre_type(long) ident(x)operator(;) + pre_type(int) ident(c) operator(=) ident(SIGN_EXTEND_CHAR)operator(()ident(r_byte)operator(()ident(arg)operator(\)\);) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(c) operator(==) integer(0)operator(\)) reserved(return) integer(0)operator(;) + reserved(if) operator(()ident(c) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()integer(4) operator(<) ident(c) operator(&&) ident(c) operator(<) integer(128)operator(\)) operator({) + reserved(return) ident(c) operator(-) integer(5)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(>) reserved(sizeof)operator(()pre_type(long)operator(\)\)) ident(long_toobig)operator(()ident(c)operator(\);) + ident(x) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(c)operator(;)ident(i)operator(++\)) operator({) + ident(x) operator(|=) operator(()pre_type(long)operator(\))ident(r_byte)operator(()ident(arg)operator(\)) operator(<<) operator(()integer(8)operator(*)ident(i)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator((-)integer(129) operator(<) ident(c) operator(&&) ident(c) operator(<) operator(-)integer(4)operator(\)) operator({) + reserved(return) ident(c) operator(+) integer(5)operator(;) + operator(}) + ident(c) operator(=) operator(-)ident(c)operator(;) + reserved(if) operator(()ident(c) operator(>) reserved(sizeof)operator(()pre_type(long)operator(\)\)) ident(long_toobig)operator(()ident(c)operator(\);) + ident(x) operator(=) operator(-)integer(1)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(c)operator(;)ident(i)operator(++\)) operator({) + ident(x) operator(&=) operator(~(()pre_type(long)operator(\))hex(0xff) operator(<<) operator(()integer(8)operator(*)ident(i)operator(\)\);) + ident(x) operator(|=) operator(()pre_type(long)operator(\))ident(r_byte)operator(()ident(arg)operator(\)) operator(<<) operator(()integer(8)operator(*)ident(i)operator(\);) + operator(}) + operator(}) + reserved(return) ident(x)operator(;) +operator(}) + +preprocessor(#define) ident(r_bytes)operator(()ident(arg)operator(\)) ident(r_bytes0)operator(()ident(r_long)operator(()ident(arg)operator(\),) operator(()ident(arg)operator(\)\)) + +directive(static) ident(VALUE) +ident(r_bytes0)operator(()ident(len)operator(,) ident(arg)operator(\)) + pre_type(long) ident(len)operator(;) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(arg)operator(->)ident(src)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(arg)operator(->)ident(src)operator(\)->)ident(len) operator(-) ident(arg)operator(->)ident(offset) operator(>=) ident(len)operator(\)) operator({) + ident(str) operator(=) ident(rb_str_new)operator(()ident(RSTRING)operator(()ident(arg)operator(->)ident(src)operator(\)->)ident(ptr)operator(+)ident(arg)operator(->)ident(offset)operator(,) ident(len)operator(\);) + ident(arg)operator(->)ident(offset) operator(+=) ident(len)operator(;) + operator(}) + reserved(else) operator({) + label(too_short)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(marshal data too short)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(src) operator(=) ident(arg)operator(->)ident(src)operator(;) + ident(VALUE) ident(n) operator(=) ident(LONG2NUM)operator(()ident(len)operator(\);) + ident(str) operator(=) ident(rb_funcall2)operator(()ident(src)operator(,) ident(s_read)operator(,) integer(1)operator(,) operator(&)ident(n)operator(\);) + ident(check_load_arg)operator(()ident(arg)operator(,) ident(s_read)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(str)operator(\)\)) reserved(goto) ident(too_short)operator(;) + ident(StringValue)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(!=) ident(len)operator(\)) reserved(goto) ident(too_short)operator(;) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(str)operator(\)\)) ident(arg)operator(->)ident(taint) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(ID) +ident(r_symlink)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + ident(ID) ident(id)operator(;) + pre_type(long) ident(num) operator(=) ident(r_long)operator(()ident(arg)operator(\);) + + reserved(if) operator(()ident(st_lookup)operator(()ident(arg)operator(->)ident(symbols)operator(,) ident(num)operator(,) operator(&)ident(id)operator(\)\)) operator({) + reserved(return) ident(id)operator(;) + operator(}) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad symbol)delimiter(")>operator(\);) +operator(}) + +directive(static) ident(ID) +ident(r_symreal)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + ident(ID) ident(id)operator(;) + + ident(id) operator(=) ident(rb_intern)operator(()ident(RSTRING)operator(()ident(r_bytes)operator(()ident(arg)operator(\)\)->)ident(ptr)operator(\);) + ident(st_insert)operator(()ident(arg)operator(->)ident(symbols)operator(,) ident(arg)operator(->)ident(symbols)operator(->)ident(num_entries)operator(,) ident(id)operator(\);) + + reserved(return) ident(id)operator(;) +operator(}) + +directive(static) ident(ID) +ident(r_symbol)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(if) operator(()ident(r_byte)operator(()ident(arg)operator(\)) operator(==) ident(TYPE_SYMLINK)operator(\)) operator({) + reserved(return) ident(r_symlink)operator(()ident(arg)operator(\);) + operator(}) + reserved(return) ident(r_symreal)operator(()ident(arg)operator(\);) +operator(}) + +directive(static) pre_type(char)operator(*) +ident(r_unique)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(return) ident(rb_id2name)operator(()ident(r_symbol)operator(()ident(arg)operator(\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(r_string)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(return) ident(r_bytes)operator(()ident(arg)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(v)operator(;) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + ident(st_insert)operator(()ident(arg)operator(->)ident(data)operator(,) ident(arg)operator(->)ident(data)operator(->)ident(num_entries)operator(,) operator(()ident(st_data_t)operator(\))ident(v)operator(\);) + reserved(if) operator(()ident(arg)operator(->)ident(taint)operator(\)) ident(OBJ_TAINT)operator(()ident(v)operator(\);) + reserved(return) ident(v)operator(;) +operator(}) + +directive(static) directive(void) +ident(r_ivar)operator(()ident(obj)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(obj)operator(;) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + pre_type(long) ident(len)operator(;) + + ident(len) operator(=) ident(r_long)operator(()ident(arg)operator(\);) + reserved(if) operator(()ident(len) operator(>) integer(0)operator(\)) operator({) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(ID) ident(id) operator(=) ident(r_symbol)operator(()ident(arg)operator(\);) + ident(VALUE) ident(val) operator(=) ident(r_object)operator(()ident(arg)operator(\);) + ident(rb_ivar_set)operator(()ident(obj)operator(,) ident(id)operator(,) ident(val)operator(\);) + operator(}) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(path2class)operator(()ident(path)operator(\)) + pre_type(char) operator(*)ident(path)operator(;) +operator({) + ident(VALUE) ident(v) operator(=) ident(rb_path2class)operator(()ident(path)operator(\);) + + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(T_CLASS)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(%s does not refer class)delimiter(")>operator(,) ident(path)operator(\);) + operator(}) + reserved(return) ident(v)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(path2module)operator(()ident(path)operator(\)) + pre_type(char) operator(*)ident(path)operator(;) +operator({) + ident(VALUE) ident(v) operator(=) ident(rb_path2class)operator(()ident(path)operator(\);) + + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(T_MODULE)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(%s does not refer module)delimiter(")>operator(,) ident(path)operator(\);) + operator(}) + reserved(return) ident(v)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(r_object0)operator(()ident(arg)operator(,) ident(proc)operator(,) ident(ivp)operator(,) ident(extmod)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) + ident(VALUE) ident(proc)operator(;) + pre_type(int) operator(*)ident(ivp)operator(;) + ident(VALUE) ident(extmod)operator(;) +operator({) + ident(VALUE) ident(v) operator(=) ident(Qnil)operator(;) + pre_type(int) ident(type) operator(=) ident(r_byte)operator(()ident(arg)operator(\);) + pre_type(long) ident(id)operator(;) + ident(st_data_t) ident(link)operator(;) + + reserved(switch) operator(()ident(type)operator(\)) operator({) + reserved(case) label(TYPE_LINK)operator(:) + ident(id) operator(=) ident(r_long)operator(()ident(arg)operator(\);) + reserved(if) operator((!)ident(st_lookup)operator(()ident(arg)operator(->)ident(data)operator(,) operator(()ident(st_data_t)operator(\))ident(id)operator(,) operator(&)ident(link)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(dump format error (unlinked\))delimiter(")>operator(\);) + operator(}) + ident(v) operator(=) operator(()ident(st_data_t)operator(\))ident(link)operator(;) + reserved(return) ident(v)operator(;) + + reserved(case) label(TYPE_IVAR)operator(:) + operator({) + pre_type(int) ident(ivar) operator(=) ident(Qtrue)operator(;) + + ident(v) operator(=) ident(r_object0)operator(()ident(arg)operator(,) integer(0)operator(,) operator(&)ident(ivar)operator(,) ident(extmod)operator(\);) + reserved(if) operator(()ident(ivar)operator(\)) ident(r_ivar)operator(()ident(v)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_EXTENDED)operator(:) + operator({) + ident(VALUE) ident(m) operator(=) ident(path2module)operator(()ident(r_unique)operator(()ident(arg)operator(\)\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(extmod)operator(\)\)) ident(extmod) operator(=) ident(rb_ary_new2)operator(()integer(0)operator(\);) + ident(rb_ary_push)operator(()ident(extmod)operator(,) ident(m)operator(\);) + + ident(v) operator(=) ident(r_object0)operator(()ident(arg)operator(,) integer(0)operator(,) integer(0)operator(,) ident(extmod)operator(\);) + reserved(while) operator(()ident(RARRAY)operator(()ident(extmod)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(m) operator(=) ident(rb_ary_pop)operator(()ident(extmod)operator(\);) + ident(rb_extend_object)operator(()ident(v)operator(,) ident(m)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_UCLASS)operator(:) + operator({) + ident(VALUE) ident(c) operator(=) ident(path2class)operator(()ident(r_unique)operator(()ident(arg)operator(\)\);) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(c)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(singleton can't be loaded)delimiter(")>operator(\);) + operator(}) + ident(v) operator(=) ident(r_object0)operator(()ident(arg)operator(,) integer(0)operator(,) integer(0)operator(,) ident(extmod)operator(\);) + reserved(if) operator(()ident(rb_special_const_p)operator(()ident(v)operator(\)) operator(||) ident(TYPE)operator(()ident(v)operator(\)) operator(==) ident(T_OBJECT) operator(||) ident(TYPE)operator(()ident(v)operator(\)) operator(==) ident(T_CLASS)operator(\)) operator({) + label(format_error)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(dump format error (user class\))delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(==) ident(T_MODULE) operator(||) operator(!)ident(RTEST)operator(()ident(rb_class_inherited_p)operator(()ident(c)operator(,) ident(RBASIC)operator(()ident(v)operator(\)->)ident(klass)operator(\)\)\)) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_obj_alloc)operator(()ident(c)operator(\);) + + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(TYPE)operator(()ident(tmp)operator(\)\)) reserved(goto) ident(format_error)operator(;) + operator(}) + ident(RBASIC)operator(()ident(v)operator(\)->)ident(klass) operator(=) ident(c)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_NIL)operator(:) + ident(v) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + + reserved(case) label(TYPE_TRUE)operator(:) + ident(v) operator(=) ident(Qtrue)operator(;) + reserved(break)operator(;) + + reserved(case) label(TYPE_FALSE)operator(:) + ident(v) operator(=) ident(Qfalse)operator(;) + reserved(break)operator(;) + + reserved(case) label(TYPE_FIXNUM)operator(:) + operator({) + pre_type(long) ident(i) operator(=) ident(r_long)operator(()ident(arg)operator(\);) + ident(v) operator(=) ident(LONG2FIX)operator(()ident(i)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_FLOAT)operator(:) + operator({) + pre_type(double) ident(d)operator(,) ident(t) operator(=) float(0)float(.0)operator(;) + ident(VALUE) ident(str) operator(=) ident(r_bytes)operator(()ident(arg)operator(\);) + directive(const) pre_type(char) operator(*)ident(ptr) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + + reserved(if) operator(()ident(strcmp)operator(()ident(ptr)operator(,) string<delimiter(")content(nan)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(d) operator(=) ident(t) operator(/) ident(t)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(strcmp)operator(()ident(ptr)operator(,) string<delimiter(")content(inf)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(d) operator(=) float(1)float(.0) operator(/) ident(t)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(strcmp)operator(()ident(ptr)operator(,) string<delimiter(")content(-inf)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(d) operator(=) operator(-)float(1)float(.0) operator(/) ident(t)operator(;) + operator(}) + reserved(else) operator({) + pre_type(char) operator(*)ident(e)operator(;) + ident(d) operator(=) ident(strtod)operator(()ident(ptr)operator(,) operator(&)ident(e)operator(\);) + ident(d) operator(=) ident(load_mantissa)operator(()ident(d)operator(,) ident(e)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) operator(()ident(e) operator(-) ident(ptr)operator(\)\);) + operator(}) + ident(v) operator(=) ident(rb_float_new)operator(()ident(d)operator(\);) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_BIGNUM)operator(:) + operator({) + pre_type(long) ident(len)operator(;) + ident(BDIGIT) operator(*)ident(digits)operator(;) + directive(volatile) ident(VALUE) ident(data)operator(;) + + ident(NEWOBJ)operator(()ident(big)operator(,) reserved(struct) ident(RBignum)operator(\);) + ident(OBJSETUP)operator(()ident(big)operator(,) ident(rb_cBignum)operator(,) ident(T_BIGNUM)operator(\);) + ident(big)operator(->)ident(sign) operator(=) operator(()ident(r_byte)operator(()ident(arg)operator(\)) operator(==) char('+')operator(\);) + ident(len) operator(=) ident(r_long)operator(()ident(arg)operator(\);) + ident(data) operator(=) ident(r_bytes0)operator(()ident(len) operator(*) integer(2)operator(,) ident(arg)operator(\);) +preprocessor(#if) ident(SIZEOF_BDIGITS) operator(==) ident(SIZEOF_SHORT) + ident(big)operator(->)ident(len) operator(=) ident(len)operator(;) +preprocessor(#else) + ident(big)operator(->)ident(len) operator(=) operator(()ident(len) operator(+) integer(1)operator(\)) operator(*) integer(2) operator(/) reserved(sizeof)operator(()ident(BDIGIT)operator(\);) +preprocessor(#endif) + ident(big)operator(->)ident(digits) operator(=) ident(digits) operator(=) ident(ALLOC_N)operator(()ident(BDIGIT)operator(,) ident(big)operator(->)ident(len)operator(\);) + ident(MEMCPY)operator(()ident(digits)operator(,) ident(RSTRING)operator(()ident(data)operator(\)->)ident(ptr)operator(,) pre_type(char)operator(,) ident(len) operator(*) integer(2)operator(\);) +preprocessor(#if) ident(SIZEOF_BDIGITS) operator(>) ident(SIZEOF_SHORT) + ident(MEMZERO)operator((()pre_type(char) operator(*\))ident(digits) operator(+) ident(len) operator(*) integer(2)operator(,) pre_type(char)operator(,) + ident(big)operator(->)ident(len) operator(*) reserved(sizeof)operator(()ident(BDIGIT)operator(\)) operator(-) ident(len) operator(*) integer(2)operator(\);) +preprocessor(#endif) + ident(len) operator(=) ident(big)operator(->)ident(len)operator(;) + reserved(while) operator(()ident(len) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(char) operator(*)ident(p) operator(=) operator(()pre_type(unsigned) pre_type(char) operator(*\))ident(digits)operator(;) + ident(BDIGIT) ident(num) operator(=) integer(0)operator(;) +preprocessor(#if) ident(SIZEOF_BDIGITS) operator(>) ident(SIZEOF_SHORT) + pre_type(int) ident(shift) operator(=) integer(0)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(SIZEOF_BDIGITS)operator(;) ident(i)operator(++\)) operator({) + ident(num) operator(|=) operator(()pre_type(int)operator(\))ident(p)operator([)ident(i)operator(]) operator(<<) ident(shift)operator(;) + ident(shift) operator(+=) integer(8)operator(;) + operator(}) +preprocessor(#else) + ident(num) operator(=) ident(p)operator([)integer(0)operator(]) operator(|) operator(()ident(p)operator([)integer(1)operator(]) operator(<<) integer(8)operator(\);) +preprocessor(#endif) + operator(*)ident(digits)operator(++) operator(=) ident(num)operator(;) + ident(len)operator(--;) + operator(}) + ident(v) operator(=) ident(rb_big_norm)operator((()ident(VALUE)operator(\))ident(big)operator(\);) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_STRING)operator(:) + ident(v) operator(=) ident(r_entry)operator(()ident(r_string)operator(()ident(arg)operator(\),) ident(arg)operator(\);) + reserved(break)operator(;) + + reserved(case) label(TYPE_REGEXP)operator(:) + operator({) + directive(volatile) ident(VALUE) ident(str) operator(=) ident(r_bytes)operator(()ident(arg)operator(\);) + pre_type(int) ident(options) operator(=) ident(r_byte)operator(()ident(arg)operator(\);) + ident(v) operator(=) ident(r_entry)operator(()ident(rb_reg_new)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) ident(options)operator(\),) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_ARRAY)operator(:) + operator({) + directive(volatile) pre_type(long) ident(len) operator(=) ident(r_long)operator(()ident(arg)operator(\);) comment(/* gcc 2.7.2.3 -O2 bug?? */) + + ident(v) operator(=) ident(rb_ary_new2)operator(()ident(len)operator(\);) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(rb_ary_push)operator(()ident(v)operator(,) ident(r_object)operator(()ident(arg)operator(\)\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_HASH)operator(:) + reserved(case) label(TYPE_HASH_DEF)operator(:) + operator({) + pre_type(long) ident(len) operator(=) ident(r_long)operator(()ident(arg)operator(\);) + + ident(v) operator(=) ident(rb_hash_new)operator((\);) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(VALUE) ident(key) operator(=) ident(r_object)operator(()ident(arg)operator(\);) + ident(VALUE) ident(value) operator(=) ident(r_object)operator(()ident(arg)operator(\);) + ident(rb_hash_aset)operator(()ident(v)operator(,) ident(key)operator(,) ident(value)operator(\);) + operator(}) + reserved(if) operator(()ident(type) operator(==) ident(TYPE_HASH_DEF)operator(\)) operator({) + ident(RHASH)operator(()ident(v)operator(\)->)ident(ifnone) operator(=) ident(r_object)operator(()ident(arg)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_STRUCT)operator(:) + operator({) + ident(VALUE) ident(klass)operator(,) ident(mem)operator(,) ident(values)operator(;) + directive(volatile) pre_type(long) ident(i)operator(;) comment(/* gcc 2.7.2.3 -O2 bug?? */) + pre_type(long) ident(len)operator(;) + ident(ID) ident(slot)operator(;) + + ident(klass) operator(=) ident(path2class)operator(()ident(r_unique)operator(()ident(arg)operator(\)\);) + ident(mem) operator(=) ident(rb_struct_s_members)operator(()ident(klass)operator(\);) + reserved(if) operator(()ident(mem) operator(==) ident(Qnil)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(uninitialized struct)delimiter(")>operator(\);) + operator(}) + ident(len) operator(=) ident(r_long)operator(()ident(arg)operator(\);) + + ident(values) operator(=) ident(rb_ary_new2)operator(()ident(len)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(values)operator(,) ident(Qnil)operator(\);) + operator(}) + ident(v) operator(=) ident(rb_struct_alloc)operator(()ident(klass)operator(,) ident(values)operator(\);) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(slot) operator(=) ident(r_symbol)operator(()ident(arg)operator(\);) + + reserved(if) operator(()ident(RARRAY)operator(()ident(mem)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(!=) ident(ID2SYM)operator(()ident(slot)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(struct %s not compatible (:%s for :%s\))delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(klass)operator(\),) + ident(rb_id2name)operator(()ident(slot)operator(\),) + ident(rb_id2name)operator(()ident(SYM2ID)operator(()ident(RARRAY)operator(()ident(mem)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)\)\);) + operator(}) + ident(rb_struct_aset)operator(()ident(v)operator(,) ident(LONG2FIX)operator(()ident(i)operator(\),) ident(r_object)operator(()ident(arg)operator(\)\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_USERDEF)operator(:) + operator({) + ident(VALUE) ident(klass) operator(=) ident(path2class)operator(()ident(r_unique)operator(()ident(arg)operator(\)\);) + ident(VALUE) ident(data)operator(;) + + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(klass)operator(,) ident(s_load)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(class %s needs to have method `_load')delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(klass)operator(\)\);) + operator(}) + ident(data) operator(=) ident(r_string)operator(()ident(arg)operator(\);) + reserved(if) operator(()ident(ivp)operator(\)) operator({) + ident(r_ivar)operator(()ident(data)operator(,) ident(arg)operator(\);) + operator(*)ident(ivp) operator(=) ident(Qfalse)operator(;) + operator(}) + ident(v) operator(=) ident(rb_funcall)operator(()ident(klass)operator(,) ident(s_load)operator(,) integer(1)operator(,) ident(data)operator(\);) + ident(check_load_arg)operator(()ident(arg)operator(,) ident(s_load)operator(\);) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_USRMARSHAL)operator(:) + operator({) + ident(VALUE) ident(klass) operator(=) ident(path2class)operator(()ident(r_unique)operator(()ident(arg)operator(\)\);) + ident(VALUE) ident(data)operator(;) + + ident(v) operator(=) ident(rb_obj_alloc)operator(()ident(klass)operator(\);) + reserved(if) operator((!) ident(NIL_P)operator(()ident(extmod)operator(\)\)) operator({) + reserved(while) operator(()ident(RARRAY)operator(()ident(extmod)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(VALUE) ident(m) operator(=) ident(rb_ary_pop)operator(()ident(extmod)operator(\);) + ident(rb_extend_object)operator(()ident(v)operator(,) ident(m)operator(\);) + operator(}) + operator(}) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(v)operator(,) ident(s_mload)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(instance of %s needs to have method `marshal_load')delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(klass)operator(\)\);) + operator(}) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + ident(data) operator(=) ident(r_object)operator(()ident(arg)operator(\);) + ident(rb_funcall)operator(()ident(v)operator(,) ident(s_mload)operator(,) integer(1)operator(,) ident(data)operator(\);) + ident(check_load_arg)operator(()ident(arg)operator(,) ident(s_mload)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_OBJECT)operator(:) + operator({) + ident(VALUE) ident(klass) operator(=) ident(path2class)operator(()ident(r_unique)operator(()ident(arg)operator(\)\);) + + ident(v) operator(=) ident(rb_obj_alloc)operator(()ident(klass)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(T_OBJECT)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(dump format error)delimiter(")>operator(\);) + operator(}) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + ident(r_ivar)operator(()ident(v)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_DATA)operator(:) + operator({) + ident(VALUE) ident(klass) operator(=) ident(path2class)operator(()ident(r_unique)operator(()ident(arg)operator(\)\);) + reserved(if) operator(()ident(rb_respond_to)operator(()ident(klass)operator(,) ident(s_alloc)operator(\)\)) operator({) + directive(static) pre_type(int) ident(warn) operator(=) ident(Qtrue)operator(;) + reserved(if) operator(()ident(warn)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(define `allocate' instead of `_alloc')delimiter(")>operator(\);) + ident(warn) operator(=) ident(Qfalse)operator(;) + operator(}) + ident(v) operator(=) ident(rb_funcall)operator(()ident(klass)operator(,) ident(s_alloc)operator(,) integer(0)operator(\);) + ident(check_load_arg)operator(()ident(arg)operator(,) ident(s_alloc)operator(\);) + operator(}) + reserved(else) operator({) + ident(v) operator(=) ident(rb_obj_alloc)operator(()ident(klass)operator(\);) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(T_DATA)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(dump format error)delimiter(")>operator(\);) + operator(}) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(v)operator(,) ident(s_load_data)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) + string<delimiter(")content(class %s needs to have instance method `_load_data')delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(klass)operator(\)\);) + operator(}) + ident(rb_funcall)operator(()ident(v)operator(,) ident(s_load_data)operator(,) integer(1)operator(,) ident(r_object0)operator(()ident(arg)operator(,) integer(0)operator(,) integer(0)operator(,) ident(extmod)operator(\)\);) + ident(check_load_arg)operator(()ident(arg)operator(,) ident(s_load_data)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_MODULE_OLD)operator(:) + operator({) + directive(volatile) ident(VALUE) ident(str) operator(=) ident(r_bytes)operator(()ident(arg)operator(\);) + + ident(v) operator(=) ident(rb_path2class)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_CLASS)operator(:) + operator({) + directive(volatile) ident(VALUE) ident(str) operator(=) ident(r_bytes)operator(()ident(arg)operator(\);) + + ident(v) operator(=) ident(path2class)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_MODULE)operator(:) + operator({) + directive(volatile) ident(VALUE) ident(str) operator(=) ident(r_bytes)operator(()ident(arg)operator(\);) + + ident(v) operator(=) ident(path2module)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(r_entry)operator(()ident(v)operator(,) ident(arg)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(TYPE_SYMBOL)operator(:) + ident(v) operator(=) ident(ID2SYM)operator(()ident(r_symreal)operator(()ident(arg)operator(\)\);) + reserved(break)operator(;) + + reserved(case) label(TYPE_SYMLINK)operator(:) + reserved(return) ident(ID2SYM)operator(()ident(r_symlink)operator(()ident(arg)operator(\)\);) + + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(dump format error(0x%x\))delimiter(")>operator(,) ident(type)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(proc)operator(\)) operator({) + ident(rb_funcall)operator(()ident(proc)operator(,) ident(s_call)operator(,) integer(1)operator(,) ident(v)operator(\);) + ident(check_load_arg)operator(()ident(arg)operator(,) ident(s_call)operator(\);) + operator(}) + reserved(return) ident(v)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(r_object)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(return) ident(r_object0)operator(()ident(arg)operator(,) ident(arg)operator(->)ident(proc)operator(,) integer(0)operator(,) ident(Qnil)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(load)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(return) ident(r_object)operator(()ident(arg)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(load_ensure)operator(()ident(arg)operator(\)) + reserved(struct) ident(load_arg) operator(*)ident(arg)operator(;) +operator({) + reserved(if) operator((!)ident(DATA_PTR)operator(()ident(arg)operator(->)ident(wrapper)operator(\)\)) reserved(return) integer(0)operator(;) + ident(st_free_table)operator(()ident(arg)operator(->)ident(symbols)operator(\);) + ident(st_free_table)operator(()ident(arg)operator(->)ident(data)operator(\);) + ident(DATA_PTR)operator(()ident(arg)operator(->)ident(wrapper)operator(\)) operator(=) integer(0)operator(;) + ident(arg)operator(->)ident(wrapper) operator(=) integer(0)operator(;) + reserved(return) integer(0)operator(;) +operator(}) + +comment(/* + * call-seq: + * load( source [, proc] \) => obj + * restore( source [, proc] \) => obj + * + * Returns the result of converting the serialized data in source into a + * Ruby object (possibly with associated subordinate objects\). source + * may be either an instance of IO or an object that responds to + * to_str. If proc is specified, it will be passed each object as it + * is deserialized. + */) +directive(static) ident(VALUE) +ident(marshal_load)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(port)operator(,) ident(proc)operator(;) + pre_type(int) ident(major)operator(,) ident(minor)operator(;) + ident(VALUE) ident(v)operator(;) + reserved(struct) ident(load_arg) ident(arg)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(port)operator(,) operator(&)ident(proc)operator(\);) + ident(v) operator(=) ident(rb_check_string_type)operator(()ident(port)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(v)operator(\)\)) operator({) + ident(arg)operator(.)ident(taint) operator(=) ident(OBJ_TAINTED)operator(()ident(port)operator(\);) comment(/* original taintedness */) + ident(port) operator(=) ident(v)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(rb_respond_to)operator(()ident(port)operator(,) ident(s_getc)operator(\)) operator(&&) ident(rb_respond_to)operator(()ident(port)operator(,) ident(s_read)operator(\)\)) operator({) + reserved(if) operator(()ident(rb_respond_to)operator(()ident(port)operator(,) ident(s_binmode)operator(\)\)) operator({) + ident(rb_funcall2)operator(()ident(port)operator(,) ident(s_binmode)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + ident(arg)operator(.)ident(taint) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(instance of IO needed)delimiter(")>operator(\);) + operator(}) + ident(arg)operator(.)ident(src) operator(=) ident(port)operator(;) + ident(arg)operator(.)ident(offset) operator(=) integer(0)operator(;) + ident(arg)operator(.)ident(symbols) operator(=) ident(st_init_numtable)operator((\);) + ident(arg)operator(.)ident(data) operator(=) ident(st_init_numtable)operator((\);) + ident(arg)operator(.)ident(proc) operator(=) integer(0)operator(;) + ident(arg)operator(.)ident(wrapper) operator(=) ident(Data_Wrap_Struct)operator(()ident(rb_cData)operator(,) ident(mark_load_arg)operator(,) integer(0)operator(,) operator(&)ident(arg)operator(\);) + + ident(major) operator(=) ident(r_byte)operator((&)ident(arg)operator(\);) + ident(minor) operator(=) ident(r_byte)operator((&)ident(arg)operator(\);) + reserved(if) operator(()ident(major) operator(!=) ident(MARSHAL_MAJOR) operator(||) ident(minor) operator(>) ident(MARSHAL_MINOR)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(incompatible marshal file format (can't be read\))char(\\n)char(\\ +)char(\\t)content(format version %d.%d required; %d.%d given)delimiter(")>operator(,) + ident(MARSHAL_MAJOR)operator(,) ident(MARSHAL_MINOR)operator(,) ident(major)operator(,) ident(minor)operator(\);) + operator(}) + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)) operator(&&) ident(minor) operator(!=) ident(MARSHAL_MINOR)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(incompatible marshal file format (can be read\))char(\\n)char(\\ +)char(\\t)content(format version %d.%d required; %d.%d given)delimiter(")>operator(,) + ident(MARSHAL_MAJOR)operator(,) ident(MARSHAL_MINOR)operator(,) ident(major)operator(,) ident(minor)operator(\);) + operator(}) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(proc)operator(\)\)) ident(arg)operator(.)ident(proc) operator(=) ident(proc)operator(;) + ident(v) operator(=) ident(rb_ensure)operator(()ident(load)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(,) ident(load_ensure)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(\);) + + reserved(return) ident(v)operator(;) +operator(}) + +comment(/* + * The marshaling library converts collections of Ruby objects into a + * byte stream, allowing them to be stored outside the currently + * active script. This data may subsequently be read and the original + * objects reconstituted. + * Marshaled data has major and minor version numbers stored along + * with the object information. In normal use, marshaling can only + * load data written with the same major version number and an equal + * or lower minor version number. If Ruby's ``verbose'' flag is set + * (normally using -d, -v, -w, or --verbose\) the major and minor + * numbers must match exactly. Marshal versioning is independent of + * Ruby's version numbers. You can extract the version by reading the + * first two bytes of marshaled data. + * + * str = Marshal.dump("thing"\) + * RUBY_VERSION #=> "1.8.0" + * str[0] #=> 4 + * str[1] #=> 8 + * + * Some objects cannot be dumped: if the objects to be dumped include + * bindings, procedure or method objects, instances of class IO, or + * singleton objects, a TypeError will be raised. + * If your class has special serialization needs (for example, if you + * want to serialize in some specific format\), or if it contains + * objects that would otherwise not be serializable, you can implement + * your own serialization strategy by defining two methods, _dump and + * _load: + * The instance method _dump should return a String object containing + * all the information necessary to reconstitute objects of this class + * and all referenced objects up to a maximum depth given as an integer + * parameter (a value of -1 implies that you should disable depth checking\). + * The class method _load should take a String and return an object of this class. + */) +directive(void) +ident(Init_marshal)operator((\)) +operator({) + ident(VALUE) ident(rb_mMarshal) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(Marshal)delimiter(")>operator(\);) + + ident(s_dump) operator(=) ident(rb_intern)operator(()string<delimiter(")content(_dump)delimiter(")>operator(\);) + ident(s_load) operator(=) ident(rb_intern)operator(()string<delimiter(")content(_load)delimiter(")>operator(\);) + ident(s_mdump) operator(=) ident(rb_intern)operator(()string<delimiter(")content(marshal_dump)delimiter(")>operator(\);) + ident(s_mload) operator(=) ident(rb_intern)operator(()string<delimiter(")content(marshal_load)delimiter(")>operator(\);) + ident(s_dump_data) operator(=) ident(rb_intern)operator(()string<delimiter(")content(_dump_data)delimiter(")>operator(\);) + ident(s_load_data) operator(=) ident(rb_intern)operator(()string<delimiter(")content(_load_data)delimiter(")>operator(\);) + ident(s_alloc) operator(=) ident(rb_intern)operator(()string<delimiter(")content(_alloc)delimiter(")>operator(\);) + ident(s_call) operator(=) ident(rb_intern)operator(()string<delimiter(")content(call)delimiter(")>operator(\);) + ident(s_getc) operator(=) ident(rb_intern)operator(()string<delimiter(")content(getc)delimiter(")>operator(\);) + ident(s_read) operator(=) ident(rb_intern)operator(()string<delimiter(")content(read)delimiter(")>operator(\);) + ident(s_write) operator(=) ident(rb_intern)operator(()string<delimiter(")content(write)delimiter(")>operator(\);) + ident(s_binmode) operator(=) ident(rb_intern)operator(()string<delimiter(")content(binmode)delimiter(")>operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mMarshal)operator(,) string<delimiter(")content(dump)delimiter(")>operator(,) ident(marshal_dump)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMarshal)operator(,) string<delimiter(")content(load)delimiter(")>operator(,) ident(marshal_load)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMarshal)operator(,) string<delimiter(")content(restore)delimiter(")>operator(,) ident(marshal_load)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_const)operator(()ident(rb_mMarshal)operator(,) string<delimiter(")content(MAJOR_VERSION)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(MARSHAL_MAJOR)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_mMarshal)operator(,) string<delimiter(")content(MINOR_VERSION)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(MARSHAL_MINOR)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_marshal_dump)operator(()ident(obj)operator(,) ident(port)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(port)operator(;) +operator({) + pre_type(int) ident(argc) operator(=) integer(1)operator(;) + ident(VALUE) ident(argv)operator([)integer(2)operator(];) + + ident(argv)operator([)integer(0)operator(]) operator(=) ident(obj)operator(;) + ident(argv)operator([)integer(1)operator(]) operator(=) ident(port)operator(;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(port)operator(\)\)) ident(argc) operator(=) integer(2)operator(;) + reserved(return) ident(marshal_dump)operator(()ident(argc)operator(,) ident(argv)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_marshal_load)operator(()ident(port)operator(\)) + ident(VALUE) ident(port)operator(;) +operator({) + reserved(return) ident(marshal_load)operator(()integer(1)operator(,) operator(&)ident(port)operator(\);) +operator(}) +comment(/********************************************************************** + + math.c - + + $Author: shyouhei $ + $Date: 2008-07-02 11:25:48 +0200 (Wed, 02 Jul 2008\) $ + created at: Tue Jan 25 14:12:56 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include(<math.h>) +preprocessor(#include) include(<errno.h>) + +ident(VALUE) ident(rb_mMath)operator(;) + +preprocessor(#define) ident(Need_Float)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) operator(=) ident(rb_Float)operator(()ident(x)operator(\)) +preprocessor(#define) ident(Need_Float2)operator(()ident(x)operator(,)ident(y)operator(\)) reserved(do) operator({)\ + ident(Need_Float)operator(()ident(x)operator(\);)\ + ident(Need_Float)operator(()ident(y)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +directive(static) directive(void) +ident(domain_check)operator(()ident(x)operator(,) ident(msg)operator(\)) + pre_type(double) ident(x)operator(;) + pre_type(char) operator(*)ident(msg)operator(;) +operator({) + reserved(while)operator(()integer(1)operator(\)) operator({) + reserved(if) operator(()ident(errno)operator(\)) operator({) + ident(rb_sys_fail)operator(()ident(msg)operator(\);) + operator(}) + reserved(if) operator(()ident(isnan)operator(()ident(x)operator(\)\)) operator({) +preprocessor(#if) ident(defined)operator(()ident(EDOM)operator(\)) + ident(errno) operator(=) ident(EDOM)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(ERANGE)operator(\)) + ident(errno) operator(=) ident(ERANGE)operator(;) +preprocessor(#endif) + reserved(continue)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) +operator(}) + + +comment(/* + * call-seq: + * Math.atan2(y, x\) => float + * + * Computes the arc tangent given <i>y</i> and <i>x</i>. Returns + * -PI..PI. + * + */) + +directive(static) ident(VALUE) +ident(math_atan2)operator(()ident(obj)operator(,) ident(y)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(Need_Float2)operator(()ident(y)operator(,) ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(atan2)operator(()ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(,) ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * Math.cos(x\) => float + * + * Computes the cosine of <i>x</i> (expressed in radians\). Returns + * -1..1. + */) + +directive(static) ident(VALUE) +ident(math_cos)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(cos)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * Math.sin(x\) => float + * + * Computes the sine of <i>x</i> (expressed in radians\). Returns + * -1..1. + */) + +directive(static) ident(VALUE) +ident(math_sin)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + + reserved(return) ident(rb_float_new)operator(()ident(sin)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * Math.tan(x\) => float + * + * Returns the tangent of <i>x</i> (expressed in radians\). + */) + +directive(static) ident(VALUE) +ident(math_tan)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + + reserved(return) ident(rb_float_new)operator(()ident(tan)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * Math.acos(x\) => float + * + * Computes the arc cosine of <i>x</i>. Returns 0..PI. + */) + +directive(static) ident(VALUE) +ident(math_acos)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + + ident(Need_Float)operator(()ident(x)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + ident(d) operator(=) ident(acos)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\);) + ident(domain_check)operator(()ident(d)operator(,) string<delimiter(")content(acos)delimiter(")>operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(d)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Math.asin(x\) => float + * + * Computes the arc sine of <i>x</i>. Returns 0..PI. + */) + +directive(static) ident(VALUE) +ident(math_asin)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + + ident(Need_Float)operator(()ident(x)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + ident(d) operator(=) ident(asin)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\);) + ident(domain_check)operator(()ident(d)operator(,) string<delimiter(")content(asin)delimiter(")>operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(d)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Math.atan(x\) => float + * + * Computes the arc tangent of <i>x</i>. Returns -{PI/2} .. {PI/2}. + */) + +directive(static) ident(VALUE) +ident(math_atan)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(atan)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +preprocessor(#ifndef) ident(HAVE_COSH) +pre_type(double) +ident(cosh)operator(()ident(x)operator(\)) + pre_type(double) ident(x)operator(;) +operator({) + reserved(return) operator(()ident(exp)operator(()ident(x)operator(\)) operator(+) ident(exp)operator((-)ident(x)operator(\)\)) operator(/) integer(2)operator(;) +operator(}) +preprocessor(#endif) + +comment(/* + * call-seq: + * Math.cosh(x\) => float + * + * Computes the hyperbolic cosine of <i>x</i> (expressed in radians\). + */) + +directive(static) ident(VALUE) +ident(math_cosh)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + + reserved(return) ident(rb_float_new)operator(()ident(cosh)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +preprocessor(#ifndef) ident(HAVE_SINH) +pre_type(double) +ident(sinh)operator(()ident(x)operator(\)) + pre_type(double) ident(x)operator(;) +operator({) + reserved(return) operator(()ident(exp)operator(()ident(x)operator(\)) operator(-) ident(exp)operator((-)ident(x)operator(\)\)) operator(/) integer(2)operator(;) +operator(}) +preprocessor(#endif) + +comment(/* + * call-seq: + * Math.sinh(x\) => float + * + * Computes the hyperbolic sine of <i>x</i> (expressed in + * radians\). + */) + +directive(static) ident(VALUE) +ident(math_sinh)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(sinh)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +preprocessor(#ifndef) ident(HAVE_TANH) +pre_type(double) +ident(tanh)operator(()ident(x)operator(\)) + pre_type(double) ident(x)operator(;) +operator({) + reserved(return) ident(sinh)operator(()ident(x)operator(\)) operator(/) ident(cosh)operator(()ident(x)operator(\);) +operator(}) +preprocessor(#endif) + +comment(/* + * call-seq: + * Math.tanh(\) => float + * + * Computes the hyperbolic tangent of <i>x</i> (expressed in + * radians\). + */) + +directive(static) ident(VALUE) +ident(math_tanh)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(tanh)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * Math.acosh(x\) => float + * + * Computes the inverse hyperbolic cosine of <i>x</i>. + */) + +directive(static) ident(VALUE) +ident(math_acosh)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + + ident(Need_Float)operator(()ident(x)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + ident(d) operator(=) ident(acosh)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\);) + ident(domain_check)operator(()ident(d)operator(,) string<delimiter(")content(acosh)delimiter(")>operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(d)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Math.asinh(x\) => float + * + * Computes the inverse hyperbolic sine of <i>x</i>. + */) + +directive(static) ident(VALUE) +ident(math_asinh)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(asinh)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * Math.atanh(x\) => float + * + * Computes the inverse hyperbolic tangent of <i>x</i>. + */) + +directive(static) ident(VALUE) +ident(math_atanh)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + + ident(Need_Float)operator(()ident(x)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + ident(d) operator(=) ident(atanh)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\);) + ident(domain_check)operator(()ident(d)operator(,) string<delimiter(")content(atanh)delimiter(")>operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(d)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Math.exp(x\) => float + * + * Returns e**x. + */) + +directive(static) ident(VALUE) +ident(math_exp)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(exp)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +preprocessor(#if) ident(defined) ident(__CYGWIN__) +preprocessor(# include) include(<cygwin/version.h>) +preprocessor(# if) ident(CYGWIN_VERSION_DLL_MAJOR) operator(<) integer(1005) +preprocessor(# define) ident(nan)operator(()ident(x)operator(\)) ident(nan)operator((\)) +preprocessor(# endif) +preprocessor(# define) ident(log)operator(()ident(x)operator(\)) operator((()ident(x)operator(\)) operator(<) float(0)float(.0) operator(?) ident(nan)operator(()string<delimiter(")delimiter(")>operator(\)) operator(:) ident(log)operator(()ident(x)operator(\)\)) +preprocessor(# define) ident(log10)operator(()ident(x)operator(\)) operator((()ident(x)operator(\)) operator(<) float(0)float(.0) operator(?) ident(nan)operator(()string<delimiter(")delimiter(")>operator(\)) operator(:) ident(log10)operator(()ident(x)operator(\)\)) +preprocessor(#endif) + +comment(/* + * call-seq: + * Math.log(numeric\) => float + * + * Returns the natural logarithm of <i>numeric</i>. + */) + +directive(static) ident(VALUE) +ident(math_log)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + + ident(Need_Float)operator(()ident(x)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + ident(d) operator(=) ident(log)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\);) + ident(domain_check)operator(()ident(d)operator(,) string<delimiter(")content(log)delimiter(")>operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(d)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Math.log10(numeric\) => float + * + * Returns the base 10 logarithm of <i>numeric</i>. + */) + +directive(static) ident(VALUE) +ident(math_log10)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + + ident(Need_Float)operator(()ident(x)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + ident(d) operator(=) ident(log10)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\);) + ident(domain_check)operator(()ident(d)operator(,) string<delimiter(")content(log10)delimiter(")>operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(d)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Math.sqrt(numeric\) => float + * + * Returns the non-negative square root of <i>numeric</i>. + */) + +directive(static) ident(VALUE) +ident(math_sqrt)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + + ident(Need_Float)operator(()ident(x)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + ident(d) operator(=) ident(sqrt)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\);) + ident(domain_check)operator(()ident(d)operator(,) string<delimiter(")content(sqrt)delimiter(")>operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(d)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Math.frexp(numeric\) => [ fraction, exponent ] + * + * Returns a two-element array containing the normalized fraction (a + * <code>Float</code>\) and exponent (a <code>Fixnum</code>\) of + * <i>numeric</i>. + * + * fraction, exponent = Math.frexp(1234\) #=> [0.6025390625, 11] + * fraction * 2**exponent #=> 1234.0 + */) + +directive(static) ident(VALUE) +ident(math_frexp)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + pre_type(int) ident(exp)operator(;) + + ident(Need_Float)operator(()ident(x)operator(\);) + + ident(d) operator(=) ident(frexp)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(,) operator(&)ident(exp)operator(\);) + reserved(return) ident(rb_assoc_new)operator(()ident(rb_float_new)operator(()ident(d)operator(\),) ident(INT2NUM)operator(()ident(exp)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * Math.ldexp(flt, int\) -> float + * + * Returns the value of <i>flt</i>*(2**<i>int</i>\). + * + * fraction, exponent = Math.frexp(1234\) + * Math.ldexp(fraction, exponent\) #=> 1234.0 + */) + +directive(static) ident(VALUE) +ident(math_ldexp)operator(()ident(obj)operator(,) ident(x)operator(,) ident(n)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(,) ident(n)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(ldexp)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(,) ident(NUM2INT)operator(()ident(n)operator(\)\)\);) +operator(}) + +comment(/* + * call-seq: + * Math.hypot(x, y\) => float + * + * Returns sqrt(x**2 + y**2\), the hypotenuse of a right-angled triangle + * with sides <i>x</i> and <i>y</i>. + * + * Math.hypot(3, 4\) #=> 5.0 + */) + +directive(static) ident(VALUE) +ident(math_hypot)operator(()ident(obj)operator(,) ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(Need_Float2)operator(()ident(x)operator(,) ident(y)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(hypot)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(,) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * Math.erf(x\) => float + * + * Calculates the error function of x. + */) + +directive(static) ident(VALUE) +ident(math_erf)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(erf)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * Math.erfc(x\) => float + * + * Calculates the complementary error function of x. + */) + +directive(static) ident(VALUE) +ident(math_erfc)operator(()ident(obj)operator(,) ident(x)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(x)operator(;) +operator({) + ident(Need_Float)operator(()ident(x)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(erfc)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(\)\);) +operator(}) + +comment(/* + * The <code>Math</code> module contains module functions for basic + * trigonometric and transcendental functions. See class + * <code>Float</code> for a list of constants that + * define Ruby's floating point accuracy. + */) + + +directive(void) +ident(Init_Math)operator((\)) +operator({) + ident(rb_mMath) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(Math)delimiter(")>operator(\);) + +preprocessor(#ifdef) ident(M_PI) + ident(rb_define_const)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(PI)delimiter(")>operator(,) ident(rb_float_new)operator(()ident(M_PI)operator(\)\);) +preprocessor(#else) + ident(rb_define_const)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(PI)delimiter(")>operator(,) ident(rb_float_new)operator(()ident(atan)operator(()float(1)float(.0)operator(\)*)float(4)float(.0)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifdef) ident(M_E) + ident(rb_define_const)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(E)delimiter(")>operator(,) ident(rb_float_new)operator(()ident(M_E)operator(\)\);) +preprocessor(#else) + ident(rb_define_const)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(E)delimiter(")>operator(,) ident(rb_float_new)operator(()ident(exp)operator(()float(1)float(.0)operator(\)\)\);) +preprocessor(#endif) + + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(atan2)delimiter(")>operator(,) ident(math_atan2)operator(,) integer(2)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(cos)delimiter(")>operator(,) ident(math_cos)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(sin)delimiter(")>operator(,) ident(math_sin)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(tan)delimiter(")>operator(,) ident(math_tan)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(acos)delimiter(")>operator(,) ident(math_acos)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(asin)delimiter(")>operator(,) ident(math_asin)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(atan)delimiter(")>operator(,) ident(math_atan)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(cosh)delimiter(")>operator(,) ident(math_cosh)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(sinh)delimiter(")>operator(,) ident(math_sinh)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(tanh)delimiter(")>operator(,) ident(math_tanh)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(acosh)delimiter(")>operator(,) ident(math_acosh)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(asinh)delimiter(")>operator(,) ident(math_asinh)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(atanh)delimiter(")>operator(,) ident(math_atanh)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(exp)delimiter(")>operator(,) ident(math_exp)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(log)delimiter(")>operator(,) ident(math_log)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(log10)delimiter(")>operator(,) ident(math_log10)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(sqrt)delimiter(")>operator(,) ident(math_sqrt)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(frexp)delimiter(")>operator(,) ident(math_frexp)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(ldexp)delimiter(")>operator(,) ident(math_ldexp)operator(,) integer(2)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(hypot)delimiter(")>operator(,) ident(math_hypot)operator(,) integer(2)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(erf)delimiter(")>operator(,) ident(math_erf)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mMath)operator(,) string<delimiter(")content(erfc)delimiter(")>operator(,) ident(math_erfc)operator(,) integer(1)operator(\);) +operator(}) +comment(/********************************************************************** + + numeric.c - + + $Author: wyhaines $ + $Date: 2009-07-14 17:05:27 +0200 (Tue, 14 Jul 2009\) $ + created at: Fri Aug 13 18:33:09 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("env.h") +preprocessor(#include) include(<ctype.h>) +preprocessor(#include) include(<math.h>) +preprocessor(#include) include(<stdio.h>) + +preprocessor(#if) ident(defined)operator(()ident(__FreeBSD__)operator(\)) operator(&&) ident(__FreeBSD__) operator(<) integer(4) +preprocessor(#include) include(<floatingpoint.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_FLOAT_H) +preprocessor(#include) include(<float.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_IEEEFP_H) +preprocessor(#include) include(<ieeefp.h>) +preprocessor(#endif) + +comment(/* use IEEE 64bit values if not defined */) +preprocessor(#ifndef) ident(FLT_RADIX) +preprocessor(#define) ident(FLT_RADIX) integer(2) +preprocessor(#endif) +preprocessor(#ifndef) ident(FLT_ROUNDS) +preprocessor(#define) ident(FLT_ROUNDS) integer(1) +preprocessor(#endif) +preprocessor(#ifndef) ident(DBL_MIN) +preprocessor(#define) ident(DBL_MIN) float(2)float(.2250738585072014e-308) +preprocessor(#endif) +preprocessor(#ifndef) ident(DBL_MAX) +preprocessor(#define) ident(DBL_MAX) float(1)float(.7976931348623157e+308) +preprocessor(#endif) +preprocessor(#ifndef) ident(DBL_MIN_EXP) +preprocessor(#define) ident(DBL_MIN_EXP) operator((-)integer(1021)operator(\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(DBL_MAX_EXP) +preprocessor(#define) ident(DBL_MAX_EXP) integer(1024) +preprocessor(#endif) +preprocessor(#ifndef) ident(DBL_MIN_10_EXP) +preprocessor(#define) ident(DBL_MIN_10_EXP) operator((-)integer(307)operator(\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(DBL_MAX_10_EXP) +preprocessor(#define) ident(DBL_MAX_10_EXP) integer(308) +preprocessor(#endif) +preprocessor(#ifndef) ident(DBL_DIG) +preprocessor(#define) ident(DBL_DIG) integer(15) +preprocessor(#endif) +preprocessor(#ifndef) ident(DBL_MANT_DIG) +preprocessor(#define) ident(DBL_MANT_DIG) integer(53) +preprocessor(#endif) +preprocessor(#ifndef) ident(DBL_EPSILON) +preprocessor(#define) ident(DBL_EPSILON) float(2)float(.2204460492503131e-16) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_ROUND) +pre_type(double) +ident(round)operator(()ident(x)operator(\)) + pre_type(double) ident(x)operator(;) +operator({) + pre_type(double) ident(f)operator(;) + + reserved(if) operator(()ident(x) operator(>) float(0)float(.0)operator(\)) operator({) + ident(f) operator(=) ident(floor)operator(()ident(x)operator(\);) + ident(x) operator(=) ident(f) operator(+) operator(()ident(x) operator(-) ident(f) operator(>=) float(0)float(.5)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(x) operator(<) float(0)float(.0)operator(\)) operator({) + ident(f) operator(=) ident(ceil)operator(()ident(x)operator(\);) + ident(x) operator(=) ident(f) operator(-) operator(()ident(f) operator(-) ident(x) operator(>=) float(0)float(.5)operator(\);) + operator(}) + reserved(return) ident(x)operator(;) +operator(}) +preprocessor(#endif) + +directive(static) ident(ID) ident(id_coerce)operator(,) ident(id_to_i)operator(,) ident(id_eq)operator(;) + +ident(VALUE) ident(rb_cNumeric)operator(;) +ident(VALUE) ident(rb_cFloat)operator(;) +ident(VALUE) ident(rb_cInteger)operator(;) +ident(VALUE) ident(rb_cFixnum)operator(;) + +ident(VALUE) ident(rb_eZeroDivError)operator(;) +ident(VALUE) ident(rb_eFloatDomainError)operator(;) + +directive(void) +ident(rb_num_zerodiv)operator((\)) +operator({) + ident(rb_raise)operator(()ident(rb_eZeroDivError)operator(,) string<delimiter(")content(divided by 0)delimiter(")>operator(\);) +operator(}) + + +comment(/* + * call-seq: + * num.coerce(numeric\) => array + * + * If <i>aNumeric</i> is the same type as <i>num</i>, returns an array + * containing <i>aNumeric</i> and <i>num</i>. Otherwise, returns an + * array with both <i>aNumeric</i> and <i>num</i> represented as + * <code>Float</code> objects. This coercion mechanism is used by + * Ruby to handle mixed-type numeric operations: it is intended to + * find a compatible common type between the two operands of the operator. + * + * 1.coerce(2.5\) #=> [2.5, 1.0] + * 1.2.coerce(3\) #=> [3.0, 1.2] + * 1.coerce(2\) #=> [2, 1] + */) + +directive(static) ident(VALUE) +ident(num_coerce)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(CLASS_OF)operator(()ident(x)operator(\)) operator(==) ident(CLASS_OF)operator(()ident(y)operator(\)\)) + reserved(return) ident(rb_assoc_new)operator(()ident(y)operator(,) ident(x)operator(\);) + ident(x) operator(=) ident(rb_Float)operator(()ident(x)operator(\);) + ident(y) operator(=) ident(rb_Float)operator(()ident(y)operator(\);) + reserved(return) ident(rb_assoc_new)operator(()ident(y)operator(,) ident(x)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(coerce_body)operator(()ident(x)operator(\)) + ident(VALUE) operator(*)ident(x)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(x)operator([)integer(1)operator(],) ident(id_coerce)operator(,) integer(1)operator(,) ident(x)operator([)integer(0)operator(]\);) +operator(}) + +directive(static) ident(VALUE) +ident(coerce_rescue)operator(()ident(x)operator(\)) + ident(VALUE) operator(*)ident(x)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(v) operator(=) ident(rb_inspect)operator(()ident(x)operator([)integer(1)operator(]\);) + + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s can't be coerced into %s)delimiter(")>operator(,) + ident(rb_special_const_p)operator(()ident(x)operator([)integer(1)operator(]\)?) + ident(RSTRING)operator(()ident(v)operator(\)->)label(ptr)operator(:) + ident(rb_obj_classname)operator(()ident(x)operator([)integer(1)operator(]\),) + ident(rb_obj_classname)operator(()ident(x)operator([)integer(0)operator(]\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* dummy */) +operator(}) + +directive(static) pre_type(int) +ident(do_coerce)operator(()ident(x)operator(,) ident(y)operator(,) ident(err)operator(\)) + ident(VALUE) operator(*)ident(x)operator(,) operator(*)ident(y)operator(;) + pre_type(int) ident(err)operator(;) +operator({) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) ident(a)operator([)integer(2)operator(];) + + ident(a)operator([)integer(0)operator(]) operator(=) operator(*)ident(x)operator(;) ident(a)operator([)integer(1)operator(]) operator(=) operator(*)ident(y)operator(;) + + ident(ary) operator(=) ident(rb_rescue)operator(()ident(coerce_body)operator(,) operator(()ident(VALUE)operator(\))ident(a)operator(,) ident(err)operator(?)label(coerce_rescue)operator(:)integer(0)operator(,) operator(()ident(VALUE)operator(\))ident(a)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(ary)operator(\)) operator(!=) ident(T_ARRAY) operator(||) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len) operator(!=) integer(2)operator(\)) operator({) + reserved(if) operator(()ident(err)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(coerce must return [x, y])delimiter(")>operator(\);) + operator(}) + reserved(return) ident(Qfalse)operator(;) + operator(}) + + operator(*)ident(x) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + operator(*)ident(y) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)integer(1)operator(];) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +ident(VALUE) +ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(do_coerce)operator((&)ident(x)operator(,) operator(&)ident(y)operator(,) ident(Qtrue)operator(\);) + reserved(return) ident(rb_funcall)operator(()ident(x)operator(,) ident(ruby_frame)operator(->)ident(orig_func)operator(,) integer(1)operator(,) ident(y)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_num_coerce_cmp)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(do_coerce)operator((&)ident(x)operator(,) operator(&)ident(y)operator(,) ident(Qfalse)operator(\)\)) + reserved(return) ident(rb_funcall)operator(()ident(x)operator(,) ident(ruby_frame)operator(->)ident(orig_func)operator(,) integer(1)operator(,) ident(y)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +ident(VALUE) +ident(rb_num_coerce_relop)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(c)operator(,) ident(x0) operator(=) ident(x)operator(,) ident(y0) operator(=) ident(y)operator(;) + + reserved(if) operator((!)ident(do_coerce)operator((&)ident(x)operator(,) operator(&)ident(y)operator(,) ident(Qfalse)operator(\)) operator(||) + ident(NIL_P)operator(()ident(c) operator(=) ident(rb_funcall)operator(()ident(x)operator(,) ident(ruby_frame)operator(->)ident(orig_func)operator(,) integer(1)operator(,) ident(y)operator(\)\)\)) operator({) + ident(rb_cmperr)operator(()ident(x0)operator(,) ident(y0)operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) + operator(}) + reserved(return) ident(c)operator(;) +operator(}) + +comment(/* + * Trap attempts to add methods to <code>Numeric</code> objects. Always + * raises a <code>TypeError</code> + */) + +directive(static) ident(VALUE) +ident(num_sadded)operator(()ident(x)operator(,) ident(name)operator(\)) + ident(VALUE) ident(x)operator(,) ident(name)operator(;) +operator({) + ident(ruby_frame) operator(=) ident(ruby_frame)operator(->)ident(prev)operator(;) comment(/* pop frame for "singleton_method_added" */) + comment(/* Numerics should be values; singleton_methods should not be added to them */) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) + string<delimiter(")content(can't define singleton method )char(\\")content(%s)char(\\")content( for %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(rb_to_id)operator(()ident(name)operator(\)\),) + ident(rb_obj_classname)operator(()ident(x)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(num_init_copy)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + comment(/* Numerics are immutable values, which should not be copied */) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't copy %s)delimiter(")>operator(,) ident(rb_obj_classname)operator(()ident(x)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +comment(/* + * call-seq: + * +num => num + * + * Unary Plus---Returns the receiver's value. + */) + +directive(static) ident(VALUE) +ident(num_uplus)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(num)operator(;) +operator(}) + +comment(/* + * call-seq: + * -num => numeric + * + * Unary Minus---Returns the receiver's value, negated. + */) + +directive(static) ident(VALUE) +ident(num_uminus)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + ident(VALUE) ident(zero)operator(;) + + ident(zero) operator(=) ident(INT2FIX)operator(()integer(0)operator(\);) + ident(do_coerce)operator((&)ident(zero)operator(,) operator(&)ident(num)operator(,) ident(Qtrue)operator(\);) + + reserved(return) ident(rb_funcall)operator(()ident(zero)operator(,) char('-')operator(,) integer(1)operator(,) ident(num)operator(\);) +operator(}) + +comment(/* + * call-seq: + * num.quo(numeric\) => result + * + * Equivalent to <code>Numeric#/</code>, but overridden in subclasses. + */) + +directive(static) ident(VALUE) +ident(num_quo)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(x)operator(,) char('/')operator(,) integer(1)operator(,) ident(y)operator(\);) +operator(}) + + +directive(static) ident(VALUE) ident(num_floor)operator(()ident(VALUE) ident(num)operator(\);) + +comment(/* + * call-seq: + * num.div(numeric\) => integer + * + * Uses <code>/</code> to perform division, then converts the result to + * an integer. <code>Numeric</code> does not define the <code>/</code> + * operator; this is left to subclasses. + */) + +directive(static) ident(VALUE) +ident(num_div)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(return) ident(num_floor)operator(()ident(rb_funcall)operator(()ident(x)operator(,) char('/')operator(,) integer(1)operator(,) ident(y)operator(\)\);) +operator(}) + + + +comment(/* + * call-seq: + * num.divmod( aNumeric \) -> anArray + * + * Returns an array containing the quotient and modulus obtained by + * dividing <i>num</i> by <i>aNumeric</i>. If <code>q, r = + * x.divmod(y\)</code>, then + * + * q = floor(float(x\)/float(y\)\) + * x = q*y + r + * + * The quotient is rounded toward -infinity, as shown in the following table: + * + * a | b | a.divmod(b\) | a/b | a.modulo(b\) | a.remainder(b\) + * ------+-----+---------------+---------+-------------+--------------- + * 13 | 4 | 3, 1 | 3 | 1 | 1 + * ------+-----+---------------+---------+-------------+--------------- + * 13 | -4 | -4, -3 | -3 | -3 | 1 + * ------+-----+---------------+---------+-------------+--------------- + * -13 | 4 | -4, 3 | -4 | 3 | -1 + * ------+-----+---------------+---------+-------------+--------------- + * -13 | -4 | 3, -1 | 3 | -1 | -1 + * ------+-----+---------------+---------+-------------+--------------- + * 11.5 | 4 | 2, 3.5 | 2.875 | 3.5 | 3.5 + * ------+-----+---------------+---------+-------------+--------------- + * 11.5 | -4 | -3, -0.5 | -2.875 | -0.5 | 3.5 + * ------+-----+---------------+---------+-------------+--------------- + * -11.5 | 4 | -3, 0.5 | -2.875 | 0.5 | -3.5 + * ------+-----+---------------+---------+-------------+--------------- + * -11.5 | -4 | 2 -3.5 | 2.875 | -3.5 | -3.5 + * + * + * Examples + * 11.divmod(3\) #=> [3, 2] + * 11.divmod(-3\) #=> [-4, -1] + * 11.divmod(3.5\) #=> [3, 0.5] + * (-11\).divmod(3.5\) #=> [-4, 3.0] + * (11.5\).divmod(3.5\) #=> [3, 1.0] + */) + +directive(static) ident(VALUE) +ident(num_divmod)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(return) ident(rb_assoc_new)operator(()ident(num_div)operator(()ident(x)operator(,) ident(y)operator(\),) ident(rb_funcall)operator(()ident(x)operator(,) char('%')operator(,) integer(1)operator(,) ident(y)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * num.modulo(numeric\) => result + * + * Equivalent to + * <i>num</i>.<code>divmod(</code><i>aNumeric</i><code>\)[1]</code>. + */) + +directive(static) ident(VALUE) +ident(num_modulo)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(x)operator(,) char('%')operator(,) integer(1)operator(,) ident(y)operator(\);) +operator(}) + +comment(/* + * call-seq: + * num.remainder(numeric\) => result + * + * If <i>num</i> and <i>numeric</i> have different signs, returns + * <em>mod</em>-<i>numeric</i>; otherwise, returns <em>mod</em>. In + * both cases <em>mod</em> is the value + * <i>num</i>.<code>modulo(</code><i>numeric</i><code>\)</code>. The + * differences between <code>remainder</code> and modulo + * (<code>%</code>\) are shown in the table under <code>Numeric#divmod</code>. + */) + +directive(static) ident(VALUE) +ident(num_remainder)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + ident(VALUE) ident(z) operator(=) ident(rb_funcall)operator(()ident(x)operator(,) char('%')operator(,) integer(1)operator(,) ident(y)operator(\);) + + reserved(if) operator(((!)ident(rb_equal)operator(()ident(z)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)) operator(&&) + operator((()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(x)operator(,) char('<')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)) operator(&&) + ident(RTEST)operator(()ident(rb_funcall)operator(()ident(y)operator(,) char('>')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)\)) operator(||) + operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(x)operator(,) char('>')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)) operator(&&) + ident(RTEST)operator(()ident(rb_funcall)operator(()ident(y)operator(,) char('<')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)\)\)\)) operator({) + reserved(return) ident(rb_funcall)operator(()ident(z)operator(,) char('-')operator(,) integer(1)operator(,) ident(y)operator(\);) + operator(}) + reserved(return) ident(z)operator(;) +operator(}) + +comment(/* + * call-seq: + * num.integer? -> true or false + * + * Returns <code>true</code> if <i>num</i> is an <code>Integer</code> + * (including <code>Fixnum</code> and <code>Bignum</code>\). + */) + +directive(static) ident(VALUE) +ident(num_int_p)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * num.abs => num or numeric + * + * Returns the absolute value of <i>num</i>. + * + * 12.abs #=> 12 + * (-34.56\).abs #=> 34.56 + * -34.56.abs #=> 34.56 + */) + +directive(static) ident(VALUE) +ident(num_abs)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(num)operator(,) char('<')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)\)) operator({) + reserved(return) ident(rb_funcall)operator(()ident(num)operator(,) ident(rb_intern)operator(()string<delimiter(")content(-@)delimiter(")>operator(\),) integer(0)operator(\);) + operator(}) + reserved(return) ident(num)operator(;) +operator(}) + + +comment(/* + * call-seq: + * num.zero? => true or false + * + * Returns <code>true</code> if <i>num</i> has a zero value. + */) + +directive(static) ident(VALUE) +ident(num_zero_p)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(if) operator(()ident(rb_equal)operator(()ident(num)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * num.nonzero? => num or nil + * + * Returns <i>num</i> if <i>num</i> is not zero, <code>nil</code> + * otherwise. This behavior is useful when chaining comparisons: + * + * a = %w( z Bb bB bb BB a aA Aa AA A \) + * b = a.sort {|a,b| (a.downcase <=> b.downcase\).nonzero? || a <=> b } + * b #=> ["A", "a", "AA", "Aa", "aA", "BB", "Bb", "bB", "bb", "z"] + */) + +directive(static) ident(VALUE) +ident(num_nonzero_p)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(num)operator(,) ident(rb_intern)operator(()string<delimiter(")content(zero?)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\)\)\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(num)operator(;) +operator(}) + +comment(/* + * call-seq: + * num.to_int => integer + * + * Invokes the child class's <code>to_i</code> method to convert + * <i>num</i> to an integer. + */) + +directive(static) ident(VALUE) +ident(num_to_int)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(num)operator(,) ident(id_to_i)operator(,) integer(0)operator(,) integer(0)operator(\);) +operator(}) + + +comment(/******************************************************************** + * + * Document-class: Float + * + * <code>Float</code> objects represent real numbers using the native + * architecture's double-precision floating point representation. + */) + +ident(VALUE) +ident(rb_float_new)operator(()ident(d)operator(\)) + pre_type(double) ident(d)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(flt)operator(,) reserved(struct) ident(RFloat)operator(\);) + ident(OBJSETUP)operator(()ident(flt)operator(,) ident(rb_cFloat)operator(,) ident(T_FLOAT)operator(\);) + + ident(flt)operator(->)ident(value) operator(=) ident(d)operator(;) + reserved(return) operator(()ident(VALUE)operator(\))ident(flt)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt.to_s => string + * + * Returns a string containing a representation of self. As well as a + * fixed or exponential form of the number, the call may return + * ``<code>NaN</code>'', ``<code>Infinity</code>'', and + * ``<code>-Infinity</code>''. + */) + +directive(static) ident(VALUE) +ident(flo_to_s)operator(()ident(flt)operator(\)) + ident(VALUE) ident(flt)operator(;) +operator({) + pre_type(char) ident(buf)operator([)integer(32)operator(];) + pre_type(double) ident(value) operator(=) ident(RFLOAT)operator(()ident(flt)operator(\)->)ident(value)operator(;) + pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(e)operator(;) + + reserved(if) operator(()ident(isinf)operator(()ident(value)operator(\)\)) + reserved(return) ident(rb_str_new2)operator(()ident(value) operator(<) integer(0) operator(?) string<delimiter(")content(-Infinity)delimiter(")> operator(:) string<delimiter(")content(Infinity)delimiter(")>operator(\);) + reserved(else) reserved(if)operator(()ident(isnan)operator(()ident(value)operator(\)\)) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(NaN)delimiter(")>operator(\);) + + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(%#.15g)delimiter(")>operator(,) ident(value)operator(\);) comment(/* ensure to print decimal point */) + reserved(if) operator((!()ident(e) operator(=) ident(strchr)operator(()ident(buf)operator(,) char('e')operator(\)\)\)) operator({) + ident(e) operator(=) ident(buf) operator(+) ident(strlen)operator(()ident(buf)operator(\);) + operator(}) + reserved(if) operator((!)ident(ISDIGIT)operator(()ident(e)operator([-)integer(1)operator(]\)\)) operator({) comment(/* reformat if ended with decimal point (ex 111111111111111.\) */) + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(%#.14e)delimiter(")>operator(,) ident(value)operator(\);) + reserved(if) operator((!()ident(e) operator(=) ident(strchr)operator(()ident(buf)operator(,) char('e')operator(\)\)\)) operator({) + ident(e) operator(=) ident(buf) operator(+) ident(strlen)operator(()ident(buf)operator(\);) + operator(}) + operator(}) + ident(p) operator(=) ident(e)operator(;) + reserved(while) operator(()ident(p)operator([-)integer(1)operator(]==)char('0') operator(&&) ident(ISDIGIT)operator(()ident(p)operator([-)integer(2)operator(]\)\)) + ident(p)operator(--;) + ident(memmove)operator(()ident(p)operator(,) ident(e)operator(,) ident(strlen)operator(()ident(e)operator(\)+)integer(1)operator(\);) + reserved(return) ident(rb_str_new2)operator(()ident(buf)operator(\);) +operator(}) + +comment(/* + * MISSING: documentation + */) + +directive(static) ident(VALUE) +ident(flo_coerce)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(return) ident(rb_assoc_new)operator(()ident(rb_Float)operator(()ident(y)operator(\),) ident(x)operator(\);) +operator(}) + +comment(/* + * call-seq: + * -float => float + * + * Returns float, negated. + */) + +directive(static) ident(VALUE) +ident(flo_uminus)operator(()ident(flt)operator(\)) + ident(VALUE) ident(flt)operator(;) +operator({) + reserved(return) ident(rb_float_new)operator((-)ident(RFLOAT)operator(()ident(flt)operator(\)->)ident(value)operator(\);) +operator(}) + +comment(/* + * call-seq: + * float + other => float + * + * Returns a new float which is the sum of <code>float</code> + * and <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(flo_plus)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(+) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(+) ident(rb_big2dbl)operator(()ident(y)operator(\)\);) + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(+) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * float + other => float + * + * Returns a new float which is the difference of <code>float</code> + * and <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(flo_minus)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(-) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(-) ident(rb_big2dbl)operator(()ident(y)operator(\)\);) + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(-) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * float * other => float + * + * Returns a new float which is the product of <code>float</code> + * and <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(flo_mul)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(*) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\)\);) + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(*) ident(rb_big2dbl)operator(()ident(y)operator(\)\);) + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(*) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * float / other => float + * + * Returns a new float which is the result of dividing + * <code>float</code> by <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(flo_div)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(f_y)operator(;) + pre_type(double) ident(d)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(f_y) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(/) operator(()pre_type(double)operator(\))ident(f_y)operator(\);) + reserved(case) label(T_BIGNUM)operator(:) + ident(d) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(/) ident(d)operator(\);) + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value) operator(/) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + + +directive(static) directive(void) +ident(flodivmod)operator(()ident(x)operator(,) ident(y)operator(,) ident(divp)operator(,) ident(modp)operator(\)) + pre_type(double) ident(x)operator(,) ident(y)operator(;) + pre_type(double) operator(*)ident(divp)operator(,) operator(*)ident(modp)operator(;) +operator({) + pre_type(double) ident(div)operator(,) ident(mod)operator(;) + +preprocessor(#ifdef) ident(HAVE_FMOD) + ident(mod) operator(=) ident(fmod)operator(()ident(x)operator(,) ident(y)operator(\);) +preprocessor(#else) + operator({) + pre_type(double) ident(z)operator(;) + + ident(modf)operator(()ident(x)operator(/)ident(y)operator(,) operator(&)ident(z)operator(\);) + ident(mod) operator(=) ident(x) operator(-) ident(z) operator(*) ident(y)operator(;) + operator(}) +preprocessor(#endif) + reserved(if) operator(()ident(isinf)operator(()ident(x)operator(\)) operator(&&) operator(!)ident(isinf)operator(()ident(y)operator(\)) operator(&&) operator(!)ident(isnan)operator(()ident(y)operator(\)\)) + ident(div) operator(=) ident(x)operator(;) + reserved(else) + ident(div) operator(=) operator(()ident(x) operator(-) ident(mod)operator(\)) operator(/) ident(y)operator(;) + reserved(if) operator(()ident(y)operator(*)ident(mod) operator(<) integer(0)operator(\)) operator({) + ident(mod) operator(+=) ident(y)operator(;) + ident(div) operator(-=) float(1)float(.0)operator(;) + operator(}) + reserved(if) operator(()ident(modp)operator(\)) operator(*)ident(modp) operator(=) ident(mod)operator(;) + reserved(if) operator(()ident(divp)operator(\)) operator(*)ident(divp) operator(=) ident(div)operator(;) +operator(}) + + +comment(/* + * call-seq: + * flt % other => float + * flt.modulo(other\) => float + * + * Return the modulo after division of <code>flt</code> by <code>other</code>. + * + * 6543.21.modulo(137\) #=> 104.21 + * 6543.21.modulo(137.24\) #=> 92.9299999999996 + */) + +directive(static) ident(VALUE) +ident(flo_mod)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(double) ident(fy)operator(,) ident(mod)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(fy) operator(=) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(break)operator(;) + reserved(case) label(T_BIGNUM)operator(:) + ident(fy) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + reserved(case) label(T_FLOAT)operator(:) + ident(fy) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + ident(flodivmod)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(,) ident(fy)operator(,) integer(0)operator(,) operator(&)ident(mod)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(mod)operator(\);) +operator(}) + +comment(/* + * call-seq: + * flt.divmod(numeric\) => array + * + * See <code>Numeric#divmod</code>. + */) + +directive(static) ident(VALUE) +ident(flo_divmod)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(double) ident(fy)operator(,) ident(div)operator(,) ident(mod)operator(,) ident(val)operator(;) + directive(volatile) ident(VALUE) ident(a)operator(,) ident(b)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(fy) operator(=) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(break)operator(;) + reserved(case) label(T_BIGNUM)operator(:) + ident(fy) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + reserved(case) label(T_FLOAT)operator(:) + ident(fy) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + ident(flodivmod)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(,) ident(fy)operator(,) operator(&)ident(div)operator(,) operator(&)ident(mod)operator(\);) + reserved(if) operator(()ident(FIXABLE)operator(()ident(div)operator(\)\)) operator({) + ident(val) operator(=) ident(round)operator(()ident(div)operator(\);) + ident(a) operator(=) ident(LONG2FIX)operator(()ident(val)operator(\);) + operator(}) + reserved(else) operator({) + ident(a) operator(=) ident(rb_dbl2big)operator(()ident(div)operator(\);) + operator(}) + ident(b) operator(=) ident(rb_float_new)operator(()ident(mod)operator(\);) + reserved(return) ident(rb_assoc_new)operator(()ident(a)operator(,) ident(b)operator(\);) +operator(}) + +comment(/* + * call-seq: + * + * flt ** other => float + * + * Raises <code>float</code> the <code>other</code> power. + */) + +directive(static) ident(VALUE) +ident(flo_pow)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(pow)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(,) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\)\)\);) + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(pow)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(,) ident(rb_big2dbl)operator(()ident(y)operator(\)\)\);) + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(pow)operator(()ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(,) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\)\);) + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * num.eql?(numeric\) => true or false + * + * Returns <code>true</code> if <i>num</i> and <i>numeric</i> are the + * same type and have equal values. + * + * 1 == 1.0 #=> true + * 1.eql?(1.0\) #=> false + * (1.0\).eql?(1.0\) #=> true + */) + +directive(static) ident(VALUE) +ident(num_eql)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(x)operator(\)) operator(!=) ident(TYPE)operator(()ident(y)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + + reserved(return) ident(rb_equal)operator(()ident(x)operator(,) ident(y)operator(\);) +operator(}) + +comment(/* + * call-seq: + * num <=> other -> 0 or nil + * + * Returns zero if <i>num</i> equals <i>other</i>, <code>nil</code> + * otherwise. + */) + +directive(static) ident(VALUE) +ident(num_cmp)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(x) operator(==) ident(y)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(num_equal)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(x) operator(==) ident(y)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(rb_funcall)operator(()ident(y)operator(,) ident(id_eq)operator(,) integer(1)operator(,) ident(x)operator(\);) +operator(}) + +comment(/* + * call-seq: + * flt == obj => true or false + * + * Returns <code>true</code> only if <i>obj</i> has the same value + * as <i>flt</i>. Contrast this with <code>Float#eql?</code>, which + * requires <i>obj</i> to be a <code>Float</code>. + * + * 1.0 == 1 #=> true + * + */) + +directive(static) ident(VALUE) +ident(flo_eq)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + directive(volatile) pre_type(double) ident(a)operator(,) ident(b)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(break)operator(;) + reserved(case) label(T_BIGNUM)operator(:) + ident(b) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + reserved(case) label(T_FLOAT)operator(:) + ident(b) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(if) operator(()ident(isnan)operator(()ident(b)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(return) ident(num_equal)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + ident(a) operator(=) ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(;) + reserved(if) operator(()ident(isnan)operator(()ident(a)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) operator(()ident(a) operator(==) ident(b)operator(\)?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt.hash => integer + * + * Returns a hash code for this float. + */) + +directive(static) ident(VALUE) +ident(flo_hash)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(double) ident(d)operator(;) + pre_type(char) operator(*)ident(c)operator(;) + pre_type(int) ident(i)operator(,) ident(hash)operator(;) + + ident(d) operator(=) ident(RFLOAT)operator(()ident(num)operator(\)->)ident(value)operator(;) + reserved(if) operator(()ident(d) operator(==) integer(0)operator(\)) ident(d) operator(=) ident(fabs)operator(()ident(d)operator(\);) + ident(c) operator(=) operator(()pre_type(char)operator(*\)&)ident(d)operator(;) + reserved(for) operator(()ident(hash)operator(=)integer(0)operator(,) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)reserved(sizeof)operator(()pre_type(double)operator(\);)ident(i)operator(++\)) operator({) + ident(hash) operator(=) operator(()ident(hash) operator(*) integer(971)operator(\)) operator(^) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(c)operator([)ident(i)operator(];) + operator(}) + reserved(if) operator(()ident(hash) operator(<) integer(0)operator(\)) ident(hash) operator(=) operator(-)ident(hash)operator(;) + reserved(return) ident(INT2FIX)operator(()ident(hash)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_dbl_cmp)operator(()ident(a)operator(,) ident(b)operator(\)) + pre_type(double) ident(a)operator(,) ident(b)operator(;) +operator({) + reserved(if) operator(()ident(isnan)operator(()ident(a)operator(\)) operator(||) ident(isnan)operator(()ident(b)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(a) operator(==) ident(b)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(a) operator(>) ident(b)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(a) operator(<) ident(b)operator(\)) reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt <=> numeric => -1, 0, +1 + * + * Returns -1, 0, or +1 depending on whether <i>flt</i> is less than, + * equal to, or greater than <i>numeric</i>. This is the basis for the + * tests in <code>Comparable</code>. + */) + +directive(static) ident(VALUE) +ident(flo_cmp)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(double) ident(a)operator(,) ident(b)operator(;) + + ident(a) operator(=) ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(;) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(b) operator(=) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(if) operator(()ident(isinf)operator(()ident(a)operator(\)\)) operator({) + reserved(if) operator(()ident(a) operator(>) float(0)float(.0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(else) reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + ident(b) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + ident(b) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_cmp)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + reserved(return) ident(rb_dbl_cmp)operator(()ident(a)operator(,) ident(b)operator(\);) +operator(}) + +comment(/* + * call-seq: + * flt > other => true or false + * + * <code>true</code> if <code>flt</code> is greater than <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(flo_gt)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(double) ident(a)operator(,) ident(b)operator(;) + + ident(a) operator(=) ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(;) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(b) operator(=) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + ident(b) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + ident(b) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(if) operator(()ident(isnan)operator(()ident(b)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_relop)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + reserved(if) operator(()ident(isnan)operator(()ident(a)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) operator(()ident(a) operator(>) ident(b)operator(\)?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt >= other => true or false + * + * <code>true</code> if <code>flt</code> is greater than + * or equal to <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(flo_ge)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(double) ident(a)operator(,) ident(b)operator(;) + + ident(a) operator(=) ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(;) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(b) operator(=) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + ident(b) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + ident(b) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(if) operator(()ident(isnan)operator(()ident(b)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_relop)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + reserved(if) operator(()ident(isnan)operator(()ident(a)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) operator(()ident(a) operator(>=) ident(b)operator(\)?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt < other => true or false + * + * <code>true</code> if <code>flt</code> is less than <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(flo_lt)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(double) ident(a)operator(,) ident(b)operator(;) + + ident(a) operator(=) ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(;) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(b) operator(=) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + ident(b) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + ident(b) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(if) operator(()ident(isnan)operator(()ident(b)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_relop)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + reserved(if) operator(()ident(isnan)operator(()ident(a)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) operator(()ident(a) operator(<) ident(b)operator(\)?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt <= other => true or false + * + * <code>true</code> if <code>flt</code> is less than + * or equal to <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(flo_le)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(double) ident(a)operator(,) ident(b)operator(;) + + ident(a) operator(=) ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(;) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(b) operator(=) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + ident(b) operator(=) ident(rb_big2dbl)operator(()ident(y)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + ident(b) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + reserved(if) operator(()ident(isnan)operator(()ident(b)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_relop)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) + reserved(if) operator(()ident(isnan)operator(()ident(a)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) operator(()ident(a) operator(<=) ident(b)operator(\)?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt.eql?(obj\) => true or false + * + * Returns <code>true</code> only if <i>obj</i> is a + * <code>Float</code> with the same value as <i>flt</i>. Contrast this + * with <code>Float#==</code>, which performs type conversions. + * + * 1.0.eql?(1\) #=> false + */) + +directive(static) ident(VALUE) +ident(flo_eql)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(y)operator(\)) operator(==) ident(T_FLOAT)operator(\)) operator({) + pre_type(double) ident(a) operator(=) ident(RFLOAT)operator(()ident(x)operator(\)->)ident(value)operator(;) + pre_type(double) ident(b) operator(=) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(;) + + reserved(if) operator(()ident(isnan)operator(()ident(a)operator(\)) operator(||) ident(isnan)operator(()ident(b)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(a) operator(==) ident(b)operator(\)) reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt.to_f => flt + * + * As <code>flt</code> is already a float, returns <i>self</i>. + */) + +directive(static) ident(VALUE) +ident(flo_to_f)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(num)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt.abs => float + * + * Returns the absolute value of <i>flt</i>. + * + * (-34.56\).abs #=> 34.56 + * -34.56.abs #=> 34.56 + * + */) + +directive(static) ident(VALUE) +ident(flo_abs)operator(()ident(flt)operator(\)) + ident(VALUE) ident(flt)operator(;) +operator({) + pre_type(double) ident(val) operator(=) ident(fabs)operator(()ident(RFLOAT)operator(()ident(flt)operator(\)->)ident(value)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * flt.zero? -> true or false + * + * Returns <code>true</code> if <i>flt</i> is 0.0. + * + */) + +directive(static) ident(VALUE) +ident(flo_zero_p)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(if) operator(()ident(RFLOAT)operator(()ident(num)operator(\)->)ident(value) operator(==) float(0)float(.0)operator(\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt.nan? -> true or false + * + * Returns <code>true</code> if <i>flt</i> is an invalid IEEE floating + * point number. + * + * a = -1.0 #=> -1.0 + * a.nan? #=> false + * a = 0.0/0.0 #=> NaN + * a.nan? #=> true + */) + +directive(static) ident(VALUE) +ident(flo_is_nan_p)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(double) ident(value) operator(=) ident(RFLOAT)operator(()ident(num)operator(\)->)ident(value)operator(;) + + reserved(return) ident(isnan)operator(()ident(value)operator(\)) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt.infinite? -> nil, -1, +1 + * + * Returns <code>nil</code>, -1, or +1 depending on whether <i>flt</i> + * is finite, -infinity, or +infinity. + * + * (0.0\).infinite? #=> nil + * (-1.0/0.0\).infinite? #=> -1 + * (+1.0/0.0\).infinite? #=> 1 + */) + +directive(static) ident(VALUE) +ident(flo_is_infinite_p)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(double) ident(value) operator(=) ident(RFLOAT)operator(()ident(num)operator(\)->)ident(value)operator(;) + + reserved(if) operator(()ident(isinf)operator(()ident(value)operator(\)\)) operator({) + reserved(return) ident(INT2FIX)operator(() ident(value) operator(<) integer(0) operator(?) operator(-)integer(1) operator(:) integer(1) operator(\);) + operator(}) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt.finite? -> true or false + * + * Returns <code>true</code> if <i>flt</i> is a valid IEEE floating + * point number (it is not infinite, and <code>nan?</code> is + * <code>false</code>\). + * + */) + +directive(static) ident(VALUE) +ident(flo_is_finite_p)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(double) ident(value) operator(=) ident(RFLOAT)operator(()ident(num)operator(\)->)ident(value)operator(;) + +preprocessor(#if) ident(HAVE_FINITE) + reserved(if) operator((!)ident(finite)operator(()ident(value)operator(\)\)) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#else) + reserved(if) operator(()ident(isinf)operator(()ident(value)operator(\)) operator(||) ident(isnan)operator(()ident(value)operator(\)\)) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) + + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * flt.floor => integer + * + * Returns the largest integer less than or equal to <i>flt</i>. + * + * 1.2.floor #=> 1 + * 2.0.floor #=> 2 + * (-1.2\).floor #=> -2 + * (-2.0\).floor #=> -2 + */) + +directive(static) ident(VALUE) +ident(flo_floor)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(double) ident(f) operator(=) ident(floor)operator(()ident(RFLOAT)operator(()ident(num)operator(\)->)ident(value)operator(\);) + pre_type(long) ident(val)operator(;) + + reserved(if) operator((!)ident(FIXABLE)operator(()ident(f)operator(\)\)) operator({) + reserved(return) ident(rb_dbl2big)operator(()ident(f)operator(\);) + operator(}) + ident(val) operator(=) ident(f)operator(;) + reserved(return) ident(LONG2FIX)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * flt.ceil => integer + * + * Returns the smallest <code>Integer</code> greater than or equal to + * <i>flt</i>. + * + * 1.2.ceil #=> 2 + * 2.0.ceil #=> 2 + * (-1.2\).ceil #=> -1 + * (-2.0\).ceil #=> -2 + */) + +directive(static) ident(VALUE) +ident(flo_ceil)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(double) ident(f) operator(=) ident(ceil)operator(()ident(RFLOAT)operator(()ident(num)operator(\)->)ident(value)operator(\);) + pre_type(long) ident(val)operator(;) + + reserved(if) operator((!)ident(FIXABLE)operator(()ident(f)operator(\)\)) operator({) + reserved(return) ident(rb_dbl2big)operator(()ident(f)operator(\);) + operator(}) + ident(val) operator(=) ident(f)operator(;) + reserved(return) ident(LONG2FIX)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * flt.round => integer + * + * Rounds <i>flt</i> to the nearest integer. Equivalent to: + * + * def round + * return (self+0.5\).floor if self > 0.0 + * return (self-0.5\).ceil if self < 0.0 + * return 0 + * end + * + * 1.5.round #=> 2 + * (-1.5\).round #=> -2 + * + */) + +directive(static) ident(VALUE) +ident(flo_round)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(double) ident(f) operator(=) ident(RFLOAT)operator(()ident(num)operator(\)->)ident(value)operator(;) + pre_type(long) ident(val)operator(;) + + ident(f) operator(=) ident(round)operator(()ident(f)operator(\);) + + reserved(if) operator((!)ident(FIXABLE)operator(()ident(f)operator(\)\)) operator({) + reserved(return) ident(rb_dbl2big)operator(()ident(f)operator(\);) + operator(}) + ident(val) operator(=) ident(f)operator(;) + reserved(return) ident(LONG2FIX)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * flt.to_i => integer + * flt.to_int => integer + * flt.truncate => integer + * + * Returns <i>flt</i> truncated to an <code>Integer</code>. + */) + +directive(static) ident(VALUE) +ident(flo_truncate)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(double) ident(f) operator(=) ident(RFLOAT)operator(()ident(num)operator(\)->)ident(value)operator(;) + pre_type(long) ident(val)operator(;) + + reserved(if) operator(()ident(f) operator(>) float(0)float(.0)operator(\)) ident(f) operator(=) ident(floor)operator(()ident(f)operator(\);) + reserved(if) operator(()ident(f) operator(<) float(0)float(.0)operator(\)) ident(f) operator(=) ident(ceil)operator(()ident(f)operator(\);) + + reserved(if) operator((!)ident(FIXABLE)operator(()ident(f)operator(\)\)) operator({) + reserved(return) ident(rb_dbl2big)operator(()ident(f)operator(\);) + operator(}) + ident(val) operator(=) ident(f)operator(;) + reserved(return) ident(LONG2FIX)operator(()ident(val)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * num.floor => integer + * + * Returns the largest integer less than or equal to <i>num</i>. + * <code>Numeric</code> implements this by converting <i>anInteger</i> + * to a <code>Float</code> and invoking <code>Float#floor</code>. + * + * 1.floor #=> 1 + * (-1\).floor #=> -1 + */) + +directive(static) ident(VALUE) +ident(num_floor)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(flo_floor)operator(()ident(rb_Float)operator(()ident(num)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * num.ceil => integer + * + * Returns the smallest <code>Integer</code> greater than or equal to + * <i>num</i>. Class <code>Numeric</code> achieves this by converting + * itself to a <code>Float</code> then invoking + * <code>Float#ceil</code>. + * + * 1.ceil #=> 1 + * 1.2.ceil #=> 2 + * (-1.2\).ceil #=> -1 + * (-1.0\).ceil #=> -1 + */) + +directive(static) ident(VALUE) +ident(num_ceil)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(flo_ceil)operator(()ident(rb_Float)operator(()ident(num)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * num.round => integer + * + * Rounds <i>num</i> to the nearest integer. <code>Numeric</code> + * implements this by converting itself to a + * <code>Float</code> and invoking <code>Float#round</code>. + */) + +directive(static) ident(VALUE) +ident(num_round)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(flo_round)operator(()ident(rb_Float)operator(()ident(num)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * num.truncate => integer + * + * Returns <i>num</i> truncated to an integer. <code>Numeric</code> + * implements this by converting its value to a float and invoking + * <code>Float#truncate</code>. + */) + +directive(static) ident(VALUE) +ident(num_truncate)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(flo_truncate)operator(()ident(rb_Float)operator(()ident(num)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * num.step(limit, step \) {|i| block } => num + * + * Invokes <em>block</em> with the sequence of numbers starting at + * <i>num</i>, incremented by <i>step</i> on each call. The loop + * finishes when the value to be passed to the block is greater than + * <i>limit</i> (if <i>step</i> is positive\) or less than + * <i>limit</i> (if <i>step</i> is negative\). If all the arguments are + * integers, the loop operates using an integer counter. If any of the + * arguments are floating point numbers, all are converted to floats, + * and the loop is executed <i>floor(n + n*epsilon\)+ 1</i> times, + * where <i>n = (limit - num\)/step</i>. Otherwise, the loop + * starts at <i>num</i>, uses either the <code><</code> or + * <code>></code> operator to compare the counter against + * <i>limit</i>, and increments itself using the <code>+</code> + * operator. + * + * 1.step(10, 2\) { |i| print i, " " } + * Math::E.step(Math::PI, 0.2\) { |f| print f, " " } + * + * <em>produces:</em> + * + * 1 3 5 7 9 + * 2.71828182845905 2.91828182845905 3.11828182845905 + */) + +directive(static) ident(VALUE) +ident(num_step)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(from)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(from)operator(;) +operator({) + ident(VALUE) ident(to)operator(,) ident(step)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(to) operator(=) ident(argv)operator([)integer(0)operator(];) + ident(step) operator(=) ident(INT2FIX)operator(()integer(1)operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(to) operator(=) ident(argv)operator([)integer(0)operator(];) + ident(step) operator(=) ident(argv)operator([)integer(1)operator(];) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(rb_equal)operator(()ident(step)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(step can't be 0)delimiter(")>operator(\);) + operator(}) + operator(}) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(from)operator(\)) operator(&&) ident(FIXNUM_P)operator(()ident(to)operator(\)) operator(&&) ident(FIXNUM_P)operator(()ident(step)operator(\)\)) operator({) + pre_type(long) ident(i)operator(,) ident(end)operator(,) ident(diff)operator(;) + + ident(i) operator(=) ident(FIX2LONG)operator(()ident(from)operator(\);) + ident(end) operator(=) ident(FIX2LONG)operator(()ident(to)operator(\);) + ident(diff) operator(=) ident(FIX2LONG)operator(()ident(step)operator(\);) + + reserved(if) operator(()ident(diff) operator(>) integer(0)operator(\)) operator({) + reserved(while) operator(()ident(i) operator(<=) ident(end)operator(\)) operator({) + ident(rb_yield)operator(()ident(LONG2FIX)operator(()ident(i)operator(\)\);) + ident(i) operator(+=) ident(diff)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(i) operator(>=) ident(end)operator(\)) operator({) + ident(rb_yield)operator(()ident(LONG2FIX)operator(()ident(i)operator(\)\);) + ident(i) operator(+=) ident(diff)operator(;) + operator(}) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(TYPE)operator(()ident(from)operator(\)) operator(==) ident(T_FLOAT) operator(||) ident(TYPE)operator(()ident(to)operator(\)) operator(==) ident(T_FLOAT) operator(||) ident(TYPE)operator(()ident(step)operator(\)) operator(==) ident(T_FLOAT)operator(\)) operator({) + directive(const) pre_type(double) ident(epsilon) operator(=) ident(DBL_EPSILON)operator(;) + pre_type(double) ident(beg) operator(=) ident(NUM2DBL)operator(()ident(from)operator(\);) + pre_type(double) ident(end) operator(=) ident(NUM2DBL)operator(()ident(to)operator(\);) + pre_type(double) ident(unit) operator(=) ident(NUM2DBL)operator(()ident(step)operator(\);) + pre_type(double) ident(n) operator(=) operator(()ident(end) operator(-) ident(beg)operator(\))operator(/)ident(unit)operator(;) + pre_type(double) ident(err) operator(=) operator(()ident(fabs)operator(()ident(beg)operator(\)) operator(+) ident(fabs)operator(()ident(end)operator(\)) operator(+) ident(fabs)operator(()ident(end)operator(-)ident(beg)operator(\)\)) operator(/) ident(fabs)operator(()ident(unit)operator(\)) operator(*) ident(epsilon)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(err)operator(>)float(0)float(.5)operator(\)) ident(err)operator(=)float(0)float(.5)operator(;) + ident(n) operator(=) ident(floor)operator(()ident(n) operator(+) ident(err)operator(\)) operator(+) integer(1)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(n)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(rb_float_new)operator(()ident(i)operator(*)ident(unit)operator(+)ident(beg)operator(\)\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(i) operator(=) ident(from)operator(;) + ident(ID) ident(cmp)operator(;) + + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(step)operator(,) char('>')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)\)) operator({) + ident(cmp) operator(=) char('>')operator(;) + operator(}) + reserved(else) operator({) + ident(cmp) operator(=) char('<')operator(;) + operator(}) + reserved(for) operator((;;\)) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(i)operator(,) ident(cmp)operator(,) integer(1)operator(,) ident(to)operator(\)\)\)) reserved(break)operator(;) + ident(rb_yield)operator(()ident(i)operator(\);) + ident(i) operator(=) ident(rb_funcall)operator(()ident(i)operator(,) char('+')operator(,) integer(1)operator(,) ident(step)operator(\);) + operator(}) + operator(}) + reserved(return) ident(from)operator(;) +operator(}) + +pre_type(long) +ident(rb_num2long)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + label(again)operator(:) + reserved(if) operator(()ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no implicit conversion from nil to integer)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(val)operator(\)\)) reserved(return) ident(FIX2LONG)operator(()ident(val)operator(\);) + + reserved(switch) operator(()ident(TYPE)operator(()ident(val)operator(\)\)) operator({) + reserved(case) label(T_FLOAT)operator(:) + reserved(if) operator(()ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value) operator(<=) operator(()pre_type(double)operator(\))ident(LONG_MAX) + operator(&&) ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value) operator(>=) operator(()pre_type(double)operator(\))ident(LONG_MIN)operator(\)) operator({) + reserved(return) operator(()pre_type(long)operator(\)()ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value)operator(\);) + operator(}) + reserved(else) operator({) + pre_type(char) ident(buf)operator([)integer(24)operator(];) + pre_type(char) operator(*)ident(s)operator(;) + + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(%-.10g)delimiter(")>operator(,) ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value)operator(\);) + reserved(if) operator((()ident(s) operator(=) ident(strchr)operator(()ident(buf)operator(,) char(' ')operator(\)\)) operator(!=) integer(0)operator(\)) operator(*)ident(s) operator(=) char('\\0')operator(;) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(float %s out of range of integer)delimiter(")>operator(,) ident(buf)operator(\);) + operator(}) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(rb_big2long)operator(()ident(val)operator(\);) + + reserved(default)operator(:) + ident(val) operator(=) ident(rb_to_int)operator(()ident(val)operator(\);) + reserved(goto) ident(again)operator(;) + operator(}) +operator(}) + +pre_type(unsigned) pre_type(long) +ident(rb_num2ulong)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(val)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + reserved(return) ident(rb_big2ulong)operator(()ident(val)operator(\);) + operator(}) + reserved(return) operator(()pre_type(unsigned) pre_type(long)operator(\))ident(rb_num2long)operator(()ident(val)operator(\);) +operator(}) + +preprocessor(#if) ident(SIZEOF_INT) operator(<) ident(SIZEOF_LONG) +directive(static) directive(void) +ident(check_int)operator(()ident(num)operator(\)) + pre_type(long) ident(num)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + + reserved(if) operator(()ident(num) operator(<) ident(INT_MIN)operator(\)) operator({) + ident(s) operator(=) string<delimiter(")content(small)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(num) operator(>) ident(INT_MAX)operator(\)) operator({) + ident(s) operator(=) string<delimiter(")content(big)delimiter(")>operator(;) + operator(}) + reserved(else) operator({) + reserved(return)operator(;) + operator(}) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(integer %ld too %s to convert to `int')delimiter(")>operator(,) ident(num)operator(,) ident(s)operator(\);) +operator(}) + +directive(static) directive(void) +ident(check_uint)operator(()ident(num)operator(,) ident(sign)operator(\)) + pre_type(unsigned) pre_type(long) ident(num)operator(;) + ident(VALUE) ident(sign)operator(;) +operator({) + directive(static) directive(const) pre_type(unsigned) pre_type(long) ident(mask) operator(=) operator(~()pre_type(unsigned) pre_type(long)operator(\))ident(UINT_MAX)operator(;) + + reserved(if) operator(()ident(RTEST)operator(()ident(sign)operator(\)\)) operator({) + comment(/* minus */) + reserved(if) operator((()ident(num) operator(&) ident(mask)operator(\)) operator(!=) ident(mask) operator(||) operator(()ident(num) operator(&) operator(~)ident(mask)operator(\)) operator(<=) ident(INT_MAX) operator(+) integer(1)ident(UL)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(integer %ld too small to convert to `unsigned int')delimiter(")>operator(,) ident(num)operator(\);) + operator(}) + reserved(else) operator({) + comment(/* plus */) + reserved(if) operator((()ident(num) operator(&) ident(mask)operator(\)) operator(!=) integer(0)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(integer %lu too big to convert to `unsigned int')delimiter(")>operator(,) ident(num)operator(\);) + operator(}) +operator(}) + +pre_type(long) +ident(rb_num2int)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(long) ident(num) operator(=) ident(rb_num2long)operator(()ident(val)operator(\);) + + ident(check_int)operator(()ident(num)operator(\);) + reserved(return) ident(num)operator(;) +operator(}) + +pre_type(long) +ident(rb_fix2int)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(long) ident(num) operator(=) ident(FIXNUM_P)operator(()ident(val)operator(\)?)ident(FIX2LONG)operator(()ident(val)operator(\):)ident(rb_num2long)operator(()ident(val)operator(\);) + + ident(check_int)operator(()ident(num)operator(\);) + reserved(return) ident(num)operator(;) +operator(}) + +pre_type(unsigned) pre_type(long) +ident(rb_num2uint)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(unsigned) pre_type(long) ident(num) operator(=) ident(rb_num2ulong)operator(()ident(val)operator(\);) + + ident(check_uint)operator(()ident(num)operator(,) ident(rb_funcall)operator(()ident(val)operator(,) char('<')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\);) + reserved(return) ident(num)operator(;) +operator(}) + +pre_type(unsigned) pre_type(long) +ident(rb_fix2uint)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(unsigned) pre_type(long) ident(num)operator(;) + + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(val)operator(\)\)) operator({) + reserved(return) ident(rb_num2uint)operator(()ident(val)operator(\);) + operator(}) + ident(num) operator(=) ident(FIX2ULONG)operator(()ident(val)operator(\);) + + ident(check_uint)operator(()ident(num)operator(,) ident(rb_funcall)operator(()ident(val)operator(,) char('<')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\);) + reserved(return) ident(num)operator(;) +operator(}) +preprocessor(#else) +pre_type(long) +ident(rb_num2int)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(return) ident(rb_num2long)operator(()ident(val)operator(\);) +operator(}) + +pre_type(long) +ident(rb_fix2int)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(return) ident(FIX2INT)operator(()ident(val)operator(\);) +operator(}) +preprocessor(#endif) + +ident(VALUE) +ident(rb_num2fix)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(long) ident(v)operator(;) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(val)operator(\)\)) reserved(return) ident(val)operator(;) + + ident(v) operator(=) ident(rb_num2long)operator(()ident(val)operator(\);) + reserved(if) operator((!)ident(FIXABLE)operator(()ident(v)operator(\)\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(integer %ld out of range of fixnum)delimiter(")>operator(,) ident(v)operator(\);) + reserved(return) ident(LONG2FIX)operator(()ident(v)operator(\);) +operator(}) + +preprocessor(#if) ident(HAVE_LONG_LONG) + +ident(LONG_LONG) +ident(rb_num2ll)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no implicit conversion from nil)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(val)operator(\)\)) reserved(return) operator(()ident(LONG_LONG)operator(\))ident(FIX2LONG)operator(()ident(val)operator(\);) + + reserved(switch) operator(()ident(TYPE)operator(()ident(val)operator(\)\)) operator({) + reserved(case) label(T_FLOAT)operator(:) + reserved(if) operator(()ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value) operator(<=) operator(()pre_type(double)operator(\))ident(LLONG_MAX) + operator(&&) ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value) operator(>=) operator(()pre_type(double)operator(\))ident(LLONG_MIN)operator(\)) operator({) + reserved(return) operator(()ident(LONG_LONG)operator(\)()ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value)operator(\);) + operator(}) + reserved(else) operator({) + pre_type(char) ident(buf)operator([)integer(24)operator(];) + pre_type(char) operator(*)ident(s)operator(;) + + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(%-.10g)delimiter(")>operator(,) ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value)operator(\);) + reserved(if) operator((()ident(s) operator(=) ident(strchr)operator(()ident(buf)operator(,) char(' ')operator(\)\)) operator(!=) integer(0)operator(\)) operator(*)ident(s) operator(=) char('\\0')operator(;) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(float %s out of range of long long)delimiter(")>operator(,) ident(buf)operator(\);) + operator(}) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(rb_big2ll)operator(()ident(val)operator(\);) + + reserved(case) label(T_STRING)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no implicit conversion from string)delimiter(")>operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) + + reserved(case) label(T_TRUE)operator(:) + reserved(case) label(T_FALSE)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no implicit conversion from boolean)delimiter(")>operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) + + reserved(default)operator(:) + ident(val) operator(=) ident(rb_to_int)operator(()ident(val)operator(\);) + reserved(return) ident(NUM2LL)operator(()ident(val)operator(\);) + operator(}) +operator(}) + +pre_type(unsigned) ident(LONG_LONG) +ident(rb_num2ull)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(val)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + reserved(return) ident(rb_big2ull)operator(()ident(val)operator(\);) + operator(}) + reserved(return) operator(()pre_type(unsigned) ident(LONG_LONG)operator(\))ident(rb_num2ll)operator(()ident(val)operator(\);) +operator(}) + +preprocessor(#endif) comment(/* HAVE_LONG_LONG */) + + +comment(/* + * Document-class: Integer + * + * <code>Integer</code> is the basis for the two concrete classes that + * hold whole numbers, <code>Bignum</code> and <code>Fixnum</code>. + * + */) + + +comment(/* + * call-seq: + * int.to_i => int + * int.to_int => int + * int.floor => int + * int.ceil => int + * int.round => int + * int.truncate => int + * + * As <i>int</i> is already an <code>Integer</code>, all these + * methods simply return the receiver. + */) + +directive(static) ident(VALUE) +ident(int_to_i)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(num)operator(;) +operator(}) + +comment(/* + * call-seq: + * int.integer? -> true + * + * Always returns <code>true</code>. + */) + +directive(static) ident(VALUE) +ident(int_int_p)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * int.next => integer + * int.succ => integer + * + * Returns the <code>Integer</code> equal to <i>int</i> + 1. + * + * 1.next #=> 2 + * (-1\).next #=> 0 + */) + +directive(static) ident(VALUE) +ident(int_succ)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(num)operator(\)\)) operator({) + pre_type(long) ident(i) operator(=) ident(FIX2LONG)operator(()ident(num)operator(\)) operator(+) integer(1)operator(;) + reserved(return) ident(LONG2NUM)operator(()ident(i)operator(\);) + operator(}) + reserved(return) ident(rb_funcall)operator(()ident(num)operator(,) char('+')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(1)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * int.chr => string + * + * Returns a string containing the ASCII character represented by the + * receiver's value. + * + * 65.chr #=> "A" + * ?a.chr #=> "a" + * 230.chr #=> "\\346" + */) + +directive(static) ident(VALUE) +ident(int_chr)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(char) ident(c)operator(;) + pre_type(long) ident(i) operator(=) ident(NUM2LONG)operator(()ident(num)operator(\);) + + reserved(if) operator(()ident(i) operator(<) integer(0) operator(||) hex(0xff) operator(<) ident(i)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(%ld out of char range)delimiter(")>operator(,) ident(i)operator(\);) + ident(c) operator(=) ident(i)operator(;) + reserved(return) ident(rb_str_new)operator((&)ident(c)operator(,) integer(1)operator(\);) +operator(}) + +comment(/******************************************************************** + * + * Document-class: Fixnum + * + * A <code>Fixnum</code> holds <code>Integer</code> values that can be + * represented in a native machine word (minus 1 bit\). If any operation + * on a <code>Fixnum</code> exceeds this range, the value is + * automatically converted to a <code>Bignum</code>. + * + * <code>Fixnum</code> objects have immediate value. This means that + * when they are assigned or passed as parameters, the actual object is + * passed, rather than a reference to that object. Assignment does not + * alias <code>Fixnum</code> objects. There is effectively only one + * <code>Fixnum</code> object instance for any given integer value, so, + * for example, you cannot add a singleton method to a + * <code>Fixnum</code>. + */) + + +comment(/* + * call-seq: + * Fixnum.induced_from(obj\) => fixnum + * + * Convert <code>obj</code> to a Fixnum. Works with numeric parameters. + * Also works with Symbols, but this is deprecated. + */) + +directive(static) ident(VALUE) +ident(rb_fix_induced_from)operator(()ident(klass)operator(,) ident(x)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(x)operator(;) +operator({) + reserved(return) ident(rb_num2fix)operator(()ident(x)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Integer.induced_from(obj\) => fixnum, bignum + * + * Convert <code>obj</code> to an Integer. + */) + +directive(static) ident(VALUE) +ident(rb_int_induced_from)operator(()ident(klass)operator(,) ident(x)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(x)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(x)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(x)operator(;) + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(rb_funcall)operator(()ident(x)operator(,) ident(id_to_i)operator(,) integer(0)operator(\);) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(failed to convert %s into Integer)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(x)operator(\)\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * Float.induced_from(obj\) => float + * + * Convert <code>obj</code> to a float. + */) + +directive(static) ident(VALUE) +ident(rb_flo_induced_from)operator(()ident(klass)operator(,) ident(x)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(x)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(x)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(rb_funcall)operator(()ident(x)operator(,) ident(rb_intern)operator(()string<delimiter(")content(to_f)delimiter(")>operator(\),) integer(0)operator(\);) + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(x)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(failed to convert %s into Float)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(x)operator(\)\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * -fix => integer + * + * Negates <code>fix</code> (which might return a Bignum\). + */) + +directive(static) ident(VALUE) +ident(fix_uminus)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(return) ident(LONG2NUM)operator((-)ident(FIX2LONG)operator(()ident(num)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_fix2str)operator(()ident(x)operator(,) ident(base)operator(\)) + ident(VALUE) ident(x)operator(;) + pre_type(int) ident(base)operator(;) +operator({) + directive(extern) directive(const) pre_type(char) ident(ruby_digitmap)operator([];) + pre_type(char) ident(buf)operator([)ident(SIZEOF_LONG)operator(*)ident(CHAR_BIT) operator(+) integer(2)operator(],) operator(*)ident(b) operator(=) ident(buf) operator(+) reserved(sizeof) ident(buf)operator(;) + pre_type(long) ident(val) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\);) + pre_type(int) ident(neg) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(base) operator(<) integer(2) operator(||) integer(36) operator(<) ident(base)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(illegal radix %d)delimiter(")>operator(,) ident(base)operator(\);) + operator(}) + reserved(if) operator(()ident(val) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(0)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(val) operator(<) integer(0)operator(\)) operator({) + ident(val) operator(=) operator(-)ident(val)operator(;) + ident(neg) operator(=) integer(1)operator(;) + operator(}) + operator(*--)ident(b) operator(=) char('\\0')operator(;) + reserved(do) operator({) + operator(*--)ident(b) operator(=) ident(ruby_digitmap)operator([()pre_type(int)operator(\)()ident(val) operator(%) ident(base)operator(\)];) + operator(}) reserved(while) operator(()ident(val) operator(/=) ident(base)operator(\);) + reserved(if) operator(()ident(neg)operator(\)) operator({) + operator(*--)ident(b) operator(=) char('-')operator(;) + operator(}) + + reserved(return) ident(rb_str_new2)operator(()ident(b)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix.to_s( base=10 \) -> aString + * + * Returns a string containing the representation of <i>fix</i> radix + * <i>base</i> (between 2 and 36\). + * + * 12345.to_s #=> "12345" + * 12345.to_s(2\) #=> "11000000111001" + * 12345.to_s(8\) #=> "30071" + * 12345.to_s(10\) #=> "12345" + * 12345.to_s(16\) #=> "3039" + * 12345.to_s(36\) #=> "9ix" + * + */) +directive(static) ident(VALUE) +ident(fix_to_s)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(x)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(x)operator(;) +operator({) + ident(VALUE) ident(b)operator(;) + pre_type(int) ident(base)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(b)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) ident(base) operator(=) integer(10)operator(;) + reserved(else) ident(base) operator(=) ident(NUM2INT)operator(()ident(b)operator(\);) + + reserved(return) ident(rb_fix2str)operator(()ident(x)operator(,) ident(base)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix + numeric => numeric_result + * + * Performs addition: the class of the resulting object depends on + * the class of <code>numeric</code> and on the magnitude of the + * result. + */) + +directive(static) ident(VALUE) +ident(fix_plus)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(a)operator(,) ident(b)operator(,) ident(c)operator(;) + ident(VALUE) ident(r)operator(;) + + ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\);) + ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + ident(c) operator(=) ident(a) operator(+) ident(b)operator(;) + ident(r) operator(=) ident(LONG2NUM)operator(()ident(c)operator(\);) + + reserved(return) ident(r)operator(;) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(y)operator(\)) operator(==) ident(T_FLOAT)operator(\)) operator({) + reserved(return) ident(rb_float_new)operator((()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(x)operator(\)) operator(+) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + operator(}) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix - numeric => numeric_result + * + * Performs subtraction: the class of the resulting object depends on + * the class of <code>numeric</code> and on the magnitude of the + * result. + */) + +directive(static) ident(VALUE) +ident(fix_minus)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(a)operator(,) ident(b)operator(,) ident(c)operator(;) + ident(VALUE) ident(r)operator(;) + + ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\);) + ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + ident(c) operator(=) ident(a) operator(-) ident(b)operator(;) + ident(r) operator(=) ident(LONG2NUM)operator(()ident(c)operator(\);) + + reserved(return) ident(r)operator(;) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(y)operator(\)) operator(==) ident(T_FLOAT)operator(\)) operator({) + reserved(return) ident(rb_float_new)operator((()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(x)operator(\)) operator(-) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + operator(}) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix * numeric => numeric_result + * + * Performs multiplication: the class of the resulting object depends on + * the class of <code>numeric</code> and on the magnitude of the + * result. + */) + +directive(static) ident(VALUE) +ident(fix_mul)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) +preprocessor(#ifdef) ident(__HP_cc) + comment(/* avoids an optimization bug of HP aC++/ANSI C B3910B A.06.05 [Jul 25 2005] */) + directive(volatile) +preprocessor(#endif) + pre_type(long) ident(a)operator(,) ident(b)operator(,) ident(c)operator(;) + ident(VALUE) ident(r)operator(;) + + ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\);) + reserved(if) operator(()ident(a) operator(==) integer(0)operator(\)) reserved(return) ident(x)operator(;) + + ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + ident(c) operator(=) ident(a) operator(*) ident(b)operator(;) + ident(r) operator(=) ident(LONG2FIX)operator(()ident(c)operator(\);) + + reserved(if) operator(()ident(FIX2LONG)operator(()ident(r)operator(\)) operator(!=) ident(c) operator(||) ident(c)operator(/)ident(a) operator(!=) ident(b)operator(\)) operator({) + ident(r) operator(=) ident(rb_big_mul)operator(()ident(rb_int2big)operator(()ident(a)operator(\),) ident(rb_int2big)operator(()ident(b)operator(\)\);) + operator(}) + reserved(return) ident(r)operator(;) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(y)operator(\)) operator(==) ident(T_FLOAT)operator(\)) operator({) + reserved(return) ident(rb_float_new)operator((()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(x)operator(\)) operator(*) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\);) + operator(}) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) +operator(}) + +directive(static) directive(void) +ident(fixdivmod)operator(()ident(x)operator(,) ident(y)operator(,) ident(divp)operator(,) ident(modp)operator(\)) + pre_type(long) ident(x)operator(,) ident(y)operator(;) + pre_type(long) operator(*)ident(divp)operator(,) operator(*)ident(modp)operator(;) +operator({) + pre_type(long) ident(div)operator(,) ident(mod)operator(;) + + reserved(if) operator(()ident(y) operator(==) integer(0)operator(\)) ident(rb_num_zerodiv)operator((\);) + reserved(if) operator(()ident(y) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(x) operator(<) integer(0)operator(\)) + ident(div) operator(=) operator(-)ident(x) operator(/) operator(-)ident(y)operator(;) + reserved(else) + ident(div) operator(=) operator(-) operator(()ident(x) operator(/) operator(-)ident(y)operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(x) operator(<) integer(0)operator(\)) + ident(div) operator(=) operator(-) operator((-)ident(x) operator(/) ident(y)operator(\);) + reserved(else) + ident(div) operator(=) ident(x) operator(/) ident(y)operator(;) + operator(}) + ident(mod) operator(=) ident(x) operator(-) ident(div)operator(*)ident(y)operator(;) + reserved(if) operator((()ident(mod) operator(<) integer(0) operator(&&) ident(y) operator(>) integer(0)operator(\)) operator(||) operator(()ident(mod) operator(>) integer(0) operator(&&) ident(y) operator(<) integer(0)operator(\)\)) operator({) + ident(mod) operator(+=) ident(y)operator(;) + ident(div) operator(-=) integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(divp)operator(\)) operator(*)ident(divp) operator(=) ident(div)operator(;) + reserved(if) operator(()ident(modp)operator(\)) operator(*)ident(modp) operator(=) ident(mod)operator(;) +operator(}) + +comment(/* + * call-seq: + * fix.quo(numeric\) => float + * + * Returns the floating point result of dividing <i>fix</i> by + * <i>numeric</i>. + * + * 654321.quo(13731\) #=> 47.6528293642124 + * 654321.quo(13731.24\) #=> 47.6519964693647 + * + */) + +directive(static) ident(VALUE) +ident(fix_quo)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + reserved(return) ident(rb_float_new)operator((()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(x)operator(\)) operator(/) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(y)operator(\)\);) + operator(}) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix / numeric => numeric_result + * fix.div(numeric\) => numeric_result + * + * Performs division: the class of the resulting object depends on + * the class of <code>numeric</code> and on the magnitude of the + * result. + */) + +directive(static) ident(VALUE) +ident(fix_div)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(div)operator(;) + + ident(fixdivmod)operator(()ident(FIX2LONG)operator(()ident(x)operator(\),) ident(FIX2LONG)operator(()ident(y)operator(\),) operator(&)ident(div)operator(,) integer(0)operator(\);) + reserved(return) ident(LONG2NUM)operator(()ident(div)operator(\);) + operator(}) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix % other => Numeric + * fix.modulo(other\) => Numeric + * + * Returns <code>fix</code> modulo <code>other</code>. + * See <code>Numeric.divmod</code> for more information. + */) + +directive(static) ident(VALUE) +ident(fix_mod)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(mod)operator(;) + + ident(fixdivmod)operator(()ident(FIX2LONG)operator(()ident(x)operator(\),) ident(FIX2LONG)operator(()ident(y)operator(\),) integer(0)operator(,) operator(&)ident(mod)operator(\);) + reserved(return) ident(LONG2NUM)operator(()ident(mod)operator(\);) + operator(}) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix.divmod(numeric\) => array + * + * See <code>Numeric#divmod</code>. + */) +directive(static) ident(VALUE) +ident(fix_divmod)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(div)operator(,) ident(mod)operator(;) + + ident(fixdivmod)operator(()ident(FIX2LONG)operator(()ident(x)operator(\),) ident(FIX2LONG)operator(()ident(y)operator(\),) operator(&)ident(div)operator(,) operator(&)ident(mod)operator(\);) + + reserved(return) ident(rb_assoc_new)operator(()ident(LONG2NUM)operator(()ident(div)operator(\),) ident(LONG2NUM)operator(()ident(mod)operator(\)\);) + operator(}) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(int_even_p)operator(()ident(VALUE) ident(num)operator(\)) +operator({) + reserved(if) operator(()ident(rb_funcall)operator(()ident(num)operator(,) char('%')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(2)operator(\)\)) operator(==) ident(INT2FIX)operator(()integer(0)operator(\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * fix ** other => Numeric + * + * Raises <code>fix</code> to the <code>other</code> power, which may + * be negative or fractional. + * + * 2 ** 3 #=> 8 + * 2 ** -1 #=> 0.5 + * 2 ** 0.5 #=> 1.4142135623731 + */) + +directive(static) ident(VALUE) +ident(fix_pow)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + directive(static) directive(const) pre_type(double) ident(zero) operator(=) float(0)float(.0)operator(;) + pre_type(long) ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\);) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(b)operator(;) + + ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(if) operator(()ident(b) operator(==) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(b) operator(==) integer(1)operator(\)) reserved(return) ident(x)operator(;) + ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\);) + reserved(if) operator(()ident(a) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(b) operator(>) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(return) ident(rb_float_new)operator(()float(1)float(.0) operator(/) ident(zero)operator(\);) + operator(}) + reserved(if) operator(()ident(a) operator(==) integer(1)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(a) operator(==) operator(-)integer(1)operator(\)) operator({) + reserved(if) operator(()ident(b) operator(%) integer(2) operator(==) integer(0)operator(\)) + reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(else) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(b) operator(>) integer(0)operator(\)) operator({) + reserved(return) ident(rb_big_pow)operator(()ident(rb_int2big)operator(()ident(a)operator(\),) ident(y)operator(\);) + operator(}) + reserved(return) ident(rb_float_new)operator(()ident(pow)operator((()pre_type(double)operator(\))ident(a)operator(,) operator(()pre_type(double)operator(\))ident(b)operator(\)\);) + operator(}) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_BIGNUM)operator(:) + reserved(if) operator(()ident(a) operator(==) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(a) operator(==) integer(1)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(a) operator(==) operator(-)integer(1)operator(\)) operator({) + reserved(if) operator(()ident(int_even_p)operator(()ident(y)operator(\)\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(else) reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + ident(x) operator(=) ident(rb_int2big)operator(()ident(FIX2LONG)operator(()ident(x)operator(\)\);) + reserved(return) ident(rb_big_pow)operator(()ident(x)operator(,) ident(y)operator(\);) + reserved(case) label(T_FLOAT)operator(:) + reserved(if) operator(()ident(a) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(rb_float_new)operator(()ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value) operator(<) integer(0) operator(?) operator(()float(1)float(.0) operator(/) ident(zero)operator(\)) operator(:) float(0)float(.0)operator(\);) + operator(}) + reserved(if) operator(()ident(a) operator(==) integer(1)operator(\)) reserved(return) ident(rb_float_new)operator(()float(1)float(.0)operator(\);) + reserved(return) ident(rb_float_new)operator(()ident(pow)operator((()pre_type(double)operator(\))ident(a)operator(,) ident(RFLOAT)operator(()ident(y)operator(\)->)ident(value)operator(\)\);) + reserved(default)operator(:) + reserved(return) ident(rb_num_coerce_bin)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * fix == other + * + * Return <code>true</code> if <code>fix</code> equals <code>other</code> + * numerically. + * + * 1 == 2 #=> false + * 1 == 1.0 #=> true + */) + +directive(static) ident(VALUE) +ident(fix_equal)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(x) operator(==) ident(y)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(num_equal)operator(()ident(x)operator(,) ident(y)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix <=> numeric => -1, 0, +1 + * + * Comparison---Returns -1, 0, or +1 depending on whether <i>fix</i> is + * less than, equal to, or greater than <i>numeric</i>. This is the + * basis for the tests in <code>Comparable</code>. + */) + +directive(static) ident(VALUE) +ident(fix_cmp)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(x) operator(==) ident(y)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\),) ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + + reserved(if) operator(()ident(a) operator(>) ident(b)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_num_coerce_cmp)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * fix > other => true or false + * + * Returns <code>true</code> if the value of <code>fix</code> is + * greater than that of <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(fix_gt)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\),) ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + + reserved(if) operator(()ident(a) operator(>) ident(b)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_num_coerce_relop)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * fix >= other => true or false + * + * Returns <code>true</code> if the value of <code>fix</code> is + * greater than or equal to that of <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(fix_ge)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\),) ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + + reserved(if) operator(()ident(a) operator(>=) ident(b)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_num_coerce_relop)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * fix < other => true or false + * + * Returns <code>true</code> if the value of <code>fix</code> is + * less than that of <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(fix_lt)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\),) ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + + reserved(if) operator(()ident(a) operator(<) ident(b)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_num_coerce_relop)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * fix <= other => true or false + * + * Returns <code>true</code> if the value of <code>fix</code> is + * less thanor equal to that of <code>other</code>. + */) + +directive(static) ident(VALUE) +ident(fix_le)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(y)operator(\)\)) operator({) + pre_type(long) ident(a) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\),) ident(b) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + + reserved(if) operator(()ident(a) operator(<=) ident(b)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_num_coerce_relop)operator(()ident(x)operator(,) ident(y)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * ~fix => integer + * + * One's complement: returns a number where each bit is flipped. + */) + +directive(static) ident(VALUE) +ident(fix_rev)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(long) ident(val) operator(=) ident(FIX2LONG)operator(()ident(num)operator(\);) + + ident(val) operator(=) operator(~)ident(val)operator(;) + reserved(return) ident(LONG2NUM)operator(()ident(val)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(fix_coerce)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + reserved(while) operator((!)ident(FIXNUM_P)operator(()ident(x)operator(\)) operator(&&) ident(TYPE)operator(()ident(x)operator(\)) operator(!=) ident(T_BIGNUM)operator(\)) operator({) + ident(x) operator(=) ident(rb_to_int)operator(()ident(x)operator(\);) + operator(}) + reserved(return) ident(x)operator(;) +operator(}) + +comment(/* + * call-seq: + * fix & other => integer + * + * Bitwise AND. + */) + +directive(static) ident(VALUE) +ident(fix_and)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(val)operator(;) + + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(y) operator(=) ident(fix_coerce)operator(()ident(y)operator(\)\)\)) operator({) + reserved(return) ident(rb_big_and)operator(()ident(y)operator(,) ident(x)operator(\);) + operator(}) + ident(val) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\)) operator(&) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(return) ident(LONG2NUM)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix | other => integer + * + * Bitwise OR. + */) + +directive(static) ident(VALUE) +ident(fix_or)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(val)operator(;) + + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(y) operator(=) ident(fix_coerce)operator(()ident(y)operator(\)\)\)) operator({) + reserved(return) ident(rb_big_or)operator(()ident(y)operator(,) ident(x)operator(\);) + operator(}) + ident(val) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\)) operator(|) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(return) ident(LONG2NUM)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix ^ other => integer + * + * Bitwise EXCLUSIVE OR. + */) + +directive(static) ident(VALUE) +ident(fix_xor)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(val)operator(;) + + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(y) operator(=) ident(fix_coerce)operator(()ident(y)operator(\)\)\)) operator({) + reserved(return) ident(rb_big_xor)operator(()ident(y)operator(,) ident(x)operator(\);) + operator(}) + ident(val) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\)) operator(^) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(return) ident(LONG2NUM)operator(()ident(val)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(fix_lshift) ident(_)operator((()pre_type(long)operator(,) pre_type(unsigned) pre_type(long)operator(\)\);) +directive(static) ident(VALUE) ident(fix_rshift) ident(_)operator((()pre_type(long)operator(,) pre_type(unsigned) pre_type(long)operator(\)\);) + +comment(/* + * call-seq: + * fix << count => integer + * + * Shifts _fix_ left _count_ positions (right if _count_ is negative\). + */) + +directive(static) ident(VALUE) +ident(rb_fix_lshift)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(val)operator(,) ident(width)operator(;) + + ident(val) operator(=) ident(NUM2LONG)operator(()ident(x)operator(\);) + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(y)operator(\)\)) + reserved(return) ident(rb_big_lshift)operator(()ident(rb_int2big)operator(()ident(val)operator(\),) ident(y)operator(\);) + ident(width) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(if) operator(()ident(width) operator(<) integer(0)operator(\)) + reserved(return) ident(fix_rshift)operator(()ident(val)operator(,) operator(()pre_type(unsigned) pre_type(long)operator(\)-)ident(width)operator(\);) + reserved(return) ident(fix_lshift)operator(()ident(val)operator(,) ident(width)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(fix_lshift)operator(()ident(val)operator(,) ident(width)operator(\)) + pre_type(long) ident(val)operator(;) + pre_type(unsigned) pre_type(long) ident(width)operator(;) +operator({) + reserved(if) operator(()ident(width) operator(>) operator(()reserved(sizeof)operator(()ident(VALUE)operator(\)*)ident(CHAR_BIT)operator(-)integer(1)operator(\)) + operator(||) operator((()pre_type(unsigned) pre_type(long)operator(\))ident(val)operator(\)>>()reserved(sizeof)operator(()ident(VALUE)operator(\)*)ident(CHAR_BIT)operator(-)integer(1)operator(-)ident(width)operator(\)) operator(>) integer(0)operator(\)) operator({) + reserved(return) ident(rb_big_lshift)operator(()ident(rb_int2big)operator(()ident(val)operator(\),) ident(ULONG2NUM)operator(()ident(width)operator(\)\);) + operator(}) + ident(val) operator(=) ident(val) operator(<<) ident(width)operator(;) + reserved(return) ident(LONG2NUM)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix >> count => integer + * + * Shifts _fix_ right _count_ positions (left if _count_ is negative\). + */) + +directive(static) ident(VALUE) +ident(rb_fix_rshift)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + pre_type(long) ident(i)operator(,) ident(val)operator(;) + + ident(val) operator(=) ident(FIX2LONG)operator(()ident(x)operator(\);) + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(y)operator(\)\)) + reserved(return) ident(rb_big_rshift)operator(()ident(rb_int2big)operator(()ident(val)operator(\),) ident(y)operator(\);) + ident(i) operator(=) ident(FIX2LONG)operator(()ident(y)operator(\);) + reserved(if) operator(()ident(i) operator(==) integer(0)operator(\)) reserved(return) ident(x)operator(;) + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) + reserved(return) ident(fix_lshift)operator(()ident(val)operator(,) operator(()pre_type(unsigned) pre_type(long)operator(\)-)ident(i)operator(\);) + reserved(return) ident(fix_rshift)operator(()ident(val)operator(,) ident(i)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(fix_rshift)operator(()pre_type(long) ident(val)operator(,) pre_type(unsigned) pre_type(long) ident(i)operator(\)) +operator({) + reserved(if) operator(()ident(i) operator(>=) reserved(sizeof)operator(()pre_type(long)operator(\)*)ident(CHAR_BIT)operator(-)integer(1)operator(\)) operator({) + reserved(if) operator(()ident(val) operator(<) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + operator(}) + ident(val) operator(=) ident(RSHIFT)operator(()ident(val)operator(,) ident(i)operator(\);) + reserved(return) ident(LONG2FIX)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix[n] => 0, 1 + * + * Bit Reference---Returns the <em>n</em>th bit in the binary + * representation of <i>fix</i>, where <i>fix</i>[0] is the least + * significant bit. + * + * a = 0b11001100101010 + * 30.downto(0\) do |n| print a[n] end + * + * <em>produces:</em> + * + * 0000000000000000011001100101010 + */) + +directive(static) ident(VALUE) +ident(fix_aref)operator(()ident(fix)operator(,) ident(idx)operator(\)) + ident(VALUE) ident(fix)operator(,) ident(idx)operator(;) +operator({) + pre_type(long) ident(val) operator(=) ident(FIX2LONG)operator(()ident(fix)operator(\);) + pre_type(long) ident(i)operator(;) + + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(idx) operator(=) ident(fix_coerce)operator(()ident(idx)operator(\)\)\)) operator({) + ident(idx) operator(=) ident(rb_big_norm)operator(()ident(idx)operator(\);) + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(idx)operator(\)\)) operator({) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(idx)operator(\)->)ident(sign) operator(||) ident(val) operator(>=) integer(0)operator(\)) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + operator(}) + operator(}) + ident(i) operator(=) ident(FIX2LONG)operator(()ident(idx)operator(\);) + + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()reserved(sizeof)operator(()ident(VALUE)operator(\)*)ident(CHAR_BIT)operator(-)integer(1) operator(<) ident(i)operator(\)) operator({) + reserved(if) operator(()ident(val) operator(<) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(val) operator(&) operator(()integer(1L)operator(<<)ident(i)operator(\)\)) + reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix.to_f -> float + * + * Converts <i>fix</i> to a <code>Float</code>. + * + */) + +directive(static) ident(VALUE) +ident(fix_to_f)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + pre_type(double) ident(val)operator(;) + + ident(val) operator(=) operator(()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(num)operator(\);) + + reserved(return) ident(rb_float_new)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix.abs -> aFixnum + * + * Returns the absolute value of <i>fix</i>. + * + * -12345.abs #=> 12345 + * 12345.abs #=> 12345 + * + */) + +directive(static) ident(VALUE) +ident(fix_abs)operator(()ident(fix)operator(\)) + ident(VALUE) ident(fix)operator(;) +operator({) + pre_type(long) ident(i) operator(=) ident(FIX2LONG)operator(()ident(fix)operator(\);) + + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) ident(i) operator(=) operator(-)ident(i)operator(;) + + reserved(return) ident(LONG2NUM)operator(()ident(i)operator(\);) +operator(}) + +comment(/* + * call-seq: + * fix.id2name -> string or nil + * + * Returns the name of the object whose symbol id is <i>fix</i>. If + * there is no symbol in the symbol table with this value, returns + * <code>nil</code>. <code>id2name</code> has nothing to do with the + * <code>Object.id</code> method. See also <code>Fixnum#to_sym</code>, + * <code>String#intern</code>, and class <code>Symbol</code>. + * + * symbol = :@inst_var #=> :@inst_var + * id = symbol.to_i #=> 9818 + * id.id2name #=> "@inst_var" + */) + +directive(static) ident(VALUE) +ident(fix_id2name)operator(()ident(fix)operator(\)) + ident(VALUE) ident(fix)operator(;) +operator({) + pre_type(char) operator(*)ident(name) operator(=) ident(rb_id2name)operator(()ident(FIX2UINT)operator(()ident(fix)operator(\)\);) + reserved(if) operator(()ident(name)operator(\)) reserved(return) ident(rb_str_new2)operator(()ident(name)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * fix.to_sym -> aSymbol + * + * Returns the symbol whose integer value is <i>fix</i>. See also + * <code>Fixnum#id2name</code>. + * + * fred = :fred.to_i + * fred.id2name #=> "fred" + * fred.to_sym #=> :fred + */) + +directive(static) ident(VALUE) +ident(fix_to_sym)operator(()ident(fix)operator(\)) + ident(VALUE) ident(fix)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(FIX2UINT)operator(()ident(fix)operator(\);) + + reserved(if) operator(()ident(rb_id2name)operator(()ident(id)operator(\)\)) operator({) + reserved(return) ident(ID2SYM)operator(()ident(id)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * fix.size -> fixnum + * + * Returns the number of <em>bytes</em> in the machine representation + * of a <code>Fixnum</code>. + * + * 1.size #=> 4 + * -1.size #=> 4 + * 2147483647.size #=> 4 + */) + +directive(static) ident(VALUE) +ident(fix_size)operator(()ident(fix)operator(\)) + ident(VALUE) ident(fix)operator(;) +operator({) + reserved(return) ident(INT2FIX)operator(()reserved(sizeof)operator(()pre_type(long)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * int.upto(limit\) {|i| block } => int + * + * Iterates <em>block</em>, passing in integer values from <i>int</i> + * up to and including <i>limit</i>. + * + * 5.upto(10\) { |i| print i, " " } + * + * <em>produces:</em> + * + * 5 6 7 8 9 10 + */) + +directive(static) ident(VALUE) +ident(int_upto)operator(()ident(from)operator(,) ident(to)operator(\)) + ident(VALUE) ident(from)operator(,) ident(to)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(from)operator(\)) operator(&&) ident(FIXNUM_P)operator(()ident(to)operator(\)\)) operator({) + pre_type(long) ident(i)operator(,) ident(end)operator(;) + + ident(end) operator(=) ident(FIX2LONG)operator(()ident(to)operator(\);) + reserved(for) operator(()ident(i) operator(=) ident(FIX2LONG)operator(()ident(from)operator(\);) ident(i) operator(<=) ident(end)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(LONG2FIX)operator(()ident(i)operator(\)\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(i) operator(=) ident(from)operator(,) ident(c)operator(;) + + reserved(while) operator((!()ident(c) operator(=) ident(rb_funcall)operator(()ident(i)operator(,) char('>')operator(,) integer(1)operator(,) ident(to)operator(\)\)\)) operator({) + ident(rb_yield)operator(()ident(i)operator(\);) + ident(i) operator(=) ident(rb_funcall)operator(()ident(i)operator(,) char('+')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(1)operator(\)\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) ident(rb_cmperr)operator(()ident(i)operator(,) ident(to)operator(\);) + operator(}) + reserved(return) ident(from)operator(;) +operator(}) + +comment(/* + * call-seq: + * int.downto(limit\) {|i| block } => int + * + * Iterates <em>block</em>, passing decreasing values from <i>int</i> + * down to and including <i>limit</i>. + * + * 5.downto(1\) { |n| print n, ".. " } + * print " Liftoff!\\n" + * + * <em>produces:</em> + * + * 5.. 4.. 3.. 2.. 1.. Liftoff! + */) + +directive(static) ident(VALUE) +ident(int_downto)operator(()ident(from)operator(,) ident(to)operator(\)) + ident(VALUE) ident(from)operator(,) ident(to)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(from)operator(\)) operator(&&) ident(FIXNUM_P)operator(()ident(to)operator(\)\)) operator({) + pre_type(long) ident(i)operator(,) ident(end)operator(;) + + ident(end) operator(=) ident(FIX2LONG)operator(()ident(to)operator(\);) + reserved(for) operator(()ident(i)operator(=)ident(FIX2LONG)operator(()ident(from)operator(\);) ident(i) operator(>=) ident(end)operator(;) ident(i)operator(--\)) operator({) + ident(rb_yield)operator(()ident(LONG2FIX)operator(()ident(i)operator(\)\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(i) operator(=) ident(from)operator(,) ident(c)operator(;) + + reserved(while) operator((!()ident(c) operator(=) ident(rb_funcall)operator(()ident(i)operator(,) char('<')operator(,) integer(1)operator(,) ident(to)operator(\)\)\)) operator({) + ident(rb_yield)operator(()ident(i)operator(\);) + ident(i) operator(=) ident(rb_funcall)operator(()ident(i)operator(,) char('-')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(1)operator(\)\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) ident(rb_cmperr)operator(()ident(i)operator(,) ident(to)operator(\);) + operator(}) + reserved(return) ident(from)operator(;) +operator(}) + +comment(/* + * call-seq: + * int.times {|i| block } => int + * + * Iterates block <i>int</i> times, passing in values from zero to + * <i>int</i> - 1. + * + * 5.times do |i| + * print i, " " + * end + * + * <em>produces:</em> + * + * 0 1 2 3 4 + */) + +directive(static) ident(VALUE) +ident(int_dotimes)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(num)operator(\)\)) operator({) + pre_type(long) ident(i)operator(,) ident(end)operator(;) + + ident(end) operator(=) ident(FIX2LONG)operator(()ident(num)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(end)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(LONG2FIX)operator(()ident(i)operator(\)\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(i) operator(=) ident(INT2FIX)operator(()integer(0)operator(\);) + + reserved(for) operator((;;\)) operator({) + reserved(if) operator((!)ident(RTEST)operator(()ident(rb_funcall)operator(()ident(i)operator(,) char('<')operator(,) integer(1)operator(,) ident(num)operator(\)\)\)) reserved(break)operator(;) + ident(rb_yield)operator(()ident(i)operator(\);) + ident(i) operator(=) ident(rb_funcall)operator(()ident(i)operator(,) char('+')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(1)operator(\)\);) + operator(}) + operator(}) + reserved(return) ident(num)operator(;) +operator(}) + +comment(/* + * call-seq: + * fix.zero? => true or false + * + * Returns <code>true</code> if <i>fix</i> is zero. + * + */) + +directive(static) ident(VALUE) +ident(fix_zero_p)operator(()ident(num)operator(\)) + ident(VALUE) ident(num)operator(;) +operator({) + reserved(if) operator(()ident(FIX2LONG)operator(()ident(num)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(void) +ident(Init_Numeric)operator((\)) +operator({) +preprocessor(#if) ident(defined)operator(()ident(__FreeBSD__)operator(\)) operator(&&) ident(__FreeBSD__) operator(<) integer(4) + comment(/* allow divide by zero -- Inf */) + ident(fpsetmask)operator(()ident(fpgetmask)operator((\)) operator(&) operator(~()ident(FP_X_DZ)operator(|)ident(FP_X_INV)operator(|)ident(FP_X_OFL)operator(\)\);) +preprocessor(#elif) ident(defined)operator(()ident(_UNICOSMP)operator(\)) + comment(/* Turn off floating point exceptions for divide by zero, etc. */) + ident(_set_Creg)operator(()integer(0)operator(,) integer(0)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(__BORLANDC__)operator(\)) + comment(/* Turn off floating point exceptions for overflow, etc. */) + ident(_control87)operator(()ident(MCW_EM)operator(,) ident(MCW_EM)operator(\);) +preprocessor(#endif) + ident(id_coerce) operator(=) ident(rb_intern)operator(()string<delimiter(")content(coerce)delimiter(")>operator(\);) + ident(id_to_i) operator(=) ident(rb_intern)operator(()string<delimiter(")content(to_i)delimiter(")>operator(\);) + ident(id_eq) operator(=) ident(rb_intern)operator(()string<delimiter(")content(==)delimiter(")>operator(\);) + + ident(rb_eZeroDivError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(ZeroDivisionError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + ident(rb_eFloatDomainError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(FloatDomainError)delimiter(")>operator(,) ident(rb_eRangeError)operator(\);) + ident(rb_cNumeric) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Numeric)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(singleton_method_added)delimiter(")>operator(,) ident(num_sadded)operator(,) integer(1)operator(\);) + ident(rb_include_module)operator(()ident(rb_cNumeric)operator(,) ident(rb_mComparable)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(num_init_copy)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(coerce)delimiter(")>operator(,) ident(num_coerce)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(+@)delimiter(")>operator(,) ident(num_uplus)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(-@)delimiter(")>operator(,) ident(num_uminus)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(num_cmp)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(num_eql)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(quo)delimiter(")>operator(,) ident(num_quo)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(div)delimiter(")>operator(,) ident(num_div)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(num_divmod)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(modulo)delimiter(")>operator(,) ident(num_modulo)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(remainder)delimiter(")>operator(,) ident(num_remainder)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(abs)delimiter(")>operator(,) ident(num_abs)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(,) ident(num_to_int)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(integer?)delimiter(")>operator(,) ident(num_int_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(zero?)delimiter(")>operator(,) ident(num_zero_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(nonzero?)delimiter(")>operator(,) ident(num_nonzero_p)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(floor)delimiter(")>operator(,) ident(num_floor)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(ceil)delimiter(")>operator(,) ident(num_ceil)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(round)delimiter(")>operator(,) ident(num_round)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(truncate)delimiter(")>operator(,) ident(num_truncate)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNumeric)operator(,) string<delimiter(")content(step)delimiter(")>operator(,) ident(num_step)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_cInteger) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Integer)delimiter(")>operator(,) ident(rb_cNumeric)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cInteger)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cInteger)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(integer?)delimiter(")>operator(,) ident(int_int_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(upto)delimiter(")>operator(,) ident(int_upto)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(downto)delimiter(")>operator(,) ident(int_downto)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(times)delimiter(")>operator(,) ident(int_dotimes)operator(,) integer(0)operator(\);) + ident(rb_include_module)operator(()ident(rb_cInteger)operator(,) ident(rb_mPrecision)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(succ)delimiter(")>operator(,) ident(int_succ)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(next)delimiter(")>operator(,) ident(int_succ)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(chr)delimiter(")>operator(,) ident(int_chr)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) ident(int_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(,) ident(int_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(floor)delimiter(")>operator(,) ident(int_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(ceil)delimiter(")>operator(,) ident(int_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(round)delimiter(")>operator(,) ident(int_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(truncate)delimiter(")>operator(,) ident(int_to_i)operator(,) integer(0)operator(\);) + + ident(rb_cFixnum) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Fixnum)delimiter(")>operator(,) ident(rb_cInteger)operator(\);) + ident(rb_include_module)operator(()ident(rb_cFixnum)operator(,) ident(rb_mPrecision)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(induced_from)delimiter(")>operator(,) ident(rb_fix_induced_from)operator(,) integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cInteger)operator(,) string<delimiter(")content(induced_from)delimiter(")>operator(,) ident(rb_int_induced_from)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(fix_to_s)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(id2name)delimiter(")>operator(,) ident(fix_id2name)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(to_sym)delimiter(")>operator(,) ident(fix_to_sym)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(-@)delimiter(")>operator(,) ident(fix_uminus)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(fix_plus)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(fix_minus)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(fix_mul)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(fix_div)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(div)delimiter(")>operator(,) ident(fix_div)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(fix_mod)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(modulo)delimiter(")>operator(,) ident(fix_mod)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(fix_divmod)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(quo)delimiter(")>operator(,) ident(fix_quo)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(fix_pow)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(abs)delimiter(")>operator(,) ident(fix_abs)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(fix_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(fix_cmp)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(fix_gt)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(>=)delimiter(")>operator(,) ident(fix_ge)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(fix_lt)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(<=)delimiter(")>operator(,) ident(fix_le)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(~)delimiter(")>operator(,) ident(fix_rev)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) ident(fix_and)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(|)delimiter(")>operator(,) ident(fix_or)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(^)delimiter(")>operator(,) ident(fix_xor)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(fix_aref)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(<<)delimiter(")>operator(,) ident(rb_fix_lshift)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(>>)delimiter(")>operator(,) ident(rb_fix_rshift)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(to_f)delimiter(")>operator(,) ident(fix_to_f)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(size)delimiter(")>operator(,) ident(fix_size)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFixnum)operator(,) string<delimiter(")content(zero?)delimiter(")>operator(,) ident(fix_zero_p)operator(,) integer(0)operator(\);) + + ident(rb_cFloat) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Float)delimiter(")>operator(,) ident(rb_cNumeric)operator(\);) + + ident(rb_undef_alloc_func)operator(()ident(rb_cFloat)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cFloat)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(induced_from)delimiter(")>operator(,) ident(rb_flo_induced_from)operator(,) integer(1)operator(\);) + ident(rb_include_module)operator(()ident(rb_cFloat)operator(,) ident(rb_mPrecision)operator(\);) + + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(ROUNDS)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(FLT_ROUNDS)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(RADIX)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(FLT_RADIX)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(MANT_DIG)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(DBL_MANT_DIG)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(DIG)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(DBL_DIG)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(MIN_EXP)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(DBL_MIN_EXP)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(MAX_EXP)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(DBL_MAX_EXP)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(MIN_10_EXP)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(DBL_MIN_10_EXP)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(MAX_10_EXP)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(DBL_MAX_10_EXP)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(MIN)delimiter(")>operator(,) ident(rb_float_new)operator(()ident(DBL_MIN)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(MAX)delimiter(")>operator(,) ident(rb_float_new)operator(()ident(DBL_MAX)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(EPSILON)delimiter(")>operator(,) ident(rb_float_new)operator(()ident(DBL_EPSILON)operator(\)\);) + + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(flo_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(coerce)delimiter(")>operator(,) ident(flo_coerce)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(-@)delimiter(")>operator(,) ident(flo_uminus)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(flo_plus)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(flo_minus)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(flo_mul)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(flo_div)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(flo_mod)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(modulo)delimiter(")>operator(,) ident(flo_mod)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(flo_divmod)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(flo_pow)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(flo_eq)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(flo_cmp)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(flo_gt)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(>=)delimiter(")>operator(,) ident(flo_ge)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(flo_lt)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(<=)delimiter(")>operator(,) ident(flo_le)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(flo_eql)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(hash)delimiter(")>operator(,) ident(flo_hash)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(to_f)delimiter(")>operator(,) ident(flo_to_f)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(abs)delimiter(")>operator(,) ident(flo_abs)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(zero?)delimiter(")>operator(,) ident(flo_zero_p)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) ident(flo_truncate)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(,) ident(flo_truncate)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(floor)delimiter(")>operator(,) ident(flo_floor)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(ceil)delimiter(")>operator(,) ident(flo_ceil)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(round)delimiter(")>operator(,) ident(flo_round)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(truncate)delimiter(")>operator(,) ident(flo_truncate)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(nan?)delimiter(")>operator(,) ident(flo_is_nan_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(infinite?)delimiter(")>operator(,) ident(flo_is_infinite_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFloat)operator(,) string<delimiter(")content(finite?)delimiter(")>operator(,) ident(flo_is_finite_p)operator(,) integer(0)operator(\);) +operator(}) +comment(/********************************************************************** + + object.c - + + $Author: shyouhei $ + $Date: 2008-06-18 08:21:30 +0200 (Wed, 18 Jun 2008\) $ + created at: Thu Jul 15 12:01:24 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("st.h") +preprocessor(#include) include("util.h") +preprocessor(#include) include(<stdio.h>) +preprocessor(#include) include(<errno.h>) +preprocessor(#include) include(<ctype.h>) +preprocessor(#include) include(<math.h>) + +ident(VALUE) ident(rb_mKernel)operator(;) +ident(VALUE) ident(rb_cObject)operator(;) +ident(VALUE) ident(rb_cModule)operator(;) +ident(VALUE) ident(rb_cClass)operator(;) +ident(VALUE) ident(rb_cData)operator(;) + +ident(VALUE) ident(rb_cNilClass)operator(;) +ident(VALUE) ident(rb_cTrueClass)operator(;) +ident(VALUE) ident(rb_cFalseClass)operator(;) +ident(VALUE) ident(rb_cSymbol)operator(;) + +directive(static) ident(ID) ident(id_eq)operator(,) ident(id_eql)operator(,) ident(id_inspect)operator(,) ident(id_init_copy)operator(;) + +comment(/* + * call-seq: + * obj === other => true or false + * + * Case Equality---For class <code>Object</code>, effectively the same + * as calling <code>#==</code>, but typically overridden by descendents + * to provide meaningful semantics in <code>case</code> statements. + */) + +ident(VALUE) +ident(rb_equal)operator(()ident(obj1)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj1)operator(,) ident(obj2)operator(;) +operator({) + ident(VALUE) ident(result)operator(;) + + reserved(if) operator(()ident(obj1) operator(==) ident(obj2)operator(\)) reserved(return) ident(Qtrue)operator(;) + ident(result) operator(=) ident(rb_funcall)operator(()ident(obj1)operator(,) ident(id_eq)operator(,) integer(1)operator(,) ident(obj2)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(result)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +pre_type(int) +ident(rb_eql)operator(()ident(obj1)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj1)operator(,) ident(obj2)operator(;) +operator({) + reserved(return) ident(RTEST)operator(()ident(rb_funcall)operator(()ident(obj1)operator(,) ident(id_eql)operator(,) integer(1)operator(,) ident(obj2)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * obj == other => true or false + * obj.equal?(other\) => true or false + * obj.eql?(other\) => true or false + * + * Equality---At the <code>Object</code> level, <code>==</code> returns + * <code>true</code> only if <i>obj</i> and <i>other</i> are the + * same object. Typically, this method is overridden in descendent + * classes to provide class-specific meaning. + * + * Unlike <code>==</code>, the <code>equal?</code> method should never be + * overridden by subclasses: it is used to determine object identity + * (that is, <code>a.equal?(b\)</code> iff <code>a</code> is the same + * object as <code>b</code>\). + * + * The <code>eql?</code> method returns <code>true</code> if + <i>obj</i> and <i>anObject</i> have the + * same value. Used by <code>Hash</code> to test members for equality. + * For objects of class <code>Object</code>, <code>eql?</code> is + * synonymous with <code>==</code>. Subclasses normally continue this + * tradition, but there are exceptions. <code>Numeric</code> types, for + * example, perform type conversion across <code>==</code>, but not + * across <code>eql?</code>, so: + * + * 1 == 1.0 #=> true + * 1.eql? 1.0 #=> false + */) + +directive(static) ident(VALUE) +ident(rb_obj_equal)operator(()ident(obj1)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj1)operator(,) ident(obj2)operator(;) +operator({) + reserved(if) operator(()ident(obj1) operator(==) ident(obj2)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.id => fixnum + * + * Soon-to-be deprecated version of <code>Object#object_id</code>. + */) + +ident(VALUE) +ident(rb_obj_id_obsolete)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(Object#id will be deprecated; use Object#object_id)delimiter(")>operator(\);) + reserved(return) ident(rb_obj_id)operator(()ident(obj)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_class_real)operator(()ident(cl)operator(\)) + ident(VALUE) ident(cl)operator(;) +operator({) + reserved(while) operator(()ident(FL_TEST)operator(()ident(cl)operator(,) ident(FL_SINGLETON)operator(\)) operator(||) ident(TYPE)operator(()ident(cl)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(cl) operator(=) ident(RCLASS)operator(()ident(cl)operator(\)->)ident(super)operator(;) + operator(}) + reserved(return) ident(cl)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.type => class + * + * Deprecated synonym for <code>Object#class</code>. + */) + +ident(VALUE) +ident(rb_obj_type)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(Object#type is deprecated; use Object#class)delimiter(")>operator(\);) + reserved(return) ident(rb_class_real)operator(()ident(CLASS_OF)operator(()ident(obj)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * obj.class => class + * + * Returns the class of <i>obj</i>, now preferred over + * <code>Object#type</code>, as an object's type in Ruby is only + * loosely tied to that object's class. This method must always be + * called with an explicit receiver, as <code>class</code> is also a + * reserved word in Ruby. + * + * 1.class #=> Fixnum + * self.class #=> Object + */) + +ident(VALUE) +ident(rb_obj_class)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_class_real)operator(()ident(CLASS_OF)operator(()ident(obj)operator(\)\);) +operator(}) + +directive(static) directive(void) +ident(init_copy)operator(()ident(dest)operator(,) ident(obj)operator(\)) + ident(VALUE) ident(dest)operator(,) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(dest)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content([bug] frozen object (%s\) allocated)delimiter(")>operator(,) ident(rb_obj_classname)operator(()ident(dest)operator(\)\);) + operator(}) + ident(RBASIC)operator(()ident(dest)operator(\)->)ident(flags) operator(&=) operator(~()ident(T_MASK)operator(|)ident(FL_EXIVAR)operator(\);) + ident(RBASIC)operator(()ident(dest)operator(\)->)ident(flags) operator(|=) ident(RBASIC)operator(()ident(obj)operator(\)->)ident(flags) operator(&) operator(()ident(T_MASK)operator(|)ident(FL_EXIVAR)operator(|)ident(FL_TAINT)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)\)) operator({) + ident(rb_copy_generic_ivar)operator(()ident(dest)operator(,) ident(obj)operator(\);) + operator(}) + ident(rb_gc_copy_finalizer)operator(()ident(dest)operator(,) ident(obj)operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_OBJECT)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(if) operator(()ident(ROBJECT)operator(()ident(dest)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(st_free_table)operator(()ident(ROBJECT)operator(()ident(dest)operator(\)->)ident(iv_tbl)operator(\);) + ident(ROBJECT)operator(()ident(dest)operator(\)->)ident(iv_tbl) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(ROBJECT)operator(()ident(dest)operator(\)->)ident(iv_tbl) operator(=) ident(st_copy)operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(\);) + operator(}) + operator(}) + ident(rb_funcall)operator(()ident(dest)operator(,) ident(id_init_copy)operator(,) integer(1)operator(,) ident(obj)operator(\);) +operator(}) + +comment(/* + * call-seq: + * obj.clone -> an_object + * + * Produces a shallow copy of <i>obj</i>---the instance variables of + * <i>obj</i> are copied, but not the objects they reference. Copies + * the frozen and tainted state of <i>obj</i>. See also the discussion + * under <code>Object#dup</code>. + * + * class Klass + * attr_accessor :str + * end + * s1 = Klass.new #=> #<Klass:0x401b3a38> + * s1.str = "Hello" #=> "Hello" + * s2 = s1.clone #=> #<Klass:0x401b3998 @str="Hello"> + * s2.str[1,4] = "i" #=> "i" + * s1.inspect #=> "#<Klass:0x401b3a38 @str=\\"Hi\\">" + * s2.inspect #=> "#<Klass:0x401b3998 @str=\\"Hi\\">" + * + * This method may have class-specific behavior. If so, that + * behavior will be documented under the #+initialize_copy+ method of + * the class. + */) + +ident(VALUE) +ident(rb_obj_clone)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(clone)operator(;) + + reserved(if) operator(()ident(rb_special_const_p)operator(()ident(obj)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't clone %s)delimiter(")>operator(,) ident(rb_obj_classname)operator(()ident(obj)operator(\)\);) + operator(}) + ident(clone) operator(=) ident(rb_obj_alloc)operator(()ident(rb_obj_class)operator(()ident(obj)operator(\)\);) + ident(RBASIC)operator(()ident(clone)operator(\)->)ident(klass) operator(=) ident(rb_singleton_class_clone)operator(()ident(obj)operator(\);) + ident(RBASIC)operator(()ident(clone)operator(\)->)ident(flags) operator(=) operator(()ident(RBASIC)operator(()ident(obj)operator(\)->)ident(flags) operator(|) ident(FL_TEST)operator(()ident(clone)operator(,) ident(FL_TAINT)operator(\)\)) operator(&) operator(~()ident(FL_FREEZE)operator(|)ident(FL_FINALIZE)operator(\);) + ident(init_copy)operator(()ident(clone)operator(,) ident(obj)operator(\);) + ident(RBASIC)operator(()ident(clone)operator(\)->)ident(flags) operator(|=) ident(RBASIC)operator(()ident(obj)operator(\)->)ident(flags) operator(&) ident(FL_FREEZE)operator(;) + + reserved(return) ident(clone)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.dup -> an_object + * + * Produces a shallow copy of <i>obj</i>---the instance variables of + * <i>obj</i> are copied, but not the objects they reference. + * <code>dup</code> copies the tainted state of <i>obj</i>. See also + * the discussion under <code>Object#clone</code>. In general, + * <code>clone</code> and <code>dup</code> may have different semantics + * in descendent classes. While <code>clone</code> is used to duplicate + * an object, including its internal state, <code>dup</code> typically + * uses the class of the descendent object to create the new instance. + * + * This method may have class-specific behavior. If so, that + * behavior will be documented under the #+initialize_copy+ method of + * the class. + */) + +ident(VALUE) +ident(rb_obj_dup)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(dup)operator(;) + + reserved(if) operator(()ident(rb_special_const_p)operator(()ident(obj)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't dup %s)delimiter(")>operator(,) ident(rb_obj_classname)operator(()ident(obj)operator(\)\);) + operator(}) + ident(dup) operator(=) ident(rb_obj_alloc)operator(()ident(rb_obj_class)operator(()ident(obj)operator(\)\);) + ident(init_copy)operator(()ident(dup)operator(,) ident(obj)operator(\);) + + reserved(return) ident(dup)operator(;) +operator(}) + +comment(/* :nodoc: */) +ident(VALUE) +ident(rb_obj_init_copy)operator(()ident(obj)operator(,) ident(orig)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(orig)operator(;) +operator({) + reserved(if) operator(()ident(obj) operator(==) ident(orig)operator(\)) reserved(return) ident(obj)operator(;) + ident(rb_check_frozen)operator(()ident(obj)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(obj)operator(\)) operator(!=) ident(TYPE)operator(()ident(orig)operator(\)) operator(||) ident(rb_obj_class)operator(()ident(obj)operator(\)) operator(!=) ident(rb_obj_class)operator(()ident(orig)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(initialize_copy should take same class object)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.to_a -> anArray + * + * Returns an array representation of <i>obj</i>. For objects of class + * <code>Object</code> and others that don't explicitly override the + * method, the return value is an array containing <code>self</code>. + * However, this latter behavior will soon be obsolete. + * + * self.to_a #=> -:1: warning: default `to_a' will be obsolete + * "hello".to_a #=> ["hello"] + * Time.new.to_a #=> [39, 54, 8, 9, 4, 2003, 3, 99, true, "CDT"] + */) + + +directive(static) ident(VALUE) +ident(rb_any_to_a)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(default `to_a' will be obsolete)delimiter(")>operator(\);) + reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(obj)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * obj.to_s => string + * + * Returns a string representing <i>obj</i>. The default + * <code>to_s</code> prints the object's class and an encoding of the + * object id. As a special case, the top-level object that is the + * initial execution context of Ruby programs returns ``main.'' + */) + +ident(VALUE) +ident(rb_any_to_s)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(char) operator(*)ident(cname) operator(=) ident(rb_obj_classname)operator(()ident(obj)operator(\);) + ident(size_t) ident(len)operator(;) + ident(VALUE) ident(str)operator(;) + + ident(len) operator(=) ident(strlen)operator(()ident(cname)operator(\)+)integer(6)operator(+)integer(16)operator(;) + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) comment(/* 6:tags 16:addr */) + ident(snprintf)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(+)integer(1)operator(,) string<delimiter(")content(#<%s:0x%lx>)delimiter(")>operator(,) ident(cname)operator(,) ident(obj)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(strlen)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_inspect)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_obj_as_string)operator(()ident(rb_funcall)operator(()ident(obj)operator(,) ident(id_inspect)operator(,) integer(0)operator(,) integer(0)operator(\)\);) +operator(}) + +directive(static) pre_type(int) +ident(inspect_i)operator(()ident(id)operator(,) ident(value)operator(,) ident(str)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(value)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(str2)operator(;) + pre_type(char) operator(*)ident(ivname)operator(;) + + comment(/* need not to show internal data */) + reserved(if) operator(()ident(CLASS_OF)operator(()ident(value)operator(\)) operator(==) integer(0)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator((!)ident(rb_is_instance_id)operator(()ident(id)operator(\)\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(==) char('-')operator(\)) operator({) comment(/* first element */) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(=) char('#')operator(;) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content( )delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(, )delimiter(")>operator(\);) + operator(}) + ident(ivname) operator(=) ident(rb_id2name)operator(()ident(id)operator(\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) ident(ivname)operator(\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(=)delimiter(")>operator(\);) + ident(str2) operator(=) ident(rb_inspect)operator(()ident(value)operator(\);) + ident(rb_str_append)operator(()ident(str)operator(,) ident(str2)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(str2)operator(\);) + + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(inspect_obj)operator(()ident(obj)operator(,) ident(str)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(str)operator(;) +operator({) + ident(st_foreach_safe)operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(,) ident(inspect_i)operator(,) ident(str)operator(\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(>)delimiter(")>operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(=) char('#')operator(;) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(obj)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.inspect => string + * + * Returns a string containing a human-readable representation of + * <i>obj</i>. If not overridden, uses the <code>to_s</code> method to + * generate the string. + * + * [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \\"five\\"]" + * Time.new.inspect #=> "Wed Apr 09 08:54:39 CDT 2003" + */) + + +directive(static) ident(VALUE) +ident(rb_obj_inspect)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(obj)operator(\)) operator(==) ident(T_OBJECT) + operator(&&) ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl) + operator(&&) ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(->)ident(num_entries) operator(>) integer(0)operator(\)) operator({) + ident(VALUE) ident(str)operator(;) + ident(size_t) ident(len)operator(;) + pre_type(char) operator(*)ident(c)operator(;) + + ident(c) operator(=) ident(rb_obj_classname)operator(()ident(obj)operator(\);) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(obj)operator(\)\)) operator({) + ident(len) operator(=) ident(strlen)operator(()ident(c)operator(\)+)integer(10)operator(+)integer(16)operator(+)integer(1)operator(;) + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) comment(/* 10:tags 16:addr 1:nul */) + ident(snprintf)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(,) string<delimiter(")content(#<%s:0x%lx ...>)delimiter(")>operator(,) ident(c)operator(,) ident(obj)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(strlen)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + reserved(return) ident(str)operator(;) + operator(}) + ident(len) operator(=) ident(strlen)operator(()ident(c)operator(\)+)integer(6)operator(+)integer(16)operator(+)integer(1)operator(;) + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) comment(/* 6:tags 16:addr 1:nul */) + ident(snprintf)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(,) string<delimiter(")content(-<%s:0x%lx)delimiter(")>operator(,) ident(c)operator(,) ident(obj)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(strlen)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + reserved(return) ident(rb_protect_inspect)operator(()ident(inspect_obj)operator(,) ident(obj)operator(,) ident(str)operator(\);) + operator(}) + reserved(return) ident(rb_funcall)operator(()ident(obj)operator(,) ident(rb_intern)operator(()string<delimiter(")content(to_s)delimiter(")>operator(\),) integer(0)operator(,) integer(0)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * obj.instance_of?(class\) => true or false + * + * Returns <code>true</code> if <i>obj</i> is an instance of the given + * class. See also <code>Object#kind_of?</code>. + */) + +ident(VALUE) +ident(rb_obj_is_instance_of)operator(()ident(obj)operator(,) ident(c)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(c)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(c)operator(\)\)) operator({) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_ICLASS)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(class or module required)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(rb_obj_class)operator(()ident(obj)operator(\)) operator(==) ident(c)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * obj.is_a?(class\) => true or false + * obj.kind_of?(class\) => true or false + * + * Returns <code>true</code> if <i>class</i> is the class of + * <i>obj</i>, or if <i>class</i> is one of the superclasses of + * <i>obj</i> or modules included in <i>obj</i>. + * + * module M; end + * class A + * include M + * end + * class B < A; end + * class C < B; end + * b = B.new + * b.instance_of? A #=> false + * b.instance_of? B #=> true + * b.instance_of? C #=> false + * b.instance_of? M #=> false + * b.kind_of? A #=> true + * b.kind_of? B #=> true + * b.kind_of? C #=> false + * b.kind_of? M #=> true + */) + +ident(VALUE) +ident(rb_obj_is_kind_of)operator(()ident(obj)operator(,) ident(c)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(c)operator(;) +operator({) + ident(VALUE) ident(cl) operator(=) ident(CLASS_OF)operator(()ident(obj)operator(\);) + + reserved(switch) operator(()ident(TYPE)operator(()ident(c)operator(\)\)) operator({) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_ICLASS)operator(:) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(class or module required)delimiter(")>operator(\);) + operator(}) + + reserved(while) operator(()ident(cl)operator(\)) operator({) + reserved(if) operator(()ident(cl) operator(==) ident(c) operator(||) ident(RCLASS)operator(()ident(cl)operator(\)->)ident(m_tbl) operator(==) ident(RCLASS)operator(()ident(c)operator(\)->)ident(m_tbl)operator(\)) + reserved(return) ident(Qtrue)operator(;) + ident(cl) operator(=) ident(RCLASS)operator(()ident(cl)operator(\)->)ident(super)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * Document-method: inherited + * + * call-seq: + * inherited(subclass\) + * + * Callback invoked whenever a subclass of the current class is created. + * + * Example: + * + * class Foo + * def self.inherited(subclass\) + * puts "New subclass: #{subclass}" + * end + * end + * + * class Bar < Foo + * end + * + * class Baz < Bar + * end + * + * produces: + * + * New subclass: Bar + * New subclass: Baz + */) + +comment(/* + * Document-method: singleton_method_added + * + * call-seq: + * singleton_method_added(symbol\) + * + * Invoked as a callback whenever a singleton method is added to the + * receiver. + * + * module Chatty + * def Chatty.singleton_method_added(id\) + * puts "Adding #{id.id2name}" + * end + * def self.one(\) end + * def two(\) end + * def Chatty.three(\) end + * end + * + * <em>produces:</em> + * + * Adding singleton_method_added + * Adding one + * Adding three + * + */) + +comment(/* + * Document-method: singleton_method_removed + * + * call-seq: + * singleton_method_removed(symbol\) + * + * Invoked as a callback whenever a singleton method is removed from + * the receiver. + * + * module Chatty + * def Chatty.singleton_method_removed(id\) + * puts "Removing #{id.id2name}" + * end + * def self.one(\) end + * def two(\) end + * def Chatty.three(\) end + * class <<self + * remove_method :three + * remove_method :one + * end + * end + * + * <em>produces:</em> + * + * Removing three + * Removing one + */) + +comment(/* + * Document-method: singleton_method_undefined + * + * call-seq: + * singleton_method_undefined(symbol\) + * + * Invoked as a callback whenever a singleton method is undefined in + * the receiver. + * + * module Chatty + * def Chatty.singleton_method_undefined(id\) + * puts "Undefining #{id.id2name}" + * end + * def Chatty.one(\) end + * class << self + * undef_method(:one\) + * end + * end + * + * <em>produces:</em> + * + * Undefining one + */) + + +comment(/* + * Document-method: included + * + * call-seq: + * included( othermod \) + * + * Callback invoked whenever the receiver is included in another + * module or class. This should be used in preference to + * <tt>Module.append_features</tt> if your code wants to perform some + * action when a module is included in another. + * + * module A + * def A.included(mod\) + * puts "#{self} included in #{mod}" + * end + * end + * module Enumerable + * include A + * end + */) + + +comment(/* + * Not documented + */) + +directive(static) ident(VALUE) +ident(rb_obj_dummy)operator((\)) +operator({) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.tainted? => true or false + * + * Returns <code>true</code> if the object is tainted. + */) + +ident(VALUE) +ident(rb_obj_tainted)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.taint -> obj + * + * Marks <i>obj</i> as tainted---if the <code>$SAFE</code> level is + * set appropriately, many method calls which might alter the running + * programs environment will refuse to accept tainted strings. + */) + +ident(VALUE) +ident(rb_obj_taint)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(obj)operator(\)\)) operator({) + ident(rb_error_frozen)operator(()string<delimiter(")content(object)delimiter(")>operator(\);) + operator(}) + ident(OBJ_TAINT)operator(()ident(obj)operator(\);) + operator(}) + reserved(return) ident(obj)operator(;) +operator(}) + + +comment(/* + * call-seq: + * obj.untaint => obj + * + * Removes the taint from <i>obj</i>. + */) + +ident(VALUE) +ident(rb_obj_untaint)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(rb_secure)operator(()integer(3)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(obj)operator(\)\)) operator({) + ident(rb_error_frozen)operator(()string<delimiter(")content(object)delimiter(")>operator(\);) + operator(}) + ident(FL_UNSET)operator(()ident(obj)operator(,) ident(FL_TAINT)operator(\);) + operator(}) + reserved(return) ident(obj)operator(;) +operator(}) + +directive(void) +ident(rb_obj_infect)operator(()ident(obj1)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj1)operator(,) ident(obj2)operator(;) +operator({) + ident(OBJ_INFECT)operator(()ident(obj1)operator(,) ident(obj2)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * obj.freeze => obj + * + * Prevents further modifications to <i>obj</i>. A + * <code>TypeError</code> will be raised if modification is attempted. + * There is no way to unfreeze a frozen object. See also + * <code>Object#frozen?</code>. + * + * a = [ "a", "b", "c" ] + * a.freeze + * a << "z" + * + * <em>produces:</em> + * + * prog.rb:3:in `<<': can't modify frozen array (TypeError\) + * from prog.rb:3 + */) + +ident(VALUE) +ident(rb_obj_freeze)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator((!)ident(OBJ_FROZEN)operator(()ident(obj)operator(\)\)) operator({) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4) operator(&&) operator(!)ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't freeze object)delimiter(")>operator(\);) + operator(}) + ident(OBJ_FREEZE)operator(()ident(obj)operator(\);) + operator(}) + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.frozen? => true or false + * + * Returns the freeze status of <i>obj</i>. + * + * a = [ "a", "b", "c" ] + * a.freeze #=> ["a", "b", "c"] + * a.frozen? #=> true + */) + +directive(static) ident(VALUE) +ident(rb_obj_frozen_p)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(obj)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * Document-class: NilClass + * + * The class of the singleton object <code>nil</code>. + */) + +comment(/* + * call-seq: + * nil.to_i => 0 + * + * Always returns zero. + * + * nil.to_i #=> 0 + */) + + +directive(static) ident(VALUE) +ident(nil_to_i)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * nil.to_f => 0.0 + * + * Always returns zero. + * + * nil.to_f #=> 0.0 + */) + +directive(static) ident(VALUE) +ident(nil_to_f)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_float_new)operator(()float(0)float(.0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * nil.to_s => "" + * + * Always returns the empty string. + * + * nil.to_s #=> "" + */) + +directive(static) ident(VALUE) +ident(nil_to_s)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")delimiter(")>operator(\);) +operator(}) + +comment(/* + * call-seq: + * nil.to_a => [] + * + * Always returns an empty array. + * + * nil.to_a #=> [] + */) + +directive(static) ident(VALUE) +ident(nil_to_a)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_ary_new2)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * nil.inspect => "nil" + * + * Always returns the string "nil". + */) + +directive(static) ident(VALUE) +ident(nil_inspect)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(nil)delimiter(")>operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(main_to_s)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(main)delimiter(")>operator(\);) +operator(}) + + +comment(/*********************************************************************** + * Document-class: TrueClass + * + * The global value <code>true</code> is the only instance of class + * <code>TrueClass</code> and represents a logically true value in + * boolean expressions. The class provides operators allowing + * <code>true</code> to be used in logical expressions. + */) + + +comment(/* + * call-seq: + * true.to_s => "true" + * + * The string representation of <code>true</code> is "true". + */) + +directive(static) ident(VALUE) +ident(true_to_s)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(true)delimiter(")>operator(\);) +operator(}) + + +comment(/* + * call-seq: + * true & obj => true or false + * + * And---Returns <code>false</code> if <i>obj</i> is + * <code>nil</code> or <code>false</code>, <code>true</code> otherwise. + */) + +directive(static) ident(VALUE) +ident(true_and)operator(()ident(obj)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(obj2)operator(;) +operator({) + reserved(return) ident(RTEST)operator(()ident(obj2)operator(\)?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * true | obj => true + * + * Or---Returns <code>true</code>. As <i>anObject</i> is an argument to + * a method call, it is always evaluated; there is no short-circuit + * evaluation in this case. + * + * true | puts("or"\) + * true || puts("logical or"\) + * + * <em>produces:</em> + * + * or + */) + +directive(static) ident(VALUE) +ident(true_or)operator(()ident(obj)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(obj2)operator(;) +operator({) + reserved(return) ident(Qtrue)operator(;) +operator(}) + + +comment(/* + * call-seq: + * true ^ obj => !obj + * + * Exclusive Or---Returns <code>true</code> if <i>obj</i> is + * <code>nil</code> or <code>false</code>, <code>false</code> + * otherwise. + */) + +directive(static) ident(VALUE) +ident(true_xor)operator(()ident(obj)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(obj2)operator(;) +operator({) + reserved(return) ident(RTEST)operator(()ident(obj2)operator(\)?)label(Qfalse)operator(:)ident(Qtrue)operator(;) +operator(}) + + +comment(/* + * Document-class: FalseClass + * + * The global value <code>false</code> is the only instance of class + * <code>FalseClass</code> and represents a logically false value in + * boolean expressions. The class provides operators allowing + * <code>false</code> to participate correctly in logical expressions. + * + */) + +comment(/* + * call-seq: + * false.to_s => "false" + * + * 'nuf said... + */) + +directive(static) ident(VALUE) +ident(false_to_s)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(false)delimiter(")>operator(\);) +operator(}) + +comment(/* + * call-seq: + * false & obj => false + * nil & obj => false + * + * And---Returns <code>false</code>. <i>obj</i> is always + * evaluated as it is the argument to a method call---there is no + * short-circuit evaluation in this case. + */) + +directive(static) ident(VALUE) +ident(false_and)operator(()ident(obj)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(obj2)operator(;) +operator({) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * false | obj => true or false + * nil | obj => true or false + * + * Or---Returns <code>false</code> if <i>obj</i> is + * <code>nil</code> or <code>false</code>; <code>true</code> otherwise. + */) + +directive(static) ident(VALUE) +ident(false_or)operator(()ident(obj)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(obj2)operator(;) +operator({) + reserved(return) ident(RTEST)operator(()ident(obj2)operator(\)?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + + + +comment(/* + * call-seq: + * false ^ obj => true or false + * nil ^ obj => true or false + * + * Exclusive Or---If <i>obj</i> is <code>nil</code> or + * <code>false</code>, returns <code>false</code>; otherwise, returns + * <code>true</code>. + * + */) + +directive(static) ident(VALUE) +ident(false_xor)operator(()ident(obj)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(obj2)operator(;) +operator({) + reserved(return) ident(RTEST)operator(()ident(obj2)operator(\)?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call_seq: + * nil.nil? => true + * + * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>. + */) + +directive(static) ident(VALUE) +ident(rb_true)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call_seq: + * nil.nil? => true + * <anything_else>.nil? => false + * + * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>. + */) + + +directive(static) ident(VALUE) +ident(rb_false)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * obj =~ other => false + * + * Pattern Match---Overridden by descendents (notably + * <code>Regexp</code> and <code>String</code>\) to provide meaningful + * pattern-match semantics. + */) + +directive(static) ident(VALUE) +ident(rb_obj_pattern_match)operator(()ident(obj1)operator(,) ident(obj2)operator(\)) + ident(VALUE) ident(obj1)operator(,) ident(obj2)operator(;) +operator({) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/********************************************************************** + * Document-class: Symbol + * + * <code>Symbol</code> objects represent names and some strings + * inside the Ruby + * interpreter. They are generated using the <code>:name</code> and + * <code>:"string"</code> literals + * syntax, and by the various <code>to_sym</code> methods. The same + * <code>Symbol</code> object will be created for a given name or string + * for the duration of a program's execution, regardless of the context + * or meaning of that name. Thus if <code>Fred</code> is a constant in + * one context, a method in another, and a class in a third, the + * <code>Symbol</code> <code>:Fred</code> will be the same object in + * all three contexts. + * + * module One + * class Fred + * end + * $f1 = :Fred + * end + * module Two + * Fred = 1 + * $f2 = :Fred + * end + * def Fred(\) + * end + * $f3 = :Fred + * $f1.id #=> 2514190 + * $f2.id #=> 2514190 + * $f3.id #=> 2514190 + * + */) + +comment(/* + * call-seq: + * sym.to_i => fixnum + * + * Returns an integer that is unique for each symbol within a + * particular execution of a program. + * + * :fred.to_i #=> 9809 + * "fred".to_sym.to_i #=> 9809 + */) + +directive(static) ident(VALUE) +ident(sym_to_i)operator(()ident(sym)operator(\)) + ident(VALUE) ident(sym)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(SYM2ID)operator(()ident(sym)operator(\);) + + reserved(return) ident(LONG2FIX)operator(()ident(id)operator(\);) +operator(}) + + +comment(/* :nodoc: */) + +directive(static) ident(VALUE) +ident(sym_to_int)operator(()ident(sym)operator(\)) + ident(VALUE) ident(sym)operator(;) +operator({) + ident(rb_warning)operator(()string<delimiter(")content(treating Symbol as an integer)delimiter(")>operator(\);) + reserved(return) ident(sym_to_i)operator(()ident(sym)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * sym.inspect => string + * + * Returns the representation of <i>sym</i> as a symbol literal. + * + * :fred.inspect #=> ":fred" + */) + +directive(static) ident(VALUE) +ident(sym_inspect)operator(()ident(sym)operator(\)) + ident(VALUE) ident(sym)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + pre_type(char) operator(*)ident(name)operator(;) + ident(ID) ident(id) operator(=) ident(SYM2ID)operator(()ident(sym)operator(\);) + + ident(name) operator(=) ident(rb_id2name)operator(()ident(id)operator(\);) + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(strlen)operator(()ident(name)operator(\)+)integer(1)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(=) char(':')operator(;) + ident(strcpy)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(+)integer(1)operator(,) ident(name)operator(\);) + reserved(if) operator((!)ident(rb_symname_p)operator(()ident(name)operator(\)\)) operator({) + ident(str) operator(=) ident(rb_str_dump)operator(()ident(str)operator(\);) + ident(strncpy)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) string<delimiter(")content(:)char(\\")delimiter(")>operator(,) integer(2)operator(\);) + operator(}) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * sym.id2name => string + * sym.to_s => string + * + * Returns the name or string corresponding to <i>sym</i>. + * + * :fred.id2name #=> "fred" + */) + + +directive(static) ident(VALUE) +ident(sym_to_s)operator(()ident(sym)operator(\)) + ident(VALUE) ident(sym)operator(;) +operator({) + reserved(return) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(SYM2ID)operator(()ident(sym)operator(\)\)\);) +operator(}) + + +comment(/* + * call-seq: + * sym.to_sym => sym + * + * In general, <code>to_sym</code> returns the <code>Symbol</code> corresponding + * to an object. As <i>sym</i> is already a symbol, <code>self</code> is returned + * in this case. + */) + +directive(static) ident(VALUE) +ident(sym_to_sym)operator(()ident(sym)operator(\)) + ident(VALUE) ident(sym)operator(;) +operator({) + reserved(return) ident(sym)operator(;) +operator(}) + + +comment(/*********************************************************************** + * + * Document-class: Module + * + * A <code>Module</code> is a collection of methods and constants. The + * methods in a module may be instance methods or module methods. + * Instance methods appear as methods in a class when the module is + * included, module methods do not. Conversely, module methods may be + * called without creating an encapsulating object, while instance + * methods may not. (See <code>Module#module_function</code>\) + * + * In the descriptions that follow, the parameter <i>syml</i> refers + * to a symbol, which is either a quoted string or a + * <code>Symbol</code> (such as <code>:name</code>\). + * + * module Mod + * include Math + * CONST = 1 + * def meth + * # ... + * end + * end + * Mod.class #=> Module + * Mod.constants #=> ["E", "PI", "CONST"] + * Mod.instance_methods #=> ["meth"] + * + */) + +comment(/* + * call-seq: + * mod.to_s => string + * + * Return a string representing this module or class. For basic + * classes and modules, this is the name. For singletons, we + * show information on the thing we're attached to as well. + */) + +directive(static) ident(VALUE) +ident(rb_mod_to_s)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) + +operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(VALUE) ident(s) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(#<)delimiter(")>operator(\);) + ident(VALUE) ident(v) operator(=) ident(rb_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__attached__)delimiter(")>operator(\);) + + ident(rb_str_cat2)operator(()ident(s)operator(,) string<delimiter(")content(Class:)delimiter(")>operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(v)operator(\)\)) operator({) + reserved(case) label(T_CLASS)operator(:) reserved(case) label(T_MODULE)operator(:) + ident(rb_str_append)operator(()ident(s)operator(,) ident(rb_inspect)operator(()ident(v)operator(\)\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_str_append)operator(()ident(s)operator(,) ident(rb_any_to_s)operator(()ident(v)operator(\)\);) + reserved(break)operator(;) + operator(}) + ident(rb_str_cat2)operator(()ident(s)operator(,) string<delimiter(")content(>)delimiter(")>operator(\);) + + reserved(return) ident(s)operator(;) + operator(}) + reserved(return) ident(rb_str_dup)operator(()ident(rb_class_name)operator(()ident(klass)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * mod.freeze + * + * Prevents further modifications to <i>mod</i>. + */) + +directive(static) ident(VALUE) +ident(rb_mod_freeze)operator(()ident(mod)operator(\)) + ident(VALUE) ident(mod)operator(;) +operator({) + ident(rb_mod_to_s)operator(()ident(mod)operator(\);) + reserved(return) ident(rb_obj_freeze)operator(()ident(mod)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod === obj => true or false + * + * Case Equality---Returns <code>true</code> if <i>anObject</i> is an + * instance of <i>mod</i> or one of <i>mod</i>'s descendents. Of + * limited use for modules, but can be used in <code>case</code> + * statements to classify objects by class. + */) + +directive(static) ident(VALUE) +ident(rb_mod_eqq)operator(()ident(mod)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(arg)operator(;) +operator({) + reserved(return) ident(rb_obj_is_kind_of)operator(()ident(arg)operator(,) ident(mod)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod <= other => true, false, or nil + * + * Returns true if <i>mod</i> is a subclass of <i>other</i> or + * is the same as <i>other</i>. Returns + * <code>nil</code> if there's no relationship between the two. + * (Think of the relationship in terms of the class definition: + * "class A<B" implies "A<B"\). + * + */) + +ident(VALUE) +ident(rb_class_inherited_p)operator(()ident(mod)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(arg)operator(;) +operator({) + ident(VALUE) ident(start) operator(=) ident(mod)operator(;) + + reserved(if) operator(()ident(mod) operator(==) ident(arg)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(switch) operator(()ident(TYPE)operator(()ident(arg)operator(\)\)) operator({) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(compared with non class/module)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(mod)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(m_tbl) operator(==) ident(RCLASS)operator(()ident(arg)operator(\)->)ident(m_tbl)operator(\)) + reserved(return) ident(Qtrue)operator(;) + ident(mod) operator(=) ident(RBASIC)operator(()ident(mod)operator(\)->)ident(klass)operator(;) + operator(}) + reserved(while) operator(()ident(mod)operator(\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(m_tbl) operator(==) ident(RCLASS)operator(()ident(arg)operator(\)->)ident(m_tbl)operator(\)) + reserved(return) ident(Qtrue)operator(;) + ident(mod) operator(=) ident(RCLASS)operator(()ident(mod)operator(\)->)ident(super)operator(;) + operator(}) + comment(/* not mod < arg; check if mod > arg */) + reserved(while) operator(()ident(arg)operator(\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(arg)operator(\)->)ident(m_tbl) operator(==) ident(RCLASS)operator(()ident(start)operator(\)->)ident(m_tbl)operator(\)) + reserved(return) ident(Qfalse)operator(;) + ident(arg) operator(=) ident(RCLASS)operator(()ident(arg)operator(\)->)ident(super)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod < other => true, false, or nil + * + * Returns true if <i>mod</i> is a subclass of <i>other</i>. Returns + * <code>nil</code> if there's no relationship between the two. + * (Think of the relationship in terms of the class definition: + * "class A<B" implies "A<B"\). + * + */) + +directive(static) ident(VALUE) +ident(rb_mod_lt)operator(()ident(mod)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(arg)operator(;) +operator({) + reserved(if) operator(()ident(mod) operator(==) ident(arg)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(rb_class_inherited_p)operator(()ident(mod)operator(,) ident(arg)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * mod >= other => true, false, or nil + * + * Returns true if <i>mod</i> is an ancestor of <i>other</i>, or the + * two modules are the same. Returns + * <code>nil</code> if there's no relationship between the two. + * (Think of the relationship in terms of the class definition: + * "class A<B" implies "B>A"\). + * + */) + +directive(static) ident(VALUE) +ident(rb_mod_ge)operator(()ident(mod)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(arg)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(arg)operator(\)\)) operator({) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(compared with non class/module)delimiter(")>operator(\);) + operator(}) + + reserved(return) ident(rb_class_inherited_p)operator(()ident(arg)operator(,) ident(mod)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod > other => true, false, or nil + * + * Returns true if <i>mod</i> is an ancestor of <i>other</i>. Returns + * <code>nil</code> if there's no relationship between the two. + * (Think of the relationship in terms of the class definition: + * "class A<B" implies "B>A"\). + * + */) + +directive(static) ident(VALUE) +ident(rb_mod_gt)operator(()ident(mod)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(arg)operator(;) +operator({) + reserved(if) operator(()ident(mod) operator(==) ident(arg)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(rb_mod_ge)operator(()ident(mod)operator(,) ident(arg)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod <=> other_mod => -1, 0, +1, or nil + * + * Comparison---Returns -1 if <i>mod</i> includes <i>other_mod</i>, 0 if + * <i>mod</i> is the same as <i>other_mod</i>, and +1 if <i>mod</i> is + * included by <i>other_mod</i> or if <i>mod</i> has no relationship with + * <i>other_mod</i>. Returns <code>nil</code> if <i>other_mod</i> is + * not a module. + */) + +directive(static) ident(VALUE) +ident(rb_mod_cmp)operator(()ident(mod)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(arg)operator(;) +operator({) + ident(VALUE) ident(cmp)operator(;) + + reserved(if) operator(()ident(mod) operator(==) ident(arg)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(arg)operator(\)\)) operator({) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(return) ident(Qnil)operator(;) + operator(}) + + ident(cmp) operator(=) ident(rb_class_inherited_p)operator(()ident(mod)operator(,) ident(arg)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(cmp)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(cmp)operator(\)) operator({) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(rb_module_s_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(rb_module_s_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(mod) operator(=) ident(rb_module_new)operator((\);) + + ident(RBASIC)operator(()ident(mod)operator(\)->)ident(klass) operator(=) ident(klass)operator(;) + reserved(return) ident(mod)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(rb_class_s_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(rb_class_s_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(return) ident(rb_class_boot)operator(()integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Module.new => mod + * Module.new {|mod| block } => mod + * + * Creates a new anonymous module. If a block is given, it is passed + * the module object, and the block is evaluated in the context of this + * module using <code>module_eval</code>. + * + * Fred = Module.new do + * def meth1 + * "hello" + * end + * def meth2 + * "bye" + * end + * end + * a = "my string" + * a.extend(Fred\) #=> "my string" + * a.meth1 #=> "hello" + * a.meth2 #=> "bye" + */) + +directive(static) ident(VALUE) +ident(rb_mod_initialize)operator(()ident(module)operator(\)) + ident(VALUE) ident(module)operator(;) +operator({) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_mod_module_eval)operator(()integer(0)operator(,) integer(0)operator(,) ident(module)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * Class.new(super_class=Object\) => a_class + * + * Creates a new anonymous (unnamed\) class with the given superclass + * (or <code>Object</code> if no parameter is given\). You can give a + * class a name by assigning the class object to a constant. + * + */) + +directive(static) ident(VALUE) +ident(rb_class_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(super)operator(;) + + reserved(if) operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super) operator(!=) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(already initialized class)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(super)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(super) operator(=) ident(rb_cObject)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_check_inheritable)operator(()ident(super)operator(\);) + operator(}) + ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super) operator(=) ident(super)operator(;) + ident(rb_make_metaclass)operator(()ident(klass)operator(,) ident(RBASIC)operator(()ident(super)operator(\)->)ident(klass)operator(\);) + ident(rb_mod_initialize)operator(()ident(klass)operator(\);) + ident(rb_class_inherited)operator(()ident(super)operator(,) ident(klass)operator(\);) + + reserved(return) ident(klass)operator(;) +operator(}) + +comment(/* + * call-seq: + * class.allocate(\) => obj + * + * Allocates space for a new object of <i>class</i>'s class. The + * returned object must be an instance of <i>class</i>. + * + */) + +ident(VALUE) +ident(rb_obj_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(obj)operator(;) + + reserved(if) operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super) operator(==) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't instantiate uninitialized class)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't create instance of virtual class)delimiter(")>operator(\);) + operator(}) + ident(obj) operator(=) ident(rb_funcall)operator(()ident(klass)operator(,) ident(ID_ALLOCATOR)operator(,) integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(rb_obj_class)operator(()ident(obj)operator(\)) operator(!=) ident(rb_class_real)operator(()ident(klass)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong instance allocation)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(obj)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(rb_class_allocate_instance) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(rb_class_allocate_instance)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(obj)operator(,) reserved(struct) ident(RObject)operator(\);) + ident(OBJSETUP)operator(()ident(obj)operator(,) ident(klass)operator(,) ident(T_OBJECT)operator(\);) + reserved(return) operator(()ident(VALUE)operator(\))ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * class.new(args, ...\) => obj + * + * Calls <code>allocate</code> to create a new object of + * <i>class</i>'s class, then invokes that object's + * <code>initialize</code> method, passing it <i>args</i>. + * This is the method that ends up getting called whenever + * an object is constructed using .new. + * + */) + +ident(VALUE) +ident(rb_class_new_instance)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(obj)operator(;) + + ident(obj) operator(=) ident(rb_obj_alloc)operator(()ident(klass)operator(\);) + ident(rb_obj_call_init)operator(()ident(obj)operator(,) ident(argc)operator(,) ident(argv)operator(\);) + + reserved(return) ident(obj)operator(;) +operator(}) + +comment(/* + * call-seq: + * class.superclass -> a_super_class or nil + * + * Returns the superclass of <i>class</i>, or <code>nil</code>. + * + * File.superclass #=> IO + * IO.superclass #=> Object + * Object.superclass #=> nil + * + */) + +directive(static) ident(VALUE) +ident(rb_class_superclass)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(super) operator(=) ident(RCLASS)operator(()ident(klass)operator(\)->)ident(super)operator(;) + + reserved(if) operator((!)ident(super)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(uninitialized class)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(FL_TEST)operator(()ident(klass)operator(,) ident(FL_SINGLETON)operator(\)\)) operator({) + ident(super) operator(=) ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass)operator(;) + operator(}) + reserved(while) operator(()ident(TYPE)operator(()ident(super)operator(\)) operator(==) ident(T_ICLASS)operator(\)) operator({) + ident(super) operator(=) ident(RCLASS)operator(()ident(super)operator(\)->)ident(super)operator(;) + operator(}) + reserved(if) operator((!)ident(super)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(super)operator(;) +operator(}) + +directive(static) ident(ID) +ident(str_to_id)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(sym) operator(=) ident(rb_str_intern)operator(()ident(str)operator(\);) + + reserved(return) ident(SYM2ID)operator(()ident(sym)operator(\);) +operator(}) + +ident(ID) +ident(rb_to_id)operator(()ident(name)operator(\)) + ident(VALUE) ident(name)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + ident(ID) ident(id)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(name)operator(\)\)) operator({) + reserved(case) label(T_STRING)operator(:) + reserved(return) ident(str_to_id)operator(()ident(name)operator(\);) + reserved(case) label(T_FIXNUM)operator(:) + ident(rb_warn)operator(()string<delimiter(")content(do not use Fixnums as Symbols)delimiter(")>operator(\);) + ident(id) operator(=) ident(FIX2LONG)operator(()ident(name)operator(\);) + reserved(if) operator((!)ident(rb_id2name)operator(()ident(id)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(%ld is not a symbol)delimiter(")>operator(,) ident(id)operator(\);) + operator(}) + reserved(break)operator(;) + reserved(case) label(T_SYMBOL)operator(:) + ident(id) operator(=) ident(SYM2ID)operator(()ident(name)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(tmp) operator(=) ident(rb_check_string_type)operator(()ident(name)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(return) ident(str_to_id)operator(()ident(tmp)operator(\);) + operator(}) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s is not a symbol)delimiter(")>operator(,) ident(RSTRING)operator(()ident(rb_inspect)operator(()ident(name)operator(\)\)->)ident(ptr)operator(\);) + operator(}) + reserved(return) ident(id)operator(;) +operator(}) + +comment(/* + * call-seq: + * attr(symbol, writable=false\) => nil + * + * Defines a named attribute for this module, where the name is + * <i>symbol.</i><code>id2name</code>, creating an instance variable + * (<code>@name</code>\) and a corresponding access method to read it. + * If the optional <i>writable</i> argument is <code>true</code>, also + * creates a method called <code>name=</code> to set the attribute. + * + * module Mod + * attr :size, true + * end + * + * <em>is equivalent to:</em> + * + * module Mod + * def size + * @size + * end + * def size=(val\) + * @size = val + * end + * end + */) + +directive(static) ident(VALUE) +ident(rb_mod_attr)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(name)operator(,) ident(pub)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(name)operator(,) operator(&)ident(pub)operator(\);) + ident(rb_attr)operator(()ident(klass)operator(,) ident(rb_to_id)operator(()ident(name)operator(\),) integer(1)operator(,) ident(RTEST)operator(()ident(pub)operator(\),) ident(Qtrue)operator(\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * attr_reader(symbol, ...\) => nil + * + * Creates instance variables and corresponding methods that return the + * value of each instance variable. Equivalent to calling + * ``<code>attr</code><i>:name</i>'' on each name in turn. + */) + +directive(static) ident(VALUE) +ident(rb_mod_attr_reader)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(rb_attr)operator(()ident(klass)operator(,) ident(rb_to_id)operator(()ident(argv)operator([)ident(i)operator(]\),) integer(1)operator(,) integer(0)operator(,) ident(Qtrue)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * attr_writer(symbol, ...\) => nil + * + * Creates an accessor method to allow assignment to the attribute + * <i>aSymbol</i><code>.id2name</code>. + */) + +directive(static) ident(VALUE) +ident(rb_mod_attr_writer)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(rb_attr)operator(()ident(klass)operator(,) ident(rb_to_id)operator(()ident(argv)operator([)ident(i)operator(]\),) integer(0)operator(,) integer(1)operator(,) ident(Qtrue)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * attr_accessor(symbol, ...\) => nil + * + * Equivalent to calling ``<code>attr</code><i>symbol</i><code>, + * true</code>'' on each <i>symbol</i> in turn. + * + * module Mod + * attr_accessor(:one, :two\) + * end + * Mod.instance_methods.sort #=> ["one", "one=", "two", "two="] + */) + +directive(static) ident(VALUE) +ident(rb_mod_attr_accessor)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(rb_attr)operator(()ident(klass)operator(,) ident(rb_to_id)operator(()ident(argv)operator([)ident(i)operator(]\),) integer(1)operator(,) integer(1)operator(,) ident(Qtrue)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.const_get(sym\) => obj + * + * Returns the value of the named constant in <i>mod</i>. + * + * Math.const_get(:PI\) #=> 3.14159265358979 + */) + +directive(static) ident(VALUE) +ident(rb_mod_const_get)operator(()ident(mod)operator(,) ident(name)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(name)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(name)operator(\);) + + reserved(if) operator((!)ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(wrong constant name %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(rb_const_get)operator(()ident(mod)operator(,) ident(id)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod.const_set(sym, obj\) => obj + * + * Sets the named constant to the given object, returning that object. + * Creates a new constant if no constant with the given name previously + * existed. + * + * Math.const_set("HIGH_SCHOOL_PI", 22.0/7.0\) #=> 3.14285714285714 + * Math::HIGH_SCHOOL_PI - Math::PI #=> 0.00126448926734968 + */) + +directive(static) ident(VALUE) +ident(rb_mod_const_set)operator(()ident(mod)operator(,) ident(name)operator(,) ident(value)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(name)operator(,) ident(value)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(name)operator(\);) + + reserved(if) operator((!)ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(wrong constant name %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + ident(rb_const_set)operator(()ident(mod)operator(,) ident(id)operator(,) ident(value)operator(\);) + reserved(return) ident(value)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.const_defined?(sym\) => true or false + * + * Returns <code>true</code> if a constant with the given name is + * defined by <i>mod</i>. + * + * Math.const_defined? "PI" #=> true + */) + +directive(static) ident(VALUE) +ident(rb_mod_const_defined)operator(()ident(mod)operator(,) ident(name)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(name)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(name)operator(\);) + + reserved(if) operator((!)ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(wrong constant name %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(rb_const_defined_at)operator(()ident(mod)operator(,) ident(id)operator(\);) +operator(}) + +comment(/* + * call-seq: + * obj.methods => array + * + * Returns a list of the names of methods publicly accessible in + * <i>obj</i>. This will include all the methods accessible in + * <i>obj</i>'s ancestors. + * + * class Klass + * def kMethod(\) + * end + * end + * k = Klass.new + * k.methods[0..9] #=> ["kMethod", "freeze", "nil?", "is_a?", + * "class", "instance_variable_set", + * "methods", "extend", "__send__", "instance_eval"] + * k.methods.length #=> 42 + */) + +directive(static) ident(VALUE) +ident(rb_obj_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + label(retry)operator(:) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(VALUE) ident(args)operator([)integer(1)operator(];) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(Qtrue)operator(;) + reserved(return) ident(rb_class_instance_methods)operator(()integer(1)operator(,) ident(args)operator(,) ident(CLASS_OF)operator(()ident(obj)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(recur)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(1)delimiter(")>operator(,) operator(&)ident(recur)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(recur)operator(\)\)) operator({) + ident(argc) operator(=) integer(0)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) + reserved(return) ident(rb_obj_singleton_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * obj.protected_methods(all=true\) => array + * + * Returns the list of protected methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + */) + +directive(static) ident(VALUE) +ident(rb_obj_protected_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) comment(/* hack to stop warning */) + ident(VALUE) ident(args)operator([)integer(1)operator(];) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(Qtrue)operator(;) + reserved(return) ident(rb_class_protected_instance_methods)operator(()integer(1)operator(,) ident(args)operator(,) ident(CLASS_OF)operator(()ident(obj)operator(\)\);) + operator(}) + reserved(return) ident(rb_class_protected_instance_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(CLASS_OF)operator(()ident(obj)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * obj.private_methods(all=true\) => array + * + * Returns the list of private methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + */) + +directive(static) ident(VALUE) +ident(rb_obj_private_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) comment(/* hack to stop warning */) + ident(VALUE) ident(args)operator([)integer(1)operator(];) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(Qtrue)operator(;) + reserved(return) ident(rb_class_private_instance_methods)operator(()integer(1)operator(,) ident(args)operator(,) ident(CLASS_OF)operator(()ident(obj)operator(\)\);) + operator(}) + reserved(return) ident(rb_class_private_instance_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(CLASS_OF)operator(()ident(obj)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * obj.public_methods(all=true\) => array + * + * Returns the list of public methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + */) + +directive(static) ident(VALUE) +ident(rb_obj_public_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) comment(/* hack to stop warning */) + ident(VALUE) ident(args)operator([)integer(1)operator(];) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(Qtrue)operator(;) + reserved(return) ident(rb_class_public_instance_methods)operator(()integer(1)operator(,) ident(args)operator(,) ident(CLASS_OF)operator(()ident(obj)operator(\)\);) + operator(}) + reserved(return) ident(rb_class_public_instance_methods)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(CLASS_OF)operator(()ident(obj)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * obj.instance_variable_get(symbol\) => obj + * + * Returns the value of the given instance variable, or nil if the + * instance variable is not set. The <code>@</code> part of the + * variable name should be included for regular instance + * variables. Throws a <code>NameError</code> exception if the + * supplied symbol is not valid as an instance variable name. + * + * class Fred + * def initialize(p1, p2\) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99\) + * fred.instance_variable_get(:@a\) #=> "cat" + * fred.instance_variable_get("@b"\) #=> 99 + */) + +directive(static) ident(VALUE) +ident(rb_obj_ivar_get)operator(()ident(obj)operator(,) ident(iv)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(iv)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(iv)operator(\);) + + reserved(if) operator((!)ident(rb_is_instance_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(`%s' is not allowed as an instance variable name)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(rb_ivar_get)operator(()ident(obj)operator(,) ident(id)operator(\);) +operator(}) + +comment(/* + * call-seq: + * obj.instance_variable_set(symbol, obj\) => obj + * + * Sets the instance variable names by <i>symbol</i> to + * <i>object</i>, thereby frustrating the efforts of the class's + * author to attempt to provide proper encapsulation. The variable + * did not have to exist prior to this call. + * + * class Fred + * def initialize(p1, p2\) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99\) + * fred.instance_variable_set(:@a, 'dog'\) #=> "dog" + * fred.instance_variable_set(:@c, 'cat'\) #=> "cat" + * fred.inspect #=> "#<Fred:0x401b3da8 @a=\\"dog\\", @b=99, @c=\\"cat\\">" + */) + +directive(static) ident(VALUE) +ident(rb_obj_ivar_set)operator(()ident(obj)operator(,) ident(iv)operator(,) ident(val)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(iv)operator(,) ident(val)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(iv)operator(\);) + + reserved(if) operator((!)ident(rb_is_instance_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(`%s' is not allowed as an instance variable name)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(rb_ivar_set)operator(()ident(obj)operator(,) ident(id)operator(,) ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * obj.instance_variable_defined?(symbol\) => true or false + * + * Returns <code>true</code> if the given instance variable is + * defined in <i>obj</i>. + * + * class Fred + * def initialize(p1, p2\) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99\) + * fred.instance_variable_defined?(:@a\) #=> true + * fred.instance_variable_defined?("@b"\) #=> true + * fred.instance_variable_defined?("@c"\) #=> false + */) + +directive(static) ident(VALUE) +ident(rb_obj_ivar_defined)operator(()ident(obj)operator(,) ident(iv)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(iv)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(iv)operator(\);) + + reserved(if) operator((!)ident(rb_is_instance_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(`%s' is not allowed as an instance variable name)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(rb_ivar_defined)operator(()ident(obj)operator(,) ident(id)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod.class_variable_get(symbol\) => obj + * + * Returns the value of the given class variable (or throws a + * <code>NameError</code> exception\). The <code>@@</code> part of the + * variable name should be included for regular class variables + * + * class Fred + * @@foo = 99 + * end + * + * def Fred.foo + * class_variable_get(:@@foo\) #=> 99 + * end + */) + +directive(static) ident(VALUE) +ident(rb_mod_cvar_get)operator(()ident(obj)operator(,) ident(iv)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(iv)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(iv)operator(\);) + + reserved(if) operator((!)ident(rb_is_class_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(`%s' is not allowed as a class variable name)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(rb_cvar_get)operator(()ident(obj)operator(,) ident(id)operator(\);) +operator(}) + +comment(/* + * call-seq: + * obj.class_variable_set(symbol, obj\) => obj + * + * Sets the class variable names by <i>symbol</i> to + * <i>object</i>. + * + * class Fred + * @@foo = 99 + * def foo + * @@foo + * end + * end + * + * def Fred.foo + * class_variable_set(:@@foo, 101\) #=> 101 + * end + * Fred.foo + * Fred.new.foo #=> 101 + */) + +directive(static) ident(VALUE) +ident(rb_mod_cvar_set)operator(()ident(obj)operator(,) ident(iv)operator(,) ident(val)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(iv)operator(,) ident(val)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(iv)operator(\);) + + reserved(if) operator((!)ident(rb_is_class_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(`%s' is not allowed as a class variable name)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + ident(rb_cvar_set)operator(()ident(obj)operator(,) ident(id)operator(,) ident(val)operator(,) ident(Qfalse)operator(\);) + reserved(return) ident(val)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.class_variable_defined?(symbol\) => true or false + * + * Returns <code>true</code> if the given class variable is defined + * in <i>obj</i>. + * + * class Fred + * @@foo = 99 + * end + * Fred.class_variable_defined?(:@@foo\) #=> true + * Fred.class_variable_defined?(:@@bar\) #=> false + */) + +directive(static) ident(VALUE) +ident(rb_mod_cvar_defined)operator(()ident(obj)operator(,) ident(iv)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(iv)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(iv)operator(\);) + + reserved(if) operator((!)ident(rb_is_class_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(`%s' is not allowed as a class variable name)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(rb_cvar_defined)operator(()ident(obj)operator(,) ident(id)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(convert_type)operator(()ident(val)operator(,) ident(tname)operator(,) ident(method)operator(,) ident(raise)operator(\)) + ident(VALUE) ident(val)operator(;) + directive(const) pre_type(char) operator(*)ident(tname)operator(,) operator(*)ident(method)operator(;) + pre_type(int) ident(raise)operator(;) +operator({) + ident(ID) ident(m)operator(;) + + ident(m) operator(=) ident(rb_intern)operator(()ident(method)operator(\);) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(val)operator(,) ident(m)operator(\)\)) operator({) + reserved(if) operator(()ident(raise)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't convert %s into %s)delimiter(")>operator(,) + ident(NIL_P)operator(()ident(val)operator(\)) operator(?) string<delimiter(")content(nil)delimiter(")> operator(:) + ident(val) operator(==) ident(Qtrue) operator(?) string<delimiter(")content(true)delimiter(")> operator(:) + ident(val) operator(==) ident(Qfalse) operator(?) string<delimiter(")content(false)delimiter(")> operator(:) + ident(rb_obj_classname)operator(()ident(val)operator(\),) + ident(tname)operator(\);) + operator(}) + reserved(else) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + operator(}) + reserved(return) ident(rb_funcall)operator(()ident(val)operator(,) ident(m)operator(,) integer(0)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_convert_type)operator(()ident(val)operator(,) ident(type)operator(,) ident(tname)operator(,) ident(method)operator(\)) + ident(VALUE) ident(val)operator(;) + pre_type(int) ident(type)operator(;) + directive(const) pre_type(char) operator(*)ident(tname)operator(,) operator(*)ident(method)operator(;) +operator({) + ident(VALUE) ident(v)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(val)operator(\)) operator(==) ident(type)operator(\)) reserved(return) ident(val)operator(;) + ident(v) operator(=) ident(convert_type)operator(()ident(val)operator(,) ident(tname)operator(,) ident(method)operator(,) ident(Qtrue)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(type)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s#%s should return %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(val)operator(\),) ident(method)operator(,) ident(tname)operator(\);) + operator(}) + reserved(return) ident(v)operator(;) +operator(}) + +ident(VALUE) +ident(rb_check_convert_type)operator(()ident(val)operator(,) ident(type)operator(,) ident(tname)operator(,) ident(method)operator(\)) + ident(VALUE) ident(val)operator(;) + pre_type(int) ident(type)operator(;) + directive(const) pre_type(char) operator(*)ident(tname)operator(,) operator(*)ident(method)operator(;) +operator({) + ident(VALUE) ident(v)operator(;) + + comment(/* always convert T_DATA */) + reserved(if) operator(()ident(TYPE)operator(()ident(val)operator(\)) operator(==) ident(type) operator(&&) ident(type) operator(!=) ident(T_DATA)operator(\)) reserved(return) ident(val)operator(;) + ident(v) operator(=) ident(convert_type)operator(()ident(val)operator(,) ident(tname)operator(,) ident(method)operator(,) ident(Qfalse)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(v)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(v)operator(\)) operator(!=) ident(type)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s#%s should return %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(val)operator(\),) ident(method)operator(,) ident(tname)operator(\);) + operator(}) + reserved(return) ident(v)operator(;) +operator(}) + + +directive(static) ident(VALUE) +ident(rb_to_integer)operator(()ident(val)operator(,) ident(method)operator(\)) + ident(VALUE) ident(val)operator(;) + directive(const) pre_type(char) operator(*)ident(method)operator(;) +operator({) + ident(VALUE) ident(v) operator(=) ident(convert_type)operator(()ident(val)operator(,) string<delimiter(")content(Integer)delimiter(")>operator(,) ident(method)operator(,) ident(Qtrue)operator(\);) + reserved(if) operator((!)ident(rb_obj_is_kind_of)operator(()ident(v)operator(,) ident(rb_cInteger)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s#%s should return Integer)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(val)operator(\),) ident(method)operator(\);) + operator(}) + reserved(return) ident(v)operator(;) +operator(}) + +ident(VALUE) +ident(rb_to_int)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(return) ident(rb_to_integer)operator(()ident(val)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(\);) +operator(}) + +ident(VALUE) +ident(rb_Integer)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(val)operator(\)\)) operator({) + reserved(case) label(T_FLOAT)operator(:) + reserved(if) operator(()ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value) operator(<=) operator(()pre_type(double)operator(\))ident(FIXNUM_MAX) + operator(&&) ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value) operator(>=) operator(()pre_type(double)operator(\))ident(FIXNUM_MIN)operator(\)) operator({) + reserved(break)operator(;) + operator(}) + reserved(return) ident(rb_dbl2big)operator(()ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value)operator(\);) + + reserved(case) label(T_FIXNUM)operator(:) + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(val)operator(;) + + reserved(case) label(T_STRING)operator(:) + reserved(return) ident(rb_str_to_inum)operator(()ident(val)operator(,) integer(0)operator(,) ident(Qtrue)operator(\);) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + ident(tmp) operator(=) ident(convert_type)operator(()ident(val)operator(,) string<delimiter(")content(Integer)delimiter(")>operator(,) string<delimiter(")content(to_int)delimiter(")>operator(,) ident(Qfalse)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(return) ident(rb_to_integer)operator(()ident(val)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(tmp)operator(;) +operator(}) + +comment(/* + * call-seq: + * Integer(arg\) => integer + * + * Converts <i>arg</i> to a <code>Fixnum</code> or <code>Bignum</code>. + * Numeric types are converted directly (with floating point numbers + * being truncated\). If <i>arg</i> is a <code>String</code>, leading + * radix indicators (<code>0</code>, <code>0b</code>, and + * <code>0x</code>\) are honored. Others are converted using + * <code>to_int</code> and <code>to_i</code>. This behavior is + * different from that of <code>String#to_i</code>. + * + * Integer(123.999\) #=> 123 + * Integer("0x1a"\) #=> 26 + * Integer(Time.new\) #=> 1049896590 + */) + +directive(static) ident(VALUE) +ident(rb_f_integer)operator(()ident(obj)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(arg)operator(;) +operator({) + reserved(return) ident(rb_Integer)operator(()ident(arg)operator(\);) +operator(}) + +pre_type(double) +ident(rb_cstr_to_dbl)operator(()ident(p)operator(,) ident(badcheck)operator(\)) + directive(const) pre_type(char) operator(*)ident(p)operator(;) + pre_type(int) ident(badcheck)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(q)operator(;) + pre_type(char) operator(*)ident(end)operator(;) + pre_type(double) ident(d)operator(;) + directive(const) pre_type(char) operator(*)ident(ellipsis) operator(=) string<delimiter(")delimiter(")>operator(;) + pre_type(int) ident(w)operator(;) +preprocessor(#define) ident(OutOfRange)operator((\)) operator(((()ident(w) operator(=) ident(end) operator(-) ident(p)operator(\)) operator(>) integer(20)operator(\)) operator(?) operator(()ident(w) operator(=) integer(20)operator(,) ident(ellipsis) operator(=) string<delimiter(")content(...)delimiter(")>operator(\)) operator(:) operator(()ident(ellipsis) operator(=) string<delimiter(")delimiter(")>operator(\)\)) + + reserved(if) operator((!)ident(p)operator(\)) reserved(return) float(0)float(.0)operator(;) + ident(q) operator(=) ident(p)operator(;) + reserved(if) operator(()ident(badcheck)operator(\)) operator({) + reserved(while) operator(()ident(ISSPACE)operator((*)ident(p)operator(\)\)) ident(p)operator(++;) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(ISSPACE)operator((*)ident(p)operator(\)) operator(||) operator(*)ident(p) operator(==) char('_')operator(\)) ident(p)operator(++;) + operator(}) + ident(errno) operator(=) integer(0)operator(;) + ident(d) operator(=) ident(strtod)operator(()ident(p)operator(,) operator(&)ident(end)operator(\);) + reserved(if) operator(()ident(errno) operator(==) ident(ERANGE)operator(\)) operator({) + ident(OutOfRange)operator((\);) + ident(rb_warn)operator(()string<delimiter(")content(Float %.*s%s out of range)delimiter(")>operator(,) ident(w)operator(,) ident(p)operator(,) ident(ellipsis)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(p) operator(==) ident(end)operator(\)) operator({) + reserved(if) operator(()ident(badcheck)operator(\)) operator({) + label(bad)operator(:) + ident(rb_invalid_str)operator(()ident(q)operator(,) string<delimiter(")content(Float(\))delimiter(")>operator(\);) + operator(}) + reserved(return) ident(d)operator(;) + operator(}) + reserved(if) operator((*)ident(end)operator(\)) operator({) + pre_type(char) operator(*)ident(buf) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(strlen)operator(()ident(p)operator(\)+)integer(1)operator(\);) + pre_type(char) operator(*)ident(n) operator(=) ident(buf)operator(;) + + reserved(while) operator(()ident(p) operator(<) ident(end)operator(\)) operator(*)ident(n)operator(++) operator(=) operator(*)ident(p)operator(++;) + reserved(while) operator((*)ident(p)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('_')operator(\)) operator({) + comment(/* remove underscores between digits */) + reserved(if) operator(()ident(badcheck)operator(\)) operator({) + reserved(if) operator(()ident(n) operator(==) ident(buf) operator(||) operator(!)ident(ISDIGIT)operator(()ident(n)operator([-)integer(1)operator(]\)\)) reserved(goto) ident(bad)operator(;) + operator(++)ident(p)operator(;) + reserved(if) operator((!)ident(ISDIGIT)operator((*)ident(p)operator(\)\)) reserved(goto) ident(bad)operator(;) + operator(}) + reserved(else) operator({) + reserved(while) operator((*++)ident(p) operator(==) char('_')operator(\);) + reserved(continue)operator(;) + operator(}) + operator(}) + operator(*)ident(n)operator(++) operator(=) operator(*)ident(p)operator(++;) + operator(}) + operator(*)ident(n) operator(=) char('\\0')operator(;) + ident(p) operator(=) ident(buf)operator(;) + ident(d) operator(=) ident(strtod)operator(()ident(p)operator(,) operator(&)ident(end)operator(\);) + reserved(if) operator(()ident(errno) operator(==) ident(ERANGE)operator(\)) operator({) + ident(OutOfRange)operator((\);) + ident(rb_warn)operator(()string<delimiter(")content(Float %.*s%s out of range)delimiter(")>operator(,) ident(w)operator(,) ident(p)operator(,) ident(ellipsis)operator(\);) + ident(errno) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(badcheck)operator(\)) operator({) + reserved(if) operator((!)ident(end) operator(||) ident(p) operator(==) ident(end)operator(\)) reserved(goto) ident(bad)operator(;) + reserved(while) operator((*)ident(end) operator(&&) ident(ISSPACE)operator((*)ident(end)operator(\)\)) ident(end)operator(++;) + reserved(if) operator((*)ident(end)operator(\)) reserved(goto) ident(bad)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(errno) operator(==) ident(ERANGE)operator(\)) operator({) + ident(errno) operator(=) integer(0)operator(;) + ident(OutOfRange)operator((\);) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(Float %.*s%s out of range)delimiter(")>operator(,) ident(w)operator(,) ident(q)operator(,) ident(ellipsis)operator(\);) + operator(}) + reserved(return) ident(d)operator(;) +operator(}) + +pre_type(double) +ident(rb_str_to_dbl)operator(()ident(str)operator(,) ident(badcheck)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(int) ident(badcheck)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) + + ident(StringValue)operator(()ident(str)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(s)operator(\)) operator({) + reserved(if) operator(()ident(s)operator([)ident(len)operator(]\)) operator({) comment(/* no sentinel somehow */) + pre_type(char) operator(*)ident(p) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(len)operator(+)integer(1)operator(\);) + + ident(MEMCPY)operator(()ident(p)operator(,) ident(s)operator(,) pre_type(char)operator(,) ident(len)operator(\);) + ident(p)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) + ident(s) operator(=) ident(p)operator(;) + operator(}) + reserved(if) operator(()ident(badcheck) operator(&&) ident(len) operator(!=) ident(strlen)operator(()ident(s)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(string for Float contains null byte)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(return) ident(rb_cstr_to_dbl)operator(()ident(s)operator(,) ident(badcheck)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_Float)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(val)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + reserved(return) ident(rb_float_new)operator((()pre_type(double)operator(\))ident(FIX2LONG)operator(()ident(val)operator(\)\);) + + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(val)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(rb_big2dbl)operator(()ident(val)operator(\)\);) + + reserved(case) label(T_STRING)operator(:) + reserved(return) ident(rb_float_new)operator(()ident(rb_str_to_dbl)operator(()ident(val)operator(,) ident(Qtrue)operator(\)\);) + + reserved(case) label(T_NIL)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't convert nil into Float)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(default)operator(:) + operator({) + ident(VALUE) ident(f) operator(=) ident(rb_convert_type)operator(()ident(val)operator(,) ident(T_FLOAT)operator(,) string<delimiter(")content(Float)delimiter(")>operator(,) string<delimiter(")content(to_f)delimiter(")>operator(\);) + reserved(if) operator(()ident(isnan)operator(()ident(RFLOAT)operator(()ident(f)operator(\)->)ident(value)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(invalid value for Float(\))delimiter(")>operator(\);) + operator(}) + reserved(return) ident(f)operator(;) + operator(}) + operator(}) +operator(}) + +comment(/* + * call-seq: + * Float(arg\) => float + * + * Returns <i>arg</i> converted to a float. Numeric types are converted + * directly, the rest are converted using <i>arg</i>.to_f. As of Ruby + * 1.8, converting <code>nil</code> generates a <code>TypeError</code>. + * + * Float(1\) #=> 1.0 + * Float("123.456"\) #=> 123.456 + */) + +directive(static) ident(VALUE) +ident(rb_f_float)operator(()ident(obj)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(arg)operator(;) +operator({) + reserved(return) ident(rb_Float)operator(()ident(arg)operator(\);) +operator(}) + +pre_type(double) +ident(rb_num2dbl)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(val)operator(\)\)) operator({) + reserved(case) label(T_FLOAT)operator(:) + reserved(return) ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value)operator(;) + + reserved(case) label(T_STRING)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no implicit conversion to float from string)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_NIL)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no implicit conversion to float from nil)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + + reserved(return) ident(RFLOAT)operator(()ident(rb_Float)operator(()ident(val)operator(\)\)->)ident(value)operator(;) +operator(}) + +pre_type(char)operator(*) +ident(rb_str2cstr)operator(()ident(str)operator(,) ident(len)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(long) operator(*)ident(len)operator(;) +operator({) + ident(StringValue)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(len)operator(\)) operator(*)ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(else) reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)) operator(&&) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(!=) ident(strlen)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(string contains )char(\\\\)content(0 character)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) +operator(}) + +ident(VALUE) +ident(rb_String)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(return) ident(rb_convert_type)operator(()ident(val)operator(,) ident(T_STRING)operator(,) string<delimiter(")content(String)delimiter(")>operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\);) +operator(}) + + +comment(/* + * call-seq: + * String(arg\) => string + * + * Converts <i>arg</i> to a <code>String</code> by calling its + * <code>to_s</code> method. + * + * String(self\) #=> "main" + * String(self.class #=> "Object" + * String(123456\) #=> "123456" + */) + +directive(static) ident(VALUE) +ident(rb_f_string)operator(()ident(obj)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(arg)operator(;) +operator({) + reserved(return) ident(rb_String)operator(()ident(arg)operator(\);) +operator(}) + +comment(#if 0 +VALUE +rb_Array(val\) + VALUE val; +{ + VALUE tmp = rb_check_array_type(val\); + + if (NIL_P(tmp\)\) { + tmp = rb_check_convert_type(val, T_ARRAY, "Array", "to_a"\); + if (NIL_P(tmp\)\) { + return rb_ary_new3(1, val\); + } + } + return tmp; +} +#endif) + +comment(/* + * call-seq: + * Array(arg\) => array + * + * Returns <i>arg</i> as an <code>Array</code>. First tries to call + * <i>arg</i><code>.to_ary</code>, then <i>arg</i><code>.to_a</code>. + * If both fail, creates a single element array containing <i>arg</i> + * (unless <i>arg</i> is <code>nil</code>\). + * + * Array(1..5\) #=> [1, 2, 3, 4, 5] + */) + +directive(static) ident(VALUE) +ident(rb_f_array)operator(()ident(obj)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(arg)operator(;) +operator({) + reserved(return) ident(rb_Array)operator(()ident(arg)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(boot_defclass)operator(()ident(name)operator(,) ident(super)operator(\)) + pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(super)operator(;) +operator({) + directive(extern) ident(st_table) operator(*)ident(rb_class_tbl)operator(;) + ident(VALUE) ident(obj) operator(=) ident(rb_class_boot)operator(()ident(super)operator(\);) + ident(ID) ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + + ident(rb_name_class)operator(()ident(obj)operator(,) ident(id)operator(\);) + ident(st_add_direct)operator(()ident(rb_class_tbl)operator(,) ident(id)operator(,) ident(obj)operator(\);) + ident(rb_const_set)operator((()ident(rb_cObject) operator(?) ident(rb_cObject) operator(:) ident(obj)operator(\),) ident(id)operator(,) ident(obj)operator(\);) + reserved(return) ident(obj)operator(;) +operator(}) + +ident(VALUE) ident(ruby_top_self)operator(;) + +comment(/* + * Document-class: Class + * + * Classes in Ruby are first-class objects---each is an instance of + * class <code>Class</code>. + * + * When a new class is created (typically using <code>class Name ... + * end</code>\), an object of type <code>Class</code> is created and + * assigned to a global constant (<code>Name</code> in this case\). When + * <code>Name.new</code> is called to create a new object, the + * <code>new</code> method in <code>Class</code> is run by default. + * This can be demonstrated by overriding <code>new</code> in + * <code>Class</code>: + * + * class Class + * alias oldNew new + * def new(*args\) + * print "Creating a new ", self.name, "\\n" + * oldNew(*args\) + * end + * end + * + * + * class Name + * end + * + * + * n = Name.new + * + * <em>produces:</em> + * + * Creating a new Name + * + * Classes, modules, and objects are interrelated. In the diagram + * that follows, the vertical arrows represent inheritance, and the + * parentheses meta-classes. All metaclasses are instances + * of the class `Class'. + * + * +------------------+ + * | | + * Object---->(Object\) | + * ^ ^ ^ ^ | + * | | | | | + * | | +-----+ +---------+ | + * | | | | | + * | +-----------+ | | + * | | | | | + * +------+ | Module--->(Module\) | + * | | ^ ^ | + * OtherClass-->(OtherClass\) | | | + * | | | + * Class---->(Class\) | + * ^ | + * | | + * +----------------+ + */) + + +comment(/* + * <code>Object</code> is the parent class of all classes in Ruby. Its + * methods are therefore available to all objects unless explicitly + * overridden. + * + * <code>Object</code> mixes in the <code>Kernel</code> module, making + * the built-in kernel functions globally accessible. Although the + * instance methods of <code>Object</code> are defined by the + * <code>Kernel</code> module, we have chosen to document them here for + * clarity. + * + * In the descriptions of Object's methods, the parameter <i>symbol</i> refers + * to a symbol, which is either a quoted string or a + * <code>Symbol</code> (such as <code>:name</code>\). + */) + +directive(void) +ident(Init_Object)operator((\)) +operator({) + ident(VALUE) ident(metaclass)operator(;) + + ident(rb_cObject) operator(=) ident(boot_defclass)operator(()string<delimiter(")content(Object)delimiter(")>operator(,) integer(0)operator(\);) + ident(rb_cModule) operator(=) ident(boot_defclass)operator(()string<delimiter(")content(Module)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_cClass) operator(=) ident(boot_defclass)operator(()string<delimiter(")content(Class)delimiter(")>operator(,) ident(rb_cModule)operator(\);) + + ident(metaclass) operator(=) ident(rb_make_metaclass)operator(()ident(rb_cObject)operator(,) ident(rb_cClass)operator(\);) + ident(metaclass) operator(=) ident(rb_make_metaclass)operator(()ident(rb_cModule)operator(,) ident(metaclass)operator(\);) + ident(metaclass) operator(=) ident(rb_make_metaclass)operator(()ident(rb_cClass)operator(,) ident(metaclass)operator(\);) + + ident(rb_mKernel) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(Kernel)delimiter(")>operator(\);) + ident(rb_include_module)operator(()ident(rb_cObject)operator(,) ident(rb_mKernel)operator(\);) + ident(rb_define_alloc_func)operator(()ident(rb_cObject)operator(,) ident(rb_class_allocate_instance)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cObject)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(0)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cClass)operator(,) string<delimiter(")content(inherited)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(included)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(extended)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(method_added)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(method_removed)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(method_undefined)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(1)operator(\);) + + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(nil?)delimiter(")>operator(,) ident(rb_false)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(rb_obj_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(equal?)delimiter(")>operator(,) ident(rb_obj_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(===)delimiter(")>operator(,) ident(rb_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(=~)delimiter(")>operator(,) ident(rb_obj_pattern_match)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(rb_obj_equal)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(id)delimiter(")>operator(,) ident(rb_obj_id_obsolete)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(type)delimiter(")>operator(,) ident(rb_obj_type)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(class)delimiter(")>operator(,) ident(rb_obj_class)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(clone)delimiter(")>operator(,) ident(rb_obj_clone)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(dup)delimiter(")>operator(,) ident(rb_obj_dup)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_obj_init_copy)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(taint)delimiter(")>operator(,) ident(rb_obj_taint)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(tainted?)delimiter(")>operator(,) ident(rb_obj_tainted)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(untaint)delimiter(")>operator(,) ident(rb_obj_untaint)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(freeze)delimiter(")>operator(,) ident(rb_obj_freeze)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(frozen?)delimiter(")>operator(,) ident(rb_obj_frozen_p)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(to_a)delimiter(")>operator(,) ident(rb_any_to_a)operator(,) integer(0)operator(\);) comment(/* to be removed */) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(rb_any_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_obj_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(methods)delimiter(")>operator(,) ident(rb_obj_methods)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(singleton_methods)delimiter(")>operator(,) + ident(rb_obj_singleton_methods)operator(,) operator(-)integer(1)operator(\);) comment(/* in class.c */) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(protected_methods)delimiter(")>operator(,) + ident(rb_obj_protected_methods)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(private_methods)delimiter(")>operator(,) ident(rb_obj_private_methods)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(public_methods)delimiter(")>operator(,) ident(rb_obj_public_methods)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(instance_variables)delimiter(")>operator(,) + ident(rb_obj_instance_variables)operator(,) integer(0)operator(\);) comment(/* in variable.c */) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(instance_variable_get)delimiter(")>operator(,) ident(rb_obj_ivar_get)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(instance_variable_set)delimiter(")>operator(,) ident(rb_obj_ivar_set)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(instance_variable_defined?)delimiter(")>operator(,) ident(rb_obj_ivar_defined)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(remove_instance_variable)delimiter(")>operator(,) + ident(rb_obj_remove_instance_variable)operator(,) integer(1)operator(\);) comment(/* in variable.c */) + + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(instance_of?)delimiter(")>operator(,) ident(rb_obj_is_instance_of)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(kind_of?)delimiter(")>operator(,) ident(rb_obj_is_kind_of)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(is_a?)delimiter(")>operator(,) ident(rb_obj_is_kind_of)operator(,) integer(1)operator(\);) + + ident(rb_define_private_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(singleton_method_added)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(singleton_method_removed)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_mKernel)operator(,) string<delimiter(")content(singleton_method_undefined)delimiter(")>operator(,) ident(rb_obj_dummy)operator(,) integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(sprintf)delimiter(")>operator(,) ident(rb_f_sprintf)operator(,) operator(-)integer(1)operator(\);) comment(/* in sprintf.c */) + ident(rb_define_global_function)operator(()string<delimiter(")content(format)delimiter(")>operator(,) ident(rb_f_sprintf)operator(,) operator(-)integer(1)operator(\);) comment(/* in sprintf.c */) + + ident(rb_define_global_function)operator(()string<delimiter(")content(Integer)delimiter(")>operator(,) ident(rb_f_integer)operator(,) integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(Float)delimiter(")>operator(,) ident(rb_f_float)operator(,) integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(String)delimiter(")>operator(,) ident(rb_f_string)operator(,) integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(Array)delimiter(")>operator(,) ident(rb_f_array)operator(,) integer(1)operator(\);) + + ident(rb_cNilClass) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(NilClass)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNilClass)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) ident(nil_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNilClass)operator(,) string<delimiter(")content(to_f)delimiter(")>operator(,) ident(nil_to_f)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNilClass)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(nil_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNilClass)operator(,) string<delimiter(")content(to_a)delimiter(")>operator(,) ident(nil_to_a)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNilClass)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(nil_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNilClass)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) ident(false_and)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNilClass)operator(,) string<delimiter(")content(|)delimiter(")>operator(,) ident(false_or)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cNilClass)operator(,) string<delimiter(")content(^)delimiter(")>operator(,) ident(false_xor)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cNilClass)operator(,) string<delimiter(")content(nil?)delimiter(")>operator(,) ident(rb_true)operator(,) integer(0)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cNilClass)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cNilClass)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(NIL)delimiter(")>operator(,) ident(Qnil)operator(\);) + + ident(rb_cSymbol) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Symbol)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cSymbol)operator(,) string<delimiter(")content(all_symbols)delimiter(")>operator(,) + ident(rb_sym_all_symbols)operator(,) integer(0)operator(\);) comment(/* in parse.y */) + ident(rb_undef_alloc_func)operator(()ident(rb_cSymbol)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cSymbol)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + + ident(rb_define_method)operator(()ident(rb_cSymbol)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) ident(sym_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cSymbol)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(,) ident(sym_to_int)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cSymbol)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(sym_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cSymbol)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(sym_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cSymbol)operator(,) string<delimiter(")content(id2name)delimiter(")>operator(,) ident(sym_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cSymbol)operator(,) string<delimiter(")content(to_sym)delimiter(")>operator(,) ident(sym_to_sym)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cSymbol)operator(,) string<delimiter(")content(===)delimiter(")>operator(,) ident(rb_obj_equal)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(freeze)delimiter(")>operator(,) ident(rb_mod_freeze)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(===)delimiter(")>operator(,) ident(rb_mod_eqq)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(rb_obj_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(rb_mod_cmp)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(rb_mod_lt)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(<=)delimiter(")>operator(,) ident(rb_class_inherited_p)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(rb_mod_gt)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(>=)delimiter(")>operator(,) ident(rb_mod_ge)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_mod_init_copy)operator(,) integer(1)operator(\);) comment(/* in class.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(rb_mod_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(included_modules)delimiter(")>operator(,) + ident(rb_mod_included_modules)operator(,) integer(0)operator(\);) comment(/* in class.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(include?)delimiter(")>operator(,) ident(rb_mod_include_p)operator(,) integer(1)operator(\);) comment(/* in class.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(name)delimiter(")>operator(,) ident(rb_mod_name)operator(,) integer(0)operator(\);) comment(/* in variable.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(ancestors)delimiter(")>operator(,) ident(rb_mod_ancestors)operator(,) integer(0)operator(\);) comment(/* in class.c */) + + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(attr)delimiter(")>operator(,) ident(rb_mod_attr)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(attr_reader)delimiter(")>operator(,) ident(rb_mod_attr_reader)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(attr_writer)delimiter(")>operator(,) ident(rb_mod_attr_writer)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(attr_accessor)delimiter(")>operator(,) ident(rb_mod_attr_accessor)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_alloc_func)operator(()ident(rb_cModule)operator(,) ident(rb_module_s_alloc)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_mod_initialize)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(instance_methods)delimiter(")>operator(,) + ident(rb_class_instance_methods)operator(,) operator(-)integer(1)operator(\);) comment(/* in class.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(public_instance_methods)delimiter(")>operator(,) + ident(rb_class_public_instance_methods)operator(,) operator(-)integer(1)operator(\);) comment(/* in class.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(protected_instance_methods)delimiter(")>operator(,) + ident(rb_class_protected_instance_methods)operator(,) operator(-)integer(1)operator(\);) comment(/* in class.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(private_instance_methods)delimiter(")>operator(,) + ident(rb_class_private_instance_methods)operator(,) operator(-)integer(1)operator(\);) comment(/* in class.c */) + + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(class_variable_defined?)delimiter(")>operator(,) ident(rb_mod_cvar_defined)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(constants)delimiter(")>operator(,) ident(rb_mod_constants)operator(,) integer(0)operator(\);) comment(/* in variable.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(const_get)delimiter(")>operator(,) ident(rb_mod_const_get)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(const_set)delimiter(")>operator(,) ident(rb_mod_const_set)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(const_defined?)delimiter(")>operator(,) ident(rb_mod_const_defined)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(remove_const)delimiter(")>operator(,) + ident(rb_mod_remove_const)operator(,) integer(1)operator(\);) comment(/* in variable.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(const_missing)delimiter(")>operator(,) + ident(rb_mod_const_missing)operator(,) integer(1)operator(\);) comment(/* in variable.c */) + ident(rb_define_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(class_variables)delimiter(")>operator(,) + ident(rb_mod_class_variables)operator(,) integer(0)operator(\);) comment(/* in variable.c */) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(remove_class_variable)delimiter(")>operator(,) + ident(rb_mod_remove_cvar)operator(,) integer(1)operator(\);) comment(/* in variable.c */) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(class_variable_get)delimiter(")>operator(,) ident(rb_mod_cvar_get)operator(,) integer(1)operator(\);) + ident(rb_define_private_method)operator(()ident(rb_cModule)operator(,) string<delimiter(")content(class_variable_set)delimiter(")>operator(,) ident(rb_mod_cvar_set)operator(,) integer(2)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cClass)operator(,) string<delimiter(")content(allocate)delimiter(")>operator(,) ident(rb_obj_alloc)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cClass)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(rb_class_new_instance)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cClass)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_class_initialize)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cClass)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_class_init_copy)operator(,) integer(1)operator(\);) comment(/* in class.c */) + ident(rb_define_method)operator(()ident(rb_cClass)operator(,) string<delimiter(")content(superclass)delimiter(")>operator(,) ident(rb_class_superclass)operator(,) integer(0)operator(\);) + ident(rb_define_alloc_func)operator(()ident(rb_cClass)operator(,) ident(rb_class_s_alloc)operator(\);) + ident(rb_undef_method)operator(()ident(rb_cClass)operator(,) string<delimiter(")content(extend_object)delimiter(")>operator(\);) + ident(rb_undef_method)operator(()ident(rb_cClass)operator(,) string<delimiter(")content(append_features)delimiter(")>operator(\);) + + ident(rb_cData) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Data)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cData)operator(\);) + + ident(rb_global_variable)operator((&)ident(ruby_top_self)operator(\);) + ident(ruby_top_self) operator(=) ident(rb_obj_alloc)operator(()ident(rb_cObject)operator(\);) + ident(rb_define_singleton_method)operator(()ident(ruby_top_self)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(main_to_s)operator(,) integer(0)operator(\);) + + ident(rb_cTrueClass) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(TrueClass)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTrueClass)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(true_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTrueClass)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) ident(true_and)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTrueClass)operator(,) string<delimiter(")content(|)delimiter(")>operator(,) ident(true_or)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTrueClass)operator(,) string<delimiter(")content(^)delimiter(")>operator(,) ident(true_xor)operator(,) integer(1)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cTrueClass)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cTrueClass)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(TRUE)delimiter(")>operator(,) ident(Qtrue)operator(\);) + + ident(rb_cFalseClass) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(FalseClass)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFalseClass)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(false_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFalseClass)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) ident(false_and)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFalseClass)operator(,) string<delimiter(")content(|)delimiter(")>operator(,) ident(false_or)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cFalseClass)operator(,) string<delimiter(")content(^)delimiter(")>operator(,) ident(false_xor)operator(,) integer(1)operator(\);) + ident(rb_undef_alloc_func)operator(()ident(rb_cFalseClass)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cFalseClass)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(FALSE)delimiter(")>operator(,) ident(Qfalse)operator(\);) + + ident(id_eq) operator(=) ident(rb_intern)operator(()string<delimiter(")content(==)delimiter(")>operator(\);) + ident(id_eql) operator(=) ident(rb_intern)operator(()string<delimiter(")content(eql?)delimiter(")>operator(\);) + ident(id_inspect) operator(=) ident(rb_intern)operator(()string<delimiter(")content(inspect)delimiter(")>operator(\);) + ident(id_init_copy) operator(=) ident(rb_intern)operator(()string<delimiter(")content(initialize_copy)delimiter(")>operator(\);) +operator(}) +comment(/********************************************************************** + + pack.c - + + $Author: shyouhei $ + $Date: 2009-02-19 10:01:35 +0100 (Thu, 19 Feb 2009\) $ + created at: Thu Feb 10 15:17:05 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<ctype.h>) + +preprocessor(#define) ident(SIZE16) integer(2) +preprocessor(#define) ident(SIZE32) integer(4) + +preprocessor(#if) ident(SIZEOF_SHORT) operator(!=) integer(2) operator(||) ident(SIZEOF_LONG) operator(!=) integer(4) +preprocessor(# define) ident(NATINT_PACK) +preprocessor(#endif) + +preprocessor(#ifdef) ident(NATINT_PACK) +preprocessor(# define) ident(OFF16B)operator(()ident(p)operator(\)) operator((()pre_type(char)operator(*\)()ident(p)operator(\)) operator(+) operator(()ident(natint)operator(?)integer(0)operator(:()reserved(sizeof)operator(()pre_type(short)operator(\)) operator(-) ident(SIZE16)operator(\)\)\)) +preprocessor(# define) ident(OFF32B)operator(()ident(p)operator(\)) operator((()pre_type(char)operator(*\)()ident(p)operator(\)) operator(+) operator(()ident(natint)operator(?)integer(0)operator(:()reserved(sizeof)operator(()pre_type(long)operator(\)) operator(-) ident(SIZE32)operator(\)\)\)) +preprocessor(# define) ident(NATINT_LEN)operator(()ident(type)operator(,)ident(len)operator(\)) operator(()ident(natint)operator(?)reserved(sizeof)operator(()ident(type)operator(\):()ident(len)operator(\)\)) +preprocessor(# ifdef) ident(WORDS_BIGENDIAN) +preprocessor(# define) ident(OFF16)operator(()ident(p)operator(\)) ident(OFF16B)operator(()ident(p)operator(\)) +preprocessor(# define) ident(OFF32)operator(()ident(p)operator(\)) ident(OFF32B)operator(()ident(p)operator(\)) +preprocessor(# endif) +preprocessor(# define) ident(NATINT_HTOVS)operator(()ident(x)operator(\)) operator(()ident(natint)operator(?)ident(htovs)operator(()ident(x)operator(\):)ident(htov16)operator(()ident(x)operator(\)\)) +preprocessor(# define) ident(NATINT_HTOVL)operator(()ident(x)operator(\)) operator(()ident(natint)operator(?)ident(htovl)operator(()ident(x)operator(\):)ident(htov32)operator(()ident(x)operator(\)\)) +preprocessor(# define) ident(NATINT_HTONS)operator(()ident(x)operator(\)) operator(()ident(natint)operator(?)ident(htons)operator(()ident(x)operator(\):)ident(hton16)operator(()ident(x)operator(\)\)) +preprocessor(# define) ident(NATINT_HTONL)operator(()ident(x)operator(\)) operator(()ident(natint)operator(?)ident(htonl)operator(()ident(x)operator(\):)ident(hton32)operator(()ident(x)operator(\)\)) +preprocessor(#else) +preprocessor(# define) ident(NATINT_LEN)operator(()ident(type)operator(,)ident(len)operator(\)) reserved(sizeof)operator(()ident(type)operator(\)) +preprocessor(# define) ident(NATINT_HTOVS)operator(()ident(x)operator(\)) ident(htovs)operator(()ident(x)operator(\)) +preprocessor(# define) ident(NATINT_HTOVL)operator(()ident(x)operator(\)) ident(htovl)operator(()ident(x)operator(\)) +preprocessor(# define) ident(NATINT_HTONS)operator(()ident(x)operator(\)) ident(htons)operator(()ident(x)operator(\)) +preprocessor(# define) ident(NATINT_HTONL)operator(()ident(x)operator(\)) ident(htonl)operator(()ident(x)operator(\)) +preprocessor(#endif) + +preprocessor(#ifndef) ident(OFF16) +preprocessor(# define) ident(OFF16)operator(()ident(p)operator(\)) operator(()pre_type(char)operator(*\)()ident(p)operator(\)) +preprocessor(# define) ident(OFF32)operator(()ident(p)operator(\)) operator(()pre_type(char)operator(*\)()ident(p)operator(\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(OFF16B) +preprocessor(# define) ident(OFF16B)operator(()ident(p)operator(\)) operator(()pre_type(char)operator(*\)()ident(p)operator(\)) +preprocessor(# define) ident(OFF32B)operator(()ident(p)operator(\)) operator(()pre_type(char)operator(*\)()ident(p)operator(\)) +preprocessor(#endif) + +preprocessor(#define) ident(define_swapx)operator(()ident(x)operator(,) ident(xtype)operator(\)) \ +directive(static) ident(xtype) \ +ident(TOKEN_PASTE)operator(()ident(swap)operator(,)ident(x)operator(\)()ident(z)operator(\)) \ + ident(xtype) ident(z)operator(;) \ +operator({) \ + ident(xtype) ident(r)operator(;) \ + ident(xtype) operator(*)ident(zp)operator(;) \ + pre_type(unsigned) pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(t)operator(;) \ + pre_type(int) ident(i)operator(;) \ + \ + ident(zp) operator(=) ident(xmalloc)operator(()reserved(sizeof)operator(()ident(xtype)operator(\)\);) \ + operator(*)ident(zp) operator(=) ident(z)operator(;) \ + ident(s) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(zp)operator(;) \ + ident(t) operator(=) ident(xmalloc)operator(()reserved(sizeof)operator(()ident(xtype)operator(\)\);) \ + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)reserved(sizeof)operator(()ident(xtype)operator(\);) ident(i)operator(++\)) operator({) \ + ident(t)operator([)reserved(sizeof)operator(()ident(xtype)operator(\)-)ident(i)operator(-)integer(1)operator(]) operator(=) ident(s)operator([)ident(i)operator(];) \ + operator(}) \ + ident(r) operator(=) operator(*()ident(xtype) operator(*\))ident(t)operator(;) \ + ident(free)operator(()ident(t)operator(\);) \ + ident(free)operator(()ident(zp)operator(\);) \ + reserved(return) ident(r)operator(;) \ +operator(}) + +preprocessor(#ifndef) ident(swap16) +preprocessor(#define) ident(swap16)operator(()ident(x)operator(\)) operator((((()ident(x)operator(\)&)hex(0xFF)operator(\)<<)integer(8)operator(\)) operator(|) operator(((()ident(x)operator(\)>>)integer(8)operator(\)&)hex(0xFF)operator(\)\)) +preprocessor(#endif) +preprocessor(#if) ident(SIZEOF_SHORT) operator(==) integer(2) +preprocessor(#define) ident(swaps)operator(()ident(x)operator(\)) ident(swap16)operator(()ident(x)operator(\)) +preprocessor(#else) +preprocessor(#if) ident(SIZEOF_SHORT) operator(==) integer(4) +preprocessor(#define) ident(swaps)operator(()ident(x)operator(\)) operator((((()ident(x)operator(\)&)hex(0xFF)operator(\)<<)integer(24)operator(\)) \ + operator(|((()ident(x)operator(\)>>)integer(24)operator(\)&)hex(0xFF)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x0000FF00)operator(\)<<)integer(8)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x00FF0000)operator(\)>>)integer(8)operator(\)) operator(\)) +preprocessor(#else) +ident(define_swapx)operator(()ident(s)operator(,)pre_type(short)operator(\)) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#ifndef) ident(swap32) +preprocessor(#define) ident(swap32)operator(()ident(x)operator(\)) operator((((()ident(x)operator(\)&)hex(0xFF)operator(\)<<)integer(24)operator(\)) \ + operator(|((()ident(x)operator(\)>>)integer(24)operator(\)&)hex(0xFF)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x0000FF00)operator(\)<<)integer(8)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x00FF0000)operator(\)>>)integer(8)operator(\)) operator(\)) +preprocessor(#endif) +preprocessor(#if) ident(SIZEOF_LONG) operator(==) integer(4) +preprocessor(#define) ident(swapl)operator(()ident(x)operator(\)) ident(swap32)operator(()ident(x)operator(\)) +preprocessor(#else) +preprocessor(#if) ident(SIZEOF_LONG) operator(==) integer(8) +preprocessor(#define) ident(swapl)operator(()ident(x)operator(\)) operator((((()ident(x)operator(\)&)hex(0x00000000000000FF)operator(\)<<)integer(56)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0xFF00000000000000)operator(\)>>)integer(56)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x000000000000FF00)operator(\)<<)integer(40)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x00FF000000000000)operator(\)>>)integer(40)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x0000000000FF0000)operator(\)<<)integer(24)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x0000FF0000000000)operator(\)>>)integer(24)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x00000000FF000000)operator(\)<<)integer(8)operator(\)) \ + operator(|((()ident(x)operator(\)&)hex(0x000000FF00000000)operator(\)>>)integer(8)operator(\)\)) +preprocessor(#else) +ident(define_swapx)operator(()ident(l)operator(,)pre_type(long)operator(\)) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#if) ident(SIZEOF_FLOAT) operator(==) integer(4) +preprocessor(#if) ident(SIZEOF_LONG) operator(==) integer(4) comment(/* SIZEOF_FLOAT == 4 == SIZEOF_LONG */) +preprocessor(#define) ident(swapf)operator(()ident(x)operator(\)) ident(swapl)operator(()ident(x)operator(\)) +preprocessor(#define) ident(FLOAT_SWAPPER) pre_type(unsigned) pre_type(long) +preprocessor(#else) +preprocessor(#if) ident(SIZEOF_SHORT) operator(==) integer(4) comment(/* SIZEOF_FLOAT == 4 == SIZEOF_SHORT */) +preprocessor(#define) ident(swapf)operator(()ident(x)operator(\)) ident(swaps)operator(()ident(x)operator(\)) +preprocessor(#define) ident(FLOAT_SWAPPER) pre_type(unsigned) pre_type(short) +preprocessor(#else) comment(/* SIZEOF_FLOAT == 4 but undivide by known size of int */) +ident(define_swapx)operator(()ident(f)operator(,)pre_type(float)operator(\)) +preprocessor(#endif) comment(/* #if SIZEOF_SHORT == 4 */) +preprocessor(#endif) comment(/* #if SIZEOF_LONG == 4 */) +preprocessor(#else) comment(/* SIZEOF_FLOAT != 4 */) +ident(define_swapx)operator(()ident(f)operator(,)pre_type(float)operator(\)) +preprocessor(#endif) comment(/* #if SIZEOF_FLOAT == 4 */) + +preprocessor(#if) ident(SIZEOF_DOUBLE) operator(==) integer(8) +preprocessor(#if) ident(SIZEOF_LONG) operator(==) integer(8) comment(/* SIZEOF_DOUBLE == 8 == SIZEOF_LONG */) +preprocessor(#define) ident(swapd)operator(()ident(x)operator(\)) ident(swapl)operator(()ident(x)operator(\)) +preprocessor(#define) ident(DOUBLE_SWAPPER) pre_type(unsigned) pre_type(long) +preprocessor(#else) +preprocessor(#if) ident(SIZEOF_LONG) operator(==) integer(4) comment(/* SIZEOF_DOUBLE == 8 && 4 == SIZEOF_LONG */) +directive(static) pre_type(double) +ident(swapd)operator(()ident(d)operator(\)) + directive(const) pre_type(double) ident(d)operator(;) +operator({) + pre_type(double) ident(dtmp) operator(=) ident(d)operator(;) + pre_type(unsigned) pre_type(long) ident(utmp)operator([)integer(2)operator(];) + pre_type(unsigned) pre_type(long) ident(utmp0)operator(;) + + ident(utmp)operator([)integer(0)operator(]) operator(=) integer(0)operator(;) ident(utmp)operator([)integer(1)operator(]) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(utmp)operator(,&)ident(dtmp)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\);) + ident(utmp0) operator(=) ident(utmp)operator([)integer(0)operator(];) + ident(utmp)operator([)integer(0)operator(]) operator(=) ident(swapl)operator(()ident(utmp)operator([)integer(1)operator(]\);) + ident(utmp)operator([)integer(1)operator(]) operator(=) ident(swapl)operator(()ident(utmp0)operator(\);) + ident(memcpy)operator((&)ident(dtmp)operator(,)ident(utmp)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\);) + reserved(return) ident(dtmp)operator(;) +operator(}) +preprocessor(#else) +preprocessor(#if) ident(SIZEOF_SHORT) operator(==) integer(4) comment(/* SIZEOF_DOUBLE == 8 && 4 == SIZEOF_SHORT */) +directive(static) pre_type(double) +ident(swapd)operator(()ident(d)operator(\)) + directive(const) pre_type(double) ident(d)operator(;) +operator({) + pre_type(double) ident(dtmp) operator(=) ident(d)operator(;) + pre_type(unsigned) pre_type(short) ident(utmp)operator([)integer(2)operator(];) + pre_type(unsigned) pre_type(short) ident(utmp0)operator(;) + + ident(utmp)operator([)integer(0)operator(]) operator(=) integer(0)operator(;) ident(utmp)operator([)integer(1)operator(]) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(utmp)operator(,&)ident(dtmp)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\);) + ident(utmp0) operator(=) ident(utmp)operator([)integer(0)operator(];) + ident(utmp)operator([)integer(0)operator(]) operator(=) ident(swaps)operator(()ident(utmp)operator([)integer(1)operator(]\);) + ident(utmp)operator([)integer(1)operator(]) operator(=) ident(swaps)operator(()ident(utmp0)operator(\);) + ident(memcpy)operator((&)ident(dtmp)operator(,)ident(utmp)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\);) + reserved(return) ident(dtmp)operator(;) +operator(}) +preprocessor(#else) comment(/* SIZEOF_DOUBLE == 8 but undivied by known size of int */) +ident(define_swapx)operator(()ident(d)operator(,) pre_type(double)operator(\)) +preprocessor(#endif) comment(/* #if SIZEOF_SHORT == 4 */) +preprocessor(#endif) comment(/* #if SIZEOF_LONG == 4 */) +preprocessor(#endif) comment(/* #if SIZEOF_LONG == 8 */) +preprocessor(#else) comment(/* SIZEOF_DOUBLE != 8 */) +ident(define_swapx)operator(()ident(d)operator(,) pre_type(double)operator(\)) +preprocessor(#endif) comment(/* #if SIZEOF_DOUBLE == 8 */) + +preprocessor(#undef) ident(define_swapx) + +preprocessor(#ifdef) ident(DYNAMIC_ENDIAN) +preprocessor(#ifdef) ident(ntohs) +preprocessor(#undef) ident(ntohs) +preprocessor(#undef) ident(ntohl) +preprocessor(#undef) ident(htons) +preprocessor(#undef) ident(htonl) +preprocessor(#endif) +directive(static) pre_type(int) +ident(endian)operator((\)) +operator({) + directive(static) pre_type(int) ident(init) operator(=) integer(0)operator(;) + directive(static) pre_type(int) ident(endian_value)operator(;) + pre_type(char) operator(*)ident(p)operator(;) + + reserved(if) operator(()ident(init)operator(\)) reserved(return) ident(endian_value)operator(;) + ident(init) operator(=) integer(1)operator(;) + ident(p) operator(=) operator(()pre_type(char)operator(*\)&)ident(init)operator(;) + reserved(return) ident(endian_value) operator(=) ident(p)operator([)integer(0)operator(]?)integer(0)operator(:)integer(1)operator(;) +operator(}) + +preprocessor(#define) ident(ntohs)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swaps)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(ntohl)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swapl)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(ntohf)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swapf)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(ntohd)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swapd)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(htons)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swaps)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(htonl)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swapl)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(htonf)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swapf)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(htond)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swapd)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(htovs)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swaps)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(#define) ident(htovl)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swapl)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(#define) ident(htovf)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swapf)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(#define) ident(htovd)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swapd)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(#define) ident(vtohs)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swaps)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(#define) ident(vtohl)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swapl)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(#define) ident(vtohf)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swapf)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(#define) ident(vtohd)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swapd)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(# ifdef) ident(NATINT_PACK) +preprocessor(#define) ident(htov16)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swap16)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(#define) ident(htov32)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?)ident(swap32)operator(()ident(x)operator(\):()ident(x)operator(\)\)) +preprocessor(#define) ident(hton16)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swap16)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(hton32)operator(()ident(x)operator(\)) operator(()ident(endian)operator((\)?()ident(x)operator(\):)ident(swap32)operator(()ident(x)operator(\)\)) +preprocessor(# endif) +preprocessor(#else) +preprocessor(#ifdef) ident(WORDS_BIGENDIAN) +preprocessor(#ifndef) ident(ntohs) +preprocessor(#define) ident(ntohs)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(ntohl)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(htons)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(htonl)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#endif) +preprocessor(#define) ident(ntohf)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(ntohd)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(htonf)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(htond)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(htovs)operator(()ident(x)operator(\)) ident(swaps)operator(()ident(x)operator(\)) +preprocessor(#define) ident(htovl)operator(()ident(x)operator(\)) ident(swapl)operator(()ident(x)operator(\)) +preprocessor(#define) ident(htovf)operator(()ident(x)operator(\)) ident(swapf)operator(()ident(x)operator(\)) +preprocessor(#define) ident(htovd)operator(()ident(x)operator(\)) ident(swapd)operator(()ident(x)operator(\)) +preprocessor(#define) ident(vtohs)operator(()ident(x)operator(\)) ident(swaps)operator(()ident(x)operator(\)) +preprocessor(#define) ident(vtohl)operator(()ident(x)operator(\)) ident(swapl)operator(()ident(x)operator(\)) +preprocessor(#define) ident(vtohf)operator(()ident(x)operator(\)) ident(swapf)operator(()ident(x)operator(\)) +preprocessor(#define) ident(vtohd)operator(()ident(x)operator(\)) ident(swapd)operator(()ident(x)operator(\)) +preprocessor(# ifdef) ident(NATINT_PACK) +preprocessor(#define) ident(htov16)operator(()ident(x)operator(\)) ident(swap16)operator(()ident(x)operator(\)) +preprocessor(#define) ident(htov32)operator(()ident(x)operator(\)) ident(swap32)operator(()ident(x)operator(\)) +preprocessor(#define) ident(hton16)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(hton32)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(# endif) +preprocessor(#else) comment(/* LITTLE ENDIAN */) +preprocessor(#ifdef) ident(ntohs) +preprocessor(#undef) ident(ntohs) +preprocessor(#undef) ident(ntohl) +preprocessor(#undef) ident(htons) +preprocessor(#undef) ident(htonl) +preprocessor(#endif) +preprocessor(#define) ident(ntohs)operator(()ident(x)operator(\)) ident(swaps)operator(()ident(x)operator(\)) +preprocessor(#define) ident(ntohl)operator(()ident(x)operator(\)) ident(swapl)operator(()ident(x)operator(\)) +preprocessor(#define) ident(htons)operator(()ident(x)operator(\)) ident(swaps)operator(()ident(x)operator(\)) +preprocessor(#define) ident(htonl)operator(()ident(x)operator(\)) ident(swapl)operator(()ident(x)operator(\)) +preprocessor(#define) ident(ntohf)operator(()ident(x)operator(\)) ident(swapf)operator(()ident(x)operator(\)) +preprocessor(#define) ident(ntohd)operator(()ident(x)operator(\)) ident(swapd)operator(()ident(x)operator(\)) +preprocessor(#define) ident(htonf)operator(()ident(x)operator(\)) ident(swapf)operator(()ident(x)operator(\)) +preprocessor(#define) ident(htond)operator(()ident(x)operator(\)) ident(swapd)operator(()ident(x)operator(\)) +preprocessor(#define) ident(htovs)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(htovl)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(htovf)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(htovd)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(vtohs)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(vtohl)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(vtohf)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(vtohd)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(# ifdef) ident(NATINT_PACK) +preprocessor(#define) ident(htov16)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(htov32)operator(()ident(x)operator(\)) operator(()ident(x)operator(\)) +preprocessor(#define) ident(hton16)operator(()ident(x)operator(\)) ident(swap16)operator(()ident(x)operator(\)) +preprocessor(#define) ident(hton32)operator(()ident(x)operator(\)) ident(swap32)operator(()ident(x)operator(\)) +preprocessor(# endif) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#ifdef) ident(FLOAT_SWAPPER) +preprocessor(#define) ident(FLOAT_CONVWITH)operator(()ident(y)operator(\)) ident(FLOAT_SWAPPER) ident(y)operator(;) +preprocessor(#define) ident(HTONF)operator(()ident(x)operator(,)ident(y)operator(\)) operator(()ident(memcpy)operator((&)ident(y)operator(,&)ident(x)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\),) \ + ident(y) operator(=) ident(htonf)operator((()ident(FLOAT_SWAPPER)operator(\))ident(y)operator(\),) \ + ident(memcpy)operator((&)ident(x)operator(,&)ident(y)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\),) \ + ident(x)operator(\)) +preprocessor(#define) ident(HTOVF)operator(()ident(x)operator(,)ident(y)operator(\)) operator(()ident(memcpy)operator((&)ident(y)operator(,&)ident(x)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\),) \ + ident(y) operator(=) ident(htovf)operator((()ident(FLOAT_SWAPPER)operator(\))ident(y)operator(\),) \ + ident(memcpy)operator((&)ident(x)operator(,&)ident(y)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\),) \ + ident(x)operator(\)) +preprocessor(#define) ident(NTOHF)operator(()ident(x)operator(,)ident(y)operator(\)) operator(()ident(memcpy)operator((&)ident(y)operator(,&)ident(x)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\),) \ + ident(y) operator(=) ident(ntohf)operator((()ident(FLOAT_SWAPPER)operator(\))ident(y)operator(\),) \ + ident(memcpy)operator((&)ident(x)operator(,&)ident(y)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\),) \ + ident(x)operator(\)) +preprocessor(#define) ident(VTOHF)operator(()ident(x)operator(,)ident(y)operator(\)) operator(()ident(memcpy)operator((&)ident(y)operator(,&)ident(x)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\),) \ + ident(y) operator(=) ident(vtohf)operator((()ident(FLOAT_SWAPPER)operator(\))ident(y)operator(\),) \ + ident(memcpy)operator((&)ident(x)operator(,&)ident(y)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\),) \ + ident(x)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(FLOAT_CONVWITH)operator(()ident(y)operator(\)) +preprocessor(#define) ident(HTONF)operator(()ident(x)operator(,)ident(y)operator(\)) ident(htonf)operator(()ident(x)operator(\)) +preprocessor(#define) ident(HTOVF)operator(()ident(x)operator(,)ident(y)operator(\)) ident(htovf)operator(()ident(x)operator(\)) +preprocessor(#define) ident(NTOHF)operator(()ident(x)operator(,)ident(y)operator(\)) ident(ntohf)operator(()ident(x)operator(\)) +preprocessor(#define) ident(VTOHF)operator(()ident(x)operator(,)ident(y)operator(\)) ident(vtohf)operator(()ident(x)operator(\)) +preprocessor(#endif) + +preprocessor(#ifdef) ident(DOUBLE_SWAPPER) +preprocessor(#define) ident(DOUBLE_CONVWITH)operator(()ident(y)operator(\)) ident(DOUBLE_SWAPPER) ident(y)operator(;) +preprocessor(#define) ident(HTOND)operator(()ident(x)operator(,)ident(y)operator(\)) operator(()ident(memcpy)operator((&)ident(y)operator(,&)ident(x)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\),) \ + ident(y) operator(=) ident(htond)operator((()ident(DOUBLE_SWAPPER)operator(\))ident(y)operator(\),) \ + ident(memcpy)operator((&)ident(x)operator(,&)ident(y)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\),) \ + ident(x)operator(\)) +preprocessor(#define) ident(HTOVD)operator(()ident(x)operator(,)ident(y)operator(\)) operator(()ident(memcpy)operator((&)ident(y)operator(,&)ident(x)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\),) \ + ident(y) operator(=) ident(htovd)operator((()ident(DOUBLE_SWAPPER)operator(\))ident(y)operator(\),) \ + ident(memcpy)operator((&)ident(x)operator(,&)ident(y)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\),) \ + ident(x)operator(\)) +preprocessor(#define) ident(NTOHD)operator(()ident(x)operator(,)ident(y)operator(\)) operator(()ident(memcpy)operator((&)ident(y)operator(,&)ident(x)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\),) \ + ident(y) operator(=) ident(ntohd)operator((()ident(DOUBLE_SWAPPER)operator(\))ident(y)operator(\),) \ + ident(memcpy)operator((&)ident(x)operator(,&)ident(y)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\),) \ + ident(x)operator(\)) +preprocessor(#define) ident(VTOHD)operator(()ident(x)operator(,)ident(y)operator(\)) operator(()ident(memcpy)operator((&)ident(y)operator(,&)ident(x)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\),) \ + ident(y) operator(=) ident(vtohd)operator((()ident(DOUBLE_SWAPPER)operator(\))ident(y)operator(\),) \ + ident(memcpy)operator((&)ident(x)operator(,&)ident(y)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\),) \ + ident(x)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(DOUBLE_CONVWITH)operator(()ident(y)operator(\)) +preprocessor(#define) ident(HTOND)operator(()ident(x)operator(,)ident(y)operator(\)) ident(htond)operator(()ident(x)operator(\)) +preprocessor(#define) ident(HTOVD)operator(()ident(x)operator(,)ident(y)operator(\)) ident(htovd)operator(()ident(x)operator(\)) +preprocessor(#define) ident(NTOHD)operator(()ident(x)operator(,)ident(y)operator(\)) ident(ntohd)operator(()ident(x)operator(\)) +preprocessor(#define) ident(VTOHD)operator(()ident(x)operator(,)ident(y)operator(\)) ident(vtohd)operator(()ident(x)operator(\)) +preprocessor(#endif) + +pre_type(unsigned) pre_type(long) ident(rb_big2ulong_pack) ident(_)operator((()ident(VALUE) ident(x)operator(\)\);) + +directive(static) pre_type(unsigned) pre_type(long) +ident(num2i32)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + ident(x) operator(=) ident(rb_to_int)operator(()ident(x)operator(\);) comment(/* is nil OK? (should not\) */) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(x)operator(\)\)) reserved(return) ident(FIX2LONG)operator(()ident(x)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(x)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + reserved(return) ident(rb_big2ulong_pack)operator(()ident(x)operator(\);) + operator(}) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't convert %s to `integer')delimiter(")>operator(,) ident(rb_obj_classname)operator(()ident(x)operator(\)\);) + reserved(return) integer(0)operator(;) comment(/* not reached */) +operator(}) + +preprocessor(#if) ident(SIZEOF_LONG) operator(==) ident(SIZE32) +preprocessor(# define) ident(EXTEND32)operator(()ident(x)operator(\)) +preprocessor(#else) +comment(/* invariant in modulo 1<<31 */) +preprocessor(# define) ident(EXTEND32)operator(()ident(x)operator(\)) reserved(do) operator({) reserved(if) operator((!)ident(natint)operator(\)) operator({()ident(x)operator(\)) operator(=) operator(((()integer(1L)operator(<<)integer(31)operator(\)-)integer(1)operator(-()ident(x)operator(\)\)^~(~)integer(0L)operator(<<)integer(31)operator(\)\);}}) reserved(while)operator(()integer(0)operator(\)) +preprocessor(#endif) +preprocessor(#if) ident(SIZEOF_SHORT) operator(==) ident(SIZE16) +preprocessor(# define) ident(EXTEND16)operator(()ident(x)operator(\)) +preprocessor(#else) +preprocessor(# define) ident(EXTEND16)operator(()ident(x)operator(\)) reserved(do) operator({) reserved(if) operator((!)ident(natint)operator(\)) operator({()ident(x)operator(\)) operator(=) operator(()pre_type(short)operator(\)((()integer(1)operator(<<)integer(15)operator(\)-)integer(1)operator(-()ident(x)operator(\)\)^~(~)integer(0)operator(<<)integer(15)operator(\)\);}}) reserved(while)operator(()integer(0)operator(\)) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_LONG_LONG) +preprocessor(# define) ident(QUAD_SIZE) reserved(sizeof)operator(()ident(LONG_LONG)operator(\)) +preprocessor(#else) +preprocessor(# define) ident(QUAD_SIZE) integer(8) +preprocessor(#endif) +directive(static) directive(const) pre_type(char) ident(toofew)operator([]) operator(=) string<delimiter(")content(too few arguments)delimiter(")>operator(;) + +directive(static) directive(void) ident(encodes) ident(_)operator((()ident(VALUE)operator(,)pre_type(char)operator(*,)pre_type(long)operator(,)pre_type(int)operator(\)\);) +directive(static) directive(void) ident(qpencode) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(,)pre_type(long)operator(\)\);) + +directive(static) pre_type(int) ident(uv_to_utf8) ident(_)operator((()pre_type(char)operator(*,)pre_type(unsigned) pre_type(long)operator(\)\);) +directive(static) pre_type(unsigned) pre_type(long) ident(utf8_to_uv) ident(_)operator((()pre_type(char)operator(*,)pre_type(long)operator(*\)\);) + +comment(/* + * call-seq: + * arr.pack ( aTemplateString \) -> aBinaryString + * + * Packs the contents of <i>arr</i> into a binary sequence according to + * the directives in <i>aTemplateString</i> (see the table below\) + * Directives ``A,'' ``a,'' and ``Z'' may be followed by a count, + * which gives the width of the resulting field. The remaining + * directives also may take a count, indicating the number of array + * elements to convert. If the count is an asterisk + * (``<code>*</code>''\), all remaining array elements will be + * converted. Any of the directives ``<code>sSiIlL</code>'' may be + * followed by an underscore (``<code>_</code>''\) to use the underlying + * platform's native size for the specified type; otherwise, they use a + * platform-independent size. Spaces are ignored in the template + * string. See also <code>String#unpack</code>. + * + * a = [ "a", "b", "c" ] + * n = [ 65, 66, 67 ] + * a.pack("A3A3A3"\) #=> "a b c " + * a.pack("a3a3a3"\) #=> "a\\000\\000b\\000\\000c\\000\\000" + * n.pack("ccc"\) #=> "ABC" + * + * Directives for +pack+. + * + * Directive Meaning + * --------------------------------------------------------------- + * @ | Moves to absolute position + * A | ASCII string (space padded, count is width\) + * a | ASCII string (null padded, count is width\) + * B | Bit string (descending bit order\) + * b | Bit string (ascending bit order\) + * C | Unsigned char + * c | Char + * D, d | Double-precision float, native format + * E | Double-precision float, little-endian byte order + * e | Single-precision float, little-endian byte order + * F, f | Single-precision float, native format + * G | Double-precision float, network (big-endian\) byte order + * g | Single-precision float, network (big-endian\) byte order + * H | Hex string (high nibble first\) + * h | Hex string (low nibble first\) + * I | Unsigned integer + * i | Integer + * L | Unsigned long + * l | Long + * M | Quoted printable, MIME encoding (see RFC2045\) + * m | Base64 encoded string + * N | Long, network (big-endian\) byte order + * n | Short, network (big-endian\) byte-order + * P | Pointer to a structure (fixed-length string\) + * p | Pointer to a null-terminated string + * Q, q | 64-bit number + * S | Unsigned short + * s | Short + * U | UTF-8 + * u | UU-encoded string + * V | Long, little-endian byte order + * v | Short, little-endian byte order + * w | BER-compressed integer\\fnm + * X | Back up a byte + * x | Null byte + * Z | Same as ``a'', except that null is added with * + */) + +directive(static) ident(VALUE) +ident(pack_pack)operator(()ident(ary)operator(,) ident(fmt)operator(\)) + ident(VALUE) ident(ary)operator(,) ident(fmt)operator(;) +operator({) + directive(static) pre_type(char) operator(*)ident(nul10) operator(=) string<delimiter(")char(\\0)char(\\0)char(\\0)char(\\0)char(\\0)char(\\0)char(\\0)char(\\0)char(\\0)char(\\0)delimiter(")>operator(;) + directive(static) pre_type(char) operator(*)ident(spc10) operator(=) string<delimiter(")content( )delimiter(")>operator(;) + pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + ident(VALUE) ident(res)operator(,) ident(from)operator(,) ident(associates) operator(=) integer(0)operator(;) + pre_type(char) ident(type)operator(;) + pre_type(long) ident(items)operator(,) ident(len)operator(,) ident(idx)operator(,) ident(plen)operator(;) + pre_type(char) operator(*)ident(ptr)operator(;) +preprocessor(#ifdef) ident(NATINT_PACK) + pre_type(int) ident(natint)operator(;) comment(/* native integer */) +preprocessor(#endif) + + ident(StringValue)operator(()ident(fmt)operator(\);) + ident(p) operator(=) ident(RSTRING)operator(()ident(fmt)operator(\)->)ident(ptr)operator(;) + ident(pend) operator(=) ident(p) operator(+) ident(RSTRING)operator(()ident(fmt)operator(\)->)ident(len)operator(;) + ident(res) operator(=) ident(rb_str_buf_new)operator(()integer(0)operator(\);) + + ident(items) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + ident(idx) operator(=) integer(0)operator(;) + +preprocessor(#define) ident(TOO_FEW) operator(()ident(rb_raise)operator(()ident(rb_eArgError)operator(,) ident(toofew)operator(\),) integer(0)operator(\)) +preprocessor(#define) ident(THISFROM) operator(()ident(items) operator(>) integer(0) operator(?) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(idx)operator(]) operator(:) ident(TOO_FEW)operator(\)) +preprocessor(#define) ident(NEXTFROM) operator(()ident(items)operator(--) operator(>) integer(0) operator(?) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(idx)operator(++]) operator(:) ident(TOO_FEW)operator(\)) + + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(fmt)operator(\)->)ident(ptr) operator(+) ident(RSTRING)operator(()ident(fmt)operator(\)->)ident(len) operator(!=) ident(pend)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(format string modified)delimiter(")>operator(\);) + operator(}) + ident(type) operator(=) operator(*)ident(p)operator(++;) comment(/* get data type */) +preprocessor(#ifdef) ident(NATINT_PACK) + ident(natint) operator(=) integer(0)operator(;) +preprocessor(#endif) + + reserved(if) operator(()ident(ISSPACE)operator(()ident(type)operator(\)\)) reserved(continue)operator(;) + reserved(if) operator(()ident(type) operator(==) char('#')operator(\)) operator({) + reserved(while) operator((()ident(p) operator(<) ident(pend)operator(\)) operator(&&) operator((*)ident(p) operator(!=) char('\\n')operator(\)\)) operator({) + ident(p)operator(++;) + operator(}) + reserved(continue)operator(;) + operator(}) + reserved(if) operator((*)ident(p) operator(==) char('_') operator(||) operator(*)ident(p) operator(==) char('!')operator(\)) operator({) + directive(const) pre_type(char) operator(*)ident(natstr) operator(=) string<delimiter(")content(sSiIlL)delimiter(")>operator(;) + + reserved(if) operator(()ident(strchr)operator(()ident(natstr)operator(,) ident(type)operator(\)\)) operator({) +preprocessor(#ifdef) ident(NATINT_PACK) + ident(natint) operator(=) integer(1)operator(;) +preprocessor(#endif) + ident(p)operator(++;) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content('%c' allowed only after types %s)delimiter(")>operator(,) operator(*)ident(p)operator(,) ident(natstr)operator(\);) + operator(}) + operator(}) + reserved(if) operator((*)ident(p) operator(==) char('*')operator(\)) operator({) comment(/* set data length */) + ident(len) operator(=) ident(strchr)operator(()string<delimiter(")content(@Xxu)delimiter(")>operator(,) ident(type)operator(\)) operator(?) integer(0) + operator(:) ident(strchr)operator(()string<delimiter(")content(PMm)delimiter(")>operator(,) ident(type)operator(\)) operator(?) integer(1) + operator(:) ident(items)operator(;) + ident(p)operator(++;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISDIGIT)operator((*)ident(p)operator(\)\)) operator({) + ident(len) operator(=) ident(strtoul)operator(()ident(p)operator(,) operator(()pre_type(char)operator(**\)&)ident(p)operator(,) integer(10)operator(\);) + operator(}) + reserved(else) operator({) + ident(len) operator(=) integer(1)operator(;) + operator(}) + + reserved(switch) operator(()ident(type)operator(\)) operator({) + reserved(case) char('A')operator(:) reserved(case) char('a')operator(:) reserved(case) char('Z')operator(:) + reserved(case) char('B')operator(:) reserved(case) char('b')operator(:) + reserved(case) char('H')operator(:) reserved(case) char('h')operator(:) + ident(from) operator(=) ident(NEXTFROM)operator(;) + reserved(if) operator(()ident(NIL_P)operator(()ident(from)operator(\)\)) operator({) + ident(ptr) operator(=) string<delimiter(")delimiter(")>operator(;) + ident(plen) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(StringValue)operator(()ident(from)operator(\);) + ident(ptr) operator(=) ident(RSTRING)operator(()ident(from)operator(\)->)ident(ptr)operator(;) + ident(plen) operator(=) ident(RSTRING)operator(()ident(from)operator(\)->)ident(len)operator(;) + ident(OBJ_INFECT)operator(()ident(res)operator(,) ident(from)operator(\);) + operator(}) + + reserved(if) operator(()ident(p)operator([-)integer(1)operator(]) operator(==) char('*')operator(\)) + ident(len) operator(=) ident(plen)operator(;) + + reserved(switch) operator(()ident(type)operator(\)) operator({) + reserved(case) char('a')operator(:) comment(/* arbitrary binary string (null padded\) */) + reserved(case) char('A')operator(:) comment(/* ASCII string (space padded\) */) + reserved(case) char('Z')operator(:) comment(/* null terminated ASCII string */) + reserved(if) operator(()ident(plen) operator(>=) ident(len)operator(\)) operator({) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(ptr)operator(,) ident(len)operator(\);) + reserved(if) operator(()ident(p)operator([-)integer(1)operator(]) operator(==) char('*') operator(&&) ident(type) operator(==) char('Z')operator(\)) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(nul10)operator(,) integer(1)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(ptr)operator(,) ident(plen)operator(\);) + ident(len) operator(-=) ident(plen)operator(;) + reserved(while) operator(()ident(len) operator(>=) integer(10)operator(\)) operator({) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()ident(type) operator(==) char('A')operator(\)?)label(spc10)operator(:)ident(nul10)operator(,) integer(10)operator(\);) + ident(len) operator(-=) integer(10)operator(;) + operator(}) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()ident(type) operator(==) char('A')operator(\)?)label(spc10)operator(:)ident(nul10)operator(,) ident(len)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('b')operator(:) comment(/* bit string (ascending\) */) + operator({) + pre_type(int) ident(byte) operator(=) integer(0)operator(;) + pre_type(long) ident(i)operator(,) ident(j) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(len) operator(>) ident(plen)operator(\)) operator({) + ident(j) operator(=) operator(()ident(len) operator(-) ident(plen) operator(+) integer(1)operator(\))operator(/)integer(2)operator(;) + ident(len) operator(=) ident(plen)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(++) operator(<) ident(len)operator(;) ident(ptr)operator(++\)) operator({) + reserved(if) operator((*)ident(ptr) operator(&) integer(1)operator(\)) + ident(byte) operator(|=) integer(128)operator(;) + reserved(if) operator(()ident(i) operator(&) integer(7)operator(\)) + ident(byte) operator(>>=) integer(1)operator(;) + reserved(else) operator({) + pre_type(char) ident(c) operator(=) ident(byte) operator(&) hex(0xff)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + ident(byte) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(len) operator(&) integer(7)operator(\)) operator({) + pre_type(char) ident(c)operator(;) + ident(byte) operator(>>=) integer(7) operator(-) operator(()ident(len) operator(&) integer(7)operator(\);) + ident(c) operator(=) ident(byte) operator(&) hex(0xff)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + operator(}) + ident(len) operator(=) ident(j)operator(;) + reserved(goto) ident(grow)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('B')operator(:) comment(/* bit string (descending\) */) + operator({) + pre_type(int) ident(byte) operator(=) integer(0)operator(;) + pre_type(long) ident(i)operator(,) ident(j) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(len) operator(>) ident(plen)operator(\)) operator({) + ident(j) operator(=) operator(()ident(len) operator(-) ident(plen) operator(+) integer(1)operator(\))operator(/)integer(2)operator(;) + ident(len) operator(=) ident(plen)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(++) operator(<) ident(len)operator(;) ident(ptr)operator(++\)) operator({) + ident(byte) operator(|=) operator(*)ident(ptr) operator(&) integer(1)operator(;) + reserved(if) operator(()ident(i) operator(&) integer(7)operator(\)) + ident(byte) operator(<<=) integer(1)operator(;) + reserved(else) operator({) + pre_type(char) ident(c) operator(=) ident(byte) operator(&) hex(0xff)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + ident(byte) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(len) operator(&) integer(7)operator(\)) operator({) + pre_type(char) ident(c)operator(;) + ident(byte) operator(<<=) integer(7) operator(-) operator(()ident(len) operator(&) integer(7)operator(\);) + ident(c) operator(=) ident(byte) operator(&) hex(0xff)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + operator(}) + ident(len) operator(=) ident(j)operator(;) + reserved(goto) ident(grow)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('h')operator(:) comment(/* hex string (low nibble first\) */) + operator({) + pre_type(int) ident(byte) operator(=) integer(0)operator(;) + pre_type(long) ident(i)operator(,) ident(j) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(len) operator(>) ident(plen)operator(\)) operator({) + ident(j) operator(=) operator(()ident(len) operator(+) integer(1)operator(\)) operator(/) integer(2) operator(-) operator(()ident(plen) operator(+) integer(1)operator(\)) operator(/) integer(2)operator(;) + ident(len) operator(=) ident(plen)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(++) operator(<) ident(len)operator(;) ident(ptr)operator(++\)) operator({) + reserved(if) operator(()ident(ISALPHA)operator((*)ident(ptr)operator(\)\)) + ident(byte) operator(|=) operator((((*)ident(ptr) operator(&) integer(15)operator(\)) operator(+) integer(9)operator(\)) operator(&) integer(15)operator(\)) operator(<<) integer(4)operator(;) + reserved(else) + ident(byte) operator(|=) operator((*)ident(ptr) operator(&) integer(15)operator(\)) operator(<<) integer(4)operator(;) + reserved(if) operator(()ident(i) operator(&) integer(1)operator(\)) + ident(byte) operator(>>=) integer(4)operator(;) + reserved(else) operator({) + pre_type(char) ident(c) operator(=) ident(byte) operator(&) hex(0xff)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + ident(byte) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(len) operator(&) integer(1)operator(\)) operator({) + pre_type(char) ident(c) operator(=) ident(byte) operator(&) hex(0xff)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + operator(}) + ident(len) operator(=) ident(j)operator(;) + reserved(goto) ident(grow)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('H')operator(:) comment(/* hex string (high nibble first\) */) + operator({) + pre_type(int) ident(byte) operator(=) integer(0)operator(;) + pre_type(long) ident(i)operator(,) ident(j) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(len) operator(>) ident(plen)operator(\)) operator({) + ident(j) operator(=) operator(()ident(len) operator(+) integer(1)operator(\)) operator(/) integer(2) operator(-) operator(()ident(plen) operator(+) integer(1)operator(\)) operator(/) integer(2)operator(;) + ident(len) operator(=) ident(plen)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(++) operator(<) ident(len)operator(;) ident(ptr)operator(++\)) operator({) + reserved(if) operator(()ident(ISALPHA)operator((*)ident(ptr)operator(\)\)) + ident(byte) operator(|=) operator(((*)ident(ptr) operator(&) integer(15)operator(\)) operator(+) integer(9)operator(\)) operator(&) integer(15)operator(;) + reserved(else) + ident(byte) operator(|=) operator(*)ident(ptr) operator(&) integer(15)operator(;) + reserved(if) operator(()ident(i) operator(&) integer(1)operator(\)) + ident(byte) operator(<<=) integer(4)operator(;) + reserved(else) operator({) + pre_type(char) ident(c) operator(=) ident(byte) operator(&) hex(0xff)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + ident(byte) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(len) operator(&) integer(1)operator(\)) operator({) + pre_type(char) ident(c) operator(=) ident(byte) operator(&) hex(0xff)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + operator(}) + ident(len) operator(=) ident(j)operator(;) + reserved(goto) ident(grow)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('c')operator(:) comment(/* signed char */) + reserved(case) char('C')operator(:) comment(/* unsigned char */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(char) ident(c)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(c) operator(=) ident(num2i32)operator(()ident(from)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) reserved(sizeof)operator(()pre_type(char)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('s')operator(:) comment(/* signed short */) + reserved(case) char('S')operator(:) comment(/* unsigned short */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(short) ident(s)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(s) operator(=) ident(num2i32)operator(()ident(from)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(OFF16)operator((&)ident(s)operator(\),) ident(NATINT_LEN)operator(()pre_type(short)operator(,)integer(2)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('i')operator(:) comment(/* signed int */) + reserved(case) char('I')operator(:) comment(/* unsigned int */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(long) ident(i)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(i) operator(=) ident(num2i32)operator(()ident(from)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(OFF32)operator((&)ident(i)operator(\),) ident(NATINT_LEN)operator(()pre_type(int)operator(,)integer(4)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('l')operator(:) comment(/* signed long */) + reserved(case) char('L')operator(:) comment(/* unsigned long */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(long) ident(l)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(l) operator(=) ident(num2i32)operator(()ident(from)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(OFF32)operator((&)ident(l)operator(\),) ident(NATINT_LEN)operator(()pre_type(long)operator(,)integer(4)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('q')operator(:) comment(/* signed quad (64bit\) int */) + reserved(case) char('Q')operator(:) comment(/* unsigned quad (64bit\) int */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(char) ident(tmp)operator([)ident(QUAD_SIZE)operator(];) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(rb_quad_pack)operator(()ident(tmp)operator(,) ident(from)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()pre_type(char)operator(*\)&)ident(tmp)operator(,) ident(QUAD_SIZE)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('n')operator(:) comment(/* unsigned short (network byte-order\) */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(short) ident(s)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(s) operator(=) ident(num2i32)operator(()ident(from)operator(\);) + ident(s) operator(=) ident(NATINT_HTONS)operator(()ident(s)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(OFF16)operator((&)ident(s)operator(\),) ident(NATINT_LEN)operator(()pre_type(short)operator(,)integer(2)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('N')operator(:) comment(/* unsigned long (network byte-order\) */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(long) ident(l)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(l) operator(=) ident(num2i32)operator(()ident(from)operator(\);) + ident(l) operator(=) ident(NATINT_HTONL)operator(()ident(l)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(OFF32)operator((&)ident(l)operator(\),) ident(NATINT_LEN)operator(()pre_type(long)operator(,)integer(4)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('v')operator(:) comment(/* unsigned short (VAX byte-order\) */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(short) ident(s)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(s) operator(=) ident(num2i32)operator(()ident(from)operator(\);) + ident(s) operator(=) ident(NATINT_HTOVS)operator(()ident(s)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(OFF16)operator((&)ident(s)operator(\),) ident(NATINT_LEN)operator(()pre_type(short)operator(,)integer(2)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('V')operator(:) comment(/* unsigned long (VAX byte-order\) */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(long) ident(l)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(l) operator(=) ident(num2i32)operator(()ident(from)operator(\);) + ident(l) operator(=) ident(NATINT_HTOVL)operator(()ident(l)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(OFF32)operator((&)ident(l)operator(\),) ident(NATINT_LEN)operator(()pre_type(long)operator(,)integer(4)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('f')operator(:) comment(/* single precision float in native format */) + reserved(case) char('F')operator(:) comment(/* ditto */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(float) ident(f)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(f) operator(=) ident(RFLOAT)operator(()ident(rb_Float)operator(()ident(from)operator(\)\)->)ident(value)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()pre_type(char)operator(*\)&)ident(f)operator(,) reserved(sizeof)operator(()pre_type(float)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('e')operator(:) comment(/* single precision float in VAX byte-order */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(float) ident(f)operator(;) + ident(FLOAT_CONVWITH)operator(()ident(ftmp)operator(\);) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(f) operator(=) ident(RFLOAT)operator(()ident(rb_Float)operator(()ident(from)operator(\)\)->)ident(value)operator(;) + ident(f) operator(=) ident(HTOVF)operator(()ident(f)operator(,)ident(ftmp)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()pre_type(char)operator(*\)&)ident(f)operator(,) reserved(sizeof)operator(()pre_type(float)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('E')operator(:) comment(/* double precision float in VAX byte-order */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(double) ident(d)operator(;) + ident(DOUBLE_CONVWITH)operator(()ident(dtmp)operator(\);) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(d) operator(=) ident(RFLOAT)operator(()ident(rb_Float)operator(()ident(from)operator(\)\)->)ident(value)operator(;) + ident(d) operator(=) ident(HTOVD)operator(()ident(d)operator(,)ident(dtmp)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()pre_type(char)operator(*\)&)ident(d)operator(,) reserved(sizeof)operator(()pre_type(double)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('d')operator(:) comment(/* double precision float in native format */) + reserved(case) char('D')operator(:) comment(/* ditto */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(double) ident(d)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(d) operator(=) ident(RFLOAT)operator(()ident(rb_Float)operator(()ident(from)operator(\)\)->)ident(value)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()pre_type(char)operator(*\)&)ident(d)operator(,) reserved(sizeof)operator(()pre_type(double)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('g')operator(:) comment(/* single precision float in network byte-order */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(float) ident(f)operator(;) + ident(FLOAT_CONVWITH)operator(()ident(ftmp)operator(\);) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(f) operator(=) ident(RFLOAT)operator(()ident(rb_Float)operator(()ident(from)operator(\)\)->)ident(value)operator(;) + ident(f) operator(=) ident(HTONF)operator(()ident(f)operator(,)ident(ftmp)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()pre_type(char)operator(*\)&)ident(f)operator(,) reserved(sizeof)operator(()pre_type(float)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('G')operator(:) comment(/* double precision float in network byte-order */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(double) ident(d)operator(;) + ident(DOUBLE_CONVWITH)operator(()ident(dtmp)operator(\);) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(d) operator(=) ident(RFLOAT)operator(()ident(rb_Float)operator(()ident(from)operator(\)\)->)ident(value)operator(;) + ident(d) operator(=) ident(HTOND)operator(()ident(d)operator(,)ident(dtmp)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()pre_type(char)operator(*\)&)ident(d)operator(,) reserved(sizeof)operator(()pre_type(double)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('x')operator(:) comment(/* null byte */) + label(grow)operator(:) + reserved(while) operator(()ident(len) operator(>=) integer(10)operator(\)) operator({) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(nul10)operator(,) integer(10)operator(\);) + ident(len) operator(-=) integer(10)operator(;) + operator(}) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(nul10)operator(,) ident(len)operator(\);) + reserved(break)operator(;) + + reserved(case) char('X')operator(:) comment(/* back up byte */) + label(shrink)operator(:) + ident(plen) operator(=) ident(RSTRING)operator(()ident(res)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(plen) operator(<) ident(len)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(X outside of string)delimiter(")>operator(\);) + ident(RSTRING)operator(()ident(res)operator(\)->)ident(len) operator(=) ident(plen) operator(-) ident(len)operator(;) + ident(RSTRING)operator(()ident(res)operator(\)->)ident(ptr)operator([)ident(plen) operator(-) ident(len)operator(]) operator(=) char('\\0')operator(;) + reserved(break)operator(;) + + reserved(case) char('@')operator(:) comment(/* null fill to absolute position */) + ident(len) operator(-=) ident(RSTRING)operator(()ident(res)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(len) operator(>) integer(0)operator(\)) reserved(goto) ident(grow)operator(;) + ident(len) operator(=) operator(-)ident(len)operator(;) + reserved(if) operator(()ident(len) operator(>) integer(0)operator(\)) reserved(goto) ident(shrink)operator(;) + reserved(break)operator(;) + + reserved(case) char('%')operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(%% is not supported)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) char('U')operator(:) comment(/* Unicode character */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(long) ident(l)operator(;) + pre_type(char) ident(buf)operator([)integer(8)operator(];) + pre_type(int) ident(le)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(from) operator(=) ident(rb_to_int)operator(()ident(from)operator(\);) + ident(l) operator(=) ident(NUM2INT)operator(()ident(from)operator(\);) + reserved(if) operator(()ident(l) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(pack(U\): value out of range)delimiter(")>operator(\);) + operator(}) + ident(le) operator(=) ident(uv_to_utf8)operator(()ident(buf)operator(,) ident(l)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()pre_type(char)operator(*\))ident(buf)operator(,) ident(le)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('u')operator(:) comment(/* uuencoded string */) + reserved(case) char('m')operator(:) comment(/* base64 encoded string */) + ident(from) operator(=) ident(NEXTFROM)operator(;) + ident(StringValue)operator(()ident(from)operator(\);) + ident(ptr) operator(=) ident(RSTRING)operator(()ident(from)operator(\)->)ident(ptr)operator(;) + ident(plen) operator(=) ident(RSTRING)operator(()ident(from)operator(\)->)ident(len)operator(;) + + reserved(if) operator(()ident(len) operator(<=) integer(2)operator(\)) + ident(len) operator(=) integer(45)operator(;) + reserved(else) + ident(len) operator(=) ident(len) operator(/) integer(3) operator(*) integer(3)operator(;) + reserved(while) operator(()ident(plen) operator(>) integer(0)operator(\)) operator({) + pre_type(long) ident(todo)operator(;) + + reserved(if) operator(()ident(plen) operator(>) ident(len)operator(\)) + ident(todo) operator(=) ident(len)operator(;) + reserved(else) + ident(todo) operator(=) ident(plen)operator(;) + ident(encodes)operator(()ident(res)operator(,) ident(ptr)operator(,) ident(todo)operator(,) ident(type)operator(\);) + ident(plen) operator(-=) ident(todo)operator(;) + ident(ptr) operator(+=) ident(todo)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('M')operator(:) comment(/* quoted-printable encoded string */) + ident(from) operator(=) ident(rb_obj_as_string)operator(()ident(NEXTFROM)operator(\);) + reserved(if) operator(()ident(len) operator(<=) integer(1)operator(\)) + ident(len) operator(=) integer(72)operator(;) + ident(qpencode)operator(()ident(res)operator(,) ident(from)operator(,) ident(len)operator(\);) + reserved(break)operator(;) + + reserved(case) char('P')operator(:) comment(/* pointer to packed byte string */) + ident(from) operator(=) ident(THISFROM)operator(;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(from)operator(\)\)) operator({) + ident(StringValue)operator(()ident(from)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(from)operator(\)->)ident(len) operator(<) ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(too short buffer for P(%ld for %ld\))delimiter(")>operator(,) + ident(RSTRING)operator(()ident(from)operator(\)->)ident(len)operator(,) ident(len)operator(\);) + operator(}) + operator(}) + ident(len) operator(=) integer(1)operator(;) + comment(/* FALL THROUGH */) + reserved(case) char('p')operator(:) comment(/* pointer to string */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(char) operator(*)ident(t)operator(;) + ident(from) operator(=) ident(NEXTFROM)operator(;) + reserved(if) operator(()ident(NIL_P)operator(()ident(from)operator(\)\)) operator({) + ident(t) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(t) operator(=) ident(StringValuePtr)operator(()ident(from)operator(\);) + operator(}) + reserved(if) operator((!)ident(associates)operator(\)) operator({) + ident(associates) operator(=) ident(rb_ary_new)operator((\);) + operator(}) + ident(rb_ary_push)operator(()ident(associates)operator(,) ident(from)operator(\);) + ident(rb_obj_taint)operator(()ident(from)operator(\);) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(()pre_type(char)operator(*\)&)ident(t)operator(,) reserved(sizeof)operator(()pre_type(char)operator(*\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('w')operator(:) comment(/* BER compressed integer */) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(long) ident(ul)operator(;) + ident(VALUE) ident(buf) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\);) + pre_type(char) ident(c)operator(,) operator(*)ident(bufs)operator(,) operator(*)ident(bufe)operator(;) + + ident(from) operator(=) ident(NEXTFROM)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(from)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + ident(VALUE) ident(big128) operator(=) ident(rb_uint2big)operator(()integer(128)operator(\);) + reserved(while) operator(()ident(TYPE)operator(()ident(from)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) operator({) + ident(from) operator(=) ident(rb_big_divmod)operator(()ident(from)operator(,) ident(big128)operator(\);) + ident(c) operator(=) ident(NUM2INT)operator(()ident(RARRAY)operator(()ident(from)operator(\)->)ident(ptr)operator([)integer(1)operator(]\)) operator(|) hex(0x80)operator(;) comment(/* mod */) + ident(rb_str_buf_cat)operator(()ident(buf)operator(,) operator(&)ident(c)operator(,) reserved(sizeof)operator(()pre_type(char)operator(\)\);) + ident(from) operator(=) ident(RARRAY)operator(()ident(from)operator(\)->)ident(ptr)operator([)integer(0)operator(];) comment(/* div */) + operator(}) + operator(}) + + operator({) + pre_type(long) ident(l) operator(=) ident(NUM2LONG)operator(()ident(from)operator(\);) + reserved(if) operator(()ident(l) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(can't compress negative numbers)delimiter(")>operator(\);) + operator(}) + ident(ul) operator(=) ident(l)operator(;) + operator(}) + + reserved(while) operator(()ident(ul)operator(\)) operator({) + ident(c) operator(=) operator((()ident(ul) operator(&) hex(0x7f)operator(\)) operator(|) hex(0x80)operator(\);) + ident(rb_str_buf_cat)operator(()ident(buf)operator(,) operator(&)ident(c)operator(,) reserved(sizeof)operator(()pre_type(char)operator(\)\);) + ident(ul) operator(>>=) integer(7)operator(;) + operator(}) + + reserved(if) operator(()ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len)operator(\)) operator({) + ident(bufs) operator(=) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(ptr)operator(;) + ident(bufe) operator(=) ident(bufs) operator(+) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len) operator(-) integer(1)operator(;) + operator(*)ident(bufs) operator(&=) hex(0x7f)operator(;) comment(/* clear continue bit */) + reserved(while) operator(()ident(bufs) operator(<) ident(bufe)operator(\)) operator({) comment(/* reverse */) + ident(c) operator(=) operator(*)ident(bufs)operator(;) + operator(*)ident(bufs)operator(++) operator(=) operator(*)ident(bufe)operator(;) + operator(*)ident(bufe)operator(--) operator(=) ident(c)operator(;) + operator(}) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len)operator(\);) + operator(}) + reserved(else) operator({) + ident(c) operator(=) integer(0)operator(;) + ident(rb_str_buf_cat)operator(()ident(res)operator(,) operator(&)ident(c)operator(,) reserved(sizeof)operator(()pre_type(char)operator(\)\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()ident(associates)operator(\)) operator({) + ident(rb_str_associate)operator(()ident(res)operator(,) ident(associates)operator(\);) + operator(}) + ident(OBJ_INFECT)operator(()ident(res)operator(,) ident(fmt)operator(\);) + reserved(return) ident(res)operator(;) +operator(}) + +directive(static) pre_type(char) ident(uu_table)operator([]) operator(=) +string<delimiter(")content(`!)char(\\")content(#$%&'(\)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[)char(\\\\)content(]^_)delimiter(")>operator(;) +directive(static) pre_type(char) ident(b64_table)operator([]) operator(=) +string<delimiter(")content(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)delimiter(")>operator(;) + +directive(static) directive(void) +ident(encodes)operator(()ident(str)operator(,) ident(s)operator(,) ident(len)operator(,) ident(type)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(type)operator(;) +operator({) + pre_type(char) operator(*)ident(buff) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(len) operator(*) integer(4) operator(/) integer(3) operator(+) integer(6)operator(\);) + pre_type(long) ident(i) operator(=) integer(0)operator(;) + pre_type(char) operator(*)ident(trans) operator(=) ident(type) operator(==) char('u') operator(?) ident(uu_table) operator(:) ident(b64_table)operator(;) + pre_type(int) ident(padding)operator(;) + + reserved(if) operator(()ident(type) operator(==) char('u')operator(\)) operator({) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(len) operator(+) char(' ')operator(;) + ident(padding) operator(=) char('`')operator(;) + operator(}) + reserved(else) operator({) + ident(padding) operator(=) char('=')operator(;) + operator(}) + reserved(while) operator(()ident(len) operator(>=) integer(3)operator(\)) operator({) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(trans)operator([)oct(077) operator(&) operator((*)ident(s) operator(>>) integer(2)operator(\)];) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(trans)operator([)oct(077) operator(&) operator((((*)ident(s) operator(<<) integer(4)operator(\)) operator(&) oct(060)operator(\)) operator(|) operator((()ident(s)operator([)integer(1)operator(]) operator(>>) integer(4)operator(\)) operator(&) oct(017)operator(\)\)];) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(trans)operator([)oct(077) operator(&) operator(((()ident(s)operator([)integer(1)operator(]) operator(<<) integer(2)operator(\)) operator(&) oct(074)operator(\)) operator(|) operator((()ident(s)operator([)integer(2)operator(]) operator(>>) integer(6)operator(\)) operator(&) oct(03)operator(\)\)];) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(trans)operator([)oct(077) operator(&) ident(s)operator([)integer(2)operator(]];) + ident(s) operator(+=) integer(3)operator(;) + ident(len) operator(-=) integer(3)operator(;) + operator(}) + reserved(if) operator(()ident(len) operator(==) integer(2)operator(\)) operator({) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(trans)operator([)oct(077) operator(&) operator((*)ident(s) operator(>>) integer(2)operator(\)];) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(trans)operator([)oct(077) operator(&) operator((((*)ident(s) operator(<<) integer(4)operator(\)) operator(&) oct(060)operator(\)) operator(|) operator((()ident(s)operator([)integer(1)operator(]) operator(>>) integer(4)operator(\)) operator(&) oct(017)operator(\)\)];) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(trans)operator([)oct(077) operator(&) operator(((()ident(s)operator([)integer(1)operator(]) operator(<<) integer(2)operator(\)) operator(&) oct(074)operator(\)) operator(|) operator((()char('\\0') operator(>>) integer(6)operator(\)) operator(&) oct(03)operator(\)\)];) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(padding)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(len) operator(==) integer(1)operator(\)) operator({) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(trans)operator([)oct(077) operator(&) operator((*)ident(s) operator(>>) integer(2)operator(\)];) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(trans)operator([)oct(077) operator(&) operator((((*)ident(s) operator(<<) integer(4)operator(\)) operator(&) oct(060)operator(\)) operator(|) operator((()char('\\0') operator(>>) integer(4)operator(\)) operator(&) oct(017)operator(\)\)];) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(padding)operator(;) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(padding)operator(;) + operator(}) + ident(buff)operator([)ident(i)operator(++]) operator(=) char('\\n')operator(;) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(buff)operator(,) ident(i)operator(\);) +operator(}) + +directive(static) pre_type(char) ident(hex_table)operator([]) operator(=) string<delimiter(")content(0123456789ABCDEF)delimiter(")>operator(;) + +directive(static) directive(void) +ident(qpencode)operator(()ident(str)operator(,) ident(from)operator(,) ident(len)operator(\)) + ident(VALUE) ident(str)operator(,) ident(from)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + pre_type(char) ident(buff)operator([)integer(1024)operator(];) + pre_type(long) ident(i) operator(=) integer(0)operator(,) ident(n) operator(=) integer(0)operator(,) ident(prev) operator(=) pre_constant(EOF)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(s) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(RSTRING)operator(()ident(from)operator(\)->)ident(ptr)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(from)operator(\)->)ident(len)operator(;) + + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + reserved(if) operator(((*)ident(s) operator(>) integer(126)operator(\)) operator(||) + operator((*)ident(s) operator(<) integer(32) operator(&&) operator(*)ident(s) operator(!=) char('\\n') operator(&&) operator(*)ident(s) operator(!=) char('\\t')operator(\)) operator(||) + operator((*)ident(s) operator(==) char('=')operator(\)\)) operator({) + ident(buff)operator([)ident(i)operator(++]) operator(=) char('=')operator(;) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(hex_table)operator([*)ident(s) operator(>>) integer(4)operator(];) + ident(buff)operator([)ident(i)operator(++]) operator(=) ident(hex_table)operator([*)ident(s) operator(&) hex(0x0f)operator(];) + ident(n) operator(+=) integer(3)operator(;) + ident(prev) operator(=) pre_constant(EOF)operator(;) + operator(}) + reserved(else) reserved(if) operator((*)ident(s) operator(==) char('\\n')operator(\)) operator({) + reserved(if) operator(()ident(prev) operator(==) char(' ') operator(||) ident(prev) operator(==) char('\\t')operator(\)) operator({) + ident(buff)operator([)ident(i)operator(++]) operator(=) char('=')operator(;) + ident(buff)operator([)ident(i)operator(++]) operator(=) operator(*)ident(s)operator(;) + operator(}) + ident(buff)operator([)ident(i)operator(++]) operator(=) operator(*)ident(s)operator(;) + ident(n) operator(=) integer(0)operator(;) + ident(prev) operator(=) operator(*)ident(s)operator(;) + operator(}) + reserved(else) operator({) + ident(buff)operator([)ident(i)operator(++]) operator(=) operator(*)ident(s)operator(;) + ident(n)operator(++;) + ident(prev) operator(=) operator(*)ident(s)operator(;) + operator(}) + reserved(if) operator(()ident(n) operator(>) ident(len)operator(\)) operator({) + ident(buff)operator([)ident(i)operator(++]) operator(=) char('=')operator(;) + ident(buff)operator([)ident(i)operator(++]) operator(=) char('\\n')operator(;) + ident(n) operator(=) integer(0)operator(;) + ident(prev) operator(=) char('\\n')operator(;) + operator(}) + reserved(if) operator(()ident(i) operator(>) integer(1024) operator(-) integer(5)operator(\)) operator({) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(buff)operator(,) ident(i)operator(\);) + ident(i) operator(=) integer(0)operator(;) + operator(}) + ident(s)operator(++;) + operator(}) + reserved(if) operator(()ident(n) operator(>) integer(0)operator(\)) operator({) + ident(buff)operator([)ident(i)operator(++]) operator(=) char('=')operator(;) + ident(buff)operator([)ident(i)operator(++]) operator(=) char('\\n')operator(;) + operator(}) + reserved(if) operator(()ident(i) operator(>) integer(0)operator(\)) operator({) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(buff)operator(,) ident(i)operator(\);) + operator(}) +operator(}) + +directive(static) directive(inline) pre_type(int) +ident(hex2num)operator(()ident(c)operator(\)) + pre_type(char) ident(c)operator(;) +operator({) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('0')operator(:) reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) reserved(case) char('4')operator(:) + reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) reserved(case) char('7')operator(:) reserved(case) char('8')operator(:) reserved(case) char('9')operator(:) + reserved(return) ident(c) operator(-) char('0')operator(;) + reserved(case) char('a')operator(:) reserved(case) char('b')operator(:) reserved(case) char('c')operator(:) + reserved(case) char('d')operator(:) reserved(case) char('e')operator(:) reserved(case) char('f')operator(:) + reserved(return) ident(c) operator(-) char('a') operator(+) integer(10)operator(;) + reserved(case) char('A')operator(:) reserved(case) char('B')operator(:) reserved(case) char('C')operator(:) + reserved(case) char('D')operator(:) reserved(case) char('E')operator(:) reserved(case) char('F')operator(:) + reserved(return) ident(c) operator(-) char('A') operator(+) integer(10)operator(;) + reserved(default)operator(:) + reserved(return) operator(-)integer(1)operator(;) + operator(}) +operator(}) + +preprocessor(#define) ident(PACK_LENGTH_ADJUST_SIZE)operator(()ident(sz)operator(\)) reserved(do) operator({) \ + ident(tmp) operator(=) integer(0)operator(;) \ + reserved(if) operator(()ident(len) operator(>) operator(()ident(send)operator(-)ident(s)operator(\))operator(/)ident(sz)operator(\)) operator({) \ + reserved(if) operator((!)ident(star)operator(\)) operator({) \ + ident(tmp) operator(=) ident(len)operator(-()ident(send)operator(-)ident(s)operator(\))operator(/)ident(sz)operator(;) \ + operator(}) \ + ident(len) operator(=) operator(()ident(send)operator(-)ident(s)operator(\))operator(/)ident(sz)operator(;) \ + operator(}) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#ifdef) ident(NATINT_PACK) +preprocessor(#define) ident(PACK_LENGTH_ADJUST)operator(()ident(type)operator(,)ident(sz)operator(\)) reserved(do) operator({) \ + pre_type(int) ident(t__len) operator(=) ident(NATINT_LEN)operator(()ident(type)operator(,()ident(sz)operator(\)\);) \ + ident(PACK_LENGTH_ADJUST_SIZE)operator(()ident(t__len)operator(\);) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(PACK_LENGTH_ADJUST)operator(()ident(type)operator(,)ident(sz)operator(\)) \ + ident(PACK_LENGTH_ADJUST_SIZE)operator(()reserved(sizeof)operator(()ident(type)operator(\)\)) +preprocessor(#endif) + +preprocessor(#define) ident(PACK_ITEM_ADJUST)operator((\)) reserved(while) operator(()ident(tmp)operator(--\)) ident(rb_ary_push)operator(()ident(ary)operator(,) ident(Qnil)operator(\)) + +directive(static) ident(VALUE) +ident(infected_str_new)operator(()ident(ptr)operator(,) ident(len)operator(,) ident(str)operator(\)) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(s) operator(=) ident(rb_str_new)operator(()ident(ptr)operator(,) ident(len)operator(\);) + + ident(OBJ_INFECT)operator(()ident(s)operator(,) ident(str)operator(\);) + reserved(return) ident(s)operator(;) +operator(}) + +comment(/* + * call-seq: + * str.unpack(format\) => anArray + * + * Decodes <i>str</i> (which may contain binary data\) according to the + * format string, returning an array of each value extracted. The + * format string consists of a sequence of single-character directives, + * summarized in the table at the end of this entry. + * Each directive may be followed + * by a number, indicating the number of times to repeat with this + * directive. An asterisk (``<code>*</code>''\) will use up all + * remaining elements. The directives <code>sSiIlL</code> may each be + * followed by an underscore (``<code>_</code>''\) to use the underlying + * platform's native size for the specified type; otherwise, it uses a + * platform-independent consistent size. Spaces are ignored in the + * format string. See also <code>Array#pack</code>. + * + * "abc \\0\\0abc \\0\\0".unpack('A6Z6'\) #=> ["abc", "abc "] + * "abc \\0\\0".unpack('a3a3'\) #=> ["abc", " \\000\\000"] + * "abc \\0abc \\0".unpack('Z*Z*'\) #=> ["abc ", "abc "] + * "aa".unpack('b8B8'\) #=> ["10000110", "01100001"] + * "aaa".unpack('h2H2c'\) #=> ["16", "61", 97] + * "\\xfe\\xff\\xfe\\xff".unpack('sS'\) #=> [-2, 65534] + * "now=20is".unpack('M*'\) #=> ["now is"] + * "whole".unpack('xax2aX2aX1aX2a'\) #=> ["h", "e", "l", "l", "o"] + * + * This table summarizes the various formats and the Ruby classes + * returned by each. + * + * Format | Returns | Function + * -------+---------+----------------------------------------- + * A | String | with trailing nulls and spaces removed + * -------+---------+----------------------------------------- + * a | String | string + * -------+---------+----------------------------------------- + * B | String | extract bits from each character (msb first\) + * -------+---------+----------------------------------------- + * b | String | extract bits from each character (lsb first\) + * -------+---------+----------------------------------------- + * C | Fixnum | extract a character as an unsigned integer + * -------+---------+----------------------------------------- + * c | Fixnum | extract a character as an integer + * -------+---------+----------------------------------------- + * d,D | Float | treat sizeof(double\) characters as + * | | a native double + * -------+---------+----------------------------------------- + * E | Float | treat sizeof(double\) characters as + * | | a double in little-endian byte order + * -------+---------+----------------------------------------- + * e | Float | treat sizeof(float\) characters as + * | | a float in little-endian byte order + * -------+---------+----------------------------------------- + * f,F | Float | treat sizeof(float\) characters as + * | | a native float + * -------+---------+----------------------------------------- + * G | Float | treat sizeof(double\) characters as + * | | a double in network byte order + * -------+---------+----------------------------------------- + * g | Float | treat sizeof(float\) characters as a + * | | float in network byte order + * -------+---------+----------------------------------------- + * H | String | extract hex nibbles from each character + * | | (most significant first\) + * -------+---------+----------------------------------------- + * h | String | extract hex nibbles from each character + * | | (least significant first\) + * -------+---------+----------------------------------------- + * I | Integer | treat sizeof(int\) (modified by _\) + * | | successive characters as an unsigned + * | | native integer + * -------+---------+----------------------------------------- + * i | Integer | treat sizeof(int\) (modified by _\) + * | | successive characters as a signed + * | | native integer + * -------+---------+----------------------------------------- + * L | Integer | treat four (modified by _\) successive + * | | characters as an unsigned native + * | | long integer + * -------+---------+----------------------------------------- + * l | Integer | treat four (modified by _\) successive + * | | characters as a signed native + * | | long integer + * -------+---------+----------------------------------------- + * M | String | quoted-printable + * -------+---------+----------------------------------------- + * m | String | base64-encoded + * -------+---------+----------------------------------------- + * N | Integer | treat four characters as an unsigned + * | | long in network byte order + * -------+---------+----------------------------------------- + * n | Fixnum | treat two characters as an unsigned + * | | short in network byte order + * -------+---------+----------------------------------------- + * P | String | treat sizeof(char *\) characters as a + * | | pointer, and return \\emph{len} characters + * | | from the referenced location + * -------+---------+----------------------------------------- + * p | String | treat sizeof(char *\) characters as a + * | | pointer to a null-terminated string + * -------+---------+----------------------------------------- + * Q | Integer | treat 8 characters as an unsigned + * | | quad word (64 bits\) + * -------+---------+----------------------------------------- + * q | Integer | treat 8 characters as a signed + * | | quad word (64 bits\) + * -------+---------+----------------------------------------- + * S | Fixnum | treat two (different if _ used\) + * | | successive characters as an unsigned + * | | short in native byte order + * -------+---------+----------------------------------------- + * s | Fixnum | Treat two (different if _ used\) + * | | successive characters as a signed short + * | | in native byte order + * -------+---------+----------------------------------------- + * U | Integer | UTF-8 characters as unsigned integers + * -------+---------+----------------------------------------- + * u | String | UU-encoded + * -------+---------+----------------------------------------- + * V | Fixnum | treat four characters as an unsigned + * | | long in little-endian byte order + * -------+---------+----------------------------------------- + * v | Fixnum | treat two characters as an unsigned + * | | short in little-endian byte order + * -------+---------+----------------------------------------- + * w | Integer | BER-compressed integer (see Array.pack\) + * -------+---------+----------------------------------------- + * X | --- | skip backward one character + * -------+---------+----------------------------------------- + * x | --- | skip forward one character + * -------+---------+----------------------------------------- + * Z | String | with trailing nulls removed + * | | upto first null with * + * -------+---------+----------------------------------------- + * @ | --- | skip to the offset given by the + * | | length argument + * -------+---------+----------------------------------------- + */) + +directive(static) ident(VALUE) +ident(pack_unpack)operator(()ident(str)operator(,) ident(fmt)operator(\)) + ident(VALUE) ident(str)operator(,) ident(fmt)operator(;) +operator({) + directive(static) pre_type(char) operator(*)ident(hexdigits) operator(=) string<delimiter(")content(0123456789abcdef0123456789ABCDEFx)delimiter(")>operator(;) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(;) + pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + ident(VALUE) ident(ary)operator(;) + pre_type(char) ident(type)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(tmp)operator(,) ident(star)operator(;) +preprocessor(#ifdef) ident(NATINT_PACK) + pre_type(int) ident(natint)operator(;) comment(/* native integer */) +preprocessor(#endif) + + ident(StringValue)operator(()ident(str)operator(\);) + ident(StringValue)operator(()ident(fmt)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(p) operator(=) ident(RSTRING)operator(()ident(fmt)operator(\)->)ident(ptr)operator(;) + ident(pend) operator(=) ident(p) operator(+) ident(RSTRING)operator(()ident(fmt)operator(\)->)ident(len)operator(;) + + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(type) operator(=) operator(*)ident(p)operator(++;) +preprocessor(#ifdef) ident(NATINT_PACK) + ident(natint) operator(=) integer(0)operator(;) +preprocessor(#endif) + + reserved(if) operator(()ident(ISSPACE)operator(()ident(type)operator(\)\)) reserved(continue)operator(;) + reserved(if) operator(()ident(type) operator(==) char('#')operator(\)) operator({) + reserved(while) operator((()ident(p) operator(<) ident(pend)operator(\)) operator(&&) operator((*)ident(p) operator(!=) char('\\n')operator(\)\)) operator({) + ident(p)operator(++;) + operator(}) + reserved(continue)operator(;) + operator(}) + ident(star) operator(=) integer(0)operator(;) + reserved(if) operator((*)ident(p) operator(==) char('_') operator(||) operator(*)ident(p) operator(==) char('!')operator(\)) operator({) + pre_type(char) operator(*)ident(natstr) operator(=) string<delimiter(")content(sSiIlL)delimiter(")>operator(;) + + reserved(if) operator(()ident(strchr)operator(()ident(natstr)operator(,) ident(type)operator(\)\)) operator({) +preprocessor(#ifdef) ident(NATINT_PACK) + ident(natint) operator(=) integer(1)operator(;) +preprocessor(#endif) + ident(p)operator(++;) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content('%c' allowed only after types %s)delimiter(")>operator(,) operator(*)ident(p)operator(,) ident(natstr)operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(p) operator(>=) ident(pend)operator(\)) + ident(len) operator(=) integer(1)operator(;) + reserved(else) reserved(if) operator((*)ident(p) operator(==) char('*')operator(\)) operator({) + ident(star) operator(=) integer(1)operator(;) + ident(len) operator(=) ident(send) operator(-) ident(s)operator(;) + ident(p)operator(++;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISDIGIT)operator((*)ident(p)operator(\)\)) operator({) + ident(len) operator(=) ident(strtoul)operator(()ident(p)operator(,) operator(()pre_type(char)operator(**\)&)ident(p)operator(,) integer(10)operator(\);) + operator(}) + reserved(else) operator({) + ident(len) operator(=) operator(()ident(type) operator(!=) char('@')operator(\);) + operator(}) + + reserved(switch) operator(()ident(type)operator(\)) operator({) + reserved(case) char('%')operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(%% is not supported)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) char('A')operator(:) + reserved(if) operator(()ident(len) operator(>) ident(send) operator(-) ident(s)operator(\)) ident(len) operator(=) ident(send) operator(-) ident(s)operator(;) + operator({) + pre_type(long) ident(end) operator(=) ident(len)operator(;) + pre_type(char) operator(*)ident(t) operator(=) ident(s) operator(+) ident(len) operator(-) integer(1)operator(;) + + reserved(while) operator(()ident(t) operator(>=) ident(s)operator(\)) operator({) + reserved(if) operator((*)ident(t) operator(!=) char(' ') operator(&&) operator(*)ident(t) operator(!=) char('\\0')operator(\)) reserved(break)operator(;) + ident(t)operator(--;) ident(len)operator(--;) + operator(}) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(infected_str_new)operator(()ident(s)operator(,) ident(len)operator(,) ident(str)operator(\)\);) + ident(s) operator(+=) ident(end)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('Z')operator(:) + operator({) + pre_type(char) operator(*)ident(t) operator(=) ident(s)operator(;) + + reserved(if) operator(()ident(len) operator(>) ident(send)operator(-)ident(s)operator(\)) ident(len) operator(=) ident(send)operator(-)ident(s)operator(;) + reserved(while) operator(()ident(t) operator(<) ident(s)operator(+)ident(len) operator(&&) operator(*)ident(t)operator(\)) ident(t)operator(++;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(infected_str_new)operator(()ident(s)operator(,) ident(t)operator(-)ident(s)operator(,) ident(str)operator(\)\);) + reserved(if) operator(()ident(t) operator(<) ident(send)operator(\)) ident(t)operator(++;) + ident(s) operator(=) ident(star) operator(?) ident(t) operator(:) ident(s)operator(+)ident(len)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('a')operator(:) + reserved(if) operator(()ident(len) operator(>) ident(send) operator(-) ident(s)operator(\)) ident(len) operator(=) ident(send) operator(-) ident(s)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(infected_str_new)operator(()ident(s)operator(,) ident(len)operator(,) ident(str)operator(\)\);) + ident(s) operator(+=) ident(len)operator(;) + reserved(break)operator(;) + + reserved(case) char('b')operator(:) + operator({) + ident(VALUE) ident(bitstr)operator(;) + pre_type(char) operator(*)ident(t)operator(;) + pre_type(int) ident(bits)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(p)operator([-)integer(1)operator(]) operator(==) char('*') operator(||) ident(len) operator(>) operator(()ident(send) operator(-) ident(s)operator(\)) operator(*) integer(8)operator(\)) + ident(len) operator(=) operator(()ident(send) operator(-) ident(s)operator(\)) operator(*) integer(8)operator(;) + ident(bits) operator(=) integer(0)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(bitstr) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\)\);) + ident(t) operator(=) ident(RSTRING)operator(()ident(bitstr)operator(\)->)ident(ptr)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(i) operator(&) integer(7)operator(\)) ident(bits) operator(>>=) integer(1)operator(;) + reserved(else) ident(bits) operator(=) operator(*)ident(s)operator(++;) + operator(*)ident(t)operator(++) operator(=) operator(()ident(bits) operator(&) integer(1)operator(\)) operator(?) char('1') operator(:) char('0')operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) char('B')operator(:) + operator({) + ident(VALUE) ident(bitstr)operator(;) + pre_type(char) operator(*)ident(t)operator(;) + pre_type(int) ident(bits)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(p)operator([-)integer(1)operator(]) operator(==) char('*') operator(||) ident(len) operator(>) operator(()ident(send) operator(-) ident(s)operator(\)) operator(*) integer(8)operator(\)) + ident(len) operator(=) operator(()ident(send) operator(-) ident(s)operator(\)) operator(*) integer(8)operator(;) + ident(bits) operator(=) integer(0)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(bitstr) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\)\);) + ident(t) operator(=) ident(RSTRING)operator(()ident(bitstr)operator(\)->)ident(ptr)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(i) operator(&) integer(7)operator(\)) ident(bits) operator(<<=) integer(1)operator(;) + reserved(else) ident(bits) operator(=) operator(*)ident(s)operator(++;) + operator(*)ident(t)operator(++) operator(=) operator(()ident(bits) operator(&) integer(128)operator(\)) operator(?) char('1') operator(:) char('0')operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) char('h')operator(:) + operator({) + ident(VALUE) ident(bitstr)operator(;) + pre_type(char) operator(*)ident(t)operator(;) + pre_type(int) ident(bits)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(p)operator([-)integer(1)operator(]) operator(==) char('*') operator(||) ident(len) operator(>) operator(()ident(send) operator(-) ident(s)operator(\)) operator(*) integer(2)operator(\)) + ident(len) operator(=) operator(()ident(send) operator(-) ident(s)operator(\)) operator(*) integer(2)operator(;) + ident(bits) operator(=) integer(0)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(bitstr) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\)\);) + ident(t) operator(=) ident(RSTRING)operator(()ident(bitstr)operator(\)->)ident(ptr)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(i) operator(&) integer(1)operator(\)) + ident(bits) operator(>>=) integer(4)operator(;) + reserved(else) + ident(bits) operator(=) operator(*)ident(s)operator(++;) + operator(*)ident(t)operator(++) operator(=) ident(hexdigits)operator([)ident(bits) operator(&) integer(15)operator(];) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) char('H')operator(:) + operator({) + ident(VALUE) ident(bitstr)operator(;) + pre_type(char) operator(*)ident(t)operator(;) + pre_type(int) ident(bits)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(p)operator([-)integer(1)operator(]) operator(==) char('*') operator(||) ident(len) operator(>) operator(()ident(send) operator(-) ident(s)operator(\)) operator(*) integer(2)operator(\)) + ident(len) operator(=) operator(()ident(send) operator(-) ident(s)operator(\)) operator(*) integer(2)operator(;) + ident(bits) operator(=) integer(0)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(bitstr) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\)\);) + ident(t) operator(=) ident(RSTRING)operator(()ident(bitstr)operator(\)->)ident(ptr)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(i) operator(&) integer(1)operator(\)) + ident(bits) operator(<<=) integer(4)operator(;) + reserved(else) + ident(bits) operator(=) operator(*)ident(s)operator(++;) + operator(*)ident(t)operator(++) operator(=) ident(hexdigits)operator([()ident(bits) operator(>>) integer(4)operator(\)) operator(&) integer(15)operator(];) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) char('c')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(char)operator(,)reserved(sizeof)operator(()pre_type(char)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(int) ident(c) operator(=) operator(*)ident(s)operator(++;) + reserved(if) operator(()ident(c) operator(>) operator(()pre_type(char)operator(\))integer(127)operator(\)) ident(c)operator(-=)integer(256)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(INT2FIX)operator(()ident(c)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('C')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(unsigned) pre_type(char)operator(,)reserved(sizeof)operator(()pre_type(unsigned) pre_type(char)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(char) ident(c) operator(=) operator(*)ident(s)operator(++;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(INT2FIX)operator(()ident(c)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('s')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(short)operator(,)integer(2)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(short) ident(tmp) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(OFF16)operator((&)ident(tmp)operator(\),) ident(s)operator(,) ident(NATINT_LEN)operator(()pre_type(short)operator(,)integer(2)operator(\)\);) + ident(EXTEND16)operator(()ident(tmp)operator(\);) + ident(s) operator(+=) ident(NATINT_LEN)operator(()pre_type(short)operator(,)integer(2)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(INT2FIX)operator(()ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('S')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(unsigned) pre_type(short)operator(,)integer(2)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(short) ident(tmp) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(OFF16)operator((&)ident(tmp)operator(\),) ident(s)operator(,) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(short)operator(,)integer(2)operator(\)\);) + ident(s) operator(+=) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(short)operator(,)integer(2)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(INT2FIX)operator(()ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('i')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(int)operator(,)reserved(sizeof)operator(()pre_type(int)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(int) ident(tmp)operator(;) + ident(memcpy)operator((&)ident(tmp)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(int)operator(\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(int)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(INT2NUM)operator(()ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('I')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(unsigned) pre_type(int)operator(,)reserved(sizeof)operator(()pre_type(unsigned) pre_type(int)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(int) ident(tmp)operator(;) + ident(memcpy)operator((&)ident(tmp)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(unsigned) pre_type(int)operator(\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(unsigned) pre_type(int)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(UINT2NUM)operator(()ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('l')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(long)operator(,)integer(4)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(long) ident(tmp) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(OFF32)operator((&)ident(tmp)operator(\),) ident(s)operator(,) ident(NATINT_LEN)operator(()pre_type(long)operator(,)integer(4)operator(\)\);) + ident(EXTEND32)operator(()ident(tmp)operator(\);) + ident(s) operator(+=) ident(NATINT_LEN)operator(()pre_type(long)operator(,)integer(4)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(LONG2NUM)operator(()ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('L')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(unsigned) pre_type(long)operator(,)integer(4)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(long) ident(tmp) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(OFF32)operator((&)ident(tmp)operator(\),) ident(s)operator(,) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(long)operator(,)integer(4)operator(\)\);) + ident(s) operator(+=) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(long)operator(,)integer(4)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(ULONG2NUM)operator(()ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('q')operator(:) + ident(PACK_LENGTH_ADJUST_SIZE)operator(()ident(QUAD_SIZE)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(char) operator(*)ident(tmp) operator(=) operator(()pre_type(char)operator(*\))ident(s)operator(;) + ident(s) operator(+=) ident(QUAD_SIZE)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_quad_unpack)operator(()ident(tmp)operator(,) integer(1)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('Q')operator(:) + ident(PACK_LENGTH_ADJUST_SIZE)operator(()ident(QUAD_SIZE)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(char) operator(*)ident(tmp) operator(=) operator(()pre_type(char)operator(*\))ident(s)operator(;) + ident(s) operator(+=) ident(QUAD_SIZE)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_quad_unpack)operator(()ident(tmp)operator(,) integer(0)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('n')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(unsigned) pre_type(short)operator(,)integer(2)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(short) ident(tmp) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(OFF16B)operator((&)ident(tmp)operator(\),) ident(s)operator(,) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(short)operator(,)integer(2)operator(\)\);) + ident(s) operator(+=) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(short)operator(,)integer(2)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(UINT2NUM)operator(()ident(ntohs)operator(()ident(tmp)operator(\)\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('N')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(unsigned) pre_type(long)operator(,)integer(4)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(long) ident(tmp) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(OFF32B)operator((&)ident(tmp)operator(\),) ident(s)operator(,) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(long)operator(,)integer(4)operator(\)\);) + ident(s) operator(+=) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(long)operator(,)integer(4)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(ULONG2NUM)operator(()ident(ntohl)operator(()ident(tmp)operator(\)\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('v')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(unsigned) pre_type(short)operator(,)integer(2)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(short) ident(tmp) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(OFF16)operator((&)ident(tmp)operator(\),) ident(s)operator(,) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(short)operator(,)integer(2)operator(\)\);) + ident(s) operator(+=) ident(NATINT_LEN)operator(()pre_type(unsigned) pre_type(short)operator(,)integer(2)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(UINT2NUM)operator(()ident(vtohs)operator(()ident(tmp)operator(\)\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('V')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(unsigned) pre_type(long)operator(,)integer(4)operator(\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(unsigned) pre_type(long) ident(tmp) operator(=) integer(0)operator(;) + ident(memcpy)operator(()ident(OFF32)operator((&)ident(tmp)operator(\),) ident(s)operator(,) ident(NATINT_LEN)operator(()pre_type(long)operator(,)integer(4)operator(\)\);) + ident(s) operator(+=) ident(NATINT_LEN)operator(()pre_type(long)operator(,)integer(4)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(ULONG2NUM)operator(()ident(vtohl)operator(()ident(tmp)operator(\)\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('f')operator(:) + reserved(case) char('F')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(float)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(float) ident(tmp)operator(;) + ident(memcpy)operator((&)ident(tmp)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(float)operator(\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(float)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_float_new)operator((()pre_type(double)operator(\))ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('e')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(float)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(float) ident(tmp)operator(;) + ident(FLOAT_CONVWITH)operator(()ident(ftmp)operator(\);) + + ident(memcpy)operator((&)ident(tmp)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(float)operator(\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(float)operator(\);) + ident(tmp) operator(=) ident(VTOHF)operator(()ident(tmp)operator(,)ident(ftmp)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_float_new)operator((()pre_type(double)operator(\))ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('E')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(double)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(double) ident(tmp)operator(;) + ident(DOUBLE_CONVWITH)operator(()ident(dtmp)operator(\);) + + ident(memcpy)operator((&)ident(tmp)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(double)operator(\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(double)operator(\);) + ident(tmp) operator(=) ident(VTOHD)operator(()ident(tmp)operator(,)ident(dtmp)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_float_new)operator(()ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('D')operator(:) + reserved(case) char('d')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(double)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(double) ident(tmp)operator(;) + ident(memcpy)operator((&)ident(tmp)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(double)operator(\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(double)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_float_new)operator(()ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('g')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(float)operator(,)reserved(sizeof)operator(()pre_type(float)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(float) ident(tmp)operator(;) + ident(FLOAT_CONVWITH)operator(()ident(ftmp)operator(;\)) + + ident(memcpy)operator((&)ident(tmp)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(float)operator(\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(float)operator(\);) + ident(tmp) operator(=) ident(NTOHF)operator(()ident(tmp)operator(,)ident(ftmp)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_float_new)operator((()pre_type(double)operator(\))ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('G')operator(:) + ident(PACK_LENGTH_ADJUST)operator(()pre_type(double)operator(,)reserved(sizeof)operator(()pre_type(double)operator(\)\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + pre_type(double) ident(tmp)operator(;) + ident(DOUBLE_CONVWITH)operator(()ident(dtmp)operator(\);) + + ident(memcpy)operator((&)ident(tmp)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(double)operator(\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(double)operator(\);) + ident(tmp) operator(=) ident(NTOHD)operator(()ident(tmp)operator(,)ident(dtmp)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_float_new)operator(()ident(tmp)operator(\)\);) + operator(}) + ident(PACK_ITEM_ADJUST)operator((\);) + reserved(break)operator(;) + + reserved(case) char('U')operator(:) + reserved(if) operator(()ident(len) operator(>) ident(send) operator(-) ident(s)operator(\)) ident(len) operator(=) ident(send) operator(-) ident(s)operator(;) + reserved(while) operator(()ident(len) operator(>) integer(0) operator(&&) ident(s) operator(<) ident(send)operator(\)) operator({) + pre_type(long) ident(alen) operator(=) ident(send) operator(-) ident(s)operator(;) + pre_type(unsigned) pre_type(long) ident(l)operator(;) + + ident(l) operator(=) ident(utf8_to_uv)operator(()ident(s)operator(,) operator(&)ident(alen)operator(\);) + ident(s) operator(+=) ident(alen)operator(;) ident(len)operator(--;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(ULONG2NUM)operator(()ident(l)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('u')operator(:) + operator({) + ident(VALUE) ident(buf) operator(=) ident(infected_str_new)operator(()integer(0)operator(,) operator(()ident(send) operator(-) ident(s)operator(\)*)integer(3)operator(/)integer(4)operator(,) ident(str)operator(\);) + pre_type(char) operator(*)ident(ptr) operator(=) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(ptr)operator(;) + pre_type(long) ident(total) operator(=) integer(0)operator(;) + + reserved(while) operator(()ident(s) operator(<) ident(send) operator(&&) operator(*)ident(s) operator(>) char(' ') operator(&&) operator(*)ident(s) operator(<) char('a')operator(\)) operator({) + pre_type(long) ident(a)operator(,)ident(b)operator(,)ident(c)operator(,)ident(d)operator(;) + pre_type(char) ident(hunk)operator([)integer(4)operator(];) + + ident(hunk)operator([)integer(3)operator(]) operator(=) char('\\0')operator(;) + ident(len) operator(=) operator((*)ident(s)operator(++) operator(-) char(' ')operator(\)) operator(&) oct(077)operator(;) + ident(total) operator(+=) ident(len)operator(;) + reserved(if) operator(()ident(total) operator(>) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len)operator(\)) operator({) + ident(len) operator(-=) ident(total) operator(-) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len)operator(;) + ident(total) operator(=) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len)operator(;) + operator(}) + + reserved(while) operator(()ident(len) operator(>) integer(0)operator(\)) operator({) + pre_type(long) ident(mlen) operator(=) ident(len) operator(>) integer(3) operator(?) integer(3) operator(:) ident(len)operator(;) + + reserved(if) operator(()ident(s) operator(<) ident(send) operator(&&) operator(*)ident(s) operator(>=) char(' ')operator(\)) + ident(a) operator(=) operator((*)ident(s)operator(++) operator(-) char(' ')operator(\)) operator(&) oct(077)operator(;) + reserved(else) + ident(a) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(s) operator(<) ident(send) operator(&&) operator(*)ident(s) operator(>=) char(' ')operator(\)) + ident(b) operator(=) operator((*)ident(s)operator(++) operator(-) char(' ')operator(\)) operator(&) oct(077)operator(;) + reserved(else) + ident(b) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(s) operator(<) ident(send) operator(&&) operator(*)ident(s) operator(>=) char(' ')operator(\)) + ident(c) operator(=) operator((*)ident(s)operator(++) operator(-) char(' ')operator(\)) operator(&) oct(077)operator(;) + reserved(else) + ident(c) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(s) operator(<) ident(send) operator(&&) operator(*)ident(s) operator(>=) char(' ')operator(\)) + ident(d) operator(=) operator((*)ident(s)operator(++) operator(-) char(' ')operator(\)) operator(&) oct(077)operator(;) + reserved(else) + ident(d) operator(=) integer(0)operator(;) + ident(hunk)operator([)integer(0)operator(]) operator(=) ident(a) operator(<<) integer(2) operator(|) ident(b) operator(>>) integer(4)operator(;) + ident(hunk)operator([)integer(1)operator(]) operator(=) ident(b) operator(<<) integer(4) operator(|) ident(c) operator(>>) integer(2)operator(;) + ident(hunk)operator([)integer(2)operator(]) operator(=) ident(c) operator(<<) integer(6) operator(|) ident(d)operator(;) + ident(memcpy)operator(()ident(ptr)operator(,) ident(hunk)operator(,) ident(mlen)operator(\);) + ident(ptr) operator(+=) ident(mlen)operator(;) + ident(len) operator(-=) ident(mlen)operator(;) + operator(}) + reserved(if) operator((*)ident(s) operator(==) char('\\r')operator(\)) ident(s)operator(++;) + reserved(if) operator((*)ident(s) operator(==) char('\\n')operator(\)) ident(s)operator(++;) + reserved(else) reserved(if) operator(()ident(s) operator(<) ident(send) operator(&&) operator(()ident(s)operator(+)integer(1) operator(==) ident(send) operator(||) ident(s)operator([)integer(1)operator(]) operator(==) char('\\n')operator(\)\)) + ident(s) operator(+=) integer(2)operator(;) comment(/* possible checksum byte */) + operator(}) + + ident(RSTRING)operator(()ident(buf)operator(\)->)ident(ptr)operator([)ident(total)operator(]) operator(=) char('\\0')operator(;) + ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len) operator(=) ident(total)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(buf)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('m')operator(:) + operator({) + ident(VALUE) ident(buf) operator(=) ident(infected_str_new)operator(()integer(0)operator(,) operator(()ident(send) operator(-) ident(s)operator(\)*)integer(3)operator(/)integer(4)operator(,) ident(str)operator(\);) + pre_type(char) operator(*)ident(ptr) operator(=) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(ptr)operator(;) + pre_type(int) ident(a) operator(=) operator(-)integer(1)operator(,)ident(b) operator(=) operator(-)integer(1)operator(,)ident(c) operator(=) integer(0)operator(,)ident(d)operator(;) + directive(static) pre_type(int) ident(first) operator(=) integer(1)operator(;) + directive(static) pre_type(int) ident(b64_xtable)operator([)integer(256)operator(];) + + reserved(if) operator(()ident(first)operator(\)) operator({) + pre_type(int) ident(i)operator(;) + ident(first) operator(=) integer(0)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) integer(256)operator(;) ident(i)operator(++\)) operator({) + ident(b64_xtable)operator([)ident(i)operator(]) operator(=) operator(-)integer(1)operator(;) + operator(}) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) integer(64)operator(;) ident(i)operator(++\)) operator({) + ident(b64_xtable)operator([()pre_type(int)operator(\))ident(b64_table)operator([)ident(i)operator(]]) operator(=) ident(i)operator(;) + operator(}) + operator(}) + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + ident(a) operator(=) ident(b) operator(=) ident(c) operator(=) ident(d) operator(=) operator(-)integer(1)operator(;) + reserved(while)operator((()ident(a) operator(=) ident(b64_xtable)operator([()pre_type(int)operator(\)(*()pre_type(unsigned) pre_type(char)operator(*\))ident(s)operator(\)]\)) operator(==) operator(-)integer(1) operator(&&) ident(s) operator(<) ident(send)operator(\)) operator({) ident(s)operator(++;) operator(}) + reserved(if)operator(() ident(s) operator(>=) ident(send) operator(\)) reserved(break)operator(;) + ident(s)operator(++;) + reserved(while)operator((()ident(b) operator(=) ident(b64_xtable)operator([()pre_type(int)operator(\)(*()pre_type(unsigned) pre_type(char)operator(*\))ident(s)operator(\)]\)) operator(==) operator(-)integer(1) operator(&&) ident(s) operator(<) ident(send)operator(\)) operator({) ident(s)operator(++;) operator(}) + reserved(if)operator(() ident(s) operator(>=) ident(send) operator(\)) reserved(break)operator(;) + ident(s)operator(++;) + reserved(while)operator((()ident(c) operator(=) ident(b64_xtable)operator([()pre_type(int)operator(\)(*()pre_type(unsigned) pre_type(char)operator(*\))ident(s)operator(\)]\)) operator(==) operator(-)integer(1) operator(&&) ident(s) operator(<) ident(send)operator(\)) operator({) reserved(if)operator(() operator(*)ident(s) operator(==) char('=') operator(\)) reserved(break)operator(;) ident(s)operator(++;) operator(}) + reserved(if)operator(() operator(*)ident(s) operator(==) char('=') operator(||) ident(s) operator(>=) ident(send) operator(\)) reserved(break)operator(;) + ident(s)operator(++;) + reserved(while)operator((()ident(d) operator(=) ident(b64_xtable)operator([()pre_type(int)operator(\)(*()pre_type(unsigned) pre_type(char)operator(*\))ident(s)operator(\)]\)) operator(==) operator(-)integer(1) operator(&&) ident(s) operator(<) ident(send)operator(\)) operator({) reserved(if)operator(() operator(*)ident(s) operator(==) char('=') operator(\)) reserved(break)operator(;) ident(s)operator(++;) operator(}) + reserved(if)operator(() operator(*)ident(s) operator(==) char('=') operator(||) ident(s) operator(>=) ident(send) operator(\)) reserved(break)operator(;) + ident(s)operator(++;) + operator(*)ident(ptr)operator(++) operator(=) ident(a) operator(<<) integer(2) operator(|) ident(b) operator(>>) integer(4)operator(;) + operator(*)ident(ptr)operator(++) operator(=) ident(b) operator(<<) integer(4) operator(|) ident(c) operator(>>) integer(2)operator(;) + operator(*)ident(ptr)operator(++) operator(=) ident(c) operator(<<) integer(6) operator(|) ident(d)operator(;) + operator(}) + reserved(if) operator(()ident(a) operator(!=) operator(-)integer(1) operator(&&) ident(b) operator(!=) operator(-)integer(1)operator(\)) operator({) + reserved(if) operator(()ident(c) operator(==) operator(-)integer(1) operator(&&) operator(*)ident(s) operator(==) char('=')operator(\)) + operator(*)ident(ptr)operator(++) operator(=) ident(a) operator(<<) integer(2) operator(|) ident(b) operator(>>) integer(4)operator(;) + reserved(else) reserved(if) operator(()ident(c) operator(!=) operator(-)integer(1) operator(&&) operator(*)ident(s) operator(==) char('=')operator(\)) operator({) + operator(*)ident(ptr)operator(++) operator(=) ident(a) operator(<<) integer(2) operator(|) ident(b) operator(>>) integer(4)operator(;) + operator(*)ident(ptr)operator(++) operator(=) ident(b) operator(<<) integer(4) operator(|) ident(c) operator(>>) integer(2)operator(;) + operator(}) + operator(}) + operator(*)ident(ptr) operator(=) char('\\0')operator(;) + ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len) operator(=) ident(ptr) operator(-) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(ptr)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(buf)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('M')operator(:) + operator({) + ident(VALUE) ident(buf) operator(=) ident(infected_str_new)operator(()integer(0)operator(,) ident(send) operator(-) ident(s)operator(,) ident(str)operator(\);) + pre_type(char) operator(*)ident(ptr) operator(=) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(ptr)operator(;) + pre_type(int) ident(c1)operator(,) ident(c2)operator(;) + + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + reserved(if) operator((*)ident(s) operator(==) char('=')operator(\)) operator({) + reserved(if) operator((++)ident(s) operator(==) ident(send)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(s)operator(+)integer(1) operator(<) ident(send) operator(&&) operator(*)ident(s) operator(==) char('\\r') operator(&&) operator(*()ident(s)operator(+)integer(1)operator(\)) operator(==) char('\\n')operator(\)) + ident(s)operator(++;) + reserved(if) operator((*)ident(s) operator(!=) char('\\n')operator(\)) operator({) + reserved(if) operator((()ident(c1) operator(=) ident(hex2num)operator((*)ident(s)operator(\)\)) operator(==) operator(-)integer(1)operator(\)) reserved(break)operator(;) + reserved(if) operator((++)ident(s) operator(==) ident(send)operator(\)) reserved(break)operator(;) + reserved(if) operator((()ident(c2) operator(=) ident(hex2num)operator((*)ident(s)operator(\)\)) operator(==) operator(-)integer(1)operator(\)) reserved(break)operator(;) + operator(*)ident(ptr)operator(++) operator(=) ident(c1) operator(<<) integer(4) operator(|) ident(c2)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + operator(*)ident(ptr)operator(++) operator(=) operator(*)ident(s)operator(;) + operator(}) + ident(s)operator(++;) + operator(}) + operator(*)ident(ptr) operator(=) char('\\0')operator(;) + ident(RSTRING)operator(()ident(buf)operator(\)->)ident(len) operator(=) ident(ptr) operator(-) ident(RSTRING)operator(()ident(buf)operator(\)->)ident(ptr)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(buf)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('@')operator(:) + reserved(if) operator(()ident(len) operator(>) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(@ outside of string)delimiter(")>operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(len)operator(;) + reserved(break)operator(;) + + reserved(case) char('X')operator(:) + reserved(if) operator(()ident(len) operator(>) ident(s) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(X outside of string)delimiter(")>operator(\);) + ident(s) operator(-=) ident(len)operator(;) + reserved(break)operator(;) + + reserved(case) char('x')operator(:) + reserved(if) operator(()ident(len) operator(>) ident(send) operator(-) ident(s)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(x outside of string)delimiter(")>operator(\);) + ident(s) operator(+=) ident(len)operator(;) + reserved(break)operator(;) + + reserved(case) char('P')operator(:) + reserved(if) operator(()reserved(sizeof)operator(()pre_type(char) operator(*\)) operator(<=) ident(send) operator(-) ident(s)operator(\)) operator({) + pre_type(char) operator(*)ident(t)operator(;) + ident(VALUE) ident(tmp)operator(;) + + ident(memcpy)operator((&)ident(t)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(char) operator(*\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(char) operator(*\);) + + reserved(if) operator(()ident(t)operator(\)) operator({) + ident(VALUE) ident(a)operator(,) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + + reserved(if) operator((!()ident(a) operator(=) ident(rb_str_associated)operator(()ident(str)operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(no associated pointer)delimiter(")>operator(\);) + operator(}) + ident(p) operator(=) ident(RARRAY)operator(()ident(a)operator(\)->)ident(ptr)operator(;) + ident(pend) operator(=) ident(p) operator(+) ident(RARRAY)operator(()ident(a)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator((*)ident(p)operator(\)) operator(==) ident(T_STRING) operator(&&) ident(RSTRING)operator((*)ident(p)operator(\)->)ident(ptr) operator(==) ident(t)operator(\)) operator({) + reserved(if) operator(()ident(len) operator(<) ident(RSTRING)operator((*)ident(p)operator(\)->)ident(len)operator(\)) operator({) + ident(tmp) operator(=) ident(rb_tainted_str_new)operator(()ident(t)operator(,) ident(len)operator(\);) + ident(rb_str_associate)operator(()ident(tmp)operator(,) ident(a)operator(\);) + operator(}) + reserved(else) operator({) + ident(tmp) operator(=) operator(*)ident(p)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + ident(p)operator(++;) + operator(}) + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(non associated pointer)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(tmp) operator(=) ident(Qnil)operator(;) + operator(}) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(tmp)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('p')operator(:) + reserved(if) operator(()ident(len) operator(>) operator(()ident(send) operator(-) ident(s)operator(\)) operator(/) reserved(sizeof)operator(()pre_type(char) operator(*\)\)) + ident(len) operator(=) operator(()ident(send) operator(-) ident(s)operator(\)) operator(/) reserved(sizeof)operator(()pre_type(char) operator(*\);) + reserved(while) operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(send) operator(-) ident(s) operator(<) reserved(sizeof)operator(()pre_type(char) operator(*\)\)) + reserved(break)operator(;) + reserved(else) operator({) + ident(VALUE) ident(tmp)operator(;) + pre_type(char) operator(*)ident(t)operator(;) + + ident(memcpy)operator((&)ident(t)operator(,) ident(s)operator(,) reserved(sizeof)operator(()pre_type(char) operator(*\)\);) + ident(s) operator(+=) reserved(sizeof)operator(()pre_type(char) operator(*\);) + + reserved(if) operator(()ident(t)operator(\)) operator({) + ident(VALUE) ident(a)operator(,) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + + reserved(if) operator((!()ident(a) operator(=) ident(rb_str_associated)operator(()ident(str)operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(no associated pointer)delimiter(")>operator(\);) + operator(}) + ident(p) operator(=) ident(RARRAY)operator(()ident(a)operator(\)->)ident(ptr)operator(;) + ident(pend) operator(=) ident(p) operator(+) ident(RARRAY)operator(()ident(a)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator((*)ident(p)operator(\)) operator(==) ident(T_STRING) operator(&&) ident(RSTRING)operator((*)ident(p)operator(\)->)ident(ptr) operator(==) ident(t)operator(\)) operator({) + ident(tmp) operator(=) operator(*)ident(p)operator(;) + reserved(break)operator(;) + operator(}) + ident(p)operator(++;) + operator(}) + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(non associated pointer)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(tmp) operator(=) ident(Qnil)operator(;) + operator(}) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(tmp)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) char('w')operator(:) + operator({) + pre_type(unsigned) pre_type(long) ident(ul) operator(=) integer(0)operator(;) + pre_type(unsigned) pre_type(long) ident(ulmask) operator(=) hex(0xfe)ident(UL) operator(<<) operator((()reserved(sizeof)operator(()pre_type(unsigned) pre_type(long)operator(\)) operator(-) integer(1)operator(\)) operator(*) integer(8)operator(\);) + + reserved(while) operator(()ident(len) operator(>) integer(0) operator(&&) ident(s) operator(<) ident(send)operator(\)) operator({) + ident(ul) operator(<<=) integer(7)operator(;) + ident(ul) operator(|=) operator((*)ident(s) operator(&) hex(0x7f)operator(\);) + reserved(if) operator((!(*)ident(s)operator(++) operator(&) hex(0x80)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(ULONG2NUM)operator(()ident(ul)operator(\)\);) + ident(len)operator(--;) + ident(ul) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ul) operator(&) ident(ulmask)operator(\)) operator({) + ident(VALUE) ident(big) operator(=) ident(rb_uint2big)operator(()ident(ul)operator(\);) + ident(VALUE) ident(big128) operator(=) ident(rb_uint2big)operator(()integer(128)operator(\);) + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + ident(big) operator(=) ident(rb_big_mul)operator(()ident(big)operator(,) ident(big128)operator(\);) + ident(big) operator(=) ident(rb_big_plus)operator(()ident(big)operator(,) ident(rb_uint2big)operator((*)ident(s) operator(&) hex(0x7f)operator(\)\);) + reserved(if) operator((!(*)ident(s)operator(++) operator(&) hex(0x80)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(big)operator(\);) + ident(len)operator(--;) + ident(ul) operator(=) integer(0)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + + reserved(return) ident(ary)operator(;) +operator(}) + +preprocessor(#define) ident(BYTEWIDTH) integer(8) + +directive(static) pre_type(int) +ident(uv_to_utf8)operator(()ident(buf)operator(,) ident(uv)operator(\)) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(unsigned) pre_type(long) ident(uv)operator(;) +operator({) + reserved(if) operator(()ident(uv) operator(<=) hex(0x7f)operator(\)) operator({) + ident(buf)operator([)integer(0)operator(]) operator(=) operator(()pre_type(char)operator(\))ident(uv)operator(;) + reserved(return) integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(uv) operator(<=) hex(0x7ff)operator(\)) operator({) + ident(buf)operator([)integer(0)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(6)operator(\)&)hex(0xff)operator(\)|)hex(0xc0)operator(;) + ident(buf)operator([)integer(1)operator(]) operator(=) operator(()ident(uv)operator(&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + reserved(return) integer(2)operator(;) + operator(}) + reserved(if) operator(()ident(uv) operator(<=) hex(0xffff)operator(\)) operator({) + ident(buf)operator([)integer(0)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(12)operator(\)&)hex(0xff)operator(\)|)hex(0xe0)operator(;) + ident(buf)operator([)integer(1)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(6)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(2)operator(]) operator(=) operator(()ident(uv)operator(&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + reserved(return) integer(3)operator(;) + operator(}) + reserved(if) operator(()ident(uv) operator(<=) hex(0x1fffff)operator(\)) operator({) + ident(buf)operator([)integer(0)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(18)operator(\)&)hex(0xff)operator(\)|)hex(0xf0)operator(;) + ident(buf)operator([)integer(1)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(12)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(2)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(6)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(3)operator(]) operator(=) operator(()ident(uv)operator(&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + reserved(return) integer(4)operator(;) + operator(}) + reserved(if) operator(()ident(uv) operator(<=) hex(0x3ffffff)operator(\)) operator({) + ident(buf)operator([)integer(0)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(24)operator(\)&)hex(0xff)operator(\)|)hex(0xf8)operator(;) + ident(buf)operator([)integer(1)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(18)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(2)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(12)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(3)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(6)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(4)operator(]) operator(=) operator(()ident(uv)operator(&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + reserved(return) integer(5)operator(;) + operator(}) + reserved(if) operator(()ident(uv) operator(<=) hex(0x7fffffff)operator(\)) operator({) + ident(buf)operator([)integer(0)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(30)operator(\)&)hex(0xff)operator(\)|)hex(0xfc)operator(;) + ident(buf)operator([)integer(1)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(24)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(2)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(18)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(3)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(12)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(4)operator(]) operator(=) operator((()ident(uv)operator(>>)integer(6)operator(\)&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + ident(buf)operator([)integer(5)operator(]) operator(=) operator(()ident(uv)operator(&)hex(0x3f)operator(\)|)hex(0x80)operator(;) + reserved(return) integer(6)operator(;) + operator(}) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(pack(U\): value out of range)delimiter(")>operator(\);) +operator(}) + +directive(static) directive(const) pre_type(unsigned) pre_type(long) ident(utf8_limits)operator([]) operator(=) operator({) + hex(0x0)operator(,) comment(/* 1 */) + hex(0x80)operator(,) comment(/* 2 */) + hex(0x800)operator(,) comment(/* 3 */) + hex(0x10000)operator(,) comment(/* 4 */) + hex(0x200000)operator(,) comment(/* 5 */) + hex(0x4000000)operator(,) comment(/* 6 */) + hex(0x80000000)operator(,) comment(/* 7 */) +operator(};) + +directive(static) pre_type(unsigned) pre_type(long) +ident(utf8_to_uv)operator(()ident(p)operator(,) ident(lenp)operator(\)) + pre_type(char) operator(*)ident(p)operator(;) + pre_type(long) operator(*)ident(lenp)operator(;) +operator({) + pre_type(int) ident(c) operator(=) operator(*)ident(p)operator(++) operator(&) hex(0xff)operator(;) + pre_type(unsigned) pre_type(long) ident(uv) operator(=) ident(c)operator(;) + pre_type(long) ident(n)operator(;) + + reserved(if) operator((!()ident(uv) operator(&) hex(0x80)operator(\)\)) operator({) + operator(*)ident(lenp) operator(=) integer(1)operator(;) + reserved(return) ident(uv)operator(;) + operator(}) + reserved(if) operator((!()ident(uv) operator(&) hex(0x40)operator(\)\)) operator({) + operator(*)ident(lenp) operator(=) integer(1)operator(;) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(malformed UTF-8 character)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator((!()ident(uv) operator(&) hex(0x20)operator(\)\)) operator({) ident(n) operator(=) integer(2)operator(;) ident(uv) operator(&=) hex(0x1f)operator(;) operator(}) + reserved(else) reserved(if) operator((!()ident(uv) operator(&) hex(0x10)operator(\)\)) operator({) ident(n) operator(=) integer(3)operator(;) ident(uv) operator(&=) hex(0x0f)operator(;) operator(}) + reserved(else) reserved(if) operator((!()ident(uv) operator(&) hex(0x08)operator(\)\)) operator({) ident(n) operator(=) integer(4)operator(;) ident(uv) operator(&=) hex(0x07)operator(;) operator(}) + reserved(else) reserved(if) operator((!()ident(uv) operator(&) hex(0x04)operator(\)\)) operator({) ident(n) operator(=) integer(5)operator(;) ident(uv) operator(&=) hex(0x03)operator(;) operator(}) + reserved(else) reserved(if) operator((!()ident(uv) operator(&) hex(0x02)operator(\)\)) operator({) ident(n) operator(=) integer(6)operator(;) ident(uv) operator(&=) hex(0x01)operator(;) operator(}) + reserved(else) operator({) + operator(*)ident(lenp) operator(=) integer(1)operator(;) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(malformed UTF-8 character)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(n) operator(>) operator(*)ident(lenp)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(malformed UTF-8 character (expected %d bytes, given %d bytes\))delimiter(")>operator(,) + ident(n)operator(,) operator(*)ident(lenp)operator(\);) + operator(}) + operator(*)ident(lenp) operator(=) ident(n)operator(--;) + reserved(if) operator(()ident(n) operator(!=) integer(0)operator(\)) operator({) + reserved(while) operator(()ident(n)operator(--\)) operator({) + ident(c) operator(=) operator(*)ident(p)operator(++) operator(&) hex(0xff)operator(;) + reserved(if) operator((()ident(c) operator(&) hex(0xc0)operator(\)) operator(!=) hex(0x80)operator(\)) operator({) + operator(*)ident(lenp) operator(-=) ident(n) operator(+) integer(1)operator(;) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(malformed UTF-8 character)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(c) operator(&=) hex(0x3f)operator(;) + ident(uv) operator(=) ident(uv) operator(<<) integer(6) operator(|) ident(c)operator(;) + operator(}) + operator(}) + operator(}) + ident(n) operator(=) operator(*)ident(lenp) operator(-) integer(1)operator(;) + reserved(if) operator(()ident(uv) operator(<) ident(utf8_limits)operator([)ident(n)operator(]\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(redundant UTF-8 sequence)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(uv)operator(;) +operator(}) + +directive(void) +ident(Init_pack)operator((\)) +operator({) + ident(rb_define_method)operator(()ident(rb_cArray)operator(,) string<delimiter(")content(pack)delimiter(")>operator(,) ident(pack_pack)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(unpack)delimiter(")>operator(,) ident(pack_unpack)operator(,) integer(1)operator(\);) +operator(}) +comment(/* A Bison parser, made by GNU Bison 2.3. */) + +comment(/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C\) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option\) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */) + +comment(/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option\) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */) + +comment(/* C LALR(1\) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */) + +comment(/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */) + +comment(/* Identify Bison output. */) +preprocessor(#define) ident(YYBISON) integer(1) + +comment(/* Bison version. */) +preprocessor(#define) ident(YYBISON_VERSION) string<delimiter(")content(2.3)delimiter(")> + +comment(/* Skeleton name. */) +preprocessor(#define) ident(YYSKELETON_NAME) string<delimiter(")content(yacc.c)delimiter(")> + +comment(/* Pure parsers. */) +preprocessor(#define) ident(YYPURE) integer(0) + +comment(/* Using locations. */) +preprocessor(#define) ident(YYLSP_NEEDED) integer(0) + + + +comment(/* Tokens. */) +preprocessor(#ifndef) ident(YYTOKENTYPE) +preprocessor(# define) ident(YYTOKENTYPE) + comment(/* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */) + reserved(enum) ident(yytokentype) operator({) + ident(kCLASS) operator(=) integer(258)operator(,) + ident(kMODULE) operator(=) integer(259)operator(,) + ident(kDEF) operator(=) integer(260)operator(,) + ident(kUNDEF) operator(=) integer(261)operator(,) + ident(kBEGIN) operator(=) integer(262)operator(,) + ident(kRESCUE) operator(=) integer(263)operator(,) + ident(kENSURE) operator(=) integer(264)operator(,) + ident(kEND) operator(=) integer(265)operator(,) + ident(kIF) operator(=) integer(266)operator(,) + ident(kUNLESS) operator(=) integer(267)operator(,) + ident(kTHEN) operator(=) integer(268)operator(,) + ident(kELSIF) operator(=) integer(269)operator(,) + ident(kELSE) operator(=) integer(270)operator(,) + ident(kCASE) operator(=) integer(271)operator(,) + ident(kWHEN) operator(=) integer(272)operator(,) + ident(kWHILE) operator(=) integer(273)operator(,) + ident(kUNTIL) operator(=) integer(274)operator(,) + ident(kFOR) operator(=) integer(275)operator(,) + ident(kBREAK) operator(=) integer(276)operator(,) + ident(kNEXT) operator(=) integer(277)operator(,) + ident(kREDO) operator(=) integer(278)operator(,) + ident(kRETRY) operator(=) integer(279)operator(,) + ident(kIN) operator(=) integer(280)operator(,) + ident(kDO) operator(=) integer(281)operator(,) + ident(kDO_COND) operator(=) integer(282)operator(,) + ident(kDO_BLOCK) operator(=) integer(283)operator(,) + ident(kRETURN) operator(=) integer(284)operator(,) + ident(kYIELD) operator(=) integer(285)operator(,) + ident(kSUPER) operator(=) integer(286)operator(,) + ident(kSELF) operator(=) integer(287)operator(,) + ident(kNIL) operator(=) integer(288)operator(,) + ident(kTRUE) operator(=) integer(289)operator(,) + ident(kFALSE) operator(=) integer(290)operator(,) + ident(kAND) operator(=) integer(291)operator(,) + ident(kOR) operator(=) integer(292)operator(,) + ident(kNOT) operator(=) integer(293)operator(,) + ident(kIF_MOD) operator(=) integer(294)operator(,) + ident(kUNLESS_MOD) operator(=) integer(295)operator(,) + ident(kWHILE_MOD) operator(=) integer(296)operator(,) + ident(kUNTIL_MOD) operator(=) integer(297)operator(,) + ident(kRESCUE_MOD) operator(=) integer(298)operator(,) + ident(kALIAS) operator(=) integer(299)operator(,) + ident(kDEFINED) operator(=) integer(300)operator(,) + ident(klBEGIN) operator(=) integer(301)operator(,) + ident(klEND) operator(=) integer(302)operator(,) + ident(k__LINE__) operator(=) integer(303)operator(,) + ident(k__FILE__) operator(=) integer(304)operator(,) + ident(tIDENTIFIER) operator(=) integer(305)operator(,) + ident(tFID) operator(=) integer(306)operator(,) + ident(tGVAR) operator(=) integer(307)operator(,) + ident(tIVAR) operator(=) integer(308)operator(,) + ident(tCONSTANT) operator(=) integer(309)operator(,) + ident(tCVAR) operator(=) integer(310)operator(,) + ident(tINTEGER) operator(=) integer(311)operator(,) + ident(tFLOAT) operator(=) integer(312)operator(,) + ident(tSTRING_CONTENT) operator(=) integer(313)operator(,) + ident(tNTH_REF) operator(=) integer(314)operator(,) + ident(tBACK_REF) operator(=) integer(315)operator(,) + ident(tREGEXP_END) operator(=) integer(316)operator(,) + ident(tUPLUS) operator(=) integer(317)operator(,) + ident(tUMINUS) operator(=) integer(318)operator(,) + ident(tPOW) operator(=) integer(319)operator(,) + ident(tCMP) operator(=) integer(320)operator(,) + ident(tEQ) operator(=) integer(321)operator(,) + ident(tEQQ) operator(=) integer(322)operator(,) + ident(tNEQ) operator(=) integer(323)operator(,) + ident(tGEQ) operator(=) integer(324)operator(,) + ident(tLEQ) operator(=) integer(325)operator(,) + ident(tANDOP) operator(=) integer(326)operator(,) + ident(tOROP) operator(=) integer(327)operator(,) + ident(tMATCH) operator(=) integer(328)operator(,) + ident(tNMATCH) operator(=) integer(329)operator(,) + ident(tDOT2) operator(=) integer(330)operator(,) + ident(tDOT3) operator(=) integer(331)operator(,) + ident(tAREF) operator(=) integer(332)operator(,) + ident(tASET) operator(=) integer(333)operator(,) + ident(tLSHFT) operator(=) integer(334)operator(,) + ident(tRSHFT) operator(=) integer(335)operator(,) + ident(tCOLON2) operator(=) integer(336)operator(,) + ident(tCOLON3) operator(=) integer(337)operator(,) + ident(tOP_ASGN) operator(=) integer(338)operator(,) + ident(tASSOC) operator(=) integer(339)operator(,) + ident(tLPAREN) operator(=) integer(340)operator(,) + ident(tLPAREN_ARG) operator(=) integer(341)operator(,) + ident(tRPAREN) operator(=) integer(342)operator(,) + ident(tLBRACK) operator(=) integer(343)operator(,) + ident(tLBRACE) operator(=) integer(344)operator(,) + ident(tLBRACE_ARG) operator(=) integer(345)operator(,) + ident(tSTAR) operator(=) integer(346)operator(,) + ident(tAMPER) operator(=) integer(347)operator(,) + ident(tSYMBEG) operator(=) integer(348)operator(,) + ident(tSTRING_BEG) operator(=) integer(349)operator(,) + ident(tXSTRING_BEG) operator(=) integer(350)operator(,) + ident(tREGEXP_BEG) operator(=) integer(351)operator(,) + ident(tWORDS_BEG) operator(=) integer(352)operator(,) + ident(tQWORDS_BEG) operator(=) integer(353)operator(,) + ident(tSTRING_DBEG) operator(=) integer(354)operator(,) + ident(tSTRING_DVAR) operator(=) integer(355)operator(,) + ident(tSTRING_END) operator(=) integer(356)operator(,) + ident(tLOWEST) operator(=) integer(357)operator(,) + ident(tUMINUS_NUM) operator(=) integer(358)operator(,) + ident(tLAST_TOKEN) operator(=) integer(359) + operator(};) +preprocessor(#endif) +comment(/* Tokens. */) +preprocessor(#define) ident(kCLASS) integer(258) +preprocessor(#define) ident(kMODULE) integer(259) +preprocessor(#define) ident(kDEF) integer(260) +preprocessor(#define) ident(kUNDEF) integer(261) +preprocessor(#define) ident(kBEGIN) integer(262) +preprocessor(#define) ident(kRESCUE) integer(263) +preprocessor(#define) ident(kENSURE) integer(264) +preprocessor(#define) ident(kEND) integer(265) +preprocessor(#define) ident(kIF) integer(266) +preprocessor(#define) ident(kUNLESS) integer(267) +preprocessor(#define) ident(kTHEN) integer(268) +preprocessor(#define) ident(kELSIF) integer(269) +preprocessor(#define) ident(kELSE) integer(270) +preprocessor(#define) ident(kCASE) integer(271) +preprocessor(#define) ident(kWHEN) integer(272) +preprocessor(#define) ident(kWHILE) integer(273) +preprocessor(#define) ident(kUNTIL) integer(274) +preprocessor(#define) ident(kFOR) integer(275) +preprocessor(#define) ident(kBREAK) integer(276) +preprocessor(#define) ident(kNEXT) integer(277) +preprocessor(#define) ident(kREDO) integer(278) +preprocessor(#define) ident(kRETRY) integer(279) +preprocessor(#define) ident(kIN) integer(280) +preprocessor(#define) ident(kDO) integer(281) +preprocessor(#define) ident(kDO_COND) integer(282) +preprocessor(#define) ident(kDO_BLOCK) integer(283) +preprocessor(#define) ident(kRETURN) integer(284) +preprocessor(#define) ident(kYIELD) integer(285) +preprocessor(#define) ident(kSUPER) integer(286) +preprocessor(#define) ident(kSELF) integer(287) +preprocessor(#define) ident(kNIL) integer(288) +preprocessor(#define) ident(kTRUE) integer(289) +preprocessor(#define) ident(kFALSE) integer(290) +preprocessor(#define) ident(kAND) integer(291) +preprocessor(#define) ident(kOR) integer(292) +preprocessor(#define) ident(kNOT) integer(293) +preprocessor(#define) ident(kIF_MOD) integer(294) +preprocessor(#define) ident(kUNLESS_MOD) integer(295) +preprocessor(#define) ident(kWHILE_MOD) integer(296) +preprocessor(#define) ident(kUNTIL_MOD) integer(297) +preprocessor(#define) ident(kRESCUE_MOD) integer(298) +preprocessor(#define) ident(kALIAS) integer(299) +preprocessor(#define) ident(kDEFINED) integer(300) +preprocessor(#define) ident(klBEGIN) integer(301) +preprocessor(#define) ident(klEND) integer(302) +preprocessor(#define) ident(k__LINE__) integer(303) +preprocessor(#define) ident(k__FILE__) integer(304) +preprocessor(#define) ident(tIDENTIFIER) integer(305) +preprocessor(#define) ident(tFID) integer(306) +preprocessor(#define) ident(tGVAR) integer(307) +preprocessor(#define) ident(tIVAR) integer(308) +preprocessor(#define) ident(tCONSTANT) integer(309) +preprocessor(#define) ident(tCVAR) integer(310) +preprocessor(#define) ident(tINTEGER) integer(311) +preprocessor(#define) ident(tFLOAT) integer(312) +preprocessor(#define) ident(tSTRING_CONTENT) integer(313) +preprocessor(#define) ident(tNTH_REF) integer(314) +preprocessor(#define) ident(tBACK_REF) integer(315) +preprocessor(#define) ident(tREGEXP_END) integer(316) +preprocessor(#define) ident(tUPLUS) integer(317) +preprocessor(#define) ident(tUMINUS) integer(318) +preprocessor(#define) ident(tPOW) integer(319) +preprocessor(#define) ident(tCMP) integer(320) +preprocessor(#define) ident(tEQ) integer(321) +preprocessor(#define) ident(tEQQ) integer(322) +preprocessor(#define) ident(tNEQ) integer(323) +preprocessor(#define) ident(tGEQ) integer(324) +preprocessor(#define) ident(tLEQ) integer(325) +preprocessor(#define) ident(tANDOP) integer(326) +preprocessor(#define) ident(tOROP) integer(327) +preprocessor(#define) ident(tMATCH) integer(328) +preprocessor(#define) ident(tNMATCH) integer(329) +preprocessor(#define) ident(tDOT2) integer(330) +preprocessor(#define) ident(tDOT3) integer(331) +preprocessor(#define) ident(tAREF) integer(332) +preprocessor(#define) ident(tASET) integer(333) +preprocessor(#define) ident(tLSHFT) integer(334) +preprocessor(#define) ident(tRSHFT) integer(335) +preprocessor(#define) ident(tCOLON2) integer(336) +preprocessor(#define) ident(tCOLON3) integer(337) +preprocessor(#define) ident(tOP_ASGN) integer(338) +preprocessor(#define) ident(tASSOC) integer(339) +preprocessor(#define) ident(tLPAREN) integer(340) +preprocessor(#define) ident(tLPAREN_ARG) integer(341) +preprocessor(#define) ident(tRPAREN) integer(342) +preprocessor(#define) ident(tLBRACK) integer(343) +preprocessor(#define) ident(tLBRACE) integer(344) +preprocessor(#define) ident(tLBRACE_ARG) integer(345) +preprocessor(#define) ident(tSTAR) integer(346) +preprocessor(#define) ident(tAMPER) integer(347) +preprocessor(#define) ident(tSYMBEG) integer(348) +preprocessor(#define) ident(tSTRING_BEG) integer(349) +preprocessor(#define) ident(tXSTRING_BEG) integer(350) +preprocessor(#define) ident(tREGEXP_BEG) integer(351) +preprocessor(#define) ident(tWORDS_BEG) integer(352) +preprocessor(#define) ident(tQWORDS_BEG) integer(353) +preprocessor(#define) ident(tSTRING_DBEG) integer(354) +preprocessor(#define) ident(tSTRING_DVAR) integer(355) +preprocessor(#define) ident(tSTRING_END) integer(356) +preprocessor(#define) ident(tLOWEST) integer(357) +preprocessor(#define) ident(tUMINUS_NUM) integer(358) +preprocessor(#define) ident(tLAST_TOKEN) integer(359) + + + + +comment(/* Copy the first part of user declarations. */) +preprocessor(#line) integer(13) string<delimiter(")content(parse.y)delimiter(")> + + +preprocessor(#define) ident(YYDEBUG) integer(1) +preprocessor(#define) ident(YYERROR_VERBOSE) integer(1) +preprocessor(#ifndef) ident(YYSTACK_USE_ALLOCA) +preprocessor(#define) ident(YYSTACK_USE_ALLOCA) integer(0) +preprocessor(#endif) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("env.h") +preprocessor(#include) include("intern.h") +preprocessor(#include) include("node.h") +preprocessor(#include) include("st.h") +preprocessor(#include) include(<stdio.h>) +preprocessor(#include) include(<errno.h>) +preprocessor(#include) include(<ctype.h>) + +preprocessor(#define) ident(YYMALLOC) ident(rb_parser_malloc) +preprocessor(#define) ident(YYREALLOC) ident(rb_parser_realloc) +preprocessor(#define) ident(YYCALLOC) ident(rb_parser_calloc) +preprocessor(#define) ident(YYFREE) ident(rb_parser_free) +preprocessor(#define) ident(malloc) ident(YYMALLOC) +preprocessor(#define) ident(realloc) ident(YYREALLOC) +preprocessor(#define) ident(calloc) ident(YYCALLOC) +preprocessor(#define) ident(free) ident(YYFREE) +directive(static) directive(void) operator(*)ident(rb_parser_malloc) ident(_)operator((()ident(size_t)operator(\)\);) +directive(static) directive(void) operator(*)ident(rb_parser_realloc) ident(_)operator((()directive(void) operator(*,) ident(size_t)operator(\)\);) +directive(static) directive(void) operator(*)ident(rb_parser_calloc) ident(_)operator((()ident(size_t)operator(,) ident(size_t)operator(\)\);) +directive(static) directive(void) ident(rb_parser_free) ident(_)operator((()directive(void) operator(*\)\);) + +preprocessor(#define) ident(yyparse) ident(ruby_yyparse) +preprocessor(#define) ident(yylex) ident(ruby_yylex) +preprocessor(#define) ident(yyerror) ident(ruby_yyerror) +preprocessor(#define) ident(yylval) ident(ruby_yylval) +preprocessor(#define) ident(yychar) ident(ruby_yychar) +preprocessor(#define) ident(yydebug) ident(ruby_yydebug) + +preprocessor(#define) ident(ID_SCOPE_SHIFT) integer(3) +preprocessor(#define) ident(ID_SCOPE_MASK) hex(0x07) +preprocessor(#define) ident(ID_LOCAL) hex(0x01) +preprocessor(#define) ident(ID_INSTANCE) hex(0x02) +preprocessor(#define) ident(ID_GLOBAL) hex(0x03) +preprocessor(#define) ident(ID_ATTRSET) hex(0x04) +preprocessor(#define) ident(ID_CONST) hex(0x05) +preprocessor(#define) ident(ID_CLASS) hex(0x06) +preprocessor(#define) ident(ID_JUNK) hex(0x07) +preprocessor(#define) ident(ID_INTERNAL) ident(ID_JUNK) + +preprocessor(#define) ident(is_notop_id)operator(()ident(id)operator(\)) operator((()ident(id)operator(\)>)ident(tLAST_TOKEN)operator(\)) +preprocessor(#define) ident(is_local_id)operator(()ident(id)operator(\)) operator(()ident(is_notop_id)operator(()ident(id)operator(\)&&(()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)==)ident(ID_LOCAL)operator(\)) +preprocessor(#define) ident(is_global_id)operator(()ident(id)operator(\)) operator(()ident(is_notop_id)operator(()ident(id)operator(\)&&(()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)==)ident(ID_GLOBAL)operator(\)) +preprocessor(#define) ident(is_instance_id)operator(()ident(id)operator(\)) operator(()ident(is_notop_id)operator(()ident(id)operator(\)&&(()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)==)ident(ID_INSTANCE)operator(\)) +preprocessor(#define) ident(is_attrset_id)operator(()ident(id)operator(\)) operator(()ident(is_notop_id)operator(()ident(id)operator(\)&&(()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)==)ident(ID_ATTRSET)operator(\)) +preprocessor(#define) ident(is_const_id)operator(()ident(id)operator(\)) operator(()ident(is_notop_id)operator(()ident(id)operator(\)&&(()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)==)ident(ID_CONST)operator(\)) +preprocessor(#define) ident(is_class_id)operator(()ident(id)operator(\)) operator(()ident(is_notop_id)operator(()ident(id)operator(\)&&(()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)==)ident(ID_CLASS)operator(\)) +preprocessor(#define) ident(is_junk_id)operator(()ident(id)operator(\)) operator(()ident(is_notop_id)operator(()ident(id)operator(\)&&(()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)==)ident(ID_JUNK)operator(\)) + +preprocessor(#define) ident(is_asgn_or_id)operator(()ident(id)operator(\)) operator((()ident(is_notop_id)operator(()ident(id)operator(\)\)) operator(&&) \ + operator(((()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)) operator(==) ident(ID_GLOBAL) operator(||) \ + operator((()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)) operator(==) ident(ID_INSTANCE) operator(||) \ + operator((()ident(id)operator(\)&)ident(ID_SCOPE_MASK)operator(\)) operator(==) ident(ID_CLASS)operator(\)\)) + +ident(NODE) operator(*)ident(ruby_eval_tree_begin) operator(=) integer(0)operator(;) +ident(NODE) operator(*)ident(ruby_eval_tree) operator(=) integer(0)operator(;) + +pre_type(char) operator(*)ident(ruby_sourcefile)operator(;) comment(/* current source file */) +pre_type(int) ident(ruby_sourceline)operator(;) comment(/* current line no. */) + +directive(static) pre_type(int) ident(yylex)operator((\);) +directive(static) pre_type(int) ident(yyerror)operator((\);) + +directive(static) reserved(enum) ident(lex_state) operator({) + ident(EXPR_BEG)operator(,) comment(/* ignore newline, +/- is a sign. */) + ident(EXPR_END)operator(,) comment(/* newline significant, +/- is an operator. */) + ident(EXPR_ARG)operator(,) comment(/* newline significant, +/- is an operator. */) + ident(EXPR_CMDARG)operator(,) comment(/* newline significant, +/- is an operator. */) + ident(EXPR_ENDARG)operator(,) comment(/* newline significant, +/- is an operator. */) + ident(EXPR_MID)operator(,) comment(/* newline significant, +/- is an operator. */) + ident(EXPR_FNAME)operator(,) comment(/* ignore newline, no reserved words. */) + ident(EXPR_DOT)operator(,) comment(/* right after `.' or `::', no reserved words. */) + ident(EXPR_CLASS)operator(,) comment(/* immediate after `class', no here document. */) +operator(}) ident(lex_state)operator(;) +directive(static) ident(NODE) operator(*)ident(lex_strterm)operator(;) + +preprocessor(#ifdef) ident(HAVE_LONG_LONG) +reserved(typedef) pre_type(unsigned) ident(LONG_LONG) ident(stack_type)operator(;) +preprocessor(#else) +reserved(typedef) pre_type(unsigned) pre_type(long) ident(stack_type)operator(;) +preprocessor(#endif) + +preprocessor(#define) ident(BITSTACK_PUSH)operator(()ident(stack)operator(,) ident(n)operator(\)) operator(()ident(stack) operator(=) operator(()ident(stack)operator(<<)integer(1)operator(\)|(()ident(n)operator(\)&)integer(1)operator(\)\)) +preprocessor(#define) ident(BITSTACK_POP)operator(()ident(stack)operator(\)) operator(()ident(stack) operator(>>=) integer(1)operator(\)) +preprocessor(#define) ident(BITSTACK_LEXPOP)operator(()ident(stack)operator(\)) operator(()ident(stack) operator(=) operator(()ident(stack) operator(>>) integer(1)operator(\)) operator(|) operator(()ident(stack) operator(&) integer(1)operator(\)\)) +preprocessor(#define) ident(BITSTACK_SET_P)operator(()ident(stack)operator(\)) operator(()ident(stack)operator(&)integer(1)operator(\)) + +directive(static) ident(stack_type) ident(cond_stack) operator(=) integer(0)operator(;) +preprocessor(#define) ident(COND_PUSH)operator(()ident(n)operator(\)) ident(BITSTACK_PUSH)operator(()ident(cond_stack)operator(,) ident(n)operator(\)) +preprocessor(#define) ident(COND_POP)operator((\)) ident(BITSTACK_POP)operator(()ident(cond_stack)operator(\)) +preprocessor(#define) ident(COND_LEXPOP)operator((\)) ident(BITSTACK_LEXPOP)operator(()ident(cond_stack)operator(\)) +preprocessor(#define) ident(COND_P)operator((\)) ident(BITSTACK_SET_P)operator(()ident(cond_stack)operator(\)) + +directive(static) ident(stack_type) ident(cmdarg_stack) operator(=) integer(0)operator(;) +preprocessor(#define) ident(CMDARG_PUSH)operator(()ident(n)operator(\)) ident(BITSTACK_PUSH)operator(()ident(cmdarg_stack)operator(,) ident(n)operator(\)) +preprocessor(#define) ident(CMDARG_POP)operator((\)) ident(BITSTACK_POP)operator(()ident(cmdarg_stack)operator(\)) +preprocessor(#define) ident(CMDARG_LEXPOP)operator((\)) ident(BITSTACK_LEXPOP)operator(()ident(cmdarg_stack)operator(\)) +preprocessor(#define) ident(CMDARG_P)operator((\)) ident(BITSTACK_SET_P)operator(()ident(cmdarg_stack)operator(\)) + +directive(static) pre_type(int) ident(class_nest) operator(=) integer(0)operator(;) +directive(static) pre_type(int) ident(in_single) operator(=) integer(0)operator(;) +directive(static) pre_type(int) ident(in_def) operator(=) integer(0)operator(;) +directive(static) pre_type(int) ident(compile_for_eval) operator(=) integer(0)operator(;) +directive(static) ident(ID) ident(cur_mid) operator(=) integer(0)operator(;) +directive(static) pre_type(int) ident(command_start) operator(=) ident(Qtrue)operator(;) + +directive(static) ident(NODE) operator(*)ident(deferred_nodes)operator(;) + +directive(static) ident(NODE) operator(*)ident(cond)operator((\);) +directive(static) ident(NODE) operator(*)ident(logop)operator((\);) +directive(static) pre_type(int) ident(cond_negative)operator((\);) + +directive(static) ident(NODE) operator(*)ident(newline_node)operator((\);) +directive(static) directive(void) ident(fixpos)operator((\);) + +directive(static) pre_type(int) ident(value_expr0)operator((\);) +directive(static) directive(void) ident(void_expr0)operator((\);) +directive(static) directive(void) ident(void_stmts)operator((\);) +directive(static) ident(NODE) operator(*)ident(remove_begin)operator((\);) +preprocessor(#define) ident(value_expr)operator(()ident(node)operator(\)) ident(value_expr0)operator((()ident(node)operator(\)) operator(=) ident(remove_begin)operator(()ident(node)operator(\)\)) +preprocessor(#define) ident(void_expr)operator(()ident(node)operator(\)) ident(void_expr0)operator((()ident(node)operator(\)) operator(=) ident(remove_begin)operator(()ident(node)operator(\)\)) + +directive(static) ident(NODE) operator(*)ident(block_append)operator((\);) +directive(static) ident(NODE) operator(*)ident(list_append)operator((\);) +directive(static) ident(NODE) operator(*)ident(list_concat)operator((\);) +directive(static) ident(NODE) operator(*)ident(arg_concat)operator((\);) +directive(static) ident(NODE) operator(*)ident(arg_prepend)operator((\);) +directive(static) ident(NODE) operator(*)ident(literal_concat)operator((\);) +directive(static) ident(NODE) operator(*)ident(new_evstr)operator((\);) +directive(static) ident(NODE) operator(*)ident(evstr2dstr)operator((\);) +directive(static) ident(NODE) operator(*)ident(call_op)operator((\);) +directive(static) pre_type(int) ident(in_defined) operator(=) integer(0)operator(;) + +directive(static) ident(NODE) operator(*)ident(negate_lit)operator((\);) +directive(static) ident(NODE) operator(*)ident(ret_args)operator((\);) +directive(static) ident(NODE) operator(*)ident(arg_blk_pass)operator((\);) +directive(static) ident(NODE) operator(*)ident(new_call)operator((\);) +directive(static) ident(NODE) operator(*)ident(new_fcall)operator((\);) +directive(static) ident(NODE) operator(*)ident(new_super)operator((\);) +directive(static) ident(NODE) operator(*)ident(new_yield)operator((\);) + +directive(static) ident(NODE) operator(*)ident(gettable)operator((\);) +directive(static) ident(NODE) operator(*)ident(assignable)operator((\);) +directive(static) ident(NODE) operator(*)ident(aryset)operator((\);) +directive(static) ident(NODE) operator(*)ident(attrset)operator((\);) +directive(static) directive(void) ident(rb_backref_error)operator((\);) +directive(static) ident(NODE) operator(*)ident(node_assign)operator((\);) + +directive(static) ident(NODE) operator(*)ident(match_gen)operator((\);) +directive(static) directive(void) ident(local_push)operator((\);) +directive(static) directive(void) ident(local_pop)operator((\);) +directive(static) pre_type(int) ident(local_append)operator((\);) +directive(static) pre_type(int) ident(local_cnt)operator((\);) +directive(static) pre_type(int) ident(local_id)operator((\);) +directive(static) ident(ID) operator(*)ident(local_tbl)operator((\);) +directive(static) ident(ID) ident(internal_id)operator((\);) + +directive(static) reserved(struct) ident(RVarmap) operator(*)ident(dyna_push)operator((\);) +directive(static) directive(void) ident(dyna_pop)operator((\);) +directive(static) pre_type(int) ident(dyna_in_block)operator((\);) +directive(static) ident(NODE) operator(*)ident(dyna_init)operator((\);) + +directive(static) directive(void) ident(top_local_init)operator((\);) +directive(static) directive(void) ident(top_local_setup)operator((\);) + +directive(static) directive(void) ident(fixup_nodes)operator((\);) + +preprocessor(#define) ident(RE_OPTION_ONCE) hex(0x80) + +preprocessor(#define) ident(NODE_STRTERM) ident(NODE_ZARRAY) comment(/* nothing to gc */) +preprocessor(#define) ident(NODE_HEREDOC) ident(NODE_ARRAY) comment(/* 1, 3 to gc */) +preprocessor(#define) ident(SIGN_EXTEND)operator(()ident(x)operator(,)ident(n)operator(\)) operator(((()integer(1)operator(<<()ident(n)operator(\)-)integer(1)operator(\)^(()ident(x)operator(\)&~(~)integer(0)operator(<<()ident(n)operator(\)\)\)\)-()integer(1)operator(<<()ident(n)operator(\)-)integer(1)operator(\)\)) +preprocessor(#define) ident(nd_func) ident(u1)operator(.)ident(id) +preprocessor(#if) ident(SIZEOF_SHORT) operator(==) integer(2) +preprocessor(#define) ident(nd_term)operator(()ident(node)operator(\)) operator((()pre_type(signed) pre_type(short)operator(\)()ident(node)operator(\)->)ident(u2)operator(.)ident(id)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(nd_term)operator(()ident(node)operator(\)) ident(SIGN_EXTEND)operator((()ident(node)operator(\)->)ident(u2)operator(.)ident(id)operator(,) ident(CHAR_BIT)operator(*)integer(2)operator(\)) +preprocessor(#endif) +preprocessor(#define) ident(nd_paren)operator(()ident(node)operator(\)) operator(()pre_type(char)operator(\)(()ident(node)operator(\)->)ident(u2)operator(.)ident(id) operator(>>) ident(CHAR_BIT)operator(*)integer(2)operator(\)) +preprocessor(#define) ident(nd_nest) ident(u3)operator(.)ident(id) + +comment(/* Older versions of Yacc set YYMAXDEPTH to a very low value by default (150, + for instance\). This is too low for Ruby to parse some files, such as + date/format.rb, therefore bump the value up to at least Bison's default. */) +preprocessor(#ifdef) ident(OLD_YACC) +preprocessor(#ifndef) ident(YYMAXDEPTH) +preprocessor(#define) ident(YYMAXDEPTH) integer(10000) +preprocessor(#endif) +preprocessor(#endif) + + + +comment(/* Enabling traces. */) +preprocessor(#ifndef) ident(YYDEBUG) +preprocessor(# define) ident(YYDEBUG) integer(0) +preprocessor(#endif) + +comment(/* Enabling verbose error messages. */) +preprocessor(#ifdef) ident(YYERROR_VERBOSE) +preprocessor(# undef) ident(YYERROR_VERBOSE) +preprocessor(# define) ident(YYERROR_VERBOSE) integer(1) +preprocessor(#else) +preprocessor(# define) ident(YYERROR_VERBOSE) integer(0) +preprocessor(#endif) + +comment(/* Enabling the token table. */) +preprocessor(#ifndef) ident(YYTOKEN_TABLE) +preprocessor(# define) ident(YYTOKEN_TABLE) integer(0) +preprocessor(#endif) + +preprocessor(#if) operator(!) ident(defined) ident(YYSTYPE) operator(&&) operator(!) ident(defined) ident(YYSTYPE_IS_DECLARED) +reserved(typedef) reserved(union) ident(YYSTYPE) +preprocessor(#line) integer(213) string<delimiter(")content(parse.y)delimiter(")> +operator({) + ident(NODE) operator(*)ident(node)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(num)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(vars)operator(;) +operator(}) +comment(/* Line 193 of yacc.c. */) +preprocessor(#line) integer(511) string<delimiter(")content(parse.c)delimiter(")> + ident(YYSTYPE)operator(;) +preprocessor(# define) ident(yystype) ident(YYSTYPE) comment(/* obsolescent; will be withdrawn */) +preprocessor(# define) ident(YYSTYPE_IS_DECLARED) integer(1) +preprocessor(# define) ident(YYSTYPE_IS_TRIVIAL) integer(1) +preprocessor(#endif) + + + +comment(/* Copy the second part of user declarations. */) + + +comment(/* Line 216 of yacc.c. */) +preprocessor(#line) integer(524) string<delimiter(")content(parse.c)delimiter(")> + +preprocessor(#ifdef) pre_type(short) +preprocessor(# undef) pre_type(short) +preprocessor(#endif) + +preprocessor(#ifdef) ident(YYTYPE_UINT8) +reserved(typedef) ident(YYTYPE_UINT8) ident(yytype_uint8)operator(;) +preprocessor(#else) +reserved(typedef) pre_type(unsigned) pre_type(char) ident(yytype_uint8)operator(;) +preprocessor(#endif) + +preprocessor(#ifdef) ident(YYTYPE_INT8) +reserved(typedef) ident(YYTYPE_INT8) ident(yytype_int8)operator(;) +preprocessor(#elif) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +reserved(typedef) pre_type(signed) pre_type(char) ident(yytype_int8)operator(;) +preprocessor(#else) +reserved(typedef) pre_type(short) pre_type(int) ident(yytype_int8)operator(;) +preprocessor(#endif) + +preprocessor(#ifdef) ident(YYTYPE_UINT16) +reserved(typedef) ident(YYTYPE_UINT16) ident(yytype_uint16)operator(;) +preprocessor(#else) +reserved(typedef) pre_type(unsigned) pre_type(short) pre_type(int) ident(yytype_uint16)operator(;) +preprocessor(#endif) + +preprocessor(#ifdef) ident(YYTYPE_INT16) +reserved(typedef) ident(YYTYPE_INT16) ident(yytype_int16)operator(;) +preprocessor(#else) +reserved(typedef) pre_type(short) pre_type(int) ident(yytype_int16)operator(;) +preprocessor(#endif) + +preprocessor(#ifndef) ident(YYSIZE_T) +preprocessor(# ifdef) ident(__SIZE_TYPE__) +preprocessor(# define) ident(YYSIZE_T) ident(__SIZE_TYPE__) +preprocessor(# elif) ident(defined) ident(size_t) +preprocessor(# define) ident(YYSIZE_T) ident(size_t) +preprocessor(# elif) operator(!) ident(defined) ident(YYSIZE_T) operator(&&) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +preprocessor(# include) include(<stddef.h>) comment(/* INFRINGES ON USER NAME SPACE */) +preprocessor(# define) ident(YYSIZE_T) ident(size_t) +preprocessor(# else) +preprocessor(# define) ident(YYSIZE_T) pre_type(unsigned) pre_type(int) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#define) ident(YYSIZE_MAXIMUM) operator((()ident(YYSIZE_T)operator(\)) operator(-)integer(1)operator(\)) + +preprocessor(#ifndef) ident(YY_) +preprocessor(# if) ident(YYENABLE_NLS) +preprocessor(# if) ident(ENABLE_NLS) +preprocessor(# include) include(<libintl.h>) comment(/* INFRINGES ON USER NAME SPACE */) +preprocessor(# define) ident(YY_)operator(()ident(msgid)operator(\)) ident(dgettext) operator(()string<delimiter(")content(bison-runtime)delimiter(")>operator(,) ident(msgid)operator(\)) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# ifndef) ident(YY_) +preprocessor(# define) ident(YY_)operator(()ident(msgid)operator(\)) ident(msgid) +preprocessor(# endif) +preprocessor(#endif) + +comment(/* Suppress unused-variable warnings by "using" E. */) +preprocessor(#if) operator(!) ident(defined) ident(lint) operator(||) ident(defined) ident(__GNUC__) +preprocessor(# define) ident(YYUSE)operator(()ident(e)operator(\)) operator((()directive(void)operator(\)) operator(()ident(e)operator(\)\)) +preprocessor(#else) +preprocessor(# define) ident(YYUSE)operator(()ident(e)operator(\)) comment(/* empty */) +preprocessor(#endif) + +comment(/* Identity function, used to suppress warnings about constant conditions. */) +preprocessor(#ifndef) ident(lint) +preprocessor(# define) ident(YYID)operator(()ident(n)operator(\)) operator(()ident(n)operator(\)) +preprocessor(#else) +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(static) pre_type(int) +ident(YYID) operator(()pre_type(int) ident(i)operator(\)) +preprocessor(#else) +directive(static) pre_type(int) +ident(YYID) operator(()ident(i)operator(\)) + pre_type(int) ident(i)operator(;) +preprocessor(#endif) +operator({) + reserved(return) ident(i)operator(;) +operator(}) +preprocessor(#endif) + +preprocessor(#if) operator(!) ident(defined) ident(yyoverflow) operator(||) ident(YYERROR_VERBOSE) + +comment(/* The parser invokes alloca or malloc; define the necessary symbols. */) + +preprocessor(# ifdef) ident(YYSTACK_USE_ALLOCA) +preprocessor(# if) ident(YYSTACK_USE_ALLOCA) +preprocessor(# ifdef) ident(__GNUC__) +preprocessor(# define) ident(YYSTACK_ALLOC) ident(__builtin_alloca) +preprocessor(# elif) ident(defined) ident(__BUILTIN_VA_ARG_INCR) +preprocessor(# include) include(<alloca.h>) comment(/* INFRINGES ON USER NAME SPACE */) +preprocessor(# elif) ident(defined) ident(_AIX) +preprocessor(# define) ident(YYSTACK_ALLOC) ident(__alloca) +preprocessor(# elif) ident(defined) ident(_MSC_VER) +preprocessor(# include) include(<malloc.h>) comment(/* INFRINGES ON USER NAME SPACE */) +preprocessor(# define) ident(alloca) ident(_alloca) +preprocessor(# else) +preprocessor(# define) ident(YYSTACK_ALLOC) ident(alloca) +preprocessor(# if) operator(!) ident(defined) ident(_ALLOCA_H) operator(&&) operator(!) ident(defined) ident(_STDLIB_H) operator(&&) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +preprocessor(# include) include(<stdlib.h>) comment(/* INFRINGES ON USER NAME SPACE */) +preprocessor(# ifndef) ident(_STDLIB_H) +preprocessor(# define) ident(_STDLIB_H) integer(1) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# endif) + +preprocessor(# ifdef) ident(YYSTACK_ALLOC) + comment(/* Pacify GCC's `empty if-body' warning. */) +preprocessor(# define) ident(YYSTACK_FREE)operator(()ident(Ptr)operator(\)) reserved(do) operator({) comment(/* empty */)operator(;) operator(}) reserved(while) operator(()ident(YYID) operator(()integer(0)operator(\)\)) +preprocessor(# ifndef) ident(YYSTACK_ALLOC_MAXIMUM) + comment(/* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N\) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */) +preprocessor(# define) ident(YYSTACK_ALLOC_MAXIMUM) integer(4032) comment(/* reasonable circa 2006 */) +preprocessor(# endif) +preprocessor(# else) +preprocessor(# define) ident(YYSTACK_ALLOC) ident(YYMALLOC) +preprocessor(# define) ident(YYSTACK_FREE) ident(YYFREE) +preprocessor(# ifndef) ident(YYSTACK_ALLOC_MAXIMUM) +preprocessor(# define) ident(YYSTACK_ALLOC_MAXIMUM) ident(YYSIZE_MAXIMUM) +preprocessor(# endif) +preprocessor(# if) operator(()ident(defined) ident(__cplusplus) operator(&&) operator(!) ident(defined) ident(_STDLIB_H) \ + operator(&&) operator(!) operator((()ident(defined) ident(YYMALLOC) operator(||) ident(defined) ident(malloc)operator(\)) \ + operator(&&) operator(()ident(defined) ident(YYFREE) operator(||) ident(defined) ident(free)operator(\)\)\)) +preprocessor(# include) include(<stdlib.h>) comment(/* INFRINGES ON USER NAME SPACE */) +preprocessor(# ifndef) ident(_STDLIB_H) +preprocessor(# define) ident(_STDLIB_H) integer(1) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# ifndef) ident(YYMALLOC) +preprocessor(# define) ident(YYMALLOC) ident(malloc) +preprocessor(# if) operator(!) ident(defined) ident(malloc) operator(&&) operator(!) ident(defined) ident(_STDLIB_H) operator(&&) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(void) operator(*)ident(malloc) operator(()ident(YYSIZE_T)operator(\);) comment(/* INFRINGES ON USER NAME SPACE */) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# ifndef) ident(YYFREE) +preprocessor(# define) ident(YYFREE) ident(free) +preprocessor(# if) operator(!) ident(defined) ident(free) operator(&&) operator(!) ident(defined) ident(_STDLIB_H) operator(&&) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(void) ident(free) operator(()directive(void) operator(*\);) comment(/* INFRINGES ON USER NAME SPACE */) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(#endif) comment(/* ! defined yyoverflow || YYERROR_VERBOSE */) + + +preprocessor(#if) operator((!) ident(defined) ident(yyoverflow) \ + operator(&&) operator((!) ident(defined) ident(__cplusplus) \ + operator(||) operator(()ident(defined) ident(YYSTYPE_IS_TRIVIAL) operator(&&) ident(YYSTYPE_IS_TRIVIAL)operator(\)\)\)) + +comment(/* A type that is properly aligned for any stack member. */) +reserved(union) ident(yyalloc) +operator({) + ident(yytype_int16) ident(yyss)operator(;) + ident(YYSTYPE) ident(yyvs)operator(;) + operator(};) + +comment(/* The size of the maximum gap between one aligned stack and the next. */) +preprocessor(# define) ident(YYSTACK_GAP_MAXIMUM) operator(()reserved(sizeof) operator(()reserved(union) ident(yyalloc)operator(\)) operator(-) integer(1)operator(\)) + +comment(/* The size of an array large to enough to hold all stacks, each with + N elements. */) +preprocessor(# define) ident(YYSTACK_BYTES)operator(()ident(N)operator(\)) \ + operator((()ident(N)operator(\)) operator(*) operator(()reserved(sizeof) operator(()ident(yytype_int16)operator(\)) operator(+) reserved(sizeof) operator(()ident(YYSTYPE)operator(\)\)) \ + operator(+) ident(YYSTACK_GAP_MAXIMUM)operator(\)) + +comment(/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */) +preprocessor(# ifndef) ident(YYCOPY) +preprocessor(# if) ident(defined) ident(__GNUC__) operator(&&) integer(1) operator(<) ident(__GNUC__) +preprocessor(# define) ident(YYCOPY)operator(()ident(To)operator(,) ident(From)operator(,) ident(Count)operator(\)) \ + ident(__builtin_memcpy) operator(()ident(To)operator(,) ident(From)operator(,) operator(()ident(Count)operator(\)) operator(*) reserved(sizeof) operator((*()ident(From)operator(\)\)\)) +preprocessor(# else) +preprocessor(# define) ident(YYCOPY)operator(()ident(To)operator(,) ident(From)operator(,) ident(Count)operator(\)) \ + reserved(do) \ + operator({) \ + ident(YYSIZE_T) ident(yyi)operator(;) \ + reserved(for) operator(()ident(yyi) operator(=) integer(0)operator(;) ident(yyi) operator(<) operator(()ident(Count)operator(\);) ident(yyi)operator(++\)) \ + operator(()ident(To)operator(\)[)ident(yyi)operator(]) operator(=) operator(()ident(From)operator(\)[)ident(yyi)operator(];) \ + operator(}) \ + reserved(while) operator(()ident(YYID) operator(()integer(0)operator(\)\)) +preprocessor(# endif) +preprocessor(# endif) + +comment(/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */) +preprocessor(# define) ident(YYSTACK_RELOCATE)operator(()ident(Stack)operator(\)) \ + reserved(do) \ + operator({) \ + ident(YYSIZE_T) ident(yynewbytes)operator(;) \ + ident(YYCOPY) operator((&)ident(yyptr)operator(->)ident(Stack)operator(,) ident(Stack)operator(,) ident(yysize)operator(\);) \ + ident(Stack) operator(=) operator(&)ident(yyptr)operator(->)ident(Stack)operator(;) \ + ident(yynewbytes) operator(=) ident(yystacksize) operator(*) reserved(sizeof) operator((*)ident(Stack)operator(\)) operator(+) ident(YYSTACK_GAP_MAXIMUM)operator(;) \ + ident(yyptr) operator(+=) ident(yynewbytes) operator(/) reserved(sizeof) operator((*)ident(yyptr)operator(\);) \ + operator(}) \ + reserved(while) operator(()ident(YYID) operator(()integer(0)operator(\)\)) + +preprocessor(#endif) + +comment(/* YYFINAL -- State number of the termination state. */) +preprocessor(#define) ident(YYFINAL) integer(3) +comment(/* YYLAST -- Last index in YYTABLE. */) +preprocessor(#define) ident(YYLAST) integer(9550) + +comment(/* YYNTOKENS -- Number of terminals. */) +preprocessor(#define) ident(YYNTOKENS) integer(132) +comment(/* YYNNTS -- Number of nonterminals. */) +preprocessor(#define) ident(YYNNTS) integer(144) +comment(/* YYNRULES -- Number of rules. */) +preprocessor(#define) ident(YYNRULES) integer(501) +comment(/* YYNRULES -- Number of states. */) +preprocessor(#define) ident(YYNSTATES) integer(895) + +comment(/* YYTRANSLATE(YYLEX\) -- Bison symbol number corresponding to YYLEX. */) +preprocessor(#define) ident(YYUNDEFTOK) integer(2) +preprocessor(#define) ident(YYMAXUTOK) integer(359) + +preprocessor(#define) ident(YYTRANSLATE)operator(()ident(YYX)operator(\)) \ + operator((()pre_type(unsigned) pre_type(int)operator(\)) operator(()ident(YYX)operator(\)) operator(<=) ident(YYMAXUTOK) operator(?) ident(yytranslate)operator([)ident(YYX)operator(]) operator(:) ident(YYUNDEFTOK)operator(\)) + +comment(/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */) +directive(static) directive(const) ident(yytype_uint8) ident(yytranslate)operator([]) operator(=) +operator({) + integer(0)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(130)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(129)operator(,) integer(117)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(115)operator(,) integer(110)operator(,) integer(2)operator(,) + integer(128)operator(,) integer(125)operator(,) integer(113)operator(,) integer(111)operator(,) integer(126)operator(,) integer(112)operator(,) integer(124)operator(,) integer(114)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(105)operator(,) integer(131)operator(,) + integer(107)operator(,) integer(103)operator(,) integer(106)operator(,) integer(104)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(122)operator(,) integer(2)operator(,) integer(123)operator(,) integer(109)operator(,) integer(2)operator(,) integer(127)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(120)operator(,) integer(108)operator(,) integer(121)operator(,) integer(118)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(1)operator(,) integer(2)operator(,) integer(3)operator(,) integer(4)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(13)operator(,) integer(14)operator(,) + integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) + integer(25)operator(,) integer(26)operator(,) integer(27)operator(,) integer(28)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(42)operator(,) integer(43)operator(,) integer(44)operator(,) + integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(61)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) + integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) + integer(75)operator(,) integer(76)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) integer(81)operator(,) integer(82)operator(,) integer(83)operator(,) integer(84)operator(,) + integer(85)operator(,) integer(86)operator(,) integer(87)operator(,) integer(88)operator(,) integer(89)operator(,) integer(90)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) + integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(102)operator(,) integer(116)operator(,) integer(119) +operator(};) + +preprocessor(#if) ident(YYDEBUG) +comment(/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */) +directive(static) directive(const) ident(yytype_uint16) ident(yyprhs)operator([]) operator(=) +operator({) + integer(0)operator(,) integer(0)operator(,) integer(3)operator(,) integer(4)operator(,) integer(7)operator(,) integer(12)operator(,) integer(15)operator(,) integer(17)operator(,) integer(19)operator(,) integer(23)operator(,) + integer(26)operator(,) integer(27)operator(,) integer(32)operator(,) integer(36)operator(,) integer(40)operator(,) integer(44)operator(,) integer(47)operator(,) integer(51)operator(,) integer(55)operator(,) integer(59)operator(,) + integer(63)operator(,) integer(67)operator(,) integer(68)operator(,) integer(74)operator(,) integer(79)operator(,) integer(83)operator(,) integer(87)operator(,) integer(91)operator(,) integer(98)operator(,) integer(104)operator(,) + integer(110)operator(,) integer(116)operator(,) integer(120)operator(,) integer(124)operator(,) integer(128)operator(,) integer(132)operator(,) integer(134)operator(,) integer(136)operator(,) integer(140)operator(,) integer(144)operator(,) + integer(147)operator(,) integer(150)operator(,) integer(152)operator(,) integer(154)operator(,) integer(156)operator(,) integer(158)operator(,) integer(161)operator(,) integer(164)operator(,) integer(167)operator(,) integer(169)operator(,) + integer(174)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(188)operator(,) integer(191)operator(,) integer(195)operator(,) integer(200)operator(,) integer(206)operator(,) integer(211)operator(,) + integer(217)operator(,) integer(220)operator(,) integer(223)operator(,) integer(225)operator(,) integer(229)operator(,) integer(231)operator(,) integer(235)operator(,) integer(237)operator(,) integer(240)operator(,) integer(244)operator(,) + integer(247)operator(,) integer(250)operator(,) integer(252)operator(,) integer(254)operator(,) integer(258)operator(,) integer(261)operator(,) integer(265)operator(,) integer(267)operator(,) integer(272)operator(,) integer(276)operator(,) + integer(280)operator(,) integer(284)operator(,) integer(288)operator(,) integer(291)operator(,) integer(293)operator(,) integer(295)operator(,) integer(300)operator(,) integer(304)operator(,) integer(308)operator(,) integer(312)operator(,) + integer(316)operator(,) integer(319)operator(,) integer(321)operator(,) integer(323)operator(,) integer(325)operator(,) integer(328)operator(,) integer(330)operator(,) integer(334)operator(,) integer(336)operator(,) integer(338)operator(,) + integer(340)operator(,) integer(342)operator(,) integer(344)operator(,) integer(346)operator(,) integer(348)operator(,) integer(350)operator(,) integer(352)operator(,) integer(354)operator(,) integer(355)operator(,) integer(360)operator(,) + integer(362)operator(,) integer(364)operator(,) integer(366)operator(,) integer(368)operator(,) integer(370)operator(,) integer(372)operator(,) integer(374)operator(,) integer(376)operator(,) integer(378)operator(,) integer(380)operator(,) + integer(382)operator(,) integer(384)operator(,) integer(386)operator(,) integer(388)operator(,) integer(390)operator(,) integer(392)operator(,) integer(394)operator(,) integer(396)operator(,) integer(398)operator(,) integer(400)operator(,) + integer(402)operator(,) integer(404)operator(,) integer(406)operator(,) integer(408)operator(,) integer(410)operator(,) integer(412)operator(,) integer(414)operator(,) integer(416)operator(,) integer(418)operator(,) integer(420)operator(,) + integer(422)operator(,) integer(424)operator(,) integer(426)operator(,) integer(428)operator(,) integer(430)operator(,) integer(432)operator(,) integer(434)operator(,) integer(436)operator(,) integer(438)operator(,) integer(440)operator(,) + integer(442)operator(,) integer(444)operator(,) integer(446)operator(,) integer(448)operator(,) integer(450)operator(,) integer(452)operator(,) integer(454)operator(,) integer(456)operator(,) integer(458)operator(,) integer(460)operator(,) + integer(462)operator(,) integer(464)operator(,) integer(466)operator(,) integer(468)operator(,) integer(470)operator(,) integer(472)operator(,) integer(474)operator(,) integer(476)operator(,) integer(478)operator(,) integer(480)operator(,) + integer(482)operator(,) integer(484)operator(,) integer(486)operator(,) integer(488)operator(,) integer(490)operator(,) integer(492)operator(,) integer(496)operator(,) integer(502)operator(,) integer(506)operator(,) integer(513)operator(,) + integer(519)operator(,) integer(525)operator(,) integer(531)operator(,) integer(537)operator(,) integer(542)operator(,) integer(546)operator(,) integer(550)operator(,) integer(554)operator(,) integer(558)operator(,) integer(562)operator(,) + integer(566)operator(,) integer(570)operator(,) integer(574)operator(,) integer(578)operator(,) integer(583)operator(,) integer(588)operator(,) integer(591)operator(,) integer(594)operator(,) integer(598)operator(,) integer(602)operator(,) + integer(606)operator(,) integer(610)operator(,) integer(614)operator(,) integer(618)operator(,) integer(622)operator(,) integer(626)operator(,) integer(630)operator(,) integer(634)operator(,) integer(638)operator(,) integer(642)operator(,) + integer(646)operator(,) integer(649)operator(,) integer(652)operator(,) integer(656)operator(,) integer(660)operator(,) integer(664)operator(,) integer(668)operator(,) integer(669)operator(,) integer(674)operator(,) integer(680)operator(,) + integer(682)operator(,) integer(684)operator(,) integer(686)operator(,) integer(689)operator(,) integer(692)operator(,) integer(698)operator(,) integer(701)operator(,) integer(705)operator(,) integer(709)operator(,) integer(714)operator(,) + integer(719)operator(,) integer(726)operator(,) integer(728)operator(,) integer(730)operator(,) integer(732)operator(,) integer(735)operator(,) integer(741)operator(,) integer(744)operator(,) integer(750)operator(,) integer(755)operator(,) + integer(763)operator(,) integer(767)operator(,) integer(769)operator(,) integer(774)operator(,) integer(778)operator(,) integer(784)operator(,) integer(792)operator(,) integer(795)operator(,) integer(801)operator(,) integer(806)operator(,) + integer(813)operator(,) integer(821)operator(,) integer(831)operator(,) integer(835)operator(,) integer(837)operator(,) integer(838)operator(,) integer(841)operator(,) integer(843)operator(,) integer(844)operator(,) integer(848)operator(,) + integer(849)operator(,) integer(854)operator(,) integer(857)operator(,) integer(860)operator(,) integer(862)operator(,) integer(864)operator(,) integer(868)operator(,) integer(872)operator(,) integer(877)operator(,) integer(880)operator(,) + integer(882)operator(,) integer(884)operator(,) integer(886)operator(,) integer(888)operator(,) integer(890)operator(,) integer(892)operator(,) integer(894)operator(,) integer(896)operator(,) integer(898)operator(,) integer(899)operator(,) + integer(904)operator(,) integer(905)operator(,) integer(911)operator(,) integer(915)operator(,) integer(919)operator(,) integer(922)operator(,) integer(927)operator(,) integer(931)operator(,) integer(935)operator(,) integer(937)operator(,) + integer(942)operator(,) integer(946)operator(,) integer(948)operator(,) integer(949)operator(,) integer(956)operator(,) integer(959)operator(,) integer(961)operator(,) integer(964)operator(,) integer(971)operator(,) integer(978)operator(,) + integer(979)operator(,) integer(980)operator(,) integer(988)operator(,) integer(989)operator(,) integer(990)operator(,) integer(998)operator(,) integer(1004)operator(,) integer(1009)operator(,) integer(1015)operator(,) integer(1016)operator(,) + integer(1017)operator(,) integer(1027)operator(,) integer(1028)operator(,) integer(1035)operator(,) integer(1036)operator(,) integer(1037)operator(,) integer(1046)operator(,) integer(1047)operator(,) integer(1053)operator(,) integer(1054)operator(,) + integer(1061)operator(,) integer(1062)operator(,) integer(1063)operator(,) integer(1073)operator(,) integer(1075)operator(,) integer(1077)operator(,) integer(1079)operator(,) integer(1081)operator(,) integer(1083)operator(,) integer(1085)operator(,) + integer(1087)operator(,) integer(1089)operator(,) integer(1092)operator(,) integer(1094)operator(,) integer(1096)operator(,) integer(1098)operator(,) integer(1100)operator(,) integer(1106)operator(,) integer(1108)operator(,) integer(1111)operator(,) + integer(1113)operator(,) integer(1115)operator(,) integer(1117)operator(,) integer(1120)operator(,) integer(1122)operator(,) integer(1126)operator(,) integer(1127)operator(,) integer(1128)operator(,) integer(1135)operator(,) integer(1138)operator(,) + integer(1143)operator(,) integer(1148)operator(,) integer(1151)operator(,) integer(1156)operator(,) integer(1161)operator(,) integer(1165)operator(,) integer(1168)operator(,) integer(1170)operator(,) integer(1171)operator(,) integer(1172)operator(,) + integer(1179)operator(,) integer(1180)operator(,) integer(1181)operator(,) integer(1188)operator(,) integer(1194)operator(,) integer(1196)operator(,) integer(1201)operator(,) integer(1204)operator(,) integer(1206)operator(,) integer(1208)operator(,) + integer(1215)operator(,) integer(1217)operator(,) integer(1219)operator(,) integer(1221)operator(,) integer(1223)operator(,) integer(1226)operator(,) integer(1228)operator(,) integer(1231)operator(,) integer(1233)operator(,) integer(1235)operator(,) + integer(1237)operator(,) integer(1239)operator(,) integer(1241)operator(,) integer(1243)operator(,) integer(1246)operator(,) integer(1250)operator(,) integer(1254)operator(,) integer(1258)operator(,) integer(1262)operator(,) integer(1266)operator(,) + integer(1267)operator(,) integer(1271)operator(,) integer(1273)operator(,) integer(1276)operator(,) integer(1280)operator(,) integer(1284)operator(,) integer(1285)operator(,) integer(1289)operator(,) integer(1290)operator(,) integer(1293)operator(,) + integer(1294)operator(,) integer(1297)operator(,) integer(1299)operator(,) integer(1300)operator(,) integer(1304)operator(,) integer(1305)operator(,) integer(1310)operator(,) integer(1312)operator(,) integer(1314)operator(,) integer(1316)operator(,) + integer(1318)operator(,) integer(1321)operator(,) integer(1323)operator(,) integer(1325)operator(,) integer(1327)operator(,) integer(1329)operator(,) integer(1333)operator(,) integer(1335)operator(,) integer(1337)operator(,) integer(1340)operator(,) + integer(1343)operator(,) integer(1345)operator(,) integer(1347)operator(,) integer(1349)operator(,) integer(1351)operator(,) integer(1353)operator(,) integer(1355)operator(,) integer(1357)operator(,) integer(1359)operator(,) integer(1361)operator(,) + integer(1363)operator(,) integer(1365)operator(,) integer(1367)operator(,) integer(1369)operator(,) integer(1371)operator(,) integer(1373)operator(,) integer(1375)operator(,) integer(1376)operator(,) integer(1381)operator(,) integer(1384)operator(,) + integer(1389)operator(,) integer(1392)operator(,) integer(1399)operator(,) integer(1404)operator(,) integer(1409)operator(,) integer(1412)operator(,) integer(1417)operator(,) integer(1420)operator(,) integer(1423)operator(,) integer(1425)operator(,) + integer(1426)operator(,) integer(1428)operator(,) integer(1430)operator(,) integer(1432)operator(,) integer(1434)operator(,) integer(1436)operator(,) integer(1438)operator(,) integer(1442)operator(,) integer(1446)operator(,) integer(1448)operator(,) + integer(1452)operator(,) integer(1454)operator(,) integer(1456)operator(,) integer(1459)operator(,) integer(1461)operator(,) integer(1463)operator(,) integer(1465)operator(,) integer(1468)operator(,) integer(1471)operator(,) integer(1473)operator(,) + integer(1475)operator(,) integer(1476)operator(,) integer(1482)operator(,) integer(1484)operator(,) integer(1487)operator(,) integer(1490)operator(,) integer(1492)operator(,) integer(1496)operator(,) integer(1500)operator(,) integer(1502)operator(,) + integer(1504)operator(,) integer(1506)operator(,) integer(1508)operator(,) integer(1510)operator(,) integer(1512)operator(,) integer(1514)operator(,) integer(1516)operator(,) integer(1518)operator(,) integer(1520)operator(,) integer(1522)operator(,) + integer(1524)operator(,) integer(1525)operator(,) integer(1527)operator(,) integer(1528)operator(,) integer(1530)operator(,) integer(1531)operator(,) integer(1533)operator(,) integer(1535)operator(,) integer(1537)operator(,) integer(1539)operator(,) + integer(1541)operator(,) integer(1544) +operator(};) + +comment(/* YYRHS -- A `-1'-separated list of the rules' RHS. */) +directive(static) directive(const) ident(yytype_int16) ident(yyrhs)operator([]) operator(=) +operator({) + integer(133)operator(,) integer(0)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(134)operator(,) integer(136)operator(,) operator(-)integer(1)operator(,) integer(136)operator(,) integer(219)operator(,) integer(203)operator(,) + integer(222)operator(,) operator(-)integer(1)operator(,) integer(137)operator(,) integer(270)operator(,) operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(138)operator(,) operator(-)integer(1)operator(,) integer(137)operator(,) + integer(274)operator(,) integer(138)operator(,) operator(-)integer(1)operator(,) integer(1)operator(,) integer(138)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(160)operator(,) integer(139)operator(,) + integer(160)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(52)operator(,) integer(52)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(52)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) + integer(44)operator(,) integer(52)operator(,) integer(59)operator(,) operator(-)integer(1)operator(,) integer(6)operator(,) integer(161)operator(,) operator(-)integer(1)operator(,) integer(138)operator(,) integer(39)operator(,) integer(142)operator(,) + operator(-)integer(1)operator(,) integer(138)operator(,) integer(40)operator(,) integer(142)operator(,) operator(-)integer(1)operator(,) integer(138)operator(,) integer(41)operator(,) integer(142)operator(,) operator(-)integer(1)operator(,) integer(138)operator(,) + integer(42)operator(,) integer(142)operator(,) operator(-)integer(1)operator(,) integer(138)operator(,) integer(43)operator(,) integer(138)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(46)operator(,) integer(140)operator(,) + integer(120)operator(,) integer(136)operator(,) integer(121)operator(,) operator(-)integer(1)operator(,) integer(47)operator(,) integer(120)operator(,) integer(136)operator(,) integer(121)operator(,) operator(-)integer(1)operator(,) integer(155)operator(,) + integer(103)operator(,) integer(143)operator(,) operator(-)integer(1)operator(,) integer(149)operator(,) integer(103)operator(,) integer(143)operator(,) operator(-)integer(1)operator(,) integer(246)operator(,) integer(83)operator(,) integer(143)operator(,) + operator(-)integer(1)operator(,) integer(199)operator(,) integer(122)operator(,) integer(168)operator(,) integer(123)operator(,) integer(83)operator(,) integer(143)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(124)operator(,) + integer(50)operator(,) integer(83)operator(,) integer(143)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(124)operator(,) integer(54)operator(,) integer(83)operator(,) integer(143)operator(,) operator(-)integer(1)operator(,) + integer(199)operator(,) integer(81)operator(,) integer(50)operator(,) integer(83)operator(,) integer(143)operator(,) operator(-)integer(1)operator(,) integer(247)operator(,) integer(83)operator(,) integer(143)operator(,) operator(-)integer(1)operator(,) + integer(155)operator(,) integer(103)operator(,) integer(181)operator(,) operator(-)integer(1)operator(,) integer(149)operator(,) integer(103)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) integer(149)operator(,) integer(103)operator(,) + integer(181)operator(,) operator(-)integer(1)operator(,) integer(141)operator(,) operator(-)integer(1)operator(,) integer(143)operator(,) operator(-)integer(1)operator(,) integer(141)operator(,) integer(36)operator(,) integer(141)operator(,) operator(-)integer(1)operator(,) + integer(141)operator(,) integer(37)operator(,) integer(141)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) integer(141)operator(,) operator(-)integer(1)operator(,) integer(117)operator(,) integer(143)operator(,) operator(-)integer(1)operator(,) + integer(165)operator(,) operator(-)integer(1)operator(,) integer(141)operator(,) operator(-)integer(1)operator(,) integer(148)operator(,) operator(-)integer(1)operator(,) integer(144)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(171)operator(,) + operator(-)integer(1)operator(,) integer(21)operator(,) integer(171)operator(,) operator(-)integer(1)operator(,) integer(22)operator(,) integer(171)operator(,) operator(-)integer(1)operator(,) integer(209)operator(,) operator(-)integer(1)operator(,) integer(209)operator(,) + integer(124)operator(,) integer(267)operator(,) integer(173)operator(,) operator(-)integer(1)operator(,) integer(209)operator(,) integer(81)operator(,) integer(267)operator(,) integer(173)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(90)operator(,) integer(146)operator(,) integer(205)operator(,) integer(147)operator(,) integer(136)operator(,) integer(121)operator(,) operator(-)integer(1)operator(,) integer(266)operator(,) integer(173)operator(,) + operator(-)integer(1)operator(,) integer(266)operator(,) integer(173)operator(,) integer(145)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(124)operator(,) integer(267)operator(,) integer(173)operator(,) operator(-)integer(1)operator(,) + integer(199)operator(,) integer(124)operator(,) integer(267)operator(,) integer(173)operator(,) integer(145)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(267)operator(,) integer(173)operator(,) + operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(267)operator(,) integer(173)operator(,) integer(145)operator(,) operator(-)integer(1)operator(,) integer(31)operator(,) integer(173)operator(,) operator(-)integer(1)operator(,) + integer(30)operator(,) integer(173)operator(,) operator(-)integer(1)operator(,) integer(151)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(150)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(151)operator(,) + operator(-)integer(1)operator(,) integer(85)operator(,) integer(150)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(153)operator(,) operator(-)integer(1)operator(,) integer(153)operator(,) integer(152)operator(,) operator(-)integer(1)operator(,) + integer(153)operator(,) integer(91)operator(,) integer(154)operator(,) operator(-)integer(1)operator(,) integer(153)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(154)operator(,) operator(-)integer(1)operator(,) + integer(91)operator(,) operator(-)integer(1)operator(,) integer(154)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(150)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(152)operator(,) integer(126)operator(,) + operator(-)integer(1)operator(,) integer(153)operator(,) integer(152)operator(,) integer(126)operator(,) operator(-)integer(1)operator(,) integer(244)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(122)operator(,) integer(168)operator(,) + integer(123)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(124)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) + integer(199)operator(,) integer(124)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) integer(54)operator(,) + operator(-)integer(1)operator(,) integer(247)operator(,) operator(-)integer(1)operator(,) integer(244)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(122)operator(,) integer(168)operator(,) integer(123)operator(,) operator(-)integer(1)operator(,) + integer(199)operator(,) integer(124)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(124)operator(,) + integer(54)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) integer(247)operator(,) + operator(-)integer(1)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) integer(156)operator(,) operator(-)integer(1)operator(,) integer(156)operator(,) operator(-)integer(1)operator(,) + integer(199)operator(,) integer(81)operator(,) integer(156)operator(,) operator(-)integer(1)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) integer(51)operator(,) operator(-)integer(1)operator(,) + integer(163)operator(,) operator(-)integer(1)operator(,) integer(164)operator(,) operator(-)integer(1)operator(,) integer(158)operator(,) operator(-)integer(1)operator(,) integer(240)operator(,) operator(-)integer(1)operator(,) integer(159)operator(,) operator(-)integer(1)operator(,) + integer(242)operator(,) operator(-)integer(1)operator(,) integer(160)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(161)operator(,) integer(126)operator(,) integer(162)operator(,) integer(160)operator(,) operator(-)integer(1)operator(,) + integer(108)operator(,) operator(-)integer(1)operator(,) integer(109)operator(,) operator(-)integer(1)operator(,) integer(110)operator(,) operator(-)integer(1)operator(,) integer(65)operator(,) operator(-)integer(1)operator(,) integer(66)operator(,) operator(-)integer(1)operator(,) + integer(67)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) operator(-)integer(1)operator(,) integer(107)operator(,) operator(-)integer(1)operator(,) + integer(70)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) operator(-)integer(1)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) integer(111)operator(,) operator(-)integer(1)operator(,) integer(112)operator(,) operator(-)integer(1)operator(,) + integer(113)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(114)operator(,) operator(-)integer(1)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) integer(64)operator(,) operator(-)integer(1)operator(,) + integer(118)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) operator(-)integer(1)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) operator(-)integer(1)operator(,) integer(78)operator(,) operator(-)integer(1)operator(,) + integer(127)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) operator(-)integer(1)operator(,) integer(49)operator(,) operator(-)integer(1)operator(,) integer(46)operator(,) operator(-)integer(1)operator(,) integer(47)operator(,) operator(-)integer(1)operator(,) + integer(44)operator(,) operator(-)integer(1)operator(,) integer(36)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) integer(21)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) operator(-)integer(1)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) integer(26)operator(,) operator(-)integer(1)operator(,) integer(15)operator(,) operator(-)integer(1)operator(,) + integer(14)operator(,) operator(-)integer(1)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) integer(9)operator(,) operator(-)integer(1)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) integer(20)operator(,) operator(-)integer(1)operator(,) + integer(25)operator(,) operator(-)integer(1)operator(,) integer(4)operator(,) operator(-)integer(1)operator(,) integer(22)operator(,) operator(-)integer(1)operator(,) integer(33)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) + integer(37)operator(,) operator(-)integer(1)operator(,) integer(23)operator(,) operator(-)integer(1)operator(,) integer(8)operator(,) operator(-)integer(1)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) operator(-)integer(1)operator(,) + integer(32)operator(,) operator(-)integer(1)operator(,) integer(31)operator(,) operator(-)integer(1)operator(,) integer(13)operator(,) operator(-)integer(1)operator(,) integer(34)operator(,) operator(-)integer(1)operator(,) integer(6)operator(,) operator(-)integer(1)operator(,) + integer(17)operator(,) operator(-)integer(1)operator(,) integer(30)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) operator(-)integer(1)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) operator(-)integer(1)operator(,) + integer(19)operator(,) operator(-)integer(1)operator(,) integer(155)operator(,) integer(103)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(155)operator(,) integer(103)operator(,) integer(165)operator(,) integer(43)operator(,) + integer(165)operator(,) operator(-)integer(1)operator(,) integer(246)operator(,) integer(83)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(122)operator(,) integer(168)operator(,) integer(123)operator(,) + integer(83)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(124)operator(,) integer(50)operator(,) integer(83)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) + integer(124)operator(,) integer(54)operator(,) integer(83)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(50)operator(,) integer(83)operator(,) integer(165)operator(,) + operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(54)operator(,) integer(83)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) integer(54)operator(,) integer(83)operator(,) + integer(165)operator(,) operator(-)integer(1)operator(,) integer(247)operator(,) integer(83)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(75)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) + integer(165)operator(,) integer(76)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(111)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(112)operator(,) + integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(113)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(114)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) + integer(165)operator(,) integer(115)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(64)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(56)operator(,) + integer(64)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(57)operator(,) integer(64)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(165)operator(,) + operator(-)integer(1)operator(,) integer(63)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(108)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(109)operator(,) + integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(110)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(65)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) + integer(165)operator(,) integer(106)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(69)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(107)operator(,) + integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(70)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(66)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) + integer(165)operator(,) integer(67)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(68)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(73)operator(,) + integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(74)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(117)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(118)operator(,) + integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(79)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(80)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) + integer(165)operator(,) integer(71)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(72)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) + integer(271)operator(,) integer(166)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) integer(104)operator(,) integer(165)operator(,) integer(105)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) + integer(182)operator(,) operator(-)integer(1)operator(,) integer(165)operator(,) operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(148)operator(,) integer(271)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) + integer(272)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) integer(126)operator(,) integer(91)operator(,) integer(165)operator(,) integer(271)operator(,) operator(-)integer(1)operator(,) integer(264)operator(,) integer(272)operator(,) + operator(-)integer(1)operator(,) integer(91)operator(,) integer(165)operator(,) integer(271)operator(,) operator(-)integer(1)operator(,) integer(128)operator(,) integer(275)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(128)operator(,) + integer(171)operator(,) integer(271)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(128)operator(,) integer(209)operator(,) integer(271)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(128)operator(,) + integer(180)operator(,) integer(126)operator(,) integer(209)operator(,) integer(271)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(169)operator(,) operator(-)integer(1)operator(,) + integer(148)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) integer(126)operator(,) integer(91)operator(,) integer(167)operator(,) integer(179)operator(,) + operator(-)integer(1)operator(,) integer(264)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(264)operator(,) integer(126)operator(,) integer(91)operator(,) integer(167)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) + integer(180)operator(,) integer(126)operator(,) integer(264)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) integer(126)operator(,) integer(264)operator(,) integer(126)operator(,) integer(91)operator(,) + integer(165)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(167)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(178)operator(,) operator(-)integer(1)operator(,) integer(167)operator(,) + integer(126)operator(,) integer(180)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(167)operator(,) integer(126)operator(,) integer(178)operator(,) operator(-)integer(1)operator(,) integer(167)operator(,) integer(126)operator(,) + integer(91)operator(,) integer(167)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(167)operator(,) integer(126)operator(,) integer(180)operator(,) integer(126)operator(,) integer(91)operator(,) integer(167)operator(,) + integer(179)operator(,) operator(-)integer(1)operator(,) integer(264)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(264)operator(,) integer(126)operator(,) integer(91)operator(,) integer(167)operator(,) integer(179)operator(,) + operator(-)integer(1)operator(,) integer(167)operator(,) integer(126)operator(,) integer(264)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(167)operator(,) integer(126)operator(,) integer(180)operator(,) integer(126)operator(,) + integer(264)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(167)operator(,) integer(126)operator(,) integer(264)operator(,) integer(126)operator(,) integer(91)operator(,) integer(167)operator(,) integer(179)operator(,) + operator(-)integer(1)operator(,) integer(167)operator(,) integer(126)operator(,) integer(180)operator(,) integer(126)operator(,) integer(264)operator(,) integer(126)operator(,) integer(91)operator(,) integer(167)operator(,) integer(179)operator(,) + operator(-)integer(1)operator(,) integer(91)operator(,) integer(167)operator(,) integer(179)operator(,) operator(-)integer(1)operator(,) integer(178)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(174)operator(,) integer(175)operator(,) + operator(-)integer(1)operator(,) integer(171)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(86)operator(,) integer(176)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(86)operator(,) + integer(172)operator(,) integer(177)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(92)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) integer(126)operator(,) integer(178)operator(,) operator(-)integer(1)operator(,) + integer(275)operator(,) operator(-)integer(1)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) integer(126)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) integer(126)operator(,) + integer(167)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) integer(126)operator(,) integer(91)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) + integer(223)operator(,) operator(-)integer(1)operator(,) integer(224)operator(,) operator(-)integer(1)operator(,) integer(227)operator(,) operator(-)integer(1)operator(,) integer(228)operator(,) operator(-)integer(1)operator(,) integer(229)operator(,) operator(-)integer(1)operator(,) + integer(232)operator(,) operator(-)integer(1)operator(,) integer(245)operator(,) operator(-)integer(1)operator(,) integer(247)operator(,) operator(-)integer(1)operator(,) integer(51)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) + integer(183)operator(,) integer(135)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(86)operator(,) integer(141)operator(,) integer(184)operator(,) integer(271)operator(,) integer(125)operator(,) + operator(-)integer(1)operator(,) integer(85)operator(,) integer(136)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + integer(54)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(122)operator(,) integer(168)operator(,) integer(123)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(168)operator(,) integer(123)operator(,) + operator(-)integer(1)operator(,) integer(89)operator(,) integer(263)operator(,) integer(121)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) operator(-)integer(1)operator(,) integer(30)operator(,) integer(128)operator(,) integer(171)operator(,) + integer(125)operator(,) operator(-)integer(1)operator(,) integer(30)operator(,) integer(128)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(30)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) + integer(271)operator(,) integer(128)operator(,) integer(185)operator(,) integer(141)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(266)operator(,) integer(211)operator(,) operator(-)integer(1)operator(,) integer(210)operator(,) + operator(-)integer(1)operator(,) integer(210)operator(,) integer(211)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(142)operator(,) integer(200)operator(,) integer(136)operator(,) integer(202)operator(,) integer(10)operator(,) + operator(-)integer(1)operator(,) integer(12)operator(,) integer(142)operator(,) integer(200)operator(,) integer(136)operator(,) integer(203)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(18)operator(,) integer(186)operator(,) integer(142)operator(,) integer(201)operator(,) integer(187)operator(,) integer(136)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(19)operator(,) integer(188)operator(,) integer(142)operator(,) integer(201)operator(,) integer(189)operator(,) integer(136)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) integer(142)operator(,) + integer(270)operator(,) integer(216)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) integer(270)operator(,) integer(216)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) + integer(270)operator(,) integer(15)operator(,) integer(136)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(20)operator(,) integer(204)operator(,) integer(25)operator(,) + integer(190)operator(,) integer(142)operator(,) integer(201)operator(,) integer(191)operator(,) integer(136)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(157)operator(,) + integer(248)operator(,) integer(192)operator(,) integer(135)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(79)operator(,) integer(141)operator(,) + integer(193)operator(,) integer(273)operator(,) integer(194)operator(,) integer(135)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(4)operator(,) integer(157)operator(,) integer(195)operator(,) + integer(135)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(5)operator(,) integer(158)operator(,) integer(196)operator(,) integer(250)operator(,) integer(135)operator(,) integer(10)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(5)operator(,) integer(261)operator(,) integer(269)operator(,) integer(197)operator(,) integer(158)operator(,) integer(198)operator(,) integer(250)operator(,) + integer(135)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) integer(21)operator(,) operator(-)integer(1)operator(,) integer(22)operator(,) operator(-)integer(1)operator(,) integer(23)operator(,) operator(-)integer(1)operator(,) integer(24)operator(,) + operator(-)integer(1)operator(,) integer(182)operator(,) operator(-)integer(1)operator(,) integer(273)operator(,) operator(-)integer(1)operator(,) integer(105)operator(,) operator(-)integer(1)operator(,) integer(13)operator(,) operator(-)integer(1)operator(,) integer(273)operator(,) + integer(13)operator(,) operator(-)integer(1)operator(,) integer(273)operator(,) operator(-)integer(1)operator(,) integer(105)operator(,) operator(-)integer(1)operator(,) integer(27)operator(,) operator(-)integer(1)operator(,) integer(203)operator(,) operator(-)integer(1)operator(,) + integer(14)operator(,) integer(142)operator(,) integer(200)operator(,) integer(136)operator(,) integer(202)operator(,) operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(15)operator(,) integer(136)operator(,) + operator(-)integer(1)operator(,) integer(155)operator(,) operator(-)integer(1)operator(,) integer(149)operator(,) operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(108)operator(,) integer(108)operator(,) operator(-)integer(1)operator(,) + integer(72)operator(,) operator(-)integer(1)operator(,) integer(108)operator(,) integer(204)operator(,) integer(108)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(28)operator(,) integer(207)operator(,) + integer(205)operator(,) integer(208)operator(,) integer(136)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) integer(148)operator(,) integer(206)operator(,) operator(-)integer(1)operator(,) integer(209)operator(,) integer(124)operator(,) + integer(267)operator(,) integer(170)operator(,) operator(-)integer(1)operator(,) integer(209)operator(,) integer(81)operator(,) integer(267)operator(,) integer(170)operator(,) operator(-)integer(1)operator(,) integer(266)operator(,) integer(169)operator(,) + operator(-)integer(1)operator(,) integer(199)operator(,) integer(124)operator(,) integer(267)operator(,) integer(170)operator(,) operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(267)operator(,) integer(169)operator(,) + operator(-)integer(1)operator(,) integer(199)operator(,) integer(81)operator(,) integer(268)operator(,) operator(-)integer(1)operator(,) integer(31)operator(,) integer(169)operator(,) operator(-)integer(1)operator(,) integer(31)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(120)operator(,) integer(212)operator(,) integer(205)operator(,) integer(213)operator(,) integer(136)operator(,) integer(121)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(26)operator(,) integer(214)operator(,) integer(205)operator(,) integer(215)operator(,) integer(136)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) integer(17)operator(,) integer(217)operator(,) + integer(200)operator(,) integer(136)operator(,) integer(218)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) integer(126)operator(,) integer(91)operator(,) integer(167)operator(,) + operator(-)integer(1)operator(,) integer(91)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) integer(203)operator(,) operator(-)integer(1)operator(,) integer(216)operator(,) operator(-)integer(1)operator(,) integer(8)operator(,) integer(220)operator(,) + integer(221)operator(,) integer(200)operator(,) integer(136)operator(,) integer(219)operator(,) operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) integer(181)operator(,) + operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(84)operator(,) integer(155)operator(,) operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(9)operator(,) integer(136)operator(,) + operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(243)operator(,) operator(-)integer(1)operator(,) integer(240)operator(,) operator(-)integer(1)operator(,) integer(242)operator(,) operator(-)integer(1)operator(,) integer(225)operator(,) + operator(-)integer(1)operator(,) integer(226)operator(,) operator(-)integer(1)operator(,) integer(225)operator(,) integer(226)operator(,) operator(-)integer(1)operator(,) integer(94)operator(,) integer(234)operator(,) integer(101)operator(,) operator(-)integer(1)operator(,) + integer(95)operator(,) integer(235)operator(,) integer(101)operator(,) operator(-)integer(1)operator(,) integer(96)operator(,) integer(235)operator(,) integer(61)operator(,) operator(-)integer(1)operator(,) integer(97)operator(,) integer(129)operator(,) + integer(101)operator(,) operator(-)integer(1)operator(,) integer(97)operator(,) integer(230)operator(,) integer(101)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(230)operator(,) integer(231)operator(,) integer(129)operator(,) + operator(-)integer(1)operator(,) integer(236)operator(,) operator(-)integer(1)operator(,) integer(231)operator(,) integer(236)operator(,) operator(-)integer(1)operator(,) integer(98)operator(,) integer(129)operator(,) integer(101)operator(,) operator(-)integer(1)operator(,) + integer(98)operator(,) integer(233)operator(,) integer(101)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(233)operator(,) integer(58)operator(,) integer(129)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(234)operator(,) integer(236)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(235)operator(,) integer(236)operator(,) operator(-)integer(1)operator(,) integer(58)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(100)operator(,) integer(237)operator(,) integer(239)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(99)operator(,) integer(238)operator(,) integer(136)operator(,) integer(121)operator(,) operator(-)integer(1)operator(,) + integer(52)operator(,) operator(-)integer(1)operator(,) integer(53)operator(,) operator(-)integer(1)operator(,) integer(55)operator(,) operator(-)integer(1)operator(,) integer(247)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(241)operator(,) + operator(-)integer(1)operator(,) integer(158)operator(,) operator(-)integer(1)operator(,) integer(53)operator(,) operator(-)integer(1)operator(,) integer(52)operator(,) operator(-)integer(1)operator(,) integer(55)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) + integer(235)operator(,) integer(101)operator(,) operator(-)integer(1)operator(,) integer(56)operator(,) operator(-)integer(1)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(56)operator(,) operator(-)integer(1)operator(,) + integer(116)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(53)operator(,) operator(-)integer(1)operator(,) integer(52)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) + operator(-)integer(1)operator(,) integer(55)operator(,) operator(-)integer(1)operator(,) integer(33)operator(,) operator(-)integer(1)operator(,) integer(32)operator(,) operator(-)integer(1)operator(,) integer(34)operator(,) operator(-)integer(1)operator(,) integer(35)operator(,) + operator(-)integer(1)operator(,) integer(49)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) operator(-)integer(1)operator(,) integer(244)operator(,) operator(-)integer(1)operator(,) integer(244)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) + operator(-)integer(1)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(273)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(107)operator(,) integer(249)operator(,) integer(142)operator(,) integer(273)operator(,) + operator(-)integer(1)operator(,) integer(1)operator(,) integer(273)operator(,) operator(-)integer(1)operator(,) integer(128)operator(,) integer(251)operator(,) integer(271)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) integer(251)operator(,) + integer(273)operator(,) operator(-)integer(1)operator(,) integer(253)operator(,) integer(126)operator(,) integer(255)operator(,) integer(126)operator(,) integer(257)operator(,) integer(260)operator(,) operator(-)integer(1)operator(,) integer(253)operator(,) + integer(126)operator(,) integer(255)operator(,) integer(260)operator(,) operator(-)integer(1)operator(,) integer(253)operator(,) integer(126)operator(,) integer(257)operator(,) integer(260)operator(,) operator(-)integer(1)operator(,) integer(253)operator(,) + integer(260)operator(,) operator(-)integer(1)operator(,) integer(255)operator(,) integer(126)operator(,) integer(257)operator(,) integer(260)operator(,) operator(-)integer(1)operator(,) integer(255)operator(,) integer(260)operator(,) operator(-)integer(1)operator(,) + integer(257)operator(,) integer(260)operator(,) operator(-)integer(1)operator(,) integer(259)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) integer(53)operator(,) operator(-)integer(1)operator(,) + integer(52)operator(,) operator(-)integer(1)operator(,) integer(55)operator(,) operator(-)integer(1)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(252)operator(,) operator(-)integer(1)operator(,) integer(253)operator(,) integer(126)operator(,) + integer(252)operator(,) operator(-)integer(1)operator(,) integer(50)operator(,) integer(103)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) integer(254)operator(,) operator(-)integer(1)operator(,) integer(255)operator(,) integer(126)operator(,) + integer(254)operator(,) operator(-)integer(1)operator(,) integer(113)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(256)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(256)operator(,) + operator(-)integer(1)operator(,) integer(110)operator(,) operator(-)integer(1)operator(,) integer(92)operator(,) operator(-)integer(1)operator(,) integer(258)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(126)operator(,) integer(259)operator(,) + operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(245)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(128)operator(,) integer(262)operator(,) integer(141)operator(,) integer(271)operator(,) + integer(125)operator(,) operator(-)integer(1)operator(,) integer(275)operator(,) operator(-)integer(1)operator(,) integer(264)operator(,) integer(272)operator(,) operator(-)integer(1)operator(,) integer(180)operator(,) integer(272)operator(,) operator(-)integer(1)operator(,) + integer(265)operator(,) operator(-)integer(1)operator(,) integer(264)operator(,) integer(126)operator(,) integer(265)operator(,) operator(-)integer(1)operator(,) integer(167)operator(,) integer(84)operator(,) integer(167)operator(,) operator(-)integer(1)operator(,) + integer(50)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) integer(51)operator(,) operator(-)integer(1)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) + integer(51)operator(,) operator(-)integer(1)operator(,) integer(163)operator(,) operator(-)integer(1)operator(,) integer(50)operator(,) operator(-)integer(1)operator(,) integer(51)operator(,) operator(-)integer(1)operator(,) integer(163)operator(,) operator(-)integer(1)operator(,) + integer(124)operator(,) operator(-)integer(1)operator(,) integer(81)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(274)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(130)operator(,) operator(-)integer(1)operator(,) integer(126)operator(,) operator(-)integer(1)operator(,) integer(131)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) operator(-)integer(1)operator(,) integer(273)operator(,) + operator(-)integer(1)operator(,) integer(274)operator(,) integer(131)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1) +operator(};) + +comment(/* YYRLINE[YYN] -- source line where rule number YYN was defined. */) +directive(static) directive(const) ident(yytype_uint16) ident(yyrline)operator([]) operator(=) +operator({) + integer(0)operator(,) integer(350)operator(,) integer(350)operator(,) integer(350)operator(,) integer(375)operator(,) integer(395)operator(,) integer(403)operator(,) integer(404)operator(,) integer(408)operator(,) integer(412)operator(,) + integer(418)operator(,) integer(418)operator(,) integer(422)operator(,) integer(426)operator(,) integer(433)operator(,) integer(438)operator(,) integer(442)operator(,) integer(451)operator(,) integer(460)operator(,) integer(472)operator(,) + integer(484)operator(,) integer(490)operator(,) integer(489)operator(,) integer(503)operator(,) integer(511)operator(,) integer(515)operator(,) integer(521)operator(,) integer(546)operator(,) integer(562)operator(,) integer(574)operator(,) + integer(586)operator(,) integer(598)operator(,) integer(603)operator(,) integer(607)operator(,) integer(612)operator(,) integer(617)operator(,) integer(620)operator(,) integer(621)operator(,) integer(625)operator(,) integer(629)operator(,) + integer(633)operator(,) integer(637)operator(,) integer(640)operator(,) integer(647)operator(,) integer(648)operator(,) integer(649)operator(,) integer(653)operator(,) integer(657)operator(,) integer(663)operator(,) integer(664)operator(,) + integer(668)operator(,) integer(675)operator(,) integer(679)operator(,) integer(674)operator(,) integer(689)operator(,) integer(694)operator(,) integer(706)operator(,) integer(711)operator(,) integer(723)operator(,) integer(728)operator(,) + integer(740)operator(,) integer(745)operator(,) integer(752)operator(,) integer(753)operator(,) integer(759)operator(,) integer(760)operator(,) integer(766)operator(,) integer(770)operator(,) integer(774)operator(,) integer(778)operator(,) + integer(782)operator(,) integer(786)operator(,) integer(792)operator(,) integer(793)operator(,) integer(799)operator(,) integer(803)operator(,) integer(809)operator(,) integer(813)operator(,) integer(817)operator(,) integer(821)operator(,) + integer(825)operator(,) integer(829)operator(,) integer(835)operator(,) integer(841)operator(,) integer(848)operator(,) integer(852)operator(,) integer(856)operator(,) integer(860)operator(,) integer(864)operator(,) integer(868)operator(,) + integer(874)operator(,) integer(880)operator(,) integer(887)operator(,) integer(891)operator(,) integer(894)operator(,) integer(898)operator(,) integer(902)operator(,) integer(908)operator(,) integer(909)operator(,) integer(910)operator(,) + integer(911)operator(,) integer(916)operator(,) integer(923)operator(,) integer(924)operator(,) integer(927)operator(,) integer(931)operator(,) integer(934)operator(,) integer(938)operator(,) integer(938)operator(,) integer(944)operator(,) + integer(945)operator(,) integer(946)operator(,) integer(947)operator(,) integer(948)operator(,) integer(949)operator(,) integer(950)operator(,) integer(951)operator(,) integer(952)operator(,) integer(953)operator(,) integer(954)operator(,) + integer(955)operator(,) integer(956)operator(,) integer(957)operator(,) integer(958)operator(,) integer(959)operator(,) integer(960)operator(,) integer(961)operator(,) integer(962)operator(,) integer(963)operator(,) integer(964)operator(,) + integer(965)operator(,) integer(966)operator(,) integer(967)operator(,) integer(968)operator(,) integer(969)operator(,) integer(972)operator(,) integer(972)operator(,) integer(972)operator(,) integer(972)operator(,) integer(973)operator(,) + integer(973)operator(,) integer(973)operator(,) integer(973)operator(,) integer(973)operator(,) integer(973)operator(,) integer(973)operator(,) integer(974)operator(,) integer(974)operator(,) integer(974)operator(,) integer(974)operator(,) + integer(974)operator(,) integer(974)operator(,) integer(974)operator(,) integer(975)operator(,) integer(975)operator(,) integer(975)operator(,) integer(975)operator(,) integer(975)operator(,) integer(975)operator(,) integer(976)operator(,) + integer(976)operator(,) integer(976)operator(,) integer(976)operator(,) integer(976)operator(,) integer(976)operator(,) integer(976)operator(,) integer(977)operator(,) integer(977)operator(,) integer(977)operator(,) integer(977)operator(,) + integer(977)operator(,) integer(978)operator(,) integer(978)operator(,) integer(978)operator(,) integer(978)operator(,) integer(981)operator(,) integer(985)operator(,) integer(989)operator(,) integer(1014)operator(,) integer(1030)operator(,) + integer(1042)operator(,) integer(1054)operator(,) integer(1066)operator(,) integer(1071)operator(,) integer(1076)operator(,) integer(1081)operator(,) integer(1091)operator(,) integer(1101)operator(,) integer(1105)operator(,) integer(1109)operator(,) + integer(1113)operator(,) integer(1117)operator(,) integer(1121)operator(,) integer(1125)operator(,) integer(1129)operator(,) integer(1133)operator(,) integer(1142)operator(,) integer(1146)operator(,) integer(1150)operator(,) integer(1154)operator(,) + integer(1158)operator(,) integer(1162)operator(,) integer(1166)operator(,) integer(1170)operator(,) integer(1174)operator(,) integer(1178)operator(,) integer(1182)operator(,) integer(1186)operator(,) integer(1190)operator(,) integer(1194)operator(,) + integer(1198)operator(,) integer(1202)operator(,) integer(1206)operator(,) integer(1210)operator(,) integer(1214)operator(,) integer(1218)operator(,) integer(1222)operator(,) integer(1222)operator(,) integer(1227)operator(,) integer(1232)operator(,) + integer(1238)operator(,) integer(1245)operator(,) integer(1246)operator(,) integer(1251)operator(,) integer(1255)operator(,) integer(1260)operator(,) integer(1264)operator(,) integer(1271)operator(,) integer(1275)operator(,) integer(1279)operator(,) + integer(1284)operator(,) integer(1291)operator(,) integer(1292)operator(,) integer(1295)operator(,) integer(1300)operator(,) integer(1304)operator(,) integer(1309)operator(,) integer(1314)operator(,) integer(1319)operator(,) integer(1324)operator(,) + integer(1330)operator(,) integer(1334)operator(,) integer(1337)operator(,) integer(1341)operator(,) integer(1345)operator(,) integer(1350)operator(,) integer(1355)operator(,) integer(1360)operator(,) integer(1365)operator(,) integer(1370)operator(,) + integer(1375)operator(,) integer(1380)operator(,) integer(1385)operator(,) integer(1389)operator(,) integer(1392)operator(,) integer(1392)operator(,) integer(1404)operator(,) integer(1405)operator(,) integer(1405)operator(,) integer(1410)operator(,) + integer(1410)operator(,) integer(1417)operator(,) integer(1423)operator(,) integer(1427)operator(,) integer(1430)operator(,) integer(1434)operator(,) integer(1440)operator(,) integer(1444)operator(,) integer(1448)operator(,) integer(1454)operator(,) + integer(1455)operator(,) integer(1456)operator(,) integer(1457)operator(,) integer(1458)operator(,) integer(1459)operator(,) integer(1460)operator(,) integer(1461)operator(,) integer(1462)operator(,) integer(1467)operator(,) integer(1466)operator(,) + integer(1479)operator(,) integer(1479)operator(,) integer(1484)operator(,) integer(1489)operator(,) integer(1493)operator(,) integer(1497)operator(,) integer(1505)operator(,) integer(1514)operator(,) integer(1518)operator(,) integer(1522)operator(,) + integer(1526)operator(,) integer(1530)operator(,) integer(1534)operator(,) integer(1534)operator(,) integer(1539)operator(,) integer(1545)operator(,) integer(1546)operator(,) integer(1555)operator(,) integer(1568)operator(,) integer(1581)operator(,) + integer(1581)operator(,) integer(1581)operator(,) integer(1591)operator(,) integer(1591)operator(,) integer(1591)operator(,) integer(1601)operator(,) integer(1608)operator(,) integer(1612)operator(,) integer(1616)operator(,) integer(1616)operator(,) + integer(1616)operator(,) integer(1624)operator(,) integer(1623)operator(,) integer(1640)operator(,) integer(1645)operator(,) integer(1639)operator(,) integer(1662)operator(,) integer(1661)operator(,) integer(1678)operator(,) integer(1677)operator(,) + integer(1695)operator(,) integer(1696)operator(,) integer(1695)operator(,) integer(1710)operator(,) integer(1714)operator(,) integer(1718)operator(,) integer(1722)operator(,) integer(1728)operator(,) integer(1735)operator(,) integer(1736)operator(,) + integer(1737)operator(,) integer(1738)operator(,) integer(1741)operator(,) integer(1742)operator(,) integer(1743)operator(,) integer(1746)operator(,) integer(1747)operator(,) integer(1756)operator(,) integer(1757)operator(,) integer(1763)operator(,) + integer(1764)operator(,) integer(1767)operator(,) integer(1768)operator(,) integer(1772)operator(,) integer(1776)operator(,) integer(1783)operator(,) integer(1787)operator(,) integer(1782)operator(,) integer(1797)operator(,) integer(1806)operator(,) + integer(1810)operator(,) integer(1816)operator(,) integer(1821)operator(,) integer(1826)operator(,) integer(1831)operator(,) integer(1835)operator(,) integer(1839)operator(,) integer(1846)operator(,) integer(1850)operator(,) integer(1845)operator(,) + integer(1858)operator(,) integer(1862)operator(,) integer(1857)operator(,) integer(1871)operator(,) integer(1878)operator(,) integer(1879)operator(,) integer(1883)operator(,) integer(1889)operator(,) integer(1890)operator(,) integer(1893)operator(,) + integer(1904)operator(,) integer(1907)operator(,) integer(1911)operator(,) integer(1912)operator(,) integer(1915)operator(,) integer(1919)operator(,) integer(1922)operator(,) integer(1930)operator(,) integer(1933)operator(,) integer(1934)operator(,) + integer(1938)operator(,) integer(1941)operator(,) integer(1954)operator(,) integer(1955)operator(,) integer(1961)operator(,) integer(1967)operator(,) integer(1990)operator(,) integer(2023)operator(,) integer(2027)operator(,) integer(2034)operator(,) + integer(2037)operator(,) integer(2043)operator(,) integer(2044)operator(,) integer(2050)operator(,) integer(2054)operator(,) integer(2061)operator(,) integer(2064)operator(,) integer(2071)operator(,) integer(2074)operator(,) integer(2081)operator(,) + integer(2084)operator(,) integer(2090)operator(,) integer(2092)operator(,) integer(2091)operator(,) integer(2103)operator(,) integer(2102)operator(,) integer(2123)operator(,) integer(2124)operator(,) integer(2125)operator(,) integer(2126)operator(,) + integer(2129)operator(,) integer(2136)operator(,) integer(2137)operator(,) integer(2138)operator(,) integer(2139)operator(,) integer(2142)operator(,) integer(2176)operator(,) integer(2177)operator(,) integer(2178)operator(,) integer(2182)operator(,) + integer(2188)operator(,) integer(2189)operator(,) integer(2190)operator(,) integer(2191)operator(,) integer(2192)operator(,) integer(2193)operator(,) integer(2194)operator(,) integer(2195)operator(,) integer(2196)operator(,) integer(2197)operator(,) + integer(2198)operator(,) integer(2201)operator(,) integer(2207)operator(,) integer(2213)operator(,) integer(2214)operator(,) integer(2217)operator(,) integer(2222)operator(,) integer(2221)operator(,) integer(2229)operator(,) integer(2232)operator(,) + integer(2238)operator(,) integer(2244)operator(,) integer(2248)operator(,) integer(2252)operator(,) integer(2256)operator(,) integer(2260)operator(,) integer(2264)operator(,) integer(2268)operator(,) integer(2272)operator(,) integer(2277)operator(,) + integer(2282)operator(,) integer(2286)operator(,) integer(2290)operator(,) integer(2294)operator(,) integer(2298)operator(,) integer(2309)operator(,) integer(2310)operator(,) integer(2316)operator(,) integer(2326)operator(,) integer(2331)operator(,) + integer(2337)operator(,) integer(2338)operator(,) integer(2341)operator(,) integer(2352)operator(,) integer(2363)operator(,) integer(2364)operator(,) integer(2367)operator(,) integer(2377)operator(,) integer(2381)operator(,) integer(2384)operator(,) + integer(2389)operator(,) integer(2389)operator(,) integer(2414)operator(,) integer(2415)operator(,) integer(2419)operator(,) integer(2428)operator(,) integer(2429)operator(,) integer(2435)operator(,) integer(2441)operator(,) integer(2442)operator(,) + integer(2443)operator(,) integer(2446)operator(,) integer(2447)operator(,) integer(2448)operator(,) integer(2449)operator(,) integer(2452)operator(,) integer(2453)operator(,) integer(2454)operator(,) integer(2457)operator(,) integer(2458)operator(,) + integer(2461)operator(,) integer(2462)operator(,) integer(2465)operator(,) integer(2466)operator(,) integer(2469)operator(,) integer(2470)operator(,) integer(2471)operator(,) integer(2474)operator(,) integer(2475)operator(,) integer(2478)operator(,) + integer(2479)operator(,) integer(2482) +operator(};) +preprocessor(#endif) + +preprocessor(#if) ident(YYDEBUG) operator(||) ident(YYERROR_VERBOSE) operator(||) ident(YYTOKEN_TABLE) +comment(/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */) +directive(static) directive(const) pre_type(char) operator(*)directive(const) ident(yytname)operator([]) operator(=) +operator({) + string<delimiter(")content($end)delimiter(")>operator(,) string<delimiter(")content(error)delimiter(")>operator(,) string<delimiter(")content($undefined)delimiter(")>operator(,) string<delimiter(")content(kCLASS)delimiter(")>operator(,) string<delimiter(")content(kMODULE)delimiter(")>operator(,) string<delimiter(")content(kDEF)delimiter(")>operator(,) string<delimiter(")content(kUNDEF)delimiter(")>operator(,) + string<delimiter(")content(kBEGIN)delimiter(")>operator(,) string<delimiter(")content(kRESCUE)delimiter(")>operator(,) string<delimiter(")content(kENSURE)delimiter(")>operator(,) string<delimiter(")content(kEND)delimiter(")>operator(,) string<delimiter(")content(kIF)delimiter(")>operator(,) string<delimiter(")content(kUNLESS)delimiter(")>operator(,) string<delimiter(")content(kTHEN)delimiter(")>operator(,) + string<delimiter(")content(kELSIF)delimiter(")>operator(,) string<delimiter(")content(kELSE)delimiter(")>operator(,) string<delimiter(")content(kCASE)delimiter(")>operator(,) string<delimiter(")content(kWHEN)delimiter(")>operator(,) string<delimiter(")content(kWHILE)delimiter(")>operator(,) string<delimiter(")content(kUNTIL)delimiter(")>operator(,) string<delimiter(")content(kFOR)delimiter(")>operator(,) + string<delimiter(")content(kBREAK)delimiter(")>operator(,) string<delimiter(")content(kNEXT)delimiter(")>operator(,) string<delimiter(")content(kREDO)delimiter(")>operator(,) string<delimiter(")content(kRETRY)delimiter(")>operator(,) string<delimiter(")content(kIN)delimiter(")>operator(,) string<delimiter(")content(kDO)delimiter(")>operator(,) string<delimiter(")content(kDO_COND)delimiter(")>operator(,) + string<delimiter(")content(kDO_BLOCK)delimiter(")>operator(,) string<delimiter(")content(kRETURN)delimiter(")>operator(,) string<delimiter(")content(kYIELD)delimiter(")>operator(,) string<delimiter(")content(kSUPER)delimiter(")>operator(,) string<delimiter(")content(kSELF)delimiter(")>operator(,) string<delimiter(")content(kNIL)delimiter(")>operator(,) string<delimiter(")content(kTRUE)delimiter(")>operator(,) + string<delimiter(")content(kFALSE)delimiter(")>operator(,) string<delimiter(")content(kAND)delimiter(")>operator(,) string<delimiter(")content(kOR)delimiter(")>operator(,) string<delimiter(")content(kNOT)delimiter(")>operator(,) string<delimiter(")content(kIF_MOD)delimiter(")>operator(,) string<delimiter(")content(kUNLESS_MOD)delimiter(")>operator(,) string<delimiter(")content(kWHILE_MOD)delimiter(")>operator(,) + string<delimiter(")content(kUNTIL_MOD)delimiter(")>operator(,) string<delimiter(")content(kRESCUE_MOD)delimiter(")>operator(,) string<delimiter(")content(kALIAS)delimiter(")>operator(,) string<delimiter(")content(kDEFINED)delimiter(")>operator(,) string<delimiter(")content(klBEGIN)delimiter(")>operator(,) string<delimiter(")content(klEND)delimiter(")>operator(,) + string<delimiter(")content(k__LINE__)delimiter(")>operator(,) string<delimiter(")content(k__FILE__)delimiter(")>operator(,) string<delimiter(")content(tIDENTIFIER)delimiter(")>operator(,) string<delimiter(")content(tFID)delimiter(")>operator(,) string<delimiter(")content(tGVAR)delimiter(")>operator(,) string<delimiter(")content(tIVAR)delimiter(")>operator(,) + string<delimiter(")content(tCONSTANT)delimiter(")>operator(,) string<delimiter(")content(tCVAR)delimiter(")>operator(,) string<delimiter(")content(tINTEGER)delimiter(")>operator(,) string<delimiter(")content(tFLOAT)delimiter(")>operator(,) string<delimiter(")content(tSTRING_CONTENT)delimiter(")>operator(,) + string<delimiter(")content(tNTH_REF)delimiter(")>operator(,) string<delimiter(")content(tBACK_REF)delimiter(")>operator(,) string<delimiter(")content(tREGEXP_END)delimiter(")>operator(,) string<delimiter(")content(tUPLUS)delimiter(")>operator(,) string<delimiter(")content(tUMINUS)delimiter(")>operator(,) string<delimiter(")content(tPOW)delimiter(")>operator(,) + string<delimiter(")content(tCMP)delimiter(")>operator(,) string<delimiter(")content(tEQ)delimiter(")>operator(,) string<delimiter(")content(tEQQ)delimiter(")>operator(,) string<delimiter(")content(tNEQ)delimiter(")>operator(,) string<delimiter(")content(tGEQ)delimiter(")>operator(,) string<delimiter(")content(tLEQ)delimiter(")>operator(,) string<delimiter(")content(tANDOP)delimiter(")>operator(,) string<delimiter(")content(tOROP)delimiter(")>operator(,) + string<delimiter(")content(tMATCH)delimiter(")>operator(,) string<delimiter(")content(tNMATCH)delimiter(")>operator(,) string<delimiter(")content(tDOT2)delimiter(")>operator(,) string<delimiter(")content(tDOT3)delimiter(")>operator(,) string<delimiter(")content(tAREF)delimiter(")>operator(,) string<delimiter(")content(tASET)delimiter(")>operator(,) string<delimiter(")content(tLSHFT)delimiter(")>operator(,) + string<delimiter(")content(tRSHFT)delimiter(")>operator(,) string<delimiter(")content(tCOLON2)delimiter(")>operator(,) string<delimiter(")content(tCOLON3)delimiter(")>operator(,) string<delimiter(")content(tOP_ASGN)delimiter(")>operator(,) string<delimiter(")content(tASSOC)delimiter(")>operator(,) string<delimiter(")content(tLPAREN)delimiter(")>operator(,) + string<delimiter(")content(tLPAREN_ARG)delimiter(")>operator(,) string<delimiter(")content(tRPAREN)delimiter(")>operator(,) string<delimiter(")content(tLBRACK)delimiter(")>operator(,) string<delimiter(")content(tLBRACE)delimiter(")>operator(,) string<delimiter(")content(tLBRACE_ARG)delimiter(")>operator(,) string<delimiter(")content(tSTAR)delimiter(")>operator(,) + string<delimiter(")content(tAMPER)delimiter(")>operator(,) string<delimiter(")content(tSYMBEG)delimiter(")>operator(,) string<delimiter(")content(tSTRING_BEG)delimiter(")>operator(,) string<delimiter(")content(tXSTRING_BEG)delimiter(")>operator(,) string<delimiter(")content(tREGEXP_BEG)delimiter(")>operator(,) + string<delimiter(")content(tWORDS_BEG)delimiter(")>operator(,) string<delimiter(")content(tQWORDS_BEG)delimiter(")>operator(,) string<delimiter(")content(tSTRING_DBEG)delimiter(")>operator(,) string<delimiter(")content(tSTRING_DVAR)delimiter(")>operator(,) + string<delimiter(")content(tSTRING_END)delimiter(")>operator(,) string<delimiter(")content(tLOWEST)delimiter(")>operator(,) string<delimiter(")content('=')delimiter(")>operator(,) string<delimiter(")content('?')delimiter(")>operator(,) string<delimiter(")content(':')delimiter(")>operator(,) string<delimiter(")content('>')delimiter(")>operator(,) string<delimiter(")content('<')delimiter(")>operator(,) string<delimiter(")content('|')delimiter(")>operator(,) + string<delimiter(")content('^')delimiter(")>operator(,) string<delimiter(")content('&')delimiter(")>operator(,) string<delimiter(")content('+')delimiter(")>operator(,) string<delimiter(")content('-')delimiter(")>operator(,) string<delimiter(")content('*')delimiter(")>operator(,) string<delimiter(")content('/')delimiter(")>operator(,) string<delimiter(")content('%')delimiter(")>operator(,) string<delimiter(")content(tUMINUS_NUM)delimiter(")>operator(,) string<delimiter(")content('!')delimiter(")>operator(,) + string<delimiter(")content('~')delimiter(")>operator(,) string<delimiter(")content(tLAST_TOKEN)delimiter(")>operator(,) string<delimiter(")content('{')delimiter(")>operator(,) string<delimiter(")content('}')delimiter(")>operator(,) string<delimiter(")content('[')delimiter(")>operator(,) string<delimiter(")content(']')delimiter(")>operator(,) string<delimiter(")content('.')delimiter(")>operator(,) string<delimiter(")content('\)')delimiter(")>operator(,) string<delimiter(")content(',')delimiter(")>operator(,) + string<delimiter(")content('`')delimiter(")>operator(,) string<delimiter(")content('(')delimiter(")>operator(,) string<delimiter(")content(' ')delimiter(")>operator(,) string<delimiter(")content(')char(\\\\)content(n')delimiter(")>operator(,) string<delimiter(")content(';')delimiter(")>operator(,) string<delimiter(")content($accept)delimiter(")>operator(,) string<delimiter(")content(program)delimiter(")>operator(,) string<delimiter(")content(@1)delimiter(")>operator(,) + string<delimiter(")content(bodystmt)delimiter(")>operator(,) string<delimiter(")content(compstmt)delimiter(")>operator(,) string<delimiter(")content(stmts)delimiter(")>operator(,) string<delimiter(")content(stmt)delimiter(")>operator(,) string<delimiter(")content(@2)delimiter(")>operator(,) string<delimiter(")content(@3)delimiter(")>operator(,) string<delimiter(")content(expr)delimiter(")>operator(,) + string<delimiter(")content(expr_value)delimiter(")>operator(,) string<delimiter(")content(command_call)delimiter(")>operator(,) string<delimiter(")content(block_command)delimiter(")>operator(,) string<delimiter(")content(cmd_brace_block)delimiter(")>operator(,) string<delimiter(")content(@4)delimiter(")>operator(,) + string<delimiter(")content(@5)delimiter(")>operator(,) string<delimiter(")content(command)delimiter(")>operator(,) string<delimiter(")content(mlhs)delimiter(")>operator(,) string<delimiter(")content(mlhs_entry)delimiter(")>operator(,) string<delimiter(")content(mlhs_basic)delimiter(")>operator(,) string<delimiter(")content(mlhs_item)delimiter(")>operator(,) + string<delimiter(")content(mlhs_head)delimiter(")>operator(,) string<delimiter(")content(mlhs_node)delimiter(")>operator(,) string<delimiter(")content(lhs)delimiter(")>operator(,) string<delimiter(")content(cname)delimiter(")>operator(,) string<delimiter(")content(cpath)delimiter(")>operator(,) string<delimiter(")content(fname)delimiter(")>operator(,) string<delimiter(")content(fsym)delimiter(")>operator(,) + string<delimiter(")content(fitem)delimiter(")>operator(,) string<delimiter(")content(undef_list)delimiter(")>operator(,) string<delimiter(")content(@6)delimiter(")>operator(,) string<delimiter(")content(op)delimiter(")>operator(,) string<delimiter(")content(reswords)delimiter(")>operator(,) string<delimiter(")content(arg)delimiter(")>operator(,) string<delimiter(")content(@7)delimiter(")>operator(,) string<delimiter(")content(arg_value)delimiter(")>operator(,) + string<delimiter(")content(aref_args)delimiter(")>operator(,) string<delimiter(")content(paren_args)delimiter(")>operator(,) string<delimiter(")content(opt_paren_args)delimiter(")>operator(,) string<delimiter(")content(call_args)delimiter(")>operator(,) string<delimiter(")content(call_args2)delimiter(")>operator(,) + string<delimiter(")content(command_args)delimiter(")>operator(,) string<delimiter(")content(@8)delimiter(")>operator(,) string<delimiter(")content(open_args)delimiter(")>operator(,) string<delimiter(")content(@9)delimiter(")>operator(,) string<delimiter(")content(@10)delimiter(")>operator(,) string<delimiter(")content(block_arg)delimiter(")>operator(,) + string<delimiter(")content(opt_block_arg)delimiter(")>operator(,) string<delimiter(")content(args)delimiter(")>operator(,) string<delimiter(")content(mrhs)delimiter(")>operator(,) string<delimiter(")content(primary)delimiter(")>operator(,) string<delimiter(")content(@11)delimiter(")>operator(,) string<delimiter(")content(@12)delimiter(")>operator(,) string<delimiter(")content(@13)delimiter(")>operator(,) string<delimiter(")content(@14)delimiter(")>operator(,) + string<delimiter(")content(@15)delimiter(")>operator(,) string<delimiter(")content(@16)delimiter(")>operator(,) string<delimiter(")content(@17)delimiter(")>operator(,) string<delimiter(")content(@18)delimiter(")>operator(,) string<delimiter(")content(@19)delimiter(")>operator(,) string<delimiter(")content(@20)delimiter(")>operator(,) string<delimiter(")content(@21)delimiter(")>operator(,) string<delimiter(")content(@22)delimiter(")>operator(,) string<delimiter(")content(@23)delimiter(")>operator(,) string<delimiter(")content(@24)delimiter(")>operator(,) + string<delimiter(")content(@25)delimiter(")>operator(,) string<delimiter(")content(@26)delimiter(")>operator(,) string<delimiter(")content(primary_value)delimiter(")>operator(,) string<delimiter(")content(then)delimiter(")>operator(,) string<delimiter(")content(do)delimiter(")>operator(,) string<delimiter(")content(if_tail)delimiter(")>operator(,) string<delimiter(")content(opt_else)delimiter(")>operator(,) + string<delimiter(")content(block_var)delimiter(")>operator(,) string<delimiter(")content(opt_block_var)delimiter(")>operator(,) string<delimiter(")content(do_block)delimiter(")>operator(,) string<delimiter(")content(@27)delimiter(")>operator(,) string<delimiter(")content(@28)delimiter(")>operator(,) string<delimiter(")content(block_call)delimiter(")>operator(,) + string<delimiter(")content(method_call)delimiter(")>operator(,) string<delimiter(")content(brace_block)delimiter(")>operator(,) string<delimiter(")content(@29)delimiter(")>operator(,) string<delimiter(")content(@30)delimiter(")>operator(,) string<delimiter(")content(@31)delimiter(")>operator(,) string<delimiter(")content(@32)delimiter(")>operator(,) string<delimiter(")content(case_body)delimiter(")>operator(,) + string<delimiter(")content(when_args)delimiter(")>operator(,) string<delimiter(")content(cases)delimiter(")>operator(,) string<delimiter(")content(opt_rescue)delimiter(")>operator(,) string<delimiter(")content(exc_list)delimiter(")>operator(,) string<delimiter(")content(exc_var)delimiter(")>operator(,) string<delimiter(")content(opt_ensure)delimiter(")>operator(,) + string<delimiter(")content(literal)delimiter(")>operator(,) string<delimiter(")content(strings)delimiter(")>operator(,) string<delimiter(")content(string)delimiter(")>operator(,) string<delimiter(")content(string1)delimiter(")>operator(,) string<delimiter(")content(xstring)delimiter(")>operator(,) string<delimiter(")content(regexp)delimiter(")>operator(,) string<delimiter(")content(words)delimiter(")>operator(,) + string<delimiter(")content(word_list)delimiter(")>operator(,) string<delimiter(")content(word)delimiter(")>operator(,) string<delimiter(")content(qwords)delimiter(")>operator(,) string<delimiter(")content(qword_list)delimiter(")>operator(,) string<delimiter(")content(string_contents)delimiter(")>operator(,) + string<delimiter(")content(xstring_contents)delimiter(")>operator(,) string<delimiter(")content(string_content)delimiter(")>operator(,) string<delimiter(")content(@33)delimiter(")>operator(,) string<delimiter(")content(@34)delimiter(")>operator(,) string<delimiter(")content(string_dvar)delimiter(")>operator(,) + string<delimiter(")content(symbol)delimiter(")>operator(,) string<delimiter(")content(sym)delimiter(")>operator(,) string<delimiter(")content(dsym)delimiter(")>operator(,) string<delimiter(")content(numeric)delimiter(")>operator(,) string<delimiter(")content(variable)delimiter(")>operator(,) string<delimiter(")content(var_ref)delimiter(")>operator(,) string<delimiter(")content(var_lhs)delimiter(")>operator(,) + string<delimiter(")content(backref)delimiter(")>operator(,) string<delimiter(")content(superclass)delimiter(")>operator(,) string<delimiter(")content(@35)delimiter(")>operator(,) string<delimiter(")content(f_arglist)delimiter(")>operator(,) string<delimiter(")content(f_args)delimiter(")>operator(,) string<delimiter(")content(f_norm_arg)delimiter(")>operator(,) + string<delimiter(")content(f_arg)delimiter(")>operator(,) string<delimiter(")content(f_opt)delimiter(")>operator(,) string<delimiter(")content(f_optarg)delimiter(")>operator(,) string<delimiter(")content(restarg_mark)delimiter(")>operator(,) string<delimiter(")content(f_rest_arg)delimiter(")>operator(,) + string<delimiter(")content(blkarg_mark)delimiter(")>operator(,) string<delimiter(")content(f_block_arg)delimiter(")>operator(,) string<delimiter(")content(opt_f_block_arg)delimiter(")>operator(,) string<delimiter(")content(singleton)delimiter(")>operator(,) string<delimiter(")content(@36)delimiter(")>operator(,) + string<delimiter(")content(assoc_list)delimiter(")>operator(,) string<delimiter(")content(assocs)delimiter(")>operator(,) string<delimiter(")content(assoc)delimiter(")>operator(,) string<delimiter(")content(operation)delimiter(")>operator(,) string<delimiter(")content(operation2)delimiter(")>operator(,) string<delimiter(")content(operation3)delimiter(")>operator(,) + string<delimiter(")content(dot_or_colon)delimiter(")>operator(,) string<delimiter(")content(opt_terms)delimiter(")>operator(,) string<delimiter(")content(opt_nl)delimiter(")>operator(,) string<delimiter(")content(trailer)delimiter(")>operator(,) string<delimiter(")content(term)delimiter(")>operator(,) string<delimiter(")content(terms)delimiter(")>operator(,) + string<delimiter(")content(none)delimiter(")>operator(,) integer(0) +operator(};) +preprocessor(#endif) + +preprocessor(# ifdef) ident(YYPRINT) +comment(/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */) +directive(static) directive(const) ident(yytype_uint16) ident(yytoknum)operator([]) operator(=) +operator({) + integer(0)operator(,) integer(256)operator(,) integer(257)operator(,) integer(258)operator(,) integer(259)operator(,) integer(260)operator(,) integer(261)operator(,) integer(262)operator(,) integer(263)operator(,) integer(264)operator(,) + integer(265)operator(,) integer(266)operator(,) integer(267)operator(,) integer(268)operator(,) integer(269)operator(,) integer(270)operator(,) integer(271)operator(,) integer(272)operator(,) integer(273)operator(,) integer(274)operator(,) + integer(275)operator(,) integer(276)operator(,) integer(277)operator(,) integer(278)operator(,) integer(279)operator(,) integer(280)operator(,) integer(281)operator(,) integer(282)operator(,) integer(283)operator(,) integer(284)operator(,) + integer(285)operator(,) integer(286)operator(,) integer(287)operator(,) integer(288)operator(,) integer(289)operator(,) integer(290)operator(,) integer(291)operator(,) integer(292)operator(,) integer(293)operator(,) integer(294)operator(,) + integer(295)operator(,) integer(296)operator(,) integer(297)operator(,) integer(298)operator(,) integer(299)operator(,) integer(300)operator(,) integer(301)operator(,) integer(302)operator(,) integer(303)operator(,) integer(304)operator(,) + integer(305)operator(,) integer(306)operator(,) integer(307)operator(,) integer(308)operator(,) integer(309)operator(,) integer(310)operator(,) integer(311)operator(,) integer(312)operator(,) integer(313)operator(,) integer(314)operator(,) + integer(315)operator(,) integer(316)operator(,) integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(324)operator(,) + integer(325)operator(,) integer(326)operator(,) integer(327)operator(,) integer(328)operator(,) integer(329)operator(,) integer(330)operator(,) integer(331)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) + integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) integer(342)operator(,) integer(343)operator(,) integer(344)operator(,) + integer(345)operator(,) integer(346)operator(,) integer(347)operator(,) integer(348)operator(,) integer(349)operator(,) integer(350)operator(,) integer(351)operator(,) integer(352)operator(,) integer(353)operator(,) integer(354)operator(,) + integer(355)operator(,) integer(356)operator(,) integer(357)operator(,) integer(61)operator(,) integer(63)operator(,) integer(58)operator(,) integer(62)operator(,) integer(60)operator(,) integer(124)operator(,) integer(94)operator(,) + integer(38)operator(,) integer(43)operator(,) integer(45)operator(,) integer(42)operator(,) integer(47)operator(,) integer(37)operator(,) integer(358)operator(,) integer(33)operator(,) integer(126)operator(,) integer(359)operator(,) + integer(123)operator(,) integer(125)operator(,) integer(91)operator(,) integer(93)operator(,) integer(46)operator(,) integer(41)operator(,) integer(44)operator(,) integer(96)operator(,) integer(40)operator(,) integer(32)operator(,) + integer(10)operator(,) integer(59) +operator(};) +preprocessor(# endif) + +comment(/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */) +directive(static) directive(const) ident(yytype_uint16) ident(yyr1)operator([]) operator(=) +operator({) + integer(0)operator(,) integer(132)operator(,) integer(134)operator(,) integer(133)operator(,) integer(135)operator(,) integer(136)operator(,) integer(137)operator(,) integer(137)operator(,) integer(137)operator(,) integer(137)operator(,) + integer(139)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) + integer(138)operator(,) integer(140)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) + integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(138)operator(,) integer(141)operator(,) integer(141)operator(,) integer(141)operator(,) integer(141)operator(,) + integer(141)operator(,) integer(141)operator(,) integer(142)operator(,) integer(143)operator(,) integer(143)operator(,) integer(143)operator(,) integer(143)operator(,) integer(143)operator(,) integer(144)operator(,) integer(144)operator(,) + integer(144)operator(,) integer(146)operator(,) integer(147)operator(,) integer(145)operator(,) integer(148)operator(,) integer(148)operator(,) integer(148)operator(,) integer(148)operator(,) integer(148)operator(,) integer(148)operator(,) + integer(148)operator(,) integer(148)operator(,) integer(149)operator(,) integer(149)operator(,) integer(150)operator(,) integer(150)operator(,) integer(151)operator(,) integer(151)operator(,) integer(151)operator(,) integer(151)operator(,) + integer(151)operator(,) integer(151)operator(,) integer(152)operator(,) integer(152)operator(,) integer(153)operator(,) integer(153)operator(,) integer(154)operator(,) integer(154)operator(,) integer(154)operator(,) integer(154)operator(,) + integer(154)operator(,) integer(154)operator(,) integer(154)operator(,) integer(154)operator(,) integer(155)operator(,) integer(155)operator(,) integer(155)operator(,) integer(155)operator(,) integer(155)operator(,) integer(155)operator(,) + integer(155)operator(,) integer(155)operator(,) integer(156)operator(,) integer(156)operator(,) integer(157)operator(,) integer(157)operator(,) integer(157)operator(,) integer(158)operator(,) integer(158)operator(,) integer(158)operator(,) + integer(158)operator(,) integer(158)operator(,) integer(159)operator(,) integer(159)operator(,) integer(160)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(161)operator(,) integer(163)operator(,) + integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) + integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) + integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(163)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) + integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) + integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) + integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) + integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(164)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) + integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) + integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) + integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) + integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(166)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) + integer(167)operator(,) integer(168)operator(,) integer(168)operator(,) integer(168)operator(,) integer(168)operator(,) integer(168)operator(,) integer(168)operator(,) integer(169)operator(,) integer(169)operator(,) integer(169)operator(,) + integer(169)operator(,) integer(170)operator(,) integer(170)operator(,) integer(171)operator(,) integer(171)operator(,) integer(171)operator(,) integer(171)operator(,) integer(171)operator(,) integer(171)operator(,) integer(171)operator(,) + integer(171)operator(,) integer(171)operator(,) integer(172)operator(,) integer(172)operator(,) integer(172)operator(,) integer(172)operator(,) integer(172)operator(,) integer(172)operator(,) integer(172)operator(,) integer(172)operator(,) + integer(172)operator(,) integer(172)operator(,) integer(172)operator(,) integer(172)operator(,) integer(174)operator(,) integer(173)operator(,) integer(175)operator(,) integer(176)operator(,) integer(175)operator(,) integer(177)operator(,) + integer(175)operator(,) integer(178)operator(,) integer(179)operator(,) integer(179)operator(,) integer(180)operator(,) integer(180)operator(,) integer(181)operator(,) integer(181)operator(,) integer(181)operator(,) integer(182)operator(,) + integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(183)operator(,) integer(182)operator(,) + integer(184)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) + integer(182)operator(,) integer(182)operator(,) integer(185)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(186)operator(,) + integer(187)operator(,) integer(182)operator(,) integer(188)operator(,) integer(189)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(190)operator(,) integer(191)operator(,) + integer(182)operator(,) integer(192)operator(,) integer(182)operator(,) integer(193)operator(,) integer(194)operator(,) integer(182)operator(,) integer(195)operator(,) integer(182)operator(,) integer(196)operator(,) integer(182)operator(,) + integer(197)operator(,) integer(198)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(182)operator(,) integer(199)operator(,) integer(200)operator(,) integer(200)operator(,) + integer(200)operator(,) integer(200)operator(,) integer(201)operator(,) integer(201)operator(,) integer(201)operator(,) integer(202)operator(,) integer(202)operator(,) integer(203)operator(,) integer(203)operator(,) integer(204)operator(,) + integer(204)operator(,) integer(205)operator(,) integer(205)operator(,) integer(205)operator(,) integer(205)operator(,) integer(207)operator(,) integer(208)operator(,) integer(206)operator(,) integer(209)operator(,) integer(209)operator(,) + integer(209)operator(,) integer(210)operator(,) integer(210)operator(,) integer(210)operator(,) integer(210)operator(,) integer(210)operator(,) integer(210)operator(,) integer(212)operator(,) integer(213)operator(,) integer(211)operator(,) + integer(214)operator(,) integer(215)operator(,) integer(211)operator(,) integer(216)operator(,) integer(217)operator(,) integer(217)operator(,) integer(217)operator(,) integer(218)operator(,) integer(218)operator(,) integer(219)operator(,) + integer(219)operator(,) integer(220)operator(,) integer(220)operator(,) integer(220)operator(,) integer(221)operator(,) integer(221)operator(,) integer(222)operator(,) integer(222)operator(,) integer(223)operator(,) integer(223)operator(,) + integer(223)operator(,) integer(224)operator(,) integer(225)operator(,) integer(225)operator(,) integer(226)operator(,) integer(227)operator(,) integer(228)operator(,) integer(229)operator(,) integer(229)operator(,) integer(230)operator(,) + integer(230)operator(,) integer(231)operator(,) integer(231)operator(,) integer(232)operator(,) integer(232)operator(,) integer(233)operator(,) integer(233)operator(,) integer(234)operator(,) integer(234)operator(,) integer(235)operator(,) + integer(235)operator(,) integer(236)operator(,) integer(237)operator(,) integer(236)operator(,) integer(238)operator(,) integer(236)operator(,) integer(239)operator(,) integer(239)operator(,) integer(239)operator(,) integer(239)operator(,) + integer(240)operator(,) integer(241)operator(,) integer(241)operator(,) integer(241)operator(,) integer(241)operator(,) integer(242)operator(,) integer(243)operator(,) integer(243)operator(,) integer(243)operator(,) integer(243)operator(,) + integer(244)operator(,) integer(244)operator(,) integer(244)operator(,) integer(244)operator(,) integer(244)operator(,) integer(244)operator(,) integer(244)operator(,) integer(244)operator(,) integer(244)operator(,) integer(244)operator(,) + integer(244)operator(,) integer(245)operator(,) integer(246)operator(,) integer(247)operator(,) integer(247)operator(,) integer(248)operator(,) integer(249)operator(,) integer(248)operator(,) integer(248)operator(,) integer(250)operator(,) + integer(250)operator(,) integer(251)operator(,) integer(251)operator(,) integer(251)operator(,) integer(251)operator(,) integer(251)operator(,) integer(251)operator(,) integer(251)operator(,) integer(251)operator(,) integer(251)operator(,) + integer(252)operator(,) integer(252)operator(,) integer(252)operator(,) integer(252)operator(,) integer(252)operator(,) integer(253)operator(,) integer(253)operator(,) integer(254)operator(,) integer(255)operator(,) integer(255)operator(,) + integer(256)operator(,) integer(256)operator(,) integer(257)operator(,) integer(257)operator(,) integer(258)operator(,) integer(258)operator(,) integer(259)operator(,) integer(260)operator(,) integer(260)operator(,) integer(261)operator(,) + integer(262)operator(,) integer(261)operator(,) integer(263)operator(,) integer(263)operator(,) integer(263)operator(,) integer(264)operator(,) integer(264)operator(,) integer(265)operator(,) integer(266)operator(,) integer(266)operator(,) + integer(266)operator(,) integer(267)operator(,) integer(267)operator(,) integer(267)operator(,) integer(267)operator(,) integer(268)operator(,) integer(268)operator(,) integer(268)operator(,) integer(269)operator(,) integer(269)operator(,) + integer(270)operator(,) integer(270)operator(,) integer(271)operator(,) integer(271)operator(,) integer(272)operator(,) integer(272)operator(,) integer(272)operator(,) integer(273)operator(,) integer(273)operator(,) integer(274)operator(,) + integer(274)operator(,) integer(275) +operator(};) + +comment(/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */) +directive(static) directive(const) ident(yytype_uint8) ident(yyr2)operator([]) operator(=) +operator({) + integer(0)operator(,) integer(2)operator(,) integer(0)operator(,) integer(2)operator(,) integer(4)operator(,) integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(3)operator(,) integer(2)operator(,) + integer(0)operator(,) integer(4)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(2)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) + integer(3)operator(,) integer(0)operator(,) integer(5)operator(,) integer(4)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(6)operator(,) integer(5)operator(,) integer(5)operator(,) + integer(5)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(1)operator(,) integer(1)operator(,) integer(3)operator(,) integer(3)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(1)operator(,) integer(4)operator(,) + integer(4)operator(,) integer(0)operator(,) integer(0)operator(,) integer(6)operator(,) integer(2)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(4)operator(,) integer(5)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(1)operator(,) integer(3)operator(,) integer(1)operator(,) integer(3)operator(,) integer(1)operator(,) integer(2)operator(,) integer(3)operator(,) integer(2)operator(,) + integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(3)operator(,) integer(2)operator(,) integer(3)operator(,) integer(1)operator(,) integer(4)operator(,) integer(3)operator(,) integer(3)operator(,) + integer(3)operator(,) integer(3)operator(,) integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(4)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) + integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(1)operator(,) integer(3)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(0)operator(,) integer(4)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(3)operator(,) integer(5)operator(,) integer(3)operator(,) integer(6)operator(,) integer(5)operator(,) + integer(5)operator(,) integer(5)operator(,) integer(5)operator(,) integer(4)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) + integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(4)operator(,) integer(4)operator(,) integer(2)operator(,) integer(2)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) + integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(0)operator(,) integer(4)operator(,) integer(5)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(2)operator(,) integer(5)operator(,) integer(2)operator(,) integer(3)operator(,) integer(3)operator(,) integer(4)operator(,) integer(4)operator(,) + integer(6)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(5)operator(,) integer(2)operator(,) integer(5)operator(,) integer(4)operator(,) integer(7)operator(,) + integer(3)operator(,) integer(1)operator(,) integer(4)operator(,) integer(3)operator(,) integer(5)operator(,) integer(7)operator(,) integer(2)operator(,) integer(5)operator(,) integer(4)operator(,) integer(6)operator(,) + integer(7)operator(,) integer(9)operator(,) integer(3)operator(,) integer(1)operator(,) integer(0)operator(,) integer(2)operator(,) integer(1)operator(,) integer(0)operator(,) integer(3)operator(,) integer(0)operator(,) + integer(4)operator(,) integer(2)operator(,) integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(3)operator(,) integer(3)operator(,) integer(4)operator(,) integer(2)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(0)operator(,) integer(4)operator(,) + integer(0)operator(,) integer(5)operator(,) integer(3)operator(,) integer(3)operator(,) integer(2)operator(,) integer(4)operator(,) integer(3)operator(,) integer(3)operator(,) integer(1)operator(,) integer(4)operator(,) + integer(3)operator(,) integer(1)operator(,) integer(0)operator(,) integer(6)operator(,) integer(2)operator(,) integer(1)operator(,) integer(2)operator(,) integer(6)operator(,) integer(6)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(7)operator(,) integer(0)operator(,) integer(0)operator(,) integer(7)operator(,) integer(5)operator(,) integer(4)operator(,) integer(5)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(9)operator(,) integer(0)operator(,) integer(6)operator(,) integer(0)operator(,) integer(0)operator(,) integer(8)operator(,) integer(0)operator(,) integer(5)operator(,) integer(0)operator(,) integer(6)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(9)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(5)operator(,) integer(1)operator(,) integer(2)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(1)operator(,) integer(3)operator(,) integer(0)operator(,) integer(0)operator(,) integer(6)operator(,) integer(2)operator(,) integer(4)operator(,) + integer(4)operator(,) integer(2)operator(,) integer(4)operator(,) integer(4)operator(,) integer(3)operator(,) integer(2)operator(,) integer(1)operator(,) integer(0)operator(,) integer(0)operator(,) integer(6)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(6)operator(,) integer(5)operator(,) integer(1)operator(,) integer(4)operator(,) integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(6)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(1)operator(,) integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(0)operator(,) + integer(3)operator(,) integer(1)operator(,) integer(2)operator(,) integer(3)operator(,) integer(3)operator(,) integer(0)operator(,) integer(3)operator(,) integer(0)operator(,) integer(2)operator(,) integer(0)operator(,) + integer(2)operator(,) integer(1)operator(,) integer(0)operator(,) integer(3)operator(,) integer(0)operator(,) integer(4)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(3)operator(,) integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(0)operator(,) integer(4)operator(,) integer(2)operator(,) integer(4)operator(,) + integer(2)operator(,) integer(6)operator(,) integer(4)operator(,) integer(4)operator(,) integer(2)operator(,) integer(4)operator(,) integer(2)operator(,) integer(2)operator(,) integer(1)operator(,) integer(0)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(3)operator(,) integer(3)operator(,) integer(1)operator(,) integer(3)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(2)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(0)operator(,) integer(5)operator(,) integer(1)operator(,) integer(2)operator(,) integer(2)operator(,) integer(1)operator(,) integer(3)operator(,) integer(3)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(0)operator(,) integer(1)operator(,) integer(0)operator(,) integer(1)operator(,) integer(0)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(2)operator(,) integer(0) +operator(};) + +comment(/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */) +directive(static) directive(const) ident(yytype_uint16) ident(yydefact)operator([]) operator(=) +operator({) + integer(2)operator(,) integer(0)operator(,) integer(0)operator(,) integer(1)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(278)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(490)operator(,) integer(299)operator(,) integer(302)operator(,) integer(0)operator(,) integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) integer(326)operator(,) + integer(288)operator(,) integer(291)operator(,) integer(356)operator(,) integer(426)operator(,) integer(425)operator(,) integer(427)operator(,) integer(428)operator(,) integer(0)operator(,) integer(0)operator(,) integer(492)operator(,) + integer(21)operator(,) integer(0)operator(,) integer(430)operator(,) integer(429)operator(,) integer(420)operator(,) integer(277)operator(,) integer(422)operator(,) integer(421)operator(,) integer(423)operator(,) integer(424)operator(,) + integer(416)operator(,) integer(417)operator(,) integer(433)operator(,) integer(434)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(501)operator(,) + integer(501)operator(,) integer(71)operator(,) integer(399)operator(,) integer(397)operator(,) integer(399)operator(,) integer(399)operator(,) integer(389)operator(,) integer(395)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(3)operator(,) integer(490)operator(,) integer(7)operator(,) integer(35)operator(,) integer(36)operator(,) integer(44)operator(,) integer(43)operator(,) integer(0)operator(,) integer(62)operator(,) + integer(0)operator(,) integer(66)operator(,) integer(72)operator(,) integer(0)operator(,) integer(41)operator(,) integer(219)operator(,) integer(0)operator(,) integer(48)operator(,) integer(295)operator(,) integer(269)operator(,) + integer(270)operator(,) integer(381)operator(,) integer(382)operator(,) integer(271)operator(,) integer(272)operator(,) integer(273)operator(,) integer(274)operator(,) integer(379)operator(,) integer(380)operator(,) integer(378)operator(,) + integer(431)operator(,) integer(275)operator(,) integer(0)operator(,) integer(276)operator(,) integer(254)operator(,) integer(6)operator(,) integer(9)operator(,) integer(323)operator(,) integer(324)operator(,) integer(288)operator(,) + integer(291)operator(,) integer(356)operator(,) integer(492)operator(,) integer(92)operator(,) integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(95)operator(,) + integer(0)operator(,) integer(327)operator(,) integer(0)operator(,) integer(431)operator(,) integer(276)operator(,) integer(0)operator(,) integer(316)operator(,) integer(144)operator(,) integer(155)operator(,) integer(145)operator(,) + integer(168)operator(,) integer(141)operator(,) integer(161)operator(,) integer(151)operator(,) integer(150)operator(,) integer(171)operator(,) integer(172)operator(,) integer(166)operator(,) integer(149)operator(,) integer(148)operator(,) + integer(143)operator(,) integer(169)operator(,) integer(173)operator(,) integer(174)operator(,) integer(153)operator(,) integer(142)operator(,) integer(156)operator(,) integer(160)operator(,) integer(162)operator(,) integer(154)operator(,) + integer(147)operator(,) integer(163)operator(,) integer(170)operator(,) integer(165)operator(,) integer(164)operator(,) integer(157)operator(,) integer(167)operator(,) integer(152)operator(,) integer(140)operator(,) integer(159)operator(,) + integer(158)operator(,) integer(139)operator(,) integer(146)operator(,) integer(137)operator(,) integer(138)operator(,) integer(135)operator(,) integer(136)operator(,) integer(97)operator(,) integer(99)operator(,) integer(98)operator(,) + integer(130)operator(,) integer(131)operator(,) integer(128)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(117)operator(,) integer(119)operator(,) integer(115)operator(,) integer(132)operator(,) + integer(133)operator(,) integer(120)operator(,) integer(121)operator(,) integer(125)operator(,) integer(116)operator(,) integer(118)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(122)operator(,) + integer(123)operator(,) integer(124)operator(,) integer(126)operator(,) integer(127)operator(,) integer(129)operator(,) integer(134)operator(,) integer(470)operator(,) integer(318)operator(,) integer(100)operator(,) integer(101)operator(,) + integer(469)operator(,) integer(0)operator(,) integer(164)operator(,) integer(157)operator(,) integer(167)operator(,) integer(152)operator(,) integer(135)operator(,) integer(136)operator(,) integer(97)operator(,) integer(98)operator(,) + integer(102)operator(,) integer(104)operator(,) integer(106)operator(,) integer(15)operator(,) integer(103)operator(,) integer(105)operator(,) integer(0)operator(,) integer(0)operator(,) integer(42)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(431)operator(,) integer(0)operator(,) integer(276)operator(,) integer(0)operator(,) integer(498)operator(,) integer(497)operator(,) integer(490)operator(,) integer(0)operator(,) + integer(499)operator(,) integer(491)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(340)operator(,) integer(339)operator(,) integer(0)operator(,) integer(0)operator(,) integer(431)operator(,) + integer(276)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(233)operator(,) integer(220)operator(,) integer(264)operator(,) integer(46)operator(,) integer(241)operator(,) integer(501)operator(,) + integer(501)operator(,) integer(475)operator(,) integer(47)operator(,) integer(45)operator(,) integer(0)operator(,) integer(61)operator(,) integer(0)operator(,) integer(501)operator(,) integer(355)operator(,) integer(60)operator(,) + integer(39)operator(,) integer(0)operator(,) integer(10)operator(,) integer(493)operator(,) integer(216)operator(,) integer(0)operator(,) integer(0)operator(,) integer(195)operator(,) integer(0)operator(,) integer(196)operator(,) + integer(284)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(62)operator(,) integer(280)operator(,) integer(0)operator(,) integer(492)operator(,) integer(0)operator(,) integer(494)operator(,) + integer(494)operator(,) integer(221)operator(,) integer(494)operator(,) integer(0)operator(,) integer(494)operator(,) integer(472)operator(,) integer(0)operator(,) integer(70)operator(,) integer(0)operator(,) integer(76)operator(,) + integer(83)operator(,) integer(413)operator(,) integer(412)operator(,) integer(414)operator(,) integer(411)operator(,) integer(0)operator(,) integer(410)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(418)operator(,) integer(419)operator(,) integer(40)operator(,) integer(210)operator(,) integer(211)operator(,) integer(5)operator(,) + integer(491)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(345)operator(,) integer(348)operator(,) + integer(0)operator(,) integer(74)operator(,) integer(0)operator(,) integer(69)operator(,) integer(67)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(360)operator(,) integer(357)operator(,) integer(296)operator(,) + integer(383)operator(,) integer(0)operator(,) integer(0)operator(,) integer(351)operator(,) integer(54)operator(,) integer(294)operator(,) integer(0)operator(,) integer(313)operator(,) integer(92)operator(,) integer(93)operator(,) + integer(94)operator(,) integer(418)operator(,) integer(419)operator(,) integer(0)operator(,) integer(436)operator(,) integer(311)operator(,) integer(435)operator(,) integer(0)operator(,) integer(501)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(449)operator(,) integer(489)operator(,) integer(488)operator(,) integer(320)operator(,) integer(107)operator(,) integer(0)operator(,) integer(501)operator(,) integer(284)operator(,) + integer(330)operator(,) integer(329)operator(,) integer(0)operator(,) integer(328)operator(,) integer(0)operator(,) integer(0)operator(,) integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(500)operator(,) integer(0)operator(,) integer(0)operator(,) integer(284)operator(,) integer(0)operator(,) + integer(501)operator(,) integer(0)operator(,) integer(308)operator(,) integer(501)operator(,) integer(261)operator(,) integer(0)operator(,) integer(0)operator(,) integer(234)operator(,) integer(263)operator(,) integer(0)operator(,) + integer(236)operator(,) integer(290)operator(,) integer(0)operator(,) integer(257)operator(,) integer(256)operator(,) integer(255)operator(,) integer(233)operator(,) integer(492)operator(,) integer(501)operator(,) integer(492)operator(,) + integer(0)operator(,) integer(12)operator(,) integer(14)operator(,) integer(13)operator(,) integer(0)operator(,) integer(292)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(282)operator(,) integer(63)operator(,) integer(492)operator(,) integer(492)operator(,) integer(222)operator(,) integer(286)operator(,) integer(496)operator(,) + integer(495)operator(,) integer(223)operator(,) integer(496)operator(,) integer(225)operator(,) integer(496)operator(,) integer(474)operator(,) integer(287)operator(,) integer(473)operator(,) integer(82)operator(,) integer(0)operator(,) + integer(501)operator(,) integer(0)operator(,) integer(401)operator(,) integer(404)operator(,) integer(402)operator(,) integer(415)operator(,) integer(400)operator(,) integer(384)operator(,) integer(398)operator(,) integer(385)operator(,) + integer(386)operator(,) integer(387)operator(,) integer(388)operator(,) integer(0)operator(,) integer(391)operator(,) integer(393)operator(,) integer(0)operator(,) integer(394)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(8)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(37)operator(,) integer(38)operator(,) integer(501)operator(,) integer(0)operator(,) + integer(25)operator(,) integer(33)operator(,) integer(0)operator(,) integer(34)operator(,) integer(0)operator(,) integer(68)operator(,) integer(75)operator(,) integer(24)operator(,) integer(175)operator(,) integer(264)operator(,) + integer(32)operator(,) integer(192)operator(,) integer(200)operator(,) integer(205)operator(,) integer(206)operator(,) integer(207)operator(,) integer(202)operator(,) integer(204)operator(,) integer(214)operator(,) integer(215)operator(,) + integer(208)operator(,) integer(209)operator(,) integer(185)operator(,) integer(186)operator(,) integer(212)operator(,) integer(213)operator(,) integer(0)operator(,) integer(201)operator(,) integer(203)operator(,) integer(197)operator(,) + integer(198)operator(,) integer(199)operator(,) integer(187)operator(,) integer(188)operator(,) integer(189)operator(,) integer(190)operator(,) integer(191)operator(,) integer(481)operator(,) integer(486)operator(,) integer(482)operator(,) + integer(487)operator(,) integer(254)operator(,) integer(354)operator(,) integer(0)operator(,) integer(481)operator(,) integer(483)operator(,) integer(482)operator(,) integer(484)operator(,) integer(501)operator(,) integer(481)operator(,) + integer(482)operator(,) integer(254)operator(,) integer(254)operator(,) integer(501)operator(,) integer(501)operator(,) integer(26)operator(,) integer(177)operator(,) integer(31)operator(,) integer(184)operator(,) integer(51)operator(,) + integer(55)operator(,) integer(0)operator(,) integer(438)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(93)operator(,) integer(96)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(501)operator(,) integer(0)operator(,) integer(492)operator(,) integer(454)operator(,) integer(452)operator(,) integer(451)operator(,) integer(450)operator(,) integer(453)operator(,) integer(461)operator(,) integer(465)operator(,) + integer(464)operator(,) integer(460)operator(,) integer(449)operator(,) integer(0)operator(,) integer(0)operator(,) integer(455)operator(,) integer(501)operator(,) integer(458)operator(,) integer(501)operator(,) integer(463)operator(,) + integer(501)operator(,) integer(0)operator(,) integer(448)operator(,) integer(0)operator(,) integer(0)operator(,) integer(279)operator(,) integer(501)operator(,) integer(501)operator(,) integer(370)operator(,) integer(501)operator(,) + integer(331)operator(,) integer(175)operator(,) integer(485)operator(,) integer(283)operator(,) integer(0)operator(,) integer(481)operator(,) integer(482)operator(,) integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(364)operator(,) integer(0)operator(,) integer(306)operator(,) integer(334)operator(,) integer(333)operator(,) integer(300)operator(,) integer(332)operator(,) integer(303)operator(,) integer(485)operator(,) + integer(283)operator(,) integer(0)operator(,) integer(481)operator(,) integer(482)operator(,) integer(0)operator(,) integer(0)operator(,) integer(240)operator(,) integer(477)operator(,) integer(0)operator(,) integer(265)operator(,) + integer(262)operator(,) integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(476)operator(,) integer(289)operator(,) integer(0)operator(,) integer(41)operator(,) integer(0)operator(,) integer(259)operator(,) + integer(0)operator(,) integer(253)operator(,) integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(227)operator(,) integer(11)operator(,) + integer(0)operator(,) integer(217)operator(,) integer(0)operator(,) integer(23)operator(,) integer(183)operator(,) integer(63)operator(,) integer(0)operator(,) integer(226)operator(,) integer(0)operator(,) integer(265)operator(,) + integer(79)operator(,) integer(81)operator(,) integer(0)operator(,) integer(481)operator(,) integer(482)operator(,) integer(0)operator(,) integer(0)operator(,) integer(390)operator(,) integer(392)operator(,) integer(396)operator(,) + integer(193)operator(,) integer(194)operator(,) integer(343)operator(,) integer(0)operator(,) integer(346)operator(,) integer(341)operator(,) integer(268)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(353)operator(,) integer(58)operator(,) integer(285)operator(,) integer(0)operator(,) integer(0)operator(,) integer(232)operator(,) integer(352)operator(,) + integer(56)operator(,) integer(231)operator(,) integer(350)operator(,) integer(50)operator(,) integer(349)operator(,) integer(49)operator(,) integer(361)operator(,) integer(358)operator(,) integer(501)operator(,) integer(314)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(285)operator(,) integer(317)operator(,) integer(0)operator(,) integer(0)operator(,) integer(492)operator(,) integer(0)operator(,) integer(440)operator(,) integer(0)operator(,) + integer(444)operator(,) integer(468)operator(,) integer(0)operator(,) integer(446)operator(,) integer(462)operator(,) integer(0)operator(,) integer(447)operator(,) integer(466)operator(,) integer(321)operator(,) integer(108)operator(,) + integer(371)operator(,) integer(372)operator(,) integer(501)operator(,) integer(373)operator(,) integer(0)operator(,) integer(501)operator(,) integer(337)operator(,) integer(0)operator(,) integer(0)operator(,) integer(335)operator(,) + integer(0)operator(,) integer(285)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(305)operator(,) integer(307)operator(,) integer(366)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(285)operator(,) integer(0)operator(,) integer(501)operator(,) integer(0)operator(,) integer(238)operator(,) integer(501)operator(,) integer(501)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(258)operator(,) integer(0)operator(,) integer(246)operator(,) integer(228)operator(,) integer(0)operator(,) integer(492)operator(,) integer(501)operator(,) integer(501)operator(,) integer(229)operator(,) + integer(0)operator(,) integer(22)operator(,) integer(281)operator(,) integer(492)operator(,) integer(77)operator(,) integer(0)operator(,) integer(406)operator(,) integer(407)operator(,) integer(408)operator(,) integer(403)operator(,) + integer(409)operator(,) integer(342)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(266)operator(,) integer(176)operator(,) integer(218)operator(,) integer(30)operator(,) integer(181)operator(,) + integer(182)operator(,) integer(59)operator(,) integer(0)operator(,) integer(28)operator(,) integer(179)operator(,) integer(29)operator(,) integer(180)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(52)operator(,) integer(0)operator(,) integer(437)operator(,) integer(312)operator(,) integer(471)operator(,) integer(457)operator(,) integer(0)operator(,) integer(319)operator(,) integer(456)operator(,) integer(501)operator(,) + integer(501)operator(,) integer(467)operator(,) integer(0)operator(,) integer(459)operator(,) integer(501)operator(,) integer(449)operator(,) integer(0)operator(,) integer(0)operator(,) integer(375)operator(,) integer(338)operator(,) + integer(0)operator(,) integer(4)operator(,) integer(377)operator(,) integer(0)operator(,) integer(297)operator(,) integer(0)operator(,) integer(298)operator(,) integer(0)operator(,) integer(501)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(309)operator(,) integer(235)operator(,) integer(0)operator(,) integer(237)operator(,) integer(252)operator(,) integer(0)operator(,) integer(243)operator(,) integer(501)operator(,) integer(501)operator(,) + integer(260)operator(,) integer(0)operator(,) integer(0)operator(,) integer(293)operator(,) integer(224)operator(,) integer(405)operator(,) integer(344)operator(,) integer(0)operator(,) integer(267)operator(,) integer(27)operator(,) + integer(178)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(439)operator(,) integer(0)operator(,) integer(442)operator(,) integer(443)operator(,) integer(445)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(374)operator(,) integer(0)operator(,) integer(84)operator(,) integer(91)operator(,) integer(0)operator(,) integer(376)operator(,) integer(0)operator(,) integer(365)operator(,) + integer(367)operator(,) integer(368)operator(,) integer(363)operator(,) integer(301)operator(,) integer(304)operator(,) integer(0)operator(,) integer(501)operator(,) integer(501)operator(,) integer(0)operator(,) integer(242)operator(,) + integer(0)operator(,) integer(248)operator(,) integer(501)operator(,) integer(230)operator(,) integer(347)operator(,) integer(362)operator(,) integer(359)operator(,) integer(0)operator(,) integer(315)operator(,) integer(501)operator(,) + integer(0)operator(,) integer(90)operator(,) integer(0)operator(,) integer(501)operator(,) integer(0)operator(,) integer(501)operator(,) integer(501)operator(,) integer(0)operator(,) integer(239)operator(,) integer(244)operator(,) + integer(0)operator(,) integer(501)operator(,) integer(0)operator(,) integer(247)operator(,) integer(53)operator(,) integer(441)operator(,) integer(322)operator(,) integer(485)operator(,) integer(89)operator(,) integer(0)operator(,) + integer(481)operator(,) integer(482)operator(,) integer(369)operator(,) integer(336)operator(,) integer(310)operator(,) integer(501)operator(,) integer(0)operator(,) integer(249)operator(,) integer(501)operator(,) integer(85)operator(,) + integer(245)operator(,) integer(0)operator(,) integer(250)operator(,) integer(501)operator(,) integer(251) +operator(};) + +comment(/* YYDEFGOTO[NTERM-NUM]. */) +directive(static) directive(const) ident(yytype_int16) ident(yydefgoto)operator([]) operator(=) +operator({) + operator(-)integer(1)operator(,) integer(1)operator(,) integer(2)operator(,) integer(377)operator(,) integer(378)operator(,) integer(62)operator(,) integer(63)operator(,) integer(424)operator(,) integer(255)operator(,) integer(64)operator(,) + integer(209)operator(,) integer(65)operator(,) integer(66)operator(,) integer(540)operator(,) integer(678)operator(,) integer(823)operator(,) integer(67)operator(,) integer(68)operator(,) integer(263)operator(,) integer(69)operator(,) + integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(210)operator(,) integer(109)operator(,) integer(110)operator(,) integer(200)operator(,) integer(201)operator(,) integer(202)operator(,) integer(203)operator(,) + integer(574)operator(,) integer(527)operator(,) integer(189)operator(,) integer(74)operator(,) integer(426)operator(,) integer(236)operator(,) integer(268)operator(,) integer(668)operator(,) integer(669)operator(,) integer(237)operator(,) + integer(619)operator(,) integer(245)operator(,) integer(246)operator(,) integer(415)operator(,) integer(620)operator(,) integer(730)operator(,) integer(610)operator(,) integer(407)operator(,) integer(269)operator(,) integer(483)operator(,) + integer(75)operator(,) integer(206)operator(,) integer(435)operator(,) integer(630)operator(,) integer(222)operator(,) integer(720)operator(,) integer(223)operator(,) integer(721)operator(,) integer(604)operator(,) integer(845)operator(,) + integer(544)operator(,) integer(541)operator(,) integer(771)operator(,) integer(370)operator(,) integer(372)operator(,) integer(573)operator(,) integer(785)operator(,) integer(258)operator(,) integer(382)operator(,) integer(596)operator(,) + integer(708)operator(,) integer(709)operator(,) integer(228)operator(,) integer(654)operator(,) integer(309)operator(,) integer(478)operator(,) integer(753)operator(,) integer(77)operator(,) integer(78)operator(,) integer(355)operator(,) + integer(534)operator(,) integer(769)operator(,) integer(533)operator(,) integer(768)operator(,) integer(394)operator(,) integer(592)operator(,) integer(842)operator(,) integer(577)operator(,) integer(702)operator(,) integer(787)operator(,) + integer(791)operator(,) integer(79)operator(,) integer(80)operator(,) integer(81)operator(,) integer(82)operator(,) integer(83)operator(,) integer(84)operator(,) integer(85)operator(,) integer(291)operator(,) integer(463)operator(,) + integer(86)operator(,) integer(293)operator(,) integer(287)operator(,) integer(285)operator(,) integer(456)operator(,) integer(646)operator(,) integer(645)operator(,) integer(749)operator(,) integer(87)operator(,) integer(286)operator(,) + integer(88)operator(,) integer(89)operator(,) integer(212)operator(,) integer(91)operator(,) integer(213)operator(,) integer(214)operator(,) integer(365)operator(,) integer(543)operator(,) integer(563)operator(,) integer(564)operator(,) + integer(565)operator(,) integer(566)operator(,) integer(567)operator(,) integer(568)operator(,) integer(569)operator(,) integer(570)operator(,) integer(571)operator(,) integer(781)operator(,) integer(690)operator(,) integer(191)operator(,) + integer(371)operator(,) integer(273)operator(,) integer(270)operator(,) integer(241)operator(,) integer(115)operator(,) integer(548)operator(,) integer(522)operator(,) integer(375)operator(,) integer(219)operator(,) integer(254)operator(,) + integer(441)operator(,) integer(383)operator(,) integer(221)operator(,) integer(95) +operator(};) + +comment(/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */) +preprocessor(#define) ident(YYPACT_NINF) operator(-)integer(654) +directive(static) directive(const) ident(yytype_int16) ident(yypact)operator([]) operator(=) +operator({) + operator(-)integer(654)operator(,) integer(73)operator(,) integer(2254)operator(,) operator(-)integer(654)operator(,) integer(5471)operator(,) integer(7939)operator(,) integer(8236)operator(,) integer(3906)operator(,) integer(5121)operator(,) operator(-)integer(654)operator(,) + integer(6810)operator(,) integer(6810)operator(,) integer(3777)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(8038)operator(,) integer(5677)operator(,) integer(5677)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(5677)operator(,) integer(4436)operator(,) integer(4539)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(6810)operator(,) integer(4996)operator(,) operator(-)integer(44)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(3)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(2117)operator(,) integer(4024)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(4127)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(50)operator(,) integer(3187)operator(,) integer(6810)operator(,) integer(6913)operator(,) + integer(7634)operator(,) integer(8335)operator(,) integer(4871)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(18)operator(,) operator(-)integer(1)operator(,) integer(94)operator(,) integer(7737)operator(,) + integer(7634)operator(,) operator(-)integer(654)operator(,) integer(124)operator(,) integer(757)operator(,) integer(249)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(104)operator(,) integer(74)operator(,) operator(-)integer(654)operator(,) + integer(57)operator(,) integer(8137)operator(,) operator(-)integer(654)operator(,) integer(96)operator(,) integer(9349)operator(,) integer(171)operator(,) integer(485)operator(,) integer(11)operator(,) integer(32)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) integer(120)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(10)operator(,) operator(-)integer(654)operator(,) integer(64)operator(,) integer(38)operator(,) integer(42)operator(,) operator(-)integer(654)operator(,) integer(757)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(99)operator(,) integer(111)operator(,) operator(-)integer(44)operator(,) integer(129)operator(,) integer(140)operator(,) integer(6810)operator(,) integer(90)operator(,) integer(3318)operator(,) integer(325)operator(,) operator(-)integer(654)operator(,) + integer(78)operator(,) operator(-)integer(654)operator(,) integer(549)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(42)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(95)operator(,) integer(148)operator(,) integer(282)operator(,) integer(333)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(336)operator(,) integer(337)operator(,) integer(465)operator(,) operator(-)integer(654)operator(,) integer(473)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) integer(495)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(147)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(2615)operator(,) integer(225)operator(,) integer(249)operator(,) integer(48)operator(,) + integer(188)operator(,) integer(558)operator(,) integer(31)operator(,) integer(213)operator(,) integer(258)operator(,) integer(48)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(124)operator(,) integer(88)operator(,) + operator(-)integer(654)operator(,) integer(209)operator(,) integer(6810)operator(,) integer(6810)operator(,) integer(288)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(559)operator(,) integer(324)operator(,) integer(66)operator(,) + integer(245)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) integer(9349)operator(,) integer(274)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(262)operator(,) + integer(269)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(5363)operator(,) operator(-)integer(654)operator(,) integer(5780)operator(,) integer(5677)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) integer(222)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(275)operator(,) integer(285)operator(,) integer(3449)operator(,) operator(-)integer(654)operator(,) integer(571)operator(,) integer(366)operator(,) + integer(476)operator(,) integer(3187)operator(,) integer(310)operator(,) integer(315)operator(,) integer(342)operator(,) integer(249)operator(,) integer(7634)operator(,) operator(-)integer(44)operator(,) integer(371)operator(,) integer(392)operator(,) + integer(401)operator(,) operator(-)integer(654)operator(,) integer(480)operator(,) integer(375)operator(,) integer(401)operator(,) operator(-)integer(654)operator(,) integer(470)operator(,) operator(-)integer(654)operator(,) integer(586)operator(,) integer(595)operator(,) + integer(618)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(231)operator(,) operator(-)integer(654)operator(,) integer(482)operator(,) integer(515)operator(,) integer(674)operator(,) + integer(425)operator(,) integer(565)operator(,) integer(444)operator(,) integer(30)operator(,) integer(493)operator(,) integer(499)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(3674)operator(,) integer(6810)operator(,) integer(6810)operator(,) integer(6810)operator(,) integer(6810)operator(,) integer(5471)operator(,) integer(6810)operator(,) integer(6810)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(7016)operator(,) operator(-)integer(654)operator(,) integer(3187)operator(,) integer(8335)operator(,) integer(438)operator(,) integer(7016)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) + integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) + integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(7634)operator(,) + integer(7634)operator(,) integer(7634)operator(,) integer(1612)operator(,) integer(6913)operator(,) integer(8489)operator(,) integer(8555)operator(,) integer(8555)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) integer(7737)operator(,) integer(7737)operator(,) operator(-)integer(654)operator(,) integer(501)operator(,) operator(-)integer(654)operator(,) integer(275)operator(,) integer(249)operator(,) operator(-)integer(654)operator(,) integer(623)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(124)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(8621)operator(,) integer(6913)operator(,) integer(8555)operator(,) + integer(2615)operator(,) integer(6810)operator(,) integer(419)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(583)operator(,) integer(596)operator(,) integer(283)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(2737)operator(,) integer(590)operator(,) integer(7634)operator(,) integer(8687)operator(,) integer(6913)operator(,) integer(8753)operator(,) integer(7634)operator(,) integer(7634)operator(,) + integer(2981)operator(,) integer(601)operator(,) integer(3571)operator(,) integer(7119)operator(,) integer(611)operator(,) operator(-)integer(654)operator(,) integer(18)operator(,) integer(18)operator(,) integer(252)operator(,) integer(8819)operator(,) + integer(6913)operator(,) integer(8885)operator(,) operator(-)integer(654)operator(,) integer(498)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) integer(5883)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(5986)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(503)operator(,) integer(5574)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(104)operator(,) operator(-)integer(44)operator(,) integer(510)operator(,) integer(9)operator(,) + integer(512)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(5121)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) integer(3449)operator(,) integer(528)operator(,) integer(8687)operator(,) + integer(8753)operator(,) integer(7634)operator(,) integer(529)operator(,) operator(-)integer(654)operator(,) integer(527)operator(,) operator(-)integer(44)operator(,) integer(9213)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(7222)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(623)operator(,) integer(8951)operator(,) + integer(6913)operator(,) integer(9017)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(25)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(534)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) integer(7634)operator(,) + integer(757)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(37)operator(,) integer(7634)operator(,) + operator(-)integer(654)operator(,) integer(544)operator(,) integer(546)operator(,) operator(-)integer(654)operator(,) integer(550)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(1775)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) integer(366)operator(,) integer(9418)operator(,) integer(9418)operator(,) integer(9418)operator(,) integer(9418)operator(,) integer(547)operator(,) integer(547)operator(,) integer(9435)operator(,) integer(1667)operator(,) + integer(9418)operator(,) integer(9418)operator(,) integer(9366)operator(,) integer(9366)operator(,) integer(394)operator(,) integer(394)operator(,) integer(2464)operator(,) integer(547)operator(,) integer(547)operator(,) integer(714)operator(,) + integer(714)operator(,) integer(437)operator(,) integer(43)operator(,) integer(43)operator(,) integer(366)operator(,) integer(366)operator(,) integer(366)operator(,) integer(2365)operator(,) integer(4642)operator(,) integer(2484)operator(,) + integer(4745)operator(,) integer(111)operator(,) operator(-)integer(654)operator(,) integer(554)operator(,) integer(487)operator(,) operator(-)integer(654)operator(,) integer(585)operator(,) operator(-)integer(654)operator(,) integer(4539)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) integer(1899)operator(,) integer(1899)operator(,) integer(37)operator(,) integer(37)operator(,) operator(-)integer(654)operator(,) integer(9349)operator(,) operator(-)integer(654)operator(,) integer(9349)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) integer(124)operator(,) operator(-)integer(654)operator(,) integer(6810)operator(,) integer(2615)operator(,) integer(141)operator(,) integer(477)operator(,) operator(-)integer(654)operator(,) integer(111)operator(,) integer(562)operator(,) + integer(111)operator(,) integer(681)operator(,) integer(35)operator(,) integer(597)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(429)operator(,) integer(2615)operator(,) integer(124)operator(,) operator(-)integer(654)operator(,) integer(575)operator(,) operator(-)integer(654)operator(,) integer(577)operator(,) integer(655)operator(,) + integer(588)operator(,) integer(665)operator(,) operator(-)integer(654)operator(,) integer(5246)operator(,) integer(5121)operator(,) operator(-)integer(654)operator(,) integer(7325)operator(,) integer(703)operator(,) operator(-)integer(654)operator(,) integer(398)operator(,) + operator(-)integer(654)operator(,) integer(2345)operator(,) integer(4230)operator(,) integer(4333)operator(,) integer(599)operator(,) integer(344)operator(,) integer(416)operator(,) integer(703)operator(,) integer(726)operator(,) integer(734)operator(,) + integer(7634)operator(,) integer(626)operator(,) integer(48)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(60)operator(,) + integer(85)operator(,) integer(635)operator(,) integer(259)operator(,) integer(354)operator(,) integer(6810)operator(,) integer(657)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) integer(274)operator(,) + operator(-)integer(654)operator(,) integer(628)operator(,) integer(7634)operator(,) integer(274)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) integer(9265)operator(,) integer(16)operator(,) operator(-)integer(654)operator(,) + integer(636)operator(,) operator(-)integer(654)operator(,) integer(634)operator(,) integer(643)operator(,) integer(6089)operator(,) integer(8555)operator(,) integer(8555)operator(,) integer(645)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(6810)operator(,) integer(9349)operator(,) integer(656)operator(,) operator(-)integer(654)operator(,) integer(9349)operator(,) integer(296)operator(,) integer(658)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) + integer(141)operator(,) integer(477)operator(,) integer(661)operator(,) integer(340)operator(,) integer(351)operator(,) integer(3449)operator(,) integer(671)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(366)operator(,) integer(366)operator(,) operator(-)integer(654)operator(,) integer(7840)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(7428)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) + integer(7634)operator(,) integer(7737)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) integer(501)operator(,) integer(624)operator(,) integer(7737)operator(,) integer(7737)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(501)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(37)operator(,) operator(-)integer(654)operator(,) + integer(124)operator(,) integer(776)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(663)operator(,) integer(7634)operator(,) operator(-)integer(44)operator(,) integer(781)operator(,) operator(-)integer(654)operator(,) integer(429)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(452)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(12)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(544)operator(,) operator(-)integer(654)operator(,) integer(708)operator(,) operator(-)integer(654)operator(,) integer(3084)operator(,) integer(792)operator(,) operator(-)integer(654)operator(,) integer(6810)operator(,) integer(797)operator(,) operator(-)integer(654)operator(,) + integer(7634)operator(,) integer(432)operator(,) integer(7634)operator(,) integer(7634)operator(,) integer(798)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(7531)operator(,) integer(2859)operator(,) + integer(3571)operator(,) integer(3571)operator(,) integer(367)operator(,) integer(18)operator(,) integer(498)operator(,) integer(6192)operator(,) operator(-)integer(654)operator(,) integer(498)operator(,) integer(498)operator(,) integer(6295)operator(,) + integer(685)operator(,) operator(-)integer(654)operator(,) integer(6398)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(104)operator(,) integer(9)operator(,) integer(111)operator(,) integer(111)operator(,) operator(-)integer(654)operator(,) + integer(101)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(9213)operator(,) integer(631)operator(,) integer(690)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(709)operator(,) integer(3571)operator(,) integer(7634)operator(,) integer(692)operator(,) integer(9349)operator(,) integer(9349)operator(,) operator(-)integer(654)operator(,) integer(9349)operator(,) + integer(9349)operator(,) operator(-)integer(654)operator(,) integer(7737)operator(,) operator(-)integer(654)operator(,) integer(9349)operator(,) operator(-)integer(654)operator(,) integer(9349)operator(,) operator(-)integer(654)operator(,) integer(3571)operator(,) integer(3449)operator(,) + operator(-)integer(654)operator(,) integer(2615)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(691)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(693)operator(,) + integer(588)operator(,) operator(-)integer(654)operator(,) integer(597)operator(,) operator(-)integer(654)operator(,) integer(588)operator(,) integer(419)operator(,) integer(8434)operator(,) integer(48)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(3571)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(48)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) integer(165)operator(,) integer(810)operator(,) + integer(812)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) integer(705)operator(,) integer(710)operator(,) + operator(-)integer(654)operator(,) integer(7634)operator(,) integer(712)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(825)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(9349)operator(,) integer(830)operator(,) integer(720)operator(,) integer(3449)operator(,) integer(832)operator(,) operator(-)integer(654)operator(,) integer(452)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(2615)operator(,) integer(789)operator(,) operator(-)integer(654)operator(,) integer(640)operator(,) integer(595)operator(,) integer(618)operator(,) integer(2615)operator(,) operator(-)integer(654)operator(,) integer(2737)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(3571)operator(,) integer(9286)operator(,) integer(498)operator(,) integer(6501)operator(,) operator(-)integer(654)operator(,) + integer(6604)operator(,) operator(-)integer(654)operator(,) integer(498)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(724)operator(,) operator(-)integer(654)operator(,) integer(588)operator(,) + integer(838)operator(,) integer(623)operator(,) integer(9083)operator(,) integer(6913)operator(,) integer(9149)operator(,) integer(596)operator(,) integer(398)operator(,) integer(839)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + integer(7634)operator(,) integer(727)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(41)operator(,) integer(477)operator(,) integer(732)operator(,) + integer(76)operator(,) integer(93)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(498)operator(,) integer(6707)operator(,) operator(-)integer(654)operator(,) integer(498)operator(,) integer(631)operator(,) + operator(-)integer(654)operator(,) integer(7634)operator(,) operator(-)integer(654)operator(,) integer(498)operator(,) operator(-)integer(654) +operator(};) + +comment(/* YYPGOTO[NTERM-NUM]. */) +directive(static) directive(const) ident(yytype_int16) ident(yypgoto)operator([]) operator(=) +operator({) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(360)operator(,) integer(431)operator(,) operator(-)integer(654)operator(,) integer(59)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(958)operator(,) + integer(44)operator(,) integer(23)operator(,) operator(-)integer(654)operator(,) operator(-)integer(569)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(1)operator(,) operator(-)integer(6)operator(,) operator(-)integer(183)operator(,) integer(22)operator(,) + integer(779)operator(,) operator(-)integer(654)operator(,) operator(-)integer(25)operator(,) integer(927)operator(,) operator(-)integer(70)operator(,) integer(853)operator(,) integer(7)operator(,) operator(-)integer(654)operator(,) integer(21)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(5)operator(,) operator(-)integer(654)operator(,) operator(-)integer(16)operator(,) operator(-)integer(654)operator(,) integer(1378)operator(,) operator(-)integer(338)operator(,) operator(-)integer(7)operator(,) operator(-)integer(479)operator(,) integer(82)operator(,) + operator(-)integer(654)operator(,) integer(2)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(9)operator(,) integer(158)operator(,) integer(110)operator(,) operator(-)integer(278)operator(,) + integer(26)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(185)operator(,) operator(-)integer(209)operator(,) operator(-)integer(372)operator(,) + integer(0)operator(,) operator(-)integer(520)operator(,) integer(208)operator(,) operator(-)integer(458)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(228)operator(,) operator(-)integer(654)operator(,) integer(785)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(356)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(3)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(784)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(458)operator(,) operator(-)integer(217)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(12)operator(,) operator(-)integer(654)operator(,) + integer(14)operator(,) operator(-)integer(654)operator(,) integer(627)operator(,) integer(860)operator(,) integer(1246)operator(,) integer(1107)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) integer(84)operator(,) integer(309)operator(,) + integer(183)operator(,) operator(-)integer(654)operator(,) operator(-)integer(653)operator(,) integer(184)operator(,) operator(-)integer(654)operator(,) operator(-)integer(608)operator(,) operator(-)integer(654)operator(,) operator(-)integer(321)operator(,) operator(-)integer(504)operator(,) operator(-)integer(654)operator(,) + operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(4)operator(,) operator(-)integer(382)operator(,) integer(755)operator(,) operator(-)integer(226)operator(,) operator(-)integer(654)operator(,) operator(-)integer(654)operator(,) operator(-)integer(24)operator(,) integer(20)operator(,) + integer(467)operator(,) integer(53)operator(,) integer(814)operator(,) integer(756) +operator(};) + +comment(/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */) +preprocessor(#define) ident(YYTABLE_NINF) operator(-)integer(502) +directive(static) directive(const) ident(yytype_int16) ident(yytable)operator([]) operator(=) +operator({) + integer(235)operator(,) integer(235)operator(,) integer(188)operator(,) integer(188)operator(,) integer(235)operator(,) integer(523)operator(,) integer(390)operator(,) integer(238)operator(,) integer(238)operator(,) integer(225)operator(,) + integer(551)operator(,) integer(238)operator(,) integer(240)operator(,) integer(240)operator(,) integer(187)operator(,) integer(248)operator(,) integer(240)operator(,) integer(234)operator(,) integer(234)operator(,) integer(419)operator(,) + integer(204)operator(,) integer(234)operator(,) integer(205)operator(,) integer(188)operator(,) integer(249)operator(,) integer(598)operator(,) integer(277)operator(,) integer(614)operator(,) integer(257)operator(,) integer(259)operator(,) + integer(549)operator(,) integer(111)operator(,) integer(111)operator(,) integer(235)operator(,) integer(235)operator(,) integer(588)operator(,) integer(360)operator(,) integer(490)operator(,) integer(299)operator(,) integer(783)operator(,) + integer(204)operator(,) integer(111)operator(,) integer(205)operator(,) integer(297)operator(,) integer(298)operator(,) integer(594)operator(,) integer(274)operator(,) integer(188)operator(,) integer(584)operator(,) integer(252)operator(,) + integer(267)operator(,) integer(572)operator(,) integer(672)operator(,) integer(674)operator(,) operator(-)integer(87)operator(,) integer(215)operator(,) integer(218)operator(,) integer(705)operator(,) integer(347)operator(,) integer(284)operator(,) + integer(614)operator(,) integer(380)operator(,) integer(601)operator(,) integer(96)operator(,) integer(693)operator(,) integer(220)operator(,) integer(696)operator(,) integer(714)operator(,) integer(347)operator(,) integer(264)operator(,) + integer(458)operator(,) integer(306)operator(,) integer(307)operator(,) integer(3)operator(,) integer(464)operator(,) integer(676)operator(,) integer(677)operator(,) integer(111)operator(,) integer(432)operator(,) integer(363)operator(,) + integer(559)operator(,) integer(780)operator(,) integer(296)operator(,) integer(452)operator(,) integer(784)operator(,) operator(-)integer(87)operator(,) integer(253)operator(,) integer(353)operator(,) integer(466)operator(,) operator(-)integer(86)operator(,) + integer(625)operator(,) operator(-)integer(84)operator(,) integer(345)operator(,) operator(-)integer(432)operator(,) integer(248)operator(,) integer(761)operator(,) integer(354)operator(,) integer(111)operator(,) integer(560)operator(,) integer(242)operator(,) + integer(405)operator(,) integer(767)operator(,) integer(243)operator(,) integer(392)operator(,) integer(260)operator(,) integer(393)operator(,) operator(-)integer(88)operator(,) integer(316)operator(,) integer(353)operator(,) integer(652)operator(,) + operator(-)integer(89)operator(,) integer(290)operator(,) integer(642)operator(,) operator(-)integer(84)operator(,) operator(-)integer(432)operator(,) integer(220)operator(,) integer(521)operator(,) integer(256)operator(,) integer(528)operator(,) integer(531)operator(,) + integer(532)operator(,) integer(352)operator(,) integer(356)operator(,) integer(595)operator(,) integer(453)operator(,) integer(454)operator(,) integer(239)operator(,) integer(239)operator(,) integer(292)operator(,) integer(484)operator(,) + integer(239)operator(,) integer(467)operator(,) integer(308)operator(,) integer(626)operator(,) operator(-)integer(84)operator(,) integer(346)operator(,) operator(-)integer(76)operator(,) integer(306)operator(,) integer(307)operator(,) integer(253)operator(,) + integer(358)operator(,) operator(-)integer(91)operator(,) integer(729)operator(,) integer(550)operator(,) integer(359)operator(,) integer(653)operator(,) operator(-)integer(87)operator(,) integer(351)operator(,) integer(216)operator(,) integer(217)operator(,) + integer(294)operator(,) integer(295)operator(,) integer(348)operator(,) integer(381)operator(,) integer(647)operator(,) operator(-)integer(478)operator(,) integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) integer(521)operator(,) + integer(272)operator(,) integer(528)operator(,) integer(348)operator(,) integer(366)operator(,) operator(-)integer(83)operator(,) integer(253)operator(,) operator(-)integer(479)operator(,) operator(-)integer(485)operator(,) operator(-)integer(87)operator(,) operator(-)integer(481)operator(,) + integer(247)operator(,) operator(-)integer(87)operator(,) operator(-)integer(87)operator(,) integer(783)operator(,) operator(-)integer(84)operator(,) integer(550)operator(,) operator(-)integer(426)operator(,) integer(310)operator(,) integer(216)operator(,) integer(217)operator(,) + integer(704)operator(,) operator(-)integer(86)operator(,) integer(393)operator(,) integer(311)operator(,) integer(681)operator(,) integer(364)operator(,) operator(-)integer(79)operator(,) integer(76)operator(,) operator(-)integer(481)operator(,) integer(76)operator(,) + integer(112)operator(,) integer(112)operator(,) operator(-)integer(76)operator(,) operator(-)integer(89)operator(,) integer(391)operator(,) integer(211)operator(,) integer(211)operator(,) integer(211)operator(,) operator(-)integer(88)operator(,) integer(315)operator(,) + integer(227)operator(,) integer(211)operator(,) integer(211)operator(,) integer(687)operator(,) integer(550)operator(,) integer(211)operator(,) operator(-)integer(86)operator(,) operator(-)integer(86)operator(,) integer(216)operator(,) integer(217)operator(,) + operator(-)integer(420)operator(,) operator(-)integer(81)operator(,) integer(211)operator(,) operator(-)integer(482)operator(,) integer(53)operator(,) integer(235)operator(,) integer(235)operator(,) integer(297)operator(,) integer(859)operator(,) operator(-)integer(426)operator(,) + integer(770)operator(,) operator(-)integer(423)operator(,) operator(-)integer(485)operator(,) operator(-)integer(88)operator(,) operator(-)integer(88)operator(,) integer(550)operator(,) integer(813)operator(,) integer(244)operator(,) integer(235)operator(,) operator(-)integer(425)operator(,) + integer(235)operator(,) integer(235)operator(,) integer(76)operator(,) integer(211)operator(,) integer(211)operator(,) integer(238)operator(,) integer(278)operator(,) integer(238)operator(,) integer(238)operator(,) integer(247)operator(,) + integer(240)operator(,) integer(572)operator(,) integer(240)operator(,) integer(240)operator(,) integer(211)operator(,) integer(234)operator(,) integer(648)operator(,) integer(234)operator(,) integer(416)operator(,) operator(-)integer(478)operator(,) + integer(436)operator(,) operator(-)integer(420)operator(,) operator(-)integer(327)operator(,) operator(-)integer(420)operator(,) integer(216)operator(,) integer(217)operator(,) integer(278)operator(,) operator(-)integer(478)operator(,) integer(672)operator(,) integer(674)operator(,) + operator(-)integer(479)operator(,) operator(-)integer(485)operator(,) operator(-)integer(423)operator(,) operator(-)integer(485)operator(,) operator(-)integer(423)operator(,) operator(-)integer(485)operator(,) integer(396)operator(,) integer(397)operator(,) operator(-)integer(479)operator(,) operator(-)integer(481)operator(,) + operator(-)integer(91)operator(,) integer(220)operator(,) operator(-)integer(425)operator(,) integer(376)operator(,) integer(421)operator(,) integer(827)operator(,) integer(828)operator(,) operator(-)integer(90)operator(,) integer(840)operator(,) integer(379)operator(,) + integer(829)operator(,) integer(422)operator(,) integer(423)operator(,) integer(264)operator(,) operator(-)integer(86)operator(,) integer(306)operator(,) integer(307)operator(,) integer(437)operator(,) integer(485)operator(,) integer(452)operator(,) + integer(211)operator(,) integer(384)operator(,) integer(76)operator(,) operator(-)integer(327)operator(,) integer(235)operator(,) operator(-)integer(327)operator(,) integer(388)operator(,) integer(547)operator(,) integer(701)operator(,) integer(488)operator(,) + integer(491)operator(,) integer(492)operator(,) integer(493)operator(,) integer(494)operator(,) integer(495)operator(,) integer(496)operator(,) integer(497)operator(,) integer(498)operator(,) integer(499)operator(,) integer(500)operator(,) + integer(501)operator(,) integer(502)operator(,) integer(503)operator(,) integer(504)operator(,) integer(505)operator(,) integer(506)operator(,) integer(507)operator(,) integer(508)operator(,) integer(509)operator(,) integer(510)operator(,) + integer(511)operator(,) integer(512)operator(,) integer(513)operator(,) integer(514)operator(,) integer(515)operator(,) integer(516)operator(,) integer(412)operator(,) integer(235)operator(,) integer(414)operator(,) integer(417)operator(,) + integer(453)operator(,) integer(454)operator(,) integer(455)operator(,) integer(480)operator(,) integer(264)operator(,) integer(536)operator(,) integer(538)operator(,) integer(520)operator(,) integer(487)operator(,) integer(111)operator(,) + integer(395)operator(,) integer(389)operator(,) integer(398)operator(,) integer(614)operator(,) integer(267)operator(,) integer(471)operator(,) integer(472)operator(,) integer(473)operator(,) integer(474)operator(,) integer(402)operator(,) + integer(614)operator(,) integer(801)operator(,) integer(235)operator(,) operator(-)integer(91)operator(,) integer(239)operator(,) integer(875)operator(,) integer(239)operator(,) integer(418)operator(,) integer(405)operator(,) integer(470)operator(,) + operator(-)integer(90)operator(,) operator(-)integer(91)operator(,) integer(520)operator(,) operator(-)integer(427)operator(,) integer(475)operator(,) operator(-)integer(78)operator(,) integer(431)operator(,) operator(-)integer(86)operator(,) integer(581)operator(,) integer(267)operator(,) + integer(235)operator(,) operator(-)integer(83)operator(,) integer(536)operator(,) integer(538)operator(,) integer(535)operator(,) integer(537)operator(,) operator(-)integer(80)operator(,) integer(235)operator(,) operator(-)integer(82)operator(,) operator(-)integer(88)operator(,) + integer(520)operator(,) integer(361)operator(,) integer(362)operator(,) integer(719)operator(,) integer(235)operator(,) operator(-)integer(78)operator(,) operator(-)integer(90)operator(,) integer(267)operator(,) integer(406)operator(,) integer(235)operator(,) + integer(235)operator(,) integer(76)operator(,) operator(-)integer(85)operator(,) integer(235)operator(,) integer(520)operator(,) integer(409)operator(,) integer(736)operator(,) integer(617)operator(,) integer(410)operator(,) integer(737)operator(,) + integer(738)operator(,) integer(267)operator(,) integer(611)operator(,) integer(425)operator(,) integer(621)operator(,) integer(427)operator(,) operator(-)integer(427)operator(,) integer(211)operator(,) integer(211)operator(,) integer(622)operator(,) + integer(631)operator(,) integer(824)operator(,) integer(707)operator(,) integer(704)operator(,) operator(-)integer(428)operator(,) integer(634)operator(,) integer(542)operator(,) operator(-)integer(430)operator(,) operator(-)integer(429)operator(,) integer(188)operator(,) + integer(482)operator(,) operator(-)integer(65)operator(,) operator(-)integer(73)operator(,) integer(235)operator(,) integer(520)operator(,) integer(482)operator(,) integer(235)operator(,) integer(712)operator(,) integer(235)operator(,) integer(211)operator(,) + integer(316)operator(,) integer(211)operator(,) integer(211)operator(,) integer(61)operator(,) integer(235)operator(,) integer(433)operator(,) integer(204)operator(,) integer(623)operator(,) integer(205)operator(,) integer(627)operator(,) + integer(434)operator(,) integer(76)operator(,) integer(841)operator(,) operator(-)integer(78)operator(,) integer(520)operator(,) integer(629)operator(,) integer(76)operator(,) operator(-)integer(86)operator(,) operator(-)integer(78)operator(,) integer(597)operator(,) + integer(597)operator(,) integer(267)operator(,) integer(650)operator(,) integer(651)operator(,) operator(-)integer(80)operator(,) integer(636)operator(,) integer(637)operator(,) operator(-)integer(428)operator(,) integer(316)operator(,) operator(-)integer(80)operator(,) + operator(-)integer(430)operator(,) operator(-)integer(429)operator(,) operator(-)integer(88)operator(,) integer(235)operator(,) integer(572)operator(,) operator(-)integer(78)operator(,) operator(-)integer(78)operator(,) operator(-)integer(64)operator(,) integer(614)operator(,) integer(553)operator(,) + integer(860)operator(,) integer(554)operator(,) integer(555)operator(,) integer(556)operator(,) integer(557)operator(,) operator(-)integer(85)operator(,) operator(-)integer(80)operator(,) operator(-)integer(80)operator(,) integer(262)operator(,) integer(553)operator(,) + operator(-)integer(80)operator(,) integer(554)operator(,) integer(555)operator(,) integer(556)operator(,) integer(557)operator(,) integer(76)operator(,) integer(211)operator(,) integer(211)operator(,) integer(211)operator(,) integer(211)operator(,) + integer(76)operator(,) integer(211)operator(,) integer(211)operator(,) operator(-)integer(77)operator(,) integer(438)operator(,) integer(211)operator(,) integer(446)operator(,) integer(76)operator(,) integer(278)operator(,) integer(713)operator(,) + integer(211)operator(,) integer(316)operator(,) integer(782)operator(,) integer(591)operator(,) integer(614)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) + integer(558)operator(,) integer(559)operator(,) integer(288)operator(,) integer(289)operator(,) integer(663)operator(,) integer(795)operator(,) integer(329)operator(,) integer(330)operator(,) integer(439)operator(,) operator(-)integer(88)operator(,) + integer(558)operator(,) integer(559)operator(,) integer(440)operator(,) integer(664)operator(,) integer(448)operator(,) integer(879)operator(,) integer(461)operator(,) integer(442)operator(,) integer(211)operator(,) integer(560)operator(,) + integer(670)operator(,) integer(440)operator(,) integer(561)operator(,) integer(673)operator(,) integer(675)operator(,) operator(-)integer(85)operator(,) integer(211)operator(,) integer(211)operator(,) integer(262)operator(,) integer(560)operator(,) + integer(452)operator(,) integer(663)operator(,) integer(561)operator(,) integer(558)operator(,) integer(559)operator(,) integer(465)operator(,) operator(-)integer(420)operator(,) integer(562)operator(,) integer(337)operator(,) integer(338)operator(,) + integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) integer(211)operator(,) operator(-)integer(423)operator(,) integer(76)operator(,) integer(211)operator(,) integer(468)operator(,) operator(-)integer(283)operator(,) integer(431)operator(,) + integer(235)operator(,) integer(606)operator(,) integer(560)operator(,) integer(469)operator(,) integer(486)operator(,) integer(561)operator(,) integer(342)operator(,) integer(76)operator(,) integer(188)operator(,) integer(188)operator(,) + integer(666)operator(,) integer(211)operator(,) integer(684)operator(,) integer(452)operator(,) integer(235)operator(,) integer(76)operator(,) integer(373)operator(,) integer(76)operator(,) integer(836)operator(,) operator(-)integer(90)operator(,) + integer(698)operator(,) integer(453)operator(,) integer(454)operator(,) integer(457)operator(,) integer(838)operator(,) integer(211)operator(,) integer(204)operator(,) integer(680)operator(,) integer(205)operator(,) operator(-)integer(420)operator(,) + operator(-)integer(86)operator(,) integer(539)operator(,) integer(235)operator(,) integer(575)operator(,) integer(679)operator(,) integer(699)operator(,) integer(235)operator(,) operator(-)integer(423)operator(,) integer(211)operator(,) operator(-)integer(283)operator(,) + integer(235)operator(,) operator(-)integer(283)operator(,) operator(-)integer(82)operator(,) integer(580)operator(,) integer(576)operator(,) operator(-)integer(482)operator(,) integer(444)operator(,) integer(343)operator(,) integer(235)operator(,) integer(344)operator(,) + integer(440)operator(,) integer(316)operator(,) integer(76)operator(,) operator(-)integer(78)operator(,) integer(453)operator(,) integer(454)operator(,) integer(459)operator(,) integer(688)operator(,) integer(393)operator(,) integer(374)operator(,) + integer(611)operator(,) integer(593)operator(,) integer(743)operator(,) integer(452)operator(,) integer(605)operator(,) integer(735)operator(,) integer(329)operator(,) integer(330)operator(,) integer(615)operator(,) integer(90)operator(,) + integer(367)operator(,) integer(90)operator(,) integer(113)operator(,) integer(113)operator(,) integer(113)operator(,) integer(211)operator(,) integer(624)operator(,) integer(628)operator(,) integer(550)operator(,) integer(385)operator(,) + integer(399)operator(,) integer(235)operator(,) integer(229)operator(,) integer(756)operator(,) integer(757)operator(,) integer(759)operator(,) integer(760)operator(,) integer(225)operator(,) integer(723)operator(,) integer(633)operator(,) + integer(764)operator(,) integer(766)operator(,) integer(429)operator(,) operator(-)integer(73)operator(,) integer(635)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) + integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) integer(649)operator(,) integer(453)operator(,) integer(454)operator(,) integer(462)operator(,) integer(449)operator(,) integer(667)operator(,) integer(235)operator(,) + operator(-)integer(264)operator(,) integer(368)operator(,) integer(657)operator(,) integer(369)operator(,) integer(90)operator(,) integer(658)operator(,) operator(-)integer(431)operator(,) integer(665)operator(,) integer(279)operator(,) integer(111)operator(,) + integer(386)operator(,) integer(400)operator(,) integer(387)operator(,) integer(401)operator(,) integer(758)operator(,) integer(682)operator(,) integer(482)operator(,) integer(428)operator(,) operator(-)integer(88)operator(,) integer(763)operator(,) + integer(765)operator(,) integer(683)operator(,) integer(262)operator(,) integer(386)operator(,) integer(759)operator(,) integer(430)operator(,) integer(764)operator(,) integer(766)operator(,) integer(279)operator(,) operator(-)integer(276)operator(,) + integer(685)operator(,) integer(689)operator(,) integer(235)operator(,) integer(692)operator(,) operator(-)integer(284)operator(,) integer(694)operator(,) integer(776)operator(,) integer(762)operator(,) integer(450)operator(,) integer(235)operator(,) + integer(451)operator(,) operator(-)integer(80)operator(,) operator(-)integer(285)operator(,) integer(235)operator(,) integer(695)operator(,) integer(697)operator(,) integer(235)operator(,) operator(-)integer(431)operator(,) integer(704)operator(,) operator(-)integer(431)operator(,) + integer(807)operator(,) integer(862)operator(,) integer(711)operator(,) integer(746)operator(,) integer(747)operator(,) integer(809)operator(,) integer(748)operator(,) operator(-)integer(85)operator(,) integer(211)operator(,) integer(76)operator(,) + integer(42)operator(,) integer(43)operator(,) integer(452)operator(,) integer(772)operator(,) integer(90)operator(,) integer(460)operator(,) integer(715)operator(,) integer(443)operator(,) integer(235)operator(,) integer(445)operator(,) + operator(-)integer(276)operator(,) integer(447)operator(,) operator(-)integer(276)operator(,) integer(262)operator(,) integer(716)operator(,) operator(-)integer(284)operator(,) integer(820)operator(,) operator(-)integer(284)operator(,) integer(76)operator(,) integer(232)operator(,) + operator(-)integer(77)operator(,) integer(793)operator(,) integer(718)operator(,) operator(-)integer(285)operator(,) integer(725)operator(,) operator(-)integer(285)operator(,) integer(812)operator(,) integer(94)operator(,) integer(722)operator(,) integer(94)operator(,) + integer(732)operator(,) integer(731)operator(,) integer(863)operator(,) integer(814)operator(,) integer(864)operator(,) integer(94)operator(,) integer(94)operator(,) integer(94)operator(,) integer(734)operator(,) integer(726)operator(,) + integer(739)operator(,) integer(94)operator(,) integer(94)operator(,) integer(453)operator(,) integer(454)operator(,) integer(94)operator(,) integer(597)operator(,) integer(741)operator(,) integer(316)operator(,) integer(820)operator(,) + integer(733)operator(,) integer(235)operator(,) integer(94)operator(,) integer(742)operator(,) integer(744)operator(,) integer(819)operator(,) integer(773)operator(,) integer(846)operator(,) integer(774)operator(,) integer(211)operator(,) + integer(235)operator(,) integer(777)operator(,) integer(786)operator(,) integer(329)operator(,) integer(330)operator(,) integer(235)operator(,) integer(301)operator(,) integer(302)operator(,) integer(303)operator(,) integer(304)operator(,) + integer(305)operator(,) integer(790)operator(,) integer(94)operator(,) integer(94)operator(,) integer(94)operator(,) integer(271)operator(,) integer(275)operator(,) integer(794)operator(,) integer(796)operator(,) integer(211)operator(,) + integer(810)operator(,) integer(815)operator(,) integer(111)operator(,) integer(579)operator(,) integer(94)operator(,) integer(211)operator(,) integer(825)operator(,) integer(816)operator(,) operator(-)integer(265)operator(,) integer(826)operator(,) + integer(843)operator(,) integer(587)operator(,) integer(844)operator(,) integer(589)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) + integer(76)operator(,) integer(848)operator(,) integer(235)operator(,) integer(90)operator(,) integer(235)operator(,) integer(854)operator(,) integer(850)operator(,) integer(853)operator(,) integer(227)operator(,) integer(808)operator(,) + integer(855)operator(,) integer(856)operator(,) integer(858)operator(,) integer(861)operator(,) integer(871)operator(,) integer(874)operator(,) integer(211)operator(,) integer(235)operator(,) integer(876)operator(,) integer(884)operator(,) + integer(314)operator(,) integer(211)operator(,) integer(211)operator(,) integer(886)operator(,) integer(235)operator(,) integer(889)operator(,) integer(235)operator(,) integer(520)operator(,) integer(632)operator(,) integer(116)operator(,) + integer(94)operator(,) integer(752)operator(,) integer(94)operator(,) integer(349)operator(,) integer(267)operator(,) integer(350)operator(,) integer(883)operator(,) integer(190)operator(,) integer(882)operator(,) integer(830)operator(,) + integer(235)operator(,) integer(686)operator(,) integer(778)operator(,) integer(779)operator(,) integer(0)operator(,) integer(235)operator(,) integer(300)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(802)operator(,) integer(90)operator(,) integer(0)operator(,) integer(804)operator(,) integer(805)operator(,) integer(0)operator(,) integer(90)operator(,) integer(76)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(211)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(76)operator(,) integer(76)operator(,) integer(76)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(90)operator(,) integer(0)operator(,) integer(73)operator(,) + integer(0)operator(,) integer(73)operator(,) integer(90)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(76)operator(,) integer(90)operator(,) + integer(279)operator(,) integer(0)operator(,) integer(226)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(211)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(76)operator(,) integer(76)operator(,) integer(0)operator(,) integer(76)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(849)operator(,) integer(851)operator(,) integer(208)operator(,) integer(208)operator(,) + integer(208)operator(,) integer(833)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(76)operator(,) integer(0)operator(,) integer(94)operator(,) integer(94)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(250)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(408)operator(,) integer(408)operator(,) integer(90)operator(,) integer(0)operator(,) integer(94)operator(,) + integer(0)operator(,) integer(94)operator(,) integer(94)operator(,) integer(420)operator(,) integer(868)operator(,) integer(869)operator(,) integer(265)operator(,) integer(0)operator(,) integer(76)operator(,) integer(90)operator(,) + integer(873)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(76)operator(,) integer(94)operator(,) integer(90)operator(,) integer(0)operator(,) integer(90)operator(,) + integer(0)operator(,) integer(76)operator(,) integer(0)operator(,) integer(76)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(887)operator(,) + integer(76)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(890)operator(,) integer(0)operator(,) integer(0)operator(,) integer(892)operator(,) integer(0)operator(,) integer(211)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(894)operator(,) integer(0)operator(,) integer(0)operator(,) integer(90)operator(,) integer(94)operator(,) integer(94)operator(,) integer(94)operator(,) integer(94)operator(,) integer(94)operator(,) + integer(94)operator(,) integer(94)operator(,) integer(94)operator(,) integer(357)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(745)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(271)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(94)operator(,) integer(0)operator(,) integer(93)operator(,) + integer(0)operator(,) integer(93)operator(,) integer(114)operator(,) integer(114)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(230)operator(,) integer(94)operator(,) integer(271)operator(,) integer(94)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(578)operator(,) integer(789)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(94)operator(,) integer(271)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(798)operator(,) integer(799)operator(,) integer(800)operator(,) integer(0)operator(,) integer(93)operator(,) integer(94)operator(,) integer(271)operator(,) integer(0)operator(,) integer(280)operator(,) integer(408)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(90)operator(,) integer(0)operator(,) integer(0)operator(,) integer(408)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(280)operator(,) integer(0)operator(,) + integer(208)operator(,) integer(208)operator(,) integer(94)operator(,) integer(73)operator(,) integer(817)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) + integer(90)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(821)operator(,) + integer(822)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(271)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(837)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) integer(655)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) + integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(857)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(208)operator(,) + integer(208)operator(,) integer(208)operator(,) integer(208)operator(,) integer(0)operator(,) integer(476)operator(,) integer(477)operator(,) integer(0)operator(,) integer(865)operator(,) integer(0)operator(,) integer(866)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(90)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(867)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(229)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(671)operator(,) integer(0)operator(,) integer(0)operator(,) integer(671)operator(,) integer(671)operator(,) integer(655)operator(,) + integer(655)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(94)operator(,) integer(94)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(671)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(94)operator(,) integer(73)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(691)operator(,) integer(0)operator(,) integer(691)operator(,) integer(0)operator(,) integer(691)operator(,) integer(0)operator(,) integer(0)operator(,) integer(552)operator(,) + integer(0)operator(,) integer(90)operator(,) integer(703)operator(,) integer(706)operator(,) integer(0)operator(,) integer(706)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(706)operator(,) integer(0)operator(,) integer(0)operator(,) integer(90)operator(,) integer(90)operator(,) integer(90)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(73)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(408)operator(,) integer(93)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(265)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(408)operator(,) integer(94)operator(,) + integer(90)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(90)operator(,) integer(90)operator(,) integer(0)operator(,) integer(90)operator(,) integer(0)operator(,) + integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(834)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(90)operator(,) integer(0)operator(,) integer(93)operator(,) + integer(280)operator(,) integer(94)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(655)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(90)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(90)operator(,) integer(788)operator(,) integer(94)operator(,) + integer(0)operator(,) integer(792)operator(,) integer(94)operator(,) integer(90)operator(,) integer(0)operator(,) integer(90)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(73)operator(,) integer(90)operator(,) integer(0)operator(,) integer(94)operator(,) integer(94)operator(,) integer(94)operator(,) integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(408)operator(,) integer(0)operator(,) integer(0)operator(,) integer(408)operator(,) integer(408)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) + integer(73)operator(,) integer(0)operator(,) integer(0)operator(,) integer(671)operator(,) integer(671)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) integer(93)operator(,) + integer(0)operator(,) integer(208)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(94)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(94)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(691)operator(,) integer(691)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(691)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(706)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(208)operator(,) integer(0)operator(,) integer(408)operator(,) integer(408)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) + integer(226)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(740)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(94)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(94)operator(,) integer(0)operator(,) integer(408)operator(,) integer(408)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(408)operator(,) integer(403)operator(,) + integer(404)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(691)operator(,) integer(92)operator(,) integer(0)operator(,) integer(94)operator(,) integer(271)operator(,) + integer(0)operator(,) integer(578)operator(,) integer(706)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(408)operator(,) integer(92)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(408)operator(,) integer(0)operator(,) integer(0)operator(,) integer(408)operator(,) integer(0)operator(,) integer(73)operator(,) integer(73)operator(,) integer(73)operator(,) integer(408)operator(,) + integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(517)operator(,) integer(518)operator(,) integer(0)operator(,) integer(208)operator(,) integer(519)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) + integer(73)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(481)operator(,) integer(169)operator(,) + integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(489)operator(,) integer(0)operator(,) integer(73)operator(,) integer(73)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(832)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(174)operator(,) integer(175)operator(,) + integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(184)operator(,) integer(316)operator(,) integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(185)operator(,) + integer(325)operator(,) integer(326)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(73)operator(,) integer(0)operator(,) integer(93)operator(,) integer(750)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(230)operator(,) integer(0)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) integer(73)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(489)operator(,) integer(73)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) + integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) integer(607)operator(,) integer(609)operator(,) integer(0)operator(,) integer(0)operator(,) integer(613)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(92)operator(,) integer(618)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) + integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(639)operator(,) integer(659)operator(,) integer(0)operator(,) + integer(613)operator(,) integer(0)operator(,) integer(639)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(93)operator(,) integer(93)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(316)operator(,) + integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) integer(326)operator(,) + integer(327)operator(,) integer(328)operator(,) integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) integer(0)operator(,) integer(656)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(93)operator(,) integer(0)operator(,) integer(93)operator(,) integer(331)operator(,) + integer(0)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) + integer(341)operator(,) integer(92)operator(,) integer(0)operator(,) integer(835)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) + integer(0)operator(,) operator(-)integer(220)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(93)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) + operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(93)operator(,) integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(92)operator(,) integer(0)operator(,) integer(93)operator(,) integer(0)operator(,) integer(700)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(92)operator(,) integer(92)operator(,) integer(717)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(724)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(727)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(728)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(609)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(92)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(247)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) + operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(755)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(775)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(92)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(639)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(613)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(613)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(818)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) + operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) + operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) + operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) integer(839)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) + operator(-)integer(478)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(847)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(852)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) + operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(609)operator(,) integer(0)operator(,) integer(613)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(478)operator(,) integer(0)operator(,) integer(0)operator(,) integer(885)operator(,) integer(0)operator(,) + integer(888)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) integer(4)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) + integer(8)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(613)operator(,) integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) integer(893)operator(,) + integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) + integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) + integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) + integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(485)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(485)operator(,) + operator(-)integer(485)operator(,) integer(0)operator(,) operator(-)integer(485)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(659)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(485)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) integer(0)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) integer(316)operator(,) + integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) integer(326)operator(,) + integer(327)operator(,) integer(328)operator(,) integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(485)operator(,) + operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) + operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) integer(0)operator(,) integer(661)operator(,) integer(331)operator(,) + integer(0)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) + integer(341)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(87)operator(,) operator(-)integer(485)operator(,) + integer(0)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) + operator(-)integer(485)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(283)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) integer(0)operator(,) operator(-)integer(485)operator(,) + operator(-)integer(485)operator(,) operator(-)integer(79)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(485)operator(,) operator(-)integer(485)operator(,) integer(0)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) + integer(0)operator(,) operator(-)integer(283)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) integer(0)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) integer(316)operator(,) integer(317)operator(,) + integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) integer(326)operator(,) integer(327)operator(,) + integer(328)operator(,) integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) + operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) + operator(-)integer(283)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) integer(0)operator(,) integer(662)operator(,) integer(331)operator(,) integer(660)operator(,) + integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(89)operator(,) operator(-)integer(283)operator(,) integer(0)operator(,) + operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) integer(0)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) + operator(-)integer(81)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(283)operator(,) operator(-)integer(283)operator(,) integer(4)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) + integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(501)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) + integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) + integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) + integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) + integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(4)operator(,) integer(0)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(10)operator(,) integer(11)operator(,) + integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) + integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) + integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(46)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(4)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) + integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) integer(12)operator(,) operator(-)integer(501)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) + integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) integer(21)operator(,) + integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) + integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) + integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(4)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) operator(-)integer(501)operator(,) + operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) + integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) + integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) + integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(4)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) + integer(8)operator(,) integer(9)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) + integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) + integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) + integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) + integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(4)operator(,) integer(0)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) + integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) + integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) + integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(46)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(261)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(4)operator(,) + integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) + integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) + integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) + integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) + integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) + integer(4)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) + integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) integer(21)operator(,) + integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) + integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) + integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(501)operator(,) integer(0)operator(,) integer(4)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) operator(-)integer(501)operator(,) + operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) + integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) + integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) + integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) + integer(8)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) + integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(501)operator(,) operator(-)integer(501)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) + integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) + integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) + integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) + integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(395)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) + integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) + integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(216)operator(,) integer(217)operator(,) integer(117)operator(,) + integer(118)operator(,) integer(119)operator(,) integer(120)operator(,) integer(121)operator(,) integer(122)operator(,) integer(123)operator(,) integer(124)operator(,) integer(125)operator(,) integer(126)operator(,) integer(127)operator(,) + integer(128)operator(,) integer(129)operator(,) integer(130)operator(,) integer(131)operator(,) integer(132)operator(,) integer(133)operator(,) integer(134)operator(,) integer(135)operator(,) integer(136)operator(,) integer(137)operator(,) + integer(138)operator(,) integer(139)operator(,) integer(140)operator(,) integer(0)operator(,) integer(0)operator(,) integer(141)operator(,) integer(142)operator(,) integer(143)operator(,) integer(144)operator(,) integer(145)operator(,) + integer(146)operator(,) integer(147)operator(,) integer(148)operator(,) integer(149)operator(,) integer(150)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(151)operator(,) integer(152)operator(,) integer(153)operator(,) integer(154)operator(,) integer(155)operator(,) integer(156)operator(,) integer(157)operator(,) integer(158)operator(,) integer(36)operator(,) integer(37)operator(,) + integer(159)operator(,) integer(39)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(160)operator(,) integer(161)operator(,) + integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) + integer(182)operator(,) integer(183)operator(,) integer(0)operator(,) integer(0)operator(,) integer(184)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) + integer(0)operator(,) operator(-)integer(480)operator(,) integer(0)operator(,) integer(185)operator(,) integer(186)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(480)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) integer(0)operator(,) + operator(-)integer(480)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) + operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) + operator(-)integer(480)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) integer(0)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) + operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) + operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(480)operator(,) operator(-)integer(479)operator(,) operator(-)integer(480)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) + operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(480)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) + operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) + operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) + operator(-)integer(479)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) + operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(479)operator(,) operator(-)integer(481)operator(,) operator(-)integer(479)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) + operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(479)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) + operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) + operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) + operator(-)integer(481)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) integer(710)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) integer(0)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) + integer(0)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(87)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) integer(0)operator(,) + operator(-)integer(482)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(481)operator(,) operator(-)integer(482)operator(,) + integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(481)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(482)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) + operator(-)integer(482)operator(,) integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(482)operator(,) integer(662)operator(,) integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) + integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) integer(0)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) + operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(89)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(482)operator(,) + operator(-)integer(482)operator(,) operator(-)integer(482)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(482)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(244)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) + integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) + operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) integer(0)operator(,) operator(-)integer(483)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(254)operator(,) operator(-)integer(483)operator(,) integer(0)operator(,) + operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) integer(247)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(483)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) + integer(0)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) integer(0)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(483)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) integer(0)operator(,) + operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) integer(0)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) + operator(-)integer(483)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) + operator(-)integer(484)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(483)operator(,) operator(-)integer(483)operator(,) + operator(-)integer(483)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) + operator(-)integer(483)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) + operator(-)integer(484)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(484)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) + operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) integer(0)operator(,) + operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) + operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) operator(-)integer(484)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(484)operator(,) integer(117)operator(,) integer(118)operator(,) integer(119)operator(,) integer(120)operator(,) integer(121)operator(,) integer(122)operator(,) + integer(123)operator(,) integer(124)operator(,) integer(125)operator(,) integer(126)operator(,) integer(127)operator(,) integer(128)operator(,) integer(129)operator(,) integer(130)operator(,) integer(131)operator(,) integer(132)operator(,) + integer(133)operator(,) integer(134)operator(,) integer(135)operator(,) integer(136)operator(,) integer(137)operator(,) integer(138)operator(,) integer(139)operator(,) integer(140)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(141)operator(,) integer(142)operator(,) integer(143)operator(,) integer(192)operator(,) integer(193)operator(,) integer(194)operator(,) integer(195)operator(,) integer(148)operator(,) integer(149)operator(,) integer(150)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(151)operator(,) integer(152)operator(,) integer(153)operator(,) integer(154)operator(,) integer(196)operator(,) + integer(197)operator(,) integer(198)operator(,) integer(158)operator(,) integer(281)operator(,) integer(282)operator(,) integer(199)operator(,) integer(283)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) + integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) + integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) + integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(0)operator(,) integer(0)operator(,) integer(184)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(117)operator(,) + integer(118)operator(,) integer(119)operator(,) integer(120)operator(,) integer(121)operator(,) integer(122)operator(,) integer(123)operator(,) integer(124)operator(,) integer(125)operator(,) integer(126)operator(,) integer(127)operator(,) + integer(128)operator(,) integer(129)operator(,) integer(130)operator(,) integer(131)operator(,) integer(132)operator(,) integer(133)operator(,) integer(134)operator(,) integer(135)operator(,) integer(136)operator(,) integer(137)operator(,) + integer(138)operator(,) integer(139)operator(,) integer(140)operator(,) integer(0)operator(,) integer(0)operator(,) integer(141)operator(,) integer(142)operator(,) integer(143)operator(,) integer(192)operator(,) integer(193)operator(,) + integer(194)operator(,) integer(195)operator(,) integer(148)operator(,) integer(149)operator(,) integer(150)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(151)operator(,) integer(152)operator(,) integer(153)operator(,) integer(154)operator(,) integer(196)operator(,) integer(197)operator(,) integer(198)operator(,) integer(158)operator(,) integer(251)operator(,) integer(0)operator(,) + integer(199)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(160)operator(,) integer(161)operator(,) + integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(52)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) + integer(182)operator(,) integer(183)operator(,) integer(0)operator(,) integer(0)operator(,) integer(184)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(117)operator(,) integer(118)operator(,) integer(119)operator(,) integer(120)operator(,) integer(121)operator(,) integer(122)operator(,) + integer(123)operator(,) integer(124)operator(,) integer(125)operator(,) integer(126)operator(,) integer(127)operator(,) integer(128)operator(,) integer(129)operator(,) integer(130)operator(,) integer(131)operator(,) integer(132)operator(,) + integer(133)operator(,) integer(134)operator(,) integer(135)operator(,) integer(136)operator(,) integer(137)operator(,) integer(138)operator(,) integer(139)operator(,) integer(140)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(141)operator(,) integer(142)operator(,) integer(143)operator(,) integer(192)operator(,) integer(193)operator(,) integer(194)operator(,) integer(195)operator(,) integer(148)operator(,) integer(149)operator(,) integer(150)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(151)operator(,) integer(152)operator(,) integer(153)operator(,) integer(154)operator(,) integer(196)operator(,) + integer(197)operator(,) integer(198)operator(,) integer(158)operator(,) integer(0)operator(,) integer(0)operator(,) integer(199)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) + integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) + integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(52)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) + integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(0)operator(,) integer(0)operator(,) integer(184)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(117)operator(,) + integer(118)operator(,) integer(119)operator(,) integer(120)operator(,) integer(121)operator(,) integer(122)operator(,) integer(123)operator(,) integer(124)operator(,) integer(125)operator(,) integer(126)operator(,) integer(127)operator(,) + integer(128)operator(,) integer(129)operator(,) integer(130)operator(,) integer(131)operator(,) integer(132)operator(,) integer(133)operator(,) integer(134)operator(,) integer(135)operator(,) integer(136)operator(,) integer(137)operator(,) + integer(138)operator(,) integer(139)operator(,) integer(140)operator(,) integer(0)operator(,) integer(0)operator(,) integer(141)operator(,) integer(142)operator(,) integer(143)operator(,) integer(192)operator(,) integer(193)operator(,) + integer(194)operator(,) integer(195)operator(,) integer(148)operator(,) integer(149)operator(,) integer(150)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(151)operator(,) integer(152)operator(,) integer(153)operator(,) integer(154)operator(,) integer(196)operator(,) integer(197)operator(,) integer(198)operator(,) integer(158)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(199)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(160)operator(,) integer(161)operator(,) + integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) + integer(182)operator(,) integer(183)operator(,) integer(0)operator(,) integer(0)operator(,) integer(184)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) + integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(12)operator(,) + integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) + integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) + integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(231)operator(,) integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(58)operator(,) + integer(233)operator(,) integer(60)operator(,) integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(12)operator(,) integer(411)operator(,) integer(13)operator(,) + integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(28)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) + integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(46)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) + integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) + integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) + integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) + integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) + integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(616)operator(,) integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) + integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) + integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) + integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(231)operator(,) integer(232)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) + integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) + integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) + integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(413)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) + integer(0)operator(,) integer(231)operator(,) integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) + integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) + integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) + integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) + integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(608)operator(,) integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) + integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) + integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) + integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) + integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(612)operator(,) integer(232)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) + integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(21)operator(,) + integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) + integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) + integer(608)operator(,) integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) + integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) + integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) + integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(803)operator(,) integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) + integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) + integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) + integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) + integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) + integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(806)operator(,) integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) + integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) + integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) + integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) + integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) + integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(811)operator(,) + integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) + integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) + integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) + integer(50)operator(,) integer(0)operator(,) integer(870)operator(,) integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) + integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) + integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) + integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) + integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(872)operator(,) integer(232)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) + integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) + integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) + integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(891)operator(,) integer(232)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) + integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) + integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(27)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) + integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) + integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(59)operator(,) integer(60)operator(,) integer(12)operator(,) + integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) + integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) + integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(266)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) + integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) + integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) + integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) + integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(479)operator(,) integer(0)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) + integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) + integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) + integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) + integer(590)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) + integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) + integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) + integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(638)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) + integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) + integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) + integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) + integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) + integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(479)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) + integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) + integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) + integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) + integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) + integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(754)operator(,) + integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) + integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) + integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) + integer(50)operator(,) integer(0)operator(,) integer(797)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) + integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) + integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) + integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) + integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) + integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(29)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) + integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(44)operator(,) + integer(45)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(207)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(58)operator(,) integer(233)operator(,) integer(60)operator(,) integer(12)operator(,) integer(0)operator(,) integer(13)operator(,) integer(14)operator(,) + integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) + integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(102)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) + integer(43)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(224)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) + integer(0)operator(,) integer(51)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(751)operator(,) integer(0)operator(,) + integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(12)operator(,) integer(108)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) + integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) + integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(102)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(103)operator(,) + integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(104)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(105)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(106)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) + integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(12)operator(,) integer(108)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) + integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) + integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(102)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(224)operator(,) integer(0)operator(,) integer(0)operator(,) integer(47)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(51)operator(,) + integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(12)operator(,) integer(108)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(102)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) + integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(276)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(312)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(313)operator(,) integer(0)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) + integer(6)operator(,) integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(12)operator(,) integer(108)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) + integer(25)operator(,) integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(102)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(103)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) + integer(104)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(106)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) + integer(7)operator(,) integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(12)operator(,) integer(108)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) + integer(26)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(102)operator(,) integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) + integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(276)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(107)operator(,) integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) + integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) + integer(0)operator(,) integer(9)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(10)operator(,) integer(11)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(12)operator(,) integer(108)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(97)operator(,) integer(98)operator(,) integer(18)operator(,) integer(19)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(102)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) integer(39)operator(,) + integer(40)operator(,) integer(41)operator(,) integer(0)operator(,) integer(42)operator(,) integer(43)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(831)operator(,) integer(0)operator(,) integer(0)operator(,) integer(107)operator(,) + integer(48)operator(,) integer(0)operator(,) integer(49)operator(,) integer(50)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(524)operator(,) + integer(525)operator(,) integer(0)operator(,) integer(0)operator(,) integer(526)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(108)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) + integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(529)operator(,) integer(525)operator(,) integer(184)operator(,) integer(0)operator(,) integer(530)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) + integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) + integer(183)operator(,) integer(545)operator(,) integer(518)operator(,) integer(184)operator(,) integer(0)operator(,) integer(546)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) + integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) + integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) + integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(582)operator(,) integer(518)operator(,) integer(184)operator(,) + integer(0)operator(,) integer(583)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(160)operator(,) + integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) + integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(585)operator(,) integer(525)operator(,) integer(184)operator(,) integer(0)operator(,) integer(586)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) + integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) + integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(599)operator(,) + integer(518)operator(,) integer(184)operator(,) integer(0)operator(,) integer(600)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(185)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) + integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(602)operator(,) integer(525)operator(,) integer(184)operator(,) integer(0)operator(,) integer(603)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) + integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) + integer(183)operator(,) integer(640)operator(,) integer(518)operator(,) integer(184)operator(,) integer(0)operator(,) integer(641)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) + integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) + integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) + integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(643)operator(,) integer(525)operator(,) integer(184)operator(,) + integer(0)operator(,) integer(644)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(160)operator(,) + integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) + integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(877)operator(,) integer(518)operator(,) integer(184)operator(,) integer(0)operator(,) integer(878)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) + integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) + integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(880)operator(,) + integer(525)operator(,) integer(184)operator(,) integer(0)operator(,) integer(881)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(185)operator(,) integer(160)operator(,) integer(161)operator(,) integer(162)operator(,) integer(163)operator(,) integer(164)operator(,) integer(165)operator(,) integer(0)operator(,) integer(166)operator(,) integer(167)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(168)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(169)operator(,) integer(170)operator(,) integer(171)operator(,) integer(172)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(173)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(174)operator(,) integer(175)operator(,) integer(176)operator(,) integer(177)operator(,) integer(178)operator(,) + integer(179)operator(,) integer(180)operator(,) integer(181)operator(,) integer(182)operator(,) integer(183)operator(,) integer(0)operator(,) integer(0)operator(,) integer(184)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(185)operator(,) integer(316)operator(,) integer(317)operator(,) integer(318)operator(,) + integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) integer(326)operator(,) integer(327)operator(,) integer(328)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(331)operator(,) integer(0)operator(,) integer(332)operator(,) + integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) integer(316)operator(,) + integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) integer(326)operator(,) + integer(327)operator(,) integer(328)operator(,) integer(0)operator(,) integer(253)operator(,) integer(329)operator(,) integer(330)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) operator(-)integer(220)operator(,) + integer(316)operator(,) integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) + integer(326)operator(,) integer(327)operator(,) integer(328)operator(,) integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) integer(0)operator(,) integer(0)operator(,) integer(331)operator(,) + integer(0)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) + integer(341)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(331)operator(,) operator(-)integer(220)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) + integer(340)operator(,) integer(341)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(605)operator(,) integer(316)operator(,) integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) + integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) integer(326)operator(,) integer(327)operator(,) integer(328)operator(,) integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) + integer(316)operator(,) integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) + integer(326)operator(,) operator(-)integer(502)operator(,) operator(-)integer(502)operator(,) integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(331)operator(,) integer(0)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) + integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) + integer(340)operator(,) integer(341)operator(,) integer(316)operator(,) operator(-)integer(502)operator(,) operator(-)integer(502)operator(,) operator(-)integer(502)operator(,) operator(-)integer(502)operator(,) integer(321)operator(,) integer(322)operator(,) integer(0)operator(,) + integer(0)operator(,) operator(-)integer(502)operator(,) operator(-)integer(502)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) integer(316)operator(,) + integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(0)operator(,) integer(0)operator(,) integer(325)operator(,) integer(326)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(329)operator(,) integer(330)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) + integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) + integer(341) +operator(};) + +directive(static) directive(const) ident(yytype_int16) ident(yycheck)operator([]) operator(=) +operator({) + integer(16)operator(,) integer(17)operator(,) integer(7)operator(,) integer(8)operator(,) integer(20)operator(,) integer(343)operator(,) integer(215)operator(,) integer(16)operator(,) integer(17)operator(,) integer(15)operator(,) + integer(370)operator(,) integer(20)operator(,) integer(16)operator(,) integer(17)operator(,) integer(7)operator(,) integer(22)operator(,) integer(20)operator(,) integer(16)operator(,) integer(17)operator(,) integer(247)operator(,) + integer(8)operator(,) integer(20)operator(,) integer(8)operator(,) integer(28)operator(,) integer(22)operator(,) integer(397)operator(,) integer(51)operator(,) integer(409)operator(,) integer(44)operator(,) integer(45)operator(,) + integer(368)operator(,) integer(5)operator(,) integer(6)operator(,) integer(49)operator(,) integer(50)operator(,) integer(391)operator(,) integer(106)operator(,) integer(315)operator(,) integer(62)operator(,) integer(692)operator(,) + integer(28)operator(,) integer(15)operator(,) integer(28)operator(,) integer(59)operator(,) integer(60)operator(,) integer(27)operator(,) integer(50)operator(,) integer(52)operator(,) integer(386)operator(,) integer(28)operator(,) + integer(49)operator(,) integer(372)operator(,) integer(531)operator(,) integer(532)operator(,) integer(13)operator(,) integer(11)operator(,) integer(12)operator(,) integer(577)operator(,) integer(26)operator(,) integer(52)operator(,) + integer(442)operator(,) integer(13)operator(,) integer(400)operator(,) integer(4)operator(,) integer(568)operator(,) integer(12)operator(,) integer(570)operator(,) integer(587)operator(,) integer(26)operator(,) integer(47)operator(,) + integer(287)operator(,) integer(36)operator(,) integer(37)operator(,) integer(0)operator(,) integer(291)operator(,) integer(533)operator(,) integer(534)operator(,) integer(51)operator(,) integer(261)operator(,) integer(1)operator(,) + integer(92)operator(,) integer(689)operator(,) integer(59)operator(,) integer(58)operator(,) integer(692)operator(,) integer(25)operator(,) integer(130)operator(,) integer(94)operator(,) integer(58)operator(,) integer(13)operator(,) + integer(81)operator(,) integer(25)operator(,) integer(81)operator(,) integer(83)operator(,) integer(101)operator(,) integer(664)operator(,) integer(94)operator(,) integer(71)operator(,) integer(110)operator(,) integer(17)operator(,) + integer(84)operator(,) integer(670)operator(,) integer(20)operator(,) integer(15)operator(,) integer(54)operator(,) integer(17)operator(,) integer(13)operator(,) integer(64)operator(,) integer(115)operator(,) integer(72)operator(,) + integer(25)operator(,) integer(129)operator(,) integer(450)operator(,) integer(103)operator(,) integer(83)operator(,) integer(62)operator(,) integer(342)operator(,) integer(120)operator(,) integer(344)operator(,) integer(345)operator(,) + integer(346)operator(,) integer(83)operator(,) integer(102)operator(,) integer(105)operator(,) integer(99)operator(,) integer(100)operator(,) integer(16)operator(,) integer(17)operator(,) integer(129)operator(,) integer(312)operator(,) + integer(20)operator(,) integer(101)operator(,) integer(28)operator(,) integer(124)operator(,) integer(103)operator(,) integer(124)operator(,) integer(126)operator(,) integer(36)operator(,) integer(37)operator(,) integer(130)operator(,) + integer(50)operator(,) integer(103)operator(,) integer(126)operator(,) integer(369)operator(,) integer(54)operator(,) integer(108)operator(,) integer(105)operator(,) integer(83)operator(,) integer(130)operator(,) integer(131)operator(,) + integer(56)operator(,) integer(57)operator(,) integer(120)operator(,) integer(105)operator(,) integer(129)operator(,) integer(26)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(385)operator(,) + integer(50)operator(,) integer(387)operator(,) integer(120)operator(,) integer(110)operator(,) integer(126)operator(,) integer(130)operator(,) integer(26)operator(,) integer(26)operator(,) integer(108)operator(,) integer(128)operator(,) + integer(128)operator(,) integer(130)operator(,) integer(131)operator(,) integer(826)operator(,) integer(108)operator(,) integer(401)operator(,) integer(81)operator(,) integer(103)operator(,) integer(130)operator(,) integer(131)operator(,) + integer(15)operator(,) integer(105)operator(,) integer(17)operator(,) integer(126)operator(,) integer(544)operator(,) integer(107)operator(,) integer(126)operator(,) integer(2)operator(,) integer(128)operator(,) integer(4)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(126)operator(,) integer(108)operator(,) integer(218)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(105)operator(,) integer(103)operator(,) + integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(563)operator(,) integer(430)operator(,) integer(20)operator(,) integer(130)operator(,) integer(131)operator(,) integer(130)operator(,) integer(131)operator(,) + integer(81)operator(,) integer(126)operator(,) integer(27)operator(,) integer(128)operator(,) integer(94)operator(,) integer(231)operator(,) integer(232)operator(,) integer(233)operator(,) integer(826)operator(,) integer(124)operator(,) + integer(678)operator(,) integer(81)operator(,) integer(81)operator(,) integer(130)operator(,) integer(131)operator(,) integer(451)operator(,) integer(125)operator(,) integer(128)operator(,) integer(244)operator(,) integer(81)operator(,) + integer(246)operator(,) integer(247)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(244)operator(,) integer(51)operator(,) integer(246)operator(,) integer(247)operator(,) integer(128)operator(,) + integer(244)operator(,) integer(562)operator(,) integer(246)operator(,) integer(247)operator(,) integer(59)operator(,) integer(244)operator(,) integer(463)operator(,) integer(246)operator(,) integer(247)operator(,) integer(120)operator(,) + integer(266)operator(,) integer(122)operator(,) integer(81)operator(,) integer(124)operator(,) integer(130)operator(,) integer(131)operator(,) integer(71)operator(,) integer(128)operator(,) integer(737)operator(,) integer(738)operator(,) + integer(120)operator(,) integer(120)operator(,) integer(122)operator(,) integer(122)operator(,) integer(124)operator(,) integer(124)operator(,) integer(222)operator(,) integer(223)operator(,) integer(128)operator(,) integer(128)operator(,) + integer(25)operator(,) integer(218)operator(,) integer(124)operator(,) integer(126)operator(,) integer(52)operator(,) integer(779)operator(,) integer(780)operator(,) integer(25)operator(,) integer(798)operator(,) integer(54)operator(,) + integer(784)operator(,) integer(59)operator(,) integer(60)operator(,) integer(261)operator(,) integer(25)operator(,) integer(36)operator(,) integer(37)operator(,) integer(267)operator(,) integer(313)operator(,) integer(58)operator(,) + integer(105)operator(,) integer(103)operator(,) integer(107)operator(,) integer(122)operator(,) integer(310)operator(,) integer(124)operator(,) integer(83)operator(,) integer(367)operator(,) integer(576)operator(,) integer(315)operator(,) + integer(316)operator(,) integer(317)operator(,) integer(318)operator(,) integer(319)operator(,) integer(320)operator(,) integer(321)operator(,) integer(322)operator(,) integer(323)operator(,) integer(324)operator(,) integer(325)operator(,) + integer(326)operator(,) integer(327)operator(,) integer(328)operator(,) integer(329)operator(,) integer(330)operator(,) integer(331)operator(,) integer(332)operator(,) integer(333)operator(,) integer(334)operator(,) integer(335)operator(,) + integer(336)operator(,) integer(337)operator(,) integer(338)operator(,) integer(339)operator(,) integer(340)operator(,) integer(341)operator(,) integer(244)operator(,) integer(343)operator(,) integer(246)operator(,) integer(247)operator(,) + integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(310)operator(,) integer(312)operator(,) integer(351)operator(,) integer(352)operator(,) integer(342)operator(,) integer(315)operator(,) integer(313)operator(,) + integer(131)operator(,) integer(83)operator(,) integer(54)operator(,) integer(725)operator(,) integer(343)operator(,) integer(301)operator(,) integer(302)operator(,) integer(303)operator(,) integer(304)operator(,) integer(25)operator(,) + integer(732)operator(,) integer(723)operator(,) integer(368)operator(,) integer(108)operator(,) integer(244)operator(,) integer(859)operator(,) integer(246)operator(,) integer(247)operator(,) integer(84)operator(,) integer(300)operator(,) + integer(108)operator(,) integer(103)operator(,) integer(367)operator(,) integer(81)operator(,) integer(305)operator(,) integer(25)operator(,) integer(83)operator(,) integer(108)operator(,) integer(384)operator(,) integer(368)operator(,) + integer(386)operator(,) integer(126)operator(,) integer(388)operator(,) integer(389)operator(,) integer(351)operator(,) integer(352)operator(,) integer(25)operator(,) integer(393)operator(,) integer(126)operator(,) integer(25)operator(,) + integer(385)operator(,) integer(56)operator(,) integer(57)operator(,) integer(592)operator(,) integer(400)operator(,) integer(126)operator(,) integer(103)operator(,) integer(386)operator(,) integer(126)operator(,) integer(405)operator(,) + integer(406)operator(,) integer(206)operator(,) integer(25)operator(,) integer(409)operator(,) integer(399)operator(,) integer(126)operator(,) integer(624)operator(,) integer(413)operator(,) integer(240)operator(,) integer(625)operator(,) + integer(626)operator(,) integer(400)operator(,) integer(406)operator(,) integer(128)operator(,) integer(413)operator(,) integer(120)operator(,) integer(124)operator(,) integer(222)operator(,) integer(223)operator(,) integer(413)operator(,) + integer(426)operator(,) integer(771)operator(,) integer(14)operator(,) integer(15)operator(,) integer(81)operator(,) integer(431)operator(,) integer(363)operator(,) integer(81)operator(,) integer(81)operator(,) integer(424)operator(,) + integer(310)operator(,) integer(125)operator(,) integer(126)operator(,) integer(439)operator(,) integer(429)operator(,) integer(315)operator(,) integer(442)operator(,) integer(83)operator(,) integer(444)operator(,) integer(244)operator(,) + integer(64)operator(,) integer(246)operator(,) integer(247)operator(,) integer(2)operator(,) integer(450)operator(,) integer(125)operator(,) integer(424)operator(,) integer(417)operator(,) integer(424)operator(,) integer(419)operator(,) + integer(125)operator(,) integer(256)operator(,) integer(798)operator(,) integer(103)operator(,) integer(449)operator(,) integer(424)operator(,) integer(261)operator(,) integer(103)operator(,) integer(108)operator(,) integer(396)operator(,) + integer(397)operator(,) integer(450)operator(,) integer(468)operator(,) integer(469)operator(,) integer(103)operator(,) integer(435)operator(,) integer(436)operator(,) integer(124)operator(,) integer(64)operator(,) integer(108)operator(,) + integer(124)operator(,) integer(124)operator(,) integer(108)operator(,) integer(479)operator(,) integer(785)operator(,) integer(125)operator(,) integer(126)operator(,) integer(125)operator(,) integer(850)operator(,) integer(50)operator(,) + integer(830)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(108)operator(,) integer(125)operator(,) integer(126)operator(,) integer(47)operator(,) integer(50)operator(,) + integer(126)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(300)operator(,) integer(301)operator(,) integer(302)operator(,) integer(303)operator(,) integer(304)operator(,) + integer(305)operator(,) integer(306)operator(,) integer(307)operator(,) integer(126)operator(,) integer(123)operator(,) integer(310)operator(,) integer(121)operator(,) integer(312)operator(,) integer(313)operator(,) integer(83)operator(,) + integer(315)operator(,) integer(64)operator(,) integer(50)operator(,) integer(393)operator(,) integer(886)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) + integer(91)operator(,) integer(92)operator(,) integer(54)operator(,) integer(55)operator(,) integer(521)operator(,) integer(83)operator(,) integer(79)operator(,) integer(80)operator(,) integer(126)operator(,) integer(103)operator(,) + integer(91)operator(,) integer(92)operator(,) integer(130)operator(,) integer(521)operator(,) integer(54)operator(,) integer(863)operator(,) integer(101)operator(,) integer(126)operator(,) integer(343)operator(,) integer(110)operator(,) + integer(528)operator(,) integer(130)operator(,) integer(113)operator(,) integer(531)operator(,) integer(532)operator(,) integer(103)operator(,) integer(351)operator(,) integer(352)operator(,) integer(107)operator(,) integer(110)operator(,) + integer(58)operator(,) integer(548)operator(,) integer(113)operator(,) integer(91)operator(,) integer(92)operator(,) integer(101)operator(,) integer(81)operator(,) integer(128)operator(,) integer(111)operator(,) integer(112)operator(,) + integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(368)operator(,) integer(81)operator(,) integer(370)operator(,) integer(371)operator(,) integer(64)operator(,) integer(81)operator(,) integer(83)operator(,) + integer(576)operator(,) integer(403)operator(,) integer(110)operator(,) integer(64)operator(,) integer(126)operator(,) integer(113)operator(,) integer(81)operator(,) integer(382)operator(,) integer(573)operator(,) integer(574)operator(,) + integer(83)operator(,) integer(386)operator(,) integer(552)operator(,) integer(58)operator(,) integer(590)operator(,) integer(390)operator(,) integer(81)operator(,) integer(392)operator(,) integer(787)operator(,) integer(103)operator(,) + integer(573)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(793)operator(,) integer(400)operator(,) integer(574)operator(,) integer(543)operator(,) integer(574)operator(,) integer(124)operator(,) + integer(103)operator(,) integer(90)operator(,) integer(608)operator(,) integer(10)operator(,) integer(541)operator(,) integer(574)operator(,) integer(612)operator(,) integer(124)operator(,) integer(413)operator(,) integer(122)operator(,) + integer(616)operator(,) integer(124)operator(,) integer(126)operator(,) integer(13)operator(,) integer(8)operator(,) integer(128)operator(,) integer(126)operator(,) integer(122)operator(,) integer(624)operator(,) integer(124)operator(,) + integer(130)operator(,) integer(64)operator(,) integer(427)operator(,) integer(126)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(564)operator(,) integer(17)operator(,) integer(124)operator(,) + integer(624)operator(,) integer(10)operator(,) integer(638)operator(,) integer(58)operator(,) integer(126)operator(,) integer(624)operator(,) integer(79)operator(,) integer(80)operator(,) integer(125)operator(,) integer(2)operator(,) + integer(81)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(450)operator(,) integer(126)operator(,) integer(125)operator(,) integer(864)operator(,) integer(81)operator(,) + integer(81)operator(,) integer(657)operator(,) integer(15)operator(,) integer(659)operator(,) integer(660)operator(,) integer(661)operator(,) integer(662)operator(,) integer(653)operator(,) integer(604)operator(,) integer(121)operator(,) + integer(666)operator(,) integer(667)operator(,) integer(81)operator(,) integer(126)operator(,) integer(125)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) + integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(129)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(81)operator(,) integer(83)operator(,) integer(685)operator(,) + integer(126)operator(,) integer(122)operator(,) integer(126)operator(,) integer(124)operator(,) integer(47)operator(,) integer(125)operator(,) integer(81)operator(,) integer(123)operator(,) integer(51)operator(,) integer(653)operator(,) + integer(122)operator(,) integer(122)operator(,) integer(124)operator(,) integer(124)operator(,) integer(661)operator(,) integer(123)operator(,) integer(576)operator(,) integer(256)operator(,) integer(103)operator(,) integer(666)operator(,) + integer(667)operator(,) integer(10)operator(,) integer(261)operator(,) integer(122)operator(,) integer(710)operator(,) integer(124)operator(,) integer(712)operator(,) integer(713)operator(,) integer(71)operator(,) integer(81)operator(,) + integer(103)operator(,) integer(126)operator(,) integer(718)operator(,) integer(126)operator(,) integer(81)operator(,) integer(50)operator(,) integer(686)operator(,) integer(83)operator(,) integer(122)operator(,) integer(725)operator(,) + integer(124)operator(,) integer(126)operator(,) integer(81)operator(,) integer(729)operator(,) integer(126)operator(,) integer(50)operator(,) integer(732)operator(,) integer(122)operator(,) integer(15)operator(,) integer(124)operator(,) + integer(729)operator(,) integer(81)operator(,) integer(123)operator(,) integer(52)operator(,) integer(53)operator(,) integer(729)operator(,) integer(55)operator(,) integer(103)operator(,) integer(543)operator(,) integer(544)operator(,) + integer(59)operator(,) integer(60)operator(,) integer(58)operator(,) integer(680)operator(,) integer(107)operator(,) integer(61)operator(,) integer(10)operator(,) integer(270)operator(,) integer(754)operator(,) integer(272)operator(,) + integer(122)operator(,) integer(274)operator(,) integer(124)operator(,) integer(312)operator(,) integer(10)operator(,) integer(122)operator(,) integer(762)operator(,) integer(124)operator(,) integer(563)operator(,) integer(92)operator(,) + integer(126)operator(,) integer(707)operator(,) integer(126)operator(,) integer(122)operator(,) integer(126)operator(,) integer(124)operator(,) integer(736)operator(,) integer(2)operator(,) integer(123)operator(,) integer(4)operator(,) + integer(126)operator(,) integer(125)operator(,) integer(122)operator(,) integer(743)operator(,) integer(124)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(125)operator(,) integer(611)operator(,) + integer(125)operator(,) integer(16)operator(,) integer(17)operator(,) integer(99)operator(,) integer(100)operator(,) integer(20)operator(,) integer(723)operator(,) integer(121)operator(,) integer(64)operator(,) integer(795)operator(,) + integer(622)operator(,) integer(797)operator(,) integer(27)operator(,) integer(125)operator(,) integer(123)operator(,) integer(762)operator(,) integer(10)operator(,) integer(803)operator(,) integer(125)operator(,) integer(604)operator(,) + integer(806)operator(,) integer(10)operator(,) integer(84)operator(,) integer(79)operator(,) integer(80)operator(,) integer(811)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(42)operator(,) + integer(43)operator(,) integer(9)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(49)operator(,) integer(50)operator(,) integer(10)operator(,) integer(10)operator(,) integer(624)operator(,) + integer(125)operator(,) integer(121)operator(,) integer(786)operator(,) integer(382)operator(,) integer(59)operator(,) integer(630)operator(,) integer(125)operator(,) integer(108)operator(,) integer(126)operator(,) integer(126)operator(,) + integer(10)operator(,) integer(390)operator(,) integer(10)operator(,) integer(392)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) + integer(645)operator(,) integer(126)operator(,) integer(848)operator(,) integer(206)operator(,) integer(850)operator(,) integer(10)operator(,) integer(126)operator(,) integer(125)operator(,) integer(653)operator(,) integer(729)operator(,) + integer(10)operator(,) integer(121)operator(,) integer(10)operator(,) integer(54)operator(,) integer(848)operator(,) integer(121)operator(,) integer(661)operator(,) integer(863)operator(,) integer(10)operator(,) integer(10)operator(,) + integer(71)operator(,) integer(666)operator(,) integer(667)operator(,) integer(126)operator(,) integer(870)operator(,) integer(123)operator(,) integer(872)operator(,) integer(862)operator(,) integer(427)operator(,) integer(6)operator(,) + integer(105)operator(,) integer(653)operator(,) integer(107)operator(,) integer(78)operator(,) integer(863)operator(,) integer(81)operator(,) integer(866)operator(,) integer(7)operator(,) integer(865)operator(,) integer(785)operator(,) + integer(886)operator(,) integer(562)operator(,) integer(689)operator(,) integer(689)operator(,) operator(-)integer(1)operator(,) integer(891)operator(,) integer(62)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(724)operator(,) integer(256)operator(,) operator(-)integer(1)operator(,) integer(727)operator(,) integer(728)operator(,) operator(-)integer(1)operator(,) integer(261)operator(,) integer(704)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(707)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(719)operator(,) integer(720)operator(,) integer(721)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(300)operator(,) operator(-)integer(1)operator(,) integer(2)operator(,) + operator(-)integer(1)operator(,) integer(4)operator(,) integer(305)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(753)operator(,) integer(312)operator(,) + integer(313)operator(,) operator(-)integer(1)operator(,) integer(15)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(762)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(768)operator(,) integer(769)operator(,) operator(-)integer(1)operator(,) integer(771)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(206)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(808)operator(,) integer(809)operator(,) integer(10)operator(,) integer(11)operator(,) + integer(12)operator(,) integer(786)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(47)operator(,) integer(790)operator(,) operator(-)integer(1)operator(,) integer(222)operator(,) integer(223)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(27)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(239)operator(,) integer(240)operator(,) integer(370)operator(,) operator(-)integer(1)operator(,) integer(244)operator(,) + operator(-)integer(1)operator(,) integer(246)operator(,) integer(247)operator(,) integer(247)operator(,) integer(846)operator(,) integer(847)operator(,) integer(48)operator(,) operator(-)integer(1)operator(,) integer(823)operator(,) integer(382)operator(,) + integer(852)operator(,) integer(256)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(830)operator(,) integer(261)operator(,) integer(390)operator(,) operator(-)integer(1)operator(,) integer(392)operator(,) + operator(-)integer(1)operator(,) integer(836)operator(,) operator(-)integer(1)operator(,) integer(838)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(871)operator(,) + integer(845)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(107)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(885)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(888)operator(,) operator(-)integer(1)operator(,) integer(863)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(893)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(427)operator(,) integer(300)operator(,) integer(301)operator(,) integer(302)operator(,) integer(303)operator(,) integer(304)operator(,) + integer(305)operator(,) integer(306)operator(,) integer(307)operator(,) integer(105)operator(,) operator(-)integer(1)operator(,) integer(310)operator(,) operator(-)integer(1)operator(,) integer(312)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(315)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(645)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(343)operator(,) integer(343)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(351)operator(,) integer(352)operator(,) operator(-)integer(1)operator(,) integer(2)operator(,) + operator(-)integer(1)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(15)operator(,) integer(368)operator(,) integer(368)operator(,) integer(370)operator(,) integer(371)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(206)operator(,) integer(378)operator(,) integer(704)operator(,) operator(-)integer(1)operator(,) integer(382)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(386)operator(,) integer(386)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(390)operator(,) operator(-)integer(1)operator(,) integer(392)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(719)operator(,) integer(720)operator(,) integer(721)operator(,) operator(-)integer(1)operator(,) integer(47)operator(,) integer(400)operator(,) integer(400)operator(,) operator(-)integer(1)operator(,) integer(51)operator(,) integer(403)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(413)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(544)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(418)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(71)operator(,) operator(-)integer(1)operator(,) + integer(222)operator(,) integer(223)operator(,) integer(427)operator(,) integer(256)operator(,) integer(753)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(261)operator(,) operator(-)integer(1)operator(,) + integer(563)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(768)operator(,) + integer(769)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(450)operator(,) integer(450)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(107)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(790)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(300)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(305)operator(,) operator(-)integer(1)operator(,) integer(478)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(312)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(2)operator(,) operator(-)integer(1)operator(,) + integer(4)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(823)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(301)operator(,) + integer(302)operator(,) integer(303)operator(,) integer(304)operator(,) operator(-)integer(1)operator(,) integer(306)operator(,) integer(307)operator(,) operator(-)integer(1)operator(,) integer(836)operator(,) operator(-)integer(1)operator(,) integer(838)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(645)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(845)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(653)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(528)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(531)operator(,) integer(532)operator(,) integer(533)operator(,) + integer(534)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(47)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(370)operator(,) integer(543)operator(,) integer(544)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(550)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(382)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(206)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(390)operator(,) integer(563)operator(,) integer(392)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(566)operator(,) operator(-)integer(1)operator(,) integer(568)operator(,) operator(-)integer(1)operator(,) integer(570)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(371)operator(,) + operator(-)integer(1)operator(,) integer(704)operator(,) integer(576)operator(,) integer(577)operator(,) operator(-)integer(1)operator(,) integer(579)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(587)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(719)operator(,) integer(720)operator(,) integer(721)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(107)operator(,) integer(427)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(604)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(256)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(611)operator(,) integer(261)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(413)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(622)operator(,) integer(624)operator(,) + integer(753)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(630)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(768)operator(,) integer(769)operator(,) operator(-)integer(1)operator(,) integer(771)operator(,) operator(-)integer(1)operator(,) + integer(645)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(300)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(305)operator(,) integer(786)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(661)operator(,) integer(790)operator(,) operator(-)integer(1)operator(,) integer(312)operator(,) + integer(313)operator(,) integer(666)operator(,) integer(667)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(678)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(823)operator(,) operator(-)integer(1)operator(,) integer(206)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(830)operator(,) integer(702)operator(,) integer(704)operator(,) + operator(-)integer(1)operator(,) integer(705)operator(,) integer(707)operator(,) integer(836)operator(,) operator(-)integer(1)operator(,) integer(838)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(544)operator(,) integer(845)operator(,) operator(-)integer(1)operator(,) integer(719)operator(,) integer(720)operator(,) integer(721)operator(,) integer(370)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(724)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(727)operator(,) integer(728)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(382)operator(,) + integer(563)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(737)operator(,) integer(738)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(390)operator(,) operator(-)integer(1)operator(,) integer(392)operator(,) + operator(-)integer(1)operator(,) integer(543)operator(,) integer(256)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(261)operator(,) integer(753)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(762)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(768)operator(,) integer(769)operator(,) operator(-)integer(1)operator(,) integer(771)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(427)operator(,) integer(779)operator(,) integer(780)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(784)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(790)operator(,) integer(300)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(305)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(798)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(312)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(604)operator(,) operator(-)integer(1)operator(,) integer(808)operator(,) integer(809)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(645)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(823)operator(,) operator(-)integer(1)operator(,) + integer(653)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(830)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(630)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(836)operator(,) operator(-)integer(1)operator(,) integer(838)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(845)operator(,) operator(-)integer(1)operator(,) integer(846)operator(,) integer(847)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(852)operator(,) integer(231)operator(,) + integer(232)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(859)operator(,) integer(370)operator(,) operator(-)integer(1)operator(,) integer(863)operator(,) integer(863)operator(,) + operator(-)integer(1)operator(,) integer(865)operator(,) integer(866)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(871)operator(,) integer(382)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(704)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(390)operator(,) operator(-)integer(1)operator(,) integer(392)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(885)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(888)operator(,) operator(-)integer(1)operator(,) integer(719)operator(,) integer(720)operator(,) integer(721)operator(,) integer(893)operator(,) + operator(-)integer(1)operator(,) integer(544)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(50)operator(,) integer(51)operator(,) operator(-)integer(1)operator(,) integer(707)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(563)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(427)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) + integer(753)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(310)operator(,) integer(77)operator(,) + integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) integer(315)operator(,) operator(-)integer(1)operator(,) integer(768)operator(,) integer(769)operator(,) operator(-)integer(1)operator(,) integer(771)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(786)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(790)operator(,) integer(106)operator(,) integer(107)operator(,) + integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(118)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(127)operator(,) + integer(73)operator(,) integer(74)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(823)operator(,) operator(-)integer(1)operator(,) integer(645)operator(,) integer(646)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(830)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(653)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(836)operator(,) operator(-)integer(1)operator(,) integer(838)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(393)operator(,) integer(845)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) + integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(405)operator(,) integer(406)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(409)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(544)operator(,) integer(413)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(563)operator(,) + operator(-)integer(1)operator(,) integer(704)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(439)operator(,) integer(43)operator(,) operator(-)integer(1)operator(,) + integer(442)operator(,) operator(-)integer(1)operator(,) integer(444)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(719)operator(,) integer(720)operator(,) integer(721)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(64)operator(,) + integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) + integer(75)operator(,) integer(76)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) integer(479)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(753)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(768)operator(,) integer(769)operator(,) operator(-)integer(1)operator(,) integer(771)operator(,) integer(104)operator(,) + operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) + integer(115)operator(,) integer(645)operator(,) operator(-)integer(1)operator(,) integer(786)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(790)operator(,) operator(-)integer(1)operator(,) integer(0)operator(,) + operator(-)integer(1)operator(,) integer(126)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(8)operator(,) integer(9)operator(,) integer(10)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) operator(-)integer(1)operator(,) integer(17)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(27)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(823)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(36)operator(,) integer(37)operator(,) integer(830)operator(,) integer(39)operator(,) integer(40)operator(,) + integer(41)operator(,) integer(42)operator(,) integer(43)operator(,) integer(836)operator(,) operator(-)integer(1)operator(,) integer(838)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(704)operator(,) operator(-)integer(1)operator(,) integer(845)operator(,) operator(-)integer(1)operator(,) integer(576)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(719)operator(,) integer(720)operator(,) integer(721)operator(,) integer(590)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(81)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(608)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(612)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(616)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(753)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(624)operator(,) operator(-)integer(1)operator(,) integer(105)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(768)operator(,) integer(769)operator(,) operator(-)integer(1)operator(,) integer(771)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(121)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(124)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(128)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) + integer(131)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(657)operator(,) integer(790)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(685)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(823)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(830)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(836)operator(,) operator(-)integer(1)operator(,) integer(838)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(845)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(718)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(725)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(732)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(754)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) integer(26)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) integer(797)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) + integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(806)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(811)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) + integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(848)operator(,) operator(-)integer(1)operator(,) integer(850)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(120)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(128)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(870)operator(,) operator(-)integer(1)operator(,) + integer(872)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(0)operator(,) integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) + integer(6)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(886)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(891)operator(,) + integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) + integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) + integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) + integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(0)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(8)operator(,) integer(9)operator(,) integer(10)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(14)operator(,) + integer(15)operator(,) operator(-)integer(1)operator(,) integer(17)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) integer(131)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(43)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(26)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(36)operator(,) integer(37)operator(,) operator(-)integer(1)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(42)operator(,) integer(43)operator(,) integer(64)operator(,) + integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) + integer(75)operator(,) integer(76)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(64)operator(,) + integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) + integer(75)operator(,) integer(76)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) integer(81)operator(,) operator(-)integer(1)operator(,) integer(83)operator(,) integer(104)operator(,) + operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) + integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(103)operator(,) integer(104)operator(,) + operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) + integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(0)operator(,) integer(120)operator(,) integer(121)operator(,) integer(122)operator(,) operator(-)integer(1)operator(,) integer(124)operator(,) + integer(125)operator(,) integer(126)operator(,) integer(8)operator(,) integer(9)operator(,) integer(10)operator(,) integer(130)operator(,) integer(131)operator(,) operator(-)integer(1)operator(,) integer(14)operator(,) integer(15)operator(,) + operator(-)integer(1)operator(,) integer(17)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(36)operator(,) integer(37)operator(,) operator(-)integer(1)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(42)operator(,) integer(43)operator(,) integer(64)operator(,) integer(65)operator(,) + integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) integer(75)operator(,) + integer(76)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(64)operator(,) integer(65)operator(,) + integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) integer(75)operator(,) + integer(76)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) integer(81)operator(,) operator(-)integer(1)operator(,) integer(83)operator(,) integer(104)operator(,) integer(105)operator(,) + integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(103)operator(,) integer(104)operator(,) operator(-)integer(1)operator(,) + integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(121)operator(,) integer(122)operator(,) operator(-)integer(1)operator(,) integer(124)operator(,) integer(125)operator(,) + integer(126)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) integer(131)operator(,) integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) + integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(15)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) + integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) + integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(1)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(130)operator(,) integer(131)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) + operator(-)integer(1)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) + integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) + integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(130)operator(,) integer(131)operator(,) integer(10)operator(,) + integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) + integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) + integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) + integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) + operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) + integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(130)operator(,) + integer(131)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(15)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) + integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) + integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) + integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) + integer(6)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) integer(9)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) + integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(130)operator(,) integer(131)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) + integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) + integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) + integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(1)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) + integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) integer(131)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) + integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) + integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) integer(131)operator(,) integer(1)operator(,) + operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) + integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) + integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) + integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) + integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) + operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(125)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) integer(131)operator(,) + integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) + integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) + integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) + integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) + operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) + integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(121)operator(,) operator(-)integer(1)operator(,) integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(130)operator(,) + integer(131)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) + integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) + integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) + integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) + integer(6)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) + integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(130)operator(,) integer(131)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) + integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) + integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) + integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) + integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(131)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) + integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) integer(131)operator(,) integer(3)operator(,) + integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(13)operator(,) + integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) + integer(54)operator(,) integer(55)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) + integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) + integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) + operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(128)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) + integer(26)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) + integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) + integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) + integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) integer(120)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) integer(128)operator(,) integer(26)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) + integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) + integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) integer(120)operator(,) integer(18)operator(,) integer(19)operator(,) + integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(128)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) + integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) + integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) + integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) integer(83)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) + operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(103)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) + integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) + operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(128)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) + integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) integer(83)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) + operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) + integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(103)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) + integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) + integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(128)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) + integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) + integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) + integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(128)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) + integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) + integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) + operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) + integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(128)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) + operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) + integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) + integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) + integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) + integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) + integer(128)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) + integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(128)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) + integer(9)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) + integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) + integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) + integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) + integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(118)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(3)operator(,) + integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(13)operator(,) + integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) operator(-)integer(1)operator(,) + integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) + integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) + integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) + integer(9)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) + integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) + integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) + integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) + integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(118)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(3)operator(,) + integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(13)operator(,) + integer(14)operator(,) integer(15)operator(,) integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) integer(25)operator(,) integer(26)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) + integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) + integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) + integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) + operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) + integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) + operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) + integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) integer(116)operator(,) + integer(117)operator(,) integer(118)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) integer(125)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) + integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) + integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) + integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) + operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) + integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) + integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) + integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) + integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) + integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) + integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) + integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) + integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) + integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) + integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) + operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) + integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) + operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) + integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) + operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) + integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) + integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) + integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) + integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) + integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) + integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) + integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) + integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) + operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) + integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) + operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) + integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) + integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) + integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) + integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) + integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) + integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) + integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) + integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) + integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) + integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) + integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) + integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) + integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) + operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) + integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) + integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) + integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) + integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) + integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) integer(92)operator(,) + integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) + integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) + integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(38)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) + integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) + integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) + integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) + operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) + integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) + operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) + integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) + integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) + integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) + integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) + integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) + integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) + integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) + integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) + operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) + integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) + integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) + operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) + integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) + integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) + integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) + integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) + integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) + integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) + integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) + integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) + integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) + operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) + integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) + integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) + integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) + integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) + operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) + integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) + integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) + integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) + integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) integer(62)operator(,) + integer(63)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) integer(116)operator(,) integer(117)operator(,) integer(118)operator(,) integer(16)operator(,) operator(-)integer(1)operator(,) integer(18)operator(,) integer(19)operator(,) + integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) + integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) + integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) + integer(60)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) + operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) integer(108)operator(,) operator(-)integer(1)operator(,) + integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) integer(116)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) + integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) + integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) + integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) + integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) integer(116)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) + integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) + integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) + integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) + operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) integer(116)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) + integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) + integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) + integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) + integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) + integer(4)operator(,) integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(16)operator(,) integer(116)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) + integer(24)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) + integer(34)operator(,) integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) + integer(54)operator(,) integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) + integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) + integer(5)operator(,) operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(16)operator(,) integer(116)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) + integer(35)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(45)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) + integer(55)operator(,) integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(85)operator(,) integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) + integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) + operator(-)integer(1)operator(,) integer(7)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(11)operator(,) integer(12)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(16)operator(,) integer(116)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(45)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) operator(-)integer(1)operator(,) integer(59)operator(,) integer(60)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(82)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(85)operator(,) + integer(86)operator(,) operator(-)integer(1)operator(,) integer(88)operator(,) integer(89)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) + integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(50)operator(,) + integer(51)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(116)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) + integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(50)operator(,) integer(51)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) + integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) + integer(115)operator(,) integer(50)operator(,) integer(51)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) + integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) + integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) + integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(50)operator(,) integer(51)operator(,) integer(118)operator(,) + operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(62)operator(,) + integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) + integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(50)operator(,) integer(51)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) + integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) + integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(50)operator(,) + integer(51)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(127)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) + integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(50)operator(,) integer(51)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) + integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) + integer(115)operator(,) integer(50)operator(,) integer(51)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) + integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) + integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) + integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(50)operator(,) integer(51)operator(,) integer(118)operator(,) + operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(62)operator(,) + integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) + integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(50)operator(,) integer(51)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) + integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) + integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(50)operator(,) + integer(51)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) integer(54)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(127)operator(,) integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) operator(-)integer(1)operator(,) integer(69)operator(,) integer(70)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(77)operator(,) integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(91)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) + integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(118)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(127)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) + integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) integer(75)operator(,) integer(76)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(104)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) + integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(64)operator(,) + integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) + integer(75)operator(,) integer(76)operator(,) operator(-)integer(1)operator(,) integer(130)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(84)operator(,) + integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) + integer(74)operator(,) integer(75)operator(,) integer(76)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(104)operator(,) + operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) + integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + integer(104)operator(,) integer(126)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) + integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(126)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) + integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) integer(75)operator(,) integer(76)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) + integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) + integer(74)operator(,) integer(75)operator(,) integer(76)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(104)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) + integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) + integer(114)operator(,) integer(115)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(73)operator(,) integer(74)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) integer(64)operator(,) + integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(73)operator(,) integer(74)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(79)operator(,) integer(80)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) + integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(,) + operator(-)integer(1)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) + integer(115) +operator(};) + +comment(/* YYSTOS[STATE-NUM] -- The (internal number of the\) accessing + symbol of state STATE-NUM. */) +directive(static) directive(const) ident(yytype_uint16) ident(yystos)operator([]) operator(=) +operator({) + integer(0)operator(,) integer(133)operator(,) integer(134)operator(,) integer(0)operator(,) integer(1)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) integer(6)operator(,) integer(7)operator(,) + integer(11)operator(,) integer(12)operator(,) integer(16)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) + integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(38)operator(,) integer(44)operator(,) integer(45)operator(,) + integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) + integer(56)operator(,) integer(57)operator(,) integer(59)operator(,) integer(60)operator(,) integer(62)operator(,) integer(63)operator(,) integer(82)operator(,) integer(85)operator(,) integer(86)operator(,) integer(88)operator(,) + integer(89)operator(,) integer(91)operator(,) integer(93)operator(,) integer(94)operator(,) integer(95)operator(,) integer(96)operator(,) integer(97)operator(,) integer(98)operator(,) integer(116)operator(,) integer(117)operator(,) + integer(118)operator(,) integer(136)operator(,) integer(137)operator(,) integer(138)operator(,) integer(141)operator(,) integer(143)operator(,) integer(144)operator(,) integer(148)operator(,) integer(149)operator(,) integer(151)operator(,) + integer(152)operator(,) integer(153)operator(,) integer(154)operator(,) integer(155)operator(,) integer(165)operator(,) integer(182)operator(,) integer(199)operator(,) integer(209)operator(,) integer(210)operator(,) integer(223)operator(,) + integer(224)operator(,) integer(225)operator(,) integer(226)operator(,) integer(227)operator(,) integer(228)operator(,) integer(229)operator(,) integer(232)operator(,) integer(240)operator(,) integer(242)operator(,) integer(243)operator(,) + integer(244)operator(,) integer(245)operator(,) integer(246)operator(,) integer(247)operator(,) integer(266)operator(,) integer(275)operator(,) integer(138)operator(,) integer(21)operator(,) integer(22)operator(,) integer(29)operator(,) + integer(30)operator(,) integer(31)operator(,) integer(45)operator(,) integer(50)operator(,) integer(54)operator(,) integer(79)operator(,) integer(82)operator(,) integer(85)operator(,) integer(116)operator(,) integer(156)operator(,) + integer(157)operator(,) integer(182)operator(,) integer(199)operator(,) integer(244)operator(,) integer(247)operator(,) integer(266)operator(,) integer(157)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(,) + integer(6)operator(,) integer(7)operator(,) integer(8)operator(,) integer(9)operator(,) integer(10)operator(,) integer(11)operator(,) integer(12)operator(,) integer(13)operator(,) integer(14)operator(,) integer(15)operator(,) + integer(16)operator(,) integer(17)operator(,) integer(18)operator(,) integer(19)operator(,) integer(20)operator(,) integer(21)operator(,) integer(22)operator(,) integer(23)operator(,) integer(24)operator(,) integer(25)operator(,) + integer(26)operator(,) integer(29)operator(,) integer(30)operator(,) integer(31)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(36)operator(,) integer(37)operator(,) + integer(38)operator(,) integer(44)operator(,) integer(45)operator(,) integer(46)operator(,) integer(47)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(51)operator(,) integer(54)operator(,) + integer(62)operator(,) integer(63)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) integer(69)operator(,) integer(70)operator(,) integer(73)operator(,) integer(77)operator(,) + integer(78)operator(,) integer(79)operator(,) integer(80)operator(,) integer(91)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) + integer(112)operator(,) integer(113)operator(,) integer(114)operator(,) integer(115)operator(,) integer(118)operator(,) integer(127)operator(,) integer(128)operator(,) integer(158)operator(,) integer(163)operator(,) integer(164)operator(,) + integer(245)operator(,) integer(261)operator(,) integer(32)operator(,) integer(33)operator(,) integer(34)operator(,) integer(35)operator(,) integer(48)operator(,) integer(49)operator(,) integer(50)operator(,) integer(54)operator(,) + integer(158)operator(,) integer(159)operator(,) integer(160)operator(,) integer(161)operator(,) integer(240)operator(,) integer(242)operator(,) integer(183)operator(,) integer(82)operator(,) integer(141)operator(,) integer(142)operator(,) + integer(155)operator(,) integer(199)operator(,) integer(244)operator(,) integer(246)operator(,) integer(247)operator(,) integer(142)operator(,) integer(130)operator(,) integer(131)operator(,) integer(142)operator(,) integer(270)operator(,) + integer(273)operator(,) integer(274)operator(,) integer(186)operator(,) integer(188)operator(,) integer(82)operator(,) integer(149)operator(,) integer(155)operator(,) integer(199)operator(,) integer(204)operator(,) integer(244)operator(,) + integer(247)operator(,) integer(91)operator(,) integer(92)operator(,) integer(117)operator(,) integer(148)operator(,) integer(165)operator(,) integer(167)operator(,) integer(171)operator(,) integer(178)operator(,) integer(180)operator(,) + integer(264)operator(,) integer(265)operator(,) integer(171)operator(,) integer(171)operator(,) integer(128)operator(,) integer(173)operator(,) integer(174)operator(,) integer(128)operator(,) integer(169)operator(,) integer(173)operator(,) + integer(141)operator(,) integer(52)operator(,) integer(160)operator(,) integer(130)operator(,) integer(271)operator(,) integer(140)operator(,) integer(120)operator(,) integer(165)operator(,) integer(199)operator(,) integer(165)operator(,) + integer(54)operator(,) integer(85)operator(,) integer(136)operator(,) integer(150)operator(,) integer(151)operator(,) integer(141)operator(,) integer(91)operator(,) integer(148)operator(,) integer(168)operator(,) integer(180)operator(,) + integer(264)operator(,) integer(275)operator(,) integer(180)operator(,) integer(263)operator(,) integer(264)operator(,) integer(275)operator(,) integer(82)operator(,) integer(154)operator(,) integer(199)operator(,) integer(244)operator(,) + integer(247)operator(,) integer(52)operator(,) integer(53)operator(,) integer(55)operator(,) integer(158)operator(,) integer(235)operator(,) integer(241)operator(,) integer(234)operator(,) integer(235)operator(,) integer(235)operator(,) + integer(129)operator(,) integer(230)operator(,) integer(129)operator(,) integer(233)operator(,) integer(56)operator(,) integer(57)operator(,) integer(143)operator(,) integer(165)operator(,) integer(165)operator(,) integer(270)operator(,) + integer(274)operator(,) integer(39)operator(,) integer(40)operator(,) integer(41)operator(,) integer(42)operator(,) integer(43)operator(,) integer(36)operator(,) integer(37)operator(,) integer(28)operator(,) integer(206)operator(,) + integer(103)operator(,) integer(126)operator(,) integer(85)operator(,) integer(91)operator(,) integer(152)operator(,) integer(103)operator(,) integer(64)operator(,) integer(65)operator(,) integer(66)operator(,) integer(67)operator(,) + integer(68)operator(,) integer(69)operator(,) integer(70)operator(,) integer(71)operator(,) integer(72)operator(,) integer(73)operator(,) integer(74)operator(,) integer(75)operator(,) integer(76)operator(,) integer(79)operator(,) + integer(80)operator(,) integer(104)operator(,) integer(106)operator(,) integer(107)operator(,) integer(108)operator(,) integer(109)operator(,) integer(110)operator(,) integer(111)operator(,) integer(112)operator(,) integer(113)operator(,) + integer(114)operator(,) integer(115)operator(,) integer(81)operator(,) integer(122)operator(,) integer(124)operator(,) integer(81)operator(,) integer(124)operator(,) integer(26)operator(,) integer(120)operator(,) integer(211)operator(,) + integer(226)operator(,) integer(83)operator(,) integer(83)operator(,) integer(169)operator(,) integer(173)operator(,) integer(211)operator(,) integer(271)operator(,) integer(141)operator(,) integer(50)operator(,) integer(54)operator(,) + integer(156)operator(,) integer(56)operator(,) integer(57)operator(,) integer(1)operator(,) integer(107)operator(,) integer(248)operator(,) integer(273)operator(,) integer(81)operator(,) integer(122)operator(,) integer(124)operator(,) + integer(195)operator(,) integer(262)operator(,) integer(196)operator(,) integer(81)operator(,) integer(124)operator(,) integer(269)operator(,) integer(126)operator(,) integer(135)operator(,) integer(136)operator(,) integer(54)operator(,) + integer(13)operator(,) integer(105)operator(,) integer(200)operator(,) integer(273)operator(,) integer(103)operator(,) integer(81)operator(,) integer(122)operator(,) integer(124)operator(,) integer(83)operator(,) integer(83)operator(,) + integer(200)operator(,) integer(270)operator(,) integer(15)operator(,) integer(17)operator(,) integer(216)operator(,) integer(131)operator(,) integer(142)operator(,) integer(142)operator(,) integer(54)operator(,) integer(81)operator(,) + integer(122)operator(,) integer(124)operator(,) integer(25)operator(,) integer(167)operator(,) integer(167)operator(,) integer(84)operator(,) integer(126)operator(,) integer(179)operator(,) integer(275)operator(,) integer(126)operator(,) + integer(179)operator(,) integer(125)operator(,) integer(171)operator(,) integer(86)operator(,) integer(171)operator(,) integer(175)operator(,) integer(148)operator(,) integer(171)operator(,) integer(180)operator(,) integer(209)operator(,) + integer(275)operator(,) integer(52)operator(,) integer(59)operator(,) integer(60)operator(,) integer(139)operator(,) integer(128)operator(,) integer(166)operator(,) integer(120)operator(,) integer(136)operator(,) integer(81)operator(,) + integer(124)operator(,) integer(83)operator(,) integer(150)operator(,) integer(125)operator(,) integer(125)operator(,) integer(184)operator(,) integer(165)operator(,) integer(271)operator(,) integer(123)operator(,) integer(126)operator(,) + integer(130)operator(,) integer(272)operator(,) integer(126)operator(,) integer(272)operator(,) integer(126)operator(,) integer(272)operator(,) integer(121)operator(,) integer(272)operator(,) integer(54)operator(,) integer(81)operator(,) + integer(122)operator(,) integer(124)operator(,) integer(58)operator(,) integer(99)operator(,) integer(100)operator(,) integer(101)operator(,) integer(236)operator(,) integer(101)operator(,) integer(236)operator(,) integer(101)operator(,) + integer(61)operator(,) integer(101)operator(,) integer(101)operator(,) integer(231)operator(,) integer(236)operator(,) integer(101)operator(,) integer(58)operator(,) integer(101)operator(,) integer(64)operator(,) integer(64)operator(,) + integer(138)operator(,) integer(142)operator(,) integer(142)operator(,) integer(142)operator(,) integer(142)operator(,) integer(138)operator(,) integer(141)operator(,) integer(141)operator(,) integer(207)operator(,) integer(91)operator(,) + integer(143)operator(,) integer(167)operator(,) integer(180)operator(,) integer(181)operator(,) integer(150)operator(,) integer(154)operator(,) integer(126)operator(,) integer(143)operator(,) integer(165)operator(,) integer(167)operator(,) + integer(181)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) + integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) + integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(165)operator(,) integer(50)operator(,) integer(51)operator(,) integer(54)operator(,) + integer(163)operator(,) integer(267)operator(,) integer(268)operator(,) integer(168)operator(,) integer(50)operator(,) integer(51)operator(,) integer(54)operator(,) integer(163)operator(,) integer(267)operator(,) integer(50)operator(,) + integer(54)operator(,) integer(267)operator(,) integer(267)operator(,) integer(214)operator(,) integer(212)operator(,) integer(143)operator(,) integer(165)operator(,) integer(143)operator(,) integer(165)operator(,) integer(90)operator(,) + integer(145)operator(,) integer(193)operator(,) integer(273)operator(,) integer(249)operator(,) integer(192)operator(,) integer(50)operator(,) integer(54)operator(,) integer(156)operator(,) integer(267)operator(,) integer(168)operator(,) + integer(267)operator(,) integer(135)operator(,) integer(141)operator(,) integer(50)operator(,) integer(52)operator(,) integer(53)operator(,) integer(54)operator(,) integer(55)operator(,) integer(91)operator(,) integer(92)operator(,) + integer(110)operator(,) integer(113)operator(,) integer(128)operator(,) integer(250)operator(,) integer(251)operator(,) integer(252)operator(,) integer(253)operator(,) integer(254)operator(,) integer(255)operator(,) integer(256)operator(,) + integer(257)operator(,) integer(258)operator(,) integer(259)operator(,) integer(197)operator(,) integer(162)operator(,) integer(10)operator(,) integer(8)operator(,) integer(219)operator(,) integer(275)operator(,) integer(136)operator(,) + integer(13)operator(,) integer(165)operator(,) integer(50)operator(,) integer(54)operator(,) integer(168)operator(,) integer(50)operator(,) integer(54)operator(,) integer(136)operator(,) integer(216)operator(,) integer(136)operator(,) + integer(91)operator(,) integer(180)operator(,) integer(217)operator(,) integer(10)operator(,) integer(27)operator(,) integer(105)operator(,) integer(201)operator(,) integer(273)operator(,) integer(201)operator(,) integer(50)operator(,) + integer(54)operator(,) integer(168)operator(,) integer(50)operator(,) integer(54)operator(,) integer(190)operator(,) integer(126)operator(,) integer(179)operator(,) integer(167)operator(,) integer(91)operator(,) integer(167)operator(,) + integer(178)operator(,) integer(264)operator(,) integer(91)operator(,) integer(167)operator(,) integer(265)operator(,) integer(125)operator(,) integer(91)operator(,) integer(165)operator(,) integer(167)operator(,) integer(172)operator(,) + integer(176)operator(,) integer(178)operator(,) integer(264)operator(,) integer(271)operator(,) integer(126)operator(,) integer(81)operator(,) integer(124)operator(,) integer(271)operator(,) integer(125)operator(,) integer(160)operator(,) + integer(185)operator(,) integer(165)operator(,) integer(136)operator(,) integer(121)operator(,) integer(165)operator(,) integer(125)operator(,) integer(271)operator(,) integer(271)operator(,) integer(91)operator(,) integer(167)operator(,) + integer(50)operator(,) integer(54)operator(,) integer(168)operator(,) integer(50)operator(,) integer(54)operator(,) integer(238)operator(,) integer(237)operator(,) integer(129)operator(,) integer(236)operator(,) integer(129)operator(,) + integer(165)operator(,) integer(165)operator(,) integer(72)operator(,) integer(108)operator(,) integer(205)operator(,) integer(275)operator(,) integer(167)operator(,) integer(126)operator(,) integer(125)operator(,) integer(43)operator(,) + integer(105)operator(,) integer(83)operator(,) integer(83)operator(,) integer(169)operator(,) integer(173)operator(,) integer(123)operator(,) integer(83)operator(,) integer(83)operator(,) integer(169)operator(,) integer(170)operator(,) + integer(173)operator(,) integer(275)operator(,) integer(170)operator(,) integer(173)operator(,) integer(170)operator(,) integer(173)operator(,) integer(205)operator(,) integer(205)operator(,) integer(146)operator(,) integer(273)operator(,) + integer(142)operator(,) integer(135)operator(,) integer(123)operator(,) integer(10)operator(,) integer(271)operator(,) integer(103)operator(,) integer(251)operator(,) integer(135)operator(,) integer(273)operator(,) integer(126)operator(,) + integer(260)operator(,) integer(275)operator(,) integer(126)operator(,) integer(260)operator(,) integer(50)operator(,) integer(126)operator(,) integer(260)operator(,) integer(50)operator(,) integer(158)operator(,) integer(160)operator(,) + integer(167)operator(,) integer(181)operator(,) integer(220)operator(,) integer(275)operator(,) integer(15)operator(,) integer(203)operator(,) integer(275)operator(,) integer(14)operator(,) integer(202)operator(,) integer(203)operator(,) + integer(83)operator(,) integer(123)operator(,) integer(83)operator(,) integer(83)operator(,) integer(203)operator(,) integer(10)operator(,) integer(10)operator(,) integer(167)operator(,) integer(126)operator(,) integer(200)operator(,) + integer(187)operator(,) integer(189)operator(,) integer(123)operator(,) integer(142)operator(,) integer(167)operator(,) integer(126)operator(,) integer(179)operator(,) integer(167)operator(,) integer(167)operator(,) integer(126)operator(,) + integer(177)operator(,) integer(125)operator(,) integer(126)operator(,) integer(179)operator(,) integer(125)operator(,) integer(148)operator(,) integer(209)operator(,) integer(267)operator(,) integer(267)operator(,) integer(125)operator(,) + integer(141)operator(,) integer(121)operator(,) integer(125)operator(,) integer(165)operator(,) integer(123)operator(,) integer(136)operator(,) integer(52)operator(,) integer(53)operator(,) integer(55)operator(,) integer(239)operator(,) + integer(247)operator(,) integer(108)operator(,) integer(204)operator(,) integer(208)operator(,) integer(91)operator(,) integer(167)operator(,) integer(165)operator(,) integer(165)operator(,) integer(143)operator(,) integer(165)operator(,) + integer(165)operator(,) integer(145)operator(,) integer(83)operator(,) integer(143)operator(,) integer(165)operator(,) integer(143)operator(,) integer(165)operator(,) integer(145)operator(,) integer(215)operator(,) integer(213)operator(,) + integer(205)operator(,) integer(194)operator(,) integer(273)operator(,) integer(10)operator(,) integer(125)operator(,) integer(167)operator(,) integer(271)operator(,) integer(10)operator(,) integer(252)operator(,) integer(255)operator(,) + integer(257)operator(,) integer(259)operator(,) integer(50)operator(,) integer(254)operator(,) integer(257)operator(,) integer(198)operator(,) integer(84)operator(,) integer(221)operator(,) integer(275)operator(,) integer(136)operator(,) + integer(9)operator(,) integer(222)operator(,) integer(275)operator(,) integer(142)operator(,) integer(10)operator(,) integer(83)operator(,) integer(10)operator(,) integer(91)operator(,) integer(136)operator(,) integer(136)operator(,) + integer(136)operator(,) integer(201)operator(,) integer(179)operator(,) integer(91)operator(,) integer(179)operator(,) integer(179)operator(,) integer(91)operator(,) integer(178)operator(,) integer(180)operator(,) integer(264)operator(,) + integer(125)operator(,) integer(91)operator(,) integer(271)operator(,) integer(125)operator(,) integer(271)operator(,) integer(121)operator(,) integer(108)operator(,) integer(136)operator(,) integer(167)operator(,) integer(143)operator(,) + integer(165)operator(,) integer(136)operator(,) integer(136)operator(,) integer(147)operator(,) integer(135)operator(,) integer(125)operator(,) integer(126)operator(,) integer(260)operator(,) integer(260)operator(,) integer(260)operator(,) + integer(250)operator(,) integer(82)operator(,) integer(155)operator(,) integer(199)operator(,) integer(244)operator(,) integer(247)operator(,) integer(200)operator(,) integer(136)operator(,) integer(200)operator(,) integer(167)operator(,) + integer(203)operator(,) integer(216)operator(,) integer(218)operator(,) integer(10)operator(,) integer(10)operator(,) integer(191)operator(,) integer(165)operator(,) integer(167)operator(,) integer(126)operator(,) integer(179)operator(,) + integer(126)operator(,) integer(179)operator(,) integer(167)operator(,) integer(125)operator(,) integer(10)operator(,) integer(10)operator(,) integer(121)operator(,) integer(136)operator(,) integer(10)operator(,) integer(257)operator(,) + integer(135)operator(,) integer(54)operator(,) integer(81)operator(,) integer(122)operator(,) integer(124)operator(,) integer(136)operator(,) integer(136)operator(,) integer(136)operator(,) integer(179)operator(,) integer(179)operator(,) + integer(91)operator(,) integer(264)operator(,) integer(91)operator(,) integer(179)operator(,) integer(121)operator(,) integer(260)operator(,) integer(10)operator(,) integer(50)operator(,) integer(54)operator(,) integer(168)operator(,) + integer(50)operator(,) integer(54)operator(,) integer(219)operator(,) integer(202)operator(,) integer(10)operator(,) integer(167)operator(,) integer(126)operator(,) integer(179)operator(,) integer(167)operator(,) integer(123)operator(,) + integer(179)operator(,) integer(91)operator(,) integer(179)operator(,) integer(167)operator(,) integer(179) +operator(};) + +preprocessor(#define) ident(yyerrok) operator(()ident(yyerrstatus) operator(=) integer(0)operator(\)) +preprocessor(#define) ident(yyclearin) operator(()ident(yychar) operator(=) ident(YYEMPTY)operator(\)) +preprocessor(#define) ident(YYEMPTY) operator((-)integer(2)operator(\)) +preprocessor(#define) ident(YYEOF) integer(0) + +preprocessor(#define) ident(YYACCEPT) reserved(goto) ident(yyacceptlab) +preprocessor(#define) ident(YYABORT) reserved(goto) ident(yyabortlab) +preprocessor(#define) ident(YYERROR) reserved(goto) ident(yyerrorlab) + + +comment(/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */) + +preprocessor(#define) ident(YYFAIL) reserved(goto) ident(yyerrlab) + +preprocessor(#define) ident(YYRECOVERING)operator((\)) operator((!!)ident(yyerrstatus)operator(\)) + +preprocessor(#define) ident(YYBACKUP)operator(()ident(Token)operator(,) ident(Value)operator(\)) \ +reserved(do) \ + reserved(if) operator(()ident(yychar) operator(==) ident(YYEMPTY) operator(&&) ident(yylen) operator(==) integer(1)operator(\)) \ + operator({) \ + ident(yychar) operator(=) operator(()ident(Token)operator(\);) \ + ident(yylval) operator(=) operator(()ident(Value)operator(\);) \ + ident(yytoken) operator(=) ident(YYTRANSLATE) operator(()ident(yychar)operator(\);) \ + ident(YYPOPSTACK) operator(()integer(1)operator(\);) \ + reserved(goto) ident(yybackup)operator(;) \ + operator(}) \ + reserved(else) \ + operator({) \ + ident(yyerror) operator(()ident(YY_)operator(()string<delimiter(")content(syntax error: cannot back up)delimiter(")>operator(\)\);) \ + ident(YYERROR)operator(;) \ + operator(}) \ +reserved(while) operator(()ident(YYID) operator(()integer(0)operator(\)\)) + + +preprocessor(#define) ident(YYTERROR) integer(1) +preprocessor(#define) ident(YYERRCODE) integer(256) + + +comment(/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined\). */) + +preprocessor(#define) ident(YYRHSLOC)operator(()ident(Rhs)operator(,) ident(K)operator(\)) operator((()ident(Rhs)operator(\)[)ident(K)operator(]\)) +preprocessor(#ifndef) ident(YYLLOC_DEFAULT) +preprocessor(# define) ident(YYLLOC_DEFAULT)operator(()ident(Current)operator(,) ident(Rhs)operator(,) ident(N)operator(\)) \ + reserved(do) \ + reserved(if) operator(()ident(YYID) operator(()ident(N)operator(\)\)) \ + operator({) \ + operator(()ident(Current)operator(\))operator(.)ident(first_line) operator(=) ident(YYRHSLOC) operator(()ident(Rhs)operator(,) integer(1)operator(\))operator(.)ident(first_line)operator(;) \ + operator(()ident(Current)operator(\))operator(.)ident(first_column) operator(=) ident(YYRHSLOC) operator(()ident(Rhs)operator(,) integer(1)operator(\))operator(.)ident(first_column)operator(;) \ + operator(()ident(Current)operator(\))operator(.)ident(last_line) operator(=) ident(YYRHSLOC) operator(()ident(Rhs)operator(,) ident(N)operator(\))operator(.)ident(last_line)operator(;) \ + operator(()ident(Current)operator(\))operator(.)ident(last_column) operator(=) ident(YYRHSLOC) operator(()ident(Rhs)operator(,) ident(N)operator(\))operator(.)ident(last_column)operator(;) \ + operator(}) \ + reserved(else) \ + operator({) \ + operator(()ident(Current)operator(\))operator(.)ident(first_line) operator(=) operator(()ident(Current)operator(\))operator(.)ident(last_line) operator(=) \ + ident(YYRHSLOC) operator(()ident(Rhs)operator(,) integer(0)operator(\))operator(.)ident(last_line)operator(;) \ + operator(()ident(Current)operator(\))operator(.)ident(first_column) operator(=) operator(()ident(Current)operator(\))operator(.)ident(last_column) operator(=) \ + ident(YYRHSLOC) operator(()ident(Rhs)operator(,) integer(0)operator(\))operator(.)ident(last_column)operator(;) \ + operator(}) \ + reserved(while) operator(()ident(YYID) operator(()integer(0)operator(\)\)) +preprocessor(#endif) + + +comment(/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */) + +preprocessor(#ifndef) ident(YY_LOCATION_PRINT) +preprocessor(# if) ident(YYLTYPE_IS_TRIVIAL) +preprocessor(# define) ident(YY_LOCATION_PRINT)operator(()ident(File)operator(,) ident(Loc)operator(\)) \ + ident(fprintf) operator(()ident(File)operator(,) string<delimiter(")content(%d.%d-%d.%d)delimiter(")>operator(,) \ + operator(()ident(Loc)operator(\))operator(.)ident(first_line)operator(,) operator(()ident(Loc)operator(\))operator(.)ident(first_column)operator(,) \ + operator(()ident(Loc)operator(\))operator(.)ident(last_line)operator(,) operator(()ident(Loc)operator(\))operator(.)ident(last_column)operator(\)) +preprocessor(# else) +preprocessor(# define) ident(YY_LOCATION_PRINT)operator(()ident(File)operator(,) ident(Loc)operator(\)) operator((()directive(void)operator(\)) integer(0)operator(\)) +preprocessor(# endif) +preprocessor(#endif) + + +comment(/* YYLEX -- calling `yylex' with the right arguments. */) + +preprocessor(#ifdef) ident(YYLEX_PARAM) +preprocessor(# define) ident(YYLEX) ident(yylex) operator(()ident(YYLEX_PARAM)operator(\)) +preprocessor(#else) +preprocessor(# define) ident(YYLEX) ident(yylex) operator((\)) +preprocessor(#endif) + +comment(/* Enable debugging if requested. */) +preprocessor(#if) ident(YYDEBUG) + +preprocessor(# ifndef) ident(YYFPRINTF) +preprocessor(# include) include(<stdio.h>) comment(/* INFRINGES ON USER NAME SPACE */) +preprocessor(# define) ident(YYFPRINTF) ident(fprintf) +preprocessor(# endif) + +preprocessor(# define) ident(YYDPRINTF)operator(()ident(Args)operator(\)) \ +reserved(do) operator({) \ + reserved(if) operator(()ident(yydebug)operator(\)) \ + ident(YYFPRINTF) ident(Args)operator(;) \ +operator(}) reserved(while) operator(()ident(YYID) operator(()integer(0)operator(\)\)) + +preprocessor(# define) ident(YY_SYMBOL_PRINT)operator(()ident(Title)operator(,) ident(Type)operator(,) ident(Value)operator(,) ident(Location)operator(\)) \ +reserved(do) operator({) \ + reserved(if) operator(()ident(yydebug)operator(\)) \ + operator({) \ + ident(YYFPRINTF) operator(()ident(stderr)operator(,) string<delimiter(")content(%s )delimiter(")>operator(,) ident(Title)operator(\);) \ + ident(yy_symbol_print) operator(()ident(stderr)operator(,) \ + ident(Type)operator(,) ident(Value)operator(\);) \ + ident(YYFPRINTF) operator(()ident(stderr)operator(,) string<delimiter(")char(\\n)delimiter(")>operator(\);) \ + operator(}) \ +operator(}) reserved(while) operator(()ident(YYID) operator(()integer(0)operator(\)\)) + + +comment(/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/) + +comment(/*ARGSUSED*/) +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(static) directive(void) +ident(yy_symbol_value_print) operator(()ident(FILE) operator(*)ident(yyoutput)operator(,) pre_type(int) ident(yytype)operator(,) ident(YYSTYPE) directive(const) operator(*) directive(const) ident(yyvaluep)operator(\)) +preprocessor(#else) +directive(static) directive(void) +ident(yy_symbol_value_print) operator(()ident(yyoutput)operator(,) ident(yytype)operator(,) ident(yyvaluep)operator(\)) + ident(FILE) operator(*)ident(yyoutput)operator(;) + pre_type(int) ident(yytype)operator(;) + ident(YYSTYPE) directive(const) operator(*) directive(const) ident(yyvaluep)operator(;) +preprocessor(#endif) +operator({) + reserved(if) operator((!)ident(yyvaluep)operator(\)) + reserved(return)operator(;) +preprocessor(# ifdef) ident(YYPRINT) + reserved(if) operator(()ident(yytype) operator(<) ident(YYNTOKENS)operator(\)) + ident(YYPRINT) operator(()ident(yyoutput)operator(,) ident(yytoknum)operator([)ident(yytype)operator(],) operator(*)ident(yyvaluep)operator(\);) +preprocessor(# else) + ident(YYUSE) operator(()ident(yyoutput)operator(\);) +preprocessor(# endif) + reserved(switch) operator(()ident(yytype)operator(\)) + operator({) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) +operator(}) + + +comment(/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/) + +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(static) directive(void) +ident(yy_symbol_print) operator(()ident(FILE) operator(*)ident(yyoutput)operator(,) pre_type(int) ident(yytype)operator(,) ident(YYSTYPE) directive(const) operator(*) directive(const) ident(yyvaluep)operator(\)) +preprocessor(#else) +directive(static) directive(void) +ident(yy_symbol_print) operator(()ident(yyoutput)operator(,) ident(yytype)operator(,) ident(yyvaluep)operator(\)) + ident(FILE) operator(*)ident(yyoutput)operator(;) + pre_type(int) ident(yytype)operator(;) + ident(YYSTYPE) directive(const) operator(*) directive(const) ident(yyvaluep)operator(;) +preprocessor(#endif) +operator({) + reserved(if) operator(()ident(yytype) operator(<) ident(YYNTOKENS)operator(\)) + ident(YYFPRINTF) operator(()ident(yyoutput)operator(,) string<delimiter(")content(token %s ()delimiter(")>operator(,) ident(yytname)operator([)ident(yytype)operator(]\);) + reserved(else) + ident(YYFPRINTF) operator(()ident(yyoutput)operator(,) string<delimiter(")content(nterm %s ()delimiter(")>operator(,) ident(yytname)operator([)ident(yytype)operator(]\);) + + ident(yy_symbol_value_print) operator(()ident(yyoutput)operator(,) ident(yytype)operator(,) ident(yyvaluep)operator(\);) + ident(YYFPRINTF) operator(()ident(yyoutput)operator(,) string<delimiter(")content(\))delimiter(")>operator(\);) +operator(}) + +comment(/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included\). | +`------------------------------------------------------------------*/) + +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(static) directive(void) +ident(yy_stack_print) operator(()ident(yytype_int16) operator(*)ident(bottom)operator(,) ident(yytype_int16) operator(*)ident(top)operator(\)) +preprocessor(#else) +directive(static) directive(void) +ident(yy_stack_print) operator(()ident(bottom)operator(,) ident(top)operator(\)) + ident(yytype_int16) operator(*)ident(bottom)operator(;) + ident(yytype_int16) operator(*)ident(top)operator(;) +preprocessor(#endif) +operator({) + ident(YYFPRINTF) operator(()ident(stderr)operator(,) string<delimiter(")content(Stack now)delimiter(")>operator(\);) + reserved(for) operator((;) ident(bottom) operator(<=) ident(top)operator(;) operator(++)ident(bottom)operator(\)) + ident(YYFPRINTF) operator(()ident(stderr)operator(,) string<delimiter(")content( %d)delimiter(")>operator(,) operator(*)ident(bottom)operator(\);) + ident(YYFPRINTF) operator(()ident(stderr)operator(,) string<delimiter(")char(\\n)delimiter(")>operator(\);) +operator(}) + +preprocessor(# define) ident(YY_STACK_PRINT)operator(()ident(Bottom)operator(,) ident(Top)operator(\)) \ +reserved(do) operator({) \ + reserved(if) operator(()ident(yydebug)operator(\)) \ + ident(yy_stack_print) operator((()ident(Bottom)operator(\),) operator(()ident(Top)operator(\)\);) \ +operator(}) reserved(while) operator(()ident(YYID) operator(()integer(0)operator(\)\)) + + +comment(/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/) + +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(static) directive(void) +ident(yy_reduce_print) operator(()ident(YYSTYPE) operator(*)ident(yyvsp)operator(,) pre_type(int) ident(yyrule)operator(\)) +preprocessor(#else) +directive(static) directive(void) +ident(yy_reduce_print) operator(()ident(yyvsp)operator(,) ident(yyrule)operator(\)) + ident(YYSTYPE) operator(*)ident(yyvsp)operator(;) + pre_type(int) ident(yyrule)operator(;) +preprocessor(#endif) +operator({) + pre_type(int) ident(yynrhs) operator(=) ident(yyr2)operator([)ident(yyrule)operator(];) + pre_type(int) ident(yyi)operator(;) + pre_type(unsigned) pre_type(long) pre_type(int) ident(yylno) operator(=) ident(yyrline)operator([)ident(yyrule)operator(];) + ident(YYFPRINTF) operator(()ident(stderr)operator(,) string<delimiter(")content(Reducing stack by rule %d (line %lu\):)char(\\n)delimiter(")>operator(,) + ident(yyrule) operator(-) integer(1)operator(,) ident(yylno)operator(\);) + comment(/* The symbols being reduced. */) + reserved(for) operator(()ident(yyi) operator(=) integer(0)operator(;) ident(yyi) operator(<) ident(yynrhs)operator(;) ident(yyi)operator(++\)) + operator({) + ident(fprintf) operator(()ident(stderr)operator(,) string<delimiter(")content( $%d = )delimiter(")>operator(,) ident(yyi) operator(+) integer(1)operator(\);) + ident(yy_symbol_print) operator(()ident(stderr)operator(,) ident(yyrhs)operator([)ident(yyprhs)operator([)ident(yyrule)operator(]) operator(+) ident(yyi)operator(],) + operator(&()ident(yyvsp)operator([()ident(yyi) operator(+) integer(1)operator(\)) operator(-) operator(()ident(yynrhs)operator(\)]\)) + operator(\);) + ident(fprintf) operator(()ident(stderr)operator(,) string<delimiter(")char(\\n)delimiter(")>operator(\);) + operator(}) +operator(}) + +preprocessor(# define) ident(YY_REDUCE_PRINT)operator(()ident(Rule)operator(\)) \ +reserved(do) operator({) \ + reserved(if) operator(()ident(yydebug)operator(\)) \ + ident(yy_reduce_print) operator(()ident(yyvsp)operator(,) ident(Rule)operator(\);) \ +operator(}) reserved(while) operator(()ident(YYID) operator(()integer(0)operator(\)\)) + +comment(/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */) +pre_type(int) ident(yydebug)operator(;) +preprocessor(#else) comment(/* !YYDEBUG */) +preprocessor(# define) ident(YYDPRINTF)operator(()ident(Args)operator(\)) +preprocessor(# define) ident(YY_SYMBOL_PRINT)operator(()ident(Title)operator(,) ident(Type)operator(,) ident(Value)operator(,) ident(Location)operator(\)) +preprocessor(# define) ident(YY_STACK_PRINT)operator(()ident(Bottom)operator(,) ident(Top)operator(\)) +preprocessor(# define) ident(YY_REDUCE_PRINT)operator(()ident(Rule)operator(\)) +preprocessor(#endif) comment(/* !YYDEBUG */) + + +comment(/* YYINITDEPTH -- initial size of the parser's stacks. */) +preprocessor(#ifndef) ident(YYINITDEPTH) +preprocessor(# define) ident(YYINITDEPTH) integer(200) +preprocessor(#endif) + +comment(/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used\). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH\) + evaluated with infinite-precision integer arithmetic. */) + +preprocessor(#ifndef) ident(YYMAXDEPTH) +preprocessor(# define) ident(YYMAXDEPTH) integer(10000) +preprocessor(#endif) + + + +preprocessor(#if) ident(YYERROR_VERBOSE) + +preprocessor(# ifndef) ident(yystrlen) +preprocessor(# if) ident(defined) ident(__GLIBC__) operator(&&) ident(defined) ident(_STRING_H) +preprocessor(# define) ident(yystrlen) ident(strlen) +preprocessor(# else) +comment(/* Return the length of YYSTR. */) +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(static) ident(YYSIZE_T) +ident(yystrlen) operator(()directive(const) pre_type(char) operator(*)ident(yystr)operator(\)) +preprocessor(#else) +directive(static) ident(YYSIZE_T) +ident(yystrlen) operator(()ident(yystr)operator(\)) + directive(const) pre_type(char) operator(*)ident(yystr)operator(;) +preprocessor(#endif) +operator({) + ident(YYSIZE_T) ident(yylen)operator(;) + reserved(for) operator(()ident(yylen) operator(=) integer(0)operator(;) ident(yystr)operator([)ident(yylen)operator(];) ident(yylen)operator(++\)) + reserved(continue)operator(;) + reserved(return) ident(yylen)operator(;) +operator(}) +preprocessor(# endif) +preprocessor(# endif) + +preprocessor(# ifndef) ident(yystpcpy) +preprocessor(# if) ident(defined) ident(__GLIBC__) operator(&&) ident(defined) ident(_STRING_H) operator(&&) ident(defined) ident(_GNU_SOURCE) +preprocessor(# define) ident(yystpcpy) ident(stpcpy) +preprocessor(# else) +comment(/* Copy YYSRC to YYDEST, returning the address of the terminating '\\0' in + YYDEST. */) +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(static) pre_type(char) operator(*) +ident(yystpcpy) operator(()pre_type(char) operator(*)ident(yydest)operator(,) directive(const) pre_type(char) operator(*)ident(yysrc)operator(\)) +preprocessor(#else) +directive(static) pre_type(char) operator(*) +ident(yystpcpy) operator(()ident(yydest)operator(,) ident(yysrc)operator(\)) + pre_type(char) operator(*)ident(yydest)operator(;) + directive(const) pre_type(char) operator(*)ident(yysrc)operator(;) +preprocessor(#endif) +operator({) + pre_type(char) operator(*)ident(yyd) operator(=) ident(yydest)operator(;) + directive(const) pre_type(char) operator(*)ident(yys) operator(=) ident(yysrc)operator(;) + + reserved(while) operator(((*)ident(yyd)operator(++) operator(=) operator(*)ident(yys)operator(++\)) operator(!=) char('\\0')operator(\)) + reserved(continue)operator(;) + + reserved(return) ident(yyd) operator(-) integer(1)operator(;) +operator(}) +preprocessor(# endif) +preprocessor(# endif) + +preprocessor(# ifndef) ident(yytnamerr) +comment(/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash\). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */) +directive(static) ident(YYSIZE_T) +ident(yytnamerr) operator(()pre_type(char) operator(*)ident(yyres)operator(,) directive(const) pre_type(char) operator(*)ident(yystr)operator(\)) +operator({) + reserved(if) operator((*)ident(yystr) operator(==) char('"')operator(\)) + operator({) + ident(YYSIZE_T) ident(yyn) operator(=) integer(0)operator(;) + pre_type(char) directive(const) operator(*)ident(yyp) operator(=) ident(yystr)operator(;) + + reserved(for) operator((;;\)) + reserved(switch) operator((*++)ident(yyp)operator(\)) + operator({) + reserved(case) char('\\'')operator(:) + reserved(case) char(',')operator(:) + reserved(goto) ident(do_not_strip_quotes)operator(;) + + reserved(case) char('\\\\')operator(:) + reserved(if) operator((*++)ident(yyp) operator(!=) char('\\\\')operator(\)) + reserved(goto) ident(do_not_strip_quotes)operator(;) + comment(/* Fall through. */) + reserved(default)operator(:) + reserved(if) operator(()ident(yyres)operator(\)) + ident(yyres)operator([)ident(yyn)operator(]) operator(=) operator(*)ident(yyp)operator(;) + ident(yyn)operator(++;) + reserved(break)operator(;) + + reserved(case) char('"')operator(:) + reserved(if) operator(()ident(yyres)operator(\)) + ident(yyres)operator([)ident(yyn)operator(]) operator(=) char('\\0')operator(;) + reserved(return) ident(yyn)operator(;) + operator(}) + label(do_not_strip_quotes)operator(:) operator(;) + operator(}) + + reserved(if) operator((!) ident(yyres)operator(\)) + reserved(return) ident(yystrlen) operator(()ident(yystr)operator(\);) + + reserved(return) ident(yystpcpy) operator(()ident(yyres)operator(,) ident(yystr)operator(\)) operator(-) ident(yyres)operator(;) +operator(}) +preprocessor(# endif) + +comment(/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */) +directive(static) ident(YYSIZE_T) +ident(yysyntax_error) operator(()pre_type(char) operator(*)ident(yyresult)operator(,) pre_type(int) ident(yystate)operator(,) pre_type(int) ident(yychar)operator(\)) +operator({) + pre_type(int) ident(yyn) operator(=) ident(yypact)operator([)ident(yystate)operator(];) + + reserved(if) operator((!) operator(()ident(YYPACT_NINF) operator(<) ident(yyn) operator(&&) ident(yyn) operator(<=) ident(YYLAST)operator(\)\)) + reserved(return) integer(0)operator(;) + reserved(else) + operator({) + pre_type(int) ident(yytype) operator(=) ident(YYTRANSLATE) operator(()ident(yychar)operator(\);) + ident(YYSIZE_T) ident(yysize0) operator(=) ident(yytnamerr) operator(()integer(0)operator(,) ident(yytname)operator([)ident(yytype)operator(]\);) + ident(YYSIZE_T) ident(yysize) operator(=) ident(yysize0)operator(;) + ident(YYSIZE_T) ident(yysize1)operator(;) + pre_type(int) ident(yysize_overflow) operator(=) integer(0)operator(;) + reserved(enum) operator({) ident(YYERROR_VERBOSE_ARGS_MAXIMUM) operator(=) integer(5) operator(};) + pre_type(char) directive(const) operator(*)ident(yyarg)operator([)ident(YYERROR_VERBOSE_ARGS_MAXIMUM)operator(];) + pre_type(int) ident(yyx)operator(;) + +comment(# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"\); + YY_("syntax error, unexpected %s, expecting %s"\); + YY_("syntax error, unexpected %s, expecting %s or %s"\); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"\); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"\); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2\) + * (sizeof yyor - 1\)\)]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected\); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx\) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR\) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM\) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]\); + yysize_overflow |= (yysize1 < yysize\); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix\); + yyprefix = yyor; + } + + yyf = YY_(yyformat\); + yysize1 = yysize + yystrlen (yyf\); + yysize_overflow |= (yysize1 < yysize\); + yysize = yysize1; + + if (yysize_overflow\) + return YYSIZE_MAXIMUM; + + if (yyresult\) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf\) != '\\0'\) + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount\) + { + yyp += yytnamerr (yyp, yyarg[yyi++]\); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */) + + +comment(/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/) + +comment(/*ARGSUSED*/) +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +directive(static) directive(void) +ident(yydestruct) operator(()directive(const) pre_type(char) operator(*)ident(yymsg)operator(,) pre_type(int) ident(yytype)operator(,) ident(YYSTYPE) operator(*)ident(yyvaluep)operator(\)) +preprocessor(#else) +directive(static) directive(void) +ident(yydestruct) operator(()ident(yymsg)operator(,) ident(yytype)operator(,) ident(yyvaluep)operator(\)) + directive(const) pre_type(char) operator(*)ident(yymsg)operator(;) + pre_type(int) ident(yytype)operator(;) + ident(YYSTYPE) operator(*)ident(yyvaluep)operator(;) +preprocessor(#endif) +operator({) + ident(YYUSE) operator(()ident(yyvaluep)operator(\);) + + reserved(if) operator((!)ident(yymsg)operator(\)) + ident(yymsg) operator(=) string<delimiter(")content(Deleting)delimiter(")>operator(;) + ident(YY_SYMBOL_PRINT) operator(()ident(yymsg)operator(,) ident(yytype)operator(,) ident(yyvaluep)operator(,) ident(yylocationp)operator(\);) + + reserved(switch) operator(()ident(yytype)operator(\)) + operator({) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) +operator(}) + + +comment(/* Prevent warnings from -Wmissing-prototypes. */) + +preprocessor(#ifdef) ident(YYPARSE_PARAM) +preprocessor(#if) ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__cplusplus) +pre_type(int) ident(yyparse) operator(()directive(void) operator(*)ident(YYPARSE_PARAM)operator(\);) +preprocessor(#else) +pre_type(int) ident(yyparse) operator((\);) +preprocessor(#endif) +preprocessor(#else) comment(/* ! YYPARSE_PARAM */) +preprocessor(#if) ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__cplusplus) +pre_type(int) ident(yyparse) operator(()directive(void)operator(\);) +preprocessor(#else) +pre_type(int) ident(yyparse) operator((\);) +preprocessor(#endif) +preprocessor(#endif) comment(/* ! YYPARSE_PARAM */) + + + +comment(/* The look-ahead symbol. */) +pre_type(int) ident(yychar)operator(;) + +comment(/* The semantic value of the look-ahead symbol. */) +ident(YYSTYPE) ident(yylval)operator(;) + +comment(/* Number of syntax errors so far. */) +pre_type(int) ident(yynerrs)operator(;) + + + +comment(/*----------. +| yyparse. | +`----------*/) + +preprocessor(#ifdef) ident(YYPARSE_PARAM) +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +pre_type(int) +ident(yyparse) operator(()directive(void) operator(*)ident(YYPARSE_PARAM)operator(\)) +preprocessor(#else) +pre_type(int) +ident(yyparse) operator(()ident(YYPARSE_PARAM)operator(\)) + directive(void) operator(*)ident(YYPARSE_PARAM)operator(;) +preprocessor(#endif) +preprocessor(#else) comment(/* ! YYPARSE_PARAM */) +preprocessor(#if) operator(()ident(defined) ident(__STDC__) operator(||) ident(defined) ident(__C99__FUNC__) \ + operator(||) ident(defined) ident(__cplusplus) operator(||) ident(defined) ident(_MSC_VER)operator(\)) +pre_type(int) +ident(yyparse) operator(()directive(void)operator(\)) +preprocessor(#else) +pre_type(int) +ident(yyparse) operator((\)) + +preprocessor(#endif) +preprocessor(#endif) +operator({) + + pre_type(int) ident(yystate)operator(;) + pre_type(int) ident(yyn)operator(;) + pre_type(int) ident(yyresult)operator(;) + comment(/* Number of tokens to shift before error messages enabled. */) + pre_type(int) ident(yyerrstatus)operator(;) + comment(/* Look-ahead token as an internal (translated\) token number. */) + pre_type(int) ident(yytoken) operator(=) integer(0)operator(;) +preprocessor(#if) ident(YYERROR_VERBOSE) + comment(/* Buffer for error messages, and its allocated size. */) + pre_type(char) ident(yymsgbuf)operator([)integer(128)operator(];) + pre_type(char) operator(*)ident(yymsg) operator(=) ident(yymsgbuf)operator(;) + ident(YYSIZE_T) ident(yymsg_alloc) operator(=) reserved(sizeof) ident(yymsgbuf)operator(;) +preprocessor(#endif) + + comment(/* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */) + + comment(/* The state stack. */) + ident(yytype_int16) ident(yyssa)operator([)ident(YYINITDEPTH)operator(];) + ident(yytype_int16) operator(*)ident(yyss) operator(=) ident(yyssa)operator(;) + ident(yytype_int16) operator(*)ident(yyssp)operator(;) + + comment(/* The semantic value stack. */) + ident(YYSTYPE) ident(yyvsa)operator([)ident(YYINITDEPTH)operator(];) + ident(YYSTYPE) operator(*)ident(yyvs) operator(=) ident(yyvsa)operator(;) + ident(YYSTYPE) operator(*)ident(yyvsp)operator(;) + + + +preprocessor(#define) ident(YYPOPSTACK)operator(()ident(N)operator(\)) operator(()ident(yyvsp) operator(-=) operator(()ident(N)operator(\),) ident(yyssp) operator(-=) operator(()ident(N)operator(\)\)) + + ident(YYSIZE_T) ident(yystacksize) operator(=) ident(YYINITDEPTH)operator(;) + + comment(/* The variables used to return semantic value and location from the + action routines. */) + ident(YYSTYPE) ident(yyval)operator(;) + + + comment(/* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */) + pre_type(int) ident(yylen) operator(=) integer(0)operator(;) + + ident(YYDPRINTF) operator((()ident(stderr)operator(,) string<delimiter(")content(Starting parse)char(\\n)delimiter(")>operator(\)\);) + + ident(yystate) operator(=) integer(0)operator(;) + ident(yyerrstatus) operator(=) integer(0)operator(;) + ident(yynerrs) operator(=) integer(0)operator(;) + ident(yychar) operator(=) ident(YYEMPTY)operator(;) comment(/* Cause a token to be read. */) + + comment(/* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */) + + ident(yyssp) operator(=) ident(yyss)operator(;) + ident(yyvsp) operator(=) ident(yyvs)operator(;) + + reserved(goto) ident(yysetstate)operator(;) + +comment(/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/) + label(yynewstate)operator(:) + comment(/* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */) + ident(yyssp)operator(++;) + + label(yysetstate)operator(:) + operator(*)ident(yyssp) operator(=) ident(yystate)operator(;) + + reserved(if) operator(()ident(yyss) operator(+) ident(yystacksize) operator(-) integer(1) operator(<=) ident(yyssp)operator(\)) + operator({) + comment(/* Get the current used size of the three stacks, in elements. */) + ident(YYSIZE_T) ident(yysize) operator(=) ident(yyssp) operator(-) ident(yyss) operator(+) integer(1)operator(;) + +preprocessor(#ifdef) ident(yyoverflow) + operator({) + comment(/* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */) + ident(YYSTYPE) operator(*)ident(yyvs1) operator(=) ident(yyvs)operator(;) + ident(yytype_int16) operator(*)ident(yyss1) operator(=) ident(yyss)operator(;) + + + comment(/* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */) + ident(yyoverflow) operator(()ident(YY_)operator(()string<delimiter(")content(memory exhausted)delimiter(")>operator(\),) + operator(&)ident(yyss1)operator(,) ident(yysize) operator(*) reserved(sizeof) operator((*)ident(yyssp)operator(\),) + operator(&)ident(yyvs1)operator(,) ident(yysize) operator(*) reserved(sizeof) operator((*)ident(yyvsp)operator(\),) + + operator(&)ident(yystacksize)operator(\);) + + ident(yyss) operator(=) ident(yyss1)operator(;) + ident(yyvs) operator(=) ident(yyvs1)operator(;) + operator(}) +preprocessor(#else) comment(/* no yyoverflow */) +preprocessor(# ifndef) ident(YYSTACK_RELOCATE) + reserved(goto) ident(yyexhaustedlab)operator(;) +preprocessor(# else) + comment(/* Extend the stack our own way. */) + reserved(if) operator(()ident(YYMAXDEPTH) operator(<=) ident(yystacksize)operator(\)) + reserved(goto) ident(yyexhaustedlab)operator(;) + ident(yystacksize) operator(*=) integer(2)operator(;) + reserved(if) operator(()ident(YYMAXDEPTH) operator(<) ident(yystacksize)operator(\)) + ident(yystacksize) operator(=) ident(YYMAXDEPTH)operator(;) + + operator({) + ident(yytype_int16) operator(*)ident(yyss1) operator(=) ident(yyss)operator(;) + reserved(union) ident(yyalloc) operator(*)ident(yyptr) operator(=) + operator(()reserved(union) ident(yyalloc) operator(*\)) ident(YYSTACK_ALLOC) operator(()ident(YYSTACK_BYTES) operator(()ident(yystacksize)operator(\)\);) + reserved(if) operator((!) ident(yyptr)operator(\)) + reserved(goto) ident(yyexhaustedlab)operator(;) + ident(YYSTACK_RELOCATE) operator(()ident(yyss)operator(\);) + ident(YYSTACK_RELOCATE) operator(()ident(yyvs)operator(\);) + +preprocessor(# undef) ident(YYSTACK_RELOCATE) + reserved(if) operator(()ident(yyss1) operator(!=) ident(yyssa)operator(\)) + ident(YYSTACK_FREE) operator(()ident(yyss1)operator(\);) + operator(}) +preprocessor(# endif) +preprocessor(#endif) comment(/* no yyoverflow */) + + ident(yyssp) operator(=) ident(yyss) operator(+) ident(yysize) operator(-) integer(1)operator(;) + ident(yyvsp) operator(=) ident(yyvs) operator(+) ident(yysize) operator(-) integer(1)operator(;) + + + ident(YYDPRINTF) operator((()ident(stderr)operator(,) string<delimiter(")content(Stack size increased to %lu)char(\\n)delimiter(")>operator(,) + operator(()pre_type(unsigned) pre_type(long) pre_type(int)operator(\)) ident(yystacksize)operator(\)\);) + + reserved(if) operator(()ident(yyss) operator(+) ident(yystacksize) operator(-) integer(1) operator(<=) ident(yyssp)operator(\)) + ident(YYABORT)operator(;) + operator(}) + + ident(YYDPRINTF) operator((()ident(stderr)operator(,) string<delimiter(")content(Entering state %d)char(\\n)delimiter(")>operator(,) ident(yystate)operator(\)\);) + + reserved(goto) ident(yybackup)operator(;) + +comment(/*-----------. +| yybackup. | +`-----------*/) +label(yybackup)operator(:) + + comment(/* Do appropriate processing given the current state. Read a + look-ahead token if we need one and don't already have one. */) + + comment(/* First try to decide what to do without reference to look-ahead token. */) + ident(yyn) operator(=) ident(yypact)operator([)ident(yystate)operator(];) + reserved(if) operator(()ident(yyn) operator(==) ident(YYPACT_NINF)operator(\)) + reserved(goto) ident(yydefault)operator(;) + + comment(/* Not known => get a look-ahead token if don't already have one. */) + + comment(/* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */) + reserved(if) operator(()ident(yychar) operator(==) ident(YYEMPTY)operator(\)) + operator({) + ident(YYDPRINTF) operator((()ident(stderr)operator(,) string<delimiter(")content(Reading a token: )delimiter(")>operator(\)\);) + ident(yychar) operator(=) ident(YYLEX)operator(;) + operator(}) + + reserved(if) operator(()ident(yychar) operator(<=) ident(YYEOF)operator(\)) + operator({) + ident(yychar) operator(=) ident(yytoken) operator(=) ident(YYEOF)operator(;) + ident(YYDPRINTF) operator((()ident(stderr)operator(,) string<delimiter(")content(Now at end of input.)char(\\n)delimiter(")>operator(\)\);) + operator(}) + reserved(else) + operator({) + ident(yytoken) operator(=) ident(YYTRANSLATE) operator(()ident(yychar)operator(\);) + ident(YY_SYMBOL_PRINT) operator(()string<delimiter(")content(Next token is)delimiter(")>operator(,) ident(yytoken)operator(,) operator(&)ident(yylval)operator(,) operator(&)ident(yylloc)operator(\);) + operator(}) + + comment(/* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */) + ident(yyn) operator(+=) ident(yytoken)operator(;) + reserved(if) operator(()ident(yyn) operator(<) integer(0) operator(||) ident(YYLAST) operator(<) ident(yyn) operator(||) ident(yycheck)operator([)ident(yyn)operator(]) operator(!=) ident(yytoken)operator(\)) + reserved(goto) ident(yydefault)operator(;) + ident(yyn) operator(=) ident(yytable)operator([)ident(yyn)operator(];) + reserved(if) operator(()ident(yyn) operator(<=) integer(0)operator(\)) + operator({) + reserved(if) operator(()ident(yyn) operator(==) integer(0) operator(||) ident(yyn) operator(==) ident(YYTABLE_NINF)operator(\)) + reserved(goto) ident(yyerrlab)operator(;) + ident(yyn) operator(=) operator(-)ident(yyn)operator(;) + reserved(goto) ident(yyreduce)operator(;) + operator(}) + + reserved(if) operator(()ident(yyn) operator(==) ident(YYFINAL)operator(\)) + ident(YYACCEPT)operator(;) + + comment(/* Count tokens shifted since error; after three, turn off error + status. */) + reserved(if) operator(()ident(yyerrstatus)operator(\)) + ident(yyerrstatus)operator(--;) + + comment(/* Shift the look-ahead token. */) + ident(YY_SYMBOL_PRINT) operator(()string<delimiter(")content(Shifting)delimiter(")>operator(,) ident(yytoken)operator(,) operator(&)ident(yylval)operator(,) operator(&)ident(yylloc)operator(\);) + + comment(/* Discard the shifted token unless it is eof. */) + reserved(if) operator(()ident(yychar) operator(!=) ident(YYEOF)operator(\)) + ident(yychar) operator(=) ident(YYEMPTY)operator(;) + + ident(yystate) operator(=) ident(yyn)operator(;) + operator(*++)ident(yyvsp) operator(=) ident(yylval)operator(;) + + reserved(goto) ident(yynewstate)operator(;) + + +comment(/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/) +label(yydefault)operator(:) + ident(yyn) operator(=) ident(yydefact)operator([)ident(yystate)operator(];) + reserved(if) operator(()ident(yyn) operator(==) integer(0)operator(\)) + reserved(goto) ident(yyerrlab)operator(;) + reserved(goto) ident(yyreduce)operator(;) + + +comment(/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/) +label(yyreduce)operator(:) + comment(/* yyn is the number of a rule to reduce with. */) + ident(yylen) operator(=) ident(yyr2)operator([)ident(yyn)operator(];) + + comment(/* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */) + ident(yyval) operator(=) ident(yyvsp)operator([)integer(1)operator(-)ident(yylen)operator(];) + + + ident(YY_REDUCE_PRINT) operator(()ident(yyn)operator(\);) + reserved(switch) operator(()ident(yyn)operator(\)) + operator({) + reserved(case) integer(2)operator(:) +preprocessor(#line) integer(350) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + ident(top_local_init)operator((\);) + reserved(if) operator(()ident(ruby_class) operator(==) ident(rb_cObject)operator(\)) ident(class_nest) operator(=) integer(0)operator(;) + reserved(else) ident(class_nest) operator(=) integer(1)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(3)operator(:) +preprocessor(#line) integer(357) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)) operator(&&) operator(!)ident(compile_for_eval)operator(\)) operator({) + comment(/* last expression should not be void */) + reserved(if) operator(()ident(nd_type)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)) operator(!=) ident(NODE_BLOCK)operator(\)) ident(void_expr)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(else) operator({) + ident(NODE) operator(*)ident(node) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + reserved(while) operator(()ident(node)operator(->)ident(nd_next)operator(\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + operator(}) + ident(void_expr)operator(()ident(node)operator(->)ident(nd_head)operator(\);) + operator(}) + operator(}) + ident(ruby_eval_tree) operator(=) ident(block_append)operator(()ident(ruby_eval_tree)operator(,) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + ident(top_local_setup)operator((\);) + ident(class_nest) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(4)operator(:) +preprocessor(#line) integer(379) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_RESCUE)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(else without rescue is useless)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ENSURE)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(5)operator(:) +preprocessor(#line) integer(396) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(void_stmts)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixup_nodes)operator((&)ident(deferred_nodes)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(7)operator(:) +preprocessor(#line) integer(405) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(newline_node)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(8)operator(:) +preprocessor(#line) integer(409) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(newline_node)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(9)operator(:) +preprocessor(#line) integer(413) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(remove_begin)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(10)operator(:) +preprocessor(#line) integer(418) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(lex_state) operator(=) ident(EXPR_FNAME)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(11)operator(:) +preprocessor(#line) integer(419) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ALIAS)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(12)operator(:) +preprocessor(#line) integer(423) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_VALIAS)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(13)operator(:) +preprocessor(#line) integer(427) string<delimiter(")content(parse.y)delimiter(")> + operator({) + pre_type(char) ident(buf)operator([)integer(3)operator(];) + + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content($%c)delimiter(")>operator(,) operator(()pre_type(char)operator(\)()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_nth)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_VALIAS)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\),) ident(rb_intern)operator(()ident(buf)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(14)operator(:) +preprocessor(#line) integer(434) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(yyerror)operator(()string<delimiter(")content(can't make alias for the number variables)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(15)operator(:) +preprocessor(#line) integer(439) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(16)operator(:) +preprocessor(#line) integer(443) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_IF)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) ident(remove_begin)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) integer(0)operator(\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(cond_negative)operator((&()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_cond)operator(\)\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_else) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_body)operator(;) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_body) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(17)operator(:) +preprocessor(#line) integer(452) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_UNLESS)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) ident(remove_begin)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) integer(0)operator(\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(cond_negative)operator((&()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_cond)operator(\)\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_body) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_else)operator(;) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_else) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(18)operator(:) +preprocessor(#line) integer(461) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)) operator(&&) ident(nd_type)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_BEGIN)operator(\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_WHILE)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_body)operator(,) integer(0)operator(\);) + operator(}) + reserved(else) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_WHILE)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(cond_negative)operator((&()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_cond)operator(\)\)) operator({) + ident(nd_set_type)operator((()ident(yyval)operator(.)ident(node)operator(\),) ident(NODE_UNTIL)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(19)operator(:) +preprocessor(#line) integer(473) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)) operator(&&) ident(nd_type)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_BEGIN)operator(\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_UNTIL)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_body)operator(,) integer(0)operator(\);) + operator(}) + reserved(else) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_UNTIL)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(cond_negative)operator((&()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_cond)operator(\)\)) operator({) + ident(nd_set_type)operator((()ident(yyval)operator(.)ident(node)operator(\),) ident(NODE_WHILE)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(20)operator(:) +preprocessor(#line) integer(485) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(NODE) operator(*)ident(resq) operator(=) ident(NEW_RESBODY)operator(()integer(0)operator(,) ident(remove_begin)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) integer(0)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_RESCUE)operator(()ident(remove_begin)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) ident(resq)operator(,) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(21)operator(:) +preprocessor(#line) integer(490) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(BEGIN in method)delimiter(")>operator(\);) + operator(}) + ident(local_push)operator(()integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(22)operator(:) +preprocessor(#line) integer(497) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(ruby_eval_tree_begin) operator(=) ident(block_append)operator(()ident(ruby_eval_tree_begin)operator(,) + ident(NEW_PREEXE)operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\)\);) + ident(local_pop)operator((\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(23)operator(:) +preprocessor(#line) integer(504) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(END in method; use at_exit)delimiter(")>operator(\);) + operator(}) + + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ITER)operator(()integer(0)operator(,) ident(NEW_POSTEXE)operator((\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(24)operator(:) +preprocessor(#line) integer(512) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(node_assign)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(25)operator(:) +preprocessor(#line) integer(516) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_value) operator(=) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_head)operator(\)) operator(?) ident(NEW_TO_ARY)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator(:) ident(NEW_ARRAY)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(26)operator(:) +preprocessor(#line) integer(522) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator({) + ident(ID) ident(vid) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_vid)operator(;) + reserved(if) operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_value) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN_OR)operator(()ident(gettable)operator(()ident(vid)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(is_asgn_or_id)operator(()ident(vid)operator(\)\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_aid) operator(=) ident(vid)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_value) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN_AND)operator(()ident(gettable)operator(()ident(vid)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(else) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_value) operator(=) ident(call_op)operator(()ident(gettable)operator(()ident(vid)operator(\),()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\),)integer(1)operator(,()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + operator(}) + reserved(else) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(27)operator(:) +preprocessor(#line) integer(547) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(NODE) operator(*)ident(args)operator(;) + + ident(value_expr)operator((()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((!()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\)) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)) operator(=) ident(NEW_ZARRAY)operator((\);) + ident(args) operator(=) ident(arg_concat)operator((()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(1)operator(;) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN1)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\),) ident(args)operator(\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(28)operator(:) +preprocessor(#line) integer(563) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(1)operator(;) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(29)operator(:) +preprocessor(#line) integer(575) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(1)operator(;) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(30)operator(:) +preprocessor(#line) integer(587) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(1)operator(;) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(31)operator(:) +preprocessor(#line) integer(599) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_backref_error)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(32)operator(:) +preprocessor(#line) integer(604) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(node_assign)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(NEW_SVALUE)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(33)operator(:) +preprocessor(#line) integer(608) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_value) operator(=) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_head)operator(\)) operator(?) ident(NEW_TO_ARY)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator(:) ident(NEW_ARRAY)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(34)operator(:) +preprocessor(#line) integer(613) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_value) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(37)operator(:) +preprocessor(#line) integer(622) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(logop)operator(()ident(NODE_AND)operator(,) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(38)operator(:) +preprocessor(#line) integer(626) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(logop)operator(()ident(NODE_OR)operator(,) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(39)operator(:) +preprocessor(#line) integer(630) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NOT)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(40)operator(:) +preprocessor(#line) integer(634) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NOT)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(42)operator(:) +preprocessor(#line) integer(641) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyval)operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(45)operator(:) +preprocessor(#line) integer(650) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_RETURN)operator(()ident(ret_args)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(46)operator(:) +preprocessor(#line) integer(654) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_BREAK)operator(()ident(ret_args)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(47)operator(:) +preprocessor(#line) integer(658) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NEXT)operator(()ident(ret_args)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(49)operator(:) +preprocessor(#line) integer(665) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(50)operator(:) +preprocessor(#line) integer(669) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(51)operator(:) +preprocessor(#line) integer(675) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(vars)operator(\)) operator(=) ident(dyna_push)operator((\);) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(num)operator(\)) operator(=) ident(ruby_sourceline)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(52)operator(:) +preprocessor(#line) integer(679) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(vars)operator(\)) operator(=) ident(ruby_dyna_vars)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(53)operator(:) +preprocessor(#line) integer(682) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ITER)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) integer(0)operator(,) ident(dyna_init)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(vars)operator(\)\)\);) + ident(nd_set_line)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(num)operator(\)\);) + ident(dyna_pop)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(vars)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(54)operator(:) +preprocessor(#line) integer(690) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_fcall)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(55)operator(:) +preprocessor(#line) integer(695) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_fcall)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator({) + reserved(if) operator(()ident(nd_type)operator((()ident(yyval)operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_BLOCK_PASS)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(both block arg and actual block given)delimiter(")>operator(\);) + operator(}) + operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_iter) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(56)operator(:) +preprocessor(#line) integer(707) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(57)operator(:) +preprocessor(#line) integer(712) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\)) operator({) + reserved(if) operator(()ident(nd_type)operator((()ident(yyval)operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_BLOCK_PASS)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(both block arg and actual block given)delimiter(")>operator(\);) + operator(}) + operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_iter) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(58)operator(:) +preprocessor(#line) integer(724) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(59)operator(:) +preprocessor(#line) integer(729) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\)) operator({) + reserved(if) operator(()ident(nd_type)operator((()ident(yyval)operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_BLOCK_PASS)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(both block arg and actual block given)delimiter(")>operator(\);) + operator(}) + operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_iter) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(60)operator(:) +preprocessor(#line) integer(741) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_super)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(61)operator(:) +preprocessor(#line) integer(746) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_yield)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(63)operator(:) +preprocessor(#line) integer(754) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(65)operator(:) +preprocessor(#line) integer(761) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_MASGN)operator(()ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(66)operator(:) +preprocessor(#line) integer(767) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_MASGN)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(67)operator(:) +preprocessor(#line) integer(771) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_MASGN)operator(()ident(list_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(68)operator(:) +preprocessor(#line) integer(775) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_MASGN)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(69)operator(:) +preprocessor(#line) integer(779) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_MASGN)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) operator(-)integer(1)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(70)operator(:) +preprocessor(#line) integer(783) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_MASGN)operator(()integer(0)operator(,) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(71)operator(:) +preprocessor(#line) integer(787) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_MASGN)operator(()integer(0)operator(,) operator(-)integer(1)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(73)operator(:) +preprocessor(#line) integer(794) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(74)operator(:) +preprocessor(#line) integer(800) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(75)operator(:) +preprocessor(#line) integer(804) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(76)operator(:) +preprocessor(#line) integer(810) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(assignable)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(77)operator(:) +preprocessor(#line) integer(814) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(aryset)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(78)operator(:) +preprocessor(#line) integer(818) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(attrset)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(79)operator(:) +preprocessor(#line) integer(822) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(attrset)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(80)operator(:) +preprocessor(#line) integer(826) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(attrset)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(81)operator(:) +preprocessor(#line) integer(830) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) + ident(yyerror)operator(()string<delimiter(")content(dynamic constant assignment)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_CDECL)operator(()integer(0)operator(,) integer(0)operator(,) ident(NEW_COLON2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(82)operator(:) +preprocessor(#line) integer(836) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) + ident(yyerror)operator(()string<delimiter(")content(dynamic constant assignment)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_CDECL)operator(()integer(0)operator(,) integer(0)operator(,) ident(NEW_COLON3)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(83)operator(:) +preprocessor(#line) integer(842) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_backref_error)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(84)operator(:) +preprocessor(#line) integer(849) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(assignable)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(85)operator(:) +preprocessor(#line) integer(853) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(aryset)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(86)operator(:) +preprocessor(#line) integer(857) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(attrset)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(87)operator(:) +preprocessor(#line) integer(861) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(attrset)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(88)operator(:) +preprocessor(#line) integer(865) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(attrset)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(89)operator(:) +preprocessor(#line) integer(869) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) + ident(yyerror)operator(()string<delimiter(")content(dynamic constant assignment)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_CDECL)operator(()integer(0)operator(,) integer(0)operator(,) ident(NEW_COLON2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(90)operator(:) +preprocessor(#line) integer(875) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) + ident(yyerror)operator(()string<delimiter(")content(dynamic constant assignment)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_CDECL)operator(()integer(0)operator(,) integer(0)operator(,) ident(NEW_COLON3)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(91)operator(:) +preprocessor(#line) integer(881) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_backref_error)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(92)operator(:) +preprocessor(#line) integer(888) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(yyerror)operator(()string<delimiter(")content(class/module name must be CONSTANT)delimiter(")>operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(94)operator(:) +preprocessor(#line) integer(895) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_COLON3)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(95)operator(:) +preprocessor(#line) integer(899) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_COLON2)operator(()integer(0)operator(,) operator(()ident(yyval)operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(96)operator(:) +preprocessor(#line) integer(903) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_COLON2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(100)operator(:) +preprocessor(#line) integer(912) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(101)operator(:) +preprocessor(#line) integer(917) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(104)operator(:) +preprocessor(#line) integer(928) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIT)operator(()ident(ID2SYM)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(106)operator(:) +preprocessor(#line) integer(935) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_UNDEF)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(107)operator(:) +preprocessor(#line) integer(938) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(lex_state) operator(=) ident(EXPR_FNAME)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(108)operator(:) +preprocessor(#line) integer(939) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) ident(NEW_UNDEF)operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(109)operator(:) +preprocessor(#line) integer(944) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('|')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(110)operator(:) +preprocessor(#line) integer(945) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('^')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(111)operator(:) +preprocessor(#line) integer(946) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('&')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(112)operator(:) +preprocessor(#line) integer(947) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tCMP)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(113)operator(:) +preprocessor(#line) integer(948) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tEQ)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(114)operator(:) +preprocessor(#line) integer(949) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tEQQ)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(115)operator(:) +preprocessor(#line) integer(950) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tMATCH)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(116)operator(:) +preprocessor(#line) integer(951) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('>')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(117)operator(:) +preprocessor(#line) integer(952) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tGEQ)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(118)operator(:) +preprocessor(#line) integer(953) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('<')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(119)operator(:) +preprocessor(#line) integer(954) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tLEQ)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(120)operator(:) +preprocessor(#line) integer(955) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tLSHFT)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(121)operator(:) +preprocessor(#line) integer(956) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tRSHFT)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(122)operator(:) +preprocessor(#line) integer(957) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('+')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(123)operator(:) +preprocessor(#line) integer(958) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('-')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(124)operator(:) +preprocessor(#line) integer(959) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('*')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(125)operator(:) +preprocessor(#line) integer(960) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('*')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(126)operator(:) +preprocessor(#line) integer(961) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('/')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(127)operator(:) +preprocessor(#line) integer(962) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('%')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(128)operator(:) +preprocessor(#line) integer(963) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tPOW)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(129)operator(:) +preprocessor(#line) integer(964) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('~')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(130)operator(:) +preprocessor(#line) integer(965) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tUPLUS)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(131)operator(:) +preprocessor(#line) integer(966) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tUMINUS)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(132)operator(:) +preprocessor(#line) integer(967) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tAREF)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(133)operator(:) +preprocessor(#line) integer(968) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(tASET)operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(134)operator(:) +preprocessor(#line) integer(969) string<delimiter(")content(parse.y)delimiter(")> + operator({) operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) char('`')operator(;) operator(}) + reserved(break)operator(;) + + reserved(case) integer(175)operator(:) +preprocessor(#line) integer(982) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(node_assign)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(176)operator(:) +preprocessor(#line) integer(986) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(node_assign)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) ident(NEW_RESCUE)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) ident(NEW_RESBODY)operator(()integer(0)operator(,()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),)integer(0)operator(\),) integer(0)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(177)operator(:) +preprocessor(#line) integer(990) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator({) + ident(ID) ident(vid) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_vid)operator(;) + reserved(if) operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_value) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN_OR)operator(()ident(gettable)operator(()ident(vid)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(is_asgn_or_id)operator(()ident(vid)operator(\)\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_aid) operator(=) ident(vid)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_value) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN_AND)operator(()ident(gettable)operator(()ident(vid)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(else) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_value) operator(=) ident(call_op)operator(()ident(gettable)operator(()ident(vid)operator(\),()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\),)integer(1)operator(,()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + operator(}) + reserved(else) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(178)operator(:) +preprocessor(#line) integer(1015) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(NODE) operator(*)ident(args)operator(;) + + ident(value_expr)operator((()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((!()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\)) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)) operator(=) ident(NEW_ZARRAY)operator((\);) + ident(args) operator(=) ident(arg_concat)operator((()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(1)operator(;) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN1)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\),) ident(args)operator(\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(179)operator(:) +preprocessor(#line) integer(1031) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(1)operator(;) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(180)operator(:) +preprocessor(#line) integer(1043) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(1)operator(;) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(181)operator(:) +preprocessor(#line) integer(1055) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tOROP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(==) ident(tANDOP)operator(\)) operator({) + operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\)) operator(=) integer(1)operator(;) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_OP_ASGN2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(182)operator(:) +preprocessor(#line) integer(1067) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(yyerror)operator(()string<delimiter(")content(constant re-assignment)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(183)operator(:) +preprocessor(#line) integer(1072) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(yyerror)operator(()string<delimiter(")content(constant re-assignment)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(184)operator(:) +preprocessor(#line) integer(1077) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_backref_error)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(185)operator(:) +preprocessor(#line) integer(1082) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_DOT2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(nd_type)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_LIT) operator(&&) ident(FIXNUM_P)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_lit)operator(\)) operator(&&) + ident(nd_type)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_LIT) operator(&&) ident(FIXNUM_P)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_lit)operator(\)\)) operator({) + ident(deferred_nodes) operator(=) ident(list_append)operator(()ident(deferred_nodes)operator(,) operator(()ident(yyval)operator(.)ident(node)operator(\)\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(186)operator(:) +preprocessor(#line) integer(1092) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_DOT3)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(nd_type)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_LIT) operator(&&) ident(FIXNUM_P)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_lit)operator(\)) operator(&&) + ident(nd_type)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_LIT) operator(&&) ident(FIXNUM_P)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_lit)operator(\)\)) operator({) + ident(deferred_nodes) operator(=) ident(list_append)operator(()ident(deferred_nodes)operator(,) operator(()ident(yyval)operator(.)ident(node)operator(\)\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(187)operator(:) +preprocessor(#line) integer(1102) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('+')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(188)operator(:) +preprocessor(#line) integer(1106) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('-')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(189)operator(:) +preprocessor(#line) integer(1110) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('*')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(190)operator(:) +preprocessor(#line) integer(1114) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('/')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(191)operator(:) +preprocessor(#line) integer(1118) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('%')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(192)operator(:) +preprocessor(#line) integer(1122) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(tPOW)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(193)operator(:) +preprocessor(#line) integer(1126) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator(()ident(call_op)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) ident(tPOW)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\),) ident(tUMINUS)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(194)operator(:) +preprocessor(#line) integer(1130) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator(()ident(call_op)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) ident(tPOW)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\),) ident(tUMINUS)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(195)operator(:) +preprocessor(#line) integer(1134) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)) operator(&&) ident(nd_type)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_LIT)operator(\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(else) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) ident(tUPLUS)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(196)operator(:) +preprocessor(#line) integer(1143) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) ident(tUMINUS)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(197)operator(:) +preprocessor(#line) integer(1147) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('|')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(198)operator(:) +preprocessor(#line) integer(1151) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('^')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(199)operator(:) +preprocessor(#line) integer(1155) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('&')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(200)operator(:) +preprocessor(#line) integer(1159) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(tCMP)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(201)operator(:) +preprocessor(#line) integer(1163) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('>')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(202)operator(:) +preprocessor(#line) integer(1167) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(tGEQ)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(203)operator(:) +preprocessor(#line) integer(1171) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) char('<')operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(204)operator(:) +preprocessor(#line) integer(1175) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(tLEQ)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(205)operator(:) +preprocessor(#line) integer(1179) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(tEQ)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(206)operator(:) +preprocessor(#line) integer(1183) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(tEQQ)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(207)operator(:) +preprocessor(#line) integer(1187) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NOT)operator(()ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(tEQ)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(208)operator(:) +preprocessor(#line) integer(1191) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(match_gen)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(209)operator(:) +preprocessor(#line) integer(1195) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NOT)operator(()ident(match_gen)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(210)operator(:) +preprocessor(#line) integer(1199) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NOT)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(211)operator(:) +preprocessor(#line) integer(1203) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) char('~')operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(212)operator(:) +preprocessor(#line) integer(1207) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(tLSHFT)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(213)operator(:) +preprocessor(#line) integer(1211) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(call_op)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(tRSHFT)operator(,) integer(1)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(214)operator(:) +preprocessor(#line) integer(1215) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(logop)operator(()ident(NODE_AND)operator(,) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(215)operator(:) +preprocessor(#line) integer(1219) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(logop)operator(()ident(NODE_OR)operator(,) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(216)operator(:) +preprocessor(#line) integer(1222) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(in_defined) operator(=) integer(1)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(217)operator(:) +preprocessor(#line) integer(1223) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(in_defined) operator(=) integer(0)operator(;) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_DEFINED)operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(218)operator(:) +preprocessor(#line) integer(1228) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_IF)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(219)operator(:) +preprocessor(#line) integer(1233) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(220)operator(:) +preprocessor(#line) integer(1239) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(222)operator(:) +preprocessor(#line) integer(1247) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_warn)operator(()string<delimiter(")content(parenthesize argument(s\) for future version)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(223)operator(:) +preprocessor(#line) integer(1252) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(224)operator(:) +preprocessor(#line) integer(1256) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(225)operator(:) +preprocessor(#line) integer(1261) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator(()ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(226)operator(:) +preprocessor(#line) integer(1265) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NEWLINE)operator(()ident(NEW_SPLAT)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(227)operator(:) +preprocessor(#line) integer(1272) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(228)operator(:) +preprocessor(#line) integer(1276) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(229)operator(:) +preprocessor(#line) integer(1280) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_warn)operator(()string<delimiter(")content(parenthesize argument for future version)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(230)operator(:) +preprocessor(#line) integer(1285) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_warn)operator(()string<delimiter(")content(parenthesize argument for future version)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(233)operator(:) +preprocessor(#line) integer(1296) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_warn)operator(()string<delimiter(")content(parenthesize argument(s\) for future version)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(234)operator(:) +preprocessor(#line) integer(1301) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(235)operator(:) +preprocessor(#line) integer(1305) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(236)operator(:) +preprocessor(#line) integer(1310) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator(()ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(237)operator(:) +preprocessor(#line) integer(1315) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator(()ident(NEW_LIST)operator(()ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\)\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(238)operator(:) +preprocessor(#line) integer(1320) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(239)operator(:) +preprocessor(#line) integer(1325) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator(()ident(list_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\),) ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\)\),) operator(()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(7)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(240)operator(:) +preprocessor(#line) integer(1331) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator(()ident(NEW_SPLAT)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(242)operator(:) +preprocessor(#line) integer(1338) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator(()ident(list_concat)operator(()ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\),()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(243)operator(:) +preprocessor(#line) integer(1342) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(244)operator(:) +preprocessor(#line) integer(1346) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator(()ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(245)operator(:) +preprocessor(#line) integer(1351) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator(()ident(list_concat)operator(()ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\),()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(7)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(246)operator(:) +preprocessor(#line) integer(1356) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator(()ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(247)operator(:) +preprocessor(#line) integer(1361) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator(()ident(NEW_LIST)operator(()ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\)\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(248)operator(:) +preprocessor(#line) integer(1366) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator(()ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\),) ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(249)operator(:) +preprocessor(#line) integer(1371) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator(()ident(list_concat)operator(()ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\),()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\),) ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(250)operator(:) +preprocessor(#line) integer(1376) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator(()ident(list_append)operator(()ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\),) ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\)\),) operator(()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(7)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(251)operator(:) +preprocessor(#line) integer(1381) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator(()ident(list_append)operator(()ident(list_concat)operator(()ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\)\),) ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\)\)\),) operator(()ident(yyvsp)operator([()integer(8)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(9)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(252)operator(:) +preprocessor(#line) integer(1386) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_blk_pass)operator(()ident(NEW_SPLAT)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(254)operator(:) +preprocessor(#line) integer(1392) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(num)operator(\)) operator(=) ident(cmdarg_stack)operator(;) + ident(CMDARG_PUSH)operator(()integer(1)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(255)operator(:) +preprocessor(#line) integer(1397) string<delimiter(")content(parse.y)delimiter(")> + operator({) + comment(/* CMDARG_POP(\) */) + ident(cmdarg_stack) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(num)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(257)operator(:) +preprocessor(#line) integer(1405) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(lex_state) operator(=) ident(EXPR_ENDARG)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(258)operator(:) +preprocessor(#line) integer(1406) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_warn)operator(()string<delimiter(")content(don't put space before argument parentheses)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(259)operator(:) +preprocessor(#line) integer(1410) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(lex_state) operator(=) ident(EXPR_ENDARG)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(260)operator(:) +preprocessor(#line) integer(1411) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_warn)operator(()string<delimiter(")content(don't put space before argument parentheses)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(261)operator(:) +preprocessor(#line) integer(1418) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_BLOCK_PASS)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(262)operator(:) +preprocessor(#line) integer(1424) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(264)operator(:) +preprocessor(#line) integer(1431) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(265)operator(:) +preprocessor(#line) integer(1435) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(266)operator(:) +preprocessor(#line) integer(1441) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(267)operator(:) +preprocessor(#line) integer(1445) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(arg_concat)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(268)operator(:) +preprocessor(#line) integer(1449) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_SPLAT)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(277)operator(:) +preprocessor(#line) integer(1463) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_FCALL)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(278)operator(:) +preprocessor(#line) integer(1467) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(num)operator(\)) operator(=) ident(ruby_sourceline)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(279)operator(:) +preprocessor(#line) integer(1472) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)) operator(==) pre_constant(NULL)operator(\)) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NIL)operator((\);) + reserved(else) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_BEGIN)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + ident(nd_set_line)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(num)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(280)operator(:) +preprocessor(#line) integer(1479) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(lex_state) operator(=) ident(EXPR_ENDARG)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(281)operator(:) +preprocessor(#line) integer(1480) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(rb_warning)operator(()string<delimiter(")content((...\) interpreted as grouped expression)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(282)operator(:) +preprocessor(#line) integer(1485) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((!()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)) operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NIL)operator((\);) + reserved(else) operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(283)operator(:) +preprocessor(#line) integer(1490) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_COLON2)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(284)operator(:) +preprocessor(#line) integer(1494) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_COLON3)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(285)operator(:) +preprocessor(#line) integer(1498) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)) operator(&&) ident(nd_type)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_SELF)operator(\)) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_FCALL)operator(()ident(tAREF)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(else) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_CALL)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) ident(tAREF)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(286)operator(:) +preprocessor(#line) integer(1506) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)) operator(==) integer(0)operator(\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ZARRAY)operator((\);) comment(/* zero length array*/) + operator(}) + reserved(else) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(287)operator(:) +preprocessor(#line) integer(1515) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_HASH)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(288)operator(:) +preprocessor(#line) integer(1519) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_RETURN)operator(()integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(289)operator(:) +preprocessor(#line) integer(1523) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_yield)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(290)operator(:) +preprocessor(#line) integer(1527) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_YIELD)operator(()integer(0)operator(,) ident(Qfalse)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(291)operator(:) +preprocessor(#line) integer(1531) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_YIELD)operator(()integer(0)operator(,) ident(Qfalse)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(292)operator(:) +preprocessor(#line) integer(1534) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(in_defined) operator(=) integer(1)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(293)operator(:) +preprocessor(#line) integer(1535) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(in_defined) operator(=) integer(0)operator(;) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_DEFINED)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(294)operator(:) +preprocessor(#line) integer(1540) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_iter) operator(=) ident(NEW_FCALL)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\),) integer(0)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + ident(fixpos)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_iter)operator(,) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(296)operator(:) +preprocessor(#line) integer(1547) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)) operator(&&) ident(nd_type)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_BLOCK_PASS)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(both block arg and actual block given)delimiter(")>operator(\);) + operator(}) + operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_iter) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(297)operator(:) +preprocessor(#line) integer(1559) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_IF)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(cond_negative)operator((&()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_cond)operator(\)\)) operator({) + ident(NODE) operator(*)ident(tmp) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_body)operator(;) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_body) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_else)operator(;) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_else) operator(=) ident(tmp)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(298)operator(:) +preprocessor(#line) integer(1572) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_UNLESS)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(cond_negative)operator((&()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_cond)operator(\)\)) operator({) + ident(NODE) operator(*)ident(tmp) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_body)operator(;) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_body) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_else)operator(;) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_else) operator(=) ident(tmp)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(299)operator(:) +preprocessor(#line) integer(1581) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(COND_PUSH)operator(()integer(1)operator(\);}) + reserved(break)operator(;) + + reserved(case) integer(300)operator(:) +preprocessor(#line) integer(1581) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(COND_POP)operator((\);}) + reserved(break)operator(;) + + reserved(case) integer(301)operator(:) +preprocessor(#line) integer(1584) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_WHILE)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\),) integer(1)operator(\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(cond_negative)operator((&()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_cond)operator(\)\)) operator({) + ident(nd_set_type)operator((()ident(yyval)operator(.)ident(node)operator(\),) ident(NODE_UNTIL)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(302)operator(:) +preprocessor(#line) integer(1591) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(COND_PUSH)operator(()integer(1)operator(\);}) + reserved(break)operator(;) + + reserved(case) integer(303)operator(:) +preprocessor(#line) integer(1591) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(COND_POP)operator((\);}) + reserved(break)operator(;) + + reserved(case) integer(304)operator(:) +preprocessor(#line) integer(1594) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_UNTIL)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\),) integer(1)operator(\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(7)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(if) operator(()ident(cond_negative)operator((&()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_cond)operator(\)\)) operator({) + ident(nd_set_type)operator((()ident(yyval)operator(.)ident(node)operator(\),) ident(NODE_WHILE)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(305)operator(:) +preprocessor(#line) integer(1604) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_CASE)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(306)operator(:) +preprocessor(#line) integer(1609) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(307)operator(:) +preprocessor(#line) integer(1613) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(308)operator(:) +preprocessor(#line) integer(1616) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(COND_PUSH)operator(()integer(1)operator(\);}) + reserved(break)operator(;) + + reserved(case) integer(309)operator(:) +preprocessor(#line) integer(1616) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(COND_POP)operator((\);}) + reserved(break)operator(;) + + reserved(case) integer(310)operator(:) +preprocessor(#line) integer(1619) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_FOR)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(8)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(311)operator(:) +preprocessor(#line) integer(1624) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) + ident(yyerror)operator(()string<delimiter(")content(class definition in method body)delimiter(")>operator(\);) + ident(class_nest)operator(++;) + ident(local_push)operator(()integer(0)operator(\);) + operator(()ident(yyval)operator(.)ident(num)operator(\)) operator(=) ident(ruby_sourceline)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(312)operator(:) +preprocessor(#line) integer(1633) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_CLASS)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + ident(nd_set_line)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(num)operator(\)\);) + ident(local_pop)operator((\);) + ident(class_nest)operator(--;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(313)operator(:) +preprocessor(#line) integer(1640) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(num)operator(\)) operator(=) ident(in_def)operator(;) + ident(in_def) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(314)operator(:) +preprocessor(#line) integer(1645) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(num)operator(\)) operator(=) ident(in_single)operator(;) + ident(in_single) operator(=) integer(0)operator(;) + ident(class_nest)operator(++;) + ident(local_push)operator(()integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(315)operator(:) +preprocessor(#line) integer(1653) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_SCLASS)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(8)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(7)operator(\)) operator(-) operator(()integer(8)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(8)operator(\)])operator(.)ident(node)operator(\)\);) + ident(local_pop)operator((\);) + ident(class_nest)operator(--;) + ident(in_def) operator(=) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(8)operator(\)])operator(.)ident(num)operator(\);) + ident(in_single) operator(=) operator(()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(8)operator(\)])operator(.)ident(num)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(316)operator(:) +preprocessor(#line) integer(1662) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) + ident(yyerror)operator(()string<delimiter(")content(module definition in method body)delimiter(")>operator(\);) + ident(class_nest)operator(++;) + ident(local_push)operator(()integer(0)operator(\);) + operator(()ident(yyval)operator(.)ident(num)operator(\)) operator(=) ident(ruby_sourceline)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(317)operator(:) +preprocessor(#line) integer(1671) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_MODULE)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(nd_set_line)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(num)operator(\)\);) + ident(local_pop)operator((\);) + ident(class_nest)operator(--;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(318)operator(:) +preprocessor(#line) integer(1678) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(cur_mid)operator(;) + ident(cur_mid) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\);) + ident(in_def)operator(++;) + ident(local_push)operator(()integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(319)operator(:) +preprocessor(#line) integer(1687) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((!()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\)) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)) operator(=) ident(NEW_NIL)operator((\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_DEFN)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) ident(NOEX_PRIVATE)operator(\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + ident(local_pop)operator((\);) + ident(in_def)operator(--;) + ident(cur_mid) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(id)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(320)operator(:) +preprocessor(#line) integer(1695) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(lex_state) operator(=) ident(EXPR_FNAME)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(321)operator(:) +preprocessor(#line) integer(1696) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(in_single)operator(++;) + ident(local_push)operator(()integer(0)operator(\);) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) comment(/* force for args */) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(322)operator(:) +preprocessor(#line) integer(1704) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_DEFS)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(7)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(8)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(9)operator(\)])operator(.)ident(node)operator(\)\);) + ident(local_pop)operator((\);) + ident(in_single)operator(--;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(323)operator(:) +preprocessor(#line) integer(1711) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_BREAK)operator(()integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(324)operator(:) +preprocessor(#line) integer(1715) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NEXT)operator(()integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(325)operator(:) +preprocessor(#line) integer(1719) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_REDO)operator((\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(326)operator(:) +preprocessor(#line) integer(1723) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_RETRY)operator((\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(327)operator(:) +preprocessor(#line) integer(1729) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(336)operator(:) +preprocessor(#line) integer(1750) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_IF)operator(()ident(cond)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(338)operator(:) +preprocessor(#line) integer(1758) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(342)operator(:) +preprocessor(#line) integer(1769) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(NODE)operator(*\))integer(1)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(343)operator(:) +preprocessor(#line) integer(1773) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(NODE)operator(*\))integer(1)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(344)operator(:) +preprocessor(#line) integer(1777) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(345)operator(:) +preprocessor(#line) integer(1783) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(vars)operator(\)) operator(=) ident(dyna_push)operator((\);) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(num)operator(\)) operator(=) ident(ruby_sourceline)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(346)operator(:) +preprocessor(#line) integer(1787) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(vars)operator(\)) operator(=) ident(ruby_dyna_vars)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(347)operator(:) +preprocessor(#line) integer(1790) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ITER)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) integer(0)operator(,) ident(dyna_init)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(vars)operator(\)\)\);) + ident(nd_set_line)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(num)operator(\)\);) + ident(dyna_pop)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(vars)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(348)operator(:) +preprocessor(#line) integer(1798) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)) operator(&&) ident(nd_type)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_BLOCK_PASS)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(both block arg and actual block given)delimiter(")>operator(\);) + operator(}) + operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_iter) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(349)operator(:) +preprocessor(#line) integer(1807) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(350)operator(:) +preprocessor(#line) integer(1811) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(351)operator(:) +preprocessor(#line) integer(1817) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_fcall)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(352)operator(:) +preprocessor(#line) integer(1822) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(353)operator(:) +preprocessor(#line) integer(1827) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(354)operator(:) +preprocessor(#line) integer(1832) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_call)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(355)operator(:) +preprocessor(#line) integer(1836) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_super)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(356)operator(:) +preprocessor(#line) integer(1840) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ZSUPER)operator((\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(357)operator(:) +preprocessor(#line) integer(1846) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(vars)operator(\)) operator(=) ident(dyna_push)operator((\);) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(num)operator(\)) operator(=) ident(ruby_sourceline)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(358)operator(:) +preprocessor(#line) integer(1850) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(vars)operator(\)) operator(=) ident(ruby_dyna_vars)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(359)operator(:) +preprocessor(#line) integer(1852) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ITER)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) integer(0)operator(,) ident(dyna_init)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(vars)operator(\)\)\);) + ident(nd_set_line)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(num)operator(\)\);) + ident(dyna_pop)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(vars)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(360)operator(:) +preprocessor(#line) integer(1858) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(vars)operator(\)) operator(=) ident(dyna_push)operator((\);) + operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(num)operator(\)) operator(=) ident(ruby_sourceline)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(361)operator(:) +preprocessor(#line) integer(1862) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(vars)operator(\)) operator(=) ident(ruby_dyna_vars)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(362)operator(:) +preprocessor(#line) integer(1864) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ITER)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) integer(0)operator(,) ident(dyna_init)operator((()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(vars)operator(\)\)\);) + ident(nd_set_line)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(num)operator(\)\);) + ident(dyna_pop)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(vars)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(363)operator(:) +preprocessor(#line) integer(1874) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_WHEN)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(365)operator(:) +preprocessor(#line) integer(1880) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) ident(NEW_WHEN)operator((()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) integer(0)operator(,) integer(0)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(366)operator(:) +preprocessor(#line) integer(1884) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator(()ident(NEW_WHEN)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) integer(0)operator(,) integer(0)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(369)operator(:) +preprocessor(#line) integer(1896) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\)) operator({) + operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)) operator(=) ident(node_assign)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) ident(NEW_GVAR)operator(()ident(rb_intern)operator(()string<delimiter(")content($!)delimiter(")>operator(\)\)\);) + operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_RESBODY)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + ident(fixpos)operator((()ident(yyval)operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)?()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\):()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(371)operator(:) +preprocessor(#line) integer(1908) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(374)operator(:) +preprocessor(#line) integer(1916) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(376)operator(:) +preprocessor(#line) integer(1923) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\)) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + reserved(else) + comment(/* place holder */) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NIL)operator((\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(379)operator(:) +preprocessor(#line) integer(1935) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_LIT)operator(()ident(ID2SYM)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(381)operator(:) +preprocessor(#line) integer(1942) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(NODE) operator(*)ident(node) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\);) + reserved(if) operator((!)ident(node)operator(\)) operator({) + ident(node) operator(=) ident(NEW_STR)operator(()ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(node) operator(=) ident(evstr2dstr)operator(()ident(node)operator(\);) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(node)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(383)operator(:) +preprocessor(#line) integer(1956) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(literal_concat)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(384)operator(:) +preprocessor(#line) integer(1962) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(385)operator(:) +preprocessor(#line) integer(1968) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(NODE) operator(*)ident(node) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + reserved(if) operator((!)ident(node)operator(\)) operator({) + ident(node) operator(=) ident(NEW_XSTR)operator(()ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\)\);) + operator(}) + reserved(else) operator({) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_STR)operator(:) + ident(nd_set_type)operator(()ident(node)operator(,) ident(NODE_XSTR)operator(\);) + reserved(break)operator(;) + reserved(case) label(NODE_DSTR)operator(:) + ident(nd_set_type)operator(()ident(node)operator(,) ident(NODE_DXSTR)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(node) operator(=) ident(NEW_NODE)operator(()ident(NODE_DXSTR)operator(,) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\),) integer(1)operator(,) ident(NEW_LIST)operator(()ident(node)operator(\)\);) + reserved(break)operator(;) + operator(}) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(node)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(386)operator(:) +preprocessor(#line) integer(1991) string<delimiter(")content(parse.y)delimiter(")> + operator({) + pre_type(int) ident(options) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(num)operator(\);) + ident(NODE) operator(*)ident(node) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + reserved(if) operator((!)ident(node)operator(\)) operator({) + ident(node) operator(=) ident(NEW_LIT)operator(()ident(rb_reg_new)operator(()string<delimiter(")delimiter(")>operator(,) integer(0)operator(,) ident(options) operator(&) operator(~)ident(RE_OPTION_ONCE)operator(\)\);) + operator(}) + reserved(else) reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_STR)operator(:) + operator({) + ident(VALUE) ident(src) operator(=) ident(node)operator(->)ident(nd_lit)operator(;) + ident(nd_set_type)operator(()ident(node)operator(,) ident(NODE_LIT)operator(\);) + ident(node)operator(->)ident(nd_lit) operator(=) ident(rb_reg_new)operator(()ident(RSTRING)operator(()ident(src)operator(\)->)ident(ptr)operator(,) + ident(RSTRING)operator(()ident(src)operator(\)->)ident(len)operator(,) + ident(options) operator(&) operator(~)ident(RE_OPTION_ONCE)operator(\);) + operator(}) + reserved(break)operator(;) + reserved(default)operator(:) + ident(node) operator(=) ident(NEW_NODE)operator(()ident(NODE_DSTR)operator(,) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\),) integer(1)operator(,) ident(NEW_LIST)operator(()ident(node)operator(\)\);) + reserved(case) label(NODE_DSTR)operator(:) + reserved(if) operator(()ident(options) operator(&) ident(RE_OPTION_ONCE)operator(\)) operator({) + ident(nd_set_type)operator(()ident(node)operator(,) ident(NODE_DREGX_ONCE)operator(\);) + operator(}) + reserved(else) operator({) + ident(nd_set_type)operator(()ident(node)operator(,) ident(NODE_DREGX)operator(\);) + operator(}) + ident(node)operator(->)ident(nd_cflag) operator(=) ident(options) operator(&) operator(~)ident(RE_OPTION_ONCE)operator(;) + reserved(break)operator(;) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(node)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(387)operator(:) +preprocessor(#line) integer(2024) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ZARRAY)operator((\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(388)operator(:) +preprocessor(#line) integer(2028) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(389)operator(:) +preprocessor(#line) integer(2034) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(390)operator(:) +preprocessor(#line) integer(2038) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) ident(evstr2dstr)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(392)operator(:) +preprocessor(#line) integer(2045) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(literal_concat)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(393)operator(:) +preprocessor(#line) integer(2051) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ZARRAY)operator((\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(394)operator(:) +preprocessor(#line) integer(2055) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(395)operator(:) +preprocessor(#line) integer(2061) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(396)operator(:) +preprocessor(#line) integer(2065) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(397)operator(:) +preprocessor(#line) integer(2071) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(398)operator(:) +preprocessor(#line) integer(2075) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(literal_concat)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(399)operator(:) +preprocessor(#line) integer(2081) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(400)operator(:) +preprocessor(#line) integer(2085) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(literal_concat)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(402)operator(:) +preprocessor(#line) integer(2092) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(lex_strterm)operator(;) + ident(lex_strterm) operator(=) integer(0)operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(403)operator(:) +preprocessor(#line) integer(2098) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(lex_strterm) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_EVSTR)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(404)operator(:) +preprocessor(#line) integer(2103) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(lex_strterm)operator(;) + ident(lex_strterm) operator(=) integer(0)operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + ident(COND_PUSH)operator(()integer(0)operator(\);) + ident(CMDARG_PUSH)operator(()integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(405)operator(:) +preprocessor(#line) integer(2111) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(lex_strterm) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\);) + ident(COND_LEXPOP)operator((\);) + ident(CMDARG_LEXPOP)operator((\);) + reserved(if) operator(((()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\)) operator(&&) ident(nd_type)operator((()ident(yyval)operator(.)ident(node)operator(\)\)) operator(==) ident(NODE_NEWLINE)operator(\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_next)operator(;) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\)()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(new_evstr)operator((()ident(yyval)operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(406)operator(:) +preprocessor(#line) integer(2123) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_GVAR)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\)\);}) + reserved(break)operator(;) + + reserved(case) integer(407)operator(:) +preprocessor(#line) integer(2124) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_IVAR)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\)\);}) + reserved(break)operator(;) + + reserved(case) integer(408)operator(:) +preprocessor(#line) integer(2125) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_CVAR)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\)\);}) + reserved(break)operator(;) + + reserved(case) integer(410)operator(:) +preprocessor(#line) integer(2130) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + operator(()ident(yyval)operator(.)ident(id)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(415)operator(:) +preprocessor(#line) integer(2143) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + reserved(if) operator((!(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\)\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NIL)operator((\);) + ident(yyerror)operator(()string<delimiter(")content(empty symbol literal)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(lit)operator(;) + + reserved(switch) operator(()ident(nd_type)operator((()ident(yyval)operator(.)ident(node)operator(\)\)\)) operator({) + reserved(case) label(NODE_DSTR)operator(:) + ident(nd_set_type)operator((()ident(yyval)operator(.)ident(node)operator(\),) ident(NODE_DSYM)operator(\);) + reserved(break)operator(;) + reserved(case) label(NODE_STR)operator(:) + ident(lit) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_lit)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(lit)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(empty symbol literal)delimiter(")>operator(\);) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(strlen)operator(()ident(RSTRING)operator(()ident(lit)operator(\)->)ident(ptr)operator(\)) operator(==) ident(RSTRING)operator(()ident(lit)operator(\)->)ident(len)operator(\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_lit) operator(=) ident(ID2SYM)operator(()ident(rb_intern)operator(()ident(RSTRING)operator((()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_lit)operator(\)->)ident(ptr)operator(\)\);) + ident(nd_set_type)operator((()ident(yyval)operator(.)ident(node)operator(\),) ident(NODE_LIT)operator(\);) + reserved(break)operator(;) + operator(}) + comment(/* fall through */) + reserved(default)operator(:) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NODE)operator(()ident(NODE_DSYM)operator(,) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\),) integer(1)operator(,) ident(NEW_LIST)operator((()ident(yyval)operator(.)ident(node)operator(\)\)\);) + reserved(break)operator(;) + operator(}) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(418)operator(:) +preprocessor(#line) integer(2179) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(negate_lit)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(419)operator(:) +preprocessor(#line) integer(2183) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(negate_lit)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(425)operator(:) +preprocessor(#line) integer(2193) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(kNIL)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(426)operator(:) +preprocessor(#line) integer(2194) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(kSELF)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(427)operator(:) +preprocessor(#line) integer(2195) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(kTRUE)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(428)operator(:) +preprocessor(#line) integer(2196) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(kFALSE)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(429)operator(:) +preprocessor(#line) integer(2197) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(k__FILE__)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(430)operator(:) +preprocessor(#line) integer(2198) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(id)operator(\)) operator(=) ident(k__LINE__)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(431)operator(:) +preprocessor(#line) integer(2202) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(gettable)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(432)operator(:) +preprocessor(#line) integer(2208) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(assignable)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(435)operator(:) +preprocessor(#line) integer(2218) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(436)operator(:) +preprocessor(#line) integer(2222) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(437)operator(:) +preprocessor(#line) integer(2226) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(438)operator(:) +preprocessor(#line) integer(2229) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(yyerrok)operator(;) operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(439)operator(:) +preprocessor(#line) integer(2233) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\);) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + ident(command_start) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(440)operator(:) +preprocessor(#line) integer(2239) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(441)operator(:) +preprocessor(#line) integer(2245) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator(()ident(NEW_ARGS)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(num)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(5)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(6)operator(\)) operator(-) operator(()integer(6)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(442)operator(:) +preprocessor(#line) integer(2249) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator(()ident(NEW_ARGS)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(num)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) integer(0)operator(\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(443)operator(:) +preprocessor(#line) integer(2253) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator(()ident(NEW_ARGS)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(num)operator(\),) integer(0)operator(,) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(444)operator(:) +preprocessor(#line) integer(2257) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator(()ident(NEW_ARGS)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(num)operator(\),) integer(0)operator(,) integer(0)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(445)operator(:) +preprocessor(#line) integer(2261) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator(()ident(NEW_ARGS)operator(()integer(0)operator(,) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(4)operator(\)) operator(-) operator(()integer(4)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(446)operator(:) +preprocessor(#line) integer(2265) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator(()ident(NEW_ARGS)operator(()integer(0)operator(,) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\),) integer(0)operator(\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(447)operator(:) +preprocessor(#line) integer(2269) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator(()ident(NEW_ARGS)operator(()integer(0)operator(,) integer(0)operator(,) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(448)operator(:) +preprocessor(#line) integer(2273) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator(()ident(NEW_ARGS)operator(()integer(0)operator(,) integer(0)operator(,) integer(0)operator(\),) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(449)operator(:) +preprocessor(#line) integer(2277) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_ARGS)operator(()integer(0)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(450)operator(:) +preprocessor(#line) integer(2283) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(yyerror)operator(()string<delimiter(")content(formal argument cannot be a constant)delimiter(")>operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(451)operator(:) +preprocessor(#line) integer(2287) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(yyerror)operator(()string<delimiter(")content(formal argument cannot be an instance variable)delimiter(")>operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(452)operator(:) +preprocessor(#line) integer(2291) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(yyerror)operator(()string<delimiter(")content(formal argument cannot be a global variable)delimiter(")>operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(453)operator(:) +preprocessor(#line) integer(2295) string<delimiter(")content(parse.y)delimiter(")> + operator({) + ident(yyerror)operator(()string<delimiter(")content(formal argument cannot be a class variable)delimiter(")>operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(454)operator(:) +preprocessor(#line) integer(2299) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((!)ident(is_local_id)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\)\)\)) + ident(yyerror)operator(()string<delimiter(")content(formal argument must be local variable)delimiter(")>operator(\);) + reserved(else) reserved(if) operator(()ident(local_id)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\)\)\)) + ident(yyerror)operator(()string<delimiter(")content(duplicate argument name)delimiter(")>operator(\);) + ident(local_cnt)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(id)operator(\)\);) + operator(()ident(yyval)operator(.)ident(num)operator(\)) operator(=) integer(1)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(456)operator(:) +preprocessor(#line) integer(2311) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(num)operator(\)) operator(+=) integer(1)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(457)operator(:) +preprocessor(#line) integer(2317) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((!)ident(is_local_id)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\)\)) + ident(yyerror)operator(()string<delimiter(")content(formal argument must be local variable)delimiter(")>operator(\);) + reserved(else) reserved(if) operator(()ident(local_id)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\)\)\)) + ident(yyerror)operator(()string<delimiter(")content(duplicate optional argument name)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(assignable)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(id)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(458)operator(:) +preprocessor(#line) integer(2327) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_BLOCK)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\)\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)->)ident(nd_end) operator(=) operator(()ident(yyval)operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(459)operator(:) +preprocessor(#line) integer(2332) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(block_append)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(462)operator(:) +preprocessor(#line) integer(2342) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((!)ident(is_local_id)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\)\)\)) + ident(yyerror)operator(()string<delimiter(")content(rest argument must be local variable)delimiter(")>operator(\);) + reserved(else) reserved(if) operator(()ident(local_id)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\)\)\)) + ident(yyerror)operator(()string<delimiter(")content(duplicate rest argument name)delimiter(")>operator(\);) + reserved(if) operator(()ident(dyna_in_block)operator((\)\)) operator({) + ident(rb_dvar_push)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\),) ident(Qnil)operator(\);) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(assignable)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(463)operator(:) +preprocessor(#line) integer(2353) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator(()ident(dyna_in_block)operator((\)\)) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_DASGN_CURR)operator(()ident(internal_id)operator((\),) integer(0)operator(\);) + operator(}) + reserved(else) operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_NODE)operator(()ident(NODE_LASGN)operator(,)integer(0)operator(,)integer(0)operator(,)ident(local_append)operator(()integer(0)operator(\)\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(466)operator(:) +preprocessor(#line) integer(2368) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((!)ident(is_local_id)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\)\)\)) + ident(yyerror)operator(()string<delimiter(")content(block argument must be local variable)delimiter(")>operator(\);) + reserved(else) reserved(if) operator(()ident(local_id)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\)\)\)) + ident(yyerror)operator(()string<delimiter(")content(duplicate block argument name)delimiter(")>operator(\);) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(NEW_BLOCK_ARG)operator((()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(id)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(467)operator(:) +preprocessor(#line) integer(2378) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(2)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(469)operator(:) +preprocessor(#line) integer(2385) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(1)operator(\)])operator(.)ident(node)operator(\);) + ident(value_expr)operator((()ident(yyval)operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(470)operator(:) +preprocessor(#line) integer(2389) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(lex_state) operator(=) ident(EXPR_BEG)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(471)operator(:) +preprocessor(#line) integer(2390) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(can't define singleton method for (\).)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + reserved(switch) operator(()ident(nd_type)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\)\)) operator({) + reserved(case) label(NODE_STR)operator(:) + reserved(case) label(NODE_DSTR)operator(:) + reserved(case) label(NODE_XSTR)operator(:) + reserved(case) label(NODE_DXSTR)operator(:) + reserved(case) label(NODE_DREGX)operator(:) + reserved(case) label(NODE_LIT)operator(:) + reserved(case) label(NODE_ARRAY)operator(:) + reserved(case) label(NODE_ZARRAY)operator(:) + ident(yyerror)operator(()string<delimiter(")content(can't define singleton method for literals)delimiter(")>operator(\);) + reserved(default)operator(:) + ident(value_expr)operator((()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\)\);) + reserved(break)operator(;) + operator(}) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(5)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(473)operator(:) +preprocessor(#line) integer(2416) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(474)operator(:) +preprocessor(#line) integer(2420) string<delimiter(")content(parse.y)delimiter(")> + operator({) + reserved(if) operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\)->)ident(nd_alen)operator(%)integer(2) operator(!=) integer(0)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(odd number list for Hash)delimiter(")>operator(\);) + operator(}) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) operator(()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(2)operator(\)])operator(.)ident(node)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(476)operator(:) +preprocessor(#line) integer(2430) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_concat)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(477)operator(:) +preprocessor(#line) integer(2436) string<delimiter(")content(parse.y)delimiter(")> + operator({) + operator(()ident(yyval)operator(.)ident(node)operator(\)) operator(=) ident(list_append)operator(()ident(NEW_LIST)operator((()ident(yyvsp)operator([()integer(1)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\),) operator(()ident(yyvsp)operator([()integer(3)operator(\)) operator(-) operator(()integer(3)operator(\)])operator(.)ident(node)operator(\)\);) + operator(}) + reserved(break)operator(;) + + reserved(case) integer(497)operator(:) +preprocessor(#line) integer(2474) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(yyerrok)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(500)operator(:) +preprocessor(#line) integer(2479) string<delimiter(")content(parse.y)delimiter(")> + operator({)ident(yyerrok)operator(;}) + reserved(break)operator(;) + + reserved(case) integer(501)operator(:) +preprocessor(#line) integer(2482) string<delimiter(")content(parse.y)delimiter(")> + operator({()ident(yyval)operator(.)ident(node)operator(\)) operator(=) integer(0)operator(;}) + reserved(break)operator(;) + + +comment(/* Line 1267 of yacc.c. */) +preprocessor(#line) integer(7259) string<delimiter(")content(parse.c)delimiter(")> + reserved(default)operator(:) reserved(break)operator(;) + operator(}) + ident(YY_SYMBOL_PRINT) operator(()string<delimiter(")content(-> $$ =)delimiter(")>operator(,) ident(yyr1)operator([)ident(yyn)operator(],) operator(&)ident(yyval)operator(,) operator(&)ident(yyloc)operator(\);) + + ident(YYPOPSTACK) operator(()ident(yylen)operator(\);) + ident(yylen) operator(=) integer(0)operator(;) + ident(YY_STACK_PRINT) operator(()ident(yyss)operator(,) ident(yyssp)operator(\);) + + operator(*++)ident(yyvsp) operator(=) ident(yyval)operator(;) + + + comment(/* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */) + + ident(yyn) operator(=) ident(yyr1)operator([)ident(yyn)operator(];) + + ident(yystate) operator(=) ident(yypgoto)operator([)ident(yyn) operator(-) ident(YYNTOKENS)operator(]) operator(+) operator(*)ident(yyssp)operator(;) + reserved(if) operator(()integer(0) operator(<=) ident(yystate) operator(&&) ident(yystate) operator(<=) ident(YYLAST) operator(&&) ident(yycheck)operator([)ident(yystate)operator(]) operator(==) operator(*)ident(yyssp)operator(\)) + ident(yystate) operator(=) ident(yytable)operator([)ident(yystate)operator(];) + reserved(else) + ident(yystate) operator(=) ident(yydefgoto)operator([)ident(yyn) operator(-) ident(YYNTOKENS)operator(];) + + reserved(goto) ident(yynewstate)operator(;) + + +comment(/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/) +label(yyerrlab)operator(:) + comment(/* If not already recovering from an error, report this error. */) + reserved(if) operator((!)ident(yyerrstatus)operator(\)) + operator({) + operator(++)ident(yynerrs)operator(;) +preprocessor(#if) operator(!) ident(YYERROR_VERBOSE) + ident(yyerror) operator(()ident(YY_)operator(()string<delimiter(")content(syntax error)delimiter(")>operator(\)\);) +preprocessor(#else) + operator({) + ident(YYSIZE_T) ident(yysize) operator(=) ident(yysyntax_error) operator(()integer(0)operator(,) ident(yystate)operator(,) ident(yychar)operator(\);) + reserved(if) operator(()ident(yymsg_alloc) operator(<) ident(yysize) operator(&&) ident(yymsg_alloc) operator(<) ident(YYSTACK_ALLOC_MAXIMUM)operator(\)) + operator({) + ident(YYSIZE_T) ident(yyalloc) operator(=) integer(2) operator(*) ident(yysize)operator(;) + reserved(if) operator((!) operator(()ident(yysize) operator(<=) ident(yyalloc) operator(&&) ident(yyalloc) operator(<=) ident(YYSTACK_ALLOC_MAXIMUM)operator(\)\)) + ident(yyalloc) operator(=) ident(YYSTACK_ALLOC_MAXIMUM)operator(;) + reserved(if) operator(()ident(yymsg) operator(!=) ident(yymsgbuf)operator(\)) + ident(YYSTACK_FREE) operator(()ident(yymsg)operator(\);) + ident(yymsg) operator(=) operator(()pre_type(char) operator(*\)) ident(YYSTACK_ALLOC) operator(()ident(yyalloc)operator(\);) + reserved(if) operator(()ident(yymsg)operator(\)) + ident(yymsg_alloc) operator(=) ident(yyalloc)operator(;) + reserved(else) + operator({) + ident(yymsg) operator(=) ident(yymsgbuf)operator(;) + ident(yymsg_alloc) operator(=) reserved(sizeof) ident(yymsgbuf)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()integer(0) operator(<) ident(yysize) operator(&&) ident(yysize) operator(<=) ident(yymsg_alloc)operator(\)) + operator({) + operator(()directive(void)operator(\)) ident(yysyntax_error) operator(()ident(yymsg)operator(,) ident(yystate)operator(,) ident(yychar)operator(\);) + ident(yyerror) operator(()ident(yymsg)operator(\);) + operator(}) + reserved(else) + operator({) + ident(yyerror) operator(()ident(YY_)operator(()string<delimiter(")content(syntax error)delimiter(")>operator(\)\);) + reserved(if) operator(()ident(yysize) operator(!=) integer(0)operator(\)) + reserved(goto) ident(yyexhaustedlab)operator(;) + operator(}) + operator(}) +preprocessor(#endif) + operator(}) + + + + reserved(if) operator(()ident(yyerrstatus) operator(==) integer(3)operator(\)) + operator({) + comment(/* If just tried and failed to reuse look-ahead token after an + error, discard it. */) + + reserved(if) operator(()ident(yychar) operator(<=) ident(YYEOF)operator(\)) + operator({) + comment(/* Return failure if at end of input. */) + reserved(if) operator(()ident(yychar) operator(==) ident(YYEOF)operator(\)) + ident(YYABORT)operator(;) + operator(}) + reserved(else) + operator({) + ident(yydestruct) operator(()string<delimiter(")content(Error: discarding)delimiter(")>operator(,) + ident(yytoken)operator(,) operator(&)ident(yylval)operator(\);) + ident(yychar) operator(=) ident(YYEMPTY)operator(;) + operator(}) + operator(}) + + comment(/* Else will try to reuse look-ahead token after shifting the error + token. */) + reserved(goto) ident(yyerrlab1)operator(;) + + +comment(/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/) +label(yyerrorlab)operator(:) + + comment(/* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */) + reserved(if) operator(()comment(/*CONSTCOND*/) integer(0)operator(\)) + reserved(goto) ident(yyerrorlab)operator(;) + + comment(/* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */) + ident(YYPOPSTACK) operator(()ident(yylen)operator(\);) + ident(yylen) operator(=) integer(0)operator(;) + ident(YY_STACK_PRINT) operator(()ident(yyss)operator(,) ident(yyssp)operator(\);) + ident(yystate) operator(=) operator(*)ident(yyssp)operator(;) + reserved(goto) ident(yyerrlab1)operator(;) + + +comment(/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/) +label(yyerrlab1)operator(:) + ident(yyerrstatus) operator(=) integer(3)operator(;) comment(/* Each real token shifted decrements this. */) + + reserved(for) operator((;;\)) + operator({) + ident(yyn) operator(=) ident(yypact)operator([)ident(yystate)operator(];) + reserved(if) operator(()ident(yyn) operator(!=) ident(YYPACT_NINF)operator(\)) + operator({) + ident(yyn) operator(+=) ident(YYTERROR)operator(;) + reserved(if) operator(()integer(0) operator(<=) ident(yyn) operator(&&) ident(yyn) operator(<=) ident(YYLAST) operator(&&) ident(yycheck)operator([)ident(yyn)operator(]) operator(==) ident(YYTERROR)operator(\)) + operator({) + ident(yyn) operator(=) ident(yytable)operator([)ident(yyn)operator(];) + reserved(if) operator(()integer(0) operator(<) ident(yyn)operator(\)) + reserved(break)operator(;) + operator(}) + operator(}) + + comment(/* Pop the current state because it cannot handle the error token. */) + reserved(if) operator(()ident(yyssp) operator(==) ident(yyss)operator(\)) + ident(YYABORT)operator(;) + + + ident(yydestruct) operator(()string<delimiter(")content(Error: popping)delimiter(")>operator(,) + ident(yystos)operator([)ident(yystate)operator(],) ident(yyvsp)operator(\);) + ident(YYPOPSTACK) operator(()integer(1)operator(\);) + ident(yystate) operator(=) operator(*)ident(yyssp)operator(;) + ident(YY_STACK_PRINT) operator(()ident(yyss)operator(,) ident(yyssp)operator(\);) + operator(}) + + reserved(if) operator(()ident(yyn) operator(==) ident(YYFINAL)operator(\)) + ident(YYACCEPT)operator(;) + + operator(*++)ident(yyvsp) operator(=) ident(yylval)operator(;) + + + comment(/* Shift the error token. */) + ident(YY_SYMBOL_PRINT) operator(()string<delimiter(")content(Shifting)delimiter(")>operator(,) ident(yystos)operator([)ident(yyn)operator(],) ident(yyvsp)operator(,) ident(yylsp)operator(\);) + + ident(yystate) operator(=) ident(yyn)operator(;) + reserved(goto) ident(yynewstate)operator(;) + + +comment(/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/) +label(yyacceptlab)operator(:) + ident(yyresult) operator(=) integer(0)operator(;) + reserved(goto) ident(yyreturn)operator(;) + +comment(/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/) +label(yyabortlab)operator(:) + ident(yyresult) operator(=) integer(1)operator(;) + reserved(goto) ident(yyreturn)operator(;) + +preprocessor(#ifndef) ident(yyoverflow) +comment(/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/) +label(yyexhaustedlab)operator(:) + ident(yyerror) operator(()ident(YY_)operator(()string<delimiter(")content(memory exhausted)delimiter(")>operator(\)\);) + ident(yyresult) operator(=) integer(2)operator(;) + comment(/* Fall through. */) +preprocessor(#endif) + +label(yyreturn)operator(:) + reserved(if) operator(()ident(yychar) operator(!=) ident(YYEOF) operator(&&) ident(yychar) operator(!=) ident(YYEMPTY)operator(\)) + ident(yydestruct) operator(()string<delimiter(")content(Cleanup: discarding lookahead)delimiter(")>operator(,) + ident(yytoken)operator(,) operator(&)ident(yylval)operator(\);) + comment(/* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */) + ident(YYPOPSTACK) operator(()ident(yylen)operator(\);) + ident(YY_STACK_PRINT) operator(()ident(yyss)operator(,) ident(yyssp)operator(\);) + reserved(while) operator(()ident(yyssp) operator(!=) ident(yyss)operator(\)) + operator({) + ident(yydestruct) operator(()string<delimiter(")content(Cleanup: popping)delimiter(")>operator(,) + ident(yystos)operator([*)ident(yyssp)operator(],) ident(yyvsp)operator(\);) + ident(YYPOPSTACK) operator(()integer(1)operator(\);) + operator(}) +preprocessor(#ifndef) ident(yyoverflow) + reserved(if) operator(()ident(yyss) operator(!=) ident(yyssa)operator(\)) + ident(YYSTACK_FREE) operator(()ident(yyss)operator(\);) +preprocessor(#endif) +preprocessor(#if) ident(YYERROR_VERBOSE) + reserved(if) operator(()ident(yymsg) operator(!=) ident(yymsgbuf)operator(\)) + ident(YYSTACK_FREE) operator(()ident(yymsg)operator(\);) +preprocessor(#endif) + comment(/* Make sure YYID is used. */) + reserved(return) ident(YYID) operator(()ident(yyresult)operator(\);) +operator(}) + + +preprocessor(#line) integer(2484) string<delimiter(")content(parse.y)delimiter(")> + +preprocessor(#ifdef) ident(yystacksize) +preprocessor(#undef) ident(YYMALLOC) +preprocessor(#endif) + +preprocessor(#include) include("regex.h") +preprocessor(#include) include("util.h") + +comment(/* We remove any previous definition of `SIGN_EXTEND_CHAR', + since ours (we hope\) works properly with all combinations of + machines, compilers, `char' and `unsigned char' argument types. + (Per Bothner suggested the basic approach.\) */) +preprocessor(#undef) ident(SIGN_EXTEND_CHAR) +preprocessor(#if) ident(__STDC__) +preprocessor(# define) ident(SIGN_EXTEND_CHAR)operator(()ident(c)operator(\)) operator((()pre_type(signed) pre_type(char)operator(\)()ident(c)operator(\)\)) +preprocessor(#else) comment(/* not __STDC__ */) +comment(/* As in Harbison and Steele. */) +preprocessor(# define) ident(SIGN_EXTEND_CHAR)operator(()ident(c)operator(\)) operator((((()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)) operator(^) integer(128)operator(\)) operator(-) integer(128)operator(\)) +preprocessor(#endif) +preprocessor(#define) ident(is_identchar)operator(()ident(c)operator(\)) operator(()ident(SIGN_EXTEND_CHAR)operator(()ident(c)operator(\)!=-)integer(1)operator(&&()ident(ISALNUM)operator(()ident(c)operator(\)) operator(||) operator(()ident(c)operator(\)) operator(==) char('_') operator(||) ident(ismbchar)operator(()ident(c)operator(\)\)\)) + +directive(static) pre_type(char) operator(*)ident(tokenbuf) operator(=) pre_constant(NULL)operator(;) +directive(static) pre_type(int) ident(tokidx)operator(,) ident(toksiz) operator(=) integer(0)operator(;) + +preprocessor(#define) ident(LEAVE_BS) integer(1) + +directive(static) ident(VALUE) operator((*)ident(lex_gets)operator(\)(\);) comment(/* gets function */) +directive(static) ident(VALUE) ident(lex_input)operator(;) comment(/* non-nil if File */) +directive(static) ident(VALUE) ident(lex_lastline)operator(;) comment(/* gc protect */) +directive(static) pre_type(char) operator(*)ident(lex_pbeg)operator(;) +directive(static) pre_type(char) operator(*)ident(lex_p)operator(;) +directive(static) pre_type(char) operator(*)ident(lex_pend)operator(;) + +directive(static) pre_type(int) +ident(yyerror)operator(()ident(msg)operator(\)) + directive(const) pre_type(char) operator(*)ident(msg)operator(;) +operator({) + directive(const) pre_type(int) ident(max_line_margin) operator(=) integer(30)operator(;) + directive(const) pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pe)operator(;) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(int) ident(len)operator(,) ident(i)operator(;) + + ident(rb_compile_error)operator(()string<delimiter(")content(%s)delimiter(")>operator(,) ident(msg)operator(\);) + ident(p) operator(=) ident(lex_p)operator(;) + reserved(while) operator(()ident(lex_pbeg) operator(<=) ident(p)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('\\n')operator(\)) reserved(break)operator(;) + ident(p)operator(--;) + operator(}) + ident(p)operator(++;) + + ident(pe) operator(=) ident(lex_p)operator(;) + reserved(while) operator(()ident(pe) operator(<) ident(lex_pend)operator(\)) operator({) + reserved(if) operator((*)ident(pe) operator(==) char('\\n')operator(\)) reserved(break)operator(;) + ident(pe)operator(++;) + operator(}) + + ident(len) operator(=) ident(pe) operator(-) ident(p)operator(;) + reserved(if) operator(()ident(len) operator(>) integer(4)operator(\)) operator({) + pre_type(char) operator(*)ident(p2)operator(;) + directive(const) pre_type(char) operator(*)ident(pre) operator(=) string<delimiter(")delimiter(")>operator(,) operator(*)ident(post) operator(=) string<delimiter(")delimiter(")>operator(;) + + reserved(if) operator(()ident(len) operator(>) ident(max_line_margin) operator(*) integer(2) operator(+) integer(10)operator(\)) operator({) + pre_type(int) ident(re_mbc_startpos) ident(_)operator((()directive(const) pre_type(char) operator(*,) pre_type(int)operator(,) pre_type(int)operator(,) pre_type(int)operator(\)\);) + reserved(if) operator((()ident(len) operator(=) ident(lex_p) operator(-) ident(p)operator(\)) operator(>) ident(max_line_margin)operator(\)) operator({) + ident(p) operator(=) ident(p) operator(+) ident(re_mbc_startpos)operator(()ident(p)operator(,) ident(len)operator(,) ident(len) operator(-) ident(max_line_margin)operator(,) integer(0)operator(\);) + ident(pre) operator(=) string<delimiter(")content(...)delimiter(")>operator(;) + operator(}) + reserved(if) operator((()ident(len) operator(=) ident(pe) operator(-) ident(lex_p)operator(\)) operator(>) ident(max_line_margin)operator(\)) operator({) + ident(pe) operator(=) ident(lex_p) operator(+) ident(re_mbc_startpos)operator(()ident(lex_p)operator(,) ident(len)operator(,) ident(max_line_margin)operator(,) integer(1)operator(\);) + ident(post) operator(=) string<delimiter(")content(...)delimiter(")>operator(;) + operator(}) + ident(len) operator(=) ident(pe) operator(-) ident(p)operator(;) + operator(}) + ident(buf) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(len)operator(+)integer(2)operator(\);) + ident(MEMCPY)operator(()ident(buf)operator(,) ident(p)operator(,) pre_type(char)operator(,) ident(len)operator(\);) + ident(buf)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) + ident(rb_compile_error_append)operator(()string<delimiter(")content(%s%s%s)delimiter(")>operator(,) ident(pre)operator(,) ident(buf)operator(,) ident(post)operator(\);) + + ident(i) operator(=) ident(lex_p) operator(-) ident(p)operator(;) + ident(p2) operator(=) ident(buf)operator(;) ident(pe) operator(=) ident(buf) operator(+) ident(len)operator(;) + + reserved(while) operator(()ident(p2) operator(<) ident(pe)operator(\)) operator({) + reserved(if) operator((*)ident(p2) operator(!=) char('\\t')operator(\)) operator(*)ident(p2) operator(=) char(' ')operator(;) + ident(p2)operator(++;) + operator(}) + ident(buf)operator([)ident(i)operator(]) operator(=) char('^')operator(;) + ident(buf)operator([)ident(i)operator(+)integer(1)operator(]) operator(=) char('\\0')operator(;) + ident(rb_compile_error_append)operator(()string<delimiter(")content(%s)delimiter(")>operator(,) ident(buf)operator(\);) + operator(}) + + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) pre_type(int) ident(heredoc_end)operator(;) + +pre_type(int) ident(ruby_in_compile) operator(=) integer(0)operator(;) +pre_type(int) ident(ruby__end__seen)operator(;) + +directive(static) ident(VALUE) ident(ruby_debug_lines)operator(;) +preprocessor(#ifdef) ident(YYMALLOC) +directive(static) ident(NODE) operator(*)ident(parser_heap)operator(;) +preprocessor(#endif) + +directive(static) ident(NODE)operator(*) +ident(yycompile)operator(()ident(f)operator(,) ident(line)operator(\)) + pre_type(char) operator(*)ident(f)operator(;) + pre_type(int) ident(line)operator(;) +operator({) + pre_type(int) ident(n)operator(;) + ident(NODE) operator(*)ident(node) operator(=) integer(0)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(vp)operator(,) operator(*)ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + + ident(ruby_in_compile) operator(=) integer(1)operator(;) + reserved(if) operator((!)ident(compile_for_eval) operator(&&) ident(rb_safe_level)operator((\)) operator(==) integer(0) operator(&&) + ident(rb_const_defined)operator(()ident(rb_cObject)operator(,) ident(rb_intern)operator(()string<delimiter(")content(SCRIPT_LINES__)delimiter(")>operator(\)\)\)) operator({) + ident(VALUE) ident(hash)operator(,) ident(fname)operator(;) + + ident(hash) operator(=) ident(rb_const_get)operator(()ident(rb_cObject)operator(,) ident(rb_intern)operator(()string<delimiter(")content(SCRIPT_LINES__)delimiter(")>operator(\)\);) + reserved(if) operator(()ident(TYPE)operator(()ident(hash)operator(\)) operator(==) ident(T_HASH)operator(\)) operator({) + ident(fname) operator(=) ident(rb_str_new2)operator(()ident(f)operator(\);) + ident(ruby_debug_lines) operator(=) ident(rb_ary_new)operator((\);) + ident(rb_hash_aset)operator(()ident(hash)operator(,) ident(fname)operator(,) ident(ruby_debug_lines)operator(\);) + operator(}) + reserved(if) operator(()ident(line) operator(>) integer(1)operator(\)) operator({) + ident(VALUE) ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,)integer(0)operator(\);) + reserved(while) operator(()ident(line) operator(>) integer(1)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ruby_debug_lines)operator(,) ident(str)operator(\);) + ident(line)operator(--;) + operator(}) + operator(}) + operator(}) + + ident(ruby__end__seen) operator(=) integer(0)operator(;) + ident(ruby_eval_tree) operator(=) integer(0)operator(;) + ident(ruby_eval_tree_begin) operator(=) integer(0)operator(;) + ident(heredoc_end) operator(=) integer(0)operator(;) + ident(lex_strterm) operator(=) integer(0)operator(;) + ident(ruby_current_node) operator(=) integer(0)operator(;) + ident(ruby_sourcefile) operator(=) ident(rb_source_filename)operator(()ident(f)operator(\);) + ident(deferred_nodes) operator(=) integer(0)operator(;) + ident(n) operator(=) ident(yyparse)operator((\);) + ident(ruby_debug_lines) operator(=) integer(0)operator(;) + ident(compile_for_eval) operator(=) integer(0)operator(;) + ident(ruby_in_compile) operator(=) integer(0)operator(;) + ident(cond_stack) operator(=) integer(0)operator(;) + ident(cmdarg_stack) operator(=) integer(0)operator(;) + ident(command_start) operator(=) integer(1)operator(;) + ident(class_nest) operator(=) integer(0)operator(;) + ident(in_single) operator(=) integer(0)operator(;) + ident(in_def) operator(=) integer(0)operator(;) + ident(cur_mid) operator(=) integer(0)operator(;) + ident(deferred_nodes) operator(=) integer(0)operator(;) + + ident(vp) operator(=) ident(ruby_dyna_vars)operator(;) + ident(ruby_dyna_vars) operator(=) ident(vars)operator(;) + ident(lex_strterm) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(vp) operator(&&) ident(vp) operator(!=) ident(vars)operator(\)) operator({) + reserved(struct) ident(RVarmap) operator(*)ident(tmp) operator(=) ident(vp)operator(;) + ident(vp) operator(=) ident(vp)operator(->)ident(next)operator(;) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(tmp)operator(\);) + operator(}) + reserved(if) operator(()ident(n) operator(==) integer(0)operator(\)) ident(node) operator(=) ident(ruby_eval_tree)operator(;) + reserved(if) operator(()ident(ruby_nerrs)operator(\)) ident(ruby_eval_tree_begin) operator(=) integer(0)operator(;) + reserved(return) ident(node)operator(;) +operator(}) + +directive(static) pre_type(int) ident(lex_gets_ptr)operator(;) + +directive(static) ident(VALUE) +ident(lex_get_str)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + pre_type(char) operator(*)ident(beg)operator(,) operator(*)ident(end)operator(,) operator(*)ident(pend)operator(;) + + ident(beg) operator(=) ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(lex_gets_ptr)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(s)operator(\)->)ident(len) operator(==) ident(lex_gets_ptr)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(beg) operator(+=) ident(lex_gets_ptr)operator(;) + operator(}) + ident(pend) operator(=) ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr) operator(+) ident(RSTRING)operator(()ident(s)operator(\)->)ident(len)operator(;) + ident(end) operator(=) ident(beg)operator(;) + reserved(while) operator(()ident(end) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator((*)ident(end)operator(++) operator(==) char('\\n')operator(\)) reserved(break)operator(;) + operator(}) + ident(lex_gets_ptr) operator(=) ident(end) operator(-) ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr)operator(;) + reserved(return) ident(rb_str_new)operator(()ident(beg)operator(,) ident(end) operator(-) ident(beg)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(lex_getline)operator((\)) +operator({) + ident(VALUE) ident(line) operator(=) operator((*)ident(lex_gets)operator(\)()ident(lex_input)operator(\);) + reserved(if) operator(()ident(ruby_debug_lines) operator(&&) operator(!)ident(NIL_P)operator(()ident(line)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(ruby_debug_lines)operator(,) ident(line)operator(\);) + operator(}) + reserved(return) ident(line)operator(;) +operator(}) + +ident(NODE)operator(*) +ident(rb_compile_string)operator(()ident(f)operator(,) ident(s)operator(,) ident(line)operator(\)) + directive(const) pre_type(char) operator(*)ident(f)operator(;) + ident(VALUE) ident(s)operator(;) + pre_type(int) ident(line)operator(;) +operator({) + ident(lex_gets) operator(=) ident(lex_get_str)operator(;) + ident(lex_gets_ptr) operator(=) integer(0)operator(;) + ident(lex_input) operator(=) ident(s)operator(;) + ident(lex_pbeg) operator(=) ident(lex_p) operator(=) ident(lex_pend) operator(=) integer(0)operator(;) + ident(ruby_sourceline) operator(=) ident(line) operator(-) integer(1)operator(;) + ident(compile_for_eval) operator(=) ident(ruby_in_eval)operator(;) + + reserved(return) ident(yycompile)operator(()ident(f)operator(,) ident(line)operator(\);) +operator(}) + +ident(NODE)operator(*) +ident(rb_compile_cstr)operator(()ident(f)operator(,) ident(s)operator(,) ident(len)operator(,) ident(line)operator(\)) + directive(const) pre_type(char) operator(*)ident(f)operator(,) operator(*)ident(s)operator(;) + pre_type(int) ident(len)operator(,) ident(line)operator(;) +operator({) + reserved(return) ident(rb_compile_string)operator(()ident(f)operator(,) ident(rb_str_new)operator(()ident(s)operator(,) ident(len)operator(\),) ident(line)operator(\);) +operator(}) + +ident(NODE)operator(*) +ident(rb_compile_file)operator(()ident(f)operator(,) ident(file)operator(,) ident(start)operator(\)) + directive(const) pre_type(char) operator(*)ident(f)operator(;) + ident(VALUE) ident(file)operator(;) + pre_type(int) ident(start)operator(;) +operator({) + ident(lex_gets) operator(=) ident(rb_io_gets)operator(;) + ident(lex_input) operator(=) ident(file)operator(;) + ident(lex_pbeg) operator(=) ident(lex_p) operator(=) ident(lex_pend) operator(=) integer(0)operator(;) + ident(ruby_sourceline) operator(=) ident(start) operator(-) integer(1)operator(;) + + reserved(return) ident(yycompile)operator(()ident(f)operator(,) ident(start)operator(\);) +operator(}) + +directive(static) directive(inline) pre_type(int) +ident(nextc)operator((\)) +operator({) + pre_type(int) ident(c)operator(;) + + reserved(if) operator(()ident(lex_p) operator(==) ident(lex_pend)operator(\)) operator({) + reserved(if) operator(()ident(lex_input)operator(\)) operator({) + ident(VALUE) ident(v) operator(=) ident(lex_getline)operator((\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(v)operator(\)\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator(()ident(heredoc_end) operator(>) integer(0)operator(\)) operator({) + ident(ruby_sourceline) operator(=) ident(heredoc_end)operator(;) + ident(heredoc_end) operator(=) integer(0)operator(;) + operator(}) + ident(ruby_sourceline)operator(++;) + ident(lex_pbeg) operator(=) ident(lex_p) operator(=) ident(RSTRING)operator(()ident(v)operator(\)->)ident(ptr)operator(;) + ident(lex_pend) operator(=) ident(lex_p) operator(+) ident(RSTRING)operator(()ident(v)operator(\)->)ident(len)operator(;) + ident(lex_lastline) operator(=) ident(v)operator(;) + operator(}) + reserved(else) operator({) + ident(lex_lastline) operator(=) integer(0)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + operator(}) + ident(c) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)*)ident(lex_p)operator(++;) + reserved(if) operator(()ident(c) operator(==) char('\\r') operator(&&) ident(lex_p) operator(<) ident(lex_pend) operator(&&) operator(*)ident(lex_p) operator(==) char('\\n')operator(\)) operator({) + ident(lex_p)operator(++;) + ident(c) operator(=) char('\\n')operator(;) + operator(}) + + reserved(return) ident(c)operator(;) +operator(}) + +directive(static) directive(void) +ident(pushback)operator(()ident(c)operator(\)) + pre_type(int) ident(c)operator(;) +operator({) + reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) reserved(return)operator(;) + ident(lex_p)operator(--;) +operator(}) + +preprocessor(#define) ident(was_bol)operator((\)) operator(()ident(lex_p) operator(==) ident(lex_pbeg) operator(+) integer(1)operator(\)) +preprocessor(#define) ident(peek)operator(()ident(c)operator(\)) operator(()ident(lex_p) operator(!=) ident(lex_pend) operator(&&) operator(()ident(c)operator(\)) operator(==) operator(*)ident(lex_p)operator(\)) + +preprocessor(#define) ident(tokfix)operator((\)) operator(()ident(tokenbuf)operator([)ident(tokidx)operator(]=)char('\\0')operator(\)) +preprocessor(#define) ident(tok)operator((\)) ident(tokenbuf) +preprocessor(#define) ident(toklen)operator((\)) ident(tokidx) +preprocessor(#define) ident(toklast)operator((\)) operator(()ident(tokidx)operator(>)integer(0)operator(?)ident(tokenbuf)operator([)ident(tokidx)operator(-)integer(1)operator(]:)integer(0)operator(\)) + +directive(static) pre_type(char)operator(*) +ident(newtok)operator((\)) +operator({) + ident(tokidx) operator(=) integer(0)operator(;) + reserved(if) operator((!)ident(tokenbuf)operator(\)) operator({) + ident(toksiz) operator(=) integer(60)operator(;) + ident(tokenbuf) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,) integer(60)operator(\);) + operator(}) + reserved(if) operator(()ident(toksiz) operator(>) integer(4096)operator(\)) operator({) + ident(toksiz) operator(=) integer(60)operator(;) + ident(REALLOC_N)operator(()ident(tokenbuf)operator(,) pre_type(char)operator(,) integer(60)operator(\);) + operator(}) + reserved(return) ident(tokenbuf)operator(;) +operator(}) + +directive(static) directive(void) +ident(tokadd)operator(()ident(c)operator(\)) + pre_type(char) ident(c)operator(;) +operator({) + ident(tokenbuf)operator([)ident(tokidx)operator(++]) operator(=) ident(c)operator(;) + reserved(if) operator(()ident(tokidx) operator(>=) ident(toksiz)operator(\)) operator({) + ident(toksiz) operator(*=) integer(2)operator(;) + ident(REALLOC_N)operator(()ident(tokenbuf)operator(,) pre_type(char)operator(,) ident(toksiz)operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(read_escape)operator((\)) +operator({) + pre_type(int) ident(c)operator(;) + + reserved(switch) operator(()ident(c) operator(=) ident(nextc)operator((\)\)) operator({) + reserved(case) char('\\\\')operator(:) comment(/* Backslash */) + reserved(return) ident(c)operator(;) + + reserved(case) char('n')operator(:) comment(/* newline */) + reserved(return) char('\\n')operator(;) + + reserved(case) char('t')operator(:) comment(/* horizontal tab */) + reserved(return) char('\\t')operator(;) + + reserved(case) char('r')operator(:) comment(/* carriage-return */) + reserved(return) char('\\r')operator(;) + + reserved(case) char('f')operator(:) comment(/* form-feed */) + reserved(return) char('\\f')operator(;) + + reserved(case) char('v')operator(:) comment(/* vertical tab */) + reserved(return) char('\\13')operator(;) + + reserved(case) char('a')operator(:) comment(/* alarm(bell\) */) + reserved(return) char('\\007')operator(;) + + reserved(case) char('e')operator(:) comment(/* escape */) + reserved(return) oct(033)operator(;) + + reserved(case) char('0')operator(:) reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) comment(/* octal constant */) + reserved(case) char('4')operator(:) reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) reserved(case) char('7')operator(:) + operator({) + pre_type(int) ident(numlen)operator(;) + + ident(pushback)operator(()ident(c)operator(\);) + ident(c) operator(=) ident(scan_oct)operator(()ident(lex_p)operator(,) integer(3)operator(,) operator(&)ident(numlen)operator(\);) + ident(lex_p) operator(+=) ident(numlen)operator(;) + operator(}) + reserved(return) ident(c)operator(;) + + reserved(case) char('x')operator(:) comment(/* hex constant */) + operator({) + pre_type(int) ident(numlen)operator(;) + + ident(c) operator(=) ident(scan_hex)operator(()ident(lex_p)operator(,) integer(2)operator(,) operator(&)ident(numlen)operator(\);) + reserved(if) operator(()ident(numlen) operator(==) integer(0)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Invalid escape character syntax)delimiter(")>operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + ident(lex_p) operator(+=) ident(numlen)operator(;) + operator(}) + reserved(return) ident(c)operator(;) + + reserved(case) char('b')operator(:) comment(/* backspace */) + reserved(return) char('\\010')operator(;) + + reserved(case) char('s')operator(:) comment(/* space */) + reserved(return) char(' ')operator(;) + + reserved(case) char('M')operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) char('-')operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Invalid escape character syntax)delimiter(")>operator(\);) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('\\0')operator(;) + operator(}) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('\\\\')operator(\)) operator({) + reserved(return) ident(read_escape)operator((\)) operator(|) hex(0x80)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(eof)operator(;) + reserved(else) operator({) + reserved(return) operator((()ident(c) operator(&) hex(0xff)operator(\)) operator(|) hex(0x80)operator(\);) + operator(}) + + reserved(case) char('C')operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) char('-')operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Invalid escape character syntax)delimiter(")>operator(\);) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('\\0')operator(;) + operator(}) + reserved(case) char('c')operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)==) char('\\\\')operator(\)) operator({) + ident(c) operator(=) ident(read_escape)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('?')operator(\)) + reserved(return) oct(0177)operator(;) + reserved(else) reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(eof)operator(;) + reserved(return) ident(c) operator(&) hex(0x9f)operator(;) + + label(eof)operator(:) + reserved(case) operator(-)integer(1)operator(:) + ident(yyerror)operator(()string<delimiter(")content(Invalid escape character syntax)delimiter(")>operator(\);) + reserved(return) char('\\0')operator(;) + + reserved(default)operator(:) + reserved(return) ident(c)operator(;) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(tokadd_escape)operator(()ident(term)operator(\)) + pre_type(int) ident(term)operator(;) +operator({) + pre_type(int) ident(c)operator(;) + + reserved(switch) operator(()ident(c) operator(=) ident(nextc)operator((\)\)) operator({) + reserved(case) char('\\n')operator(:) + reserved(return) integer(0)operator(;) comment(/* just ignore */) + + reserved(case) char('0')operator(:) reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) comment(/* octal constant */) + reserved(case) char('4')operator(:) reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) reserved(case) char('7')operator(:) + operator({) + pre_type(int) ident(i)operator(;) + + ident(tokadd)operator(()char('\\\\')operator(\);) + ident(tokadd)operator(()ident(c)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(2)operator(;) ident(i)operator(++\)) operator({) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(eof)operator(;) + reserved(if) operator(()ident(c) operator(<) char('0') operator(||) char('7') operator(<) ident(c)operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(break)operator(;) + operator(}) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) + + reserved(case) char('x')operator(:) comment(/* hex constant */) + operator({) + pre_type(int) ident(numlen)operator(;) + + ident(tokadd)operator(()char('\\\\')operator(\);) + ident(tokadd)operator(()ident(c)operator(\);) + ident(scan_hex)operator(()ident(lex_p)operator(,) integer(2)operator(,) operator(&)ident(numlen)operator(\);) + reserved(if) operator(()ident(numlen) operator(==) integer(0)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Invalid escape character syntax)delimiter(")>operator(\);) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(while) operator(()ident(numlen)operator(--\)) + ident(tokadd)operator(()ident(nextc)operator((\)\);) + operator(}) + reserved(return) integer(0)operator(;) + + reserved(case) char('M')operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) char('-')operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Invalid escape character syntax)delimiter(")>operator(\);) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + ident(tokadd)operator(()char('\\\\')operator(\);) ident(tokadd)operator(()char('M')operator(\);) ident(tokadd)operator(()char('-')operator(\);) + reserved(goto) ident(escaped)operator(;) + + reserved(case) char('C')operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) char('-')operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Invalid escape character syntax)delimiter(")>operator(\);) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + ident(tokadd)operator(()char('\\\\')operator(\);) ident(tokadd)operator(()char('C')operator(\);) ident(tokadd)operator(()char('-')operator(\);) + reserved(goto) ident(escaped)operator(;) + + reserved(case) char('c')operator(:) + ident(tokadd)operator(()char('\\\\')operator(\);) ident(tokadd)operator(()char('c')operator(\);) + label(escaped)operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('\\\\')operator(\)) operator({) + reserved(return) ident(tokadd_escape)operator(()ident(term)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(eof)operator(;) + ident(tokadd)operator(()ident(c)operator(\);) + reserved(return) integer(0)operator(;) + + label(eof)operator(:) + reserved(case) operator(-)integer(1)operator(:) + ident(yyerror)operator(()string<delimiter(")content(Invalid escape character syntax)delimiter(")>operator(\);) + reserved(return) operator(-)integer(1)operator(;) + + reserved(default)operator(:) + reserved(if) operator(()ident(c) operator(!=) char('\\\\') operator(||) ident(c) operator(!=) ident(term)operator(\)) + ident(tokadd)operator(()char('\\\\')operator(\);) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(regx_options)operator((\)) +operator({) + pre_type(char) ident(kcode) operator(=) integer(0)operator(;) + pre_type(int) ident(options) operator(=) integer(0)operator(;) + pre_type(int) ident(c)operator(;) + + ident(newtok)operator((\);) + reserved(while) operator(()ident(c) operator(=) ident(nextc)operator((\),) ident(ISALPHA)operator(()ident(c)operator(\)\)) operator({) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('i')operator(:) + ident(options) operator(|=) ident(RE_OPTION_IGNORECASE)operator(;) + reserved(break)operator(;) + reserved(case) char('x')operator(:) + ident(options) operator(|=) ident(RE_OPTION_EXTENDED)operator(;) + reserved(break)operator(;) + reserved(case) char('m')operator(:) + ident(options) operator(|=) ident(RE_OPTION_MULTILINE)operator(;) + reserved(break)operator(;) + reserved(case) char('o')operator(:) + ident(options) operator(|=) ident(RE_OPTION_ONCE)operator(;) + reserved(break)operator(;) + reserved(case) char('n')operator(:) + ident(kcode) operator(=) integer(16)operator(;) + reserved(break)operator(;) + reserved(case) char('e')operator(:) + ident(kcode) operator(=) integer(32)operator(;) + reserved(break)operator(;) + reserved(case) char('s')operator(:) + ident(kcode) operator(=) integer(48)operator(;) + reserved(break)operator(;) + reserved(case) char('u')operator(:) + ident(kcode) operator(=) integer(64)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(tokadd)operator(()ident(c)operator(\);) + reserved(break)operator(;) + operator(}) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(toklen)operator((\)\)) operator({) + ident(tokfix)operator((\);) + ident(rb_compile_error)operator(()string<delimiter(")content(unknown regexp option%s - %s)delimiter(")>operator(,) + ident(toklen)operator((\)) operator(>) integer(1) operator(?) string<delimiter(")content(s)delimiter(")> operator(:) string<delimiter(")delimiter(")>operator(,) ident(tok)operator((\)\);) + operator(}) + reserved(return) ident(options) operator(|) ident(kcode)operator(;) +operator(}) + +preprocessor(#define) ident(STR_FUNC_ESCAPE) hex(0x01) +preprocessor(#define) ident(STR_FUNC_EXPAND) hex(0x02) +preprocessor(#define) ident(STR_FUNC_REGEXP) hex(0x04) +preprocessor(#define) ident(STR_FUNC_QWORDS) hex(0x08) +preprocessor(#define) ident(STR_FUNC_SYMBOL) hex(0x10) +preprocessor(#define) ident(STR_FUNC_INDENT) hex(0x20) + +reserved(enum) ident(string_type) operator({) + ident(str_squote) operator(=) operator(()integer(0)operator(\),) + ident(str_dquote) operator(=) operator(()ident(STR_FUNC_EXPAND)operator(\),) + ident(str_xquote) operator(=) operator(()ident(STR_FUNC_EXPAND)operator(\),) + ident(str_regexp) operator(=) operator(()ident(STR_FUNC_REGEXP)operator(|)ident(STR_FUNC_ESCAPE)operator(|)ident(STR_FUNC_EXPAND)operator(\),) + ident(str_sword) operator(=) operator(()ident(STR_FUNC_QWORDS)operator(\),) + ident(str_dword) operator(=) operator(()ident(STR_FUNC_QWORDS)operator(|)ident(STR_FUNC_EXPAND)operator(\),) + ident(str_ssym) operator(=) operator(()ident(STR_FUNC_SYMBOL)operator(\),) + ident(str_dsym) operator(=) operator(()ident(STR_FUNC_SYMBOL)operator(|)ident(STR_FUNC_EXPAND)operator(\),) +operator(};) + +directive(static) directive(void) +ident(dispose_string)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(xfree)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(rb_gc_force_recycle)operator(()ident(str)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(tokadd_string)operator(()ident(func)operator(,) ident(term)operator(,) ident(paren)operator(,) ident(nest)operator(\)) + pre_type(int) ident(func)operator(,) ident(term)operator(,) ident(paren)operator(,) operator(*)ident(nest)operator(;) +operator({) + pre_type(int) ident(c)operator(;) + + reserved(while) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) operator(-)integer(1)operator(\)) operator({) + reserved(if) operator(()ident(paren) operator(&&) ident(c) operator(==) ident(paren)operator(\)) operator({) + operator(++*)ident(nest)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) ident(term)operator(\)) operator({) + reserved(if) operator((!)ident(nest) operator(||) operator(!*)ident(nest)operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(break)operator(;) + operator(}) + operator(--*)ident(nest)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(func) operator(&) ident(STR_FUNC_EXPAND)operator(\)) operator(&&) ident(c) operator(==) char('#') operator(&&) ident(lex_p) operator(<) ident(lex_pend)operator(\)) operator({) + pre_type(int) ident(c2) operator(=) operator(*)ident(lex_p)operator(;) + reserved(if) operator(()ident(c2) operator(==) char('$') operator(||) ident(c2) operator(==) char('@') operator(||) ident(c2) operator(==) char('{')operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\\\')operator(\)) operator({) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('\\n')operator(:) + reserved(if) operator(()ident(func) operator(&) ident(STR_FUNC_QWORDS)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(func) operator(&) ident(STR_FUNC_EXPAND)operator(\)) reserved(continue)operator(;) + ident(tokadd)operator(()char('\\\\')operator(\);) + reserved(break)operator(;) + + reserved(case) char('\\\\')operator(:) + reserved(if) operator(()ident(func) operator(&) ident(STR_FUNC_ESCAPE)operator(\)) ident(tokadd)operator(()ident(c)operator(\);) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(if) operator(()ident(func) operator(&) ident(STR_FUNC_REGEXP)operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(tokadd_escape)operator(()ident(term)operator(\)) operator(<) integer(0)operator(\)) + reserved(return) operator(-)integer(1)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(func) operator(&) ident(STR_FUNC_EXPAND)operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(func) operator(&) ident(STR_FUNC_ESCAPE)operator(\)) ident(tokadd)operator(()char('\\\\')operator(\);) + ident(c) operator(=) ident(read_escape)operator((\);) + operator(}) + reserved(else) reserved(if) operator((()ident(func) operator(&) ident(STR_FUNC_QWORDS)operator(\)) operator(&&) ident(ISSPACE)operator(()ident(c)operator(\)\)) operator({) + comment(/* ignore backslashed spaces in %w */) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(!=) ident(term) operator(&&) operator(!()ident(paren) operator(&&) ident(c) operator(==) ident(paren)operator(\)\)) operator({) + ident(tokadd)operator(()char('\\\\')operator(\);) + operator(}) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + pre_type(int) ident(i)operator(,) ident(len) operator(=) ident(mbclen)operator(()ident(c)operator(\)-)integer(1)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(tokadd)operator(()ident(c)operator(\);) + ident(c) operator(=) ident(nextc)operator((\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator((()ident(func) operator(&) ident(STR_FUNC_QWORDS)operator(\)) operator(&&) ident(ISSPACE)operator(()ident(c)operator(\)\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(if) operator((!)ident(c) operator(&&) operator(()ident(func) operator(&) ident(STR_FUNC_SYMBOL)operator(\)\)) operator({) + ident(func) operator(&=) operator(~)ident(STR_FUNC_SYMBOL)operator(;) + ident(rb_compile_error)operator(()string<delimiter(")content(symbol cannot contain ')char(\\\\)content(0')delimiter(")>operator(\);) + reserved(continue)operator(;) + operator(}) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) + reserved(return) ident(c)operator(;) +operator(}) + +preprocessor(#define) ident(NEW_STRTERM)operator(()ident(func)operator(,) ident(term)operator(,) ident(paren)operator(\)) \ + ident(rb_node_newnode)operator(()ident(NODE_STRTERM)operator(,) operator(()ident(func)operator(\),) operator(()ident(term)operator(\)) operator(|) operator((()ident(paren)operator(\)) operator(<<) operator(()ident(CHAR_BIT) operator(*) integer(2)operator(\)\),) integer(0)operator(\)) + +directive(static) pre_type(int) +ident(parse_string)operator(()ident(quote)operator(\)) + ident(NODE) operator(*)ident(quote)operator(;) +operator({) + pre_type(int) ident(func) operator(=) ident(quote)operator(->)ident(nd_func)operator(;) + pre_type(int) ident(term) operator(=) ident(nd_term)operator(()ident(quote)operator(\);) + pre_type(int) ident(paren) operator(=) ident(nd_paren)operator(()ident(quote)operator(\);) + pre_type(int) ident(c)operator(,) ident(space) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(func) operator(==) operator(-)integer(1)operator(\)) reserved(return) ident(tSTRING_END)operator(;) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator((()ident(func) operator(&) ident(STR_FUNC_QWORDS)operator(\)) operator(&&) ident(ISSPACE)operator(()ident(c)operator(\)\)) operator({) + reserved(do) operator({)ident(c) operator(=) ident(nextc)operator((\);}) reserved(while) operator(()ident(ISSPACE)operator(()ident(c)operator(\)\);) + ident(space) operator(=) integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) ident(term) operator(&&) operator(!)ident(quote)operator(->)ident(nd_nest)operator(\)) operator({) + reserved(if) operator(()ident(func) operator(&) ident(STR_FUNC_QWORDS)operator(\)) operator({) + ident(quote)operator(->)ident(nd_func) operator(=) operator(-)integer(1)operator(;) + reserved(return) char(' ')operator(;) + operator(}) + reserved(if) operator((!()ident(func) operator(&) ident(STR_FUNC_REGEXP)operator(\)\)) reserved(return) ident(tSTRING_END)operator(;) + ident(yylval)operator(.)ident(num) operator(=) ident(regx_options)operator((\);) + reserved(return) ident(tREGEXP_END)operator(;) + operator(}) + reserved(if) operator(()ident(space)operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char(' ')operator(;) + operator(}) + ident(newtok)operator((\);) + reserved(if) operator((()ident(func) operator(&) ident(STR_FUNC_EXPAND)operator(\)) operator(&&) ident(c) operator(==) char('#')operator(\)) operator({) + reserved(switch) operator(()ident(c) operator(=) ident(nextc)operator((\)\)) operator({) + reserved(case) char('$')operator(:) + reserved(case) char('@')operator(:) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tSTRING_DVAR)operator(;) + reserved(case) char('{')operator(:) + reserved(return) ident(tSTRING_DBEG)operator(;) + operator(}) + ident(tokadd)operator(()char('#')operator(\);) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(tokadd_string)operator(()ident(func)operator(,) ident(term)operator(,) ident(paren)operator(,) operator(&)ident(quote)operator(->)ident(nd_nest)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(ruby_sourceline) operator(=) ident(nd_line)operator(()ident(quote)operator(\);) + ident(rb_compile_error)operator(()string<delimiter(")content(unterminated string meets end of file)delimiter(")>operator(\);) + reserved(return) ident(tSTRING_END)operator(;) + operator(}) + + ident(tokfix)operator((\);) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_STR)operator(()ident(rb_str_new)operator(()ident(tok)operator((\),) ident(toklen)operator((\)\)\);) + reserved(return) ident(tSTRING_CONTENT)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(heredoc_identifier)operator((\)) +operator({) + pre_type(int) ident(c) operator(=) ident(nextc)operator((\),) ident(term)operator(,) ident(func) operator(=) integer(0)operator(,) ident(len)operator(;) + + reserved(if) operator(()ident(c) operator(==) char('-')operator(\)) operator({) + ident(c) operator(=) ident(nextc)operator((\);) + ident(func) operator(=) ident(STR_FUNC_INDENT)operator(;) + operator(}) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('\\'')operator(:) + ident(func) operator(|=) ident(str_squote)operator(;) reserved(goto) ident(quoted)operator(;) + reserved(case) char('"')operator(:) + ident(func) operator(|=) ident(str_dquote)operator(;) reserved(goto) ident(quoted)operator(;) + reserved(case) char('`')operator(:) + ident(func) operator(|=) ident(str_xquote)operator(;) + label(quoted)operator(:) + ident(newtok)operator((\);) + ident(tokadd)operator(()ident(func)operator(\);) + ident(term) operator(=) ident(c)operator(;) + reserved(while) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) operator(-)integer(1) operator(&&) ident(c) operator(!=) ident(term)operator(\)) operator({) + ident(len) operator(=) ident(mbclen)operator(()ident(c)operator(\);) + reserved(do) operator({)ident(tokadd)operator(()ident(c)operator(\);}) reserved(while) operator((--)ident(len) operator(>) integer(0) operator(&&) operator(()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) operator(-)integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(unterminated here document identifier)delimiter(")>operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(if) operator((!)ident(is_identchar)operator(()ident(c)operator(\)\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(func) operator(&) ident(STR_FUNC_INDENT)operator(\)) operator({) + ident(pushback)operator(()char('-')operator(\);) + operator(}) + reserved(return) integer(0)operator(;) + operator(}) + ident(newtok)operator((\);) + ident(term) operator(=) char('"')operator(;) + ident(tokadd)operator(()ident(func) operator(|=) ident(str_dquote)operator(\);) + reserved(do) operator({) + ident(len) operator(=) ident(mbclen)operator(()ident(c)operator(\);) + reserved(do) operator({)ident(tokadd)operator(()ident(c)operator(\);}) reserved(while) operator((--)ident(len) operator(>) integer(0) operator(&&) operator(()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) operator(-)integer(1)operator(\);) + operator(}) reserved(while) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) operator(-)integer(1) operator(&&) ident(is_identchar)operator(()ident(c)operator(\)\);) + ident(pushback)operator(()ident(c)operator(\);) + reserved(break)operator(;) + operator(}) + + ident(tokfix)operator((\);) + ident(len) operator(=) ident(lex_p) operator(-) ident(lex_pbeg)operator(;) + ident(lex_p) operator(=) ident(lex_pend)operator(;) + ident(lex_strterm) operator(=) ident(rb_node_newnode)operator(()ident(NODE_HEREDOC)operator(,) + ident(rb_str_new)operator(()ident(tok)operator((\),) ident(toklen)operator((\)\),) comment(/* nd_lit */) + ident(len)operator(,) comment(/* nd_nth */) + ident(lex_lastline)operator(\);) comment(/* nd_orig */) + reserved(return) ident(term) operator(==) char('`') operator(?) ident(tXSTRING_BEG) operator(:) ident(tSTRING_BEG)operator(;) +operator(}) + +directive(static) directive(void) +ident(heredoc_restore)operator(()ident(here)operator(\)) + ident(NODE) operator(*)ident(here)operator(;) +operator({) + ident(VALUE) ident(line) operator(=) ident(here)operator(->)ident(nd_orig)operator(;) + ident(lex_lastline) operator(=) ident(line)operator(;) + ident(lex_pbeg) operator(=) ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator(;) + ident(lex_pend) operator(=) ident(lex_pbeg) operator(+) ident(RSTRING)operator(()ident(line)operator(\)->)ident(len)operator(;) + ident(lex_p) operator(=) ident(lex_pbeg) operator(+) ident(here)operator(->)ident(nd_nth)operator(;) + ident(heredoc_end) operator(=) ident(ruby_sourceline)operator(;) + ident(ruby_sourceline) operator(=) ident(nd_line)operator(()ident(here)operator(\);) + ident(dispose_string)operator(()ident(here)operator(->)ident(nd_lit)operator(\);) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(here)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(whole_match_p)operator(()ident(eos)operator(,) ident(len)operator(,) ident(indent)operator(\)) + pre_type(char) operator(*)ident(eos)operator(;) + pre_type(int) ident(len)operator(,) ident(indent)operator(;) +operator({) + pre_type(char) operator(*)ident(p) operator(=) ident(lex_pbeg)operator(;) + pre_type(int) ident(n)operator(;) + + reserved(if) operator(()ident(indent)operator(\)) operator({) + reserved(while) operator((*)ident(p) operator(&&) ident(ISSPACE)operator((*)ident(p)operator(\)\)) ident(p)operator(++;) + operator(}) + ident(n)operator(=) ident(lex_pend) operator(-) operator(()ident(p) operator(+) ident(len)operator(\);) + reserved(if) operator(()ident(n) operator(<) integer(0) operator(||) operator(()ident(n) operator(>) integer(0) operator(&&) ident(p)operator([)ident(len)operator(]) operator(!=) char('\\n') operator(&&) ident(p)operator([)ident(len)operator(]) operator(!=) char('\\r')operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(strncmp)operator(()ident(eos)operator(,) ident(p)operator(,) ident(len)operator(\)) operator(==) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(here_document)operator(()ident(here)operator(\)) + ident(NODE) operator(*)ident(here)operator(;) +operator({) + pre_type(int) ident(c)operator(,) ident(func)operator(,) ident(indent) operator(=) integer(0)operator(;) + pre_type(char) operator(*)ident(eos)operator(,) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + pre_type(long) ident(len)operator(;) + ident(VALUE) ident(str) operator(=) integer(0)operator(;) + + ident(eos) operator(=) ident(RSTRING)operator(()ident(here)operator(->)ident(nd_lit)operator(\)->)ident(ptr)operator(;) + ident(len) operator(=) ident(RSTRING)operator(()ident(here)operator(->)ident(nd_lit)operator(\)->)ident(len) operator(-) integer(1)operator(;) + ident(indent) operator(=) operator(()ident(func) operator(=) operator(*)ident(eos)operator(++\)) operator(&) ident(STR_FUNC_INDENT)operator(;) + + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) operator(-)integer(1)operator(\)) operator({) + label(error)operator(:) + ident(rb_compile_error)operator(()string<delimiter(")content(can't find string )char(\\")content(%s)char(\\")content( anywhere before EOF)delimiter(")>operator(,) ident(eos)operator(\);) + ident(heredoc_restore)operator(()ident(lex_strterm)operator(\);) + ident(lex_strterm) operator(=) integer(0)operator(;) + reserved(return) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(was_bol)operator((\)) operator(&&) ident(whole_match_p)operator(()ident(eos)operator(,) ident(len)operator(,) ident(indent)operator(\)\)) operator({) + ident(heredoc_restore)operator(()ident(lex_strterm)operator(\);) + reserved(return) ident(tSTRING_END)operator(;) + operator(}) + + reserved(if) operator((!()ident(func) operator(&) ident(STR_FUNC_EXPAND)operator(\)\)) operator({) + reserved(do) operator({) + ident(p) operator(=) ident(RSTRING)operator(()ident(lex_lastline)operator(\)->)ident(ptr)operator(;) + ident(pend) operator(=) ident(lex_pend)operator(;) + reserved(if) operator(()ident(pend) operator(>) ident(p)operator(\)) operator({) + reserved(switch) operator(()ident(pend)operator([-)integer(1)operator(]\)) operator({) + reserved(case) char('\\n')operator(:) + reserved(if) operator((--)ident(pend) operator(==) ident(p) operator(||) ident(pend)operator([-)integer(1)operator(]) operator(!=) char('\\r')operator(\)) operator({) + ident(pend)operator(++;) + reserved(break)operator(;) + operator(}) + reserved(case) char('\\r')operator(:) + operator(--)ident(pend)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(str)operator(\)) + ident(rb_str_cat)operator(()ident(str)operator(,) ident(p)operator(,) ident(pend) operator(-) ident(p)operator(\);) + reserved(else) + ident(str) operator(=) ident(rb_str_new)operator(()ident(p)operator(,) ident(pend) operator(-) ident(p)operator(\);) + reserved(if) operator(()ident(pend) operator(<) ident(lex_pend)operator(\)) ident(rb_str_cat)operator(()ident(str)operator(,) string<delimiter(")char(\\n)delimiter(")>operator(,) integer(1)operator(\);) + ident(lex_p) operator(=) ident(lex_pend)operator(;) + reserved(if) operator(()ident(nextc)operator((\)) operator(==) operator(-)integer(1)operator(\)) operator({) + reserved(if) operator(()ident(str)operator(\)) ident(dispose_string)operator(()ident(str)operator(\);) + reserved(goto) ident(error)operator(;) + operator(}) + operator(}) reserved(while) operator((!)ident(whole_match_p)operator(()ident(eos)operator(,) ident(len)operator(,) ident(indent)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(newtok)operator((\);) + reserved(if) operator(()ident(c) operator(==) char('#')operator(\)) operator({) + reserved(switch) operator(()ident(c) operator(=) ident(nextc)operator((\)\)) operator({) + reserved(case) char('$')operator(:) + reserved(case) char('@')operator(:) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tSTRING_DVAR)operator(;) + reserved(case) char('{')operator(:) + reserved(return) ident(tSTRING_DBEG)operator(;) + operator(}) + ident(tokadd)operator(()char('#')operator(\);) + operator(}) + reserved(do) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator((()ident(c) operator(=) ident(tokadd_string)operator(()ident(func)operator(,) char('\\n')operator(,) integer(0)operator(,) pre_constant(NULL)operator(\)\)) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(error)operator(;) + reserved(if) operator(()ident(c) operator(!=) char('\\n')operator(\)) operator({) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_STR)operator(()ident(rb_str_new)operator(()ident(tok)operator((\),) ident(toklen)operator((\)\)\);) + reserved(return) ident(tSTRING_CONTENT)operator(;) + operator(}) + ident(tokadd)operator(()ident(nextc)operator((\)\);) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) operator(-)integer(1)operator(\)) reserved(goto) ident(error)operator(;) + operator(}) reserved(while) operator((!)ident(whole_match_p)operator(()ident(eos)operator(,) ident(len)operator(,) ident(indent)operator(\)\);) + ident(str) operator(=) ident(rb_str_new)operator(()ident(tok)operator((\),) ident(toklen)operator((\)\);) + operator(}) + ident(heredoc_restore)operator(()ident(lex_strterm)operator(\);) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator((-)integer(1)operator(,) integer(0)operator(,) integer(0)operator(\);) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_STR)operator(()ident(str)operator(\);) + reserved(return) ident(tSTRING_CONTENT)operator(;) +operator(}) + +preprocessor(#include) include("lex.c") + +directive(static) directive(void) +ident(arg_ambiguous)operator((\)) +operator({) + ident(rb_warning)operator(()string<delimiter(")content(ambiguous first argument; put parentheses or even spaces)delimiter(")>operator(\);) +operator(}) + +preprocessor(#define) ident(IS_ARG)operator((\)) operator(()ident(lex_state) operator(==) ident(EXPR_ARG) operator(||) ident(lex_state) operator(==) ident(EXPR_CMDARG)operator(\)) +preprocessor(#define) ident(IS_BEG)operator((\)) operator(()ident(lex_state) operator(==) ident(EXPR_BEG) operator(||) ident(lex_state) operator(==) ident(EXPR_MID) operator(||) ident(lex_state) operator(==) ident(EXPR_CLASS)operator(\)) + +directive(static) pre_type(int) +ident(yylex)operator((\)) +operator({) + directive(register) pre_type(int) ident(c)operator(;) + pre_type(int) ident(space_seen) operator(=) integer(0)operator(;) + pre_type(int) ident(cmd_state)operator(;) + reserved(enum) ident(lex_state) ident(last_state)operator(;) + + reserved(if) operator(()ident(lex_strterm)operator(\)) operator({) + pre_type(int) ident(token)operator(;) + reserved(if) operator(()ident(nd_type)operator(()ident(lex_strterm)operator(\)) operator(==) ident(NODE_HEREDOC)operator(\)) operator({) + ident(token) operator(=) ident(here_document)operator(()ident(lex_strterm)operator(\);) + reserved(if) operator(()ident(token) operator(==) ident(tSTRING_END)operator(\)) operator({) + ident(lex_strterm) operator(=) integer(0)operator(;) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(token) operator(=) ident(parse_string)operator(()ident(lex_strterm)operator(\);) + reserved(if) operator(()ident(token) operator(==) ident(tSTRING_END) operator(||) ident(token) operator(==) ident(tREGEXP_END)operator(\)) operator({) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(lex_strterm)operator(\);) + ident(lex_strterm) operator(=) integer(0)operator(;) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + operator(}) + operator(}) + reserved(return) ident(token)operator(;) + operator(}) + ident(cmd_state) operator(=) ident(command_start)operator(;) + ident(command_start) operator(=) ident(Qfalse)operator(;) + label(retry)operator(:) + reserved(switch) operator(()ident(c) operator(=) ident(nextc)operator((\)\)) operator({) + reserved(case) char('\\0')operator(:) comment(/* NUL */) + reserved(case) char('\\004')operator(:) comment(/* ^D */) + reserved(case) char('\\032')operator(:) comment(/* ^Z */) + reserved(case) operator(-)integer(1)operator(:) comment(/* end of script. */) + reserved(return) integer(0)operator(;) + + comment(/* white spaces */) + reserved(case) char(' ')operator(:) reserved(case) char('\\t')operator(:) reserved(case) char('\\f')operator(:) reserved(case) char('\\r')operator(:) + reserved(case) char('\\13')operator(:) comment(/* '\\v' */) + ident(space_seen)operator(++;) + reserved(goto) ident(retry)operator(;) + + reserved(case) char('#')operator(:) comment(/* it's a comment */) + reserved(while) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) char('\\n')operator(\)) operator({) + reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) + reserved(return) integer(0)operator(;) + operator(}) + comment(/* fall through */) + reserved(case) char('\\n')operator(:) + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_BEG)operator(:) + reserved(case) label(EXPR_FNAME)operator(:) + reserved(case) label(EXPR_DOT)operator(:) + reserved(case) label(EXPR_CLASS)operator(:) + reserved(goto) ident(retry)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + ident(command_start) operator(=) ident(Qtrue)operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) char('\\n')operator(;) + + reserved(case) char('*')operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('*')operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) ident(tPOW)operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + ident(c) operator(=) ident(tPOW)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(c) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) char('*')operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(IS_ARG)operator((\)) operator(&&) ident(space_seen) operator(&&) operator(!)ident(ISSPACE)operator(()ident(c)operator(\)\){) + ident(rb_warning)operator(()string<delimiter(")content(`*' interpreted as argument prefix)delimiter(")>operator(\);) + ident(c) operator(=) ident(tSTAR)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(IS_BEG)operator((\)\)) operator({) + ident(c) operator(=) ident(tSTAR)operator(;) + operator(}) + reserved(else) operator({) + ident(c) operator(=) char('*')operator(;) + operator(}) + operator(}) + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_FNAME)operator(:) reserved(case) label(EXPR_DOT)operator(:) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) reserved(break)operator(;) + operator(}) + reserved(return) ident(c)operator(;) + + reserved(case) char('!')operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + reserved(return) ident(tNEQ)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('~')operator(\)) operator({) + reserved(return) ident(tNMATCH)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('!')operator(;) + + reserved(case) char('=')operator(:) + reserved(if) operator(()ident(was_bol)operator((\)\)) operator({) + comment(/* skip embedded rd document */) + reserved(if) operator(()ident(strncmp)operator(()ident(lex_p)operator(,) string<delimiter(")content(begin)delimiter(")>operator(,) integer(5)operator(\)) operator(==) integer(0) operator(&&) ident(ISSPACE)operator(()ident(lex_p)operator([)integer(5)operator(]\)\)) operator({) + reserved(for) operator((;;\)) operator({) + ident(lex_p) operator(=) ident(lex_pend)operator(;) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(embedded document meets end of file)delimiter(")>operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(!=) char('=')operator(\)) reserved(continue)operator(;) + reserved(if) operator(()ident(strncmp)operator(()ident(lex_p)operator(,) string<delimiter(")content(end)delimiter(")>operator(,) integer(3)operator(\)) operator(==) integer(0) operator(&&) + operator(()ident(lex_p) operator(+) integer(3) operator(==) ident(lex_pend) operator(||) ident(ISSPACE)operator(()ident(lex_p)operator([)integer(3)operator(]\)\)\)) operator({) + reserved(break)operator(;) + operator(}) + operator(}) + ident(lex_p) operator(=) ident(lex_pend)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) + operator(}) + + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_FNAME)operator(:) reserved(case) label(EXPR_DOT)operator(:) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) reserved(break)operator(;) + operator(}) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + reserved(return) ident(tEQQ)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tEQ)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('~')operator(\)) operator({) + reserved(return) ident(tMATCH)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('>')operator(\)) operator({) + reserved(return) ident(tASSOC)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('=')operator(;) + + reserved(case) char('<')operator(:) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(==) char('<') operator(&&) + ident(lex_state) operator(!=) ident(EXPR_END) operator(&&) + ident(lex_state) operator(!=) ident(EXPR_DOT) operator(&&) + ident(lex_state) operator(!=) ident(EXPR_ENDARG) operator(&&) + ident(lex_state) operator(!=) ident(EXPR_CLASS) operator(&&) + operator((!)ident(IS_ARG)operator((\)) operator(||) ident(space_seen)operator(\)\)) operator({) + pre_type(int) ident(token) operator(=) ident(heredoc_identifier)operator((\);) + reserved(if) operator(()ident(token)operator(\)) reserved(return) ident(token)operator(;) + operator(}) + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_FNAME)operator(:) reserved(case) label(EXPR_DOT)operator(:) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('=')operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('>')operator(\)) operator({) + reserved(return) ident(tCMP)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tLEQ)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('<')operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) ident(tLSHFT)operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tLSHFT)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('<')operator(;) + + reserved(case) char('>')operator(:) + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_FNAME)operator(:) reserved(case) label(EXPR_DOT)operator(:) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) reserved(break)operator(;) + operator(}) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + reserved(return) ident(tGEQ)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('>')operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) ident(tRSHFT)operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tRSHFT)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('>')operator(;) + + reserved(case) char('"')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_dquote)operator(,) char('"')operator(,) integer(0)operator(\);) + reserved(return) ident(tSTRING_BEG)operator(;) + + reserved(case) char('`')operator(:) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_FNAME)operator(\)) operator({) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + reserved(return) ident(c)operator(;) + operator(}) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_DOT)operator(\)) operator({) + reserved(if) operator(()ident(cmd_state)operator(\)) + ident(lex_state) operator(=) ident(EXPR_CMDARG)operator(;) + reserved(else) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) + reserved(return) ident(c)operator(;) + operator(}) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_xquote)operator(,) char('`')operator(,) integer(0)operator(\);) + reserved(return) ident(tXSTRING_BEG)operator(;) + + reserved(case) char('\\'')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_squote)operator(,) char('\\'')operator(,) integer(0)operator(\);) + reserved(return) ident(tSTRING_BEG)operator(;) + + reserved(case) char('?')operator(:) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_END) operator(||) ident(lex_state) operator(==) ident(EXPR_ENDARG)operator(\)) operator({) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) char('?')operator(;) + operator(}) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(incomplete character syntax)delimiter(")>operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(ISSPACE)operator(()ident(c)operator(\)\){) + reserved(if) operator((!)ident(IS_ARG)operator((\)\){) + pre_type(int) ident(c2) operator(=) integer(0)operator(;) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char(' ')operator(:) + ident(c2) operator(=) char('s')operator(;) + reserved(break)operator(;) + reserved(case) char('\\n')operator(:) + ident(c2) operator(=) char('n')operator(;) + reserved(break)operator(;) + reserved(case) char('\\t')operator(:) + ident(c2) operator(=) char('t')operator(;) + reserved(break)operator(;) + reserved(case) char('\\v')operator(:) + ident(c2) operator(=) char('v')operator(;) + reserved(break)operator(;) + reserved(case) char('\\r')operator(:) + ident(c2) operator(=) char('r')operator(;) + reserved(break)operator(;) + reserved(case) char('\\f')operator(:) + ident(c2) operator(=) char('f')operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(c2)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(invalid character syntax; use ?)char(\\\\)content(%c)delimiter(")>operator(,) ident(c2)operator(\);) + operator(}) + operator(}) + label(ternary)operator(:) + ident(pushback)operator(()ident(c)operator(\);) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) char('?')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(multibyte character literal not supported yet; use ?)char(\\\\)content(%.3o)delimiter(")>operator(,) ident(c)operator(\);) + reserved(goto) ident(ternary)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(ISALNUM)operator(()ident(c)operator(\)) operator(||) ident(c) operator(==) char('_')operator(\)) operator(&&) ident(lex_p) operator(<) ident(lex_pend) operator(&&) ident(is_identchar)operator((*)ident(lex_p)operator(\)\)) operator({) + reserved(goto) ident(ternary)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\\\')operator(\)) operator({) + ident(c) operator(=) ident(read_escape)operator((\);) + operator(}) + ident(c) operator(&=) hex(0xff)operator(;) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_LIT)operator(()ident(INT2FIX)operator(()ident(c)operator(\)\);) + reserved(return) ident(tINTEGER)operator(;) + + reserved(case) char('&')operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('&')operator(\)) operator({) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) ident(tANDOP)operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tANDOP)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) char('&')operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(IS_ARG)operator((\)) operator(&&) ident(space_seen) operator(&&) operator(!)ident(ISSPACE)operator(()ident(c)operator(\)\){) + ident(rb_warning)operator(()string<delimiter(")content(`&' interpreted as argument prefix)delimiter(")>operator(\);) + ident(c) operator(=) ident(tAMPER)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(IS_BEG)operator((\)\)) operator({) + ident(c) operator(=) ident(tAMPER)operator(;) + operator(}) + reserved(else) operator({) + ident(c) operator(=) char('&')operator(;) + operator(}) + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_FNAME)operator(:) reserved(case) label(EXPR_DOT)operator(:) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + operator(}) + reserved(return) ident(c)operator(;) + + reserved(case) char('|')operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('|')operator(\)) operator({) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) ident(tOROP)operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tOROP)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) char('|')operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_FNAME) operator(||) ident(lex_state) operator(==) ident(EXPR_DOT)operator(\)) operator({) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) + operator(}) + reserved(else) operator({) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('|')operator(;) + + reserved(case) char('+')operator(:) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_FNAME) operator(||) ident(lex_state) operator(==) ident(EXPR_DOT)operator(\)) operator({) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) + reserved(if) operator(()ident(c) operator(==) char('@')operator(\)) operator({) + reserved(return) ident(tUPLUS)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('+')operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) char('+')operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + reserved(if) operator(()ident(IS_BEG)operator((\)) operator(||) + operator(()ident(IS_ARG)operator((\)) operator(&&) ident(space_seen) operator(&&) operator(!)ident(ISSPACE)operator(()ident(c)operator(\)\)\)) operator({) + reserved(if) operator(()ident(IS_ARG)operator((\)\)) ident(arg_ambiguous)operator((\);) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(ISDIGIT)operator(()ident(c)operator(\)\)) operator({) + ident(c) operator(=) char('+')operator(;) + reserved(goto) ident(start_num)operator(;) + operator(}) + reserved(return) ident(tUPLUS)operator(;) + operator(}) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('+')operator(;) + + reserved(case) char('-')operator(:) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_FNAME) operator(||) ident(lex_state) operator(==) ident(EXPR_DOT)operator(\)) operator({) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) + reserved(if) operator(()ident(c) operator(==) char('@')operator(\)) operator({) + reserved(return) ident(tUMINUS)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('-')operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) char('-')operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + reserved(if) operator(()ident(IS_BEG)operator((\)) operator(||) + operator(()ident(IS_ARG)operator((\)) operator(&&) ident(space_seen) operator(&&) operator(!)ident(ISSPACE)operator(()ident(c)operator(\)\)\)) operator({) + reserved(if) operator(()ident(IS_ARG)operator((\)\)) ident(arg_ambiguous)operator((\);) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(ISDIGIT)operator(()ident(c)operator(\)\)) operator({) + reserved(return) ident(tUMINUS_NUM)operator(;) + operator(}) + reserved(return) ident(tUMINUS)operator(;) + operator(}) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('-')operator(;) + + reserved(case) char('.')operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('.')operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('.')operator(\)) operator({) + reserved(return) ident(tDOT3)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tDOT2)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(ISDIGIT)operator(()ident(c)operator(\)\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(no .<digit> floating literal anymore; put 0 before dot)delimiter(")>operator(\);) + operator(}) + ident(lex_state) operator(=) ident(EXPR_DOT)operator(;) + reserved(return) char('.')operator(;) + + label(start_num)operator(:) + reserved(case) char('0')operator(:) reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) reserved(case) char('4')operator(:) + reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) reserved(case) char('7')operator(:) reserved(case) char('8')operator(:) reserved(case) char('9')operator(:) + operator({) + pre_type(int) ident(is_float)operator(,) ident(seen_point)operator(,) ident(seen_e)operator(,) ident(nondigit)operator(;) + + ident(is_float) operator(=) ident(seen_point) operator(=) ident(seen_e) operator(=) ident(nondigit) operator(=) integer(0)operator(;) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + ident(newtok)operator((\);) + reserved(if) operator(()ident(c) operator(==) char('-') operator(||) ident(c) operator(==) char('+')operator(\)) operator({) + ident(tokadd)operator(()ident(c)operator(\);) + ident(c) operator(=) ident(nextc)operator((\);) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('0')operator(\)) operator({) + pre_type(int) ident(start) operator(=) ident(toklen)operator((\);) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(==) char('x') operator(||) ident(c) operator(==) char('X')operator(\)) operator({) + comment(/* hexadecimal */) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(ISXDIGIT)operator(()ident(c)operator(\)\)) operator({) + reserved(do) operator({) + reserved(if) operator(()ident(c) operator(==) char('_')operator(\)) operator({) + reserved(if) operator(()ident(nondigit)operator(\)) reserved(break)operator(;) + ident(nondigit) operator(=) ident(c)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator((!)ident(ISXDIGIT)operator(()ident(c)operator(\)\)) reserved(break)operator(;) + ident(nondigit) operator(=) integer(0)operator(;) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) reserved(while) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) operator(-)integer(1)operator(\);) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + ident(tokfix)operator((\);) + reserved(if) operator(()ident(toklen)operator((\)) operator(==) ident(start)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(numeric literal without digits)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(nondigit)operator(\)) reserved(goto) ident(trailing_uc)operator(;) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_LIT)operator(()ident(rb_cstr_to_inum)operator(()ident(tok)operator((\),) integer(16)operator(,) ident(Qfalse)operator(\)\);) + reserved(return) ident(tINTEGER)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('b') operator(||) ident(c) operator(==) char('B')operator(\)) operator({) + comment(/* binary */) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(==) char('0') operator(||) ident(c) operator(==) char('1')operator(\)) operator({) + reserved(do) operator({) + reserved(if) operator(()ident(c) operator(==) char('_')operator(\)) operator({) + reserved(if) operator(()ident(nondigit)operator(\)) reserved(break)operator(;) + ident(nondigit) operator(=) ident(c)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(!=) char('0') operator(&&) ident(c) operator(!=) char('1')operator(\)) reserved(break)operator(;) + ident(nondigit) operator(=) integer(0)operator(;) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) reserved(while) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) operator(-)integer(1)operator(\);) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + ident(tokfix)operator((\);) + reserved(if) operator(()ident(toklen)operator((\)) operator(==) ident(start)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(numeric literal without digits)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(nondigit)operator(\)) reserved(goto) ident(trailing_uc)operator(;) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_LIT)operator(()ident(rb_cstr_to_inum)operator(()ident(tok)operator((\),) integer(2)operator(,) ident(Qfalse)operator(\)\);) + reserved(return) ident(tINTEGER)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('d') operator(||) ident(c) operator(==) char('D')operator(\)) operator({) + comment(/* decimal */) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(ISDIGIT)operator(()ident(c)operator(\)\)) operator({) + reserved(do) operator({) + reserved(if) operator(()ident(c) operator(==) char('_')operator(\)) operator({) + reserved(if) operator(()ident(nondigit)operator(\)) reserved(break)operator(;) + ident(nondigit) operator(=) ident(c)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator((!)ident(ISDIGIT)operator(()ident(c)operator(\)\)) reserved(break)operator(;) + ident(nondigit) operator(=) integer(0)operator(;) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) reserved(while) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) operator(-)integer(1)operator(\);) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + ident(tokfix)operator((\);) + reserved(if) operator(()ident(toklen)operator((\)) operator(==) ident(start)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(numeric literal without digits)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(nondigit)operator(\)) reserved(goto) ident(trailing_uc)operator(;) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_LIT)operator(()ident(rb_cstr_to_inum)operator(()ident(tok)operator((\),) integer(10)operator(,) ident(Qfalse)operator(\)\);) + reserved(return) ident(tINTEGER)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('_')operator(\)) operator({) + comment(/* 0_0 */) + reserved(goto) ident(octal_number)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('o') operator(||) ident(c) operator(==) char('O')operator(\)) operator({) + comment(/* prefixed octal */) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(==) char('_')operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(numeric literal without digits)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(c) operator(>=) char('0') operator(&&) ident(c) operator(<=) char('7')operator(\)) operator({) + comment(/* octal */) + label(octal_number)operator(:) + reserved(do) operator({) + reserved(if) operator(()ident(c) operator(==) char('_')operator(\)) operator({) + reserved(if) operator(()ident(nondigit)operator(\)) reserved(break)operator(;) + ident(nondigit) operator(=) ident(c)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(<) char('0') operator(||) ident(c) operator(>) char('9')operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(c) operator(>) char('7')operator(\)) reserved(goto) ident(invalid_octal)operator(;) + ident(nondigit) operator(=) integer(0)operator(;) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) reserved(while) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) operator(-)integer(1)operator(\);) + reserved(if) operator(()ident(toklen)operator((\)) operator(>) ident(start)operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + ident(tokfix)operator((\);) + reserved(if) operator(()ident(nondigit)operator(\)) reserved(goto) ident(trailing_uc)operator(;) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_LIT)operator(()ident(rb_cstr_to_inum)operator(()ident(tok)operator((\),) integer(8)operator(,) ident(Qfalse)operator(\)\);) + reserved(return) ident(tINTEGER)operator(;) + operator(}) + reserved(if) operator(()ident(nondigit)operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(goto) ident(trailing_uc)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(c) operator(>) char('7') operator(&&) ident(c) operator(<=) char('9')operator(\)) operator({) + label(invalid_octal)operator(:) + ident(yyerror)operator(()string<delimiter(")content(Illegal octal digit)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('.') operator(||) ident(c) operator(==) char('e') operator(||) ident(c) operator(==) char('E')operator(\)) operator({) + ident(tokadd)operator(()char('0')operator(\);) + operator(}) + reserved(else) operator({) + ident(pushback)operator(()ident(c)operator(\);) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_LIT)operator(()ident(INT2FIX)operator(()integer(0)operator(\)\);) + reserved(return) ident(tINTEGER)operator(;) + operator(}) + operator(}) + + reserved(for) operator((;;\)) operator({) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('0')operator(:) reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) reserved(case) char('4')operator(:) + reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) reserved(case) char('7')operator(:) reserved(case) char('8')operator(:) reserved(case) char('9')operator(:) + ident(nondigit) operator(=) integer(0)operator(;) + ident(tokadd)operator(()ident(c)operator(\);) + reserved(break)operator(;) + + reserved(case) char('.')operator(:) + reserved(if) operator(()ident(nondigit)operator(\)) reserved(goto) ident(trailing_uc)operator(;) + reserved(if) operator(()ident(seen_point) operator(||) ident(seen_e)operator(\)) operator({) + reserved(goto) ident(decode_num)operator(;) + operator(}) + reserved(else) operator({) + pre_type(int) ident(c0) operator(=) ident(nextc)operator((\);) + reserved(if) operator((!)ident(ISDIGIT)operator(()ident(c0)operator(\)\)) operator({) + ident(pushback)operator(()ident(c0)operator(\);) + reserved(goto) ident(decode_num)operator(;) + operator(}) + ident(c) operator(=) ident(c0)operator(;) + operator(}) + ident(tokadd)operator(()char('.')operator(\);) + ident(tokadd)operator(()ident(c)operator(\);) + ident(is_float)operator(++;) + ident(seen_point)operator(++;) + ident(nondigit) operator(=) integer(0)operator(;) + reserved(break)operator(;) + + reserved(case) char('e')operator(:) + reserved(case) char('E')operator(:) + reserved(if) operator(()ident(nondigit)operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + ident(c) operator(=) ident(nondigit)operator(;) + reserved(goto) ident(decode_num)operator(;) + operator(}) + reserved(if) operator(()ident(seen_e)operator(\)) operator({) + reserved(goto) ident(decode_num)operator(;) + operator(}) + ident(tokadd)operator(()ident(c)operator(\);) + ident(seen_e)operator(++;) + ident(is_float)operator(++;) + ident(nondigit) operator(=) ident(c)operator(;) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(!=) char('-') operator(&&) ident(c) operator(!=) char('+')operator(\)) reserved(continue)operator(;) + ident(tokadd)operator(()ident(c)operator(\);) + ident(nondigit) operator(=) ident(c)operator(;) + reserved(break)operator(;) + + reserved(case) char('_')operator(:) comment(/* `_' in number just ignored */) + reserved(if) operator(()ident(nondigit)operator(\)) reserved(goto) ident(decode_num)operator(;) + ident(nondigit) operator(=) ident(c)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(goto) ident(decode_num)operator(;) + operator(}) + ident(c) operator(=) ident(nextc)operator((\);) + operator(}) + + label(decode_num)operator(:) + ident(pushback)operator(()ident(c)operator(\);) + ident(tokfix)operator((\);) + reserved(if) operator(()ident(nondigit)operator(\)) operator({) + pre_type(char) ident(tmp)operator([)integer(30)operator(];) + label(trailing_uc)operator(:) + ident(sprintf)operator(()ident(tmp)operator(,) string<delimiter(")content(trailing `%c' in number)delimiter(")>operator(,) ident(nondigit)operator(\);) + ident(yyerror)operator(()ident(tmp)operator(\);) + operator(}) + reserved(if) operator(()ident(is_float)operator(\)) operator({) + pre_type(double) ident(d) operator(=) ident(strtod)operator(()ident(tok)operator((\),) integer(0)operator(\);) + reserved(if) operator(()ident(errno) operator(==) ident(ERANGE)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(Float %s out of range)delimiter(")>operator(,) ident(tok)operator((\)\);) + ident(errno) operator(=) integer(0)operator(;) + operator(}) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_LIT)operator(()ident(rb_float_new)operator(()ident(d)operator(\)\);) + reserved(return) ident(tFLOAT)operator(;) + operator(}) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_LIT)operator(()ident(rb_cstr_to_inum)operator(()ident(tok)operator((\),) integer(10)operator(,) ident(Qfalse)operator(\)\);) + reserved(return) ident(tINTEGER)operator(;) + operator(}) + + reserved(case) char(']')operator(:) + reserved(case) char('}')operator(:) + reserved(case) char('\)')operator(:) + ident(COND_LEXPOP)operator((\);) + ident(CMDARG_LEXPOP)operator((\);) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + reserved(return) ident(c)operator(;) + + reserved(case) char(':')operator(:) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(==) char(':')operator(\)) operator({) + reserved(if) operator(()ident(IS_BEG)operator((\)) operator(||) operator(()ident(IS_ARG)operator((\)) operator(&&) ident(space_seen)operator(\)\)) operator({) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tCOLON3)operator(;) + operator(}) + ident(lex_state) operator(=) ident(EXPR_DOT)operator(;) + reserved(return) ident(tCOLON2)operator(;) + operator(}) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_END) operator(||) ident(lex_state) operator(==) ident(EXPR_ENDARG) operator(||) ident(ISSPACE)operator(()ident(c)operator(\)\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) char(':')operator(;) + operator(}) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('\\'')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_ssym)operator(,) ident(c)operator(,) integer(0)operator(\);) + reserved(break)operator(;) + reserved(case) char('"')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_dsym)operator(,) ident(c)operator(,) integer(0)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(pushback)operator(()ident(c)operator(\);) + reserved(break)operator(;) + operator(}) + ident(lex_state) operator(=) ident(EXPR_FNAME)operator(;) + reserved(return) ident(tSYMBEG)operator(;) + + reserved(case) char('/')operator(:) + reserved(if) operator(()ident(IS_BEG)operator((\)\)) operator({) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_regexp)operator(,) char('/')operator(,) integer(0)operator(\);) + reserved(return) ident(tREGEXP_BEG)operator(;) + operator(}) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) char('/')operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(IS_ARG)operator((\)) operator(&&) ident(space_seen)operator(\)) operator({) + reserved(if) operator((!)ident(ISSPACE)operator(()ident(c)operator(\)\)) operator({) + ident(arg_ambiguous)operator((\);) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_regexp)operator(,) char('/')operator(,) integer(0)operator(\);) + reserved(return) ident(tREGEXP_BEG)operator(;) + operator(}) + operator(}) + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_FNAME)operator(:) reserved(case) label(EXPR_DOT)operator(:) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) reserved(break)operator(;) + operator(}) + reserved(return) char('/')operator(;) + + reserved(case) char('^')operator(:) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) char('^')operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_FNAME)operator(:) reserved(case) label(EXPR_DOT)operator(:) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) reserved(break)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('^')operator(;) + + reserved(case) char(';')operator(:) + ident(command_start) operator(=) ident(Qtrue)operator(;) + reserved(case) char(',')operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(c)operator(;) + + reserved(case) char('~')operator(:) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_FNAME) operator(||) ident(lex_state) operator(==) ident(EXPR_DOT)operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(!=) char('@')operator(\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + operator(}) + operator(}) + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_FNAME)operator(:) reserved(case) label(EXPR_DOT)operator(:) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) reserved(break)operator(;) + operator(}) + reserved(return) char('~')operator(;) + + reserved(case) char('(')operator(:) + ident(command_start) operator(=) ident(Qtrue)operator(;) + reserved(if) operator(()ident(IS_BEG)operator((\)\)) operator({) + ident(c) operator(=) ident(tLPAREN)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(space_seen)operator(\)) operator({) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_CMDARG)operator(\)) operator({) + ident(c) operator(=) ident(tLPAREN_ARG)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_ARG)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(don't put space before argument parentheses)delimiter(")>operator(\);) + ident(c) operator(=) char('(')operator(;) + operator(}) + operator(}) + ident(COND_PUSH)operator(()integer(0)operator(\);) + ident(CMDARG_PUSH)operator(()integer(0)operator(\);) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(c)operator(;) + + reserved(case) char('[')operator(:) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_FNAME) operator(||) ident(lex_state) operator(==) ident(EXPR_DOT)operator(\)) operator({) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char(']')operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + reserved(return) ident(tASET)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tAREF)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('[')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(IS_BEG)operator((\)\)) operator({) + ident(c) operator(=) ident(tLBRACK)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(IS_ARG)operator((\)) operator(&&) ident(space_seen)operator(\)) operator({) + ident(c) operator(=) ident(tLBRACK)operator(;) + operator(}) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + ident(COND_PUSH)operator(()integer(0)operator(\);) + ident(CMDARG_PUSH)operator(()integer(0)operator(\);) + reserved(return) ident(c)operator(;) + + reserved(case) char('{')operator(:) + reserved(if) operator(()ident(IS_ARG)operator((\)) operator(||) ident(lex_state) operator(==) ident(EXPR_END)operator(\)) + ident(c) operator(=) char('{')operator(;) comment(/* block (primary\) */) + reserved(else) reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_ENDARG)operator(\)) + ident(c) operator(=) ident(tLBRACE_ARG)operator(;) comment(/* block (expr\) */) + reserved(else) + ident(c) operator(=) ident(tLBRACE)operator(;) comment(/* hash */) + ident(COND_PUSH)operator(()integer(0)operator(\);) + ident(CMDARG_PUSH)operator(()integer(0)operator(\);) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(c)operator(;) + + reserved(case) char('\\\\')operator(:) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(c) operator(==) char('\\n')operator(\)) operator({) + ident(space_seen) operator(=) integer(1)operator(;) + reserved(goto) ident(retry)operator(;) comment(/* skip \\\\n */) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('\\\\')operator(;) + + reserved(case) char('%')operator(:) + reserved(if) operator(()ident(IS_BEG)operator((\)\)) operator({) + pre_type(int) ident(term)operator(;) + pre_type(int) ident(paren)operator(;) + + ident(c) operator(=) ident(nextc)operator((\);) + label(quotation)operator(:) + reserved(if) operator((!)ident(ISALNUM)operator(()ident(c)operator(\)\)) operator({) + ident(term) operator(=) ident(c)operator(;) + ident(c) operator(=) char('Q')operator(;) + operator(}) + reserved(else) operator({) + ident(term) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(ISALNUM)operator(()ident(term)operator(\)) operator(||) ident(ismbchar)operator(()ident(term)operator(\)\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(unknown type of %string)delimiter(")>operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(c) operator(==) operator(-)integer(1) operator(||) ident(term) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(unterminated quoted string meets end of file)delimiter(")>operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + ident(paren) operator(=) ident(term)operator(;) + reserved(if) operator(()ident(term) operator(==) char('(')operator(\)) ident(term) operator(=) char('\)')operator(;) + reserved(else) reserved(if) operator(()ident(term) operator(==) char('[')operator(\)) ident(term) operator(=) char(']')operator(;) + reserved(else) reserved(if) operator(()ident(term) operator(==) char('{')operator(\)) ident(term) operator(=) char('}')operator(;) + reserved(else) reserved(if) operator(()ident(term) operator(==) char('<')operator(\)) ident(term) operator(=) char('>')operator(;) + reserved(else) ident(paren) operator(=) integer(0)operator(;) + + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('Q')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_dquote)operator(,) ident(term)operator(,) ident(paren)operator(\);) + reserved(return) ident(tSTRING_BEG)operator(;) + + reserved(case) char('q')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_squote)operator(,) ident(term)operator(,) ident(paren)operator(\);) + reserved(return) ident(tSTRING_BEG)operator(;) + + reserved(case) char('W')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_dword)operator(,) ident(term)operator(,) ident(paren)operator(\);) + reserved(do) operator({)ident(c) operator(=) ident(nextc)operator((\);}) reserved(while) operator(()ident(ISSPACE)operator(()ident(c)operator(\)\);) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tWORDS_BEG)operator(;) + + reserved(case) char('w')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_sword)operator(,) ident(term)operator(,) ident(paren)operator(\);) + reserved(do) operator({)ident(c) operator(=) ident(nextc)operator((\);}) reserved(while) operator(()ident(ISSPACE)operator(()ident(c)operator(\)\);) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) ident(tQWORDS_BEG)operator(;) + + reserved(case) char('x')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_xquote)operator(,) ident(term)operator(,) ident(paren)operator(\);) + reserved(return) ident(tXSTRING_BEG)operator(;) + + reserved(case) char('r')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_regexp)operator(,) ident(term)operator(,) ident(paren)operator(\);) + reserved(return) ident(tREGEXP_BEG)operator(;) + + reserved(case) char('s')operator(:) + ident(lex_strterm) operator(=) ident(NEW_STRTERM)operator(()ident(str_ssym)operator(,) ident(term)operator(,) ident(paren)operator(\);) + ident(lex_state) operator(=) ident(EXPR_FNAME)operator(;) + reserved(return) ident(tSYMBEG)operator(;) + + reserved(default)operator(:) + ident(yyerror)operator(()string<delimiter(")content(unknown type of %string)delimiter(")>operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + operator(}) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=')operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) char('%')operator(;) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(tOP_ASGN)operator(;) + operator(}) + reserved(if) operator(()ident(IS_ARG)operator((\)) operator(&&) ident(space_seen) operator(&&) operator(!)ident(ISSPACE)operator(()ident(c)operator(\)\)) operator({) + reserved(goto) ident(quotation)operator(;) + operator(}) + reserved(switch) operator(()ident(lex_state)operator(\)) operator({) + reserved(case) label(EXPR_FNAME)operator(:) reserved(case) label(EXPR_DOT)operator(:) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) reserved(break)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('%')operator(;) + + reserved(case) char('$')operator(:) + ident(last_state) operator(=) ident(lex_state)operator(;) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + ident(newtok)operator((\);) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('_')operator(:) comment(/* $_: last read line string */) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(is_identchar)operator(()ident(c)operator(\)\)) operator({) + ident(tokadd)operator(()char('$')operator(\);) + ident(tokadd)operator(()char('_')operator(\);) + reserved(break)operator(;) + operator(}) + ident(pushback)operator(()ident(c)operator(\);) + ident(c) operator(=) char('_')operator(;) + comment(/* fall through */) + reserved(case) char('~')operator(:) comment(/* $~: match-data */) + ident(local_cnt)operator(()ident(c)operator(\);) + comment(/* fall through */) + reserved(case) char('*')operator(:) comment(/* $*: argv */) + reserved(case) char('$')operator(:) comment(/* $$: pid */) + reserved(case) char('?')operator(:) comment(/* $?: last status */) + reserved(case) char('!')operator(:) comment(/* $!: error string */) + reserved(case) char('@')operator(:) comment(/* $@: error position */) + reserved(case) char('/')operator(:) comment(/* $/: input record separator */) + reserved(case) char('\\\\')operator(:) comment(/* $\\: output record separator */) + reserved(case) char(';')operator(:) comment(/* $;: field separator */) + reserved(case) char(',')operator(:) comment(/* $,: output field separator */) + reserved(case) char('.')operator(:) comment(/* $.: last read line number */) + reserved(case) char('=')operator(:) comment(/* $=: ignorecase */) + reserved(case) char(':')operator(:) comment(/* $:: load path */) + reserved(case) char('<')operator(:) comment(/* $<: reading filename */) + reserved(case) char('>')operator(:) comment(/* $>: default output handle */) + reserved(case) char('\\"')operator(:) comment(/* $": already loaded files */) + ident(tokadd)operator(()char('$')operator(\);) + ident(tokadd)operator(()ident(c)operator(\);) + ident(tokfix)operator((\);) + ident(yylval)operator(.)ident(id) operator(=) ident(rb_intern)operator(()ident(tok)operator((\)\);) + reserved(return) ident(tGVAR)operator(;) + + reserved(case) char('-')operator(:) + ident(tokadd)operator(()char('$')operator(\);) + ident(tokadd)operator(()ident(c)operator(\);) + ident(c) operator(=) ident(nextc)operator((\);) + reserved(if) operator(()ident(is_identchar)operator(()ident(c)operator(\)\)) operator({) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) + reserved(else) operator({) + ident(pushback)operator(()ident(c)operator(\);) + operator(}) + label(gvar)operator(:) + ident(tokfix)operator((\);) + ident(yylval)operator(.)ident(id) operator(=) ident(rb_intern)operator(()ident(tok)operator((\)\);) + comment(/* xxx shouldn't check if valid option variable */) + reserved(return) ident(tGVAR)operator(;) + + reserved(case) char('&')operator(:) comment(/* $&: last match */) + reserved(case) char('`')operator(:) comment(/* $`: string before last match */) + reserved(case) char('\\'')operator(:) comment(/* $': string after last match */) + reserved(case) char('+')operator(:) comment(/* $+: string matches last paren. */) + reserved(if) operator(()ident(last_state) operator(==) ident(EXPR_FNAME)operator(\)) operator({) + ident(tokadd)operator(()char('$')operator(\);) + ident(tokadd)operator(()ident(c)operator(\);) + reserved(goto) ident(gvar)operator(;) + operator(}) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_BACK_REF)operator(()ident(c)operator(\);) + reserved(return) ident(tBACK_REF)operator(;) + + reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) + reserved(case) char('4')operator(:) reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) + reserved(case) char('7')operator(:) reserved(case) char('8')operator(:) reserved(case) char('9')operator(:) + ident(tokadd)operator(()char('$')operator(\);) + reserved(do) operator({) + ident(tokadd)operator(()ident(c)operator(\);) + ident(c) operator(=) ident(nextc)operator((\);) + operator(}) reserved(while) operator(()ident(ISDIGIT)operator(()ident(c)operator(\)\);) + ident(pushback)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(last_state) operator(==) ident(EXPR_FNAME)operator(\)) reserved(goto) ident(gvar)operator(;) + ident(tokfix)operator((\);) + ident(yylval)operator(.)ident(node) operator(=) ident(NEW_NTH_REF)operator(()ident(atoi)operator(()ident(tok)operator((\)+)integer(1)operator(\)\);) + reserved(return) ident(tNTH_REF)operator(;) + + reserved(default)operator(:) + reserved(if) operator((!)ident(is_identchar)operator(()ident(c)operator(\)\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('$')operator(;) + operator(}) + reserved(case) char('0')operator(:) + ident(tokadd)operator(()char('$')operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('@')operator(:) + ident(c) operator(=) ident(nextc)operator((\);) + ident(newtok)operator((\);) + ident(tokadd)operator(()char('@')operator(\);) + reserved(if) operator(()ident(c) operator(==) char('@')operator(\)) operator({) + ident(tokadd)operator(()char('@')operator(\);) + ident(c) operator(=) ident(nextc)operator((\);) + operator(}) + reserved(if) operator(()ident(ISDIGIT)operator(()ident(c)operator(\)\)) operator({) + reserved(if) operator(()ident(tokidx) operator(==) integer(1)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(`@%c' is not allowed as an instance variable name)delimiter(")>operator(,) ident(c)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(`@@%c' is not allowed as a class variable name)delimiter(")>operator(,) ident(c)operator(\);) + operator(}) + reserved(return) integer(0)operator(;) + operator(}) + reserved(if) operator((!)ident(is_identchar)operator(()ident(c)operator(\)\)) operator({) + ident(pushback)operator(()ident(c)operator(\);) + reserved(return) char('@')operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('_')operator(:) + reserved(if) operator(()ident(was_bol)operator((\)) operator(&&) ident(whole_match_p)operator(()string<delimiter(")content(__END__)delimiter(")>operator(,) integer(7)operator(,) integer(0)operator(\)\)) operator({) + ident(ruby__end__seen) operator(=) integer(1)operator(;) + ident(lex_lastline) operator(=) integer(0)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + ident(newtok)operator((\);) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(if) operator((!)ident(is_identchar)operator(()ident(c)operator(\)\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(Invalid char `)char(\\\\)content(%03o' in expression)delimiter(")>operator(,) ident(c)operator(\);) + reserved(goto) ident(retry)operator(;) + operator(}) + + ident(newtok)operator((\);) + reserved(break)operator(;) + operator(}) + + reserved(do) operator({) + ident(tokadd)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + pre_type(int) ident(i)operator(,) ident(len) operator(=) ident(mbclen)operator(()ident(c)operator(\)-)integer(1)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(c) operator(=) ident(nextc)operator((\);) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) + operator(}) + ident(c) operator(=) ident(nextc)operator((\);) + operator(}) reserved(while) operator(()ident(is_identchar)operator(()ident(c)operator(\)\);) + reserved(if) operator((()ident(c) operator(==) char('!') operator(||) ident(c) operator(==) char('?')operator(\)) operator(&&) ident(is_identchar)operator(()ident(tok)operator((\)[)integer(0)operator(]\)) operator(&&) operator(!)ident(peek)operator(()char('=')operator(\)\)) operator({) + ident(tokadd)operator(()ident(c)operator(\);) + operator(}) + reserved(else) operator({) + ident(pushback)operator(()ident(c)operator(\);) + operator(}) + ident(tokfix)operator((\);) + + operator({) + pre_type(int) ident(result) operator(=) integer(0)operator(;) + + ident(last_state) operator(=) ident(lex_state)operator(;) + reserved(switch) operator(()ident(tok)operator((\)[)integer(0)operator(]\)) operator({) + reserved(case) char('$')operator(:) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + ident(result) operator(=) ident(tGVAR)operator(;) + reserved(break)operator(;) + reserved(case) char('@')operator(:) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + reserved(if) operator(()ident(tok)operator((\)[)integer(1)operator(]) operator(==) char('@')operator(\)) + ident(result) operator(=) ident(tCVAR)operator(;) + reserved(else) + ident(result) operator(=) ident(tIVAR)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(if) operator(()ident(toklast)operator((\)) operator(==) char('!') operator(||) ident(toklast)operator((\)) operator(==) char('?')operator(\)) operator({) + ident(result) operator(=) ident(tFID)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_FNAME)operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(nextc)operator((\)\)) operator(==) char('=') operator(&&) operator(!)ident(peek)operator(()char('~')operator(\)) operator(&&) operator(!)ident(peek)operator(()char('>')operator(\)) operator(&&) + operator((!)ident(peek)operator(()char('=')operator(\)) operator(||) operator(()ident(lex_p) operator(+) integer(1) operator(<) ident(lex_pend) operator(&&) ident(lex_p)operator([)integer(1)operator(]) operator(==) char('>')operator(\)\)\)) operator({) + ident(result) operator(=) ident(tIDENTIFIER)operator(;) + ident(tokadd)operator(()ident(c)operator(\);) + ident(tokfix)operator((\);) + operator(}) + reserved(else) operator({) + ident(pushback)operator(()ident(c)operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(result) operator(==) integer(0) operator(&&) ident(ISUPPER)operator(()ident(tok)operator((\)[)integer(0)operator(]\)\)) operator({) + ident(result) operator(=) ident(tCONSTANT)operator(;) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(tIDENTIFIER)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()ident(lex_state) operator(!=) ident(EXPR_DOT)operator(\)) operator({) + reserved(struct) ident(kwtable) operator(*)ident(kw)operator(;) + + comment(/* See if it is a reserved word. */) + ident(kw) operator(=) ident(rb_reserved_word)operator(()ident(tok)operator((\),) ident(toklen)operator((\)\);) + reserved(if) operator(()ident(kw)operator(\)) operator({) + reserved(enum) ident(lex_state) ident(state) operator(=) ident(lex_state)operator(;) + ident(lex_state) operator(=) ident(kw)operator(->)ident(state)operator(;) + reserved(if) operator(()ident(state) operator(==) ident(EXPR_FNAME)operator(\)) operator({) + ident(yylval)operator(.)ident(id) operator(=) ident(rb_intern)operator(()ident(kw)operator(->)ident(name)operator(\);) + reserved(return) ident(kw)operator(->)ident(id)operator([)integer(0)operator(];) + operator(}) + reserved(if) operator(()ident(kw)operator(->)ident(id)operator([)integer(0)operator(]) operator(==) ident(kDO)operator(\)) operator({) + reserved(if) operator(()ident(COND_P)operator((\)\)) reserved(return) ident(kDO_COND)operator(;) + reserved(if) operator(()ident(CMDARG_P)operator((\)) operator(&&) ident(state) operator(!=) ident(EXPR_CMDARG)operator(\)) + reserved(return) ident(kDO_BLOCK)operator(;) + reserved(if) operator(()ident(state) operator(==) ident(EXPR_ENDARG)operator(\)) + reserved(return) ident(kDO_BLOCK)operator(;) + reserved(return) ident(kDO)operator(;) + operator(}) + reserved(if) operator(()ident(state) operator(==) ident(EXPR_BEG)operator(\)) + reserved(return) ident(kw)operator(->)ident(id)operator([)integer(0)operator(];) + reserved(else) operator({) + reserved(if) operator(()ident(kw)operator(->)ident(id)operator([)integer(0)operator(]) operator(!=) ident(kw)operator(->)ident(id)operator([)integer(1)operator(]\)) + ident(lex_state) operator(=) ident(EXPR_BEG)operator(;) + reserved(return) ident(kw)operator(->)ident(id)operator([)integer(1)operator(];) + operator(}) + operator(}) + operator(}) + + reserved(if) operator(()ident(lex_state) operator(==) ident(EXPR_BEG) operator(||) + ident(lex_state) operator(==) ident(EXPR_MID) operator(||) + ident(lex_state) operator(==) ident(EXPR_DOT) operator(||) + ident(lex_state) operator(==) ident(EXPR_ARG) operator(||) + ident(lex_state) operator(==) ident(EXPR_CLASS) operator(||) + ident(lex_state) operator(==) ident(EXPR_CMDARG)operator(\)) operator({) + reserved(if) operator(()ident(cmd_state)operator(\)) operator({) + ident(lex_state) operator(=) ident(EXPR_CMDARG)operator(;) + operator(}) + reserved(else) operator({) + ident(lex_state) operator(=) ident(EXPR_ARG)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + operator(}) + operator(}) + ident(yylval)operator(.)ident(id) operator(=) ident(rb_intern)operator(()ident(tok)operator((\)\);) + reserved(if) operator(()ident(is_local_id)operator(()ident(yylval)operator(.)ident(id)operator(\)) operator(&&) + ident(last_state) operator(!=) ident(EXPR_DOT) operator(&&) + operator((()ident(dyna_in_block)operator((\)) operator(&&) ident(rb_dvar_defined)operator(()ident(yylval)operator(.)ident(id)operator(\)\)) operator(||) ident(local_id)operator(()ident(yylval)operator(.)ident(id)operator(\)\)\)) operator({) + ident(lex_state) operator(=) ident(EXPR_END)operator(;) + operator(}) + reserved(return) ident(result)operator(;) + operator(}) +operator(}) + +ident(NODE)operator(*) +ident(rb_node_newnode)operator(()ident(type)operator(,) ident(a0)operator(,) ident(a1)operator(,) ident(a2)operator(\)) + reserved(enum) ident(node_type) ident(type)operator(;) + ident(VALUE) ident(a0)operator(,) ident(a1)operator(,) ident(a2)operator(;) +operator({) + ident(NODE) operator(*)ident(n) operator(=) operator(()ident(NODE)operator(*\))ident(rb_newobj)operator((\);) + + ident(n)operator(->)ident(flags) operator(|=) ident(T_NODE)operator(;) + ident(nd_set_type)operator(()ident(n)operator(,) ident(type)operator(\);) + ident(nd_set_line)operator(()ident(n)operator(,) ident(ruby_sourceline)operator(\);) + ident(n)operator(->)ident(nd_file) operator(=) ident(ruby_sourcefile)operator(;) + + ident(n)operator(->)ident(u1)operator(.)ident(value) operator(=) ident(a0)operator(;) + ident(n)operator(->)ident(u2)operator(.)ident(value) operator(=) ident(a1)operator(;) + ident(n)operator(->)ident(u3)operator(.)ident(value) operator(=) ident(a2)operator(;) + + reserved(return) ident(n)operator(;) +operator(}) + +directive(static) reserved(enum) ident(node_type) +ident(nodetype)operator(()ident(node)operator(\)) comment(/* for debug */) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(return) operator(()reserved(enum) ident(node_type)operator(\))ident(nd_type)operator(()ident(node)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(nodeline)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(return) ident(nd_line)operator(()ident(node)operator(\);) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(newline_node)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + ident(NODE) operator(*)ident(nl) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(node)operator(\)) operator({) + pre_type(int) ident(line)operator(;) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_NEWLINE)operator(\)) reserved(return) ident(node)operator(;) + ident(line) operator(=) ident(nd_line)operator(()ident(node)operator(\);) + ident(node) operator(=) ident(remove_begin)operator(()ident(node)operator(\);) + ident(nl) operator(=) ident(NEW_NEWLINE)operator(()ident(node)operator(\);) + ident(nd_set_line)operator(()ident(nl)operator(,) ident(line)operator(\);) + ident(nl)operator(->)ident(nd_nth) operator(=) ident(line)operator(;) + operator(}) + reserved(return) ident(nl)operator(;) +operator(}) + +directive(static) directive(void) +ident(fixpos)operator(()ident(node)operator(,) ident(orig)operator(\)) + ident(NODE) operator(*)ident(node)operator(,) operator(*)ident(orig)operator(;) +operator({) + reserved(if) operator((!)ident(node)operator(\)) reserved(return)operator(;) + reserved(if) operator((!)ident(orig)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(orig) operator(==) operator(()ident(NODE)operator(*\))integer(1)operator(\)) reserved(return)operator(;) + ident(node)operator(->)ident(nd_file) operator(=) ident(orig)operator(->)ident(nd_file)operator(;) + ident(nd_set_line)operator(()ident(node)operator(,) ident(nd_line)operator(()ident(orig)operator(\)\);) +operator(}) + +directive(static) directive(void) +ident(parser_warning)operator(()ident(node)operator(,) ident(mesg)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) + directive(const) pre_type(char) operator(*)ident(mesg)operator(;) +operator({) + pre_type(int) ident(line) operator(=) ident(ruby_sourceline)operator(;) + ident(ruby_sourceline) operator(=) ident(nd_line)operator(()ident(node)operator(\);) + ident(rb_warning)operator(()string<delimiter(")content(%s)delimiter(")>operator(,) ident(mesg)operator(\);) + ident(ruby_sourceline) operator(=) ident(line)operator(;) +operator(}) + +directive(static) directive(void) +ident(parser_warn)operator(()ident(node)operator(,) ident(mesg)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) + directive(const) pre_type(char) operator(*)ident(mesg)operator(;) +operator({) + pre_type(int) ident(line) operator(=) ident(ruby_sourceline)operator(;) + ident(ruby_sourceline) operator(=) ident(nd_line)operator(()ident(node)operator(\);) + ident(rb_warn)operator(()string<delimiter(")content(%s)delimiter(")>operator(,) ident(mesg)operator(\);) + ident(ruby_sourceline) operator(=) ident(line)operator(;) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(block_append)operator(()ident(head)operator(,) ident(tail)operator(\)) + ident(NODE) operator(*)ident(head)operator(,) operator(*)ident(tail)operator(;) +operator({) + ident(NODE) operator(*)ident(end)operator(,) operator(*)ident(h) operator(=) ident(head)operator(;) + + reserved(if) operator(()ident(tail) operator(==) integer(0)operator(\)) reserved(return) ident(head)operator(;) + + label(again)operator(:) + reserved(if) operator(()ident(h) operator(==) integer(0)operator(\)) reserved(return) ident(tail)operator(;) + reserved(switch) operator(()ident(nd_type)operator(()ident(h)operator(\)\)) operator({) + reserved(case) label(NODE_NEWLINE)operator(:) + ident(h) operator(=) ident(h)operator(->)ident(nd_next)operator(;) + reserved(goto) ident(again)operator(;) + reserved(case) label(NODE_LIT)operator(:) + reserved(case) label(NODE_STR)operator(:) + ident(parser_warning)operator(()ident(h)operator(,) string<delimiter(")content(unused literal ignored)delimiter(")>operator(\);) + reserved(return) ident(tail)operator(;) + reserved(default)operator(:) + ident(h) operator(=) ident(end) operator(=) ident(NEW_BLOCK)operator(()ident(head)operator(\);) + ident(end)operator(->)ident(nd_end) operator(=) ident(end)operator(;) + ident(fixpos)operator(()ident(end)operator(,) ident(head)operator(\);) + ident(head) operator(=) ident(end)operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_BLOCK)operator(:) + ident(end) operator(=) ident(h)operator(->)ident(nd_end)operator(;) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)) operator({) + ident(NODE) operator(*)ident(nd) operator(=) ident(end)operator(->)ident(nd_head)operator(;) + label(newline)operator(:) + reserved(switch) operator(()ident(nd_type)operator(()ident(nd)operator(\)\)) operator({) + reserved(case) label(NODE_RETURN)operator(:) + reserved(case) label(NODE_BREAK)operator(:) + reserved(case) label(NODE_NEXT)operator(:) + reserved(case) label(NODE_REDO)operator(:) + reserved(case) label(NODE_RETRY)operator(:) + ident(parser_warning)operator(()ident(nd)operator(,) string<delimiter(")content(statement not reached)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_NEWLINE)operator(:) + ident(nd) operator(=) ident(nd)operator(->)ident(nd_next)operator(;) + reserved(goto) ident(newline)operator(;) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()ident(nd_type)operator(()ident(tail)operator(\)) operator(!=) ident(NODE_BLOCK)operator(\)) operator({) + ident(tail) operator(=) ident(NEW_BLOCK)operator(()ident(tail)operator(\);) + ident(tail)operator(->)ident(nd_end) operator(=) ident(tail)operator(;) + operator(}) + ident(end)operator(->)ident(nd_next) operator(=) ident(tail)operator(;) + ident(h)operator(->)ident(nd_end) operator(=) ident(tail)operator(->)ident(nd_end)operator(;) + reserved(return) ident(head)operator(;) +operator(}) + +comment(/* append item to the list */) +directive(static) ident(NODE)operator(*) +ident(list_append)operator(()ident(list)operator(,) ident(item)operator(\)) + ident(NODE) operator(*)ident(list)operator(,) operator(*)ident(item)operator(;) +operator({) + ident(NODE) operator(*)ident(last)operator(;) + + reserved(if) operator(()ident(list) operator(==) integer(0)operator(\)) reserved(return) ident(NEW_LIST)operator(()ident(item)operator(\);) + reserved(if) operator(()ident(list)operator(->)ident(nd_next)operator(\)) operator({) + ident(last) operator(=) ident(list)operator(->)ident(nd_next)operator(->)ident(nd_end)operator(;) + operator(}) + reserved(else) operator({) + ident(last) operator(=) ident(list)operator(;) + operator(}) + + ident(list)operator(->)ident(nd_alen) operator(+=) integer(1)operator(;) + ident(last)operator(->)ident(nd_next) operator(=) ident(NEW_LIST)operator(()ident(item)operator(\);) + ident(list)operator(->)ident(nd_next)operator(->)ident(nd_end) operator(=) ident(last)operator(->)ident(nd_next)operator(;) + reserved(return) ident(list)operator(;) +operator(}) + +comment(/* concat two lists */) +directive(static) ident(NODE)operator(*) +ident(list_concat)operator(()ident(head)operator(,) ident(tail)operator(\)) + ident(NODE) operator(*)ident(head)operator(,) operator(*)ident(tail)operator(;) +operator({) + ident(NODE) operator(*)ident(last)operator(;) + + reserved(if) operator(()ident(head)operator(->)ident(nd_next)operator(\)) operator({) + ident(last) operator(=) ident(head)operator(->)ident(nd_next)operator(->)ident(nd_end)operator(;) + operator(}) + reserved(else) operator({) + ident(last) operator(=) ident(head)operator(;) + operator(}) + + ident(head)operator(->)ident(nd_alen) operator(+=) ident(tail)operator(->)ident(nd_alen)operator(;) + ident(last)operator(->)ident(nd_next) operator(=) ident(tail)operator(;) + reserved(if) operator(()ident(tail)operator(->)ident(nd_next)operator(\)) operator({) + ident(head)operator(->)ident(nd_next)operator(->)ident(nd_end) operator(=) ident(tail)operator(->)ident(nd_next)operator(->)ident(nd_end)operator(;) + operator(}) + reserved(else) operator({) + ident(head)operator(->)ident(nd_next)operator(->)ident(nd_end) operator(=) ident(tail)operator(;) + operator(}) + + reserved(return) ident(head)operator(;) +operator(}) + +comment(/* concat two string literals */) +directive(static) ident(NODE) operator(*) +ident(literal_concat)operator(()ident(head)operator(,) ident(tail)operator(\)) + ident(NODE) operator(*)ident(head)operator(,) operator(*)ident(tail)operator(;) +operator({) + reserved(enum) ident(node_type) ident(htype)operator(;) + + reserved(if) operator((!)ident(head)operator(\)) reserved(return) ident(tail)operator(;) + reserved(if) operator((!)ident(tail)operator(\)) reserved(return) ident(head)operator(;) + + ident(htype) operator(=) ident(nd_type)operator(()ident(head)operator(\);) + reserved(if) operator(()ident(htype) operator(==) ident(NODE_EVSTR)operator(\)) operator({) + ident(NODE) operator(*)ident(node) operator(=) ident(NEW_DSTR)operator(()ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\)\);) + ident(head) operator(=) ident(list_append)operator(()ident(node)operator(,) ident(head)operator(\);) + operator(}) + reserved(switch) operator(()ident(nd_type)operator(()ident(tail)operator(\)\)) operator({) + reserved(case) label(NODE_STR)operator(:) + reserved(if) operator(()ident(htype) operator(==) ident(NODE_STR)operator(\)) operator({) + ident(rb_str_concat)operator(()ident(head)operator(->)ident(nd_lit)operator(,) ident(tail)operator(->)ident(nd_lit)operator(\);) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(tail)operator(\);) + operator(}) + reserved(else) operator({) + ident(list_append)operator(()ident(head)operator(,) ident(tail)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_DSTR)operator(:) + reserved(if) operator(()ident(htype) operator(==) ident(NODE_STR)operator(\)) operator({) + ident(rb_str_concat)operator(()ident(head)operator(->)ident(nd_lit)operator(,) ident(tail)operator(->)ident(nd_lit)operator(\);) + ident(tail)operator(->)ident(nd_lit) operator(=) ident(head)operator(->)ident(nd_lit)operator(;) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(head)operator(\);) + ident(head) operator(=) ident(tail)operator(;) + operator(}) + reserved(else) operator({) + ident(nd_set_type)operator(()ident(tail)operator(,) ident(NODE_ARRAY)operator(\);) + ident(tail)operator(->)ident(nd_head) operator(=) ident(NEW_STR)operator(()ident(tail)operator(->)ident(nd_lit)operator(\);) + ident(list_concat)operator(()ident(head)operator(,) ident(tail)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_EVSTR)operator(:) + reserved(if) operator(()ident(htype) operator(==) ident(NODE_STR)operator(\)) operator({) + ident(nd_set_type)operator(()ident(head)operator(,) ident(NODE_DSTR)operator(\);) + ident(head)operator(->)ident(nd_alen) operator(=) integer(1)operator(;) + operator(}) + ident(list_append)operator(()ident(head)operator(,) ident(tail)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(return) ident(head)operator(;) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(evstr2dstr)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_EVSTR)operator(\)) operator({) + ident(node) operator(=) ident(list_append)operator(()ident(NEW_DSTR)operator(()ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\)\),) ident(node)operator(\);) + operator(}) + reserved(return) ident(node)operator(;) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(new_evstr)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + ident(NODE) operator(*)ident(head) operator(=) ident(node)operator(;) + + label(again)operator(:) + reserved(if) operator(()ident(node)operator(\)) operator({) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_STR)operator(:) reserved(case) label(NODE_DSTR)operator(:) reserved(case) label(NODE_EVSTR)operator(:) + reserved(return) ident(node)operator(;) + reserved(case) label(NODE_NEWLINE)operator(:) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + operator(}) + reserved(return) ident(NEW_EVSTR)operator(()ident(head)operator(\);) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(call_op)operator(()ident(recv)operator(,) ident(id)operator(,) ident(narg)operator(,) ident(arg1)operator(\)) + ident(NODE) operator(*)ident(recv)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(narg)operator(;) + ident(NODE) operator(*)ident(arg1)operator(;) +operator({) + ident(value_expr)operator(()ident(recv)operator(\);) + reserved(if) operator(()ident(narg) operator(==) integer(1)operator(\)) operator({) + ident(value_expr)operator(()ident(arg1)operator(\);) + ident(arg1) operator(=) ident(NEW_LIST)operator(()ident(arg1)operator(\);) + operator(}) + reserved(else) operator({) + ident(arg1) operator(=) integer(0)operator(;) + operator(}) + reserved(return) ident(NEW_CALL)operator(()ident(recv)operator(,) ident(id)operator(,) ident(arg1)operator(\);) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(match_gen)operator(()ident(node1)operator(,) ident(node2)operator(\)) + ident(NODE) operator(*)ident(node1)operator(;) + ident(NODE) operator(*)ident(node2)operator(;) +operator({) + ident(local_cnt)operator(()char('~')operator(\);) + + ident(value_expr)operator(()ident(node1)operator(\);) + ident(value_expr)operator(()ident(node2)operator(\);) + reserved(if) operator(()ident(node1)operator(\)) operator({) + reserved(switch) operator(()ident(nd_type)operator(()ident(node1)operator(\)\)) operator({) + reserved(case) label(NODE_DREGX)operator(:) + reserved(case) label(NODE_DREGX_ONCE)operator(:) + reserved(return) ident(NEW_MATCH2)operator(()ident(node1)operator(,) ident(node2)operator(\);) + + reserved(case) label(NODE_LIT)operator(:) + reserved(if) operator(()ident(TYPE)operator(()ident(node1)operator(->)ident(nd_lit)operator(\)) operator(==) ident(T_REGEXP)operator(\)) operator({) + reserved(return) ident(NEW_MATCH2)operator(()ident(node1)operator(,) ident(node2)operator(\);) + operator(}) + operator(}) + operator(}) + + reserved(if) operator(()ident(node2)operator(\)) operator({) + reserved(switch) operator(()ident(nd_type)operator(()ident(node2)operator(\)\)) operator({) + reserved(case) label(NODE_DREGX)operator(:) + reserved(case) label(NODE_DREGX_ONCE)operator(:) + reserved(return) ident(NEW_MATCH3)operator(()ident(node2)operator(,) ident(node1)operator(\);) + + reserved(case) label(NODE_LIT)operator(:) + reserved(if) operator(()ident(TYPE)operator(()ident(node2)operator(->)ident(nd_lit)operator(\)) operator(==) ident(T_REGEXP)operator(\)) operator({) + reserved(return) ident(NEW_MATCH3)operator(()ident(node2)operator(,) ident(node1)operator(\);) + operator(}) + operator(}) + operator(}) + + reserved(return) ident(NEW_CALL)operator(()ident(node1)operator(,) ident(tMATCH)operator(,) ident(NEW_LIST)operator(()ident(node2)operator(\)\);) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(gettable)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator(()ident(id) operator(==) ident(kSELF)operator(\)) operator({) + reserved(return) ident(NEW_SELF)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(kNIL)operator(\)) operator({) + reserved(return) ident(NEW_NIL)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(kTRUE)operator(\)) operator({) + reserved(return) ident(NEW_TRUE)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(kFALSE)operator(\)) operator({) + reserved(return) ident(NEW_FALSE)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(k__FILE__)operator(\)) operator({) + reserved(return) ident(NEW_STR)operator(()ident(rb_str_new2)operator(()ident(ruby_sourcefile)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(k__LINE__)operator(\)) operator({) + reserved(return) ident(NEW_LIT)operator(()ident(INT2FIX)operator(()ident(ruby_sourceline)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(is_local_id)operator(()ident(id)operator(\)\)) operator({) + reserved(if) operator(()ident(dyna_in_block)operator((\)) operator(&&) ident(rb_dvar_defined)operator(()ident(id)operator(\)\)) reserved(return) ident(NEW_DVAR)operator(()ident(id)operator(\);) + reserved(if) operator(()ident(local_id)operator(()ident(id)operator(\)\)) reserved(return) ident(NEW_LVAR)operator(()ident(id)operator(\);) + comment(/* method call without arguments */) +comment(#if 0 + /* Rite will warn this */ + rb_warn("ambiguous identifier; %s(\) or self.%s is better for method call", + rb_id2name(id\), rb_id2name(id\)\); +#endif) + reserved(return) ident(NEW_VCALL)operator(()ident(id)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(is_global_id)operator(()ident(id)operator(\)\)) operator({) + reserved(return) ident(NEW_GVAR)operator(()ident(id)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(is_instance_id)operator(()ident(id)operator(\)\)) operator({) + reserved(return) ident(NEW_IVAR)operator(()ident(id)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(is_const_id)operator(()ident(id)operator(\)\)) operator({) + reserved(return) ident(NEW_CONST)operator(()ident(id)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(is_class_id)operator(()ident(id)operator(\)\)) operator({) + reserved(return) ident(NEW_CVAR)operator(()ident(id)operator(\);) + operator(}) + ident(rb_compile_error)operator(()string<delimiter(")content(identifier %s is not valid)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(dyna_var_lookup) ident(_)operator((()ident(ID) ident(id)operator(\)\);) + +directive(static) ident(NODE)operator(*) +ident(assignable)operator(()ident(id)operator(,) ident(val)operator(\)) + ident(ID) ident(id)operator(;) + ident(NODE) operator(*)ident(val)operator(;) +operator({) + ident(value_expr)operator(()ident(val)operator(\);) + reserved(if) operator(()ident(id) operator(==) ident(kSELF)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Can't change the value of self)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(kNIL)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Can't assign to nil)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(kTRUE)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Can't assign to true)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(kFALSE)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Can't assign to false)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(k__FILE__)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Can't assign to __FILE__)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(id) operator(==) ident(k__LINE__)operator(\)) operator({) + ident(yyerror)operator(()string<delimiter(")content(Can't assign to __LINE__)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(is_local_id)operator(()ident(id)operator(\)\)) operator({) + reserved(if) operator(()ident(rb_dvar_curr)operator(()ident(id)operator(\)\)) operator({) + reserved(return) ident(NEW_DASGN_CURR)operator(()ident(id)operator(,) ident(val)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(dyna_var_lookup)operator(()ident(id)operator(\)\)) operator({) + reserved(return) ident(NEW_DASGN)operator(()ident(id)operator(,) ident(val)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(local_id)operator(()ident(id)operator(\)) operator(||) operator(!)ident(dyna_in_block)operator((\)\)) operator({) + reserved(return) ident(NEW_LASGN)operator(()ident(id)operator(,) ident(val)operator(\);) + operator(}) + reserved(else)operator({) + ident(rb_dvar_push)operator(()ident(id)operator(,) ident(Qnil)operator(\);) + reserved(return) ident(NEW_DASGN_CURR)operator(()ident(id)operator(,) ident(val)operator(\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(is_global_id)operator(()ident(id)operator(\)\)) operator({) + reserved(return) ident(NEW_GASGN)operator(()ident(id)operator(,) ident(val)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(is_instance_id)operator(()ident(id)operator(\)\)) operator({) + reserved(return) ident(NEW_IASGN)operator(()ident(id)operator(,) ident(val)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(is_const_id)operator(()ident(id)operator(\)\)) operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) + ident(yyerror)operator(()string<delimiter(")content(dynamic constant assignment)delimiter(")>operator(\);) + reserved(return) ident(NEW_CDECL)operator(()ident(id)operator(,) ident(val)operator(,) integer(0)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(is_class_id)operator(()ident(id)operator(\)\)) operator({) + reserved(if) operator(()ident(in_def) operator(||) ident(in_single)operator(\)) reserved(return) ident(NEW_CVASGN)operator(()ident(id)operator(,) ident(val)operator(\);) + reserved(return) ident(NEW_CVDECL)operator(()ident(id)operator(,) ident(val)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(identifier %s is not valid)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(aryset)operator(()ident(recv)operator(,) ident(idx)operator(\)) + ident(NODE) operator(*)ident(recv)operator(,) operator(*)ident(idx)operator(;) +operator({) + reserved(if) operator(()ident(recv) operator(&&) ident(nd_type)operator(()ident(recv)operator(\)) operator(==) ident(NODE_SELF)operator(\)) + ident(recv) operator(=) operator(()ident(NODE) operator(*\))integer(1)operator(;) + reserved(else) + ident(value_expr)operator(()ident(recv)operator(\);) + reserved(return) ident(NEW_ATTRASGN)operator(()ident(recv)operator(,) ident(tASET)operator(,) ident(idx)operator(\);) +operator(}) + +ident(ID) +ident(rb_id_attrset)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + ident(id) operator(&=) operator(~)ident(ID_SCOPE_MASK)operator(;) + ident(id) operator(|=) ident(ID_ATTRSET)operator(;) + reserved(return) ident(id)operator(;) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(attrset)operator(()ident(recv)operator(,) ident(id)operator(\)) + ident(NODE) operator(*)ident(recv)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator(()ident(recv) operator(&&) ident(nd_type)operator(()ident(recv)operator(\)) operator(==) ident(NODE_SELF)operator(\)) + ident(recv) operator(=) operator(()ident(NODE) operator(*\))integer(1)operator(;) + reserved(else) + ident(value_expr)operator(()ident(recv)operator(\);) + reserved(return) ident(NEW_ATTRASGN)operator(()ident(recv)operator(,) ident(rb_id_attrset)operator(()ident(id)operator(\),) integer(0)operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_backref_error)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_NTH_REF)operator(:) + ident(rb_compile_error)operator(()string<delimiter(")content(Can't set variable $%d)delimiter(")>operator(,) ident(node)operator(->)ident(nd_nth)operator(\);) + reserved(break)operator(;) + reserved(case) label(NODE_BACK_REF)operator(:) + ident(rb_compile_error)operator(()string<delimiter(")content(Can't set variable $%c)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(node)operator(->)ident(nd_nth)operator(\);) + reserved(break)operator(;) + operator(}) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(arg_concat)operator(()ident(node1)operator(,) ident(node2)operator(\)) + ident(NODE) operator(*)ident(node1)operator(;) + ident(NODE) operator(*)ident(node2)operator(;) +operator({) + reserved(if) operator((!)ident(node2)operator(\)) reserved(return) ident(node1)operator(;) + reserved(return) ident(NEW_ARGSCAT)operator(()ident(node1)operator(,) ident(node2)operator(\);) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(arg_add)operator(()ident(node1)operator(,) ident(node2)operator(\)) + ident(NODE) operator(*)ident(node1)operator(;) + ident(NODE) operator(*)ident(node2)operator(;) +operator({) + reserved(if) operator((!)ident(node1)operator(\)) reserved(return) ident(NEW_LIST)operator(()ident(node2)operator(\);) + reserved(if) operator(()ident(nd_type)operator(()ident(node1)operator(\)) operator(==) ident(NODE_ARRAY)operator(\)) operator({) + reserved(return) ident(list_append)operator(()ident(node1)operator(,) ident(node2)operator(\);) + operator(}) + reserved(else) operator({) + reserved(return) ident(NEW_ARGSPUSH)operator(()ident(node1)operator(,) ident(node2)operator(\);) + operator(}) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(node_assign)operator(()ident(lhs)operator(,) ident(rhs)operator(\)) + ident(NODE) operator(*)ident(lhs)operator(,) operator(*)ident(rhs)operator(;) +operator({) + reserved(if) operator((!)ident(lhs)operator(\)) reserved(return) integer(0)operator(;) + + ident(value_expr)operator(()ident(rhs)operator(\);) + reserved(switch) operator(()ident(nd_type)operator(()ident(lhs)operator(\)\)) operator({) + reserved(case) label(NODE_GASGN)operator(:) + reserved(case) label(NODE_IASGN)operator(:) + reserved(case) label(NODE_LASGN)operator(:) + reserved(case) label(NODE_DASGN)operator(:) + reserved(case) label(NODE_DASGN_CURR)operator(:) + reserved(case) label(NODE_MASGN)operator(:) + reserved(case) label(NODE_CDECL)operator(:) + reserved(case) label(NODE_CVDECL)operator(:) + reserved(case) label(NODE_CVASGN)operator(:) + ident(lhs)operator(->)ident(nd_value) operator(=) ident(rhs)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_ATTRASGN)operator(:) + reserved(case) label(NODE_CALL)operator(:) + ident(lhs)operator(->)ident(nd_args) operator(=) ident(arg_add)operator(()ident(lhs)operator(->)ident(nd_args)operator(,) ident(rhs)operator(\);) + reserved(break)operator(;) + + reserved(default)operator(:) + comment(/* should not happen */) + reserved(break)operator(;) + operator(}) + + reserved(return) ident(lhs)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(value_expr0)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + pre_type(int) ident(cond) operator(=) integer(0)operator(;) + + reserved(while) operator(()ident(node)operator(\)) operator({) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_DEFN)operator(:) + reserved(case) label(NODE_DEFS)operator(:) + ident(parser_warning)operator(()ident(node)operator(,) string<delimiter(")content(void value expression)delimiter(")>operator(\);) + reserved(return) ident(Qfalse)operator(;) + + reserved(case) label(NODE_RETURN)operator(:) + reserved(case) label(NODE_BREAK)operator(:) + reserved(case) label(NODE_NEXT)operator(:) + reserved(case) label(NODE_REDO)operator(:) + reserved(case) label(NODE_RETRY)operator(:) + reserved(if) operator((!)ident(cond)operator(\)) ident(yyerror)operator(()string<delimiter(")content(void value expression)delimiter(")>operator(\);) + comment(/* or "control never reach"? */) + reserved(return) ident(Qfalse)operator(;) + + reserved(case) label(NODE_BLOCK)operator(:) + reserved(while) operator(()ident(node)operator(->)ident(nd_next)operator(\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + operator(}) + ident(node) operator(=) ident(node)operator(->)ident(nd_head)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_BEGIN)operator(:) + ident(node) operator(=) ident(node)operator(->)ident(nd_body)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_IF)operator(:) + reserved(if) operator((!)ident(value_expr)operator(()ident(node)operator(->)ident(nd_body)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + ident(node) operator(=) ident(node)operator(->)ident(nd_else)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_AND)operator(:) + reserved(case) label(NODE_OR)operator(:) + ident(cond) operator(=) integer(1)operator(;) + ident(node) operator(=) ident(node)operator(->)ident(nd_2nd)operator(;) + reserved(break)operator(;) + + reserved(case) label(NODE_NEWLINE)operator(:) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) + + reserved(return) ident(Qtrue)operator(;) +operator(}) + +directive(static) directive(void) +ident(void_expr0)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + pre_type(char) operator(*)ident(useless) operator(=) integer(0)operator(;) + + reserved(if) operator((!)ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)) reserved(return)operator(;) + + label(again)operator(:) + reserved(if) operator((!)ident(node)operator(\)) reserved(return)operator(;) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_NEWLINE)operator(:) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + reserved(goto) ident(again)operator(;) + + reserved(case) label(NODE_CALL)operator(:) + reserved(switch) operator(()ident(node)operator(->)ident(nd_mid)operator(\)) operator({) + reserved(case) char('+')operator(:) + reserved(case) char('-')operator(:) + reserved(case) char('*')operator(:) + reserved(case) char('/')operator(:) + reserved(case) char('%')operator(:) + reserved(case) label(tPOW)operator(:) + reserved(case) label(tUPLUS)operator(:) + reserved(case) label(tUMINUS)operator(:) + reserved(case) char('|')operator(:) + reserved(case) char('^')operator(:) + reserved(case) char('&')operator(:) + reserved(case) label(tCMP)operator(:) + reserved(case) char('>')operator(:) + reserved(case) label(tGEQ)operator(:) + reserved(case) char('<')operator(:) + reserved(case) label(tLEQ)operator(:) + reserved(case) label(tEQ)operator(:) + reserved(case) label(tNEQ)operator(:) + ident(useless) operator(=) ident(rb_id2name)operator(()ident(node)operator(->)ident(nd_mid)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_LVAR)operator(:) + reserved(case) label(NODE_DVAR)operator(:) + reserved(case) label(NODE_GVAR)operator(:) + reserved(case) label(NODE_IVAR)operator(:) + reserved(case) label(NODE_CVAR)operator(:) + reserved(case) label(NODE_NTH_REF)operator(:) + reserved(case) label(NODE_BACK_REF)operator(:) + ident(useless) operator(=) string<delimiter(")content(a variable)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_CONST)operator(:) + reserved(case) label(NODE_CREF)operator(:) + ident(useless) operator(=) string<delimiter(")content(a constant)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_LIT)operator(:) + reserved(case) label(NODE_STR)operator(:) + reserved(case) label(NODE_DSTR)operator(:) + reserved(case) label(NODE_DREGX)operator(:) + reserved(case) label(NODE_DREGX_ONCE)operator(:) + ident(useless) operator(=) string<delimiter(")content(a literal)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_COLON2)operator(:) + reserved(case) label(NODE_COLON3)operator(:) + ident(useless) operator(=) string<delimiter(")content(::)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_DOT2)operator(:) + ident(useless) operator(=) string<delimiter(")content(..)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_DOT3)operator(:) + ident(useless) operator(=) string<delimiter(")content(...)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_SELF)operator(:) + ident(useless) operator(=) string<delimiter(")content(self)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_NIL)operator(:) + ident(useless) operator(=) string<delimiter(")content(nil)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_TRUE)operator(:) + ident(useless) operator(=) string<delimiter(")content(true)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_FALSE)operator(:) + ident(useless) operator(=) string<delimiter(")content(false)delimiter(")>operator(;) + reserved(break)operator(;) + reserved(case) label(NODE_DEFINED)operator(:) + ident(useless) operator(=) string<delimiter(")content(defined?)delimiter(")>operator(;) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(useless)operator(\)) operator({) + pre_type(int) ident(line) operator(=) ident(ruby_sourceline)operator(;) + + ident(ruby_sourceline) operator(=) ident(nd_line)operator(()ident(node)operator(\);) + ident(rb_warn)operator(()string<delimiter(")content(useless use of %s in void context)delimiter(")>operator(,) ident(useless)operator(\);) + ident(ruby_sourceline) operator(=) ident(line)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(void_stmts)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(if) operator((!)ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)) reserved(return)operator(;) + reserved(if) operator((!)ident(node)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(!=) ident(NODE_BLOCK)operator(\)) reserved(return)operator(;) + + reserved(for) operator((;;\)) operator({) + reserved(if) operator((!)ident(node)operator(->)ident(nd_next)operator(\)) reserved(return)operator(;) + ident(void_expr0)operator(()ident(node)operator(->)ident(nd_head)operator(\);) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + operator(}) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(remove_begin)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + ident(NODE) operator(**)ident(n) operator(=) operator(&)ident(node)operator(;) + reserved(while) operator((*)ident(n)operator(\)) operator({) + reserved(switch) operator(()ident(nd_type)operator((*)ident(n)operator(\)\)) operator({) + reserved(case) label(NODE_NEWLINE)operator(:) + ident(n) operator(=) operator(&(*)ident(n)operator(\)->)ident(nd_next)operator(;) + reserved(continue)operator(;) + reserved(case) label(NODE_BEGIN)operator(:) + operator(*)ident(n) operator(=) operator((*)ident(n)operator(\)->)ident(nd_body)operator(;) + reserved(default)operator(:) + reserved(return) ident(node)operator(;) + operator(}) + operator(}) + reserved(return) ident(node)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(assign_in_cond)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_MASGN)operator(:) + ident(yyerror)operator(()string<delimiter(")content(multiple assignment in conditional)delimiter(")>operator(\);) + reserved(return) integer(1)operator(;) + + reserved(case) label(NODE_LASGN)operator(:) + reserved(case) label(NODE_DASGN)operator(:) + reserved(case) label(NODE_GASGN)operator(:) + reserved(case) label(NODE_IASGN)operator(:) + reserved(break)operator(;) + + reserved(case) label(NODE_NEWLINE)operator(:) + reserved(default)operator(:) + reserved(return) integer(0)operator(;) + operator(}) + + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(->)ident(nd_value)operator(\)\)) operator({) + reserved(case) label(NODE_LIT)operator(:) + reserved(case) label(NODE_STR)operator(:) + reserved(case) label(NODE_NIL)operator(:) + reserved(case) label(NODE_TRUE)operator(:) + reserved(case) label(NODE_FALSE)operator(:) + comment(/* reports always */) + ident(parser_warn)operator(()ident(node)operator(->)ident(nd_value)operator(,) string<delimiter(")content(found = in conditional, should be ==)delimiter(")>operator(\);) + reserved(return) integer(1)operator(;) + + reserved(case) label(NODE_DSTR)operator(:) + reserved(case) label(NODE_XSTR)operator(:) + reserved(case) label(NODE_DXSTR)operator(:) + reserved(case) label(NODE_EVSTR)operator(:) + reserved(case) label(NODE_DREGX)operator(:) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) +comment(#if 0 + if (assign_in_cond(node->nd_value\) == 0\) { + parser_warning(node->nd_value, "assignment in condition"\); + } +#endif) + reserved(return) integer(1)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(e_option_supplied)operator((\)) +operator({) + reserved(if) operator(()ident(strcmp)operator(()ident(ruby_sourcefile)operator(,) string<delimiter(")content(-e)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) directive(void) +ident(warn_unless_e_option)operator(()ident(node)operator(,) ident(str)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) + directive(const) pre_type(char) operator(*)ident(str)operator(;) +operator({) + reserved(if) operator((!)ident(e_option_supplied)operator((\)\)) ident(parser_warn)operator(()ident(node)operator(,) ident(str)operator(\);) +operator(}) + +directive(static) directive(void) +ident(warning_unless_e_option)operator(()ident(node)operator(,) ident(str)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) + directive(const) pre_type(char) operator(*)ident(str)operator(;) +operator({) + reserved(if) operator((!)ident(e_option_supplied)operator((\)\)) ident(parser_warning)operator(()ident(node)operator(,) ident(str)operator(\);) +operator(}) + +directive(static) directive(void) +ident(fixup_nodes)operator(()ident(rootnode)operator(\)) + ident(NODE) operator(**)ident(rootnode)operator(;) +operator({) + ident(NODE) operator(*)ident(node)operator(,) operator(*)ident(next)operator(,) operator(*)ident(head)operator(;) + + reserved(for) operator(()ident(node) operator(=) operator(*)ident(rootnode)operator(;) ident(node)operator(;) ident(node) operator(=) ident(next)operator(\)) operator({) + reserved(enum) ident(node_type) ident(type)operator(;) + ident(VALUE) ident(val)operator(;) + + ident(next) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + ident(head) operator(=) ident(node)operator(->)ident(nd_head)operator(;) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(node)operator(\);) + operator(*)ident(rootnode) operator(=) ident(next)operator(;) + reserved(switch) operator(()ident(type) operator(=) ident(nd_type)operator(()ident(head)operator(\)\)) operator({) + reserved(case) label(NODE_DOT2)operator(:) + reserved(case) label(NODE_DOT3)operator(:) + ident(val) operator(=) ident(rb_range_new)operator(()ident(head)operator(->)ident(nd_beg)operator(->)ident(nd_lit)operator(,) ident(head)operator(->)ident(nd_end)operator(->)ident(nd_lit)operator(,) + ident(type) operator(==) ident(NODE_DOT3) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(\);) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(head)operator(->)ident(nd_beg)operator(\);) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(head)operator(->)ident(nd_end)operator(\);) + ident(nd_set_type)operator(()ident(head)operator(,) ident(NODE_LIT)operator(\);) + ident(head)operator(->)ident(nd_lit) operator(=) ident(val)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) +operator(}) + +directive(static) ident(NODE) operator(*)ident(cond0)operator((\);) + +directive(static) ident(NODE)operator(*) +ident(range_op)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(enum) ident(node_type) ident(type)operator(;) + + reserved(if) operator(()ident(node) operator(==) integer(0)operator(\)) reserved(return) integer(0)operator(;) + + ident(type) operator(=) ident(nd_type)operator(()ident(node)operator(\);) + reserved(if) operator(()ident(type) operator(==) ident(NODE_NEWLINE)operator(\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_next)operator(;) + ident(type) operator(=) ident(nd_type)operator(()ident(node)operator(\);) + operator(}) + ident(value_expr)operator(()ident(node)operator(\);) + reserved(if) operator(()ident(type) operator(==) ident(NODE_LIT) operator(&&) ident(FIXNUM_P)operator(()ident(node)operator(->)ident(nd_lit)operator(\)\)) operator({) + ident(warn_unless_e_option)operator(()ident(node)operator(,) string<delimiter(")content(integer literal in conditional range)delimiter(")>operator(\);) + reserved(return) ident(call_op)operator(()ident(node)operator(,)ident(tEQ)operator(,)integer(1)operator(,)ident(NEW_GVAR)operator(()ident(rb_intern)operator(()string<delimiter(")content($.)delimiter(")>operator(\)\)\);) + operator(}) + reserved(return) ident(cond0)operator(()ident(node)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(literal_node)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(if) operator((!)ident(node)operator(\)) reserved(return) integer(1)operator(;) comment(/* same as NODE_NIL */) + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_LIT)operator(:) + reserved(case) label(NODE_STR)operator(:) + reserved(case) label(NODE_DSTR)operator(:) + reserved(case) label(NODE_EVSTR)operator(:) + reserved(case) label(NODE_DREGX)operator(:) + reserved(case) label(NODE_DREGX_ONCE)operator(:) + reserved(case) label(NODE_DSYM)operator(:) + reserved(return) integer(2)operator(;) + reserved(case) label(NODE_TRUE)operator(:) + reserved(case) label(NODE_FALSE)operator(:) + reserved(case) label(NODE_NIL)operator(:) + reserved(return) integer(1)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(cond0)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(if) operator(()ident(node) operator(==) integer(0)operator(\)) reserved(return) integer(0)operator(;) + ident(assign_in_cond)operator(()ident(node)operator(\);) + + reserved(switch) operator(()ident(nd_type)operator(()ident(node)operator(\)\)) operator({) + reserved(case) label(NODE_DSTR)operator(:) + reserved(case) label(NODE_EVSTR)operator(:) + reserved(case) label(NODE_STR)operator(:) + ident(rb_warn)operator(()string<delimiter(")content(string literal in condition)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_DREGX)operator(:) + reserved(case) label(NODE_DREGX_ONCE)operator(:) + ident(warning_unless_e_option)operator(()ident(node)operator(,) string<delimiter(")content(regex literal in condition)delimiter(")>operator(\);) + ident(local_cnt)operator(()char('_')operator(\);) + ident(local_cnt)operator(()char('~')operator(\);) + reserved(return) ident(NEW_MATCH2)operator(()ident(node)operator(,) ident(NEW_GVAR)operator(()ident(rb_intern)operator(()string<delimiter(")content($_)delimiter(")>operator(\)\)\);) + + reserved(case) label(NODE_AND)operator(:) + reserved(case) label(NODE_OR)operator(:) + ident(node)operator(->)ident(nd_1st) operator(=) ident(cond0)operator(()ident(node)operator(->)ident(nd_1st)operator(\);) + ident(node)operator(->)ident(nd_2nd) operator(=) ident(cond0)operator(()ident(node)operator(->)ident(nd_2nd)operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_DOT2)operator(:) + reserved(case) label(NODE_DOT3)operator(:) + ident(node)operator(->)ident(nd_beg) operator(=) ident(range_op)operator(()ident(node)operator(->)ident(nd_beg)operator(\);) + ident(node)operator(->)ident(nd_end) operator(=) ident(range_op)operator(()ident(node)operator(->)ident(nd_end)operator(\);) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_DOT2)operator(\)) ident(nd_set_type)operator(()ident(node)operator(,)ident(NODE_FLIP2)operator(\);) + reserved(else) reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_DOT3)operator(\)) ident(nd_set_type)operator(()ident(node)operator(,) ident(NODE_FLIP3)operator(\);) + ident(node)operator(->)ident(nd_cnt) operator(=) ident(local_append)operator(()ident(internal_id)operator((\)\);) + reserved(if) operator((!)ident(e_option_supplied)operator((\)\)) operator({) + pre_type(int) ident(b) operator(=) ident(literal_node)operator(()ident(node)operator(->)ident(nd_beg)operator(\);) + pre_type(int) ident(e) operator(=) ident(literal_node)operator(()ident(node)operator(->)ident(nd_end)operator(\);) + reserved(if) operator((()ident(b) operator(==) integer(1) operator(&&) ident(e) operator(==) integer(1)operator(\)) operator(||) operator(()ident(b) operator(+) ident(e) operator(>=) integer(2) operator(&&) ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)\)) operator({) + ident(parser_warn)operator(()ident(node)operator(,) string<delimiter(")content(range literal in condition)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(NODE_DSYM)operator(:) + ident(parser_warning)operator(()ident(node)operator(,) string<delimiter(")content(literal in condition)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(NODE_LIT)operator(:) + reserved(if) operator(()ident(TYPE)operator(()ident(node)operator(->)ident(nd_lit)operator(\)) operator(==) ident(T_REGEXP)operator(\)) operator({) + ident(warn_unless_e_option)operator(()ident(node)operator(,) string<delimiter(")content(regex literal in condition)delimiter(")>operator(\);) + ident(nd_set_type)operator(()ident(node)operator(,) ident(NODE_MATCH)operator(\);) + ident(local_cnt)operator(()char('_')operator(\);) + ident(local_cnt)operator(()char('~')operator(\);) + operator(}) + reserved(else) operator({) + ident(parser_warning)operator(()ident(node)operator(,) string<delimiter(")content(literal in condition)delimiter(")>operator(\);) + operator(}) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + reserved(return) ident(node)operator(;) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(cond)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(if) operator(()ident(node) operator(==) integer(0)operator(\)) reserved(return) integer(0)operator(;) + ident(value_expr)operator(()ident(node)operator(\);) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_NEWLINE)operator(\){) + ident(node)operator(->)ident(nd_next) operator(=) ident(cond0)operator(()ident(node)operator(->)ident(nd_next)operator(\);) + reserved(return) ident(node)operator(;) + operator(}) + reserved(return) ident(cond0)operator(()ident(node)operator(\);) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(logop)operator(()ident(type)operator(,) ident(left)operator(,) ident(right)operator(\)) + reserved(enum) ident(node_type) ident(type)operator(;) + ident(NODE) operator(*)ident(left)operator(,) operator(*)ident(right)operator(;) +operator({) + ident(value_expr)operator(()ident(left)operator(\);) + reserved(if) operator(()ident(left) operator(&&) ident(nd_type)operator(()ident(left)operator(\)) operator(==) ident(type)operator(\)) operator({) + ident(NODE) operator(*)ident(node) operator(=) ident(left)operator(,) operator(*)ident(second)operator(;) + reserved(while) operator((()ident(second) operator(=) ident(node)operator(->)ident(nd_2nd)operator(\)) operator(!=) integer(0) operator(&&) ident(nd_type)operator(()ident(second)operator(\)) operator(==) ident(type)operator(\)) operator({) + ident(node) operator(=) ident(second)operator(;) + operator(}) + ident(node)operator(->)ident(nd_2nd) operator(=) ident(NEW_NODE)operator(()ident(type)operator(,) ident(second)operator(,) ident(right)operator(,) integer(0)operator(\);) + reserved(return) ident(left)operator(;) + operator(}) + reserved(return) ident(NEW_NODE)operator(()ident(type)operator(,) ident(left)operator(,) ident(right)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(cond_negative)operator(()ident(nodep)operator(\)) + ident(NODE) operator(**)ident(nodep)operator(;) +operator({) + ident(NODE) operator(*)ident(c) operator(=) operator(*)ident(nodep)operator(;) + + reserved(if) operator((!)ident(c)operator(\)) reserved(return) integer(0)operator(;) + reserved(switch) operator(()ident(nd_type)operator(()ident(c)operator(\)\)) operator({) + reserved(case) label(NODE_NOT)operator(:) + operator(*)ident(nodep) operator(=) ident(c)operator(->)ident(nd_body)operator(;) + reserved(return) integer(1)operator(;) + reserved(case) label(NODE_NEWLINE)operator(:) + reserved(if) operator(()ident(c)operator(->)ident(nd_next) operator(&&) ident(nd_type)operator(()ident(c)operator(->)ident(nd_next)operator(\)) operator(==) ident(NODE_NOT)operator(\)) operator({) + ident(c)operator(->)ident(nd_next) operator(=) ident(c)operator(->)ident(nd_next)operator(->)ident(nd_body)operator(;) + reserved(return) integer(1)operator(;) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) directive(void) +ident(no_blockarg)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(if) operator(()ident(node) operator(&&) ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_BLOCK_PASS)operator(\)) operator({) + ident(rb_compile_error)operator(()string<delimiter(")content(block argument should not be given)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(ret_args)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(if) operator(()ident(node)operator(\)) operator({) + ident(no_blockarg)operator(()ident(node)operator(\);) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_ARRAY) operator(&&) ident(node)operator(->)ident(nd_next) operator(==) integer(0)operator(\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_head)operator(;) + operator(}) + reserved(if) operator(()ident(node) operator(&&) ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_SPLAT)operator(\)) operator({) + ident(node) operator(=) ident(NEW_SVALUE)operator(()ident(node)operator(\);) + operator(}) + operator(}) + reserved(return) ident(node)operator(;) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(new_yield)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + pre_type(long) ident(state) operator(=) ident(Qtrue)operator(;) + + reserved(if) operator(()ident(node)operator(\)) operator({) + ident(no_blockarg)operator(()ident(node)operator(\);) + reserved(if) operator(()ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_ARRAY) operator(&&) ident(node)operator(->)ident(nd_next) operator(==) integer(0)operator(\)) operator({) + ident(node) operator(=) ident(node)operator(->)ident(nd_head)operator(;) + ident(state) operator(=) ident(Qfalse)operator(;) + operator(}) + reserved(if) operator(()ident(node) operator(&&) ident(nd_type)operator(()ident(node)operator(\)) operator(==) ident(NODE_SPLAT)operator(\)) operator({) + ident(state) operator(=) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(state) operator(=) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(NEW_YIELD)operator(()ident(node)operator(,) ident(state)operator(\);) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(negate_lit)operator(()ident(node)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(node)operator(->)ident(nd_lit)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(node)operator(->)ident(nd_lit) operator(=) ident(LONG2FIX)operator((-)ident(FIX2LONG)operator(()ident(node)operator(->)ident(nd_lit)operator(\)\);) + reserved(break)operator(;) + reserved(case) label(T_BIGNUM)operator(:) + ident(node)operator(->)ident(nd_lit) operator(=) ident(rb_funcall)operator(()ident(node)operator(->)ident(nd_lit)operator(,)ident(tUMINUS)operator(,)integer(0)operator(,)integer(0)operator(\);) + reserved(break)operator(;) + reserved(case) label(T_FLOAT)operator(:) + ident(RFLOAT)operator(()ident(node)operator(->)ident(nd_lit)operator(\)->)ident(value) operator(=) operator(-)ident(RFLOAT)operator(()ident(node)operator(->)ident(nd_lit)operator(\)->)ident(value)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + reserved(return) ident(node)operator(;) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(arg_blk_pass)operator(()ident(node1)operator(,) ident(node2)operator(\)) + ident(NODE) operator(*)ident(node1)operator(;) + ident(NODE) operator(*)ident(node2)operator(;) +operator({) + reserved(if) operator(()ident(node2)operator(\)) operator({) + ident(node2)operator(->)ident(nd_head) operator(=) ident(node1)operator(;) + reserved(return) ident(node2)operator(;) + operator(}) + reserved(return) ident(node1)operator(;) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(arg_prepend)operator(()ident(node1)operator(,) ident(node2)operator(\)) + ident(NODE) operator(*)ident(node1)operator(,) operator(*)ident(node2)operator(;) +operator({) + reserved(switch) operator(()ident(nd_type)operator(()ident(node2)operator(\)\)) operator({) + reserved(case) label(NODE_ARRAY)operator(:) + reserved(return) ident(list_concat)operator(()ident(NEW_LIST)operator(()ident(node1)operator(\),) ident(node2)operator(\);) + + reserved(case) label(NODE_SPLAT)operator(:) + reserved(return) ident(arg_concat)operator(()ident(node1)operator(,) ident(node2)operator(->)ident(nd_head)operator(\);) + + reserved(case) label(NODE_BLOCK_PASS)operator(:) + ident(node2)operator(->)ident(nd_body) operator(=) ident(arg_prepend)operator(()ident(node1)operator(,) ident(node2)operator(->)ident(nd_body)operator(\);) + reserved(return) ident(node2)operator(;) + + reserved(default)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(unknown nodetype(%d\) for arg_prepend)delimiter(")>operator(,) ident(nd_type)operator(()ident(node2)operator(\)\);) + operator(}) + reserved(return) integer(0)operator(;) comment(/* not reached */) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(new_call)operator(()ident(r)operator(,)ident(m)operator(,)ident(a)operator(\)) + ident(NODE) operator(*)ident(r)operator(;) + ident(ID) ident(m)operator(;) + ident(NODE) operator(*)ident(a)operator(;) +operator({) + reserved(if) operator(()ident(a) operator(&&) ident(nd_type)operator(()ident(a)operator(\)) operator(==) ident(NODE_BLOCK_PASS)operator(\)) operator({) + ident(a)operator(->)ident(nd_iter) operator(=) ident(NEW_CALL)operator(()ident(r)operator(,)ident(m)operator(,)ident(a)operator(->)ident(nd_head)operator(\);) + reserved(return) ident(a)operator(;) + operator(}) + reserved(return) ident(NEW_CALL)operator(()ident(r)operator(,)ident(m)operator(,)ident(a)operator(\);) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(new_fcall)operator(()ident(m)operator(,)ident(a)operator(\)) + ident(ID) ident(m)operator(;) + ident(NODE) operator(*)ident(a)operator(;) +operator({) + reserved(if) operator(()ident(a) operator(&&) ident(nd_type)operator(()ident(a)operator(\)) operator(==) ident(NODE_BLOCK_PASS)operator(\)) operator({) + ident(a)operator(->)ident(nd_iter) operator(=) ident(NEW_FCALL)operator(()ident(m)operator(,)ident(a)operator(->)ident(nd_head)operator(\);) + reserved(return) ident(a)operator(;) + operator(}) + reserved(return) ident(NEW_FCALL)operator(()ident(m)operator(,)ident(a)operator(\);) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(new_super)operator(()ident(a)operator(\)) + ident(NODE) operator(*)ident(a)operator(;) +operator({) + reserved(if) operator(()ident(a) operator(&&) ident(nd_type)operator(()ident(a)operator(\)) operator(==) ident(NODE_BLOCK_PASS)operator(\)) operator({) + ident(a)operator(->)ident(nd_iter) operator(=) ident(NEW_SUPER)operator(()ident(a)operator(->)ident(nd_head)operator(\);) + reserved(return) ident(a)operator(;) + operator(}) + reserved(return) ident(NEW_SUPER)operator(()ident(a)operator(\);) +operator(}) + +directive(static) reserved(struct) ident(local_vars) operator({) + ident(ID) operator(*)ident(tbl)operator(;) + pre_type(int) ident(nofree)operator(;) + pre_type(int) ident(cnt)operator(;) + pre_type(int) ident(dlev)operator(;) + reserved(struct) ident(RVarmap)operator(*) ident(dyna_vars)operator(;) + reserved(struct) ident(local_vars) operator(*)ident(prev)operator(;) +operator(}) operator(*)ident(lvtbl)operator(;) + +directive(static) directive(void) +ident(local_push)operator(()ident(top)operator(\)) + pre_type(int) ident(top)operator(;) +operator({) + reserved(struct) ident(local_vars) operator(*)ident(local)operator(;) + + ident(local) operator(=) ident(ALLOC)operator(()reserved(struct) ident(local_vars)operator(\);) + ident(local)operator(->)ident(prev) operator(=) ident(lvtbl)operator(;) + ident(local)operator(->)ident(nofree) operator(=) integer(0)operator(;) + ident(local)operator(->)ident(cnt) operator(=) integer(0)operator(;) + ident(local)operator(->)ident(tbl) operator(=) integer(0)operator(;) + ident(local)operator(->)ident(dlev) operator(=) integer(0)operator(;) + ident(local)operator(->)ident(dyna_vars) operator(=) ident(ruby_dyna_vars)operator(;) + ident(lvtbl) operator(=) ident(local)operator(;) + reserved(if) operator((!)ident(top)operator(\)) operator({) + comment(/* preserve reference for GC, but link should be cut. */) + ident(rb_dvar_push)operator(()integer(0)operator(,) operator(()ident(VALUE)operator(\))ident(ruby_dyna_vars)operator(\);) + ident(ruby_dyna_vars)operator(->)ident(next) operator(=) integer(0)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(local_pop)operator((\)) +operator({) + reserved(struct) ident(local_vars) operator(*)ident(local) operator(=) ident(lvtbl)operator(->)ident(prev)operator(;) + + reserved(if) operator(()ident(lvtbl)operator(->)ident(tbl)operator(\)) operator({) + reserved(if) operator((!)ident(lvtbl)operator(->)ident(nofree)operator(\)) ident(xfree)operator(()ident(lvtbl)operator(->)ident(tbl)operator(\);) + reserved(else) ident(lvtbl)operator(->)ident(tbl)operator([)integer(0)operator(]) operator(=) ident(lvtbl)operator(->)ident(cnt)operator(;) + operator(}) + ident(ruby_dyna_vars) operator(=) ident(lvtbl)operator(->)ident(dyna_vars)operator(;) + ident(xfree)operator(()ident(lvtbl)operator(\);) + ident(lvtbl) operator(=) ident(local)operator(;) +operator(}) + +directive(static) ident(ID)operator(*) +ident(local_tbl)operator((\)) +operator({) + ident(lvtbl)operator(->)ident(nofree) operator(=) integer(1)operator(;) + reserved(return) ident(lvtbl)operator(->)ident(tbl)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(local_append)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator(()ident(lvtbl)operator(->)ident(tbl) operator(==) integer(0)operator(\)) operator({) + ident(lvtbl)operator(->)ident(tbl) operator(=) ident(ALLOC_N)operator(()ident(ID)operator(,) integer(4)operator(\);) + ident(lvtbl)operator(->)ident(tbl)operator([)integer(0)operator(]) operator(=) integer(0)operator(;) + ident(lvtbl)operator(->)ident(tbl)operator([)integer(1)operator(]) operator(=) char('_')operator(;) + ident(lvtbl)operator(->)ident(tbl)operator([)integer(2)operator(]) operator(=) char('~')operator(;) + ident(lvtbl)operator(->)ident(cnt) operator(=) integer(2)operator(;) + reserved(if) operator(()ident(id) operator(==) char('_')operator(\)) reserved(return) integer(0)operator(;) + reserved(if) operator(()ident(id) operator(==) char('~')operator(\)) reserved(return) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(REALLOC_N)operator(()ident(lvtbl)operator(->)ident(tbl)operator(,) ident(ID)operator(,) ident(lvtbl)operator(->)ident(cnt)operator(+)integer(2)operator(\);) + operator(}) + + ident(lvtbl)operator(->)ident(tbl)operator([)ident(lvtbl)operator(->)ident(cnt)operator(+)integer(1)operator(]) operator(=) ident(id)operator(;) + reserved(return) ident(lvtbl)operator(->)ident(cnt)operator(++;) +operator(}) + +directive(static) pre_type(int) +ident(local_cnt)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + pre_type(int) ident(cnt)operator(,) ident(max)operator(;) + + reserved(if) operator(()ident(id) operator(==) integer(0)operator(\)) reserved(return) ident(lvtbl)operator(->)ident(cnt)operator(;) + + reserved(for) operator(()ident(cnt)operator(=)integer(1)operator(,) ident(max)operator(=)ident(lvtbl)operator(->)ident(cnt)operator(+)integer(1)operator(;) ident(cnt)operator(<)ident(max)operator(;)ident(cnt)operator(++\)) operator({) + reserved(if) operator(()ident(lvtbl)operator(->)ident(tbl)operator([)ident(cnt)operator(]) operator(==) ident(id)operator(\)) reserved(return) ident(cnt)operator(-)integer(1)operator(;) + operator(}) + reserved(return) ident(local_append)operator(()ident(id)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(local_id)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + pre_type(int) ident(i)operator(,) ident(max)operator(;) + + reserved(if) operator(()ident(lvtbl) operator(==) integer(0)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(3)operator(,) ident(max)operator(=)ident(lvtbl)operator(->)ident(cnt)operator(+)integer(1)operator(;) ident(i)operator(<)ident(max)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(lvtbl)operator(->)ident(tbl)operator([)ident(i)operator(]) operator(==) ident(id)operator(\)) reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) directive(void) +ident(top_local_init)operator((\)) +operator({) + ident(local_push)operator(()integer(1)operator(\);) + ident(lvtbl)operator(->)ident(cnt) operator(=) ident(ruby_scope)operator(->)ident(local_tbl)operator(?)ident(ruby_scope)operator(->)ident(local_tbl)operator([)integer(0)operator(]:)integer(0)operator(;) + reserved(if) operator(()ident(lvtbl)operator(->)ident(cnt) operator(>) integer(0)operator(\)) operator({) + ident(lvtbl)operator(->)ident(tbl) operator(=) ident(ALLOC_N)operator(()ident(ID)operator(,) ident(lvtbl)operator(->)ident(cnt)operator(+)integer(3)operator(\);) + ident(MEMCPY)operator(()ident(lvtbl)operator(->)ident(tbl)operator(,) ident(ruby_scope)operator(->)ident(local_tbl)operator(,) ident(ID)operator(,) ident(lvtbl)operator(->)ident(cnt)operator(+)integer(1)operator(\);) + operator(}) + reserved(else) operator({) + ident(lvtbl)operator(->)ident(tbl) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(ruby_dyna_vars)operator(\)) + ident(lvtbl)operator(->)ident(dlev) operator(=) integer(1)operator(;) + reserved(else) + ident(lvtbl)operator(->)ident(dlev) operator(=) integer(0)operator(;) +operator(}) + +directive(static) directive(void) +ident(top_local_setup)operator((\)) +operator({) + pre_type(int) ident(len) operator(=) ident(lvtbl)operator(->)ident(cnt)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(len) operator(>) integer(0)operator(\)) operator({) + ident(i) operator(=) ident(ruby_scope)operator(->)ident(local_tbl)operator(?)ident(ruby_scope)operator(->)ident(local_tbl)operator([)integer(0)operator(]:)integer(0)operator(;) + + reserved(if) operator(()ident(i) operator(<) ident(len)operator(\)) operator({) + reserved(if) operator(()ident(i) operator(==) integer(0) operator(||) operator(()ident(ruby_scope)operator(->)ident(flags) operator(&) ident(SCOPE_MALLOC)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(VALUE) operator(*)ident(vars) operator(=) ident(ALLOC_N)operator(()ident(VALUE)operator(,) ident(len)operator(+)integer(1)operator(\);) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(local_vars)operator(\)) operator({) + operator(*)ident(vars)operator(++) operator(=) ident(ruby_scope)operator(->)ident(local_vars)operator([-)integer(1)operator(];) + ident(MEMCPY)operator(()ident(vars)operator(,) ident(ruby_scope)operator(->)ident(local_vars)operator(,) ident(VALUE)operator(,) ident(i)operator(\);) + ident(rb_mem_clear)operator(()ident(vars)operator(+)ident(i)operator(,) ident(len)operator(-)ident(i)operator(\);) + operator(}) + reserved(else) operator({) + operator(*)ident(vars)operator(++) operator(=) integer(0)operator(;) + ident(rb_mem_clear)operator(()ident(vars)operator(,) ident(len)operator(\);) + operator(}) + ident(ruby_scope)operator(->)ident(local_vars) operator(=) ident(vars)operator(;) + ident(ruby_scope)operator(->)ident(flags) operator(|=) ident(SCOPE_MALLOC)operator(;) + operator(}) + reserved(else) operator({) + ident(VALUE) operator(*)ident(vars) operator(=) ident(ruby_scope)operator(->)ident(local_vars)operator(-)integer(1)operator(;) + ident(REALLOC_N)operator(()ident(vars)operator(,) ident(VALUE)operator(,) ident(len)operator(+)integer(1)operator(\);) + ident(ruby_scope)operator(->)ident(local_vars) operator(=) ident(vars)operator(+)integer(1)operator(;) + ident(rb_mem_clear)operator(()ident(ruby_scope)operator(->)ident(local_vars)operator(+)ident(i)operator(,) ident(len)operator(-)ident(i)operator(\);) + operator(}) + reserved(if) operator(()ident(ruby_scope)operator(->)ident(local_tbl) operator(&&) ident(ruby_scope)operator(->)ident(local_vars)operator([-)integer(1)operator(]) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator((!()ident(ruby_scope)operator(->)ident(flags) operator(&) ident(SCOPE_CLONE)operator(\)\)) + ident(xfree)operator(()ident(ruby_scope)operator(->)ident(local_tbl)operator(\);) + operator(}) + ident(ruby_scope)operator(->)ident(local_vars)operator([-)integer(1)operator(]) operator(=) integer(0)operator(;) comment(/* no reference needed */) + ident(ruby_scope)operator(->)ident(local_tbl) operator(=) ident(local_tbl)operator((\);) + operator(}) + operator(}) + ident(local_pop)operator((\);) +operator(}) + +preprocessor(#define) ident(DVAR_USED) ident(FL_USER6) + +directive(static) ident(VALUE) +ident(dyna_var_lookup)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(struct) ident(RVarmap) operator(*)ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + + reserved(while) operator(()ident(vars)operator(\)) operator({) + reserved(if) operator(()ident(vars)operator(->)ident(id) operator(==) ident(id)operator(\)) operator({) + ident(FL_SET)operator(()ident(vars)operator(,) ident(DVAR_USED)operator(\);) + reserved(return) ident(Qtrue)operator(;) + operator(}) + ident(vars) operator(=) ident(vars)operator(->)ident(next)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) reserved(struct) ident(RVarmap)operator(*) +ident(dyna_push)operator((\)) +operator({) + reserved(struct) ident(RVarmap)operator(*) ident(vars) operator(=) ident(ruby_dyna_vars)operator(;) + + ident(rb_dvar_push)operator(()integer(0)operator(,) integer(0)operator(\);) + ident(lvtbl)operator(->)ident(dlev)operator(++;) + reserved(return) ident(vars)operator(;) +operator(}) + +directive(static) directive(void) +ident(dyna_pop)operator(()ident(vars)operator(\)) + reserved(struct) ident(RVarmap)operator(*) ident(vars)operator(;) +operator({) + ident(lvtbl)operator(->)ident(dlev)operator(--;) + ident(ruby_dyna_vars) operator(=) ident(vars)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(dyna_in_block)operator((\)) +operator({) + reserved(return) operator(()ident(lvtbl)operator(->)ident(dlev) operator(>) integer(0)operator(\);) +operator(}) + +directive(static) ident(NODE) operator(*) +ident(dyna_init)operator(()ident(node)operator(,) ident(pre)operator(\)) + ident(NODE) operator(*)ident(node)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(pre)operator(;) +operator({) + reserved(struct) ident(RVarmap) operator(*)ident(post) operator(=) ident(ruby_dyna_vars)operator(;) + ident(NODE) operator(*)ident(var)operator(;) + + reserved(if) operator((!)ident(node) operator(||) operator(!)ident(post) operator(||) ident(pre) operator(==) ident(post)operator(\)) reserved(return) ident(node)operator(;) + reserved(for) operator(()ident(var) operator(=) integer(0)operator(;) ident(post) operator(!=) ident(pre) operator(&&) ident(post)operator(->)ident(id)operator(;) ident(post) operator(=) ident(post)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(post)operator(,) ident(DVAR_USED)operator(\)\)) operator({) + ident(var) operator(=) ident(NEW_DASGN_CURR)operator(()ident(post)operator(->)ident(id)operator(,) ident(var)operator(\);) + operator(}) + operator(}) + reserved(return) ident(block_append)operator(()ident(var)operator(,) ident(node)operator(\);) +operator(}) + +pre_type(int) +ident(ruby_parser_stack_on_heap)operator((\)) +operator({) +preprocessor(#if) ident(defined)operator(()ident(YYMALLOC)operator(\)) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#else) + reserved(return) ident(Qtrue)operator(;) +preprocessor(#endif) +operator(}) + +directive(void) +ident(rb_gc_mark_parser)operator((\)) +operator({) +preprocessor(#if) ident(defined) ident(YYMALLOC) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(parser_heap)operator(\);) +preprocessor(#elif) ident(defined) ident(yystacksize) + reserved(if) operator(()ident(yyvsp)operator(\)) ident(rb_gc_mark_locations)operator((()ident(VALUE) operator(*\))ident(yyvs)operator(,) operator(()ident(VALUE) operator(*\))ident(yyvsp)operator(\);) +preprocessor(#endif) + + reserved(if) operator((!)ident(ruby_in_compile)operator(\)) reserved(return)operator(;) + + ident(rb_gc_mark_maybe)operator((()ident(VALUE)operator(\))ident(yylval)operator(.)ident(node)operator(\);) + ident(rb_gc_mark)operator(()ident(ruby_debug_lines)operator(\);) + ident(rb_gc_mark)operator(()ident(lex_lastline)operator(\);) + ident(rb_gc_mark)operator(()ident(lex_input)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(lex_strterm)operator(\);) + ident(rb_gc_mark)operator((()ident(VALUE)operator(\))ident(deferred_nodes)operator(\);) +operator(}) + +directive(void) +ident(rb_parser_append_print)operator((\)) +operator({) + ident(ruby_eval_tree) operator(=) + ident(block_append)operator(()ident(ruby_eval_tree)operator(,) + ident(NEW_FCALL)operator(()ident(rb_intern)operator(()string<delimiter(")content(print)delimiter(")>operator(\),) + ident(NEW_ARRAY)operator(()ident(NEW_GVAR)operator(()ident(rb_intern)operator(()string<delimiter(")content($_)delimiter(")>operator(\)\)\)\)\);) +operator(}) + +directive(void) +ident(rb_parser_while_loop)operator(()ident(chop)operator(,) ident(split)operator(\)) + pre_type(int) ident(chop)operator(,) ident(split)operator(;) +operator({) + reserved(if) operator(()ident(split)operator(\)) operator({) + ident(ruby_eval_tree) operator(=) + ident(block_append)operator(()ident(NEW_GASGN)operator(()ident(rb_intern)operator(()string<delimiter(")content($F)delimiter(")>operator(\),) + ident(NEW_CALL)operator(()ident(NEW_GVAR)operator(()ident(rb_intern)operator(()string<delimiter(")content($_)delimiter(")>operator(\)\),) + ident(rb_intern)operator(()string<delimiter(")content(split)delimiter(")>operator(\),) integer(0)operator(\)\),) + ident(ruby_eval_tree)operator(\);) + operator(}) + reserved(if) operator(()ident(chop)operator(\)) operator({) + ident(ruby_eval_tree) operator(=) + ident(block_append)operator(()ident(NEW_CALL)operator(()ident(NEW_GVAR)operator(()ident(rb_intern)operator(()string<delimiter(")content($_)delimiter(")>operator(\)\),) + ident(rb_intern)operator(()string<delimiter(")content(chop!)delimiter(")>operator(\),) integer(0)operator(\),) ident(ruby_eval_tree)operator(\);) + operator(}) + ident(ruby_eval_tree) operator(=) ident(NEW_OPT_N)operator(()ident(ruby_eval_tree)operator(\);) +operator(}) + +directive(static) reserved(struct) operator({) + ident(ID) ident(token)operator(;) + pre_type(char) operator(*)ident(name)operator(;) +operator(}) ident(op_tbl)operator([]) operator(=) operator({) + operator({)ident(tDOT2)operator(,) string<delimiter(")content(..)delimiter(")>operator(},) + operator({)ident(tDOT3)operator(,) string<delimiter(")content(...)delimiter(")>operator(},) + operator({)char('+')operator(,) string<delimiter(")content(+)delimiter(")>operator(},) + operator({)char('-')operator(,) string<delimiter(")content(-)delimiter(")>operator(},) + operator({)char('+')operator(,) string<delimiter(")content(+(binary\))delimiter(")>operator(},) + operator({)char('-')operator(,) string<delimiter(")content(-(binary\))delimiter(")>operator(},) + operator({)char('*')operator(,) string<delimiter(")content(*)delimiter(")>operator(},) + operator({)char('/')operator(,) string<delimiter(")content(/)delimiter(")>operator(},) + operator({)char('%')operator(,) string<delimiter(")content(%)delimiter(")>operator(},) + operator({)ident(tPOW)operator(,) string<delimiter(")content(**)delimiter(")>operator(},) + operator({)ident(tUPLUS)operator(,) string<delimiter(")content(+@)delimiter(")>operator(},) + operator({)ident(tUMINUS)operator(,) string<delimiter(")content(-@)delimiter(")>operator(},) + operator({)ident(tUPLUS)operator(,) string<delimiter(")content(+(unary\))delimiter(")>operator(},) + operator({)ident(tUMINUS)operator(,) string<delimiter(")content(-(unary\))delimiter(")>operator(},) + operator({)char('|')operator(,) string<delimiter(")content(|)delimiter(")>operator(},) + operator({)char('^')operator(,) string<delimiter(")content(^)delimiter(")>operator(},) + operator({)char('&')operator(,) string<delimiter(")content(&)delimiter(")>operator(},) + operator({)ident(tCMP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(},) + operator({)char('>')operator(,) string<delimiter(")content(>)delimiter(")>operator(},) + operator({)ident(tGEQ)operator(,) string<delimiter(")content(>=)delimiter(")>operator(},) + operator({)char('<')operator(,) string<delimiter(")content(<)delimiter(")>operator(},) + operator({)ident(tLEQ)operator(,) string<delimiter(")content(<=)delimiter(")>operator(},) + operator({)ident(tEQ)operator(,) string<delimiter(")content(==)delimiter(")>operator(},) + operator({)ident(tEQQ)operator(,) string<delimiter(")content(===)delimiter(")>operator(},) + operator({)ident(tNEQ)operator(,) string<delimiter(")content(!=)delimiter(")>operator(},) + operator({)ident(tMATCH)operator(,) string<delimiter(")content(=~)delimiter(")>operator(},) + operator({)ident(tNMATCH)operator(,) string<delimiter(")content(!~)delimiter(")>operator(},) + operator({)char('!')operator(,) string<delimiter(")content(!)delimiter(")>operator(},) + operator({)char('~')operator(,) string<delimiter(")content(~)delimiter(")>operator(},) + operator({)char('!')operator(,) string<delimiter(")content(!(unary\))delimiter(")>operator(},) + operator({)char('~')operator(,) string<delimiter(")content(~(unary\))delimiter(")>operator(},) + operator({)char('!')operator(,) string<delimiter(")content(!@)delimiter(")>operator(},) + operator({)char('~')operator(,) string<delimiter(")content(~@)delimiter(")>operator(},) + operator({)ident(tAREF)operator(,) string<delimiter(")content([])delimiter(")>operator(},) + operator({)ident(tASET)operator(,) string<delimiter(")content([]=)delimiter(")>operator(},) + operator({)ident(tLSHFT)operator(,) string<delimiter(")content(<<)delimiter(")>operator(},) + operator({)ident(tRSHFT)operator(,) string<delimiter(")content(>>)delimiter(")>operator(},) + operator({)ident(tCOLON2)operator(,) string<delimiter(")content(::)delimiter(")>operator(},) + operator({)char('`')operator(,) string<delimiter(")content(`)delimiter(")>operator(},) + operator({)integer(0)operator(,) integer(0)operator(}) +operator(};) + +directive(static) ident(st_table) operator(*)ident(sym_tbl)operator(;) +directive(static) ident(st_table) operator(*)ident(sym_rev_tbl)operator(;) + +directive(void) +ident(Init_sym)operator((\)) +operator({) + ident(sym_tbl) operator(=) ident(st_init_strtable_with_size)operator(()integer(200)operator(\);) + ident(sym_rev_tbl) operator(=) ident(st_init_numtable_with_size)operator(()integer(200)operator(\);) +operator(}) + +directive(static) ident(ID) ident(last_id) operator(=) ident(tLAST_TOKEN)operator(;) + +directive(static) ident(ID) +ident(internal_id)operator((\)) +operator({) + reserved(return) ident(ID_INTERNAL) operator(|) operator((++)ident(last_id) operator(<<) ident(ID_SCOPE_SHIFT)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(is_special_global_name)operator(()ident(m)operator(\)) + directive(const) pre_type(char) operator(*)ident(m)operator(;) +operator({) + reserved(switch) operator((*)ident(m)operator(\)) operator({) + reserved(case) char('~')operator(:) reserved(case) char('*')operator(:) reserved(case) char('$')operator(:) reserved(case) char('?')operator(:) reserved(case) char('!')operator(:) reserved(case) char('@')operator(:) + reserved(case) char('/')operator(:) reserved(case) char('\\\\')operator(:) reserved(case) char(';')operator(:) reserved(case) char(',')operator(:) reserved(case) char('.')operator(:) reserved(case) char('=')operator(:) + reserved(case) char(':')operator(:) reserved(case) char('<')operator(:) reserved(case) char('>')operator(:) reserved(case) char('\\"')operator(:) + reserved(case) char('&')operator(:) reserved(case) char('`')operator(:) reserved(case) char('\\'')operator(:) reserved(case) char('+')operator(:) + reserved(case) char('0')operator(:) + operator(++)ident(m)operator(;) + reserved(break)operator(;) + reserved(case) char('-')operator(:) + operator(++)ident(m)operator(;) + reserved(if) operator(()ident(is_identchar)operator((*)ident(m)operator(\)\)) ident(m) operator(+=) ident(mbclen)operator((*)ident(m)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(if) operator((!)ident(ISDIGIT)operator((*)ident(m)operator(\)\)) reserved(return) integer(0)operator(;) + reserved(do) operator(++)ident(m)operator(;) reserved(while) operator(()ident(ISDIGIT)operator((*)ident(m)operator(\)\);) + operator(}) + reserved(return) operator(!*)ident(m)operator(;) +operator(}) + +pre_type(int) +ident(rb_symname_p)operator(()ident(name)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(m) operator(=) ident(name)operator(;) + pre_type(int) ident(localid) operator(=) ident(Qfalse)operator(;) + + reserved(if) operator((!)ident(m)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(switch) operator((*)ident(m)operator(\)) operator({) + reserved(case) char('\\0')operator(:) + reserved(return) ident(Qfalse)operator(;) + + reserved(case) char('$')operator(:) + reserved(if) operator(()ident(is_special_global_name)operator((++)ident(m)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(goto) ident(id)operator(;) + + reserved(case) char('@')operator(:) + reserved(if) operator((*++)ident(m) operator(==) char('@')operator(\)) operator(++)ident(m)operator(;) + reserved(goto) ident(id)operator(;) + + reserved(case) char('<')operator(:) + reserved(switch) operator((*++)ident(m)operator(\)) operator({) + reserved(case) char('<')operator(:) operator(++)ident(m)operator(;) reserved(break)operator(;) + reserved(case) char('=')operator(:) reserved(if) operator((*++)ident(m) operator(==) char('>')operator(\)) operator(++)ident(m)operator(;) reserved(break)operator(;) + reserved(default)operator(:) reserved(break)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('>')operator(:) + reserved(switch) operator((*++)ident(m)operator(\)) operator({) + reserved(case) char('>')operator(:) reserved(case) char('=')operator(:) operator(++)ident(m)operator(;) reserved(break)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('=')operator(:) + reserved(switch) operator((*++)ident(m)operator(\)) operator({) + reserved(case) char('~')operator(:) operator(++)ident(m)operator(;) reserved(break)operator(;) + reserved(case) char('=')operator(:) reserved(if) operator((*++)ident(m) operator(==) char('=')operator(\)) operator(++)ident(m)operator(;) reserved(break)operator(;) + reserved(default)operator(:) reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('*')operator(:) + reserved(if) operator((*++)ident(m) operator(==) char('*')operator(\)) operator(++)ident(m)operator(;) + reserved(break)operator(;) + + reserved(case) char('+')operator(:) reserved(case) char('-')operator(:) + reserved(if) operator((*++)ident(m) operator(==) char('@')operator(\)) operator(++)ident(m)operator(;) + reserved(break)operator(;) + + reserved(case) char('|')operator(:) reserved(case) char('^')operator(:) reserved(case) char('&')operator(:) reserved(case) char('/')operator(:) reserved(case) char('%')operator(:) reserved(case) char('~')operator(:) reserved(case) char('`')operator(:) + operator(++)ident(m)operator(;) + reserved(break)operator(;) + + reserved(case) char('[')operator(:) + reserved(if) operator((*++)ident(m) operator(!=) char(']')operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator((*++)ident(m) operator(==) char('=')operator(\)) operator(++)ident(m)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(localid) operator(=) operator(!)ident(ISUPPER)operator((*)ident(m)operator(\);) + label(id)operator(:) + reserved(if) operator((*)ident(m) operator(!=) char('_') operator(&&) operator(!)ident(ISALPHA)operator((*)ident(m)operator(\)) operator(&&) operator(!)ident(ismbchar)operator((*)ident(m)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(while) operator(()ident(is_identchar)operator((*)ident(m)operator(\)\)) ident(m) operator(+=) ident(mbclen)operator((*)ident(m)operator(\);) + reserved(if) operator(()ident(localid)operator(\)) operator({) + reserved(switch) operator((*)ident(m)operator(\)) operator({) + reserved(case) char('!')operator(:) reserved(case) char('?')operator(:) reserved(case) char('=')operator(:) operator(++)ident(m)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(return) operator(*)ident(m) operator(?) ident(Qfalse) operator(:) ident(Qtrue)operator(;) +operator(}) + +pre_type(int) +ident(rb_sym_interned_p)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(ID) ident(id)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(sym_tbl)operator(,) operator(()ident(st_data_t)operator(\))ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(id)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +ident(ID) +ident(rb_intern)operator(()ident(name)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(m) operator(=) ident(name)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(last)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(sym_tbl)operator(,) operator(()ident(st_data_t)operator(\))ident(name)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(id)operator(\)\)) + reserved(return) ident(id)operator(;) + + ident(last) operator(=) ident(strlen)operator(()ident(name)operator(\)-)integer(1)operator(;) + ident(id) operator(=) integer(0)operator(;) + reserved(switch) operator((*)ident(name)operator(\)) operator({) + reserved(case) char('$')operator(:) + ident(id) operator(|=) ident(ID_GLOBAL)operator(;) + reserved(if) operator(()ident(is_special_global_name)operator((++)ident(m)operator(\)\)) reserved(goto) ident(new_id)operator(;) + reserved(break)operator(;) + reserved(case) char('@')operator(:) + reserved(if) operator(()ident(name)operator([)integer(1)operator(]) operator(==) char('@')operator(\)) operator({) + ident(m)operator(++;) + ident(id) operator(|=) ident(ID_CLASS)operator(;) + operator(}) + reserved(else) operator({) + ident(id) operator(|=) ident(ID_INSTANCE)operator(;) + operator(}) + ident(m)operator(++;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(if) operator(()ident(name)operator([)integer(0)operator(]) operator(!=) char('_') operator(&&) ident(ISASCII)operator(()ident(name)operator([)integer(0)operator(]\)) operator(&&) operator(!)ident(ISALNUM)operator(()ident(name)operator([)integer(0)operator(]\)\)) operator({) + comment(/* operators */) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(op_tbl)operator([)ident(i)operator(])operator(.)ident(token)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator((*)ident(op_tbl)operator([)ident(i)operator(])operator(.)ident(name) operator(==) operator(*)ident(name) operator(&&) + ident(strcmp)operator(()ident(op_tbl)operator([)ident(i)operator(])operator(.)ident(name)operator(,) ident(name)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(id) operator(=) ident(op_tbl)operator([)ident(i)operator(])operator(.)ident(token)operator(;) + reserved(goto) ident(id_regist)operator(;) + operator(}) + operator(}) + operator(}) + + reserved(if) operator(()ident(name)operator([)ident(last)operator(]) operator(==) char('=')operator(\)) operator({) + comment(/* attribute assignment */) + pre_type(char) operator(*)ident(buf) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,)ident(last)operator(+)integer(1)operator(\);) + + ident(strncpy)operator(()ident(buf)operator(,) ident(name)operator(,) ident(last)operator(\);) + ident(buf)operator([)ident(last)operator(]) operator(=) char('\\0')operator(;) + ident(id) operator(=) ident(rb_intern)operator(()ident(buf)operator(\);) + reserved(if) operator(()ident(id) operator(>) ident(tLAST_TOKEN) operator(&&) operator(!)ident(is_attrset_id)operator(()ident(id)operator(\)\)) operator({) + ident(id) operator(=) ident(rb_id_attrset)operator(()ident(id)operator(\);) + reserved(goto) ident(id_regist)operator(;) + operator(}) + ident(id) operator(=) ident(ID_ATTRSET)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISUPPER)operator(()ident(name)operator([)integer(0)operator(]\)\)) operator({) + ident(id) operator(=) ident(ID_CONST)operator(;) + operator(}) + reserved(else) operator({) + ident(id) operator(=) ident(ID_LOCAL)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(if) operator((!)ident(ISDIGIT)operator((*)ident(m)operator(\)\)) operator({) + reserved(while) operator(()ident(m) operator(<=) ident(name) operator(+) ident(last) operator(&&) ident(is_identchar)operator((*)ident(m)operator(\)\)) operator({) + ident(m) operator(+=) ident(mbclen)operator((*)ident(m)operator(\);) + operator(}) + operator(}) + reserved(if) operator((*)ident(m)operator(\)) ident(id) operator(=) ident(ID_JUNK)operator(;) + label(new_id)operator(:) + ident(id) operator(|=) operator(++)ident(last_id) operator(<<) ident(ID_SCOPE_SHIFT)operator(;) + label(id_regist)operator(:) + ident(name) operator(=) ident(strdup)operator(()ident(name)operator(\);) + ident(st_add_direct)operator(()ident(sym_tbl)operator(,) operator(()ident(st_data_t)operator(\))ident(name)operator(,) ident(id)operator(\);) + ident(st_add_direct)operator(()ident(sym_rev_tbl)operator(,) ident(id)operator(,) operator(()ident(st_data_t)operator(\))ident(name)operator(\);) + reserved(return) ident(id)operator(;) +operator(}) + +pre_type(char) operator(*) +ident(rb_id2name)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + pre_type(char) operator(*)ident(name)operator(;) + ident(st_data_t) ident(data)operator(;) + + reserved(if) operator(()ident(id) operator(<) ident(tLAST_TOKEN)operator(\)) operator({) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(op_tbl)operator([)ident(i)operator(])operator(.)ident(token)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(op_tbl)operator([)ident(i)operator(])operator(.)ident(token) operator(==) ident(id)operator(\)) + reserved(return) ident(op_tbl)operator([)ident(i)operator(])operator(.)ident(name)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()ident(st_lookup)operator(()ident(sym_rev_tbl)operator(,) ident(id)operator(,) operator(&)ident(data)operator(\)\)) + reserved(return) operator(()pre_type(char) operator(*\))ident(data)operator(;) + + reserved(if) operator(()ident(is_attrset_id)operator(()ident(id)operator(\)\)) operator({) + ident(ID) ident(id2) operator(=) operator(()ident(id) operator(&) operator(~)ident(ID_SCOPE_MASK)operator(\)) operator(|) ident(ID_LOCAL)operator(;) + + label(again)operator(:) + ident(name) operator(=) ident(rb_id2name)operator(()ident(id2)operator(\);) + reserved(if) operator(()ident(name)operator(\)) operator({) + pre_type(char) operator(*)ident(buf) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(strlen)operator(()ident(name)operator(\)+)integer(2)operator(\);) + + ident(strcpy)operator(()ident(buf)operator(,) ident(name)operator(\);) + ident(strcat)operator(()ident(buf)operator(,) string<delimiter(")content(=)delimiter(")>operator(\);) + ident(rb_intern)operator(()ident(buf)operator(\);) + reserved(return) ident(rb_id2name)operator(()ident(id)operator(\);) + operator(}) + reserved(if) operator(()ident(is_local_id)operator(()ident(id2)operator(\)\)) operator({) + ident(id2) operator(=) operator(()ident(id) operator(&) operator(~)ident(ID_SCOPE_MASK)operator(\)) operator(|) ident(ID_CONST)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(symbols_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(ary)operator(\)) + pre_type(char) operator(*)ident(key)operator(;) + ident(ID) ident(value)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(ID2SYM)operator(()ident(value)operator(\)\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * Symbol.all_symbols => array + * + * Returns an array of all the symbols currently in Ruby's symbol + * table. + * + * Symbol.all_symbols.size #=> 903 + * Symbol.all_symbols[1,20] #=> [:floor, :ARGV, :Binding, :symlink, + * :chown, :EOFError, :$;, :String, + * :LOCK_SH, :"setuid?", :$<, + * :default_proc, :compact, :extend, + * :Tms, :getwd, :$=, :ThreadGroup, + * :wait2, :$>] + */) + +ident(VALUE) +ident(rb_sym_all_symbols)operator((\)) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new2)operator(()ident(sym_tbl)operator(->)ident(num_entries)operator(\);) + + ident(st_foreach)operator(()ident(sym_tbl)operator(,) ident(symbols_i)operator(,) ident(ary)operator(\);) + reserved(return) ident(ary)operator(;) +operator(}) + +pre_type(int) +ident(rb_is_const_id)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator(()ident(is_const_id)operator(()ident(id)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +pre_type(int) +ident(rb_is_class_id)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator(()ident(is_class_id)operator(()ident(id)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +pre_type(int) +ident(rb_is_instance_id)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator(()ident(is_instance_id)operator(()ident(id)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +pre_type(int) +ident(rb_is_local_id)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator(()ident(is_local_id)operator(()ident(id)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +pre_type(int) +ident(rb_is_junk_id)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator(()ident(is_junk_id)operator(()ident(id)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) directive(void) +ident(special_local_set)operator(()ident(c)operator(,) ident(val)operator(\)) + pre_type(char) ident(c)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + pre_type(int) ident(cnt)operator(;) + + ident(top_local_init)operator((\);) + ident(cnt) operator(=) ident(local_cnt)operator(()ident(c)operator(\);) + ident(top_local_setup)operator((\);) + ident(ruby_scope)operator(->)ident(local_vars)operator([)ident(cnt)operator(]) operator(=) ident(val)operator(;) +operator(}) + +ident(VALUE) +ident(rb_backref_get)operator((\)) +operator({) + ident(VALUE) operator(*)ident(var) operator(=) ident(rb_svar)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(var)operator(\)) operator({) + reserved(return) operator(*)ident(var)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(void) +ident(rb_backref_set)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + ident(VALUE) operator(*)ident(var) operator(=) ident(rb_svar)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(var)operator(\)) operator({) + operator(*)ident(var) operator(=) ident(val)operator(;) + operator(}) + reserved(else) operator({) + ident(special_local_set)operator(()char('~')operator(,) ident(val)operator(\);) + operator(}) +operator(}) + +ident(VALUE) +ident(rb_lastline_get)operator((\)) +operator({) + ident(VALUE) operator(*)ident(var) operator(=) ident(rb_svar)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(var)operator(\)) operator({) + reserved(return) operator(*)ident(var)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(void) +ident(rb_lastline_set)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + ident(VALUE) operator(*)ident(var) operator(=) ident(rb_svar)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(var)operator(\)) operator({) + operator(*)ident(var) operator(=) ident(val)operator(;) + operator(}) + reserved(else) operator({) + ident(special_local_set)operator(()char('_')operator(,) ident(val)operator(\);) + operator(}) +operator(}) + +preprocessor(#ifdef) ident(YYMALLOC) +preprocessor(#define) ident(HEAPCNT)operator(()ident(n)operator(,) ident(size)operator(\)) operator((()ident(n)operator(\)) operator(*) operator(()ident(size)operator(\)) operator(/) reserved(sizeof)operator(()ident(YYSTYPE)operator(\)\)) +preprocessor(#define) ident(NEWHEAP)operator((\)) ident(rb_node_newnode)operator(()ident(NODE_ALLOCA)operator(,) integer(0)operator(,) operator(()ident(VALUE)operator(\))ident(parser_heap)operator(,) integer(0)operator(\)) +preprocessor(#define) ident(ADD2HEAP)operator(()ident(n)operator(,) ident(c)operator(,) ident(p)operator(\)) operator((()ident(parser_heap) operator(=) operator(()ident(n)operator(\)\)->)ident(u1)operator(.)ident(node) operator(=) operator(()ident(p)operator(\),) \ + operator(()ident(n)operator(\)->)ident(u3)operator(.)ident(cnt) operator(=) operator(()ident(c)operator(\),) operator(()ident(p)operator(\)\)) + +directive(static) directive(void) operator(*) +ident(rb_parser_malloc)operator(()ident(size)operator(\)) + ident(size_t) ident(size)operator(;) +operator({) + ident(size_t) ident(cnt) operator(=) ident(HEAPCNT)operator(()integer(1)operator(,) ident(size)operator(\);) + ident(NODE) operator(*)ident(n) operator(=) ident(NEWHEAP)operator((\);) + directive(void) operator(*)ident(ptr) operator(=) ident(xmalloc)operator(()ident(size)operator(\);) + + reserved(return) ident(ADD2HEAP)operator(()ident(n)operator(,) ident(cnt)operator(,) ident(ptr)operator(\);) +operator(}) + +directive(static) directive(void) operator(*) +ident(rb_parser_calloc)operator(()ident(nelem)operator(,) ident(size)operator(\)) + ident(size_t) ident(nelem)operator(,) ident(size)operator(;) +operator({) + ident(size_t) ident(cnt) operator(=) ident(HEAPCNT)operator(()ident(nelem)operator(,) ident(size)operator(\);) + ident(NODE) operator(*)ident(n) operator(=) ident(NEWHEAP)operator((\);) + directive(void) operator(*)ident(ptr) operator(=) ident(xcalloc)operator(()ident(nelem)operator(,) ident(size)operator(\);) + + reserved(return) ident(ADD2HEAP)operator(()ident(n)operator(,) ident(cnt)operator(,) ident(ptr)operator(\);) +operator(}) + +directive(static) directive(void) operator(*) +ident(rb_parser_realloc)operator(()ident(ptr)operator(,) ident(size)operator(\)) + directive(void) operator(*)ident(ptr)operator(;) + ident(size_t) ident(size)operator(;) +operator({) + ident(NODE) operator(*)ident(n)operator(;) + ident(size_t) ident(cnt) operator(=) ident(HEAPCNT)operator(()integer(1)operator(,) ident(size)operator(\);) + + reserved(if) operator(()ident(ptr) operator(&&) operator(()ident(n) operator(=) ident(parser_heap)operator(\)) operator(!=) pre_constant(NULL)operator(\)) operator({) + reserved(do) operator({) + reserved(if) operator(()ident(n)operator(->)ident(u1)operator(.)ident(node) operator(==) ident(ptr)operator(\)) operator({) + ident(n)operator(->)ident(u1)operator(.)ident(node) operator(=) ident(ptr) operator(=) ident(xrealloc)operator(()ident(ptr)operator(,) ident(size)operator(\);) + reserved(if) operator(()ident(n)operator(->)ident(u3)operator(.)ident(cnt)operator(\)) ident(n)operator(->)ident(u3)operator(.)ident(cnt) operator(=) ident(cnt)operator(;) + reserved(return) ident(ptr)operator(;) + operator(}) + operator(}) reserved(while) operator((()ident(n) operator(=) ident(n)operator(->)ident(u2)operator(.)ident(node)operator(\)) operator(!=) pre_constant(NULL)operator(\);) + operator(}) + ident(n) operator(=) ident(NEWHEAP)operator((\);) + ident(ptr) operator(=) ident(xrealloc)operator(()ident(ptr)operator(,) ident(size)operator(\);) + reserved(return) ident(ADD2HEAP)operator(()ident(n)operator(,) ident(cnt)operator(,) ident(ptr)operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_parser_free)operator(()ident(ptr)operator(\)) + directive(void) operator(*)ident(ptr)operator(;) +operator({) + ident(NODE) operator(**)ident(prev) operator(=) operator(&)ident(parser_heap)operator(,) operator(*)ident(n)operator(;) + + reserved(while) operator((()ident(n) operator(=) operator(*)ident(prev)operator(\)) operator(!=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(n)operator(->)ident(u1)operator(.)ident(node) operator(==) ident(ptr)operator(\)) operator({) + operator(*)ident(prev) operator(=) ident(n)operator(->)ident(u2)operator(.)ident(node)operator(;) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(n)operator(\);) + reserved(break)operator(;) + operator(}) + ident(prev) operator(=) operator(&)ident(n)operator(->)ident(u2)operator(.)ident(node)operator(;) + operator(}) + ident(xfree)operator(()ident(ptr)operator(\);) +operator(}) +preprocessor(#endif) + +comment(/********************************************************************** + + prec.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Tue Jan 26 02:40:41 2000 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") + +ident(VALUE) ident(rb_mPrecision)operator(;) + +directive(static) ident(ID) ident(prc_pr)operator(,) ident(prc_if)operator(;) + + +comment(/* + * call-seq: + * num.prec(klass\) => a_klass + * + * Converts _self_ into an instance of _klass_. By default, + * +prec+ invokes + * + * klass.induced_from(num\) + * + * and returns its value. So, if <code>klass.induced_from</code> + * doesn't return an instance of _klass_, it will be necessary + * to reimplement +prec+. + */) + +directive(static) ident(VALUE) +ident(prec_prec)operator(()ident(x)operator(,) ident(klass)operator(\)) + ident(VALUE) ident(x)operator(,) ident(klass)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(klass)operator(,) ident(prc_if)operator(,) integer(1)operator(,) ident(x)operator(\);) +operator(}) + +comment(/* + * call-seq: + * num.prec_i => Integer + * + * Returns an +Integer+ converted from _num_. It is equivalent + * to <code>prec(Integer\)</code>. + */) + +directive(static) ident(VALUE) +ident(prec_prec_i)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + ident(VALUE) ident(klass) operator(=) ident(rb_cInteger)operator(;) + + reserved(return) ident(rb_funcall)operator(()ident(x)operator(,) ident(prc_pr)operator(,) integer(1)operator(,) ident(klass)operator(\);) +operator(}) + +comment(/* + * call-seq: + * num.prec_f => Float + * + * Returns a +Float+ converted from _num_. It is equivalent + * to <code>prec(Float\)</code>. + */) + +directive(static) ident(VALUE) +ident(prec_prec_f)operator(()ident(x)operator(\)) + ident(VALUE) ident(x)operator(;) +operator({) + ident(VALUE) ident(klass) operator(=) ident(rb_cFloat)operator(;) + + reserved(return) ident(rb_funcall)operator(()ident(x)operator(,) ident(prc_pr)operator(,) integer(1)operator(,) ident(klass)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Mod.induced_from(number\) => a_mod + * + * Creates an instance of mod from. This method is overridden + * by concrete +Numeric+ classes, so that (for example\) + * + * Fixnum.induced_from(9.9\) #=> 9 + * + * Note that a use of +prec+ in a redefinition may cause + * an infinite loop. + */) + +directive(static) ident(VALUE) +ident(prec_induced_from)operator(()ident(module)operator(,) ident(x)operator(\)) + ident(VALUE) ident(module)operator(,) ident(x)operator(;) +operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(undefined conversion from %s into %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(x)operator(\),) ident(rb_class2name)operator(()ident(module)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +comment(/* + * call_seq: + * included + * + * When the +Precision+ module is mixed-in to a class, this +included+ + * method is used to add our default +induced_from+ implementation + * to the host class. + */) + +directive(static) ident(VALUE) +ident(prec_included)operator(()ident(module)operator(,) ident(include)operator(\)) + ident(VALUE) ident(module)operator(,) ident(include)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(include)operator(\)\)) operator({) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + ident(Check_Type)operator(()ident(include)operator(,) ident(T_CLASS)operator(\);) + reserved(break)operator(;) + operator(}) + ident(rb_define_singleton_method)operator(()ident(include)operator(,) string<delimiter(")content(induced_from)delimiter(")>operator(,) ident(prec_induced_from)operator(,) integer(1)operator(\);) + reserved(return) ident(module)operator(;) +operator(}) + +comment(/* + * Precision is a mixin for concrete numeric classes with + * precision. Here, `precision' means the fineness of approximation + * of a real number, so, this module should not be included into + * anything which is not a subset of Real (so it should not be + * included in classes such as +Complex+ or +Matrix+\). +*/) + +directive(void) +ident(Init_Precision)operator((\)) +operator({) + ident(rb_mPrecision) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(Precision)delimiter(")>operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_mPrecision)operator(,) string<delimiter(")content(included)delimiter(")>operator(,) ident(prec_included)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mPrecision)operator(,) string<delimiter(")content(prec)delimiter(")>operator(,) ident(prec_prec)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_mPrecision)operator(,) string<delimiter(")content(prec_i)delimiter(")>operator(,) ident(prec_prec_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_mPrecision)operator(,) string<delimiter(")content(prec_f)delimiter(")>operator(,) ident(prec_prec_f)operator(,) integer(0)operator(\);) + + ident(prc_pr) operator(=) ident(rb_intern)operator(()string<delimiter(")content(prec)delimiter(")>operator(\);) + ident(prc_if) operator(=) ident(rb_intern)operator(()string<delimiter(")content(induced_from)delimiter(")>operator(\);) +operator(}) +comment(/********************************************************************** + + process.c - + + $Author: shyouhei $ + $Date: 2008-06-29 11:33:11 +0200 (Sun, 29 Jun 2008\) $ + created at: Tue Aug 10 14:30:50 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("rubysig.h") +preprocessor(#include) include(<stdio.h>) +preprocessor(#include) include(<errno.h>) +preprocessor(#include) include(<signal.h>) +preprocessor(#ifdef) ident(HAVE_STDLIB_H) +preprocessor(#include) include(<stdlib.h>) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) +preprocessor(#ifdef) ident(__DJGPP__) +preprocessor(#include) include(<process.h>) +preprocessor(#endif) + +preprocessor(#include) include(<time.h>) +preprocessor(#include) include(<ctype.h>) + +preprocessor(#ifndef) ident(EXIT_SUCCESS) +preprocessor(#define) ident(EXIT_SUCCESS) integer(0) +preprocessor(#endif) +preprocessor(#ifndef) ident(EXIT_FAILURE) +preprocessor(#define) ident(EXIT_FAILURE) integer(1) +preprocessor(#endif) + +reserved(struct) ident(timeval) ident(rb_time_interval) ident(_)operator((()ident(VALUE)operator(\)\);) + +preprocessor(#ifdef) ident(HAVE_SYS_WAIT_H) +preprocessor(# include) include(<sys/wait.h>) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_SYS_RESOURCE_H) +preprocessor(# include) include(<sys/resource.h>) +preprocessor(#endif) +preprocessor(#include) include("st.h") + +preprocessor(#ifdef) ident(__EMX__) +preprocessor(#undef) ident(HAVE_GETPGRP) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_SYS_TIMES_H) +preprocessor(#include) include(<sys/times.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_GRP_H) +preprocessor(#include) include(<grp.h>) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_TIMES)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) +directive(static) ident(VALUE) ident(S_Tms)operator(;) +preprocessor(#endif) + +preprocessor(#ifndef) ident(WIFEXITED) +preprocessor(#define) ident(WIFEXITED)operator(()ident(w)operator(\)) operator(((()ident(w)operator(\)) operator(&) hex(0xff)operator(\)) operator(==) integer(0)operator(\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(WIFSIGNALED) +preprocessor(#define) ident(WIFSIGNALED)operator(()ident(w)operator(\)) operator(((()ident(w)operator(\)) operator(&) hex(0x7f)operator(\)) operator(>) integer(0) operator(&&) operator(((()ident(w)operator(\)) operator(&) hex(0x7f)operator(\)) operator(<) hex(0x7f)operator(\)\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(WIFSTOPPED) +preprocessor(#define) ident(WIFSTOPPED)operator(()ident(w)operator(\)) operator(((()ident(w)operator(\)) operator(&) hex(0xff)operator(\)) operator(==) hex(0x7f)operator(\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(WEXITSTATUS) +preprocessor(#define) ident(WEXITSTATUS)operator(()ident(w)operator(\)) operator(((()ident(w)operator(\)) operator(>>) integer(8)operator(\)) operator(&) hex(0xff)operator(\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(WTERMSIG) +preprocessor(#define) ident(WTERMSIG)operator(()ident(w)operator(\)) operator((()ident(w)operator(\)) operator(&) hex(0x7f)operator(\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(WSTOPSIG) +preprocessor(#define) ident(WSTOPSIG) ident(WEXITSTATUS) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__APPLE__)operator(\)) operator(&&) operator(() ident(defined)operator(()ident(__MACH__)operator(\)) operator(||) ident(defined)operator(()ident(__DARWIN__)operator(\)) operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__MacOS_X__)operator(\)) +preprocessor(#define) ident(__MacOS_X__) integer(1) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__FreeBSD__)operator(\)) operator(||) ident(defined)operator(()ident(__NetBSD__)operator(\)) operator(||) ident(defined)operator(()ident(__OpenBSD__)operator(\)) operator(||) ident(defined)operator(()ident(__bsdi__)operator(\)) +preprocessor(#define) ident(HAVE_44BSD_SETUID) integer(1) +preprocessor(#define) ident(HAVE_44BSD_SETGID) integer(1) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__NetBSD__) +preprocessor(#undef) ident(HAVE_SETRUID) +preprocessor(#undef) ident(HAVE_SETRGID) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__MacOS_X__)operator(\)) operator(||) ident(defined)operator(()ident(__bsdi__)operator(\)) +preprocessor(#define) ident(BROKEN_SETREUID) integer(1) +preprocessor(#define) ident(BROKEN_SETREGID) integer(1) +preprocessor(#endif) + +preprocessor(#ifdef) ident(BROKEN_SETREUID) +preprocessor(#define) ident(setreuid) ident(ruby_setreuid) +preprocessor(#endif) +preprocessor(#ifdef) ident(BROKEN_SETREGID) +preprocessor(#define) ident(setregid) ident(ruby_setregid) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_44BSD_SETUID)operator(\)) operator(||) ident(defined)operator(()ident(__MacOS_X__)operator(\)) +preprocessor(#if) operator(!)ident(defined)operator(()ident(USE_SETREUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(BROKEN_SETREUID)operator(\)) +preprocessor(#define) ident(OBSOLETE_SETREUID) integer(1) +preprocessor(#endif) +preprocessor(#if) operator(!)ident(defined)operator(()ident(USE_SETREGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(BROKEN_SETREGID)operator(\)) +preprocessor(#define) ident(OBSOLETE_SETREGID) integer(1) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#define) ident(preserving_errno)operator(()ident(stmts)operator(\)) \ + reserved(do) operator({)pre_type(int) ident(saved_errno) operator(=) ident(errno)operator(;) ident(stmts)operator(;) ident(errno) operator(=) ident(saved_errno)operator(;}) reserved(while) operator(()integer(0)operator(\)) + + +comment(/* + * call-seq: + * Process.pid => fixnum + * + * Returns the process id of this process. Not available on all + * platforms. + * + * Process.pid #=> 27415 + */) + +directive(static) ident(VALUE) +ident(get_pid)operator((\)) +operator({) + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(getpid)operator((\)\);) +operator(}) + + +comment(/* + * call-seq: + * Process.ppid => fixnum + * + * Returns the process id of the parent of this process. Always + * returns 0 on NT. Not available on all platforms. + * + * puts "I am #{Process.pid}" + * Process.fork { puts "Dad is #{Process.ppid}" } + * + * <em>produces:</em> + * + * I am 27417 + * Dad is 27417 + */) + +directive(static) ident(VALUE) +ident(get_ppid)operator((\)) +operator({) + ident(rb_secure)operator(()integer(2)operator(\);) +preprocessor(#ifdef) ident(_WIN32) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +preprocessor(#else) + reserved(return) ident(INT2FIX)operator(()ident(getppid)operator((\)\);) +preprocessor(#endif) +operator(}) + + +comment(/********************************************************************* + * + * Document-class: Process::Status + * + * <code>Process::Status</code> encapsulates the information on the + * status of a running or terminated system process. The built-in + * variable <code>$?</code> is either +nil+ or a + * <code>Process::Status</code> object. + * + * fork { exit 99 } #=> 26557 + * Process.wait #=> 26557 + * $?.class #=> Process::Status + * $?.to_i #=> 25344 + * $? >> 8 #=> 99 + * $?.stopped? #=> false + * $?.exited? #=> true + * $?.exitstatus #=> 99 + * + * Posix systems record information on processes using a 16-bit + * integer. The lower bits record the process status (stopped, + * exited, signaled\) and the upper bits possibly contain additional + * information (for example the program's return code in the case of + * exited processes\). Pre Ruby 1.8, these bits were exposed directly + * to the Ruby program. Ruby now encapsulates these in a + * <code>Process::Status</code> object. To maximize compatibility, + * however, these objects retain a bit-oriented interface. In the + * descriptions that follow, when we talk about the integer value of + * _stat_, we're referring to this 16 bit value. + */) + +directive(static) ident(VALUE) ident(rb_cProcStatus)operator(;) +ident(VALUE) ident(rb_last_status) operator(=) ident(Qnil)operator(;) + +directive(static) directive(void) +ident(last_status_set)operator(()ident(status)operator(,) ident(pid)operator(\)) + pre_type(int) ident(status)operator(,) ident(pid)operator(;) +operator({) + ident(rb_last_status) operator(=) ident(rb_obj_alloc)operator(()ident(rb_cProcStatus)operator(\);) + ident(rb_iv_set)operator(()ident(rb_last_status)operator(,) string<delimiter(")content(status)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(status)operator(\)\);) + ident(rb_iv_set)operator(()ident(rb_last_status)operator(,) string<delimiter(")content(pid)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(pid)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * stat.to_i => fixnum + * stat.to_int => fixnum + * + * Returns the bits in _stat_ as a <code>Fixnum</code>. Poking + * around in these bits is platform dependent. + * + * fork { exit 0xab } #=> 26566 + * Process.wait #=> 26566 + * sprintf('%04x', $?.to_i\) #=> "ab00" + */) + +directive(static) ident(VALUE) +ident(pst_to_i)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + reserved(return) ident(rb_iv_get)operator(()ident(st)operator(,) string<delimiter(")content(status)delimiter(")>operator(\);) +operator(}) + + +comment(/* + * call-seq: + * stat.to_s => string + * + * Equivalent to _stat_<code>.to_i.to_s</code>. + */) + +directive(static) ident(VALUE) +ident(pst_to_s)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + reserved(return) ident(rb_fix2str)operator(()ident(pst_to_i)operator(()ident(st)operator(\),) integer(10)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * stat.pid => fixnum + * + * Returns the process ID that this status object represents. + * + * fork { exit } #=> 26569 + * Process.wait #=> 26569 + * $?.pid #=> 26569 + */) + +directive(static) ident(VALUE) +ident(pst_pid)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + reserved(return) ident(rb_iv_get)operator(()ident(st)operator(,) string<delimiter(")content(pid)delimiter(")>operator(\);) +operator(}) + + +comment(/* + * call-seq: + * stat.inspect => string + * + * Override the inspection method. + */) + +directive(static) ident(VALUE) +ident(pst_inspect)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + ident(VALUE) ident(pid)operator(;) + pre_type(int) ident(status)operator(;) + ident(VALUE) ident(str)operator(;) + pre_type(char) ident(buf)operator([)integer(256)operator(];) + + ident(pid) operator(=) ident(pst_pid)operator(()ident(st)operator(\);) + ident(status) operator(=) ident(NUM2INT)operator(()ident(st)operator(\);) + + ident(snprintf)operator(()ident(buf)operator(,) reserved(sizeof)operator(()ident(buf)operator(\),) string<delimiter(")content(#<%s: pid=%ld)delimiter(")>operator(,) ident(rb_class2name)operator(()ident(CLASS_OF)operator(()ident(st)operator(\)\),) ident(NUM2LONG)operator(()ident(pid)operator(\)\);) + ident(str) operator(=) ident(rb_str_new2)operator(()ident(buf)operator(\);) + reserved(if) operator(()ident(WIFSTOPPED)operator(()ident(status)operator(\)\)) operator({) + pre_type(int) ident(stopsig) operator(=) ident(WSTOPSIG)operator(()ident(status)operator(\);) + directive(const) pre_type(char) operator(*)ident(signame) operator(=) ident(ruby_signal_name)operator(()ident(stopsig)operator(\);) + reserved(if) operator(()ident(signame)operator(\)) operator({) + ident(snprintf)operator(()ident(buf)operator(,) reserved(sizeof)operator(()ident(buf)operator(\),) string<delimiter(")content(,stopped(SIG%s=%d\))delimiter(")>operator(,) ident(signame)operator(,) ident(stopsig)operator(\);) + operator(}) + reserved(else) operator({) + ident(snprintf)operator(()ident(buf)operator(,) reserved(sizeof)operator(()ident(buf)operator(\),) string<delimiter(")content(,stopped(%d\))delimiter(")>operator(,) ident(stopsig)operator(\);) + operator(}) + ident(rb_str_cat2)operator(()ident(str)operator(,) ident(buf)operator(\);) + operator(}) + reserved(if) operator(()ident(WIFSIGNALED)operator(()ident(status)operator(\)\)) operator({) + pre_type(int) ident(termsig) operator(=) ident(WTERMSIG)operator(()ident(status)operator(\);) + directive(const) pre_type(char) operator(*)ident(signame) operator(=) ident(ruby_signal_name)operator(()ident(termsig)operator(\);) + reserved(if) operator(()ident(signame)operator(\)) operator({) + ident(snprintf)operator(()ident(buf)operator(,) reserved(sizeof)operator(()ident(buf)operator(\),) string<delimiter(")content(,signaled(SIG%s=%d\))delimiter(")>operator(,) ident(signame)operator(,) ident(termsig)operator(\);) + operator(}) + reserved(else) operator({) + ident(snprintf)operator(()ident(buf)operator(,) reserved(sizeof)operator(()ident(buf)operator(\),) string<delimiter(")content(,signaled(%d\))delimiter(")>operator(,) ident(termsig)operator(\);) + operator(}) + ident(rb_str_cat2)operator(()ident(str)operator(,) ident(buf)operator(\);) + operator(}) + reserved(if) operator(()ident(WIFEXITED)operator(()ident(status)operator(\)\)) operator({) + ident(snprintf)operator(()ident(buf)operator(,) reserved(sizeof)operator(()ident(buf)operator(\),) string<delimiter(")content(,exited(%d\))delimiter(")>operator(,) ident(WEXITSTATUS)operator(()ident(status)operator(\)\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) ident(buf)operator(\);) + operator(}) +preprocessor(#ifdef) ident(WCOREDUMP) + reserved(if) operator(()ident(WCOREDUMP)operator(()ident(status)operator(\)\)) operator({) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(,coredumped)delimiter(")>operator(\);) + operator(}) +preprocessor(#endif) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(>)delimiter(")>operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * stat == other => true or false + * + * Returns +true+ if the integer value of _stat_ + * equals <em>other</em>. + */) + +directive(static) ident(VALUE) +ident(pst_equal)operator(()ident(st1)operator(,) ident(st2)operator(\)) + ident(VALUE) ident(st1)operator(,) ident(st2)operator(;) +operator({) + reserved(if) operator(()ident(st1) operator(==) ident(st2)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(rb_equal)operator(()ident(pst_to_i)operator(()ident(st1)operator(\),) ident(st2)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * stat & num => fixnum + * + * Logical AND of the bits in _stat_ with <em>num</em>. + * + * fork { exit 0x37 } + * Process.wait + * sprintf('%04x', $?.to_i\) #=> "3700" + * sprintf('%04x', $? & 0x1e00\) #=> "1600" + */) + +directive(static) ident(VALUE) +ident(pst_bitand)operator(()ident(st1)operator(,) ident(st2)operator(\)) + ident(VALUE) ident(st1)operator(,) ident(st2)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st1)operator(\)) operator(&) ident(NUM2INT)operator(()ident(st2)operator(\);) + + reserved(return) ident(INT2NUM)operator(()ident(status)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * stat >> num => fixnum + * + * Shift the bits in _stat_ right <em>num</em> places. + * + * fork { exit 99 } #=> 26563 + * Process.wait #=> 26563 + * $?.to_i #=> 25344 + * $? >> 8 #=> 99 + */) + +directive(static) ident(VALUE) +ident(pst_rshift)operator(()ident(st1)operator(,) ident(st2)operator(\)) + ident(VALUE) ident(st1)operator(,) ident(st2)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st1)operator(\)) operator(>>) ident(NUM2INT)operator(()ident(st2)operator(\);) + + reserved(return) ident(INT2NUM)operator(()ident(status)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * stat.stopped? => true or false + * + * Returns +true+ if this process is stopped. This is only + * returned if the corresponding <code>wait</code> call had the + * <code>WUNTRACED</code> flag set. + */) + +directive(static) ident(VALUE) +ident(pst_wifstopped)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st)operator(\);) + + reserved(if) operator(()ident(WIFSTOPPED)operator(()ident(status)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(else) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * stat.stopsig => fixnum or nil + * + * Returns the number of the signal that caused _stat_ to stop + * (or +nil+ if self is not stopped\). + */) + +directive(static) ident(VALUE) +ident(pst_wstopsig)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st)operator(\);) + + reserved(if) operator(()ident(WIFSTOPPED)operator(()ident(status)operator(\)\)) + reserved(return) ident(INT2NUM)operator(()ident(WSTOPSIG)operator(()ident(status)operator(\)\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * stat.signaled? => true or false + * + * Returns +true+ if _stat_ terminated because of + * an uncaught signal. + */) + +directive(static) ident(VALUE) +ident(pst_wifsignaled)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st)operator(\);) + + reserved(if) operator(()ident(WIFSIGNALED)operator(()ident(status)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(else) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * stat.termsig => fixnum or nil + * + * Returns the number of the signal that caused _stat_ to + * terminate (or +nil+ if self was not terminated by an + * uncaught signal\). + */) + +directive(static) ident(VALUE) +ident(pst_wtermsig)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st)operator(\);) + + reserved(if) operator(()ident(WIFSIGNALED)operator(()ident(status)operator(\)\)) + reserved(return) ident(INT2NUM)operator(()ident(WTERMSIG)operator(()ident(status)operator(\)\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * stat.exited? => true or false + * + * Returns +true+ if _stat_ exited normally (for + * example using an <code>exit(\)</code> call or finishing the + * program\). + */) + +directive(static) ident(VALUE) +ident(pst_wifexited)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st)operator(\);) + + reserved(if) operator(()ident(WIFEXITED)operator(()ident(status)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(else) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * stat.exitstatus => fixnum or nil + * + * Returns the least significant eight bits of the return code of + * _stat_. Only available if <code>exited?</code> is + * +true+. + * + * fork { } #=> 26572 + * Process.wait #=> 26572 + * $?.exited? #=> true + * $?.exitstatus #=> 0 + * + * fork { exit 99 } #=> 26573 + * Process.wait #=> 26573 + * $?.exited? #=> true + * $?.exitstatus #=> 99 + */) + +directive(static) ident(VALUE) +ident(pst_wexitstatus)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st)operator(\);) + + reserved(if) operator(()ident(WIFEXITED)operator(()ident(status)operator(\)\)) + reserved(return) ident(INT2NUM)operator(()ident(WEXITSTATUS)operator(()ident(status)operator(\)\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * stat.success? => true, false or nil + * + * Returns +true+ if _stat_ is successful, +false+ if not. + * Returns +nil+ if <code>exited?</code> is not +true+. + */) + +directive(static) ident(VALUE) +ident(pst_success_p)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st)operator(\);) + + reserved(if) operator((!)ident(WIFEXITED)operator(()ident(status)operator(\)\)) + reserved(return) ident(Qnil)operator(;) + reserved(return) ident(WEXITSTATUS)operator(()ident(status)operator(\)) operator(==) ident(EXIT_SUCCESS) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * stat.coredump? => true or false + * + * Returns +true+ if _stat_ generated a coredump + * when it terminated. Not available on all platforms. + */) + +directive(static) ident(VALUE) +ident(pst_wcoredump)operator(()ident(st)operator(\)) + ident(VALUE) ident(st)operator(;) +operator({) +preprocessor(#ifdef) ident(WCOREDUMP) + pre_type(int) ident(status) operator(=) ident(NUM2INT)operator(()ident(st)operator(\);) + + reserved(if) operator(()ident(WCOREDUMP)operator(()ident(status)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(else) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#else) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) +operator(}) + +preprocessor(#if) operator(!)ident(defined)operator(()ident(HAVE_WAITPID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(HAVE_WAIT4)operator(\)) +preprocessor(#define) ident(NO_WAITPID) +directive(static) ident(st_table) operator(*)ident(pid_tbl)operator(;) +preprocessor(#endif) + +pre_type(int) +ident(rb_waitpid)operator(()ident(pid)operator(,) ident(st)operator(,) ident(flags)operator(\)) + pre_type(int) ident(pid)operator(;) + pre_type(int) operator(*)ident(st)operator(;) + pre_type(int) ident(flags)operator(;) +operator({) + pre_type(int) ident(result)operator(;) +preprocessor(#ifndef) ident(NO_WAITPID) + pre_type(int) ident(oflags) operator(=) ident(flags)operator(;) + reserved(if) operator((!)ident(rb_thread_alone)operator((\)\)) operator({) comment(/* there're other threads to run */) + ident(flags) operator(|=) ident(WNOHANG)operator(;) + operator(}) + + label(retry)operator(:) + ident(TRAP_BEG)operator(;) +preprocessor(#ifdef) ident(HAVE_WAITPID) + ident(result) operator(=) ident(waitpid)operator(()ident(pid)operator(,) ident(st)operator(,) ident(flags)operator(\);) +preprocessor(#else) comment(/* HAVE_WAIT4 */) + ident(result) operator(=) ident(wait4)operator(()ident(pid)operator(,) ident(st)operator(,) ident(flags)operator(,) pre_constant(NULL)operator(\);) +preprocessor(#endif) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(result) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(errno) operator(==) ident(EINTR)operator(\)) operator({) + ident(rb_thread_polling)operator((\);) + reserved(goto) ident(retry)operator(;) + operator(}) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(result) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(oflags) operator(&) ident(WNOHANG)operator(\)) reserved(return) integer(0)operator(;) + ident(rb_thread_polling)operator((\);) + reserved(if) operator(()ident(rb_thread_alone)operator((\)\)) ident(flags) operator(=) ident(oflags)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) +preprocessor(#else) comment(/* NO_WAITPID */) + reserved(if) operator(()ident(pid_tbl) operator(&&) ident(st_lookup)operator(()ident(pid_tbl)operator(,) ident(pid)operator(,) ident(st)operator(\)\)) operator({) + ident(last_status_set)operator((*)ident(st)operator(,) ident(pid)operator(\);) + ident(st_delete)operator(()ident(pid_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(pid)operator(,) pre_constant(NULL)operator(\);) + reserved(return) ident(pid)operator(;) + operator(}) + + reserved(if) operator(()ident(flags)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(can't do waitpid with flags)delimiter(")>operator(\);) + operator(}) + + reserved(for) operator((;;\)) operator({) + ident(TRAP_BEG)operator(;) + ident(result) operator(=) ident(wait)operator(()ident(st)operator(\);) + ident(TRAP_END)operator(;) + reserved(if) operator(()ident(result) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(errno) operator(==) ident(EINTR)operator(\)) operator({) + ident(rb_thread_schedule)operator((\);) + reserved(continue)operator(;) + operator(}) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(result) operator(==) ident(pid)operator(\)) operator({) + reserved(break)operator(;) + operator(}) + reserved(if) operator((!)ident(pid_tbl)operator(\)) + ident(pid_tbl) operator(=) ident(st_init_numtable)operator((\);) + ident(st_insert)operator(()ident(pid_tbl)operator(,) ident(pid)operator(,) ident(st)operator(\);) + reserved(if) operator((!)ident(rb_thread_alone)operator((\)\)) ident(rb_thread_schedule)operator((\);) + operator(}) +preprocessor(#endif) + reserved(if) operator(()ident(result) operator(>) integer(0)operator(\)) operator({) + ident(last_status_set)operator((*)ident(st)operator(,) ident(result)operator(\);) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +preprocessor(#ifdef) ident(NO_WAITPID) +reserved(struct) ident(wait_data) operator({) + pre_type(int) ident(pid)operator(;) + pre_type(int) ident(status)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(wait_each)operator(()ident(pid)operator(,) ident(status)operator(,) ident(data)operator(\)) + pre_type(int) ident(pid)operator(,) ident(status)operator(;) + reserved(struct) ident(wait_data) operator(*)ident(data)operator(;) +operator({) + reserved(if) operator(()ident(data)operator(->)ident(status) operator(!=) operator(-)integer(1)operator(\)) reserved(return) ident(ST_STOP)operator(;) + + ident(data)operator(->)ident(pid) operator(=) ident(pid)operator(;) + ident(data)operator(->)ident(status) operator(=) ident(status)operator(;) + reserved(return) ident(ST_DELETE)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(waitall_each)operator(()ident(pid)operator(,) ident(status)operator(,) ident(ary)operator(\)) + pre_type(int) ident(pid)operator(,) ident(status)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(last_status_set)operator(()ident(status)operator(,) ident(pid)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_assoc_new)operator(()ident(INT2NUM)operator(()ident(pid)operator(\),) ident(rb_last_status)operator(\)\);) + reserved(return) ident(ST_DELETE)operator(;) +operator(}) +preprocessor(#endif) + + +comment(/* [MG]:FIXME: I wasn't sure how this should be done, since ::wait(\) + has historically been documented as if it didn't take any arguments + despite the fact that it's just an alias for ::waitpid(\). The way I + have it below is more truthful, but a little confusing. + + I also took the liberty of putting in the pid values, as they're + pretty useful, and it looked as if the original 'ri' output was + supposed to contain them after "[...]depending on the value of + aPid:". + + The 'ansi' and 'bs' formats of the ri output don't display the + definition list for some reason, but the plain text one does. + */) + +comment(/* + * call-seq: + * Process.wait(\) => fixnum + * Process.wait(pid=-1, flags=0\) => fixnum + * Process.waitpid(pid=-1, flags=0\) => fixnum + * + * Waits for a child process to exit, returns its process id, and + * sets <code>$?</code> to a <code>Process::Status</code> object + * containing information on that process. Which child it waits on + * depends on the value of _pid_: + * + * > 0:: Waits for the child whose process ID equals _pid_. + * + * 0:: Waits for any child whose process group ID equals that of the + * calling process. + * + * -1:: Waits for any child process (the default if no _pid_ is + * given\). + * + * < -1:: Waits for any child whose process group ID equals the absolute + * value of _pid_. + * + * The _flags_ argument may be a logical or of the flag values + * <code>Process::WNOHANG</code> (do not block if no child available\) + * or <code>Process::WUNTRACED</code> (return stopped children that + * haven't been reported\). Not all flags are available on all + * platforms, but a flag value of zero will work on all platforms. + * + * Calling this method raises a <code>SystemError</code> if there are + * no child processes. Not available on all platforms. + * + * include Process + * fork { exit 99 } #=> 27429 + * wait #=> 27429 + * $?.exitstatus #=> 99 + * + * pid = fork { sleep 3 } #=> 27440 + * Time.now #=> Wed Apr 09 08:57:09 CDT 2003 + * waitpid(pid, Process::WNOHANG\) #=> nil + * Time.now #=> Wed Apr 09 08:57:09 CDT 2003 + * waitpid(pid, 0\) #=> 27440 + * Time.now #=> Wed Apr 09 08:57:12 CDT 2003 + */) + +directive(static) ident(VALUE) +ident(proc_wait)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(vpid)operator(,) ident(vflags)operator(;) + pre_type(int) ident(pid)operator(,) ident(flags)operator(,) ident(status)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(flags) operator(=) integer(0)operator(;) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(02)delimiter(")>operator(,) operator(&)ident(vpid)operator(,) operator(&)ident(vflags)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(pid) operator(=) operator(-)integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(pid) operator(=) ident(NUM2INT)operator(()ident(vpid)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(2) operator(&&) operator(!)ident(NIL_P)operator(()ident(vflags)operator(\)\)) operator({) + ident(flags) operator(=) ident(NUM2UINT)operator(()ident(vflags)operator(\);) + operator(}) + operator(}) + reserved(if) operator((()ident(pid) operator(=) ident(rb_waitpid)operator(()ident(pid)operator(,) operator(&)ident(status)operator(,) ident(flags)operator(\)\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(pid) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(rb_last_status) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(pid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.wait2(pid=-1, flags=0\) => [pid, status] + * Process.waitpid2(pid=-1, flags=0\) => [pid, status] + * + * Waits for a child process to exit (see Process::waitpid for exact + * semantics\) and returns an array containing the process id and the + * exit status (a <code>Process::Status</code> object\) of that + * child. Raises a <code>SystemError</code> if there are no child + * processes. + * + * Process.fork { exit 99 } #=> 27437 + * pid, status = Process.wait2 + * pid #=> 27437 + * status.exitstatus #=> 99 + */) + +directive(static) ident(VALUE) +ident(proc_wait2)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(pid) operator(=) ident(proc_wait)operator(()ident(argc)operator(,) ident(argv)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(pid)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(rb_assoc_new)operator(()ident(pid)operator(,) ident(rb_last_status)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.waitall => [ [pid1,status1], ...] + * + * Waits for all children, returning an array of + * _pid_/_status_ pairs (where _status_ is a + * <code>Process::Status</code> object\). + * + * fork { sleep 0.2; exit 2 } #=> 27432 + * fork { sleep 0.1; exit 1 } #=> 27433 + * fork { exit 0 } #=> 27434 + * p Process.waitall + * + * <em>produces</em>: + * + * [[27434, #<Process::Status: pid=27434,exited(0\)>], + * [27433, #<Process::Status: pid=27433,exited(1\)>], + * [27432, #<Process::Status: pid=27432,exited(2\)>]] + */) + +directive(static) ident(VALUE) +ident(proc_waitall)operator((\)) +operator({) + ident(VALUE) ident(result)operator(;) + pre_type(int) ident(pid)operator(,) ident(status)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(result) operator(=) ident(rb_ary_new)operator((\);) +preprocessor(#ifdef) ident(NO_WAITPID) + reserved(if) operator(()ident(pid_tbl)operator(\)) operator({) + ident(st_foreach)operator(()ident(pid_tbl)operator(,) ident(waitall_each)operator(,) ident(result)operator(\);) + operator(}) + + reserved(for) operator(()ident(pid) operator(=) operator(-)integer(1)operator(;;\)) operator({) + ident(pid) operator(=) ident(wait)operator((&)ident(status)operator(\);) + reserved(if) operator(()ident(pid) operator(==) operator(-)integer(1)operator(\)) operator({) + reserved(if) operator(()ident(errno) operator(==) ident(ECHILD)operator(\)) + reserved(break)operator(;) + reserved(if) operator(()ident(errno) operator(==) ident(EINTR)operator(\)) operator({) + ident(rb_thread_schedule)operator((\);) + reserved(continue)operator(;) + operator(}) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + ident(last_status_set)operator(()ident(status)operator(,) ident(pid)operator(\);) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_assoc_new)operator(()ident(INT2NUM)operator(()ident(pid)operator(\),) ident(rb_last_status)operator(\)\);) + operator(}) +preprocessor(#else) + ident(rb_last_status) operator(=) ident(Qnil)operator(;) + reserved(for) operator(()ident(pid) operator(=) operator(-)integer(1)operator(;;\)) operator({) + ident(pid) operator(=) ident(rb_waitpid)operator((-)integer(1)operator(,) operator(&)ident(status)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(pid) operator(==) operator(-)integer(1)operator(\)) operator({) + reserved(if) operator(()ident(errno) operator(==) ident(ECHILD)operator(\)) + reserved(break)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_assoc_new)operator(()ident(INT2NUM)operator(()ident(pid)operator(\),) ident(rb_last_status)operator(\)\);) + operator(}) +preprocessor(#endif) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(detach_process_watcher)operator(()ident(arg)operator(\)) + directive(void) operator(*)ident(arg)operator(;) +operator({) + pre_type(int) ident(pid) operator(=) operator(()pre_type(int)operator(\)()ident(VALUE)operator(\))ident(arg)operator(,) ident(status)operator(;) + + reserved(while) operator(()ident(rb_waitpid)operator(()ident(pid)operator(,) operator(&)ident(status)operator(,) ident(WNOHANG)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(rb_thread_sleep)operator(()integer(1)operator(\);) + operator(}) + reserved(return) ident(rb_last_status)operator(;) +operator(}) + +ident(VALUE) +ident(rb_detach_process)operator(()ident(pid)operator(\)) + pre_type(int) ident(pid)operator(;) +operator({) + reserved(return) ident(rb_thread_create)operator(()ident(detach_process_watcher)operator(,) operator(()directive(void)operator(*\)()ident(VALUE)operator(\))ident(pid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.detach(pid\) => thread + * + * Some operating systems retain the status of terminated child + * processes until the parent collects that status (normally using + * some variant of <code>wait(\)</code>. If the parent never collects + * this status, the child stays around as a <em>zombie</em> process. + * <code>Process::detach</code> prevents this by setting up a + * separate Ruby thread whose sole job is to reap the status of the + * process _pid_ when it terminates. Use <code>detach</code> + * only when you do not intent to explicitly wait for the child to + * terminate. <code>detach</code> only checks the status + * periodically (currently once each second\). + * + * The waiting thread returns the exit status of the detached process + * when it terminates, so you can use <code>Thread#join</code> to + * know the result. If specified _pid_ is not a valid child process + * ID, the thread returns +nil+ immediately. + * + * In this first example, we don't reap the first child process, so + * it appears as a zombie in the process status display. + * + * p1 = fork { sleep 0.1 } + * p2 = fork { sleep 0.2 } + * Process.waitpid(p2\) + * sleep 2 + * system("ps -ho pid,state -p #{p1}"\) + * + * <em>produces:</em> + * + * 27389 Z + * + * In the next example, <code>Process::detach</code> is used to reap + * the child automatically. + * + * p1 = fork { sleep 0.1 } + * p2 = fork { sleep 0.2 } + * Process.detach(p1\) + * Process.waitpid(p2\) + * sleep 2 + * system("ps -ho pid,state -p #{p1}"\) + * + * <em>(produces no output\)</em> + */) + +directive(static) ident(VALUE) +ident(proc_detach)operator(()ident(VALUE) ident(obj)operator(,) ident(VALUE) ident(pid)operator(\)) +operator({) + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(return) ident(rb_detach_process)operator(()ident(NUM2INT)operator(()ident(pid)operator(\)\);) +operator(}) + +preprocessor(#ifndef) ident(HAVE_STRING_H) +pre_type(char) operator(*)ident(strtok)operator((\);) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_SETITIMER) +preprocessor(#define) ident(before_exec)operator((\)) ident(rb_thread_stop_timer)operator((\)) +preprocessor(#define) ident(after_exec)operator((\)) ident(rb_thread_start_timer)operator((\)) +preprocessor(#else) +preprocessor(#define) ident(before_exec)operator((\)) +preprocessor(#define) ident(after_exec)operator((\)) +preprocessor(#endif) + +directive(extern) pre_type(char) operator(*)ident(dln_find_exe)operator((\);) + +directive(static) directive(void) +ident(security)operator(()ident(str)operator(\)) + pre_type(char) operator(*)ident(str)operator(;) +operator({) + reserved(if) operator(()ident(rb_env_path_tainted)operator((\)\)) operator({) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure PATH - %s)delimiter(")>operator(,) ident(str)operator(\);) + operator(}) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(proc_exec_v)operator(()ident(argv)operator(,) ident(prog)operator(\)) + pre_type(char) operator(**)ident(argv)operator(;) + pre_type(char) operator(*)ident(prog)operator(;) +operator({) + reserved(if) operator((!)ident(prog)operator(\)) + ident(prog) operator(=) ident(argv)operator([)integer(0)operator(];) + ident(security)operator(()ident(prog)operator(\);) + ident(prog) operator(=) ident(dln_find_exe)operator(()ident(prog)operator(,) integer(0)operator(\);) + reserved(if) operator((!)ident(prog)operator(\)) + reserved(return) operator(-)integer(1)operator(;) + +preprocessor(#if) operator(()ident(defined)operator(()ident(MSDOS)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(DJGPP)operator(\)\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__EMX__)operator(\)) operator(||) ident(defined)operator(()ident(OS2)operator(\)) + operator({) +preprocessor(#if) ident(defined)operator(()ident(__human68k__)operator(\)) +preprocessor(#define) ident(COMMAND) string<delimiter(")content(command.x)delimiter(")> +preprocessor(#endif) +preprocessor(#if) ident(defined)operator(()ident(__EMX__)operator(\)) operator(||) ident(defined)operator(()ident(OS2)operator(\)) comment(/* OS/2 emx */) +preprocessor(#define) ident(COMMAND) string<delimiter(")content(cmd.exe)delimiter(")> +preprocessor(#endif) +preprocessor(#if) operator(()ident(defined)operator(()ident(MSDOS)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(DJGPP)operator(\)\)) +preprocessor(#define) ident(COMMAND) string<delimiter(")content(command.com)delimiter(")> +preprocessor(#endif) + pre_type(char) operator(*)ident(extension)operator(;) + + reserved(if) operator((()ident(extension) operator(=) ident(strrchr)operator(()ident(prog)operator(,) char('.')operator(\)\)) operator(!=) pre_constant(NULL) operator(&&) ident(strcasecmp)operator(()ident(extension)operator(,) string<delimiter(")content(.bat)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) operator({) + pre_type(char) operator(**)ident(new_argv)operator(;) + pre_type(char) operator(*)ident(p)operator(;) + pre_type(int) ident(n)operator(;) + + reserved(for) operator(()ident(n) operator(=) integer(0)operator(;) ident(argv)operator([)ident(n)operator(];) ident(n)operator(++\)) + comment(/* no-op */)operator(;) + ident(new_argv) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(*,) ident(n) operator(+) integer(2)operator(\);) + reserved(for) operator((;) ident(n) operator(>) integer(0)operator(;) ident(n)operator(--\)) + ident(new_argv)operator([)ident(n) operator(+) integer(1)operator(]) operator(=) ident(argv)operator([)ident(n)operator(];) + ident(new_argv)operator([)integer(1)operator(]) operator(=) ident(strcpy)operator(()ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(strlen)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(+) integer(1)operator(\),) ident(argv)operator([)integer(0)operator(]\);) + reserved(for) operator(()ident(p) operator(=) ident(new_argv)operator([)integer(1)operator(];) operator(*)ident(p) operator(!=) char('\\0')operator(;) ident(p)operator(++\)) + reserved(if) operator((*)ident(p) operator(==) char('/')operator(\)) + operator(*)ident(p) operator(=) char('\\\\')operator(;) + ident(new_argv)operator([)integer(0)operator(]) operator(=) ident(COMMAND)operator(;) + ident(argv) operator(=) ident(new_argv)operator(;) + ident(prog) operator(=) ident(dln_find_exe)operator(()ident(argv)operator([)integer(0)operator(],) integer(0)operator(\);) + reserved(if) operator((!)ident(prog)operator(\)) operator({) + ident(errno) operator(=) ident(ENOENT)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + operator(}) + operator(}) +preprocessor(#endif) comment(/* MSDOS or __human68k__ or __EMX__ */) + ident(before_exec)operator((\);) + ident(rb_thread_cancel_timer)operator((\);) + ident(execv)operator(()ident(prog)operator(,) ident(argv)operator(\);) + ident(preserving_errno)operator(()ident(after_exec)operator((\)\);) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(proc_exec_n)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(progv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(progv)operator(;) +operator({) + pre_type(char) operator(*)ident(prog) operator(=) integer(0)operator(;) + pre_type(char) operator(**)ident(args)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(progv)operator(\)) operator({) + ident(prog) operator(=) ident(RSTRING)operator(()ident(progv)operator(\)->)ident(ptr)operator(;) + operator(}) + ident(args) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(*,) ident(argc)operator(+)integer(1)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(SafeStringValue)operator(()ident(argv)operator([)ident(i)operator(]\);) + ident(args)operator([)ident(i)operator(]) operator(=) ident(RSTRING)operator(()ident(argv)operator([)ident(i)operator(]\)->)ident(ptr)operator(;) + operator(}) + ident(args)operator([)ident(i)operator(]) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(args)operator([)integer(0)operator(]\)) operator({) + reserved(return) ident(proc_exec_v)operator(()ident(args)operator(,) ident(prog)operator(\);) + operator(}) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +pre_type(int) +ident(rb_proc_exec)operator(()ident(str)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(s) operator(=) ident(str)operator(;) + pre_type(char) operator(*)ident(ss)operator(,) operator(*)ident(t)operator(;) + pre_type(char) operator(**)ident(argv)operator(,) operator(**)ident(a)operator(;) + + reserved(while) operator((*)ident(str) operator(&&) ident(ISSPACE)operator((*)ident(str)operator(\)\)) + ident(str)operator(++;) + +preprocessor(#ifdef) ident(_WIN32) + ident(before_exec)operator((\);) + ident(do_spawn)operator(()ident(P_OVERLAY)operator(,) operator(()pre_type(char) operator(*\))ident(str)operator(\);) + ident(after_exec)operator((\);) +preprocessor(#else) + reserved(for) operator(()ident(s)operator(=)ident(str)operator(;) operator(*)ident(s)operator(;) ident(s)operator(++\)) operator({) + reserved(if) operator((*)ident(s) operator(!=) char(' ') operator(&&) operator(!)ident(ISALPHA)operator((*)ident(s)operator(\)) operator(&&) ident(strchr)operator(()string<delimiter(")content(*?{}[]<>(\)~&|)char(\\\\)content($;'`)char(\\")char(\\n)delimiter(")>operator(,*)ident(s)operator(\)\)) operator({) +preprocessor(#if) ident(defined)operator(()ident(MSDOS)operator(\)) + pre_type(int) ident(status)operator(;) + ident(before_exec)operator((\);) + ident(status) operator(=) ident(system)operator(()ident(str)operator(\);) + ident(after_exec)operator((\);) + reserved(if) operator(()ident(status) operator(!=) operator(-)integer(1)operator(\)) + ident(exit)operator(()ident(status)operator(\);) +preprocessor(#else) +preprocessor(#if) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN32__)operator(\)) operator(||) ident(defined)operator(()ident(__EMX__)operator(\)) + pre_type(char) operator(*)ident(shell) operator(=) ident(dln_find_exe)operator(()string<delimiter(")content(sh)delimiter(")>operator(,) integer(0)operator(\);) + pre_type(int) ident(status) operator(=) operator(-)integer(1)operator(;) + ident(before_exec)operator((\);) + reserved(if) operator(()ident(shell)operator(\)) + ident(execl)operator(()ident(shell)operator(,) string<delimiter(")content(sh)delimiter(")>operator(,) string<delimiter(")content(-c)delimiter(")>operator(,) ident(str)operator(,) operator(()pre_type(char) operator(*\)) pre_constant(NULL)operator(\);) + reserved(else) + ident(status) operator(=) ident(system)operator(()ident(str)operator(\);) + ident(after_exec)operator((\);) + reserved(if) operator(()ident(status) operator(!=) operator(-)integer(1)operator(\)) + ident(exit)operator(()ident(status)operator(\);) +preprocessor(#else) + ident(before_exec)operator((\);) + ident(execl)operator(()string<delimiter(")content(/bin/sh)delimiter(")>operator(,) string<delimiter(")content(sh)delimiter(")>operator(,) string<delimiter(")content(-c)delimiter(")>operator(,) ident(str)operator(,) operator(()pre_type(char) operator(*\))pre_constant(NULL)operator(\);) + ident(preserving_errno)operator(()ident(after_exec)operator((\)\);) +preprocessor(#endif) +preprocessor(#endif) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + operator(}) + ident(a) operator(=) ident(argv) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(*,) operator(()ident(s)operator(-)ident(str)operator(\))operator(/)integer(2)operator(+)integer(2)operator(\);) + ident(ss) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(s)operator(-)ident(str)operator(+)integer(1)operator(\);) + ident(strcpy)operator(()ident(ss)operator(,) ident(str)operator(\);) + reserved(if) operator(((*)ident(a)operator(++) operator(=) ident(strtok)operator(()ident(ss)operator(,) string<delimiter(")content( )char(\\t)delimiter(")>operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + reserved(while) operator((()ident(t) operator(=) ident(strtok)operator(()pre_constant(NULL)operator(,) string<delimiter(")content( )char(\\t)delimiter(")>operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + operator(*)ident(a)operator(++) operator(=) ident(t)operator(;) + operator(}) + operator(*)ident(a) operator(=) pre_constant(NULL)operator(;) + operator(}) + reserved(if) operator(()ident(argv)operator([)integer(0)operator(]\)) operator({) + reserved(return) ident(proc_exec_v)operator(()ident(argv)operator(,) integer(0)operator(\);) + operator(}) + ident(errno) operator(=) ident(ENOENT)operator(;) +preprocessor(#endif) comment(/* _WIN32 */) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__DJGPP__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) +directive(static) pre_type(int) +ident(proc_spawn_v)operator(()ident(argv)operator(,) ident(prog)operator(\)) + pre_type(char) operator(**)ident(argv)operator(;) + pre_type(char) operator(*)ident(prog)operator(;) +operator({) + pre_type(char) operator(*)ident(extension)operator(;) + pre_type(int) ident(status)operator(;) + + reserved(if) operator((!)ident(prog)operator(\)) + ident(prog) operator(=) ident(argv)operator([)integer(0)operator(];) + ident(security)operator(()ident(prog)operator(\);) + ident(prog) operator(=) ident(dln_find_exe)operator(()ident(prog)operator(,) integer(0)operator(\);) + reserved(if) operator((!)ident(prog)operator(\)) + reserved(return) operator(-)integer(1)operator(;) + +preprocessor(#if) ident(defined)operator(()ident(__human68k__)operator(\)) + reserved(if) operator((()ident(extension) operator(=) ident(strrchr)operator(()ident(prog)operator(,) char('.')operator(\)\)) operator(!=) pre_constant(NULL) operator(&&) ident(strcasecmp)operator(()ident(extension)operator(,) string<delimiter(")content(.bat)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) operator({) + pre_type(char) operator(**)ident(new_argv)operator(;) + pre_type(char) operator(*)ident(p)operator(;) + pre_type(int) ident(n)operator(;) + + reserved(for) operator(()ident(n) operator(=) integer(0)operator(;) ident(argv)operator([)ident(n)operator(];) ident(n)operator(++\)) + comment(/* no-op */)operator(;) + ident(new_argv) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(*,) ident(n) operator(+) integer(2)operator(\);) + reserved(for) operator((;) ident(n) operator(>) integer(0)operator(;) ident(n)operator(--\)) + ident(new_argv)operator([)ident(n) operator(+) integer(1)operator(]) operator(=) ident(argv)operator([)ident(n)operator(];) + ident(new_argv)operator([)integer(1)operator(]) operator(=) ident(strcpy)operator(()ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(strlen)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(+) integer(1)operator(\),) ident(argv)operator([)integer(0)operator(]\);) + reserved(for) operator(()ident(p) operator(=) ident(new_argv)operator([)integer(1)operator(];) operator(*)ident(p) operator(!=) char('\\0')operator(;) ident(p)operator(++\)) + reserved(if) operator((*)ident(p) operator(==) char('/')operator(\)) + operator(*)ident(p) operator(=) char('\\\\')operator(;) + ident(new_argv)operator([)integer(0)operator(]) operator(=) ident(COMMAND)operator(;) + ident(argv) operator(=) ident(new_argv)operator(;) + ident(prog) operator(=) ident(dln_find_exe)operator(()ident(argv)operator([)integer(0)operator(],) integer(0)operator(\);) + reserved(if) operator((!)ident(prog)operator(\)) operator({) + ident(errno) operator(=) ident(ENOENT)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + operator(}) +preprocessor(#endif) + ident(before_exec)operator((\);) +preprocessor(#if) ident(defined)operator(()ident(_WIN32)operator(\)) + ident(status) operator(=) ident(do_aspawn)operator(()ident(P_WAIT)operator(,) ident(prog)operator(,) ident(argv)operator(\);) +preprocessor(#else) + ident(status) operator(=) ident(spawnv)operator(()ident(P_WAIT)operator(,) ident(prog)operator(,) ident(argv)operator(\);) +preprocessor(#endif) + ident(after_exec)operator((\);) + reserved(return) ident(status)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(proc_spawn_n)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(prog)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(prog)operator(;) +operator({) + pre_type(char) operator(**)ident(args)operator(;) + pre_type(int) ident(i)operator(;) + + ident(args) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(*,) ident(argc) operator(+) integer(1)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(SafeStringValue)operator(()ident(argv)operator([)ident(i)operator(]\);) + ident(args)operator([)ident(i)operator(]) operator(=) ident(StringValueCStr)operator(()ident(argv)operator([)ident(i)operator(]\);) + operator(}) + reserved(if) operator(()ident(prog)operator(\)) + ident(SafeStringValue)operator(()ident(prog)operator(\);) + ident(args)operator([)ident(i)operator(]) operator(=) operator(()pre_type(char)operator(*\)) integer(0)operator(;) + reserved(if) operator(()ident(args)operator([)integer(0)operator(]\)) + reserved(return) ident(proc_spawn_v)operator(()ident(args)operator(,) ident(prog) operator(?) ident(StringValueCStr)operator(()ident(prog)operator(\)) operator(:) integer(0)operator(\);) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +preprocessor(#if) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) +directive(static) pre_type(int) +ident(proc_spawn)operator(()ident(sv)operator(\)) + ident(VALUE) ident(sv)operator(;) +operator({) + pre_type(char) operator(*)ident(str)operator(;) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(t)operator(;) + pre_type(char) operator(**)ident(argv)operator(,) operator(**)ident(a)operator(;) + pre_type(int) ident(status)operator(;) + + ident(SafeStringValue)operator(()ident(sv)operator(\);) + ident(str) operator(=) ident(s) operator(=) ident(StringValueCStr)operator(()ident(sv)operator(\);) + reserved(for) operator(()ident(s) operator(=) ident(str)operator(;) operator(*)ident(s)operator(;) ident(s)operator(++\)) operator({) + reserved(if) operator((*)ident(s) operator(!=) char(' ') operator(&&) operator(!)ident(ISALPHA)operator((*)ident(s)operator(\)) operator(&&) ident(strchr)operator(()string<delimiter(")content(*?{}[]<>(\)~&|)char(\\\\)content($;'`)char(\\")char(\\n)delimiter(")>operator(,*)ident(s)operator(\)\)) operator({) + pre_type(char) operator(*)ident(shell) operator(=) ident(dln_find_exe)operator(()string<delimiter(")content(sh)delimiter(")>operator(,) integer(0)operator(\);) + ident(before_exec)operator((\);) + ident(status) operator(=) ident(shell)operator(?)ident(spawnl)operator(()ident(P_WAIT)operator(,)ident(shell)operator(,)string<delimiter(")content(sh)delimiter(")>operator(,)string<delimiter(")content(-c)delimiter(")>operator(,)ident(str)operator(,()pre_type(char)operator(*\))pre_constant(NULL)operator(\):)ident(system)operator(()ident(str)operator(\);) + ident(after_exec)operator((\);) + reserved(return) ident(status)operator(;) + operator(}) + operator(}) + ident(a) operator(=) ident(argv) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(*,) operator(()ident(s) operator(-) ident(str)operator(\)) operator(/) integer(2) operator(+) integer(2)operator(\);) + ident(s) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(s) operator(-) ident(str) operator(+) integer(1)operator(\);) + ident(strcpy)operator(()ident(s)operator(,) ident(str)operator(\);) + reserved(if) operator((*)ident(a)operator(++) operator(=) ident(strtok)operator(()ident(s)operator(,) string<delimiter(")content( )char(\\t)delimiter(")>operator(\)\)) operator({) + reserved(while) operator(()ident(t) operator(=) ident(strtok)operator(()pre_constant(NULL)operator(,) string<delimiter(")content( )char(\\t)delimiter(")>operator(\)\)) + operator(*)ident(a)operator(++) operator(=) ident(t)operator(;) + operator(*)ident(a) operator(=) pre_constant(NULL)operator(;) + operator(}) + reserved(return) ident(argv)operator([)integer(0)operator(]) operator(?) ident(proc_spawn_v)operator(()ident(argv)operator(,) integer(0)operator(\)) operator(:) operator(-)integer(1)operator(;) +operator(}) +preprocessor(#endif) +preprocessor(#endif) + +reserved(struct) ident(rb_exec_arg) operator({) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(prog)operator(;) +operator(};) + +directive(static) directive(void) +ident(proc_prepare_args)operator(()ident(e)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(prog)operator(\)) + reserved(struct) ident(rb_exec_arg) operator(*)ident(e)operator(;) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(prog)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + ident(MEMZERO)operator(()ident(e)operator(,) reserved(struct) ident(rb_exec_arg)operator(,) integer(1)operator(\);) + reserved(if) operator(()ident(prog)operator(\)) operator({) + ident(SafeStringValue)operator(()ident(prog)operator(\);) + ident(StringValueCStr)operator(()ident(prog)operator(\);) + operator(}) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(SafeStringValue)operator(()ident(argv)operator([)ident(i)operator(]\);) + ident(StringValueCStr)operator(()ident(argv)operator([)ident(i)operator(]\);) + operator(}) + ident(security)operator(()ident(RSTRING)operator(()ident(prog) operator(?) ident(prog) operator(:) ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator(\);) + ident(e)operator(->)ident(prog) operator(=) ident(prog)operator(;) + ident(e)operator(->)ident(argc) operator(=) ident(argc)operator(;) + ident(e)operator(->)ident(argv) operator(=) ident(argv)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(proc_exec_args)operator(()ident(earg)operator(\)) + ident(VALUE) ident(earg)operator(;) +operator({) + reserved(struct) ident(rb_exec_arg) operator(*)ident(e) operator(=) operator(()reserved(struct) ident(rb_exec_arg) operator(*\))ident(earg)operator(;) + pre_type(int) ident(argc) operator(=) ident(e)operator(->)ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv) operator(=) ident(e)operator(->)ident(argv)operator(;) + ident(VALUE) ident(prog) operator(=) ident(e)operator(->)ident(prog)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(1) operator(&&) ident(prog) operator(==) integer(0)operator(\)) operator({) + reserved(return) operator(()ident(VALUE)operator(\))ident(rb_proc_exec)operator(()ident(RSTRING)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator(\);) + operator(}) + reserved(else) operator({) + reserved(return) operator(()ident(VALUE)operator(\))ident(proc_exec_n)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(prog)operator(\);) + operator(}) +operator(}) + +comment(/* + * call-seq: + * exec(command [, arg, ...]\) + * + * Replaces the current process by running the given external _command_. + * If +exec+ is given a single argument, that argument is + * taken as a line that is subject to shell expansion before being + * executed. If multiple arguments are given, the second and subsequent + * arguments are passed as parameters to _command_ with no shell + * expansion. If the first argument is a two-element array, the first + * element is the command to be executed, and the second argument is + * used as the <code>argv[0]</code> value, which may show up in process + * listings. In MSDOS environments, the command is executed in a + * subshell; otherwise, one of the <code>exec(2\)</code> system calls is + * used, so the running command may inherit some of the environment of + * the original program (including open file descriptors\). + * + * exec "echo *" # echoes list of files in current directory + * # never get here + * + * + * exec "echo", "*" # echoes an asterisk + * # never get here + */) + +ident(VALUE) +ident(rb_f_exec)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(prog) operator(=) integer(0)operator(;) + ident(VALUE) ident(tmp)operator(;) + reserved(struct) ident(rb_exec_arg) ident(earg)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rb_last_status) operator(=) ident(Qnil)operator(;) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + + ident(tmp) operator(=) ident(rb_check_array_type)operator(()ident(argv)operator([)integer(0)operator(]\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(len) operator(!=) integer(2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong first argument)delimiter(")>operator(\);) + operator(}) + ident(prog) operator(=) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(RARRAY)operator(()ident(tmp)operator(\)->)ident(ptr)operator([)integer(1)operator(];) + ident(SafeStringValue)operator(()ident(prog)operator(\);) + operator(}) + ident(proc_prepare_args)operator((&)ident(earg)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(prog)operator(\);) + ident(proc_exec_args)operator((()ident(VALUE)operator(\)&)ident(earg)operator(\);) + ident(rb_sys_fail)operator(()ident(RSTRING)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* dummy */) +operator(}) + + +comment(/* + * call-seq: + * Kernel.fork [{ block }] => fixnum or nil + * Process.fork [{ block }] => fixnum or nil + * + * Creates a subprocess. If a block is specified, that block is run + * in the subprocess, and the subprocess terminates with a status of + * zero. Otherwise, the +fork+ call returns twice, once in + * the parent, returning the process ID of the child, and once in + * the child, returning _nil_. The child process can exit using + * <code>Kernel.exit!</code> to avoid running any + * <code>at_exit</code> functions. The parent process should + * use <code>Process.wait</code> to collect the termination statuses + * of its children or use <code>Process.detach</code> to register + * disinterest in their status; otherwise, the operating system + * may accumulate zombie processes. + * + * The thread calling fork is the only thread in the created child process. + * fork doesn't copy other threads. + */) + +directive(static) ident(VALUE) +ident(rb_f_fork)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#if) operator(!)ident(defined)operator(()ident(__human68k__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__MACOS__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__EMX__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__VMS)operator(\)) + pre_type(int) ident(pid)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + +preprocessor(#ifndef) ident(__VMS) + ident(fflush)operator(()ident(stdout)operator(\);) + ident(fflush)operator(()ident(stderr)operator(\);) +preprocessor(#endif) + + reserved(switch) operator(()ident(pid) operator(=) ident(fork)operator((\)\)) operator({) + reserved(case) integer(0)operator(:) +preprocessor(#ifdef) ident(linux) + ident(after_exec)operator((\);) +preprocessor(#endif) + ident(rb_thread_atfork)operator((\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + pre_type(int) ident(status)operator(;) + + ident(rb_protect)operator(()ident(rb_yield)operator(,) ident(Qundef)operator(,) operator(&)ident(status)operator(\);) + ident(ruby_stop)operator(()ident(status)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) + + reserved(case) operator(-)integer(1)operator(:) + ident(rb_sys_fail)operator(()string<delimiter(")content(fork(2\))delimiter(")>operator(\);) + reserved(return) ident(Qnil)operator(;) + + reserved(default)operator(:) + reserved(return) ident(INT2FIX)operator(()ident(pid)operator(\);) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.exit!(fixnum=-1\) + * + * Exits the process immediately. No exit handlers are + * run. <em>fixnum</em> is returned to the underlying system as the + * exit status. + * + * Process.exit!(0\) + */) + +directive(static) ident(VALUE) +ident(rb_f_exit_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(status)operator(;) + pre_type(int) ident(istatus)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(status)operator(\)) operator(==) integer(1)operator(\)) operator({) + reserved(switch) operator(()ident(status)operator(\)) operator({) + reserved(case) label(Qtrue)operator(:) + ident(istatus) operator(=) ident(EXIT_SUCCESS)operator(;) + reserved(break)operator(;) + reserved(case) label(Qfalse)operator(:) + ident(istatus) operator(=) ident(EXIT_FAILURE)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(istatus) operator(=) ident(NUM2INT)operator(()ident(status)operator(\);) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(istatus) operator(=) ident(EXIT_FAILURE)operator(;) + operator(}) + ident(_exit)operator(()ident(istatus)operator(\);) + + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(sun)operator(\)) +preprocessor(#define) ident(signal)operator(()ident(a)operator(,)ident(b)operator(\)) ident(sigset)operator(()ident(a)operator(,)ident(b)operator(\)) +preprocessor(#endif) + +directive(void) +ident(rb_syswait)operator(()ident(pid)operator(\)) + pre_type(int) ident(pid)operator(;) +operator({) + directive(static) pre_type(int) ident(overriding)operator(;) +preprocessor(#ifdef) ident(SIGHUP) + ident(RETSIGTYPE) operator((*)ident(hfunc)operator(\))ident(_)operator((()pre_type(int)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGQUIT) + ident(RETSIGTYPE) operator((*)ident(qfunc)operator(\))ident(_)operator((()pre_type(int)operator(\)\);) +preprocessor(#endif) + ident(RETSIGTYPE) operator((*)ident(ifunc)operator(\))ident(_)operator((()pre_type(int)operator(\)\);) + pre_type(int) ident(status)operator(;) + pre_type(int) ident(i)operator(,) ident(hooked) operator(=) ident(Qfalse)operator(;) + + reserved(if) operator((!)ident(overriding)operator(\)) operator({) +preprocessor(#ifdef) ident(SIGHUP) + ident(hfunc) operator(=) ident(signal)operator(()ident(SIGHUP)operator(,) ident(SIG_IGN)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGQUIT) + ident(qfunc) operator(=) ident(signal)operator(()ident(SIGQUIT)operator(,) ident(SIG_IGN)operator(\);) +preprocessor(#endif) + ident(ifunc) operator(=) ident(signal)operator(()ident(SIGINT)operator(,) ident(SIG_IGN)operator(\);) + ident(overriding) operator(=) ident(Qtrue)operator(;) + ident(hooked) operator(=) ident(Qtrue)operator(;) + operator(}) + + reserved(do) operator({) + ident(i) operator(=) ident(rb_waitpid)operator(()ident(pid)operator(,) operator(&)ident(status)operator(,) integer(0)operator(\);) + operator(}) reserved(while) operator(()ident(i) operator(==) operator(-)integer(1) operator(&&) ident(errno) operator(==) ident(EINTR)operator(\);) + + reserved(if) operator(()ident(hooked)operator(\)) operator({) +preprocessor(#ifdef) ident(SIGHUP) + ident(signal)operator(()ident(SIGHUP)operator(,) ident(hfunc)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGQUIT) + ident(signal)operator(()ident(SIGQUIT)operator(,) ident(qfunc)operator(\);) +preprocessor(#endif) + ident(signal)operator(()ident(SIGINT)operator(,) ident(ifunc)operator(\);) + ident(overriding) operator(=) ident(Qfalse)operator(;) + operator(}) +operator(}) + +comment(/* + * call-seq: + * system(cmd [, arg, ...]\) => true or false + * + * Executes _cmd_ in a subshell, returning +true+ if + * the command was found and ran successfully, +false+ + * otherwise. An error status is available in <code>$?</code>. The + * arguments are processed in the same way as for + * <code>Kernel::exec</code>. + * + * system("echo *"\) + * system("echo", "*"\) + * + * <em>produces:</em> + * + * config.h main.rb + * * + */) + +directive(static) ident(VALUE) +ident(rb_f_system)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + pre_type(int) ident(status)operator(;) +preprocessor(#if) ident(defined)operator(()ident(__EMX__)operator(\)) + ident(VALUE) ident(cmd)operator(;) + + ident(fflush)operator(()ident(stdout)operator(\);) + ident(fflush)operator(()ident(stderr)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rb_last_status) operator(=) ident(Qnil)operator(;) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_ARRAY)operator(\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(len) operator(!=) integer(2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong first argument)delimiter(")>operator(\);) + operator(}) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator([)integer(0)operator(];) + operator(}) + ident(cmd) operator(=) ident(rb_ary_join)operator(()ident(rb_ary_new4)operator(()ident(argc)operator(,) ident(argv)operator(\),) ident(rb_str_new2)operator(()string<delimiter(")content( )delimiter(")>operator(\)\);) + + ident(SafeStringValue)operator(()ident(cmd)operator(\);) + ident(status) operator(=) ident(do_spawn)operator(()ident(RSTRING)operator(()ident(cmd)operator(\)->)ident(ptr)operator(\);) + ident(last_status_set)operator(()ident(status)operator(,) integer(0)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__DJGPP__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) + directive(volatile) ident(VALUE) ident(prog) operator(=) integer(0)operator(;) + + ident(fflush)operator(()ident(stdout)operator(\);) + ident(fflush)operator(()ident(stderr)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rb_last_status) operator(=) ident(Qnil)operator(;) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_ARRAY)operator(\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(len) operator(!=) integer(2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong first argument)delimiter(")>operator(\);) + operator(}) + ident(prog) operator(=) ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator([)integer(0)operator(];) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator([)integer(1)operator(];) + operator(}) + + reserved(if) operator(()ident(argc) operator(==) integer(1) operator(&&) ident(prog) operator(==) integer(0)operator(\)) operator({) +preprocessor(#if) ident(defined)operator(()ident(_WIN32)operator(\)) + ident(SafeStringValue)operator(()ident(argv)operator([)integer(0)operator(]\);) + ident(status) operator(=) ident(do_spawn)operator(()ident(P_WAIT)operator(,) ident(StringValueCStr)operator(()ident(argv)operator([)integer(0)operator(]\)\);) +preprocessor(#else) + ident(status) operator(=) ident(proc_spawn)operator(()ident(argv)operator([)integer(0)operator(]\);) +preprocessor(#endif) + operator(}) + reserved(else) operator({) + ident(status) operator(=) ident(proc_spawn_n)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(prog)operator(\);) + operator(}) +preprocessor(#if) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) + ident(last_status_set)operator(()ident(status) operator(==) operator(-)integer(1) operator(?) integer(127) operator(:) ident(status)operator(,) integer(0)operator(\);) +preprocessor(#else) + reserved(if) operator(()ident(status) operator(==) operator(-)integer(1)operator(\)) + ident(last_status_set)operator(()hex(0x7f) operator(<<) integer(8)operator(,) integer(0)operator(\);) +preprocessor(#endif) +preprocessor(#elif) ident(defined)operator(()ident(__VMS)operator(\)) + ident(VALUE) ident(cmd)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rb_last_status) operator(=) ident(Qnil)operator(;) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_ARRAY)operator(\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(len) operator(!=) integer(2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong first argument)delimiter(")>operator(\);) + operator(}) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator([)integer(0)operator(];) + operator(}) + ident(cmd) operator(=) ident(rb_ary_join)operator(()ident(rb_ary_new4)operator(()ident(argc)operator(,) ident(argv)operator(\),) ident(rb_str_new2)operator(()string<delimiter(")content( )delimiter(")>operator(\)\);) + + ident(SafeStringValue)operator(()ident(cmd)operator(\);) + ident(status) operator(=) ident(system)operator(()ident(StringValueCStr)operator(()ident(cmd)operator(\)\);) + ident(last_status_set)operator((()ident(status) operator(&) hex(0xff)operator(\)) operator(<<) integer(8)operator(,) integer(0)operator(\);) +preprocessor(#else) + directive(volatile) ident(VALUE) ident(prog) operator(=) integer(0)operator(;) + pre_type(int) ident(pid)operator(;) + reserved(struct) ident(rb_exec_arg) ident(earg)operator(;) + ident(RETSIGTYPE) operator((*)ident(chfunc)operator(\)()pre_type(int)operator(\);) + + ident(fflush)operator(()ident(stdout)operator(\);) + ident(fflush)operator(()ident(stderr)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rb_last_status) operator(=) ident(Qnil)operator(;) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_ARRAY)operator(\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(len) operator(!=) integer(2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong first argument)delimiter(")>operator(\);) + operator(}) + ident(prog) operator(=) ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator([)integer(0)operator(];) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(RARRAY)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator([)integer(1)operator(];) + operator(}) + ident(proc_prepare_args)operator((&)ident(earg)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(prog)operator(\);) + + ident(chfunc) operator(=) ident(signal)operator(()ident(SIGCHLD)operator(,) ident(SIG_DFL)operator(\);) + label(retry)operator(:) + ident(pid) operator(=) ident(fork)operator((\);) + reserved(if) operator(()ident(pid) operator(==) integer(0)operator(\)) operator({) + comment(/* child process */) + ident(rb_thread_atfork)operator((\);) + ident(rb_protect)operator(()ident(proc_exec_args)operator(,) operator(()ident(VALUE)operator(\)&)ident(earg)operator(,) pre_constant(NULL)operator(\);) + ident(_exit)operator(()integer(127)operator(\);) + operator(}) + reserved(if) operator(()ident(pid) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(errno) operator(==) ident(EAGAIN)operator(\)) operator({) + ident(rb_thread_sleep)operator(()integer(1)operator(\);) + reserved(goto) ident(retry)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(rb_syswait)operator(()ident(pid)operator(\);) + operator(}) + ident(signal)operator(()ident(SIGCHLD)operator(,) ident(chfunc)operator(\);) + reserved(if) operator(()ident(pid) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(status) operator(=) ident(NUM2INT)operator(()ident(rb_last_status)operator(\);) +preprocessor(#endif) + + reserved(if) operator(()ident(status) operator(==) ident(EXIT_SUCCESS)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * sleep([duration]\) => fixnum + * + * Suspends the current thread for _duration_ seconds (which may be any number, + * including a +Float+ with fractional seconds\). Returns the actual number of + * seconds slept (rounded\), which may be less than that asked for if another + * thread calls <code>Thread#run</code>. Zero arguments causes +sleep+ to sleep + * forever. + * + * Time.new #=> Wed Apr 09 08:56:32 CDT 2003 + * sleep 1.2 #=> 1 + * Time.new #=> Wed Apr 09 08:56:33 CDT 2003 + * sleep 1.9 #=> 2 + * Time.new #=> Wed Apr 09 08:56:35 CDT 2003 + */) + +directive(static) ident(VALUE) +ident(rb_f_sleep)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + pre_type(int) ident(beg)operator(,) ident(end)operator(;) + + ident(beg) operator(=) ident(time)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(rb_thread_sleep_forever)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(rb_thread_wait_for)operator(()ident(rb_time_interval)operator(()ident(argv)operator([)integer(0)operator(]\)\);) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + + ident(end) operator(=) ident(time)operator(()integer(0)operator(\)) operator(-) ident(beg)operator(;) + + reserved(return) ident(INT2FIX)operator(()ident(end)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.getpgrp => integer + * + * Returns the process group ID for this process. Not available on + * all platforms. + * + * Process.getpgid(0\) #=> 25527 + * Process.getpgrp #=> 25527 + */) + +preprocessor(#if) ident(defined)operator(()ident(SIGCLD)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(SIGCHLD)operator(\)) +preprocessor(# define) ident(SIGCHLD) ident(SIGCLD) +preprocessor(#endif) + +directive(static) ident(VALUE) +ident(proc_getpgrp)operator((\)) +operator({) + pre_type(int) ident(pgrp)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) +preprocessor(#if) ident(defined)operator(()ident(HAVE_GETPGRP)operator(\)) operator(&&) ident(defined)operator(()ident(GETPGRP_VOID)operator(\)) + ident(pgrp) operator(=) ident(getpgrp)operator((\);) + reserved(if) operator(()ident(pgrp) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(pgrp)operator(\);) +preprocessor(#else) +preprocessor(# ifdef) ident(HAVE_GETPGID) + ident(pgrp) operator(=) ident(getpgid)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(pgrp) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(pgrp)operator(\);) +preprocessor(# else) + ident(rb_notimplement)operator((\);) +preprocessor(# endif) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.setpgrp => 0 + * + * Equivalent to <code>setpgid(0,0\)</code>. Not available on all + * platforms. + */) + +directive(static) ident(VALUE) +ident(proc_setpgrp)operator((\)) +operator({) + ident(rb_secure)operator(()integer(2)operator(\);) + comment(/* check for posix setpgid(\) first; this matches the posix */) + comment(/* getpgrp(\) above. It appears that configure will set SETPGRP_VOID */) + comment(/* even though setpgrp(0,0\) would be prefered. The posix call avoids */) + comment(/* this confusion. */) +preprocessor(#ifdef) ident(HAVE_SETPGID) + reserved(if) operator(()ident(setpgid)operator(()integer(0)operator(,)integer(0)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETPGRP)operator(\)) operator(&&) ident(defined)operator(()ident(SETPGRP_VOID)operator(\)) + reserved(if) operator(()ident(setpgrp)operator((\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.getpgid(pid\) => integer + * + * Returns the process group ID for the given process id. Not + * available on all platforms. + * + * Process.getpgid(Process.ppid(\)\) #=> 25527 + */) + +directive(static) ident(VALUE) +ident(proc_getpgid)operator(()ident(obj)operator(,) ident(pid)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(pid)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_GETPGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + pre_type(int) ident(i)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(i) operator(=) ident(getpgid)operator(()ident(NUM2INT)operator(()ident(pid)operator(\)\);) + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(return) ident(INT2NUM)operator(()ident(i)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.setpgid(pid, integer\) => 0 + * + * Sets the process group ID of _pid_ (0 indicates this + * process\) to <em>integer</em>. Not available on all platforms. + */) + +directive(static) ident(VALUE) +ident(proc_setpgid)operator(()ident(obj)operator(,) ident(pid)operator(,) ident(pgrp)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(pid)operator(,) ident(pgrp)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_SETPGID) + pre_type(int) ident(ipid)operator(,) ident(ipgrp)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(ipid) operator(=) ident(NUM2INT)operator(()ident(pid)operator(\);) + ident(ipgrp) operator(=) ident(NUM2INT)operator(()ident(pgrp)operator(\);) + + reserved(if) operator(()ident(setpgid)operator(()ident(ipid)operator(,) ident(ipgrp)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.setsid => fixnum + * + * Establishes this process as a new session and process group + * leader, with no controlling tty. Returns the session id. Not + * available on all platforms. + * + * Process.setsid #=> 27422 + */) + +directive(static) ident(VALUE) +ident(proc_setsid)operator((\)) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETSID)operator(\)) + pre_type(int) ident(pid)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(pid) operator(=) ident(setsid)operator((\);) + reserved(if) operator(()ident(pid) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(pid)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETPGRP)operator(\)) operator(&&) ident(defined)operator(()ident(TIOCNOTTY)operator(\)) + ident(rb_pid_t) ident(pid)operator(;) + pre_type(int) ident(ret)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(pid) operator(=) ident(getpid)operator((\);) +preprocessor(#if) ident(defined)operator(()ident(SETPGRP_VOID)operator(\)) + ident(ret) operator(=) ident(setpgrp)operator((\);) + comment(/* If `pid_t setpgrp(void\)' is equivalent to setsid(\), + `ret' will be the same value as `pid', and following open(\) will fail. + In Linux, `int setpgrp(void\)' is equivalent to setpgid(0, 0\). */) +preprocessor(#else) + ident(ret) operator(=) ident(setpgrp)operator(()integer(0)operator(,) ident(pid)operator(\);) +preprocessor(#endif) + reserved(if) operator(()ident(ret) operator(==) operator(-)integer(1)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + + reserved(if) operator((()ident(fd) operator(=) ident(open)operator(()string<delimiter(")content(/dev/tty)delimiter(")>operator(,) ident(O_RDWR)operator(\)\)) operator(>=) integer(0)operator(\)) operator({) + ident(ioctl)operator(()ident(fd)operator(,) ident(TIOCNOTTY)operator(,) pre_constant(NULL)operator(\);) + ident(close)operator(()ident(fd)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(pid)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.getpriority(kind, integer\) => fixnum + * + * Gets the scheduling priority for specified process, process group, + * or user. <em>kind</em> indicates the kind of entity to find: one + * of <code>Process::PRIO_PGRP</code>, + * <code>Process::PRIO_USER</code>, or + * <code>Process::PRIO_PROCESS</code>. _integer_ is an id + * indicating the particular process, process group, or user (an id + * of 0 means _current_\). Lower priorities are more favorable + * for scheduling. Not available on all platforms. + * + * Process.getpriority(Process::PRIO_USER, 0\) #=> 19 + * Process.getpriority(Process::PRIO_PROCESS, 0\) #=> 19 + */) + +directive(static) ident(VALUE) +ident(proc_getpriority)operator(()ident(obj)operator(,) ident(which)operator(,) ident(who)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(which)operator(,) ident(who)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_GETPRIORITY) + pre_type(int) ident(prio)operator(,) ident(iwhich)operator(,) ident(iwho)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(iwhich) operator(=) ident(NUM2INT)operator(()ident(which)operator(\);) + ident(iwho) operator(=) ident(NUM2INT)operator(()ident(who)operator(\);) + + ident(errno) operator(=) integer(0)operator(;) + ident(prio) operator(=) ident(getpriority)operator(()ident(iwhich)operator(,) ident(iwho)operator(\);) + reserved(if) operator(()ident(errno)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(prio)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.setpriority(kind, integer, priority\) => 0 + * + * See <code>Process#getpriority</code>. + * + * Process.setpriority(Process::PRIO_USER, 0, 19\) #=> 0 + * Process.setpriority(Process::PRIO_PROCESS, 0, 19\) #=> 0 + * Process.getpriority(Process::PRIO_USER, 0\) #=> 19 + * Process.getpriority(Process::PRIO_PROCESS, 0\) #=> 19 + */) + +directive(static) ident(VALUE) +ident(proc_setpriority)operator(()ident(obj)operator(,) ident(which)operator(,) ident(who)operator(,) ident(prio)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(which)operator(,) ident(who)operator(,) ident(prio)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_GETPRIORITY) + pre_type(int) ident(iwhich)operator(,) ident(iwho)operator(,) ident(iprio)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + ident(iwhich) operator(=) ident(NUM2INT)operator(()ident(which)operator(\);) + ident(iwho) operator(=) ident(NUM2INT)operator(()ident(who)operator(\);) + ident(iprio) operator(=) ident(NUM2INT)operator(()ident(prio)operator(\);) + + reserved(if) operator(()ident(setpriority)operator(()ident(iwhich)operator(,) ident(iwho)operator(,) ident(iprio)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + +preprocessor(#if) ident(SIZEOF_RLIM_T) operator(==) ident(SIZEOF_INT) +preprocessor(# define) ident(RLIM2NUM)operator(()ident(v)operator(\)) ident(UINT2NUM)operator(()ident(v)operator(\)) +preprocessor(# define) ident(NUM2RLIM)operator(()ident(v)operator(\)) ident(NUM2UINT)operator(()ident(v)operator(\)) +preprocessor(#elif) ident(SIZEOF_RLIM_T) operator(==) ident(SIZEOF_LONG) +preprocessor(# define) ident(RLIM2NUM)operator(()ident(v)operator(\)) ident(ULONG2NUM)operator(()ident(v)operator(\)) +preprocessor(# define) ident(NUM2RLIM)operator(()ident(v)operator(\)) ident(NUM2ULONG)operator(()ident(v)operator(\)) +preprocessor(#elif) ident(SIZEOF_RLIM_T) operator(==) ident(SIZEOF_LONG_LONG) +preprocessor(# define) ident(RLIM2NUM)operator(()ident(v)operator(\)) ident(ULL2NUM)operator(()ident(v)operator(\)) +preprocessor(# define) ident(NUM2RLIM)operator(()ident(v)operator(\)) ident(NUM2ULL)operator(()ident(v)operator(\)) +preprocessor(#endif) + +comment(/* + * call-seq: + * Process.getrlimit(resource\) => [cur_limit, max_limit] + * + * Gets the resource limit of the process. + * _cur_limit_ means current (soft\) limit and + * _max_limit_ means maximum (hard\) limit. + * + * _resource_ indicates the kind of resource to limit: + * such as <code>Process::RLIMIT_CORE</code>, + * <code>Process::RLIMIT_CPU</code>, etc. + * See Process.setrlimit for details. + * + * _cur_limit_ and _max_limit_ may be <code>Process::RLIM_INFINITY</code>, + * <code>Process::RLIM_SAVED_MAX</code> or + * <code>Process::RLIM_SAVED_CUR</code>. + * See Process.setrlimit and the system getrlimit(2\) manual for details. + */) + +directive(static) ident(VALUE) +ident(proc_getrlimit)operator(()ident(VALUE) ident(obj)operator(,) ident(VALUE) ident(resource)operator(\)) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_GETRLIMIT)operator(\)) operator(&&) ident(defined)operator(()ident(RLIM2NUM)operator(\)) + reserved(struct) ident(rlimit) ident(rlim)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + + reserved(if) operator(()ident(getrlimit)operator(()ident(NUM2INT)operator(()ident(resource)operator(\),) operator(&)ident(rlim)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()string<delimiter(")content(getrlimit)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(rb_assoc_new)operator(()ident(RLIM2NUM)operator(()ident(rlim)operator(.)ident(rlim_cur)operator(\),) ident(RLIM2NUM)operator(()ident(rlim)operator(.)ident(rlim_max)operator(\)\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * Process.setrlimit(resource, cur_limit, max_limit\) => nil + * Process.setrlimit(resource, cur_limit\) => nil + * + * Sets the resource limit of the process. + * _cur_limit_ means current (soft\) limit and + * _max_limit_ means maximum (hard\) limit. + * + * If _max_limit_ is not given, _cur_limit_ is used. + * + * _resource_ indicates the kind of resource to limit. + * The list of resources are OS dependent. + * Ruby may support following resources. + * + * [Process::RLIMIT_CORE] core size (bytes\) (SUSv3\) + * [Process::RLIMIT_CPU] CPU time (seconds\) (SUSv3\) + * [Process::RLIMIT_DATA] data segment (bytes\) (SUSv3\) + * [Process::RLIMIT_FSIZE] file size (bytes\) (SUSv3\) + * [Process::RLIMIT_NOFILE] file descriptors (number\) (SUSv3\) + * [Process::RLIMIT_STACK] stack size (bytes\) (SUSv3\) + * [Process::RLIMIT_AS] total available memory (bytes\) (SUSv3, NetBSD, FreeBSD, OpenBSD but 4.4BSD-Lite\) + * [Process::RLIMIT_MEMLOCK] total size for mlock(2\) (bytes\) (4.4BSD, GNU/Linux\) + * [Process::RLIMIT_NPROC] number of processes for the user (number\) (4.4BSD, GNU/Linux\) + * [Process::RLIMIT_RSS] resident memory size (bytes\) (4.2BSD, GNU/Linux\) + * [Process::RLIMIT_SBSIZE] all socket buffers (bytes\) (NetBSD, FreeBSD\) + * + * Other <code>Process::RLIMIT_???</code> constants may be defined. + * + * _cur_limit_ and _max_limit_ may be <code>Process::RLIM_INFINITY</code>, + * which means that the resource is not limited. + * They may be <code>Process::RLIM_SAVED_MAX</code> or + * <code>Process::RLIM_SAVED_CUR</code> too. + * See system setrlimit(2\) manual for details. + * + */) + +directive(static) ident(VALUE) +ident(proc_setrlimit)operator(()pre_type(int) ident(argc)operator(,) ident(VALUE) operator(*)ident(argv)operator(,) ident(VALUE) ident(obj)operator(\)) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRLIMIT)operator(\)) operator(&&) ident(defined)operator(()ident(NUM2RLIM)operator(\)) + ident(VALUE) ident(resource)operator(,) ident(rlim_cur)operator(,) ident(rlim_max)operator(;) + reserved(struct) ident(rlimit) ident(rlim)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(21)delimiter(")>operator(,) operator(&)ident(resource)operator(,) operator(&)ident(rlim_cur)operator(,) operator(&)ident(rlim_max)operator(\);) + reserved(if) operator(()ident(rlim_max) operator(==) ident(Qnil)operator(\)) + ident(rlim_max) operator(=) ident(rlim_cur)operator(;) + + ident(rlim)operator(.)ident(rlim_cur) operator(=) ident(NUM2RLIM)operator(()ident(rlim_cur)operator(\);) + ident(rlim)operator(.)ident(rlim_max) operator(=) ident(NUM2RLIM)operator(()ident(rlim_max)operator(\);) + + reserved(if) operator(()ident(setrlimit)operator(()ident(NUM2INT)operator(()ident(resource)operator(\),) operator(&)ident(rlim)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()string<delimiter(")content(setrlimit)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + +directive(static) pre_type(int) ident(under_uid_switch) operator(=) integer(0)operator(;) +directive(static) directive(void) +ident(check_uid_switch)operator((\)) +operator({) + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(if) operator(()ident(under_uid_switch)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(can't handle UID while evaluating block given to Process::UID.switch method)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) ident(under_gid_switch) operator(=) integer(0)operator(;) +directive(static) directive(void) +ident(check_gid_switch)operator((\)) +operator({) + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(if) operator(()ident(under_gid_switch)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(can't handle GID while evaluating block given to Process::UID.switch method)delimiter(")>operator(\);) + operator(}) +operator(}) + + +comment(/********************************************************************* + * Document-class: Process::Sys + * + * The <code>Process::Sys</code> module contains UID and GID + * functions which provide direct bindings to the system calls of the + * same names instead of the more-portable versions of the same + * functionality found in the <code>Process</code>, + * <code>Process::UID</code>, and <code>Process::GID</code> modules. + */) + + +comment(/* + * call-seq: + * Process::Sys.setuid(integer\) => nil + * + * Set the user ID of the current process to _integer_. Not + * available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_setuid)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETUID) + ident(check_uid_switch)operator((\);) + reserved(if) operator(()ident(setuid)operator(()ident(NUM2INT)operator(()ident(id)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + + + +comment(/* + * call-seq: + * Process::Sys.setruid(integer\) => nil + * + * Set the real user ID of the calling process to _integer_. + * Not available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_setruid)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETRUID) + ident(check_uid_switch)operator((\);) + reserved(if) operator(()ident(setruid)operator(()ident(NUM2INT)operator(()ident(id)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Process::Sys.seteuid(integer\) => nil + * + * Set the effective user ID of the calling process to + * _integer_. Not available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_seteuid)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETEUID) + ident(check_uid_switch)operator((\);) + reserved(if) operator(()ident(seteuid)operator(()ident(NUM2INT)operator(()ident(id)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Process::Sys.setreuid(rid, eid\) => nil + * + * Sets the (integer\) real and/or effective user IDs of the current + * process to _rid_ and _eid_, respectively. A value of + * <code>-1</code> for either means to leave that ID unchanged. Not + * available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_setreuid)operator(()ident(obj)operator(,) ident(rid)operator(,) ident(eid)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(rid)operator(,) ident(eid)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETREUID) + ident(check_uid_switch)operator((\);) + reserved(if) operator(()ident(setreuid)operator(()ident(NUM2INT)operator(()ident(rid)operator(\),)ident(NUM2INT)operator(()ident(eid)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Process::Sys.setresuid(rid, eid, sid\) => nil + * + * Sets the (integer\) real, effective, and saved user IDs of the + * current process to _rid_, _eid_, and _sid_ respectively. A + * value of <code>-1</code> for any value means to + * leave that ID unchanged. Not available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_setresuid)operator(()ident(obj)operator(,) ident(rid)operator(,) ident(eid)operator(,) ident(sid)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(rid)operator(,) ident(eid)operator(,) ident(sid)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETRESUID) + ident(check_uid_switch)operator((\);) + reserved(if) operator(()ident(setresuid)operator(()ident(NUM2INT)operator(()ident(rid)operator(\),)ident(NUM2INT)operator(()ident(eid)operator(\),)ident(NUM2INT)operator(()ident(sid)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Process.uid => fixnum + * Process::UID.rid => fixnum + * Process::Sys.getuid => fixnum + * + * Returns the (real\) user ID of this process. + * + * Process.uid #=> 501 + */) + +directive(static) ident(VALUE) +ident(proc_getuid)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(uid) operator(=) ident(getuid)operator((\);) + reserved(return) ident(INT2FIX)operator(()ident(uid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.uid= integer => numeric + * + * Sets the (integer\) user ID for this process. Not available on all + * platforms. + */) + +directive(static) ident(VALUE) +ident(proc_setuid)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) + pre_type(int) ident(uid) operator(=) ident(NUM2INT)operator(()ident(id)operator(\);) + + ident(check_uid_switch)operator((\);) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(if) operator(()ident(setresuid)operator(()ident(uid)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETREUID) + reserved(if) operator(()ident(setreuid)operator(()ident(uid)operator(,) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETRUID) + reserved(if) operator(()ident(setruid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETUID) + operator({) + reserved(if) operator(()ident(geteuid)operator((\)) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(setuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_notimplement)operator((\);) + operator(}) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()ident(uid)operator(\);) +operator(}) + + +comment(/******************************************************************** + * + * Document-class: Process::UID + * + * The <code>Process::UID</code> module contains a collection of + * module functions which can be used to portably get, set, and + * switch the current process's real, effective, and saved user IDs. + * + */) + +directive(static) pre_type(int) ident(SAVED_USER_ID) operator(=) operator(-)integer(1)operator(;) + +preprocessor(#ifdef) ident(BROKEN_SETREUID) +pre_type(int) +ident(setreuid)operator(()ident(ruid)operator(,) ident(euid)operator(\)) + ident(rb_uid_t) ident(ruid)operator(,) ident(euid)operator(;) +operator({) + reserved(if) operator(()ident(ruid) operator(!=) operator(-)integer(1) operator(&&) ident(ruid) operator(!=) ident(getuid)operator((\)\)) operator({) + reserved(if) operator(()ident(euid) operator(==) operator(-)integer(1)operator(\)) ident(euid) operator(=) ident(geteuid)operator((\);) + reserved(if) operator(()ident(setuid)operator(()ident(ruid)operator(\)) operator(<) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(euid) operator(!=) operator(-)integer(1) operator(&&) ident(euid) operator(!=) ident(geteuid)operator((\)\)) operator({) + reserved(if) operator(()ident(seteuid)operator(()ident(euid)operator(\)) operator(<) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) +preprocessor(#endif) + +comment(/* + * call-seq: + * Process::UID.change_privilege(integer\) => fixnum + * + * Change the current process's real and effective user ID to that + * specified by _integer_. Returns the new user ID. Not + * available on all platforms. + * + * [Process.uid, Process.euid] #=> [0, 0] + * Process::UID.change_privilege(31\) #=> 31 + * [Process.uid, Process.euid] #=> [31, 31] + */) + +directive(static) ident(VALUE) +ident(p_uid_change_privilege)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) + pre_type(int) ident(uid)operator(;) + + ident(check_uid_switch)operator((\);) + + ident(uid) operator(=) ident(NUM2INT)operator(()ident(id)operator(\);) + + reserved(if) operator(()ident(geteuid)operator((\)) operator(==) integer(0)operator(\)) operator({) comment(/* root-user */) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESUID)operator(\)) + reserved(if) operator(()ident(setresuid)operator(()ident(uid)operator(,) ident(uid)operator(,) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETUID)operator(\)) + reserved(if) operator(()ident(setuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREUID)operator(\)) + reserved(if) operator(()ident(getuid)operator((\)) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(SAVED_USER_ID) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(setreuid)operator((-)integer(1)operator(,) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(uid) operator(==) integer(0)operator(\)) operator({) comment(/* (r,e,s\) == (root, root, x\) */) + reserved(if) operator(()ident(setreuid)operator((-)integer(1)operator(,) ident(SAVED_USER_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setreuid)operator(()ident(SAVED_USER_ID)operator(,) integer(0)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) integer(0)operator(;) comment(/* (r,e,s\) == (x, root, root\) */) + reserved(if) operator(()ident(setreuid)operator(()ident(uid)operator(,) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setreuid)operator(()integer(0)operator(,) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(setreuid)operator(()ident(uid)operator(,) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + operator(}) + operator(}) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setreuid)operator(()ident(uid)operator(,) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + operator(}) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETRUID)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_SETEUID)operator(\)) + reserved(if) operator(()ident(getuid)operator((\)) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(SAVED_USER_ID) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(seteuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(uid) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(setruid)operator(()ident(SAVED_USER_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(setruid)operator(()integer(0)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setruid)operator(()integer(0)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(seteuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setruid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + operator(}) + operator(}) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(seteuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setruid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + operator(}) reserved(else) operator({) comment(/* unprivileged user */) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESUID)operator(\)) + reserved(if) operator(()ident(setresuid)operator((()ident(getuid)operator((\)) operator(==) ident(uid)operator(\)?) operator(-)integer(1)operator(:) ident(uid)operator(,) + operator(()ident(geteuid)operator((\)) operator(==) ident(uid)operator(\)?) operator(-)integer(1)operator(:) ident(uid)operator(,) + operator(()ident(SAVED_USER_ID) operator(==) ident(uid)operator(\)?) operator(-)integer(1)operator(:) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREUID)operator(\)) + reserved(if) operator(()ident(SAVED_USER_ID) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(setreuid)operator((()ident(getuid)operator((\)) operator(==) ident(uid)operator(\)?) operator(-)integer(1)operator(:) ident(uid)operator(,) + operator(()ident(geteuid)operator((\)) operator(==) ident(uid)operator(\)?) operator(-)integer(1)operator(:) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) reserved(if) operator(()ident(getuid)operator((\)) operator(!=) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(setreuid)operator(()ident(uid)operator(,) operator(()ident(geteuid)operator((\)) operator(==) ident(uid)operator(\)?) operator(-)integer(1)operator(:) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + operator(}) reserved(else) reserved(if) operator(()comment(/* getuid(\) == uid && */) ident(geteuid)operator((\)) operator(!=) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(setreuid)operator(()ident(geteuid)operator((\),) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + reserved(if) operator(()ident(setreuid)operator(()ident(uid)operator(,) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) comment(/* getuid(\) == uid && geteuid(\) == uid */) + reserved(if) operator(()ident(setreuid)operator((-)integer(1)operator(,) ident(SAVED_USER_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setreuid)operator(()ident(SAVED_USER_ID)operator(,) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + reserved(if) operator(()ident(setreuid)operator(()ident(uid)operator(,) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETRUID)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_SETEUID)operator(\)) + reserved(if) operator(()ident(SAVED_USER_ID) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(geteuid)operator((\)) operator(!=) ident(uid) operator(&&) ident(seteuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(getuid)operator((\)) operator(!=) ident(uid) operator(&&) ident(setruid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) reserved(if) operator(()comment(/* SAVED_USER_ID != uid && */) ident(geteuid)operator((\)) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(getuid)operator((\)) operator(!=) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(setruid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setruid)operator(()ident(SAVED_USER_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + reserved(if) operator(()ident(setruid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + operator(}) reserved(else) reserved(if) operator(()comment(/* geteuid(\) != uid && */) ident(getuid)operator((\)) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(seteuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setruid)operator(()ident(SAVED_USER_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + reserved(if) operator(()ident(setruid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined) ident(HAVE_44BSD_SETUID) + reserved(if) operator(()ident(getuid)operator((\)) operator(==) ident(uid)operator(\)) operator({) + comment(/* (r,e,s\)==(uid,?,?\) ==> (uid,uid,uid\) */) + reserved(if) operator(()ident(setuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined) ident(HAVE_SETEUID) + reserved(if) operator(()ident(getuid)operator((\)) operator(==) ident(uid) operator(&&) ident(SAVED_USER_ID) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(seteuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined) ident(HAVE_SETUID) + reserved(if) operator(()ident(getuid)operator((\)) operator(==) ident(uid) operator(&&) ident(SAVED_USER_ID) operator(==) ident(uid)operator(\)) operator({) + reserved(if) operator(()ident(setuid)operator(()ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(uid)operator(\);) +operator(}) + + + +comment(/* + * call-seq: + * Process::Sys.setgid(integer\) => nil + * + * Set the group ID of the current process to _integer_. Not + * available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_setgid)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETGID) + ident(check_gid_switch)operator((\);) + reserved(if) operator(()ident(setgid)operator(()ident(NUM2INT)operator(()ident(id)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Process::Sys.setrgid(integer\) => nil + * + * Set the real group ID of the calling process to _integer_. + * Not available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_setrgid)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETRGID) + ident(check_gid_switch)operator((\);) + reserved(if) operator(()ident(setrgid)operator(()ident(NUM2INT)operator(()ident(id)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + + + +comment(/* + * call-seq: + * Process::Sys.setegid(integer\) => nil + * + * Set the effective group ID of the calling process to + * _integer_. Not available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_setegid)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETEGID) + ident(check_gid_switch)operator((\);) + reserved(if) operator(()ident(setegid)operator(()ident(NUM2INT)operator(()ident(id)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Process::Sys.setregid(rid, eid\) => nil + * + * Sets the (integer\) real and/or effective group IDs of the current + * process to <em>rid</em> and <em>eid</em>, respectively. A value of + * <code>-1</code> for either means to leave that ID unchanged. Not + * available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_setregid)operator(()ident(obj)operator(,) ident(rid)operator(,) ident(eid)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(rid)operator(,) ident(eid)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETREGID) + ident(check_gid_switch)operator((\);) + reserved(if) operator(()ident(setregid)operator(()ident(NUM2INT)operator(()ident(rid)operator(\),)ident(NUM2INT)operator(()ident(eid)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * Process::Sys.setresgid(rid, eid, sid\) => nil + * + * Sets the (integer\) real, effective, and saved user IDs of the + * current process to <em>rid</em>, <em>eid</em>, and <em>sid</em> + * respectively. A value of <code>-1</code> for any value means to + * leave that ID unchanged. Not available on all platforms. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_setresgid)operator(()ident(obj)operator(,) ident(rid)operator(,) ident(eid)operator(,) ident(sid)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(rid)operator(,) ident(eid)operator(,) ident(sid)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_SETRESGID) + ident(check_gid_switch)operator((\);) + reserved(if) operator(()ident(setresgid)operator(()ident(NUM2INT)operator(()ident(rid)operator(\),)ident(NUM2INT)operator(()ident(eid)operator(\),)ident(NUM2INT)operator(()ident(sid)operator(\)\)) operator(!=) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Process::Sys.issetugid => true or false + * + * Returns +true+ if the process was created as a result + * of an execve(2\) system call which had either of the setuid or + * setgid bits set (and extra privileges were given as a result\) or + * if it has changed any of its real, effective or saved user or + * group IDs since it began execution. + * + */) + +directive(static) ident(VALUE) +ident(p_sys_issetugid)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#if) ident(defined) ident(HAVE_ISSETUGID) + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(if) operator(()ident(issetugid)operator((\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) reserved(else) operator({) + reserved(return) ident(Qfalse)operator(;) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.gid => fixnum + * Process::GID.rid => fixnum + * Process::Sys.getgid => fixnum + * + * Returns the (real\) group ID for this process. + * + * Process.gid #=> 500 + */) + +directive(static) ident(VALUE) +ident(proc_getgid)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(gid) operator(=) ident(getgid)operator((\);) + reserved(return) ident(INT2FIX)operator(()ident(gid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.gid= fixnum => fixnum + * + * Sets the group ID for this process. + */) + +directive(static) ident(VALUE) +ident(proc_setgid)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) + pre_type(int) ident(gid) operator(=) ident(NUM2INT)operator(()ident(id)operator(\);) + + ident(check_gid_switch)operator((\);) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(if) operator(()ident(setresgid)operator(()ident(gid)operator(,) operator(-)integer(1)operator(,) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETREGID) + reserved(if) operator(()ident(setregid)operator(()ident(gid)operator(,) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETRGID) + reserved(if) operator(()ident(setrgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETGID) + operator({) + reserved(if) operator(()ident(getegid)operator((\)) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_notimplement)operator((\);) + operator(}) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()ident(gid)operator(\);) +operator(}) + + +directive(static) ident(size_t) ident(maxgroups) operator(=) integer(32)operator(;) + + +comment(/* + * call-seq: + * Process.groups => array + * + * Get an <code>Array</code> of the gids of groups in the + * supplemental group access list for this process. + * + * Process.groups #=> [27, 6, 10, 11] + * + */) + +directive(static) ident(VALUE) +ident(proc_getgroups)operator(()ident(VALUE) ident(obj)operator(\)) +operator({) +preprocessor(#ifdef) ident(HAVE_GETGROUPS) + ident(VALUE) ident(ary)operator(;) + ident(size_t) ident(ngroups)operator(;) + ident(rb_gid_t) operator(*)ident(groups)operator(;) + pre_type(int) ident(i)operator(;) + + ident(groups) operator(=) ident(ALLOCA_N)operator(()ident(rb_gid_t)operator(,) ident(maxgroups)operator(\);) + + ident(ngroups) operator(=) ident(getgroups)operator(()ident(maxgroups)operator(,) ident(groups)operator(\);) + reserved(if) operator(()ident(ngroups) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(ngroups)operator(;) ident(i)operator(++\)) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(INT2NUM)operator(()ident(groups)operator([)ident(i)operator(]\)\);) + + reserved(return) ident(ary)operator(;) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.groups= array => array + * + * Set the supplemental group access list to the given + * <code>Array</code> of group IDs. + * + * Process.groups #=> [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27] + * Process.groups = [27, 6, 10, 11] #=> [27, 6, 10, 11] + * Process.groups #=> [27, 6, 10, 11] + * + */) + +directive(static) ident(VALUE) +ident(proc_setgroups)operator(()ident(VALUE) ident(obj)operator(,) ident(VALUE) ident(ary)operator(\)) +operator({) +preprocessor(#ifdef) ident(HAVE_SETGROUPS) + ident(size_t) ident(ngroups)operator(;) + ident(rb_gid_t) operator(*)ident(groups)operator(;) + pre_type(int) ident(i)operator(;) + reserved(struct) ident(group) operator(*)ident(gr)operator(;) + + ident(Check_Type)operator(()ident(ary)operator(,) ident(T_ARRAY)operator(\);) + + ident(ngroups) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(ngroups) operator(>) ident(maxgroups)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(too many groups, %d max)delimiter(")>operator(,) ident(maxgroups)operator(\);) + + ident(groups) operator(=) ident(ALLOCA_N)operator(()ident(rb_gid_t)operator(,) ident(ngroups)operator(\);) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(ngroups) operator(&&) ident(i) operator(<) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(g) operator(=) ident(RARRAY)operator(()ident(ary)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(g)operator(\)\)) operator({) + ident(groups)operator([)ident(i)operator(]) operator(=) ident(FIX2INT)operator(()ident(g)operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_check_string_type)operator(()ident(g)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + ident(groups)operator([)ident(i)operator(]) operator(=) ident(NUM2INT)operator(()ident(g)operator(\);) + operator(}) + reserved(else) operator({) + ident(gr) operator(=) ident(getgrnam)operator(()ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(\);) + reserved(if) operator(()ident(gr) operator(==) pre_constant(NULL)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) + string<delimiter(")content(can't find group for %s)delimiter(")>operator(,) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(\);) + ident(groups)operator([)ident(i)operator(]) operator(=) ident(gr)operator(->)ident(gr_gid)operator(;) + operator(}) + operator(}) + operator(}) + + ident(i) operator(=) ident(setgroups)operator(()ident(ngroups)operator(,) ident(groups)operator(\);) + reserved(if) operator(()ident(i) operator(==) operator(-)integer(1)operator(\)) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + + reserved(return) ident(proc_getgroups)operator(()ident(obj)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.initgroups(username, gid\) => array + * + * Initializes the supplemental group access list by reading the + * system group database and using all groups of which the given user + * is a member. The group with the specified <em>gid</em> is also + * added to the list. Returns the resulting <code>Array</code> of the + * gids of all the groups in the supplementary group access list. Not + * available on all platforms. + * + * Process.groups #=> [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27] + * Process.initgroups( "mgranger", 30 \) #=> [30, 6, 10, 11] + * Process.groups #=> [30, 6, 10, 11] + * + */) + +directive(static) ident(VALUE) +ident(proc_initgroups)operator(()ident(obj)operator(,) ident(uname)operator(,) ident(base_grp)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(uname)operator(,) ident(base_grp)operator(;) +operator({) +preprocessor(#ifdef) ident(HAVE_INITGROUPS) + reserved(if) operator(()ident(initgroups)operator(()ident(StringValuePtr)operator(()ident(uname)operator(\),) operator(()ident(rb_gid_t)operator(\))ident(NUM2INT)operator(()ident(base_grp)operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + reserved(return) ident(proc_getgroups)operator(()ident(obj)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) + reserved(return) ident(Qnil)operator(;) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.maxgroups => fixnum + * + * Returns the maximum number of gids allowed in the supplemental + * group access list. + * + * Process.maxgroups #=> 32 + */) + +directive(static) ident(VALUE) +ident(proc_getmaxgroups)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(INT2FIX)operator(()ident(maxgroups)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.maxgroups= fixnum => fixnum + * + * Sets the maximum number of gids allowed in the supplemental group + * access list. + */) + +directive(static) ident(VALUE) +ident(proc_setmaxgroups)operator(()ident(VALUE) ident(obj)operator(,) ident(VALUE) ident(val)operator(\)) +operator({) + ident(size_t) ident(ngroups) operator(=) ident(FIX2INT)operator(()ident(val)operator(\);) + + reserved(if) operator(()ident(ngroups) operator(>) integer(4096)operator(\)) + ident(ngroups) operator(=) integer(4096)operator(;) + + ident(maxgroups) operator(=) ident(ngroups)operator(;) + + reserved(return) ident(INT2FIX)operator(()ident(maxgroups)operator(\);) +operator(}) + + +comment(/******************************************************************** + * + * Document-class: Process::GID + * + * The <code>Process::GID</code> module contains a collection of + * module functions which can be used to portably get, set, and + * switch the current process's real, effective, and saved group IDs. + * + */) + +directive(static) pre_type(int) ident(SAVED_GROUP_ID) operator(=) operator(-)integer(1)operator(;) + +preprocessor(#ifdef) ident(BROKEN_SETREGID) +pre_type(int) +ident(setregid)operator(()ident(rgid)operator(,) ident(egid)operator(\)) + ident(rb_gid_t) ident(rgid)operator(,) ident(egid)operator(;) +operator({) + reserved(if) operator(()ident(rgid) operator(!=) operator(-)integer(1) operator(&&) ident(rgid) operator(!=) ident(getgid)operator((\)\)) operator({) + reserved(if) operator(()ident(egid) operator(==) operator(-)integer(1)operator(\)) ident(egid) operator(=) ident(getegid)operator((\);) + reserved(if) operator(()ident(setgid)operator(()ident(rgid)operator(\)) operator(<) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(egid) operator(!=) operator(-)integer(1) operator(&&) ident(egid) operator(!=) ident(getegid)operator((\)\)) operator({) + reserved(if) operator(()ident(setegid)operator(()ident(egid)operator(\)) operator(<) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) +preprocessor(#endif) + +comment(/* + * call-seq: + * Process::GID.change_privilege(integer\) => fixnum + * + * Change the current process's real and effective group ID to that + * specified by _integer_. Returns the new group ID. Not + * available on all platforms. + * + * [Process.gid, Process.egid] #=> [0, 0] + * Process::GID.change_privilege(33\) #=> 33 + * [Process.gid, Process.egid] #=> [33, 33] + */) + +directive(static) ident(VALUE) +ident(p_gid_change_privilege)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) + pre_type(int) ident(gid)operator(;) + + ident(check_gid_switch)operator((\);) + + ident(gid) operator(=) ident(NUM2INT)operator(()ident(id)operator(\);) + + reserved(if) operator(()ident(geteuid)operator((\)) operator(==) integer(0)operator(\)) operator({) comment(/* root-user */) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESGID)operator(\)) + reserved(if) operator(()ident(setresgid)operator(()ident(gid)operator(,) ident(gid)operator(,) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) +preprocessor(#elif) ident(defined) ident(HAVE_SETGID) + reserved(if) operator(()ident(setgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREGID)operator(\)) + reserved(if) operator(()ident(getgid)operator((\)) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(SAVED_GROUP_ID) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setregid)operator((-)integer(1)operator(,) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(gid) operator(==) integer(0)operator(\)) operator({) comment(/* (r,e,s\) == (root, y, x\) */) + reserved(if) operator(()ident(setregid)operator((-)integer(1)operator(,) ident(SAVED_GROUP_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setregid)operator(()ident(SAVED_GROUP_ID)operator(,) integer(0)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) integer(0)operator(;) comment(/* (r,e,s\) == (x, root, root\) */) + reserved(if) operator(()ident(setregid)operator(()ident(gid)operator(,) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + operator(}) reserved(else) operator({) comment(/* (r,e,s\) == (z, y, x\) */) + reserved(if) operator(()ident(setregid)operator(()integer(0)operator(,) integer(0)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(setregid)operator(()ident(gid)operator(,) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + operator(}) + operator(}) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setregid)operator(()ident(gid)operator(,) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + operator(}) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETRGID)operator(\)) operator(&&) ident(defined) operator(()ident(HAVE_SETEGID)operator(\)) + reserved(if) operator(()ident(getgid)operator((\)) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(SAVED_GROUP_ID) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setegid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(gid) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(setegid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setrgid)operator(()ident(SAVED_GROUP_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(setrgid)operator(()integer(0)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setrgid)operator(()integer(0)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(setegid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setrgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + operator(}) + operator(}) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setegid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setrgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + operator(}) reserved(else) operator({) comment(/* unprivileged user */) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESGID)operator(\)) + reserved(if) operator(()ident(setresgid)operator((()ident(getgid)operator((\)) operator(==) ident(gid)operator(\)?) operator(-)integer(1)operator(:) ident(gid)operator(,) + operator(()ident(getegid)operator((\)) operator(==) ident(gid)operator(\)?) operator(-)integer(1)operator(:) ident(gid)operator(,) + operator(()ident(SAVED_GROUP_ID) operator(==) ident(gid)operator(\)?) operator(-)integer(1)operator(:) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREGID)operator(\)) + reserved(if) operator(()ident(SAVED_GROUP_ID) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setregid)operator((()ident(getgid)operator((\)) operator(==) ident(gid)operator(\)?) operator(-)integer(1)operator(:) ident(gid)operator(,) + operator(()ident(getegid)operator((\)) operator(==) ident(gid)operator(\)?) operator(-)integer(1)operator(:) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) reserved(if) operator(()ident(getgid)operator((\)) operator(!=) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setregid)operator(()ident(gid)operator(,) operator(()ident(getegid)operator((\)) operator(==) ident(gid)operator(\)?) operator(-)integer(1)operator(:) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + operator(}) reserved(else) reserved(if) operator(()comment(/* getgid(\) == gid && */) ident(getegid)operator((\)) operator(!=) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setregid)operator(()ident(getegid)operator((\),) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + reserved(if) operator(()ident(setregid)operator(()ident(gid)operator(,) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) comment(/* getgid(\) == gid && getegid(\) == gid */) + reserved(if) operator(()ident(setregid)operator((-)integer(1)operator(,) ident(SAVED_GROUP_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setregid)operator(()ident(SAVED_GROUP_ID)operator(,) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + reserved(if) operator(()ident(setregid)operator(()ident(gid)operator(,) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETRGID)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_SETEGID)operator(\)) + reserved(if) operator(()ident(SAVED_GROUP_ID) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(getegid)operator((\)) operator(!=) ident(gid) operator(&&) ident(setegid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(getgid)operator((\)) operator(!=) ident(gid) operator(&&) ident(setrgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) reserved(if) operator(()comment(/* SAVED_GROUP_ID != gid && */) ident(getegid)operator((\)) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(getgid)operator((\)) operator(!=) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setrgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setrgid)operator(()ident(SAVED_GROUP_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + reserved(if) operator(()ident(setrgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + operator(}) reserved(else) reserved(if) operator(()comment(/* getegid(\) != gid && */) ident(getgid)operator((\)) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setegid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setrgid)operator(()ident(SAVED_GROUP_ID)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + reserved(if) operator(()ident(setrgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined) ident(HAVE_44BSD_SETGID) + reserved(if) operator(()ident(getgid)operator((\)) operator(==) ident(gid)operator(\)) operator({) + comment(/* (r,e,s\)==(gid,?,?\) ==> (gid,gid,gid\) */) + reserved(if) operator(()ident(setgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined) ident(HAVE_SETEGID) + reserved(if) operator(()ident(getgid)operator((\)) operator(==) ident(gid) operator(&&) ident(SAVED_GROUP_ID) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setegid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined) ident(HAVE_SETGID) + reserved(if) operator(()ident(getgid)operator((\)) operator(==) ident(gid) operator(&&) ident(SAVED_GROUP_ID) operator(==) ident(gid)operator(\)) operator({) + reserved(if) operator(()ident(setgid)operator(()ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(gid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.euid => fixnum + * Process::UID.eid => fixnum + * Process::Sys.geteuid => fixnum + * + * Returns the effective user ID for this process. + * + * Process.euid #=> 501 + */) + +directive(static) ident(VALUE) +ident(proc_geteuid)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(euid) operator(=) ident(geteuid)operator((\);) + reserved(return) ident(INT2FIX)operator(()ident(euid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.euid= integer + * + * Sets the effective user ID for this process. Not available on all + * platforms. + */) + +directive(static) ident(VALUE) +ident(proc_seteuid)operator(()ident(obj)operator(,) ident(euid)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(euid)operator(;) +operator({) + ident(check_uid_switch)operator((\);) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(if) operator(()ident(setresuid)operator((-)integer(1)operator(,) ident(NUM2INT)operator(()ident(euid)operator(\),) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETREUID) + reserved(if) operator(()ident(setreuid)operator((-)integer(1)operator(,) ident(NUM2INT)operator(()ident(euid)operator(\)\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETEUID) + reserved(if) operator(()ident(seteuid)operator(()ident(NUM2INT)operator(()ident(euid)operator(\)\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETUID) + ident(euid) operator(=) ident(NUM2INT)operator(()ident(euid)operator(\);) + reserved(if) operator(()ident(euid) operator(==) ident(getuid)operator((\)\)) operator({) + reserved(if) operator(()ident(setuid)operator(()ident(euid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_notimplement)operator((\);) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(euid)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_seteuid_core)operator(()ident(euid)operator(\)) + pre_type(int) ident(euid)operator(;) +operator({) + pre_type(int) ident(uid)operator(;) + + ident(check_uid_switch)operator((\);) + + ident(uid) operator(=) ident(getuid)operator((\);) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(if) operator(()ident(uid) operator(!=) ident(euid)operator(\)) operator({) + reserved(if) operator(()ident(setresuid)operator((-)integer(1)operator(,)ident(euid)operator(,)ident(euid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(euid)operator(;) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setresuid)operator((-)integer(1)operator(,)ident(euid)operator(,-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREUID)operator(\)) + reserved(if) operator(()ident(setreuid)operator((-)integer(1)operator(,) ident(euid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(uid) operator(!=) ident(euid)operator(\)) operator({) + reserved(if) operator(()ident(setreuid)operator(()ident(euid)operator(,)ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setreuid)operator(()ident(uid)operator(,)ident(euid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(euid)operator(;) + operator(}) +preprocessor(#elif) ident(defined) ident(HAVE_SETEUID) + reserved(if) operator(()ident(seteuid)operator(()ident(euid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETUID) + reserved(if) operator(()ident(geteuid)operator((\)) operator(==) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setuid)operator(()ident(euid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()ident(euid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process::UID.grant_privilege(integer\) => fixnum + * Process::UID.eid= integer => fixnum + * + * Set the effective user ID, and if possible, the saved user ID of + * the process to the given _integer_. Returns the new + * effective user ID. Not available on all platforms. + * + * [Process.uid, Process.euid] #=> [0, 0] + * Process::UID.grant_privilege(31\) #=> 31 + * [Process.uid, Process.euid] #=> [0, 31] + */) + +directive(static) ident(VALUE) +ident(p_uid_grant_privilege)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) + reserved(return) ident(rb_seteuid_core)operator(()ident(NUM2INT)operator(()ident(id)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * Process.egid => fixnum + * Process::GID.eid => fixnum + * Process::Sys.geteid => fixnum + * + * Returns the effective group ID for this process. Not available on + * all platforms. + * + * Process.egid #=> 500 + */) + +directive(static) ident(VALUE) +ident(proc_getegid)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(egid) operator(=) ident(getegid)operator((\);) + + reserved(return) ident(INT2FIX)operator(()ident(egid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process.egid = fixnum => fixnum + * + * Sets the effective group ID for this process. Not available on all + * platforms. + */) + +directive(static) ident(VALUE) +ident(proc_setegid)operator(()ident(obj)operator(,) ident(egid)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(egid)operator(;) +operator({) + ident(check_gid_switch)operator((\);) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(if) operator(()ident(setresgid)operator((-)integer(1)operator(,) ident(NUM2INT)operator(()ident(egid)operator(\),) operator(-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETREGID) + reserved(if) operator(()ident(setregid)operator((-)integer(1)operator(,) ident(NUM2INT)operator(()ident(egid)operator(\)\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETEGID) + reserved(if) operator(()ident(setegid)operator(()ident(NUM2INT)operator(()ident(egid)operator(\)\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETGID) + ident(egid) operator(=) ident(NUM2INT)operator(()ident(egid)operator(\);) + reserved(if) operator(()ident(egid) operator(==) ident(getgid)operator((\)\)) operator({) + reserved(if) operator(()ident(setgid)operator(()ident(egid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_notimplement)operator((\);) + operator(}) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(egid)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_setegid_core)operator(()ident(egid)operator(\)) + pre_type(int) ident(egid)operator(;) +operator({) + pre_type(int) ident(gid)operator(;) + + ident(check_gid_switch)operator((\);) + + ident(gid) operator(=) ident(getgid)operator((\);) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(if) operator(()ident(gid) operator(!=) ident(egid)operator(\)) operator({) + reserved(if) operator(()ident(setresgid)operator((-)integer(1)operator(,)ident(egid)operator(,)ident(egid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(egid)operator(;) + operator(}) reserved(else) operator({) + reserved(if) operator(()ident(setresgid)operator((-)integer(1)operator(,)ident(egid)operator(,-)integer(1)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREGID)operator(\)) + reserved(if) operator(()ident(setregid)operator((-)integer(1)operator(,) ident(egid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(gid) operator(!=) ident(egid)operator(\)) operator({) + reserved(if) operator(()ident(setregid)operator(()ident(egid)operator(,)ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setregid)operator(()ident(gid)operator(,)ident(egid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(egid)operator(;) + operator(}) +preprocessor(#elif) ident(defined) ident(HAVE_SETEGID) + reserved(if) operator(()ident(setegid)operator(()ident(egid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#elif) ident(defined) ident(HAVE_SETGID) + reserved(if) operator(()ident(geteuid)operator((\)) operator(==) integer(0) comment(/* root user */)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(setgid)operator(()ident(egid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()ident(egid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process::GID.grant_privilege(integer\) => fixnum + * Process::GID.eid = integer => fixnum + * + * Set the effective group ID, and if possible, the saved group ID of + * the process to the given _integer_. Returns the new + * effective group ID. Not available on all platforms. + * + * [Process.gid, Process.egid] #=> [0, 0] + * Process::GID.grant_privilege(31\) #=> 33 + * [Process.gid, Process.egid] #=> [0, 33] + */) + +directive(static) ident(VALUE) +ident(p_gid_grant_privilege)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(id)operator(;) +operator({) + reserved(return) ident(rb_setegid_core)operator(()ident(NUM2INT)operator(()ident(id)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * Process::UID.re_exchangeable? => true or false + * + * Returns +true+ if the real and effective user IDs of a + * process may be exchanged on the current platform. + * + */) + +directive(static) ident(VALUE) +ident(p_uid_exchangeable)operator((\)) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(return) ident(Qtrue)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREUID)operator(\)) + reserved(return) ident(Qtrue)operator(;) +preprocessor(#else) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process::UID.re_exchange => fixnum + * + * Exchange real and effective user IDs and return the new effective + * user ID. Not available on all platforms. + * + * [Process.uid, Process.euid] #=> [0, 31] + * Process::UID.re_exchange #=> 0 + * [Process.uid, Process.euid] #=> [31, 0] + */) + +directive(static) ident(VALUE) +ident(p_uid_exchange)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(uid)operator(,) ident(euid)operator(;) + + ident(check_uid_switch)operator((\);) + + ident(uid) operator(=) ident(getuid)operator((\);) + ident(euid) operator(=) ident(geteuid)operator((\);) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(if) operator(()ident(setresuid)operator(()ident(euid)operator(,) ident(uid)operator(,) ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREUID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREUID)operator(\)) + reserved(if) operator(()ident(setreuid)operator(()ident(euid)operator(,)ident(uid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_USER_ID) operator(=) ident(uid)operator(;) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()ident(uid)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process::GID.re_exchangeable? => true or false + * + * Returns +true+ if the real and effective group IDs of a + * process may be exchanged on the current platform. + * + */) + +directive(static) ident(VALUE) +ident(p_gid_exchangeable)operator((\)) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(return) ident(Qtrue)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREGID)operator(\)) + reserved(return) ident(Qtrue)operator(;) +preprocessor(#else) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process::GID.re_exchange => fixnum + * + * Exchange real and effective group IDs and return the new effective + * group ID. Not available on all platforms. + * + * [Process.gid, Process.egid] #=> [0, 33] + * Process::GID.re_exchange #=> 0 + * [Process.gid, Process.egid] #=> [33, 0] + */) + +directive(static) ident(VALUE) +ident(p_gid_exchange)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(gid)operator(,) ident(egid)operator(;) + + ident(check_gid_switch)operator((\);) + + ident(gid) operator(=) ident(getgid)operator((\);) + ident(egid) operator(=) ident(getegid)operator((\);) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + reserved(if) operator(()ident(setresgid)operator(()ident(egid)operator(,) ident(gid)operator(,) ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETREGID)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(OBSOLETE_SETREGID)operator(\)) + reserved(if) operator(()ident(setregid)operator(()ident(egid)operator(,)ident(gid)operator(\)) operator(<) integer(0)operator(\)) ident(rb_sys_fail)operator(()integer(0)operator(\);) + ident(SAVED_GROUP_ID) operator(=) ident(gid)operator(;) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) + reserved(return) ident(INT2FIX)operator(()ident(gid)operator(\);) +operator(}) + +comment(/* [MG] :FIXME: Is this correct? I'm not sure how to phrase this. */) + +comment(/* + * call-seq: + * Process::UID.sid_available? => true or false + * + * Returns +true+ if the current platform has saved user + * ID functionality. + * + */) + +directive(static) ident(VALUE) +ident(p_uid_have_saved_id)operator((\)) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESUID)operator(\)) operator(||) ident(defined)operator(()ident(HAVE_SETEUID)operator(\)) operator(||) ident(defined)operator(()ident(_POSIX_SAVED_IDS)operator(\)) + reserved(return) ident(Qtrue)operator(;) +preprocessor(#else) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) +operator(}) + + +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESUID)operator(\)) operator(||) ident(defined)operator(()ident(HAVE_SETEUID)operator(\)) operator(||) ident(defined)operator(()ident(_POSIX_SAVED_IDS)operator(\)) +directive(static) ident(VALUE) +ident(p_uid_sw_ensure)operator(()ident(id)operator(\)) + pre_type(int) ident(id)operator(;) +operator({) + ident(under_uid_switch) operator(=) integer(0)operator(;) + reserved(return) ident(rb_seteuid_core)operator(()ident(id)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process::UID.switch => fixnum + * Process::UID.switch {|| block} => object + * + * Switch the effective and real user IDs of the current process. If + * a <em>block</em> is given, the user IDs will be switched back + * after the block is executed. Returns the new effective user ID if + * called without a block, and the return value of the block if one + * is given. + * + */) + +directive(static) ident(VALUE) +ident(p_uid_switch)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(uid)operator(,) ident(euid)operator(;) + + ident(check_uid_switch)operator((\);) + + ident(uid) operator(=) ident(getuid)operator((\);) + ident(euid) operator(=) ident(geteuid)operator((\);) + + reserved(if) operator(()ident(uid) operator(!=) ident(euid)operator(\)) operator({) + ident(proc_seteuid)operator(()ident(obj)operator(,) ident(INT2FIX)operator(()ident(uid)operator(\)\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(under_uid_switch) operator(=) integer(1)operator(;) + reserved(return) ident(rb_ensure)operator(()ident(rb_yield)operator(,) ident(Qnil)operator(,) ident(p_uid_sw_ensure)operator(,) ident(SAVED_USER_ID)operator(\);) + operator(}) reserved(else) operator({) + reserved(return) ident(INT2FIX)operator(()ident(euid)operator(\);) + operator(}) + operator(}) reserved(else) reserved(if) operator(()ident(euid) operator(!=) ident(SAVED_USER_ID)operator(\)) operator({) + ident(proc_seteuid)operator(()ident(obj)operator(,) ident(INT2FIX)operator(()ident(SAVED_USER_ID)operator(\)\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(under_uid_switch) operator(=) integer(1)operator(;) + reserved(return) ident(rb_ensure)operator(()ident(rb_yield)operator(,) ident(Qnil)operator(,) ident(p_uid_sw_ensure)operator(,) ident(euid)operator(\);) + operator(}) reserved(else) operator({) + reserved(return) ident(INT2FIX)operator(()ident(uid)operator(\);) + operator(}) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + +preprocessor(#else) +directive(static) ident(VALUE) +ident(p_uid_sw_ensure)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(under_uid_switch) operator(=) integer(0)operator(;) + reserved(return) ident(p_uid_exchange)operator(()ident(obj)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(p_uid_switch)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(uid)operator(,) ident(euid)operator(;) + + ident(check_uid_switch)operator((\);) + + ident(uid) operator(=) ident(getuid)operator((\);) + ident(euid) operator(=) ident(geteuid)operator((\);) + + reserved(if) operator(()ident(uid) operator(==) ident(euid)operator(\)) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + ident(p_uid_exchange)operator(()ident(obj)operator(\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(under_uid_switch) operator(=) integer(1)operator(;) + reserved(return) ident(rb_ensure)operator(()ident(rb_yield)operator(,) ident(Qnil)operator(,) ident(p_uid_sw_ensure)operator(,) ident(obj)operator(\);) + operator(}) reserved(else) operator({) + reserved(return) ident(INT2FIX)operator(()ident(euid)operator(\);) + operator(}) +preprocessor(#endif) +operator(}) + + +comment(/* [MG] :FIXME: Is this correct? I'm not sure how to phrase this. */) + +comment(/* + * call-seq: + * Process::GID.sid_available? => true or false + * + * Returns +true+ if the current platform has saved group + * ID functionality. + * + */) + +directive(static) ident(VALUE) +ident(p_gid_have_saved_id)operator((\)) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESGID)operator(\)) operator(||) ident(defined)operator(()ident(HAVE_SETEGID)operator(\)) operator(||) ident(defined)operator(()ident(_POSIX_SAVED_IDS)operator(\)) + reserved(return) ident(Qtrue)operator(;) +preprocessor(#else) + reserved(return) ident(Qfalse)operator(;) +preprocessor(#endif) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETRESGID)operator(\)) operator(||) ident(defined)operator(()ident(HAVE_SETEGID)operator(\)) operator(||) ident(defined)operator(()ident(_POSIX_SAVED_IDS)operator(\)) +directive(static) ident(VALUE) +ident(p_gid_sw_ensure)operator(()ident(id)operator(\)) + pre_type(int) ident(id)operator(;) +operator({) + ident(under_gid_switch) operator(=) integer(0)operator(;) + reserved(return) ident(rb_setegid_core)operator(()ident(id)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * Process::GID.switch => fixnum + * Process::GID.switch {|| block} => object + * + * Switch the effective and real group IDs of the current process. If + * a <em>block</em> is given, the group IDs will be switched back + * after the block is executed. Returns the new effective group ID if + * called without a block, and the return value of the block if one + * is given. + * + */) + +directive(static) ident(VALUE) +ident(p_gid_switch)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(gid)operator(,) ident(egid)operator(;) + + ident(check_gid_switch)operator((\);) + + ident(gid) operator(=) ident(getgid)operator((\);) + ident(egid) operator(=) ident(getegid)operator((\);) + + reserved(if) operator(()ident(gid) operator(!=) ident(egid)operator(\)) operator({) + ident(proc_setegid)operator(()ident(obj)operator(,) ident(INT2FIX)operator(()ident(gid)operator(\)\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(under_gid_switch) operator(=) integer(1)operator(;) + reserved(return) ident(rb_ensure)operator(()ident(rb_yield)operator(,) ident(Qnil)operator(,) ident(p_gid_sw_ensure)operator(,) ident(SAVED_GROUP_ID)operator(\);) + operator(}) reserved(else) operator({) + reserved(return) ident(INT2FIX)operator(()ident(egid)operator(\);) + operator(}) + operator(}) reserved(else) reserved(if) operator(()ident(egid) operator(!=) ident(SAVED_GROUP_ID)operator(\)) operator({) + ident(proc_setegid)operator(()ident(obj)operator(,) ident(INT2FIX)operator(()ident(SAVED_GROUP_ID)operator(\)\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(under_gid_switch) operator(=) integer(1)operator(;) + reserved(return) ident(rb_ensure)operator(()ident(rb_yield)operator(,) ident(Qnil)operator(,) ident(p_gid_sw_ensure)operator(,) ident(egid)operator(\);) + operator(}) reserved(else) operator({) + reserved(return) ident(INT2FIX)operator(()ident(gid)operator(\);) + operator(}) + operator(}) reserved(else) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#else) +directive(static) ident(VALUE) +ident(p_gid_sw_ensure)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(under_gid_switch) operator(=) integer(0)operator(;) + reserved(return) ident(p_gid_exchange)operator(()ident(obj)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(p_gid_switch)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + pre_type(int) ident(gid)operator(,) ident(egid)operator(;) + + ident(check_gid_switch)operator((\);) + + ident(gid) operator(=) ident(getgid)operator((\);) + ident(egid) operator(=) ident(getegid)operator((\);) + + reserved(if) operator(()ident(gid) operator(==) ident(egid)operator(\)) operator({) + ident(errno) operator(=) ident(EPERM)operator(;) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + ident(p_gid_exchange)operator(()ident(obj)operator(\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(under_gid_switch) operator(=) integer(1)operator(;) + reserved(return) ident(rb_ensure)operator(()ident(rb_yield)operator(,) ident(Qnil)operator(,) ident(p_gid_sw_ensure)operator(,) ident(obj)operator(\);) + operator(}) reserved(else) operator({) + reserved(return) ident(INT2FIX)operator(()ident(egid)operator(\);) + operator(}) +preprocessor(#endif) +operator(}) + + +comment(/* + * call-seq: + * Process.times => aStructTms + * + * Returns a <code>Tms</code> structure (see <code>Struct::Tms</code> + * on page 388\) that contains user and system CPU times for this + * process. + * + * t = Process.times + * [ t.utime, t.stime ] #=> [0.0, 0.02] + */) + +ident(VALUE) +ident(rb_proc_times)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_TIMES)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__CHECKER__)operator(\)) + directive(const) pre_type(double) ident(hertz) operator(=) +preprocessor(#ifdef) ident(HAVE__SC_CLK_TCK) + operator(()pre_type(double)operator(\))ident(sysconf)operator(()ident(_SC_CLK_TCK)operator(\);) +preprocessor(#else) +preprocessor(#ifndef) ident(HZ) +preprocessor(# ifdef) ident(CLK_TCK) +preprocessor(# define) ident(HZ) ident(CLK_TCK) +preprocessor(# else) +preprocessor(# define) ident(HZ) integer(60) +preprocessor(# endif) +preprocessor(#endif) comment(/* HZ */) + ident(HZ)operator(;) +preprocessor(#endif) + reserved(struct) ident(tms) ident(buf)operator(;) + directive(volatile) ident(VALUE) ident(utime)operator(,) ident(stime)operator(,) ident(cutime)operator(,) ident(sctime)operator(;) + + ident(times)operator((&)ident(buf)operator(\);) + reserved(return) ident(rb_struct_new)operator(()ident(S_Tms)operator(,) + ident(utime) operator(=) ident(rb_float_new)operator(()ident(buf)operator(.)ident(tms_utime) operator(/) ident(hertz)operator(\),) + ident(stime) operator(=) ident(rb_float_new)operator(()ident(buf)operator(.)ident(tms_stime) operator(/) ident(hertz)operator(\),) + ident(cutime) operator(=) ident(rb_float_new)operator(()ident(buf)operator(.)ident(tms_cutime) operator(/) ident(hertz)operator(\),) + ident(sctime) operator(=) ident(rb_float_new)operator(()ident(buf)operator(.)ident(tms_cstime) operator(/) ident(hertz)operator(\)\);) +preprocessor(#else) + ident(rb_notimplement)operator((\);) +preprocessor(#endif) +operator(}) + +ident(VALUE) ident(rb_mProcess)operator(;) +ident(VALUE) ident(rb_mProcUID)operator(;) +ident(VALUE) ident(rb_mProcGID)operator(;) +ident(VALUE) ident(rb_mProcID_Syscall)operator(;) + + +comment(/* + * The <code>Process</code> module is a collection of methods used to + * manipulate processes. + */) + +directive(void) +ident(Init_process)operator((\)) +operator({) + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($$)delimiter(")>operator(,) ident(get_pid)operator(,) integer(0)operator(\);) + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($?)delimiter(")>operator(,) operator(&)ident(rb_last_status)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(exec)delimiter(")>operator(,) ident(rb_f_exec)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(fork)delimiter(")>operator(,) ident(rb_f_fork)operator(,) integer(0)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(exit!)delimiter(")>operator(,) ident(rb_f_exit_bang)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(system)delimiter(")>operator(,) ident(rb_f_system)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(sleep)delimiter(")>operator(,) ident(rb_f_sleep)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_mProcess) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(Process)delimiter(")>operator(\);) + +preprocessor(#if) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(DJGPP)operator(\)) +preprocessor(#ifdef) ident(WNOHANG) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(WNOHANG)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(WNOHANG)operator(\)\);) +preprocessor(#else) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(WNOHANG)delimiter(")>operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(WUNTRACED) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(WUNTRACED)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(WUNTRACED)operator(\)\);) +preprocessor(#else) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(WUNTRACED)delimiter(")>operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\);) +preprocessor(#endif) +preprocessor(#endif) + + ident(rb_define_singleton_method)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(fork)delimiter(")>operator(,) ident(rb_f_fork)operator(,) integer(0)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(exit!)delimiter(")>operator(,) ident(rb_f_exit_bang)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(exit)delimiter(")>operator(,) ident(rb_f_exit)operator(,) operator(-)integer(1)operator(\);) comment(/* in eval.c */) + ident(rb_define_singleton_method)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(abort)delimiter(")>operator(,) ident(rb_f_abort)operator(,) operator(-)integer(1)operator(\);) comment(/* in eval.c */) + + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(kill)delimiter(")>operator(,) ident(rb_f_kill)operator(,) operator(-)integer(1)operator(\);) comment(/* in signal.c */) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(wait)delimiter(")>operator(,) ident(proc_wait)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(wait2)delimiter(")>operator(,) ident(proc_wait2)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(waitpid)delimiter(")>operator(,) ident(proc_wait)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(waitpid2)delimiter(")>operator(,) ident(proc_wait2)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(waitall)delimiter(")>operator(,) ident(proc_waitall)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(detach)delimiter(")>operator(,) ident(proc_detach)operator(,) integer(1)operator(\);) + + ident(rb_cProcStatus) operator(=) ident(rb_define_class_under)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(Status)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cProcStatus)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(pst_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) ident(pst_bitand)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(>>)delimiter(")>operator(,) ident(pst_rshift)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) ident(pst_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(,) ident(pst_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(pst_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(pst_inspect)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(pid)delimiter(")>operator(,) ident(pst_pid)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(stopped?)delimiter(")>operator(,) ident(pst_wifstopped)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(stopsig)delimiter(")>operator(,) ident(pst_wstopsig)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(signaled?)delimiter(")>operator(,) ident(pst_wifsignaled)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(termsig)delimiter(")>operator(,) ident(pst_wtermsig)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(exited?)delimiter(")>operator(,) ident(pst_wifexited)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(exitstatus)delimiter(")>operator(,) ident(pst_wexitstatus)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(success?)delimiter(")>operator(,) ident(pst_success_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cProcStatus)operator(,) string<delimiter(")content(coredump?)delimiter(")>operator(,) ident(pst_wcoredump)operator(,) integer(0)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(pid)delimiter(")>operator(,) ident(get_pid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(ppid)delimiter(")>operator(,) ident(get_ppid)operator(,) integer(0)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(getpgrp)delimiter(")>operator(,) ident(proc_getpgrp)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(setpgrp)delimiter(")>operator(,) ident(proc_setpgrp)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(getpgid)delimiter(")>operator(,) ident(proc_getpgid)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(setpgid)delimiter(")>operator(,) ident(proc_setpgid)operator(,) integer(2)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(setsid)delimiter(")>operator(,) ident(proc_setsid)operator(,) integer(0)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(getpriority)delimiter(")>operator(,) ident(proc_getpriority)operator(,) integer(2)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(setpriority)delimiter(")>operator(,) ident(proc_setpriority)operator(,) integer(3)operator(\);) + +preprocessor(#ifdef) ident(HAVE_GETPRIORITY) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(PRIO_PROCESS)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(PRIO_PROCESS)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(PRIO_PGRP)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(PRIO_PGRP)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(PRIO_USER)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(PRIO_USER)operator(\)\);) +preprocessor(#endif) + + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(getrlimit)delimiter(")>operator(,) ident(proc_getrlimit)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(setrlimit)delimiter(")>operator(,) ident(proc_setrlimit)operator(,) operator(-)integer(1)operator(\);) +preprocessor(#ifdef) ident(RLIM2NUM) +preprocessor(#ifdef) ident(RLIM_INFINITY) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIM_INFINITY)delimiter(")>operator(,) ident(RLIM2NUM)operator(()ident(RLIM_INFINITY)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIM_SAVED_MAX) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIM_SAVED_MAX)delimiter(")>operator(,) ident(RLIM2NUM)operator(()ident(RLIM_SAVED_MAX)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIM_SAVED_CUR) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIM_SAVED_CUR)delimiter(")>operator(,) ident(RLIM2NUM)operator(()ident(RLIM_SAVED_CUR)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_CORE) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_CORE)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_CORE)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_CPU) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_CPU)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_CPU)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_DATA) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_DATA)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_DATA)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_FSIZE) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_FSIZE)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_FSIZE)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_NOFILE) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_NOFILE)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_NOFILE)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_STACK) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_STACK)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_STACK)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_AS) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_AS)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_AS)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_MEMLOCK) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_MEMLOCK)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_MEMLOCK)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_NPROC) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_NPROC)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_NPROC)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_RSS) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_RSS)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_RSS)operator(\)\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(RLIMIT_SBSIZE) + ident(rb_define_const)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(RLIMIT_SBSIZE)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RLIMIT_SBSIZE)operator(\)\);) +preprocessor(#endif) +preprocessor(#endif) + + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(uid)delimiter(")>operator(,) ident(proc_getuid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(uid=)delimiter(")>operator(,) ident(proc_setuid)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(gid)delimiter(")>operator(,) ident(proc_getgid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(gid=)delimiter(")>operator(,) ident(proc_setgid)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(euid)delimiter(")>operator(,) ident(proc_geteuid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(euid=)delimiter(")>operator(,) ident(proc_seteuid)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(egid)delimiter(")>operator(,) ident(proc_getegid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(egid=)delimiter(")>operator(,) ident(proc_setegid)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(initgroups)delimiter(")>operator(,) ident(proc_initgroups)operator(,) integer(2)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(groups)delimiter(")>operator(,) ident(proc_getgroups)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(groups=)delimiter(")>operator(,) ident(proc_setgroups)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(maxgroups)delimiter(")>operator(,) ident(proc_getmaxgroups)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(maxgroups=)delimiter(")>operator(,) ident(proc_setmaxgroups)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(times)delimiter(")>operator(,) ident(rb_proc_times)operator(,) integer(0)operator(\);) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_TIMES)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) + ident(S_Tms) operator(=) ident(rb_struct_define)operator(()string<delimiter(")content(Tms)delimiter(")>operator(,) string<delimiter(")content(utime)delimiter(")>operator(,) string<delimiter(")content(stime)delimiter(")>operator(,) string<delimiter(")content(cutime)delimiter(")>operator(,) string<delimiter(")content(cstime)delimiter(")>operator(,) pre_constant(NULL)operator(\);) +preprocessor(#endif) + + ident(SAVED_USER_ID) operator(=) ident(geteuid)operator((\);) + ident(SAVED_GROUP_ID) operator(=) ident(getegid)operator((\);) + + ident(rb_mProcUID) operator(=) ident(rb_define_module_under)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(UID)delimiter(")>operator(\);) + ident(rb_mProcGID) operator(=) ident(rb_define_module_under)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(GID)delimiter(")>operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcUID)operator(,) string<delimiter(")content(rid)delimiter(")>operator(,) ident(proc_getuid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcGID)operator(,) string<delimiter(")content(rid)delimiter(")>operator(,) ident(proc_getgid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcUID)operator(,) string<delimiter(")content(eid)delimiter(")>operator(,) ident(proc_geteuid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcGID)operator(,) string<delimiter(")content(eid)delimiter(")>operator(,) ident(proc_getegid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcUID)operator(,) string<delimiter(")content(change_privilege)delimiter(")>operator(,) ident(p_uid_change_privilege)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcGID)operator(,) string<delimiter(")content(change_privilege)delimiter(")>operator(,) ident(p_gid_change_privilege)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcUID)operator(,) string<delimiter(")content(grant_privilege)delimiter(")>operator(,) ident(p_uid_grant_privilege)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcGID)operator(,) string<delimiter(")content(grant_privilege)delimiter(")>operator(,) ident(p_gid_grant_privilege)operator(,) integer(1)operator(\);) + ident(rb_define_alias)operator(()ident(rb_singleton_class)operator(()ident(rb_mProcUID)operator(\),) string<delimiter(")content(eid=)delimiter(")>operator(,) string<delimiter(")content(grant_privilege)delimiter(")>operator(\);) + ident(rb_define_alias)operator(()ident(rb_singleton_class)operator(()ident(rb_mProcGID)operator(\),) string<delimiter(")content(eid=)delimiter(")>operator(,) string<delimiter(")content(grant_privilege)delimiter(")>operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcUID)operator(,) string<delimiter(")content(re_exchange)delimiter(")>operator(,) ident(p_uid_exchange)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcGID)operator(,) string<delimiter(")content(re_exchange)delimiter(")>operator(,) ident(p_gid_exchange)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcUID)operator(,) string<delimiter(")content(re_exchangeable?)delimiter(")>operator(,) ident(p_uid_exchangeable)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcGID)operator(,) string<delimiter(")content(re_exchangeable?)delimiter(")>operator(,) ident(p_gid_exchangeable)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcUID)operator(,) string<delimiter(")content(sid_available?)delimiter(")>operator(,) ident(p_uid_have_saved_id)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcGID)operator(,) string<delimiter(")content(sid_available?)delimiter(")>operator(,) ident(p_gid_have_saved_id)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcUID)operator(,) string<delimiter(")content(switch)delimiter(")>operator(,) ident(p_uid_switch)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcGID)operator(,) string<delimiter(")content(switch)delimiter(")>operator(,) ident(p_gid_switch)operator(,) integer(0)operator(\);) + + ident(rb_mProcID_Syscall) operator(=) ident(rb_define_module_under)operator(()ident(rb_mProcess)operator(,) string<delimiter(")content(Sys)delimiter(")>operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(getuid)delimiter(")>operator(,) ident(proc_getuid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(geteuid)delimiter(")>operator(,) ident(proc_geteuid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(getgid)delimiter(")>operator(,) ident(proc_getgid)operator(,) integer(0)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(getegid)delimiter(")>operator(,) ident(proc_getegid)operator(,) integer(0)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(setuid)delimiter(")>operator(,) ident(p_sys_setuid)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(setgid)delimiter(")>operator(,) ident(p_sys_setgid)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(setruid)delimiter(")>operator(,) ident(p_sys_setruid)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(setrgid)delimiter(")>operator(,) ident(p_sys_setrgid)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(seteuid)delimiter(")>operator(,) ident(p_sys_seteuid)operator(,) integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(setegid)delimiter(")>operator(,) ident(p_sys_setegid)operator(,) integer(1)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(setreuid)delimiter(")>operator(,) ident(p_sys_setreuid)operator(,) integer(2)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(setregid)delimiter(")>operator(,) ident(p_sys_setregid)operator(,) integer(2)operator(\);) + + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(setresuid)delimiter(")>operator(,) ident(p_sys_setresuid)operator(,) integer(3)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(setresgid)delimiter(")>operator(,) ident(p_sys_setresgid)operator(,) integer(3)operator(\);) + ident(rb_define_module_function)operator(()ident(rb_mProcID_Syscall)operator(,) string<delimiter(")content(issetugid)delimiter(")>operator(,) ident(p_sys_issetugid)operator(,) integer(0)operator(\);) +operator(}) +comment(/********************************************************************** + + random.c - + + $Author: shyouhei $ + $Date: 2009-01-17 04:15:36 +0100 (Sat, 17 Jan 2009\) $ + created at: Fri Dec 24 16:39:21 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +comment(/* +This is based on trimmed version of MT19937. To get the original version, +contact <http://www.math.keio.ac.jp/~matumoto/emt.html>. + +The original copyright notice follows. + + A C-program for MT19937, with initialization improved 2002/2/10. + Coded by Takuji Nishimura and Makoto Matsumoto. + This is a faster version by taking Shawn Cokus's optimization, + Matthe Bellew's simplification, Isaku Wada's real version. + + Before using, initialize the state by using init_genrand(seed\) + or init_by_array(init_key, key_length\). + + Copyright (C\) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION\) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE\) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Any feedback is very welcome. + http://www.math.keio.ac.jp/matumoto/emt.html + email: matumoto@math.keio.ac.jp +*/) + +comment(/* Period parameters */) +preprocessor(#define) ident(N) integer(624) +preprocessor(#define) ident(M) integer(397) +preprocessor(#define) ident(MATRIX_A) hex(0x9908b0df)ident(UL) comment(/* constant vector a */) +preprocessor(#define) ident(UMASK) hex(0x80000000)ident(UL) comment(/* most significant w-r bits */) +preprocessor(#define) ident(LMASK) hex(0x7fffffff)ident(UL) comment(/* least significant r bits */) +preprocessor(#define) ident(MIXBITS)operator(()ident(u)operator(,)ident(v)operator(\)) operator(() operator((()ident(u)operator(\)) operator(&) ident(UMASK)operator(\)) operator(|) operator((()ident(v)operator(\)) operator(&) ident(LMASK)operator(\)) operator(\)) +preprocessor(#define) ident(TWIST)operator(()ident(u)operator(,)ident(v)operator(\)) operator((()ident(MIXBITS)operator(()ident(u)operator(,)ident(v)operator(\)) operator(>>) integer(1)operator(\)) operator(^) operator((()ident(v)operator(\)&)integer(1)ident(UL) operator(?) ident(MATRIX_A) operator(:) integer(0)ident(UL)operator(\)\)) + +directive(static) pre_type(unsigned) pre_type(long) ident(state)operator([)ident(N)operator(];) comment(/* the array for the state vector */) +directive(static) pre_type(int) ident(left) operator(=) integer(1)operator(;) +directive(static) pre_type(int) ident(initf) operator(=) integer(0)operator(;) +directive(static) pre_type(unsigned) pre_type(long) operator(*)ident(next)operator(;) + +comment(/* initializes state[N] with a seed */) +directive(static) directive(void) +ident(init_genrand)operator(()ident(s)operator(\)) + pre_type(unsigned) pre_type(long) ident(s)operator(;) +operator({) + pre_type(int) ident(j)operator(;) + ident(state)operator([)integer(0)operator(]=) ident(s) operator(&) hex(0xffffffff)ident(UL)operator(;) + reserved(for) operator(()ident(j)operator(=)integer(1)operator(;) ident(j)operator(<)ident(N)operator(;) ident(j)operator(++\)) operator({) + ident(state)operator([)ident(j)operator(]) operator(=) operator(()integer(1812433253)ident(UL) operator(*) operator(()ident(state)operator([)ident(j)operator(-)integer(1)operator(]) operator(^) operator(()ident(state)operator([)ident(j)operator(-)integer(1)operator(]) operator(>>) integer(30)operator(\)\)) operator(+) ident(j)operator(\);) + comment(/* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */) + comment(/* In the previous versions, MSBs of the seed affect */) + comment(/* only MSBs of the array state[]. */) + comment(/* 2002/01/09 modified by Makoto Matsumoto */) + ident(state)operator([)ident(j)operator(]) operator(&=) hex(0xffffffff)ident(UL)operator(;) comment(/* for >32 bit machines */) + operator(}) + ident(left) operator(=) integer(1)operator(;) ident(initf) operator(=) integer(1)operator(;) +operator(}) + +comment(/* initialize by an array with array-length */) +comment(/* init_key is the array for initializing keys */) +comment(/* key_length is its length */) +comment(/* slight change for C++, 2004/2/26 */) +directive(static) directive(void) +ident(init_by_array)operator(()pre_type(unsigned) pre_type(long) ident(init_key)operator([],) pre_type(int) ident(key_length)operator(\)) +operator({) + pre_type(int) ident(i)operator(,) ident(j)operator(,) ident(k)operator(;) + ident(init_genrand)operator(()integer(19650218)ident(UL)operator(\);) + ident(i)operator(=)integer(1)operator(;) ident(j)operator(=)integer(0)operator(;) + ident(k) operator(=) operator(()ident(N)operator(>)ident(key_length) operator(?) ident(N) operator(:) ident(key_length)operator(\);) + reserved(for) operator((;) ident(k)operator(;) ident(k)operator(--\)) operator({) + ident(state)operator([)ident(i)operator(]) operator(=) operator(()ident(state)operator([)ident(i)operator(]) operator(^) operator((()ident(state)operator([)ident(i)operator(-)integer(1)operator(]) operator(^) operator(()ident(state)operator([)ident(i)operator(-)integer(1)operator(]) operator(>>) integer(30)operator(\)\)) operator(*) integer(1664525)ident(UL)operator(\)\)) + operator(+) ident(init_key)operator([)ident(j)operator(]) operator(+) ident(j)operator(;) comment(/* non linear */) + ident(state)operator([)ident(i)operator(]) operator(&=) hex(0xffffffff)ident(UL)operator(;) comment(/* for WORDSIZE > 32 machines */) + ident(i)operator(++;) ident(j)operator(++;) + reserved(if) operator(()ident(i)operator(>=)ident(N)operator(\)) operator({) ident(state)operator([)integer(0)operator(]) operator(=) ident(state)operator([)ident(N)operator(-)integer(1)operator(];) ident(i)operator(=)integer(1)operator(;) operator(}) + reserved(if) operator(()ident(j)operator(>=)ident(key_length)operator(\)) ident(j)operator(=)integer(0)operator(;) + operator(}) + reserved(for) operator(()ident(k)operator(=)ident(N)operator(-)integer(1)operator(;) ident(k)operator(;) ident(k)operator(--\)) operator({) + ident(state)operator([)ident(i)operator(]) operator(=) operator(()ident(state)operator([)ident(i)operator(]) operator(^) operator((()ident(state)operator([)ident(i)operator(-)integer(1)operator(]) operator(^) operator(()ident(state)operator([)ident(i)operator(-)integer(1)operator(]) operator(>>) integer(30)operator(\)\)) operator(*) integer(1566083941)ident(UL)operator(\)\)) + operator(-) ident(i)operator(;) comment(/* non linear */) + ident(state)operator([)ident(i)operator(]) operator(&=) hex(0xffffffff)ident(UL)operator(;) comment(/* for WORDSIZE > 32 machines */) + ident(i)operator(++;) + reserved(if) operator(()ident(i)operator(>=)ident(N)operator(\)) operator({) ident(state)operator([)integer(0)operator(]) operator(=) ident(state)operator([)ident(N)operator(-)integer(1)operator(];) ident(i)operator(=)integer(1)operator(;) operator(}) + operator(}) + + ident(state)operator([)integer(0)operator(]) operator(=) hex(0x80000000)ident(UL)operator(;) comment(/* MSB is 1; assuring non-zero initial array */) + ident(left) operator(=) integer(1)operator(;) ident(initf) operator(=) integer(1)operator(;) +operator(}) + +directive(static) directive(void) +ident(next_state)operator((\)) +operator({) + pre_type(unsigned) pre_type(long) operator(*)ident(p)operator(=)ident(state)operator(;) + pre_type(int) ident(j)operator(;) + + comment(/* if init_genrand(\) has not been called, */) + comment(/* a default initial seed is used */) + reserved(if) operator(()ident(initf)operator(==)integer(0)operator(\)) ident(init_genrand)operator(()integer(5489)ident(UL)operator(\);) + + ident(left) operator(=) ident(N)operator(;) + ident(next) operator(=) ident(state)operator(;) + + reserved(for) operator(()ident(j)operator(=)ident(N)operator(-)ident(M)operator(+)integer(1)operator(;) operator(--)ident(j)operator(;) ident(p)operator(++\)) + operator(*)ident(p) operator(=) ident(p)operator([)ident(M)operator(]) operator(^) ident(TWIST)operator(()ident(p)operator([)integer(0)operator(],) ident(p)operator([)integer(1)operator(]\);) + + reserved(for) operator(()ident(j)operator(=)ident(M)operator(;) operator(--)ident(j)operator(;) ident(p)operator(++\)) + operator(*)ident(p) operator(=) ident(p)operator([)ident(M)operator(-)ident(N)operator(]) operator(^) ident(TWIST)operator(()ident(p)operator([)integer(0)operator(],) ident(p)operator([)integer(1)operator(]\);) + + operator(*)ident(p) operator(=) ident(p)operator([)ident(M)operator(-)ident(N)operator(]) operator(^) ident(TWIST)operator(()ident(p)operator([)integer(0)operator(],) ident(state)operator([)integer(0)operator(]\);) +operator(}) + +comment(/* generates a random number on [0,0xffffffff]-interval */) +directive(static) pre_type(unsigned) pre_type(long) +ident(genrand_int32)operator(()directive(void)operator(\)) +operator({) + pre_type(unsigned) pre_type(long) ident(y)operator(;) + + reserved(if) operator((--)ident(left) operator(==) integer(0)operator(\)) ident(next_state)operator((\);) + ident(y) operator(=) operator(*)ident(next)operator(++;) + + comment(/* Tempering */) + ident(y) operator(^=) operator(()ident(y) operator(>>) integer(11)operator(\);) + ident(y) operator(^=) operator(()ident(y) operator(<<) integer(7)operator(\)) operator(&) hex(0x9d2c5680)ident(UL)operator(;) + ident(y) operator(^=) operator(()ident(y) operator(<<) integer(15)operator(\)) operator(&) hex(0xefc60000)ident(UL)operator(;) + ident(y) operator(^=) operator(()ident(y) operator(>>) integer(18)operator(\);) + + reserved(return) ident(y)operator(;) +operator(}) + +comment(/* generates a random number on [0,1\) with 53-bit resolution*/) +directive(static) pre_type(double) +ident(genrand_real)operator(()directive(void)operator(\)) +operator({) + pre_type(unsigned) pre_type(long) ident(a)operator(=)ident(genrand_int32)operator((\)>>)integer(5)operator(,) ident(b)operator(=)ident(genrand_int32)operator((\)>>)integer(6)operator(;) + reserved(return)operator(()ident(a)operator(*)integer(6710886)float(4)float(.0)operator(+)ident(b)operator(\)*()float(1)float(.0)operator(/)integer(900719925474099)float(2)float(.0)operator(\);) +operator(}) +comment(/* These real versions are due to Isaku Wada, 2002/01/09 added */) + +preprocessor(#undef) ident(N) +preprocessor(#undef) ident(M) + +comment(/* These real versions are due to Isaku Wada, 2002/01/09 added */) + +preprocessor(#include) include("ruby.h") + +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) +preprocessor(#include) include(<time.h>) +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<sys/stat.h>) +preprocessor(#ifdef) ident(HAVE_FCNTL_H) +preprocessor(#include) include(<fcntl.h>) +preprocessor(#endif) + +directive(static) ident(VALUE) ident(saved_seed) operator(=) ident(INT2FIX)operator(()integer(0)operator(\);) + +directive(static) ident(VALUE) +ident(rand_init)operator(()ident(vseed)operator(\)) + ident(VALUE) ident(vseed)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(seed)operator(;) + ident(VALUE) ident(old)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(unsigned) pre_type(long) operator(*)ident(buf)operator(;) + + ident(seed) operator(=) ident(rb_to_int)operator(()ident(vseed)operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(seed)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(len) operator(=) reserved(sizeof)operator(()ident(VALUE)operator(\);) + reserved(break)operator(;) + reserved(case) label(T_BIGNUM)operator(:) + ident(len) operator(=) ident(RBIGNUM)operator(()ident(seed)operator(\)->)ident(len) operator(*) ident(SIZEOF_BDIGITS)operator(;) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) + ident(len) operator(=) integer(4)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(failed to convert %s into Integer)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(vseed)operator(\)\);) + operator(}) + ident(len) operator(=) operator(()ident(len) operator(+) integer(3)operator(\)) operator(/) integer(4)operator(;) comment(/* number of 32bit words */) + ident(buf) operator(=) ident(ALLOC_N)operator(()pre_type(unsigned) pre_type(long)operator(,) ident(len)operator(\);) comment(/* allocate longs for init_by_array */) + ident(memset)operator(()ident(buf)operator(,) integer(0)operator(,) ident(len) operator(*) reserved(sizeof)operator(()pre_type(long)operator(\)\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(seed)operator(\)\)) operator({) + ident(buf)operator([)integer(0)operator(]) operator(=) ident(FIX2ULONG)operator(()ident(seed)operator(\)) operator(&) hex(0xffffffff)operator(;) +preprocessor(#if) ident(SIZEOF_LONG) operator(>) integer(4) + ident(buf)operator([)integer(1)operator(]) operator(=) ident(FIX2ULONG)operator(()ident(seed)operator(\)) operator(>>) integer(32)operator(;) +preprocessor(#endif) + operator(}) + reserved(else) operator({) + pre_type(int) ident(i)operator(,) ident(j)operator(;) + reserved(for) operator(()ident(i) operator(=) ident(RBIGNUM)operator(()ident(seed)operator(\)->)ident(len)operator(-)integer(1)operator(;) integer(0) operator(<=) ident(i)operator(;) ident(i)operator(--\)) operator({) + ident(j) operator(=) ident(i) operator(*) ident(SIZEOF_BDIGITS) operator(/) integer(4)operator(;) +preprocessor(#if) ident(SIZEOF_BDIGITS) operator(<) integer(4) + ident(buf)operator([)ident(j)operator(]) operator(<<=) ident(SIZEOF_BDIGITS) operator(*) integer(8)operator(;) +preprocessor(#endif) + ident(buf)operator([)ident(j)operator(]) operator(|=) operator((()ident(BDIGIT) operator(*\))ident(RBIGNUM)operator(()ident(seed)operator(\)->)ident(digits)operator(\)[)ident(i)operator(];) + operator(}) + operator(}) + reserved(while) operator(()integer(1) operator(<) ident(len) operator(&&) ident(buf)operator([)ident(len)operator(-)integer(1)operator(]) operator(==) integer(0)operator(\)) operator({) + ident(len)operator(--;) + operator(}) + reserved(if) operator(()ident(len) operator(<=) integer(1)operator(\)) operator({) + ident(init_genrand)operator(()ident(buf)operator([)integer(0)operator(]\);) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(buf)operator([)ident(len)operator(-)integer(1)operator(]) operator(==) integer(1)operator(\)) comment(/* remove leading-zero-guard */) + ident(len)operator(--;) + ident(init_by_array)operator(()ident(buf)operator(,) ident(len)operator(\);) + operator(}) + ident(old) operator(=) ident(saved_seed)operator(;) + ident(saved_seed) operator(=) ident(seed)operator(;) + ident(free)operator(()ident(buf)operator(\);) + reserved(return) ident(old)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(random_seed)operator((\)) +operator({) + directive(static) pre_type(int) ident(n) operator(=) integer(0)operator(;) + reserved(struct) ident(timeval) ident(tv)operator(;) + pre_type(int) ident(fd)operator(;) + reserved(struct) ident(stat) ident(statbuf)operator(;) + + pre_type(int) ident(seed_len)operator(;) + ident(BDIGIT) operator(*)ident(digits)operator(;) + pre_type(unsigned) pre_type(long) operator(*)ident(seed)operator(;) + ident(NEWOBJ)operator(()ident(big)operator(,) reserved(struct) ident(RBignum)operator(\);) + ident(OBJSETUP)operator(()ident(big)operator(,) ident(rb_cBignum)operator(,) ident(T_BIGNUM)operator(\);) + + ident(seed_len) operator(=) integer(4) operator(*) reserved(sizeof)operator(()pre_type(long)operator(\);) + ident(big)operator(->)ident(sign) operator(=) integer(1)operator(;) + ident(big)operator(->)ident(len) operator(=) ident(seed_len) operator(/) ident(SIZEOF_BDIGITS) operator(+) integer(1)operator(;) + ident(digits) operator(=) ident(big)operator(->)ident(digits) operator(=) ident(ALLOC_N)operator(()ident(BDIGIT)operator(,) ident(big)operator(->)ident(len)operator(\);) + ident(seed) operator(=) operator(()pre_type(unsigned) pre_type(long) operator(*\))ident(big)operator(->)ident(digits)operator(;) + + ident(memset)operator(()ident(digits)operator(,) integer(0)operator(,) ident(big)operator(->)ident(len) operator(*) ident(SIZEOF_BDIGITS)operator(\);) + +preprocessor(#ifdef) ident(S_ISCHR) + reserved(if) operator((()ident(fd) operator(=) ident(open)operator(()string<delimiter(")content(/dev/urandom)delimiter(")>operator(,) ident(O_RDONLY) +preprocessor(#ifdef) ident(O_NONBLOCK) + operator(|)ident(O_NONBLOCK) +preprocessor(#endif) +preprocessor(#ifdef) ident(O_NOCTTY) + operator(|)ident(O_NOCTTY) +preprocessor(#endif) +preprocessor(#ifdef) ident(O_NOFOLLOW) + operator(|)ident(O_NOFOLLOW) +preprocessor(#endif) + operator(\)\)) operator(>=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(fstat)operator(()ident(fd)operator(,) operator(&)ident(statbuf)operator(\)) operator(==) integer(0) operator(&&) ident(S_ISCHR)operator(()ident(statbuf)operator(.)ident(st_mode)operator(\)\)) operator({) + ident(read)operator(()ident(fd)operator(,) ident(seed)operator(,) ident(seed_len)operator(\);) + operator(}) + ident(close)operator(()ident(fd)operator(\);) + operator(}) +preprocessor(#endif) + + ident(gettimeofday)operator((&)ident(tv)operator(,) integer(0)operator(\);) + ident(seed)operator([)integer(0)operator(]) operator(^=) ident(tv)operator(.)ident(tv_usec)operator(;) + ident(seed)operator([)integer(1)operator(]) operator(^=) ident(tv)operator(.)ident(tv_sec)operator(;) + ident(seed)operator([)integer(2)operator(]) operator(^=) ident(getpid)operator((\)) operator(^) operator(()ident(n)operator(++) operator(<<) integer(16)operator(\);) + ident(seed)operator([)integer(3)operator(]) operator(^=) operator(()pre_type(unsigned) pre_type(long)operator(\)&)ident(seed)operator(;) + + comment(/* set leading-zero-guard if need. */) + ident(digits)operator([)ident(big)operator(->)ident(len)operator(-)integer(1)operator(]) operator(=) ident(digits)operator([)ident(big)operator(->)ident(len)operator(-)integer(2)operator(]) operator(<=) integer(1) operator(?) integer(1) operator(:) integer(0)operator(;) + + reserved(return) ident(rb_big_norm)operator((()ident(VALUE)operator(\))ident(big)operator(\);) +operator(}) + +comment(/* + * call-seq: + * srand(number=0\) => old_seed + * + * Seeds the pseudorandom number generator to the value of + * <i>number</i>.<code>to_i.abs</code>. If <i>number</i> is omitted, + * seeds the generator using a combination of the time, the + * process id, and a sequence number. (This is also the behavior if + * <code>Kernel::rand</code> is called without previously calling + * <code>srand</code>, but without the sequence.\) By setting the seed + * to a known value, scripts can be made deterministic during testing. + * The previous seed value is returned. Also see <code>Kernel::rand</code>. + */) + +directive(static) ident(VALUE) +ident(rb_f_srand)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(seed)operator(,) ident(old)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(seed)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(seed) operator(=) ident(random_seed)operator((\);) + operator(}) + ident(old) operator(=) ident(rand_init)operator(()ident(seed)operator(\);) + + reserved(return) ident(old)operator(;) +operator(}) + +directive(static) pre_type(unsigned) pre_type(long) +ident(make_mask)operator(()pre_type(unsigned) pre_type(long) ident(x)operator(\)) +operator({) + ident(x) operator(=) ident(x) operator(|) ident(x) operator(>>) integer(1)operator(;) + ident(x) operator(=) ident(x) operator(|) ident(x) operator(>>) integer(2)operator(;) + ident(x) operator(=) ident(x) operator(|) ident(x) operator(>>) integer(4)operator(;) + ident(x) operator(=) ident(x) operator(|) ident(x) operator(>>) integer(8)operator(;) + ident(x) operator(=) ident(x) operator(|) ident(x) operator(>>) integer(16)operator(;) +preprocessor(#if) integer(4) operator(<) ident(SIZEOF_LONG) + ident(x) operator(=) ident(x) operator(|) ident(x) operator(>>) integer(32)operator(;) +preprocessor(#endif) + reserved(return) ident(x)operator(;) +operator(}) + +directive(static) pre_type(unsigned) pre_type(long) +ident(limited_rand)operator(()pre_type(unsigned) pre_type(long) ident(limit)operator(\)) +operator({) + pre_type(unsigned) pre_type(long) ident(mask) operator(=) ident(make_mask)operator(()ident(limit)operator(\);) + pre_type(int) ident(i)operator(;) + pre_type(unsigned) pre_type(long) ident(val)operator(;) + + label(retry)operator(:) + ident(val) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(i) operator(=) ident(SIZEOF_LONG)operator(/)integer(4)operator(-)integer(1)operator(;) integer(0) operator(<=) ident(i)operator(;) ident(i)operator(--\)) operator({) + reserved(if) operator(()ident(mask) operator(>>) operator(()ident(i) operator(*) integer(32)operator(\)\)) operator({) + ident(val) operator(|=) ident(genrand_int32)operator((\)) operator(<<) operator(()ident(i) operator(*) integer(32)operator(\);) + ident(val) operator(&=) ident(mask)operator(;) + reserved(if) operator(()ident(limit) operator(<) ident(val)operator(\)) + reserved(goto) ident(retry)operator(;) + operator(}) + operator(}) + reserved(return) ident(val)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(limited_big_rand)operator(()reserved(struct) ident(RBignum) operator(*)ident(limit)operator(\)) +operator({) + pre_type(unsigned) pre_type(long) ident(mask)operator(,) ident(lim)operator(,) ident(rnd)operator(;) + reserved(struct) ident(RBignum) operator(*)ident(val)operator(;) + pre_type(int) ident(i)operator(,) ident(len)operator(,) ident(boundary)operator(;) + + ident(len) operator(=) operator(()ident(limit)operator(->)ident(len) operator(*) ident(SIZEOF_BDIGITS) operator(+) integer(3)operator(\)) operator(/) integer(4)operator(;) + ident(val) operator(=) operator(()reserved(struct) ident(RBignum) operator(*\))ident(rb_big_clone)operator((()ident(VALUE)operator(\))ident(limit)operator(\);) + ident(val)operator(->)ident(sign) operator(=) integer(1)operator(;) +preprocessor(#if) ident(SIZEOF_BDIGITS) operator(==) integer(2) +preprocessor(# define) ident(BIG_GET32)operator(()ident(big)operator(,)ident(i)operator(\)) operator(((()ident(BDIGIT) operator(*\)()ident(big)operator(\)->)ident(digits)operator(\)[()ident(i)operator(\)*)integer(2)operator(]) operator(|) \ + operator((()ident(i)operator(\)*)integer(2)operator(+)integer(1) operator(<) operator(()ident(big)operator(\)->)ident(len) operator(?) operator(((()ident(BDIGIT) operator(*\)()ident(big)operator(\)->)ident(digits)operator(\)[()ident(i)operator(\)*)integer(2)operator(+)integer(1)operator(]) operator(<<) integer(16)operator(\)) \ + operator(:) integer(0)operator(\)\)) +preprocessor(# define) ident(BIG_SET32)operator(()ident(big)operator(,)ident(i)operator(,)ident(d)operator(\)) operator((((()ident(BDIGIT) operator(*\)()ident(big)operator(\)->)ident(digits)operator(\)[()ident(i)operator(\)*)integer(2)operator(]) operator(=) operator(()ident(d)operator(\)) operator(&) hex(0xffff)operator(\),) \ + operator((()ident(i)operator(\)*)integer(2)operator(+)integer(1) operator(<) operator(()ident(big)operator(\)->)ident(len) operator(?) operator(((()ident(BDIGIT) operator(*\)()ident(big)operator(\)->)ident(digits)operator(\)[()ident(i)operator(\)*)integer(2)operator(+)integer(1)operator(]) operator(=) operator(()ident(d)operator(\)) operator(>>) integer(16)operator(\)) \ + operator(:) integer(0)operator(\)\)) +preprocessor(#else) + comment(/* SIZEOF_BDIGITS == 4 */) +preprocessor(# define) ident(BIG_GET32)operator(()ident(big)operator(,)ident(i)operator(\)) operator(((()ident(BDIGIT) operator(*\)()ident(big)operator(\)->)ident(digits)operator(\)[)ident(i)operator(]\)) +preprocessor(# define) ident(BIG_SET32)operator(()ident(big)operator(,)ident(i)operator(,)ident(d)operator(\)) operator(((()ident(BDIGIT) operator(*\)()ident(big)operator(\)->)ident(digits)operator(\)[)ident(i)operator(]) operator(=) operator(()ident(d)operator(\)\)) +preprocessor(#endif) + label(retry)operator(:) + ident(mask) operator(=) integer(0)operator(;) + ident(boundary) operator(=) integer(1)operator(;) + reserved(for) operator(()ident(i) operator(=) ident(len)operator(-)integer(1)operator(;) integer(0) operator(<=) ident(i)operator(;) ident(i)operator(--\)) operator({) + ident(lim) operator(=) ident(BIG_GET32)operator(()ident(limit)operator(,) ident(i)operator(\);) + ident(mask) operator(=) ident(mask) operator(?) hex(0xffffffff) operator(:) ident(make_mask)operator(()ident(lim)operator(\);) + reserved(if) operator(()ident(mask)operator(\)) operator({) + ident(rnd) operator(=) ident(genrand_int32)operator((\)) operator(&) ident(mask)operator(;) + reserved(if) operator(()ident(boundary)operator(\)) operator({) + reserved(if) operator(()ident(lim) operator(<) ident(rnd)operator(\)) + reserved(goto) ident(retry)operator(;) + reserved(if) operator(()ident(rnd) operator(<) ident(lim)operator(\)) + ident(boundary) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(rnd) operator(=) integer(0)operator(;) + operator(}) + ident(BIG_SET32)operator(()ident(val)operator(,) ident(i)operator(,) ident(rnd)operator(\);) + operator(}) + reserved(return) ident(rb_big_norm)operator((()ident(VALUE)operator(\))ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * rand(max=0\) => number + * + * Converts <i>max</i> to an integer using max1 = + * max<code>.to_i.abs</code>. If the result is zero, returns a + * pseudorandom floating point number greater than or equal to 0.0 and + * less than 1.0. Otherwise, returns a pseudorandom integer greater + * than or equal to zero and less than max1. <code>Kernel::srand</code> + * may be used to ensure repeatable sequences of random numbers between + * different runs of the program. Ruby currently uses a modified + * Mersenne Twister with a period of 2**19937-1. + * + * srand 1234 #=> 0 + * [ rand, rand ] #=> [0.191519450163469, 0.49766366626136] + * [ rand(10\), rand(1000\) ] #=> [6, 817] + * srand 1234 #=> 1234 + * [ rand, rand ] #=> [0.191519450163469, 0.49766366626136] + */) + +directive(static) ident(VALUE) +ident(rb_f_rand)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(obj)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(vmax)operator(;) + pre_type(long) ident(val)operator(,) ident(max)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(vmax)operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(vmax)operator(\)\)) operator({) + reserved(case) label(T_FLOAT)operator(:) + reserved(if) operator(()ident(RFLOAT)operator(()ident(vmax)operator(\)->)ident(value) operator(<=) ident(LONG_MAX) operator(&&) ident(RFLOAT)operator(()ident(vmax)operator(\)->)ident(value) operator(>=) ident(LONG_MIN)operator(\)) operator({) + ident(max) operator(=) operator(()pre_type(long)operator(\))ident(RFLOAT)operator(()ident(vmax)operator(\)->)ident(value)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(RFLOAT)operator(()ident(vmax)operator(\)->)ident(value) operator(<) integer(0)operator(\)) + ident(vmax) operator(=) ident(rb_dbl2big)operator((-)ident(RFLOAT)operator(()ident(vmax)operator(\)->)ident(value)operator(\);) + reserved(else) + ident(vmax) operator(=) ident(rb_dbl2big)operator(()ident(RFLOAT)operator(()ident(vmax)operator(\)->)ident(value)operator(\);) + comment(/* fall through */) + reserved(case) label(T_BIGNUM)operator(:) + label(bignum)operator(:) + operator({) + reserved(struct) ident(RBignum) operator(*)ident(limit) operator(=) operator(()reserved(struct) ident(RBignum) operator(*\))ident(vmax)operator(;) + reserved(if) operator((!)ident(limit)operator(->)ident(sign)operator(\)) operator({) + ident(limit) operator(=) operator(()reserved(struct) ident(RBignum) operator(*\))ident(rb_big_clone)operator(()ident(vmax)operator(\);) + ident(limit)operator(->)ident(sign) operator(=) integer(1)operator(;) + operator(}) + ident(limit) operator(=) operator(()reserved(struct) ident(RBignum) operator(*\))ident(rb_big_minus)operator((()ident(VALUE)operator(\))ident(limit)operator(,) ident(INT2FIX)operator(()integer(1)operator(\)\);) + reserved(if) operator(()ident(FIXNUM_P)operator((()ident(VALUE)operator(\))ident(limit)operator(\)\)) operator({) + reserved(if) operator(()ident(FIX2LONG)operator((()ident(VALUE)operator(\))ident(limit)operator(\)) operator(==) operator(-)integer(1)operator(\)) + reserved(return) ident(rb_float_new)operator(()ident(genrand_real)operator((\)\);) + reserved(return) ident(LONG2NUM)operator(()ident(limited_rand)operator(()ident(FIX2LONG)operator((()ident(VALUE)operator(\))ident(limit)operator(\)\)\);) + operator(}) + reserved(return) ident(limited_big_rand)operator(()ident(limit)operator(\);) + operator(}) + reserved(case) label(T_NIL)operator(:) + ident(max) operator(=) integer(0)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(vmax) operator(=) ident(rb_Integer)operator(()ident(vmax)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(vmax)operator(\)) operator(==) ident(T_BIGNUM)operator(\)) reserved(goto) ident(bignum)operator(;) + comment(/* fall through */) + reserved(case) label(T_FIXNUM)operator(:) + ident(max) operator(=) ident(FIX2LONG)operator(()ident(vmax)operator(\);) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(max) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(rb_float_new)operator(()ident(genrand_real)operator((\)\);) + operator(}) + reserved(if) operator(()ident(max) operator(<) integer(0)operator(\)) ident(max) operator(=) operator(-)ident(max)operator(;) + ident(val) operator(=) ident(limited_rand)operator(()ident(max)operator(-)integer(1)operator(\);) + reserved(return) ident(LONG2NUM)operator(()ident(val)operator(\);) +operator(}) + +directive(void) +ident(Init_Random)operator((\)) +operator({) + ident(rand_init)operator(()ident(random_seed)operator((\)\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(srand)delimiter(")>operator(,) ident(rb_f_srand)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(rand)delimiter(")>operator(,) ident(rb_f_rand)operator(,) operator(-)integer(1)operator(\);) + ident(rb_global_variable)operator((&)ident(saved_seed)operator(\);) +operator(}) +comment(/********************************************************************** + + range.c - + + $Author: shyouhei $ + $Date: 2007-09-16 21:38:27 +0200 (Sun, 16 Sep 2007\) $ + created at: Thu Aug 19 17:46:47 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") + +ident(VALUE) ident(rb_cRange)operator(;) +directive(static) ident(ID) ident(id_cmp)operator(,) ident(id_succ)operator(,) ident(id_beg)operator(,) ident(id_end)operator(,) ident(id_excl)operator(;) + +preprocessor(#define) ident(EXCL)operator(()ident(r)operator(\)) ident(RTEST)operator(()ident(rb_ivar_get)operator((()ident(r)operator(\),) ident(id_excl)operator(\)\)) +preprocessor(#define) ident(SET_EXCL)operator(()ident(r)operator(,)ident(v)operator(\)) ident(rb_ivar_set)operator((()ident(r)operator(\),) ident(id_excl)operator(,) operator(()ident(v)operator(\)) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(\)) + +directive(static) ident(VALUE) +ident(range_failed)operator((\)) +operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad value for range)delimiter(")>operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* dummy */) +operator(}) + +directive(static) ident(VALUE) +ident(range_check)operator(()ident(args)operator(\)) + ident(VALUE) operator(*)ident(args)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(args)operator([)integer(0)operator(],) ident(id_cmp)operator(,) integer(1)operator(,) ident(args)operator([)integer(1)operator(]\);) +operator(}) + +directive(static) directive(void) +ident(range_init)operator(()ident(range)operator(,) ident(beg)operator(,) ident(end)operator(,) ident(exclude_end)operator(\)) + ident(VALUE) ident(range)operator(,) ident(beg)operator(,) ident(end)operator(;) + pre_type(int) ident(exclude_end)operator(;) +operator({) + ident(VALUE) ident(args)operator([)integer(2)operator(];) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(beg)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(end)operator(;) + + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(beg)operator(\)) operator(||) operator(!)ident(FIXNUM_P)operator(()ident(end)operator(\)\)) operator({) + ident(VALUE) ident(v)operator(;) + + ident(v) operator(=) ident(rb_rescue)operator(()ident(range_check)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(,) ident(range_failed)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(v)operator(\)\)) ident(range_failed)operator((\);) + operator(}) + + ident(SET_EXCL)operator(()ident(range)operator(,) ident(exclude_end)operator(\);) + ident(rb_ivar_set)operator(()ident(range)operator(,) ident(id_beg)operator(,) ident(beg)operator(\);) + ident(rb_ivar_set)operator(()ident(range)operator(,) ident(id_end)operator(,) ident(end)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_range_new)operator(()ident(beg)operator(,) ident(end)operator(,) ident(exclude_end)operator(\)) + ident(VALUE) ident(beg)operator(,) ident(end)operator(;) + pre_type(int) ident(exclude_end)operator(;) +operator({) + ident(VALUE) ident(range) operator(=) ident(rb_obj_alloc)operator(()ident(rb_cRange)operator(\);) + + ident(range_init)operator(()ident(range)operator(,) ident(beg)operator(,) ident(end)operator(,) ident(exclude_end)operator(\);) + reserved(return) ident(range)operator(;) +operator(}) + +comment(/* + * call-seq: + * Range.new(start, end, exclusive=false\) => range + * + * Constructs a range using the given <i>start</i> and <i>end</i>. If the third + * parameter is omitted or is <code>false</code>, the <i>range</i> will include + * the end object; otherwise, it will be excluded. + */) + +directive(static) ident(VALUE) +ident(range_initialize)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(range)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(range)operator(;) +operator({) + ident(VALUE) ident(beg)operator(,) ident(end)operator(,) ident(flags)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(21)delimiter(")>operator(,) operator(&)ident(beg)operator(,) operator(&)ident(end)operator(,) operator(&)ident(flags)operator(\);) + comment(/* Ranges are immutable, so that they should be initialized only once. */) + reserved(if) operator(()ident(rb_ivar_defined)operator(()ident(range)operator(,) ident(id_beg)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(rb_intern)operator(()string<delimiter(")content(initialize)delimiter(")>operator(\),) string<delimiter(")content(`initialize' called twice)delimiter(")>operator(\);) + operator(}) + ident(range_init)operator(()ident(range)operator(,) ident(beg)operator(,) ident(end)operator(,) ident(RTEST)operator(()ident(flags)operator(\)\);) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * rng.exclude_end? => true or false + * + * Returns <code>true</code> if <i>rng</i> excludes its end value. + */) + +directive(static) ident(VALUE) +ident(range_exclude_end_p)operator(()ident(range)operator(\)) + ident(VALUE) ident(range)operator(;) +operator({) + reserved(return) ident(EXCL)operator(()ident(range)operator(\)) operator(?) ident(Qtrue) operator(:) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * rng == obj => true or false + * + * Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent + * beginning and end items (by comparing them with <code>==</code>\), and has + * the same #exclude_end? setting as <i>rng</t>. + * + * (0..2\) == (0..2\) #=> true + * (0..2\) == Range.new(0,2\) #=> true + * (0..2\) == (0...2\) #=> false + * + */) + +directive(static) ident(VALUE) +ident(range_eq)operator(()ident(range)operator(,) ident(obj)operator(\)) + ident(VALUE) ident(range)operator(,) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(range) operator(==) ident(obj)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator((!)ident(rb_obj_is_instance_of)operator(()ident(obj)operator(,) ident(rb_obj_class)operator(()ident(range)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + + reserved(if) operator((!)ident(rb_equal)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\),) ident(rb_ivar_get)operator(()ident(obj)operator(,) ident(id_beg)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + reserved(if) operator((!)ident(rb_equal)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\),) ident(rb_ivar_get)operator(()ident(obj)operator(,) ident(id_end)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(EXCL)operator(()ident(range)operator(\)) operator(!=) ident(EXCL)operator(()ident(obj)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + + reserved(return) ident(Qtrue)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(r_lt)operator(()ident(a)operator(,) ident(b)operator(\)) + ident(VALUE) ident(a)operator(,) ident(b)operator(;) +operator({) + ident(VALUE) ident(r) operator(=) ident(rb_funcall)operator(()ident(a)operator(,) ident(id_cmp)operator(,) integer(1)operator(,) ident(b)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(r)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(rb_cmpint)operator(()ident(r)operator(,) ident(a)operator(,) ident(b)operator(\)) operator(<) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(r_le)operator(()ident(a)operator(,) ident(b)operator(\)) + ident(VALUE) ident(a)operator(,) ident(b)operator(;) +operator({) + pre_type(int) ident(c)operator(;) + ident(VALUE) ident(r) operator(=) ident(rb_funcall)operator(()ident(a)operator(,) ident(id_cmp)operator(,) integer(1)operator(,) ident(b)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(r)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + ident(c) operator(=) ident(rb_cmpint)operator(()ident(r)operator(,) ident(a)operator(,) ident(b)operator(\);) + reserved(if) operator(()ident(c) operator(==) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(c) operator(<) integer(0)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * rng.eql?(obj\) => true or false + * + * Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent + * beginning and end items (by comparing them with #eql?\), and has the same + * #exclude_end? setting as <i>rng</i>. + * + * (0..2\) == (0..2\) #=> true + * (0..2\) == Range.new(0,2\) #=> true + * (0..2\) == (0...2\) #=> false + * + */) + +directive(static) ident(VALUE) +ident(range_eql)operator(()ident(range)operator(,) ident(obj)operator(\)) + ident(VALUE) ident(range)operator(,) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(range) operator(==) ident(obj)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator((!)ident(rb_obj_is_instance_of)operator(()ident(obj)operator(,) ident(rb_obj_class)operator(()ident(range)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + + reserved(if) operator((!)ident(rb_eql)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\),) ident(rb_ivar_get)operator(()ident(obj)operator(,) ident(id_beg)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + reserved(if) operator((!)ident(rb_eql)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\),) ident(rb_ivar_get)operator(()ident(obj)operator(,) ident(id_end)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(EXCL)operator(()ident(range)operator(\)) operator(!=) ident(EXCL)operator(()ident(obj)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * rng.hash => fixnum + * + * Generate a hash value such that two ranges with the same start and + * end points, and the same value for the "exclude end" flag, generate + * the same hash value. + */) + +directive(static) ident(VALUE) +ident(range_hash)operator(()ident(range)operator(\)) + ident(VALUE) ident(range)operator(;) +operator({) + pre_type(long) ident(hash) operator(=) ident(EXCL)operator(()ident(range)operator(\);) + ident(VALUE) ident(v)operator(;) + + ident(v) operator(=) ident(rb_hash)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\)\);) + ident(hash) operator(^=) ident(v) operator(<<) integer(1)operator(;) + ident(v) operator(=) ident(rb_hash)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\)\);) + ident(hash) operator(^=) ident(v) operator(<<) integer(9)operator(;) + ident(hash) operator(^=) ident(EXCL)operator(()ident(range)operator(\)) operator(<<) integer(24)operator(;) + + reserved(return) ident(LONG2FIX)operator(()ident(hash)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(str_step)operator(()ident(args)operator(\)) + ident(VALUE) operator(*)ident(args)operator(;) +operator({) + reserved(return) ident(rb_str_upto)operator(()ident(args)operator([)integer(0)operator(],) ident(args)operator([)integer(1)operator(],) ident(EXCL)operator(()ident(args)operator([)integer(2)operator(]\)\);) +operator(}) + +directive(static) directive(void) +ident(range_each_func)operator(()ident(range)operator(,) ident(func)operator(,) ident(v)operator(,) ident(e)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(range)operator(;) + directive(void) operator((*)ident(func)operator(\)) ident(_)operator((()ident(VALUE)operator(,) directive(void)operator(*\)\);) + ident(VALUE) ident(v)operator(,) ident(e)operator(;) + directive(void) operator(*)ident(arg)operator(;) +operator({) + pre_type(int) ident(c)operator(;) + + reserved(if) operator(()ident(EXCL)operator(()ident(range)operator(\)\)) operator({) + reserved(while) operator(()ident(r_lt)operator(()ident(v)operator(,) ident(e)operator(\)\)) operator({) + operator((*)ident(func)operator(\)()ident(v)operator(,) ident(arg)operator(\);) + ident(v) operator(=) ident(rb_funcall)operator(()ident(v)operator(,) ident(id_succ)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(RTEST)operator(()ident(c) operator(=) ident(r_le)operator(()ident(v)operator(,) ident(e)operator(\)\)\)) operator({) + operator((*)ident(func)operator(\)()ident(v)operator(,) ident(arg)operator(\);) + reserved(if) operator(()ident(c) operator(==) ident(INT2FIX)operator(()integer(0)operator(\)\)) reserved(break)operator(;) + ident(v) operator(=) ident(rb_funcall)operator(()ident(v)operator(,) ident(id_succ)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(step_i)operator(()ident(i)operator(,) ident(iter)operator(\)) + ident(VALUE) ident(i)operator(;) + pre_type(long) operator(*)ident(iter)operator(;) +operator({) + ident(iter)operator([)integer(0)operator(]--;) + reserved(if) operator(()ident(iter)operator([)integer(0)operator(]) operator(==) integer(0)operator(\)) operator({) + ident(rb_yield)operator(()ident(i)operator(\);) + ident(iter)operator([)integer(0)operator(]) operator(=) ident(iter)operator([)integer(1)operator(];) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * rng.step(n=1\) {| obj | block } => rng + * + * Iterates over <i>rng</i>, passing each <i>n</i>th element to the block. If + * the range contains numbers or strings, natural ordering is used. Otherwise + * <code>step</code> invokes <code>succ</code> to iterate through range + * elements. The following code uses class <code>Xs</code>, which is defined + * in the class-level documentation. + * + * range = Xs.new(1\)..Xs.new(10\) + * range.step(2\) {|x| puts x} + * range.step(3\) {|x| puts x} + * + * <em>produces:</em> + * + * 1 x + * 3 xxx + * 5 xxxxx + * 7 xxxxxxx + * 9 xxxxxxxxx + * 1 x + * 4 xxxx + * 7 xxxxxxx + * 10 xxxxxxxxxx + */) + + +directive(static) ident(VALUE) +ident(range_step)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(range)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(range)operator(;) +operator({) + ident(VALUE) ident(b)operator(,) ident(e)operator(,) ident(step)operator(;) + pre_type(long) ident(unit)operator(;) + + ident(b) operator(=) ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\);) + ident(e) operator(=) ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\);) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(step)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(step) operator(=) ident(INT2FIX)operator(()integer(1)operator(\);) + operator(}) + + ident(unit) operator(=) ident(NUM2LONG)operator(()ident(step)operator(\);) + reserved(if) operator(()ident(unit) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(step can't be negative)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(b)operator(\)) operator(&&) ident(FIXNUM_P)operator(()ident(e)operator(\)\)) operator({) comment(/* fixnums are special */) + pre_type(long) ident(end) operator(=) ident(FIX2LONG)operator(()ident(e)operator(\);) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(unit) operator(==) integer(0)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(step can't be 0)delimiter(")>operator(\);) + reserved(if) operator((!)ident(EXCL)operator(()ident(range)operator(\)\)) ident(end) operator(+=) integer(1)operator(;) + ident(i) operator(=) ident(FIX2LONG)operator(()ident(b)operator(\);) + reserved(while) operator(()ident(i) operator(<) ident(end)operator(\)) operator({) + ident(rb_yield)operator(()ident(LONG2NUM)operator(()ident(i)operator(\)\);) + reserved(if) operator(()ident(i) operator(+) ident(unit) operator(<) ident(i)operator(\)) reserved(break)operator(;) + ident(i) operator(+=) ident(unit)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_check_string_type)operator(()ident(b)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + ident(VALUE) ident(args)operator([)integer(5)operator(];) + pre_type(long) ident(iter)operator([)integer(2)operator(];) + + ident(b) operator(=) ident(tmp)operator(;) + reserved(if) operator(()ident(unit) operator(==) integer(0)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(step can't be 0)delimiter(")>operator(\);) + ident(args)operator([)integer(0)operator(]) operator(=) ident(b)operator(;) ident(args)operator([)integer(1)operator(]) operator(=) ident(e)operator(;) ident(args)operator([)integer(2)operator(]) operator(=) ident(range)operator(;) + ident(iter)operator([)integer(0)operator(]) operator(=) integer(1)operator(;) ident(iter)operator([)integer(1)operator(]) operator(=) ident(unit)operator(;) + ident(rb_iterate)operator((()ident(VALUE)operator((*\))ident(_)operator((()ident(VALUE)operator(\)\)\))ident(str_step)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(,) ident(step_i)operator(,) + operator(()ident(VALUE)operator(\))ident(iter)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(rb_obj_is_kind_of)operator(()ident(b)operator(,) ident(rb_cNumeric)operator(\)\)) operator({) + ident(ID) ident(c) operator(=) ident(rb_intern)operator(()ident(EXCL)operator(()ident(range)operator(\)) operator(?) string<delimiter(")content(<)delimiter(")> operator(:) string<delimiter(")content(<=)delimiter(")>operator(\);) + + reserved(if) operator(()ident(rb_equal)operator(()ident(step)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\)\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(step can't be 0)delimiter(")>operator(\);) + reserved(while) operator(()ident(RTEST)operator(()ident(rb_funcall)operator(()ident(b)operator(,) ident(c)operator(,) integer(1)operator(,) ident(e)operator(\)\)\)) operator({) + ident(rb_yield)operator(()ident(b)operator(\);) + ident(b) operator(=) ident(rb_funcall)operator(()ident(b)operator(,) char('+')operator(,) integer(1)operator(,) ident(step)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + pre_type(long) ident(args)operator([)integer(2)operator(];) + + reserved(if) operator(()ident(unit) operator(==) integer(0)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(step can't be 0)delimiter(")>operator(\);) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(b)operator(,) ident(id_succ)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't iterate from %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(b)operator(\)\);) + operator(}) + + ident(args)operator([)integer(0)operator(]) operator(=) integer(1)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(unit)operator(;) + ident(range_each_func)operator(()ident(range)operator(,) ident(step_i)operator(,) ident(b)operator(,) ident(e)operator(,) ident(args)operator(\);) + operator(}) + operator(}) + reserved(return) ident(range)operator(;) +operator(}) + +directive(static) directive(void) +ident(each_i)operator(()ident(v)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(v)operator(;) + directive(void) operator(*)ident(arg)operator(;) +operator({) + ident(rb_yield)operator(()ident(v)operator(\);) +operator(}) + +comment(/* + * call-seq: + * rng.each {| i | block } => rng + * + * Iterates over the elements <i>rng</i>, passing each in turn to the + * block. You can only iterate if the start object of the range + * supports the +succ+ method (which means that you can't iterate over + * ranges of +Float+ objects\). + * + * (10..15\).each do |n| + * print n, ' ' + * end + * + * <em>produces:</em> + * + * 10 11 12 13 14 15 + */) + +directive(static) ident(VALUE) +ident(range_each)operator(()ident(range)operator(\)) + ident(VALUE) ident(range)operator(;) +operator({) + ident(VALUE) ident(beg)operator(,) ident(end)operator(;) + + ident(beg) operator(=) ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\);) + ident(end) operator(=) ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\);) + + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(beg)operator(,) ident(id_succ)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't iterate from %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(beg)operator(\)\);) + operator(}) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(beg)operator(\)) operator(&&) ident(FIXNUM_P)operator(()ident(end)operator(\)\)) operator({) comment(/* fixnums are special */) + pre_type(long) ident(lim) operator(=) ident(FIX2LONG)operator(()ident(end)operator(\);) + pre_type(long) ident(i)operator(;) + + reserved(if) operator((!)ident(EXCL)operator(()ident(range)operator(\)\)) ident(lim) operator(+=) integer(1)operator(;) + reserved(for) operator(()ident(i)operator(=)ident(FIX2LONG)operator(()ident(beg)operator(\);) ident(i)operator(<)ident(lim)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(LONG2NUM)operator(()ident(i)operator(\)\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(TYPE)operator(()ident(beg)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(VALUE) ident(args)operator([)integer(5)operator(];) + pre_type(long) ident(iter)operator([)integer(2)operator(];) + + ident(args)operator([)integer(0)operator(]) operator(=) ident(beg)operator(;) ident(args)operator([)integer(1)operator(]) operator(=) ident(end)operator(;) ident(args)operator([)integer(2)operator(]) operator(=) ident(range)operator(;) + ident(iter)operator([)integer(0)operator(]) operator(=) integer(1)operator(;) ident(iter)operator([)integer(1)operator(]) operator(=) integer(1)operator(;) + ident(rb_iterate)operator((()ident(VALUE)operator((*\))ident(_)operator((()ident(VALUE)operator(\)\)\))ident(str_step)operator(,) operator(()ident(VALUE)operator(\))ident(args)operator(,) ident(step_i)operator(,) + operator(()ident(VALUE)operator(\))ident(iter)operator(\);) + operator(}) + reserved(else) operator({) + ident(range_each_func)operator(()ident(range)operator(,) ident(each_i)operator(,) ident(beg)operator(,) ident(end)operator(,) pre_constant(NULL)operator(\);) + operator(}) + reserved(return) ident(range)operator(;) +operator(}) + +comment(/* + * call-seq: + * rng.first => obj + * rng.begin => obj + * + * Returns the first object in <i>rng</i>. + */) + +directive(static) ident(VALUE) +ident(range_first)operator(()ident(range)operator(\)) + ident(VALUE) ident(range)operator(;) +operator({) + reserved(return) ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * rng.end => obj + * rng.last => obj + * + * Returns the object that defines the end of <i>rng</i>. + * + * (1..10\).end #=> 10 + * (1...10\).end #=> 10 + */) + + +directive(static) ident(VALUE) +ident(range_last)operator(()ident(range)operator(\)) + ident(VALUE) ident(range)operator(;) +operator({) + reserved(return) ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_range_beg_len)operator(()ident(range)operator(,) ident(begp)operator(,) ident(lenp)operator(,) ident(len)operator(,) ident(err)operator(\)) + ident(VALUE) ident(range)operator(;) + pre_type(long) operator(*)ident(begp)operator(,) operator(*)ident(lenp)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(err)operator(;) +operator({) + pre_type(long) ident(beg)operator(,) ident(end)operator(,) ident(b)operator(,) ident(e)operator(;) + + reserved(if) operator((!)ident(rb_obj_is_kind_of)operator(()ident(range)operator(,) ident(rb_cRange)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + + ident(beg) operator(=) ident(b) operator(=) ident(NUM2LONG)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\)\);) + ident(end) operator(=) ident(e) operator(=) ident(NUM2LONG)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\)\);) + + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(+=) ident(len)operator(;) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) reserved(goto) ident(out_of_range)operator(;) + operator(}) + reserved(if) operator(()ident(err) operator(==) integer(0) operator(||) ident(err) operator(==) integer(2)operator(\)) operator({) + reserved(if) operator(()ident(beg) operator(>) ident(len)operator(\)) reserved(goto) ident(out_of_range)operator(;) + reserved(if) operator(()ident(end) operator(>) ident(len)operator(\)) ident(end) operator(=) ident(len)operator(;) + operator(}) + reserved(if) operator(()ident(end) operator(<) integer(0)operator(\)) ident(end) operator(+=) ident(len)operator(;) + reserved(if) operator((!)ident(EXCL)operator(()ident(range)operator(\)\)) ident(end)operator(++;) comment(/* include end point */) + ident(len) operator(=) ident(end) operator(-) ident(beg)operator(;) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) ident(len) operator(=) integer(0)operator(;) + + operator(*)ident(begp) operator(=) ident(beg)operator(;) + operator(*)ident(lenp) operator(=) ident(len)operator(;) + reserved(return) ident(Qtrue)operator(;) + + label(out_of_range)operator(:) + reserved(if) operator(()ident(err)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(%ld..%s%ld out of range)delimiter(")>operator(,) + ident(b)operator(,) ident(EXCL)operator(()ident(range)operator(\)?) string<delimiter(")content(.)delimiter(")> operator(:) string<delimiter(")delimiter(")>operator(,) ident(e)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * rng.to_s => string + * + * Convert this range object to a printable form. + */) + +directive(static) ident(VALUE) +ident(range_to_s)operator(()ident(range)operator(\)) + ident(VALUE) ident(range)operator(;) +operator({) + ident(VALUE) ident(str)operator(,) ident(str2)operator(;) + + ident(str) operator(=) ident(rb_obj_as_string)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\)\);) + ident(str2) operator(=) ident(rb_obj_as_string)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\)\);) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_cat)operator(()ident(str)operator(,) string<delimiter(")content(...)delimiter(")>operator(,) ident(EXCL)operator(()ident(range)operator(\)?)integer(3)operator(:)integer(2)operator(\);) + ident(rb_str_append)operator(()ident(str)operator(,) ident(str2)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(str2)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * rng.inspect => string + * + * Convert this range object to a printable form (using + * <code>inspect</code> to convert the start and end + * objects\). + */) + + +directive(static) ident(VALUE) +ident(range_inspect)operator(()ident(range)operator(\)) + ident(VALUE) ident(range)operator(;) +operator({) + ident(VALUE) ident(str)operator(,) ident(str2)operator(;) + + ident(str) operator(=) ident(rb_inspect)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\)\);) + ident(str2) operator(=) ident(rb_inspect)operator(()ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\)\);) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_cat)operator(()ident(str)operator(,) string<delimiter(")content(...)delimiter(")>operator(,) ident(EXCL)operator(()ident(range)operator(\)?)integer(3)operator(:)integer(2)operator(\);) + ident(rb_str_append)operator(()ident(str)operator(,) ident(str2)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(str2)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * rng === obj => true or false + * rng.member?(val\) => true or false + * rng.include?(val\) => true or false + * + * Returns <code>true</code> if <i>obj</i> is an element of + * <i>rng</i>, <code>false</code> otherwise. Conveniently, + * <code>===</code> is the comparison operator used by + * <code>case</code> statements. + * + * case 79 + * when 1..50 then print "low\\n" + * when 51..75 then print "medium\\n" + * when 76..100 then print "high\\n" + * end + * + * <em>produces:</em> + * + * high + */) + +directive(static) ident(VALUE) +ident(range_include)operator(()ident(range)operator(,) ident(val)operator(\)) + ident(VALUE) ident(range)operator(,) ident(val)operator(;) +operator({) + ident(VALUE) ident(beg)operator(,) ident(end)operator(;) + + ident(beg) operator(=) ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_beg)operator(\);) + ident(end) operator(=) ident(rb_ivar_get)operator(()ident(range)operator(,) ident(id_end)operator(\);) + reserved(if) operator(()ident(r_le)operator(()ident(beg)operator(,) ident(val)operator(\)\)) operator({) + reserved(if) operator(()ident(EXCL)operator(()ident(range)operator(\)\)) operator({) + reserved(if) operator(()ident(r_lt)operator(()ident(val)operator(,) ident(end)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(r_le)operator(()ident(val)operator(,) ident(end)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* A <code>Range</code> represents an interval---a set of values with a + * start and an end. Ranges may be constructed using the + * <em>s</em><code>..</code><em>e</em> and + * <em>s</em><code>...</code><em>e</em> literals, or with + * <code>Range::new</code>. Ranges constructed using <code>..</code> + * run from the start to the end inclusively. Those created using + * <code>...</code> exclude the end value. When used as an iterator, + * ranges return each value in the sequence. + * + * (-1..-5\).to_a #=> [] + * (-5..-1\).to_a #=> [-5, -4, -3, -2, -1] + * ('a'..'e'\).to_a #=> ["a", "b", "c", "d", "e"] + * ('a'...'e'\).to_a #=> ["a", "b", "c", "d"] + * + * Ranges can be constructed using objects of any type, as long as the + * objects can be compared using their <code><=></code> operator and + * they support the <code>succ</code> method to return the next object + * in sequence. + * + * class Xs # represent a string of 'x's + * include Comparable + * attr :length + * def initialize(n\) + * @length = n + * end + * def succ + * Xs.new(@length + 1\) + * end + * def <=>(other\) + * @length <=> other.length + * end + * def to_s + * sprintf "%2d #{inspect}", @length + * end + * def inspect + * 'x' * @length + * end + * end + * + * r = Xs.new(3\)..Xs.new(6\) #=> xxx..xxxxxx + * r.to_a #=> [xxx, xxxx, xxxxx, xxxxxx] + * r.member?(Xs.new(5\)\) #=> true + * + * In the previous code example, class <code>Xs</code> includes the + * <code>Comparable</code> module. This is because + * <code>Enumerable#member?</code> checks for equality using + * <code>==</code>. Including <code>Comparable</code> ensures that the + * <code>==</code> method is defined in terms of the <code><=></code> + * method implemented in <code>Xs</code>. + * + */) + +directive(void) +ident(Init_Range)operator((\)) +operator({) + ident(rb_cRange) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Range)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_include_module)operator(()ident(rb_cRange)operator(,) ident(rb_mEnumerable)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(range_initialize)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(range_eq)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(===)delimiter(")>operator(,) ident(range_include)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(range_eql)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(hash)delimiter(")>operator(,) ident(range_hash)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(each)delimiter(")>operator(,) ident(range_each)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(step)delimiter(")>operator(,) ident(range_step)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(first)delimiter(")>operator(,) ident(range_first)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(last)delimiter(")>operator(,) ident(range_last)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(begin)delimiter(")>operator(,) ident(range_first)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(end)delimiter(")>operator(,) ident(range_last)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(range_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(range_inspect)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(exclude_end?)delimiter(")>operator(,) ident(range_exclude_end_p)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(member?)delimiter(")>operator(,) ident(range_include)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRange)operator(,) string<delimiter(")content(include?)delimiter(")>operator(,) ident(range_include)operator(,) integer(1)operator(\);) + + ident(id_cmp) operator(=) ident(rb_intern)operator(()string<delimiter(")content(<=>)delimiter(")>operator(\);) + ident(id_succ) operator(=) ident(rb_intern)operator(()string<delimiter(")content(succ)delimiter(")>operator(\);) + ident(id_beg) operator(=) ident(rb_intern)operator(()string<delimiter(")content(begin)delimiter(")>operator(\);) + ident(id_end) operator(=) ident(rb_intern)operator(()string<delimiter(")content(end)delimiter(")>operator(\);) + ident(id_excl) operator(=) ident(rb_intern)operator(()string<delimiter(")content(excl)delimiter(")>operator(\);) +operator(}) +comment(/********************************************************************** + + re.c - + + $Author: shyouhei $ + created at: Mon Aug 9 18:24:49 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("re.h") +preprocessor(#include) include(<ctype.h>) + +ident(VALUE) ident(rb_eRegexpError)operator(;) + +preprocessor(#define) ident(BEG)operator(()ident(no)operator(\)) ident(regs)operator(->)ident(beg)operator([)ident(no)operator(]) +preprocessor(#define) ident(END)operator(()ident(no)operator(\)) ident(regs)operator(->)ident(end)operator([)ident(no)operator(]) + +preprocessor(#if) char('a') operator(==) integer(97) comment(/* it's ascii */) +directive(static) directive(const) pre_type(char) ident(casetable)operator([]) operator(=) operator({) + char('\\000')operator(,) char('\\001')operator(,) char('\\002')operator(,) char('\\003')operator(,) char('\\004')operator(,) char('\\005')operator(,) char('\\006')operator(,) char('\\007')operator(,) + char('\\010')operator(,) char('\\011')operator(,) char('\\012')operator(,) char('\\013')operator(,) char('\\014')operator(,) char('\\015')operator(,) char('\\016')operator(,) char('\\017')operator(,) + char('\\020')operator(,) char('\\021')operator(,) char('\\022')operator(,) char('\\023')operator(,) char('\\024')operator(,) char('\\025')operator(,) char('\\026')operator(,) char('\\027')operator(,) + char('\\030')operator(,) char('\\031')operator(,) char('\\032')operator(,) char('\\033')operator(,) char('\\034')operator(,) char('\\035')operator(,) char('\\036')operator(,) char('\\037')operator(,) + comment(/* ' ' '!' '"' '#' '$' '%' '&' ''' */) + char('\\040')operator(,) char('\\041')operator(,) char('\\042')operator(,) char('\\043')operator(,) char('\\044')operator(,) char('\\045')operator(,) char('\\046')operator(,) char('\\047')operator(,) + comment(/* '(' '\)' '*' '+' ',' '-' '.' '/' */) + char('\\050')operator(,) char('\\051')operator(,) char('\\052')operator(,) char('\\053')operator(,) char('\\054')operator(,) char('\\055')operator(,) char('\\056')operator(,) char('\\057')operator(,) + comment(/* '0' '1' '2' '3' '4' '5' '6' '7' */) + char('\\060')operator(,) char('\\061')operator(,) char('\\062')operator(,) char('\\063')operator(,) char('\\064')operator(,) char('\\065')operator(,) char('\\066')operator(,) char('\\067')operator(,) + comment(/* '8' '9' ':' ';' '<' '=' '>' '?' */) + char('\\070')operator(,) char('\\071')operator(,) char('\\072')operator(,) char('\\073')operator(,) char('\\074')operator(,) char('\\075')operator(,) char('\\076')operator(,) char('\\077')operator(,) + comment(/* '@' 'A' 'B' 'C' 'D' 'E' 'F' 'G' */) + char('\\100')operator(,) char('\\141')operator(,) char('\\142')operator(,) char('\\143')operator(,) char('\\144')operator(,) char('\\145')operator(,) char('\\146')operator(,) char('\\147')operator(,) + comment(/* 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' */) + char('\\150')operator(,) char('\\151')operator(,) char('\\152')operator(,) char('\\153')operator(,) char('\\154')operator(,) char('\\155')operator(,) char('\\156')operator(,) char('\\157')operator(,) + comment(/* 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' */) + char('\\160')operator(,) char('\\161')operator(,) char('\\162')operator(,) char('\\163')operator(,) char('\\164')operator(,) char('\\165')operator(,) char('\\166')operator(,) char('\\167')operator(,) + comment(/* 'X' 'Y' 'Z' '[' '\\' ']' '^' '_' */) + char('\\170')operator(,) char('\\171')operator(,) char('\\172')operator(,) char('\\133')operator(,) char('\\134')operator(,) char('\\135')operator(,) char('\\136')operator(,) char('\\137')operator(,) + comment(/* '`' 'a' 'b' 'c' 'd' 'e' 'f' 'g' */) + char('\\140')operator(,) char('\\141')operator(,) char('\\142')operator(,) char('\\143')operator(,) char('\\144')operator(,) char('\\145')operator(,) char('\\146')operator(,) char('\\147')operator(,) + comment(/* 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' */) + char('\\150')operator(,) char('\\151')operator(,) char('\\152')operator(,) char('\\153')operator(,) char('\\154')operator(,) char('\\155')operator(,) char('\\156')operator(,) char('\\157')operator(,) + comment(/* 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' */) + char('\\160')operator(,) char('\\161')operator(,) char('\\162')operator(,) char('\\163')operator(,) char('\\164')operator(,) char('\\165')operator(,) char('\\166')operator(,) char('\\167')operator(,) + comment(/* 'x' 'y' 'z' '{' '|' '}' '~' */) + char('\\170')operator(,) char('\\171')operator(,) char('\\172')operator(,) char('\\173')operator(,) char('\\174')operator(,) char('\\175')operator(,) char('\\176')operator(,) char('\\177')operator(,) + char('\\200')operator(,) char('\\201')operator(,) char('\\202')operator(,) char('\\203')operator(,) char('\\204')operator(,) char('\\205')operator(,) char('\\206')operator(,) char('\\207')operator(,) + char('\\210')operator(,) char('\\211')operator(,) char('\\212')operator(,) char('\\213')operator(,) char('\\214')operator(,) char('\\215')operator(,) char('\\216')operator(,) char('\\217')operator(,) + char('\\220')operator(,) char('\\221')operator(,) char('\\222')operator(,) char('\\223')operator(,) char('\\224')operator(,) char('\\225')operator(,) char('\\226')operator(,) char('\\227')operator(,) + char('\\230')operator(,) char('\\231')operator(,) char('\\232')operator(,) char('\\233')operator(,) char('\\234')operator(,) char('\\235')operator(,) char('\\236')operator(,) char('\\237')operator(,) + char('\\240')operator(,) char('\\241')operator(,) char('\\242')operator(,) char('\\243')operator(,) char('\\244')operator(,) char('\\245')operator(,) char('\\246')operator(,) char('\\247')operator(,) + char('\\250')operator(,) char('\\251')operator(,) char('\\252')operator(,) char('\\253')operator(,) char('\\254')operator(,) char('\\255')operator(,) char('\\256')operator(,) char('\\257')operator(,) + char('\\260')operator(,) char('\\261')operator(,) char('\\262')operator(,) char('\\263')operator(,) char('\\264')operator(,) char('\\265')operator(,) char('\\266')operator(,) char('\\267')operator(,) + char('\\270')operator(,) char('\\271')operator(,) char('\\272')operator(,) char('\\273')operator(,) char('\\274')operator(,) char('\\275')operator(,) char('\\276')operator(,) char('\\277')operator(,) + char('\\300')operator(,) char('\\301')operator(,) char('\\302')operator(,) char('\\303')operator(,) char('\\304')operator(,) char('\\305')operator(,) char('\\306')operator(,) char('\\307')operator(,) + char('\\310')operator(,) char('\\311')operator(,) char('\\312')operator(,) char('\\313')operator(,) char('\\314')operator(,) char('\\315')operator(,) char('\\316')operator(,) char('\\317')operator(,) + char('\\320')operator(,) char('\\321')operator(,) char('\\322')operator(,) char('\\323')operator(,) char('\\324')operator(,) char('\\325')operator(,) char('\\326')operator(,) char('\\327')operator(,) + char('\\330')operator(,) char('\\331')operator(,) char('\\332')operator(,) char('\\333')operator(,) char('\\334')operator(,) char('\\335')operator(,) char('\\336')operator(,) char('\\337')operator(,) + char('\\340')operator(,) char('\\341')operator(,) char('\\342')operator(,) char('\\343')operator(,) char('\\344')operator(,) char('\\345')operator(,) char('\\346')operator(,) char('\\347')operator(,) + char('\\350')operator(,) char('\\351')operator(,) char('\\352')operator(,) char('\\353')operator(,) char('\\354')operator(,) char('\\355')operator(,) char('\\356')operator(,) char('\\357')operator(,) + char('\\360')operator(,) char('\\361')operator(,) char('\\362')operator(,) char('\\363')operator(,) char('\\364')operator(,) char('\\365')operator(,) char('\\366')operator(,) char('\\367')operator(,) + char('\\370')operator(,) char('\\371')operator(,) char('\\372')operator(,) char('\\373')operator(,) char('\\374')operator(,) char('\\375')operator(,) char('\\376')operator(,) char('\\377')operator(,) +operator(};) +preprocessor(#else) +preprocessor(# error) operator(>>>) string<delimiter(")content(You lose. You will need a translation table for your character set.)delimiter(")> operator(<<<) +preprocessor(#endif) + +pre_type(int) +ident(rb_memcicmp)operator(()ident(x)operator(,) ident(y)operator(,) ident(len)operator(\)) + directive(const) directive(void) operator(*)ident(x)operator(,) operator(*)ident(y)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(p1) operator(=) ident(x)operator(,) operator(*)ident(p2) operator(=) ident(y)operator(;) + pre_type(int) ident(tmp)operator(;) + + reserved(while) operator(()ident(len)operator(--\)) operator({) + reserved(if) operator((()ident(tmp) operator(=) ident(casetable)operator([()pre_type(unsigned)operator(\)*)ident(p1)operator(++]) operator(-) ident(casetable)operator([()pre_type(unsigned)operator(\)*)ident(p2)operator(++]\)) operator(!=) integer(0)operator(\)) + reserved(return) ident(tmp)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +pre_type(int) +ident(rb_memcmp)operator(()ident(p1)operator(,) ident(p2)operator(,) ident(len)operator(\)) + directive(const) directive(void) operator(*)ident(p1)operator(,) operator(*)ident(p2)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + reserved(if) operator((!)ident(ruby_ignorecase)operator(\)) operator({) + reserved(return) ident(memcmp)operator(()ident(p1)operator(,) ident(p2)operator(,) ident(len)operator(\);) + operator(}) + reserved(return) ident(rb_memcicmp)operator(()ident(p1)operator(,) ident(p2)operator(,) ident(len)operator(\);) +operator(}) + +pre_type(long) +ident(rb_memsearch)operator(()ident(x0)operator(,) ident(m)operator(,) ident(y0)operator(,) ident(n)operator(\)) + directive(const) directive(void) operator(*)ident(x0)operator(,) operator(*)ident(y0)operator(;) + pre_type(long) ident(m)operator(,) ident(n)operator(;) +operator({) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(x) operator(=) operator(()pre_type(unsigned) pre_type(char) operator(*\))ident(x0)operator(,) operator(*)ident(y) operator(=) operator(()pre_type(unsigned) pre_type(char) operator(*\))ident(y0)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(e)operator(;) + pre_type(long) ident(i)operator(;) + pre_type(int) ident(d)operator(;) + pre_type(unsigned) pre_type(long) ident(hx)operator(,) ident(hy)operator(;) + +preprocessor(#define) ident(KR_REHASH)operator(()ident(a)operator(,) ident(b)operator(,) ident(h)operator(\)) operator(((()ident(h)operator(\)) operator(<<) integer(1)operator(\)) operator(-) operator(((()pre_type(unsigned) pre_type(long)operator(\)()ident(a)operator(\)\)<<)ident(d)operator(\)) operator(+) operator(()ident(b)operator(\)\)) + + reserved(if) operator(()ident(m) operator(>) ident(n)operator(\)) reserved(return) operator(-)integer(1)operator(;) + ident(s) operator(=) ident(y)operator(;) ident(e) operator(=) ident(s) operator(+) ident(n) operator(-) ident(m)operator(;) + + comment(/* Preprocessing */) + comment(/* computes d = 2^(m-1\) with + the left-shift operator */) + ident(d) operator(=) reserved(sizeof)operator(()ident(hx)operator(\)) operator(*) ident(CHAR_BIT) operator(-) integer(1)operator(;) + reserved(if) operator(()ident(d) operator(>) ident(m)operator(\)) ident(d) operator(=) ident(m)operator(;) + + reserved(if) operator(()ident(ruby_ignorecase)operator(\)) operator({) + reserved(if) operator(()ident(n) operator(==) ident(m)operator(\)) operator({) + reserved(return) ident(rb_memcicmp)operator(()ident(x)operator(,) ident(s)operator(,) ident(m)operator(\)) operator(==) integer(0) operator(?) integer(0) operator(:) operator(-)integer(1)operator(;) + operator(}) + comment(/* Prepare hash value */) + reserved(for) operator(()ident(hy) operator(=) ident(hx) operator(=) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(d)operator(;) operator(++)ident(i)operator(\)) operator({) + ident(hx) operator(=) ident(KR_REHASH)operator(()integer(0)operator(,) ident(casetable)operator([)ident(x)operator([)ident(i)operator(]],) ident(hx)operator(\);) + ident(hy) operator(=) ident(KR_REHASH)operator(()integer(0)operator(,) ident(casetable)operator([)ident(s)operator([)ident(i)operator(]],) ident(hy)operator(\);) + operator(}) + comment(/* Searching */) + reserved(while) operator(()ident(hx) operator(!=) ident(hy) operator(||) ident(rb_memcicmp)operator(()ident(x)operator(,) ident(s)operator(,) ident(m)operator(\)\)) operator({) + reserved(if) operator(()ident(s) operator(>=) ident(e)operator(\)) reserved(return) operator(-)integer(1)operator(;) + ident(hy) operator(=) ident(KR_REHASH)operator(()ident(casetable)operator([*)ident(s)operator(],) ident(casetable)operator([*()ident(s)operator(+)ident(d)operator(\)],) ident(hy)operator(\);) + ident(s)operator(++;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(n) operator(==) ident(m)operator(\)) operator({) + reserved(return) ident(memcmp)operator(()ident(x)operator(,) ident(s)operator(,) ident(m)operator(\)) operator(==) integer(0) operator(?) integer(0) operator(:) operator(-)integer(1)operator(;) + operator(}) + comment(/* Prepare hash value */) + reserved(for) operator(()ident(hy) operator(=) ident(hx) operator(=) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(d)operator(;) operator(++)ident(i)operator(\)) operator({) + ident(hx) operator(=) ident(KR_REHASH)operator(()integer(0)operator(,) ident(x)operator([)ident(i)operator(],) ident(hx)operator(\);) + ident(hy) operator(=) ident(KR_REHASH)operator(()integer(0)operator(,) ident(s)operator([)ident(i)operator(],) ident(hy)operator(\);) + operator(}) + comment(/* Searching */) + reserved(while) operator(()ident(hx) operator(!=) ident(hy) operator(||) ident(memcmp)operator(()ident(x)operator(,) ident(s)operator(,) ident(m)operator(\)\)) operator({) + reserved(if) operator(()ident(s) operator(>=) ident(e)operator(\)) reserved(return) operator(-)integer(1)operator(;) + ident(hy) operator(=) ident(KR_REHASH)operator((*)ident(s)operator(,) operator(*()ident(s)operator(+)ident(d)operator(\),) ident(hy)operator(\);) + ident(s)operator(++;) + operator(}) + operator(}) + reserved(return) ident(s)operator(-)ident(y)operator(;) +operator(}) + +preprocessor(#define) ident(REG_LITERAL) ident(FL_USER5) +preprocessor(#define) ident(REG_CASESTATE) ident(FL_USER0) +preprocessor(#define) ident(KCODE_NONE) integer(0) +preprocessor(#define) ident(KCODE_EUC) ident(FL_USER1) +preprocessor(#define) ident(KCODE_SJIS) ident(FL_USER2) +preprocessor(#define) ident(KCODE_UTF8) ident(FL_USER3) +preprocessor(#define) ident(KCODE_FIXED) ident(FL_USER4) +preprocessor(#define) ident(KCODE_MASK) operator(()ident(KCODE_EUC)operator(|)ident(KCODE_SJIS)operator(|)ident(KCODE_UTF8)operator(\)) + +directive(static) pre_type(int) ident(reg_kcode) operator(=) ident(DEFAULT_KCODE)operator(;) + +directive(static) directive(void) +ident(kcode_euc)operator(()ident(re)operator(\)) + reserved(struct) ident(RRegexp) operator(*)ident(re)operator(;) +operator({) + ident(FL_UNSET)operator(()ident(re)operator(,) ident(KCODE_MASK)operator(\);) + ident(FL_SET)operator(()ident(re)operator(,) ident(KCODE_EUC)operator(\);) + ident(FL_SET)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\);) +operator(}) + +directive(static) directive(void) +ident(kcode_sjis)operator(()ident(re)operator(\)) + reserved(struct) ident(RRegexp) operator(*)ident(re)operator(;) +operator({) + ident(FL_UNSET)operator(()ident(re)operator(,) ident(KCODE_MASK)operator(\);) + ident(FL_SET)operator(()ident(re)operator(,) ident(KCODE_SJIS)operator(\);) + ident(FL_SET)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\);) +operator(}) + +directive(static) directive(void) +ident(kcode_utf8)operator(()ident(re)operator(\)) + reserved(struct) ident(RRegexp) operator(*)ident(re)operator(;) +operator({) + ident(FL_UNSET)operator(()ident(re)operator(,) ident(KCODE_MASK)operator(\);) + ident(FL_SET)operator(()ident(re)operator(,) ident(KCODE_UTF8)operator(\);) + ident(FL_SET)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\);) +operator(}) + +directive(static) directive(void) +ident(kcode_none)operator(()ident(re)operator(\)) + reserved(struct) ident(RRegexp) operator(*)ident(re)operator(;) +operator({) + ident(FL_UNSET)operator(()ident(re)operator(,) ident(KCODE_MASK)operator(\);) + ident(FL_SET)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\);) +operator(}) + +directive(static) pre_type(int) ident(curr_kcode)operator(;) + +directive(void) +ident(rb_kcode_set_option)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) reserved(return)operator(;) + + ident(curr_kcode) operator(=) ident(RBASIC)operator(()ident(re)operator(\)->)ident(flags) operator(&) ident(KCODE_MASK)operator(;) + reserved(if) operator(()ident(reg_kcode) operator(==) ident(curr_kcode)operator(\)) reserved(return)operator(;) + reserved(switch) operator(()ident(curr_kcode)operator(\)) operator({) + reserved(case) label(KCODE_NONE)operator(:) + ident(re_mbcinit)operator(()ident(MBCTYPE_ASCII)operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_EUC)operator(:) + ident(re_mbcinit)operator(()ident(MBCTYPE_EUC)operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_SJIS)operator(:) + ident(re_mbcinit)operator(()ident(MBCTYPE_SJIS)operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_UTF8)operator(:) + ident(re_mbcinit)operator(()ident(MBCTYPE_UTF8)operator(\);) + reserved(break)operator(;) + operator(}) +operator(}) + +directive(void) +ident(rb_kcode_reset_option)operator((\)) +operator({) + reserved(if) operator(()ident(reg_kcode) operator(==) ident(curr_kcode)operator(\)) reserved(return)operator(;) + reserved(switch) operator(()ident(reg_kcode)operator(\)) operator({) + reserved(case) label(KCODE_NONE)operator(:) + ident(re_mbcinit)operator(()ident(MBCTYPE_ASCII)operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_EUC)operator(:) + ident(re_mbcinit)operator(()ident(MBCTYPE_EUC)operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_SJIS)operator(:) + ident(re_mbcinit)operator(()ident(MBCTYPE_SJIS)operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_UTF8)operator(:) + ident(re_mbcinit)operator(()ident(MBCTYPE_UTF8)operator(\);) + reserved(break)operator(;) + operator(}) +operator(}) + +pre_type(int) +ident(rb_reg_mbclen2)operator(()ident(c)operator(,) ident(re)operator(\)) + pre_type(unsigned) pre_type(int) ident(c)operator(;) + ident(VALUE) ident(re)operator(;) +operator({) + pre_type(int) ident(len)operator(;) + + reserved(if) operator((!)ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) + reserved(return) ident(mbclen)operator(()ident(c)operator(\);) + ident(rb_kcode_set_option)operator(()ident(re)operator(\);) + ident(len) operator(=) ident(mbclen)operator(()ident(c)operator(\);) + ident(rb_kcode_reset_option)operator((\);) + reserved(return) ident(len)operator(;) +operator(}) + +directive(static) directive(void) +ident(rb_reg_check)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + reserved(if) operator((!)ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr) operator(||) operator(!)ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(uninitialized Regexp)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(extern) pre_type(int) ident(ruby_in_compile)operator(;) + +directive(static) directive(void) +ident(rb_reg_expr_str)operator(()ident(str)operator(,) ident(s)operator(,) ident(len)operator(\)) + ident(VALUE) ident(str)operator(;) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + pre_type(int) ident(need_escape) operator(=) integer(0)operator(;) + + ident(p) operator(=) ident(s)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(len)operator(;) + reserved(while) operator(()ident(p)operator(<)ident(pend)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('/') operator(||) operator((!)ident(ISPRINT)operator((*)ident(p)operator(\)) operator(&&) operator(!)ident(ismbchar)operator((*)ident(p)operator(\)\)\)) operator({) + ident(need_escape) operator(=) integer(1)operator(;) + reserved(break)operator(;) + operator(}) + ident(p) operator(+=) ident(mbclen)operator((*)ident(p)operator(\);) + operator(}) + reserved(if) operator((!)ident(need_escape)operator(\)) operator({) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(s)operator(,) ident(len)operator(\);) + operator(}) + reserved(else) operator({) + ident(p) operator(=) ident(s)operator(;) + reserved(while) operator(()ident(p)operator(<)ident(pend)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('\\\\')operator(\)) operator({) + pre_type(int) ident(n) operator(=) ident(mbclen)operator(()ident(p)operator([)integer(1)operator(]\)) operator(+) integer(1)operator(;) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(p)operator(,) ident(n)operator(\);) + ident(p) operator(+=) ident(n)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(else) reserved(if) operator((*)ident(p) operator(==) char('/')operator(\)) operator({) + pre_type(char) ident(c) operator(=) char('\\\\')operator(;) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(p)operator(,) integer(1)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(ismbchar)operator((*)ident(p)operator(\)\)) operator({) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(p)operator(,) ident(mbclen)operator((*)ident(p)operator(\)\);) + ident(p) operator(+=) ident(mbclen)operator((*)ident(p)operator(\);) + reserved(continue)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISPRINT)operator((*)ident(p)operator(\)\)) operator({) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(p)operator(,) integer(1)operator(\);) + operator(}) + reserved(else) reserved(if) operator((!)ident(ISSPACE)operator((*)ident(p)operator(\)\)) operator({) + pre_type(char) ident(b)operator([)integer(8)operator(];) + + ident(sprintf)operator(()ident(b)operator(,) string<delimiter(")char(\\\\)content(%03o)delimiter(")>operator(,) operator(*)ident(p) operator(&) oct(0377)operator(\);) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(b)operator(,) integer(4)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(p)operator(,) integer(1)operator(\);) + operator(}) + ident(p)operator(++;) + operator(}) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(rb_reg_desc)operator(()ident(s)operator(,) ident(len)operator(,) ident(re)operator(\)) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) + ident(VALUE) ident(re)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content(/)delimiter(")>operator(\);) + + ident(rb_reg_expr_str)operator(()ident(str)operator(,) ident(s)operator(,) ident(len)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(/)delimiter(")>operator(\);) + reserved(if) operator(()ident(re)operator(\)) operator({) + ident(rb_reg_check)operator(()ident(re)operator(\);) + reserved(if) operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options) operator(&) ident(RE_OPTION_MULTILINE)operator(\)) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(m)delimiter(")>operator(\);) + reserved(if) operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(i)delimiter(")>operator(\);) + reserved(if) operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options) operator(&) ident(RE_OPTION_EXTENDED)operator(\)) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(x)delimiter(")>operator(\);) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) operator({) + reserved(switch) operator((()ident(RBASIC)operator(()ident(re)operator(\)->)ident(flags) operator(&) ident(KCODE_MASK)operator(\)\)) operator({) + reserved(case) label(KCODE_NONE)operator(:) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(n)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_EUC)operator(:) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(e)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_SJIS)operator(:) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(s)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_UTF8)operator(:) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(u)delimiter(")>operator(\);) + reserved(break)operator(;) + operator(}) + operator(}) + operator(}) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(re)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * rxp.source => str + * + * Returns the original string of the pattern. + * + * /ab+c/ix.source #=> "ab+c" + */) + +directive(static) ident(VALUE) +ident(rb_reg_source)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + ident(rb_reg_check)operator(()ident(re)operator(\);) + ident(str) operator(=) ident(rb_str_new)operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(,)ident(RREGEXP)operator(()ident(re)operator(\)->)ident(len)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(re)operator(\)\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * rxp.inspect => string + * + * Produce a nicely formatted string-version of _rxp_. Perhaps surprisingly, + * <code>#inspect</code> actually produces the more natural version of + * the string than <code>#to_s</code>. + * + * /ab+c/ix.to_s #=> /ab+c/ix +*/) + +directive(static) ident(VALUE) +ident(rb_reg_inspect)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + ident(rb_reg_check)operator(()ident(re)operator(\);) + reserved(return) ident(rb_reg_desc)operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(,) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(len)operator(,) ident(re)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * rxp.to_s => str + * + * Returns a string containing the regular expression and its options (using the + * <code>(?xxx:yyy\)</code> notation. This string can be fed back in to + * <code>Regexp::new</code> to a regular expression with the same semantics as + * the original. (However, <code>Regexp#==</code> may not return true when + * comparing the two, as the source of the regular expression itself may + * differ, as the example shows\). <code>Regexp#inspect</code> produces a + * generally more readable version of <i>rxp</i>. + * + * r1 = /ab+c/ix #=> /ab+c/ix + * s1 = r1.to_s #=> "(?ix-m:ab+c\)" + * r2 = Regexp.new(s1\) #=> /(?ix-m:ab+c\)/ + * r1 == r2 #=> false + * r1.source #=> "ab+c" + * r2.source #=> "(?ix-m:ab+c\)" + */) + +directive(static) ident(VALUE) +ident(rb_reg_to_s)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + pre_type(int) ident(options)operator(;) + directive(const) pre_type(int) ident(embeddable) operator(=) ident(RE_OPTION_MULTILINE)operator(|)ident(RE_OPTION_IGNORECASE)operator(|)ident(RE_OPTION_EXTENDED)operator(;) + pre_type(long) ident(len)operator(;) + directive(const) pre_type(char)operator(*) ident(ptr)operator(;) + ident(VALUE) ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content((?)delimiter(")>operator(\);) + + ident(rb_reg_check)operator(()ident(re)operator(\);) + + ident(options) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options)operator(;) + ident(ptr) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(;) + ident(len) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(len)operator(;) + label(again)operator(:) + reserved(if) operator(()ident(len) operator(>=) integer(4) operator(&&) ident(ptr)operator([)integer(0)operator(]) operator(==) char('(') operator(&&) ident(ptr)operator([)integer(1)operator(]) operator(==) char('?')operator(\)) operator({) + pre_type(int) ident(err) operator(=) integer(1)operator(;) + ident(ptr) operator(+=) integer(2)operator(;) + reserved(if) operator((()ident(len) operator(-=) integer(2)operator(\)) operator(>) integer(0)operator(\)) operator({) + reserved(do) operator({) + reserved(if) operator((*)ident(ptr) operator(==) char('m')operator(\)) operator({) + ident(options) operator(|=) ident(RE_OPTION_MULTILINE)operator(;) + operator(}) + reserved(else) reserved(if) operator((*)ident(ptr) operator(==) char('i')operator(\)) operator({) + ident(options) operator(|=) ident(RE_OPTION_IGNORECASE)operator(;) + operator(}) + reserved(else) reserved(if) operator((*)ident(ptr) operator(==) char('x')operator(\)) operator({) + ident(options) operator(|=) ident(RE_OPTION_EXTENDED)operator(;) + operator(}) + reserved(else) reserved(break)operator(;) + operator(++)ident(ptr)operator(;) + operator(}) reserved(while) operator((--)ident(len) operator(>) integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(len) operator(>) integer(1) operator(&&) operator(*)ident(ptr) operator(==) char('-')operator(\)) operator({) + operator(++)ident(ptr)operator(;) + operator(--)ident(len)operator(;) + reserved(do) operator({) + reserved(if) operator((*)ident(ptr) operator(==) char('m')operator(\)) operator({) + ident(options) operator(&=) operator(~)ident(RE_OPTION_MULTILINE)operator(;) + operator(}) + reserved(else) reserved(if) operator((*)ident(ptr) operator(==) char('i')operator(\)) operator({) + ident(options) operator(&=) operator(~)ident(RE_OPTION_IGNORECASE)operator(;) + operator(}) + reserved(else) reserved(if) operator((*)ident(ptr) operator(==) char('x')operator(\)) operator({) + ident(options) operator(&=) operator(~)ident(RE_OPTION_EXTENDED)operator(;) + operator(}) + reserved(else) reserved(break)operator(;) + operator(++)ident(ptr)operator(;) + operator(}) reserved(while) operator((--)ident(len) operator(>) integer(0)operator(\);) + operator(}) + reserved(if) operator((*)ident(ptr) operator(==) char('\)')operator(\)) operator({) + operator(--)ident(len)operator(;) + operator(++)ident(ptr)operator(;) + reserved(goto) ident(again)operator(;) + operator(}) + reserved(if) operator((*)ident(ptr) operator(==) char(':') operator(&&) ident(ptr)operator([)ident(len)operator(-)integer(1)operator(]) operator(==) char('\)')operator(\)) operator({) + ident(Regexp) operator(*)ident(rp)operator(;) + ident(rb_kcode_set_option)operator(()ident(re)operator(\);) + ident(rp) operator(=) ident(ALLOC)operator(()ident(Regexp)operator(\);) + ident(MEMZERO)operator((()pre_type(char) operator(*\))ident(rp)operator(,) ident(Regexp)operator(,) integer(1)operator(\);) + ident(err) operator(=) ident(re_compile_pattern)operator((++)ident(ptr)operator(,) ident(len) operator(-=) integer(2)operator(,) ident(rp)operator(\)) operator(!=) integer(0)operator(;) + ident(rb_kcode_reset_option)operator((\);) + ident(re_free_pattern)operator(()ident(rp)operator(\);) + operator(}) + reserved(if) operator(()ident(err)operator(\)) operator({) + ident(options) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options)operator(;) + ident(ptr) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(;) + ident(len) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(len)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()ident(options) operator(&) ident(RE_OPTION_MULTILINE)operator(\)) ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(m)delimiter(")>operator(\);) + reserved(if) operator(()ident(options) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(i)delimiter(")>operator(\);) + reserved(if) operator(()ident(options) operator(&) ident(RE_OPTION_EXTENDED)operator(\)) ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(x)delimiter(")>operator(\);) + + reserved(if) operator((()ident(options) operator(&) ident(embeddable)operator(\)) operator(!=) ident(embeddable)operator(\)) operator({) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(-)delimiter(")>operator(\);) + reserved(if) operator((!()ident(options) operator(&) ident(RE_OPTION_MULTILINE)operator(\)\)) ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(m)delimiter(")>operator(\);) + reserved(if) operator((!()ident(options) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)\)) ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(i)delimiter(")>operator(\);) + reserved(if) operator((!()ident(options) operator(&) ident(RE_OPTION_EXTENDED)operator(\)\)) ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(x)delimiter(")>operator(\);) + operator(}) + + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(:)delimiter(")>operator(\);) + ident(rb_reg_expr_str)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(str)operator(,) string<delimiter(")content(\))delimiter(")>operator(\);) + + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(re)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) directive(void) +ident(rb_reg_raise)operator(()ident(s)operator(,) ident(len)operator(,) ident(err)operator(,) ident(re)operator(\)) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) + directive(const) pre_type(char) operator(*)ident(err)operator(;) + ident(VALUE) ident(re)operator(;) +operator({) + ident(VALUE) ident(desc) operator(=) ident(rb_reg_desc)operator(()ident(s)operator(,) ident(len)operator(,) ident(re)operator(\);) + + reserved(if) operator(()ident(ruby_in_compile)operator(\)) + ident(rb_compile_error)operator(()string<delimiter(")content(%s: %s)delimiter(")>operator(,) ident(err)operator(,) ident(RSTRING)operator(()ident(desc)operator(\)->)ident(ptr)operator(\);) + reserved(else) + ident(rb_raise)operator(()ident(rb_eRegexpError)operator(,) string<delimiter(")content(%s: %s)delimiter(")>operator(,) ident(err)operator(,) ident(RSTRING)operator(()ident(desc)operator(\)->)ident(ptr)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * rxp.casefold? => true or false + * + * Returns the value of the case-insensitive flag. + */) + +directive(static) ident(VALUE) +ident(rb_reg_casefold_p)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + ident(rb_reg_check)operator(()ident(re)operator(\);) + reserved(if) operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * rxp.options => fixnum + * + * Returns the set of bits corresponding to the options used when creating this + * Regexp (see <code>Regexp::new</code> for details. Note that additional bits + * may be set in the returned options: these are used internally by the regular + * expression code. These extra bits are ignored if the options are passed to + * <code>Regexp::new</code>. + * + * Regexp::IGNORECASE #=> 1 + * Regexp::EXTENDED #=> 2 + * Regexp::MULTILINE #=> 4 + * + * /cat/.options #=> 128 + * /cat/ix.options #=> 131 + * Regexp.new('cat', true\).options #=> 129 + * Regexp.new('cat', 0, 's'\).options #=> 384 + * + * r = /cat/ix + * Regexp.new(r.source, r.options\) #=> /cat/ix + */) + +directive(static) ident(VALUE) +ident(rb_reg_options_m)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + pre_type(int) ident(options) operator(=) ident(rb_reg_options)operator(()ident(re)operator(\);) + reserved(return) ident(INT2NUM)operator(()ident(options)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * rxp.kcode => str + * + * Returns the character set code for the regexp. + */) + +directive(static) ident(VALUE) +ident(rb_reg_kcode_m)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + pre_type(char) operator(*)ident(kcode)operator(;) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) operator({) + reserved(switch) operator(()ident(RBASIC)operator(()ident(re)operator(\)->)ident(flags) operator(&) ident(KCODE_MASK)operator(\)) operator({) + reserved(case) label(KCODE_NONE)operator(:) + ident(kcode) operator(=) string<delimiter(")content(none)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) label(KCODE_EUC)operator(:) + ident(kcode) operator(=) string<delimiter(")content(euc)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) label(KCODE_SJIS)operator(:) + ident(kcode) operator(=) string<delimiter(")content(sjis)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) label(KCODE_UTF8)operator(:) + ident(kcode) operator(=) string<delimiter(")content(utf8)delimiter(")>operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_bug)operator(()string<delimiter(")content(unknown kcode - should not happen)delimiter(")>operator(\);) + reserved(break)operator(;) + operator(}) + reserved(return) ident(rb_str_new2)operator(()ident(kcode)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(Regexp)operator(*) +ident(make_regexp)operator(()ident(s)operator(,) ident(len)operator(,) ident(flags)operator(\)) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(flags)operator(;) +operator({) + ident(Regexp) operator(*)ident(rp)operator(;) + pre_type(char) operator(*)ident(err)operator(;) + + comment(/* Handle escaped characters first. */) + + comment(/* Build a copy of the string (in dest\) with the + escaped characters translated, and generate the regex + from that. + */) + + ident(rp) operator(=) ident(ALLOC)operator(()ident(Regexp)operator(\);) + ident(MEMZERO)operator((()pre_type(char) operator(*\))ident(rp)operator(,) ident(Regexp)operator(,) integer(1)operator(\);) + ident(rp)operator(->)ident(buffer) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,) integer(16)operator(\);) + ident(rp)operator(->)ident(allocated) operator(=) integer(16)operator(;) + ident(rp)operator(->)ident(fastmap) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,) integer(256)operator(\);) + reserved(if) operator(()ident(flags)operator(\)) operator({) + ident(rp)operator(->)ident(options) operator(=) ident(flags)operator(;) + operator(}) + ident(err) operator(=) ident(re_compile_pattern)operator(()ident(s)operator(,) ident(len)operator(,) ident(rp)operator(\);) + + reserved(if) operator(()ident(err) operator(!=) pre_constant(NULL)operator(\)) operator({) + ident(re_free_pattern)operator(()ident(rp)operator(\);) + ident(rb_reg_raise)operator(()ident(s)operator(,) ident(len)operator(,) ident(err)operator(,) integer(0)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + reserved(return) ident(rp)operator(;) +operator(}) + + +comment(/* + * Document-class: MatchData + * + * <code>MatchData</code> is the type of the special variable <code>$~</code>, + * and is the type of the object returned by <code>Regexp#match</code> and + * <code>Regexp#last_match</code>. It encapsulates all the results of a pattern + * match, results normally accessed through the special variables + * <code>$&</code>, <code>$'</code>, <code>$`</code>, <code>$1</code>, + * <code>$2</code>, and so on. <code>Matchdata</code> is also known as + * <code>MatchingData</code>. + * + */) + +ident(VALUE) ident(rb_cMatch)operator(;) + +directive(static) ident(VALUE) ident(match_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(match_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(match)operator(,) reserved(struct) ident(RMatch)operator(\);) + ident(OBJSETUP)operator(()ident(match)operator(,) ident(klass)operator(,) ident(T_MATCH)operator(\);) + + ident(match)operator(->)ident(str) operator(=) integer(0)operator(;) + ident(match)operator(->)ident(regs) operator(=) integer(0)operator(;) + ident(match)operator(->)ident(regs) operator(=) ident(ALLOC)operator(()reserved(struct) ident(re_registers)operator(\);) + ident(MEMZERO)operator(()ident(match)operator(->)ident(regs)operator(,) reserved(struct) ident(re_registers)operator(,) integer(1)operator(\);) + + reserved(return) operator(()ident(VALUE)operator(\))ident(match)operator(;) +operator(}) + +directive(static) directive(void) +ident(match_check)operator(()ident(VALUE) ident(match)operator(\)) +operator({) + reserved(if) operator((!)ident(RMATCH)operator(()ident(match)operator(\)->)ident(str)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(uninitialized Match)delimiter(")>operator(\);) + operator(}) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(match_init_copy)operator(()ident(obj)operator(,) ident(orig)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(orig)operator(;) +operator({) + reserved(if) operator(()ident(obj) operator(==) ident(orig)operator(\)) reserved(return) ident(obj)operator(;) + + reserved(if) operator((!)ident(rb_obj_is_instance_of)operator(()ident(orig)operator(,) ident(rb_obj_class)operator(()ident(obj)operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument class)delimiter(")>operator(\);) + operator(}) + ident(RMATCH)operator(()ident(obj)operator(\)->)ident(str) operator(=) ident(RMATCH)operator(()ident(orig)operator(\)->)ident(str)operator(;) + ident(re_free_registers)operator(()ident(RMATCH)operator(()ident(obj)operator(\)->)ident(regs)operator(\);) + ident(RMATCH)operator(()ident(obj)operator(\)->)ident(regs)operator(->)ident(allocated) operator(=) integer(0)operator(;) + ident(re_copy_registers)operator(()ident(RMATCH)operator(()ident(obj)operator(\)->)ident(regs)operator(,) ident(RMATCH)operator(()ident(orig)operator(\)->)ident(regs)operator(\);) + + reserved(return) ident(obj)operator(;) +operator(}) + + +comment(/* + * call-seq: + * mtch.length => integer + * mtch.size => integer + * + * Returns the number of elements in the match array. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\) + * m.length #=> 5 + * m.size #=> 5 + */) + +directive(static) ident(VALUE) +ident(match_size)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + ident(match_check)operator(()ident(match)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * mtch.offset(n\) => array + * + * Returns a two-element array containing the beginning and ending offsets of + * the <em>n</em>th match. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\) + * m.offset(0\) #=> [1, 7] + * m.offset(4\) #=> [6, 7] + */) + +directive(static) ident(VALUE) +ident(match_offset)operator(()ident(match)operator(,) ident(n)operator(\)) + ident(VALUE) ident(match)operator(,) ident(n)operator(;) +operator({) + pre_type(int) ident(i) operator(=) ident(NUM2INT)operator(()ident(n)operator(\);) + + ident(match_check)operator(()ident(match)operator(\);) + reserved(if) operator(()ident(i) operator(<) integer(0) operator(||) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs) operator(<=) ident(i)operator(\)) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %d out of matches)delimiter(")>operator(,) ident(i)operator(\);) + + reserved(if) operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(beg)operator([)ident(i)operator(]) operator(<) integer(0)operator(\)) + reserved(return) ident(rb_assoc_new)operator(()ident(Qnil)operator(,) ident(Qnil)operator(\);) + + reserved(return) ident(rb_assoc_new)operator(()ident(INT2FIX)operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(beg)operator([)ident(i)operator(]\),) + ident(INT2FIX)operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(end)operator([)ident(i)operator(]\)\);) +operator(}) + + +comment(/* + * call-seq: + * mtch.begin(n\) => integer + * + * Returns the offset of the start of the <em>n</em>th element of the match + * array in the string. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\) + * m.begin(0\) #=> 1 + * m.begin(2\) #=> 2 + */) + +directive(static) ident(VALUE) +ident(match_begin)operator(()ident(match)operator(,) ident(n)operator(\)) + ident(VALUE) ident(match)operator(,) ident(n)operator(;) +operator({) + pre_type(int) ident(i) operator(=) ident(NUM2INT)operator(()ident(n)operator(\);) + + ident(match_check)operator(()ident(match)operator(\);) + reserved(if) operator(()ident(i) operator(<) integer(0) operator(||) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs) operator(<=) ident(i)operator(\)) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %d out of matches)delimiter(")>operator(,) ident(i)operator(\);) + + reserved(if) operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(beg)operator([)ident(i)operator(]) operator(<) integer(0)operator(\)) + reserved(return) ident(Qnil)operator(;) + + reserved(return) ident(INT2FIX)operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(beg)operator([)ident(i)operator(]\);) +operator(}) + + +comment(/* + * call-seq: + * mtch.end(n\) => integer + * + * Returns the offset of the character immediately following the end of the + * <em>n</em>th element of the match array in the string. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\) + * m.end(0\) #=> 7 + * m.end(2\) #=> 3 + */) + +directive(static) ident(VALUE) +ident(match_end)operator(()ident(match)operator(,) ident(n)operator(\)) + ident(VALUE) ident(match)operator(,) ident(n)operator(;) +operator({) + pre_type(int) ident(i) operator(=) ident(NUM2INT)operator(()ident(n)operator(\);) + + ident(match_check)operator(()ident(match)operator(\);) + reserved(if) operator(()ident(i) operator(<) integer(0) operator(||) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs) operator(<=) ident(i)operator(\)) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %d out of matches)delimiter(")>operator(,) ident(i)operator(\);) + + reserved(if) operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(beg)operator([)ident(i)operator(]) operator(<) integer(0)operator(\)) + reserved(return) ident(Qnil)operator(;) + + reserved(return) ident(INT2FIX)operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(end)operator([)ident(i)operator(]\);) +operator(}) + +preprocessor(#define) ident(MATCH_BUSY) ident(FL_USER2) + +directive(void) +ident(rb_match_busy)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + ident(FL_SET)operator(()ident(match)operator(,) ident(MATCH_BUSY)operator(\);) +operator(}) + +pre_type(int) ident(ruby_ignorecase)operator(;) +directive(static) pre_type(int) ident(may_need_recompile)operator(;) + +directive(static) directive(void) +ident(rb_reg_prepare_re)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + pre_type(int) ident(need_recompile) operator(=) integer(0)operator(;) + pre_type(int) ident(state)operator(;) + + ident(rb_reg_check)operator(()ident(re)operator(\);) + ident(state) operator(=) ident(FL_TEST)operator(()ident(re)operator(,) ident(REG_CASESTATE)operator(\);) + comment(/* ignorecase status */) + reserved(if) operator(()ident(ruby_ignorecase) operator(&&) operator(!)ident(state)operator(\)) operator({) + ident(FL_SET)operator(()ident(re)operator(,) ident(REG_CASESTATE)operator(\);) + ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options) operator(|=) ident(RE_OPTION_IGNORECASE)operator(;) + ident(need_recompile) operator(=) integer(1)operator(;) + operator(}) + reserved(if) operator((!)ident(ruby_ignorecase) operator(&&) ident(state)operator(\)) operator({) + ident(FL_UNSET)operator(()ident(re)operator(,) ident(REG_CASESTATE)operator(\);) + ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options) operator(&=) operator(~)ident(RE_OPTION_IGNORECASE)operator(;) + ident(need_recompile) operator(=) integer(1)operator(;) + operator(}) + + reserved(if) operator((!)ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)) operator(&&) + operator(()ident(RBASIC)operator(()ident(re)operator(\)->)ident(flags) operator(&) ident(KCODE_MASK)operator(\)) operator(!=) ident(reg_kcode)operator(\)) operator({) + ident(need_recompile) operator(=) integer(1)operator(;) + ident(RBASIC)operator(()ident(re)operator(\)->)ident(flags) operator(&=) operator(~)ident(KCODE_MASK)operator(;) + ident(RBASIC)operator(()ident(re)operator(\)->)ident(flags) operator(|=) ident(reg_kcode)operator(;) + operator(}) + + reserved(if) operator(()ident(need_recompile)operator(\)) operator({) + pre_type(char) operator(*)ident(err)operator(;) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) + ident(rb_kcode_set_option)operator(()ident(re)operator(\);) + ident(rb_reg_check)operator(()ident(re)operator(\);) + ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(fastmap_accurate) operator(=) integer(0)operator(;) + ident(err) operator(=) ident(re_compile_pattern)operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(,) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(len)operator(,) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(\);) + reserved(if) operator(()ident(err) operator(!=) pre_constant(NULL)operator(\)) operator({) + ident(rb_reg_raise)operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(,) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(len)operator(,) ident(err)operator(,) ident(re)operator(\);) + operator(}) + operator(}) +operator(}) + +pre_type(long) +ident(rb_reg_adjust_startpos)operator(()ident(re)operator(,) ident(str)operator(,) ident(pos)operator(,) ident(reverse)operator(\)) + ident(VALUE) ident(re)operator(,) ident(str)operator(;) + pre_type(long) ident(pos)operator(,) ident(reverse)operator(;) +operator({) + pre_type(long) ident(range)operator(;) + + ident(rb_reg_check)operator(()ident(re)operator(\);) + reserved(if) operator(()ident(may_need_recompile)operator(\)) ident(rb_reg_prepare_re)operator(()ident(re)operator(\);) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) + ident(rb_kcode_set_option)operator(()ident(re)operator(\);) + reserved(else) reserved(if) operator(()ident(reg_kcode) operator(!=) ident(curr_kcode)operator(\)) + ident(rb_kcode_reset_option)operator((\);) + + reserved(if) operator(()ident(reverse)operator(\)) operator({) + ident(range) operator(=) operator(-)ident(pos)operator(;) + operator(}) + reserved(else) operator({) + ident(range) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(pos)operator(;) + operator(}) + reserved(return) ident(re_adjust_startpos)operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(,) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) + ident(pos)operator(,) ident(range)operator(\);) +operator(}) + +pre_type(long) +ident(rb_reg_search)operator(()ident(re)operator(,) ident(str)operator(,) ident(pos)operator(,) ident(reverse)operator(\)) + ident(VALUE) ident(re)operator(,) ident(str)operator(;) + pre_type(long) ident(pos)operator(,) ident(reverse)operator(;) +operator({) + pre_type(long) ident(result)operator(;) + ident(VALUE) ident(match)operator(;) + reserved(struct) ident(re_registers) ident(regs)operator(;) + pre_type(long) ident(range)operator(;) + + reserved(if) operator(()ident(pos) operator(>) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(||) ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(rb_backref_set)operator(()ident(Qnil)operator(\);) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + + ident(rb_reg_check)operator(()ident(re)operator(\);) + reserved(if) operator(()ident(may_need_recompile)operator(\)) ident(rb_reg_prepare_re)operator(()ident(re)operator(\);) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) + ident(rb_kcode_set_option)operator(()ident(re)operator(\);) + reserved(else) reserved(if) operator(()ident(reg_kcode) operator(!=) ident(curr_kcode)operator(\)) + ident(rb_kcode_reset_option)operator((\);) + + reserved(if) operator(()ident(reverse)operator(\)) operator({) + ident(range) operator(=) operator(-)ident(pos)operator(;) + operator(}) + reserved(else) operator({) + ident(range) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(pos)operator(;) + operator(}) + ident(MEMZERO)operator((&)ident(regs)operator(,) reserved(struct) ident(re_registers)operator(,) integer(1)operator(\);) + ident(result) operator(=) ident(re_search)operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(,)ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) + ident(pos)operator(,) ident(range)operator(,) operator(&)ident(regs)operator(\);) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) + ident(rb_kcode_reset_option)operator((\);) + + reserved(if) operator(()ident(result) operator(==) operator(-)integer(2)operator(\)) operator({) + ident(rb_reg_raise)operator(()ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(,) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(len)operator(,) + string<delimiter(")content(Stack overflow in regexp matcher)delimiter(")>operator(,) ident(re)operator(\);) + operator(}) + + reserved(if) operator(()ident(result) operator(<) integer(0)operator(\)) operator({) + ident(re_free_registers)operator((&)ident(regs)operator(\);) + ident(rb_backref_set)operator(()ident(Qnil)operator(\);) + reserved(return) ident(result)operator(;) + operator(}) + + ident(match) operator(=) ident(rb_backref_get)operator((\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(match)operator(\)) operator(||) ident(FL_TEST)operator(()ident(match)operator(,) ident(MATCH_BUSY)operator(\)\)) operator({) + ident(match) operator(=) ident(match_alloc)operator(()ident(rb_cMatch)operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(3)operator(\)) + ident(OBJ_TAINT)operator(()ident(match)operator(\);) + reserved(else) + ident(FL_UNSET)operator(()ident(match)operator(,) ident(FL_TAINT)operator(\);) + operator(}) + + ident(re_copy_registers)operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(,) operator(&)ident(regs)operator(\);) + ident(re_free_registers)operator((&)ident(regs)operator(\);) + ident(RMATCH)operator(()ident(match)operator(\)->)ident(str) operator(=) ident(rb_str_new4)operator(()ident(str)operator(\);) + ident(rb_backref_set)operator(()ident(match)operator(\);) + + ident(OBJ_INFECT)operator(()ident(match)operator(,) ident(re)operator(\);) + ident(OBJ_INFECT)operator(()ident(match)operator(,) ident(str)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + +ident(VALUE) +ident(rb_reg_nth_defined)operator(()ident(nth)operator(,) ident(match)operator(\)) + pre_type(int) ident(nth)operator(;) + ident(VALUE) ident(match)operator(;) +operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(match)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(match_check)operator(()ident(match)operator(\);) + reserved(if) operator(()ident(nth) operator(>=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(if) operator(()ident(nth) operator(<) integer(0)operator(\)) operator({) + ident(nth) operator(+=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(;) + reserved(if) operator(()ident(nth) operator(<=) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(if) operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(BEG)operator(()ident(nth)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +ident(VALUE) +ident(rb_reg_nth_match)operator(()ident(nth)operator(,) ident(match)operator(\)) + pre_type(int) ident(nth)operator(;) + ident(VALUE) ident(match)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + pre_type(long) ident(start)operator(,) ident(end)operator(,) ident(len)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(match)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(match_check)operator(()ident(match)operator(\);) + reserved(if) operator(()ident(nth) operator(>=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(if) operator(()ident(nth) operator(<) integer(0)operator(\)) operator({) + ident(nth) operator(+=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(;) + reserved(if) operator(()ident(nth) operator(<=) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + operator(}) + ident(start) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(BEG)operator(()ident(nth)operator(\);) + reserved(if) operator(()ident(start) operator(==) operator(-)integer(1)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(end) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(END)operator(()ident(nth)operator(\);) + ident(len) operator(=) ident(end) operator(-) ident(start)operator(;) + ident(str) operator(=) ident(rb_str_substr)operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(str)operator(,) ident(start)operator(,) ident(len)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(match)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_reg_last_match)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + reserved(return) ident(rb_reg_nth_match)operator(()integer(0)operator(,) ident(match)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * mtch.pre_match => str + * + * Returns the portion of the original string before the current match. + * Equivalent to the special variable <code>$`</code>. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\) + * m.pre_match #=> "T" + */) + +ident(VALUE) +ident(rb_reg_match_pre)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(match)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(match_check)operator(()ident(match)operator(\);) + reserved(if) operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(BEG)operator(()integer(0)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(str) operator(=) ident(rb_str_substr)operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(str)operator(,) integer(0)operator(,) ident(RMATCH)operator(()ident(match)operator(\)->)ident(BEG)operator(()integer(0)operator(\)\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(match)operator(\)\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * mtch.post_match => str + * + * Returns the portion of the original string after the current match. + * Equivalent to the special variable <code>$'</code>. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138: The Movie"\) + * m.post_match #=> ": The Movie" + */) + +ident(VALUE) +ident(rb_reg_match_post)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + pre_type(long) ident(pos)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(match)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(match_check)operator(()ident(match)operator(\);) + reserved(if) operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(BEG)operator(()integer(0)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(str) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(str)operator(;) + ident(pos) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(END)operator(()integer(0)operator(\);) + ident(str) operator(=) ident(rb_str_substr)operator(()ident(str)operator(,) ident(pos)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(pos)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(match)operator(\)\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_reg_match_last)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(match)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(match_check)operator(()ident(match)operator(\);) + reserved(if) operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(BEG)operator(()integer(0)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(return) ident(Qnil)operator(;) + + reserved(for) operator(()ident(i)operator(=)ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(-)integer(1)operator(;) ident(RMATCH)operator(()ident(match)operator(\)->)ident(BEG)operator(()ident(i)operator(\)) operator(==) operator(-)integer(1) operator(&&) ident(i) operator(>) integer(0)operator(;) ident(i)operator(--\)) + operator(;) + reserved(if) operator(()ident(i) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(rb_reg_nth_match)operator(()ident(i)operator(,) ident(match)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(last_match_getter)operator((\)) +operator({) + reserved(return) ident(rb_reg_last_match)operator(()ident(rb_backref_get)operator((\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(prematch_getter)operator((\)) +operator({) + reserved(return) ident(rb_reg_match_pre)operator(()ident(rb_backref_get)operator((\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(postmatch_getter)operator((\)) +operator({) + reserved(return) ident(rb_reg_match_post)operator(()ident(rb_backref_get)operator((\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(last_paren_match_getter)operator((\)) +operator({) + reserved(return) ident(rb_reg_match_last)operator(()ident(rb_backref_get)operator((\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(match_array)operator(()ident(match)operator(,) ident(start)operator(\)) + ident(VALUE) ident(match)operator(;) + pre_type(int) ident(start)operator(;) +operator({) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) + ident(VALUE) ident(ary)operator(;) + ident(VALUE) ident(target)operator(;) + pre_type(int) ident(i)operator(;) + pre_type(int) ident(taint) operator(=) ident(OBJ_TAINTED)operator(()ident(match)operator(\);) + + ident(match_check)operator(()ident(match)operator(\);) + ident(regs) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(;) + ident(ary) operator(=) ident(rb_ary_new2)operator(()ident(regs)operator(->)ident(num_regs)operator(\);) + ident(target) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(str)operator(;) + + reserved(for) operator(()ident(i)operator(=)ident(start)operator(;) ident(i)operator(<)ident(regs)operator(->)ident(num_regs)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(regs)operator(->)ident(beg)operator([)ident(i)operator(]) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(Qnil)operator(\);) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(str) operator(=) ident(rb_str_substr)operator(()ident(target)operator(,) ident(regs)operator(->)ident(beg)operator([)ident(i)operator(],) ident(regs)operator(->)ident(end)operator([)ident(i)operator(]-)ident(regs)operator(->)ident(beg)operator([)ident(i)operator(]\);) + reserved(if) operator(()ident(taint)operator(\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(str)operator(\);) + operator(}) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + + +comment(/* [MG]:FIXME: I put parens around the /.../.match(\) in the first line of the + second example to prevent the '*' followed by a '/' from ending the + comment. */) + +comment(/* + * call-seq: + * mtch.to_a => anArray + * + * Returns the array of matches. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\) + * m.to_a #=> ["HX1138", "H", "X", "113", "8"] + * + * Because <code>to_a</code> is called when expanding + * <code>*</code><em>variable</em>, there's a useful assignment + * shortcut for extracting matched fields. This is slightly slower than + * accessing the fields directly (as an intermediate array is + * generated\). + * + * all,f1,f2,f3 = *(/(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\)\) + * all #=> "HX1138" + * f1 #=> "H" + * f2 #=> "X" + * f3 #=> "113" + */) + +directive(static) ident(VALUE) +ident(match_to_a)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + reserved(return) ident(match_array)operator(()ident(match)operator(,) integer(0)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * mtch.captures => array + * + * Returns the array of captures; equivalent to <code>mtch.to_a[1..-1]</code>. + * + * f1,f2,f3,f4 = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\).captures + * f1 #=> "H" + * f2 #=> "X" + * f3 #=> "113" + * f4 #=> "8" + */) +directive(static) ident(VALUE) +ident(match_captures)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + reserved(return) ident(match_array)operator(()ident(match)operator(,) integer(1)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * mtch[i] => obj + * mtch[start, length] => array + * mtch[range] => array + * + * Match Reference---<code>MatchData</code> acts as an array, and may be + * accessed using the normal array indexing techniques. <i>mtch</i>[0] is + * equivalent to the special variable <code>$&</code>, and returns the entire + * matched string. <i>mtch</i>[1], <i>mtch</i>[2], and so on return the values + * of the matched backreferences (portions of the pattern between parentheses\). + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\) + * m[0] #=> "HX1138" + * m[1, 2] #=> ["H", "X"] + * m[1..3] #=> ["H", "X", "113"] + * m[-3, 2] #=> ["X", "113"] + */) + +directive(static) ident(VALUE) +ident(match_aref)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(match)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(match)operator(;) +operator({) + ident(VALUE) ident(idx)operator(,) ident(rest)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(idx)operator(,) operator(&)ident(rest)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(rest)operator(\)) operator(||) operator(!)ident(FIXNUM_P)operator(()ident(idx)operator(\)) operator(||) ident(FIX2INT)operator(()ident(idx)operator(\)) operator(<) integer(0)operator(\)) operator({) + reserved(return) ident(rb_ary_aref)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(match_to_a)operator(()ident(match)operator(\)\);) + operator(}) + reserved(return) ident(rb_reg_nth_match)operator(()ident(FIX2INT)operator(()ident(idx)operator(\),) ident(match)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(match_entry) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(\)\);) +directive(static) ident(VALUE) +ident(match_entry)operator(()ident(match)operator(,) ident(n)operator(\)) + ident(VALUE) ident(match)operator(;) + pre_type(long) ident(n)operator(;) +operator({) + reserved(return) ident(rb_reg_nth_match)operator(()ident(n)operator(,) ident(match)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * mtch.select([index]*\) => array + * + * Uses each <i>index</i> to access the matching values, returning an array of + * the corresponding matches. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138: The Movie"\) + * m.to_a #=> ["HX1138", "H", "X", "113", "8"] + * m.select(0, 2, -2\) #=> ["HX1138", "X", "113"] + */) + +directive(static) ident(VALUE) +ident(match_values_at)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(match)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(match)operator(;) +operator({) + ident(match_check)operator(()ident(match)operator(\);) + reserved(return) ident(rb_values_at)operator(()ident(match)operator(,) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(match_entry)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * mtch.select([index]*\) => array + * + * Uses each <i>index</i> to access the matching values, returning an + * array of the corresponding matches. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138: The Movie"\) + * m.to_a #=> ["HX1138", "H", "X", "113", "8"] + * m.select(0, 2, -2\) #=> ["HX1138", "X", "113"] + */) + +directive(static) ident(VALUE) +ident(match_select)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(match)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(match)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 0\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + reserved(else) operator({) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) + ident(VALUE) ident(target)operator(;) + ident(VALUE) ident(result) operator(=) ident(rb_ary_new)operator((\);) + pre_type(int) ident(i)operator(;) + pre_type(int) ident(taint) operator(=) ident(OBJ_TAINTED)operator(()ident(match)operator(\);) + + ident(match_check)operator(()ident(match)operator(\);) + ident(regs) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(;) + ident(target) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(str)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(regs)operator(->)ident(num_regs)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(str) operator(=) ident(rb_str_substr)operator(()ident(target)operator(,) ident(regs)operator(->)ident(beg)operator([)ident(i)operator(],) ident(regs)operator(->)ident(end)operator([)ident(i)operator(]-)ident(regs)operator(->)ident(beg)operator([)ident(i)operator(]\);) + reserved(if) operator(()ident(taint)operator(\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield)operator(()ident(str)operator(\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(str)operator(\);) + operator(}) + operator(}) + reserved(return) ident(result)operator(;) + operator(}) +operator(}) + + +comment(/* + * call-seq: + * mtch.to_s => str + * + * Returns the entire matched string. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\) + * m.to_s #=> "HX1138" + */) + +directive(static) ident(VALUE) +ident(match_to_s)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(rb_reg_last_match)operator(()ident(match)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(str)operator(\)\)) ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,)integer(0)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(match)operator(\)\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(RMATCH)operator(()ident(match)operator(\)->)ident(str)operator(\)\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * mtch.string => str + * + * Returns a frozen copy of the string passed in to <code>match</code>. + * + * m = /(.\)(.\)(\\d+\)(\\d\)/.match("THX1138."\) + * m.string #=> "THX1138." + */) + +directive(static) ident(VALUE) +ident(match_string)operator(()ident(match)operator(\)) + ident(VALUE) ident(match)operator(;) +operator({) + ident(match_check)operator(()ident(match)operator(\);) + reserved(return) ident(RMATCH)operator(()ident(match)operator(\)->)ident(str)operator(;) comment(/* str is frozen */) +operator(}) + +ident(VALUE) ident(rb_cRegexp)operator(;) + +directive(static) directive(void) +ident(rb_reg_initialize)operator(()ident(obj)operator(,) ident(s)operator(,) ident(len)operator(,) ident(options)operator(\)) + ident(VALUE) ident(obj)operator(;) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(options)operator(;) comment(/* CASEFOLD = 1 */) + comment(/* EXTENDED = 2 */) + comment(/* MULTILINE = 4 */) + comment(/* CODE_NONE = 16 */) + comment(/* CODE_EUC = 32 */) + comment(/* CODE_SJIS = 48 */) + comment(/* CODE_UTF8 = 64 */) +operator({) + reserved(struct) ident(RRegexp) operator(*)ident(re) operator(=) ident(RREGEXP)operator(()ident(obj)operator(\);) + + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(obj)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify regexp)delimiter(")>operator(\);) + ident(rb_check_frozen)operator(()ident(obj)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(REG_LITERAL)operator(\)\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(can't modify literal regexp)delimiter(")>operator(\);) + reserved(if) operator(()ident(re)operator(->)ident(ptr)operator(\)) ident(re_free_pattern)operator(()ident(re)operator(->)ident(ptr)operator(\);) + reserved(if) operator(()ident(re)operator(->)ident(str)operator(\)) ident(free)operator(()ident(re)operator(->)ident(str)operator(\);) + ident(re)operator(->)ident(ptr) operator(=) integer(0)operator(;) + ident(re)operator(->)ident(str) operator(=) integer(0)operator(;) + + reserved(switch) operator(()ident(options) operator(&) operator(~)hex(0xf)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(default)operator(:) + ident(FL_SET)operator(()ident(re)operator(,) ident(reg_kcode)operator(\);) + reserved(break)operator(;) + reserved(case) integer(16)operator(:) + ident(kcode_none)operator(()ident(re)operator(\);) + reserved(break)operator(;) + reserved(case) integer(32)operator(:) + ident(kcode_euc)operator(()ident(re)operator(\);) + reserved(break)operator(;) + reserved(case) integer(48)operator(:) + ident(kcode_sjis)operator(()ident(re)operator(\);) + reserved(break)operator(;) + reserved(case) integer(64)operator(:) + ident(kcode_utf8)operator(()ident(re)operator(\);) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(options) operator(&) operator(~)hex(0xf)operator(\)) operator({) + ident(rb_kcode_set_option)operator((()ident(VALUE)operator(\))ident(re)operator(\);) + operator(}) + reserved(if) operator(()ident(ruby_ignorecase)operator(\)) operator({) + ident(options) operator(|=) ident(RE_OPTION_IGNORECASE)operator(;) + ident(FL_SET)operator(()ident(re)operator(,) ident(REG_CASESTATE)operator(\);) + operator(}) + ident(re)operator(->)ident(ptr) operator(=) ident(make_regexp)operator(()ident(s)operator(,) ident(len)operator(,) ident(options) operator(&) hex(0xf)operator(\);) + ident(re)operator(->)ident(str) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,) ident(len)operator(+)integer(1)operator(\);) + ident(memcpy)operator(()ident(re)operator(->)ident(str)operator(,) ident(s)operator(,) ident(len)operator(\);) + ident(re)operator(->)ident(str)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) + ident(re)operator(->)ident(len) operator(=) ident(len)operator(;) + reserved(if) operator(()ident(options) operator(&) operator(~)hex(0xf)operator(\)) operator({) + ident(rb_kcode_reset_option)operator((\);) + operator(}) + reserved(if) operator(()ident(ruby_in_compile)operator(\)) ident(FL_SET)operator(()ident(obj)operator(,) ident(REG_LITERAL)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(rb_reg_s_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(rb_reg_s_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(re)operator(,) reserved(struct) ident(RRegexp)operator(\);) + ident(OBJSETUP)operator(()ident(re)operator(,) ident(klass)operator(,) ident(T_REGEXP)operator(\);) + + ident(re)operator(->)ident(ptr) operator(=) integer(0)operator(;) + ident(re)operator(->)ident(len) operator(=) integer(0)operator(;) + ident(re)operator(->)ident(str) operator(=) integer(0)operator(;) + + reserved(return) operator(()ident(VALUE)operator(\))ident(re)operator(;) +operator(}) + +ident(VALUE) +ident(rb_reg_new)operator(()ident(s)operator(,) ident(len)operator(,) ident(options)operator(\)) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(options)operator(;) +operator({) + ident(VALUE) ident(re) operator(=) ident(rb_reg_s_alloc)operator(()ident(rb_cRegexp)operator(\);) + + ident(rb_reg_initialize)operator(()ident(re)operator(,) ident(s)operator(,) ident(len)operator(,) ident(options)operator(\);) + reserved(return) operator(()ident(VALUE)operator(\))ident(re)operator(;) +operator(}) + +directive(static) pre_type(int) ident(case_cache)operator(;) +directive(static) pre_type(int) ident(kcode_cache)operator(;) +directive(static) ident(VALUE) ident(reg_cache)operator(;) + +ident(VALUE) +ident(rb_reg_regcomp)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(save_str) operator(=) ident(str)operator(;) + reserved(if) operator(()ident(reg_cache) operator(&&) ident(RREGEXP)operator(()ident(reg_cache)operator(\)->)ident(len) operator(==) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) + operator(&&) ident(case_cache) operator(==) ident(ruby_ignorecase) + operator(&&) ident(kcode_cache) operator(==) ident(reg_kcode) + operator(&&) ident(memcmp)operator(()ident(RREGEXP)operator(()ident(reg_cache)operator(\)->)ident(str)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(reg_cache)operator(;) + + ident(case_cache) operator(=) ident(ruby_ignorecase)operator(;) + ident(kcode_cache) operator(=) ident(reg_kcode)operator(;) + reserved(return) ident(reg_cache) operator(=) ident(rb_reg_new)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) + ident(ruby_ignorecase)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(rb_reg_cur_kcode)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) operator({) + reserved(return) ident(RBASIC)operator(()ident(re)operator(\)->)ident(flags) operator(&) ident(KCODE_MASK)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +comment(/* + * call-seq: + * rxp.hash => fixnum + * + * Produce a hash based on the text and options of this regular expression. + */) + +directive(static) ident(VALUE) +ident(rb_reg_hash)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + pre_type(int) ident(hashval)operator(,) ident(len)operator(;) + pre_type(char) operator(*)ident(p)operator(;) + + ident(rb_reg_check)operator(()ident(re)operator(\);) + ident(hashval) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options)operator(;) + ident(len) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(len)operator(;) + ident(p) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(;) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(hashval) operator(=) ident(hashval) operator(*) integer(33) operator(+) operator(*)ident(p)operator(++;) + operator(}) + ident(hashval) operator(=) ident(hashval) operator(+) operator(()ident(hashval)operator(>>)integer(5)operator(\);) + + reserved(return) ident(INT2FIX)operator(()ident(hashval)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * rxp == other_rxp => true or false + * rxp.eql?(other_rxp\) => true or false + * + * Equality---Two regexps are equal if their patterns are identical, they have + * the same character set code, and their <code>casefold?</code> values are the + * same. + * + * /abc/ == /abc/x #=> false + * /abc/ == /abc/i #=> false + * /abc/u == /abc/n #=> false + */) + +directive(static) ident(VALUE) +ident(rb_reg_equal)operator(()ident(re1)operator(,) ident(re2)operator(\)) + ident(VALUE) ident(re1)operator(,) ident(re2)operator(;) +operator({) + reserved(if) operator(()ident(re1) operator(==) ident(re2)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(re2)operator(\)) operator(!=) ident(T_REGEXP)operator(\)) reserved(return) ident(Qfalse)operator(;) + ident(rb_reg_check)operator(()ident(re1)operator(\);) ident(rb_reg_check)operator(()ident(re2)operator(\);) + reserved(if) operator(()ident(RREGEXP)operator(()ident(re1)operator(\)->)ident(len) operator(!=) ident(RREGEXP)operator(()ident(re2)operator(\)->)ident(len)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(memcmp)operator(()ident(RREGEXP)operator(()ident(re1)operator(\)->)ident(str)operator(,) ident(RREGEXP)operator(()ident(re2)operator(\)->)ident(str)operator(,) ident(RREGEXP)operator(()ident(re1)operator(\)->)ident(len)operator(\)) operator(==) integer(0) operator(&&) + ident(rb_reg_cur_kcode)operator(()ident(re1)operator(\)) operator(==) ident(rb_reg_cur_kcode)operator(()ident(re2)operator(\)) operator(&&) + ident(RREGEXP)operator(()ident(re1)operator(\)->)ident(ptr)operator(->)ident(options) operator(==) ident(RREGEXP)operator(()ident(re2)operator(\)->)ident(ptr)operator(->)ident(options)operator(\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + + +comment(/* + * call-seq: + * rxp.match(str\) => matchdata or nil + * + * Returns a <code>MatchData</code> object describing the match, or + * <code>nil</code> if there was no match. This is equivalent to retrieving the + * value of the special variable <code>$~</code> following a normal match. + * + * /(.\)(.\)(.\)/.match("abc"\)[2] #=> "b" + */) + +ident(VALUE) +ident(rb_reg_match)operator(()ident(re)operator(,) ident(str)operator(\)) + ident(VALUE) ident(re)operator(,) ident(str)operator(;) +operator({) + pre_type(long) ident(start)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(rb_backref_set)operator(()ident(Qnil)operator(\);) + reserved(return) ident(Qnil)operator(;) + operator(}) + ident(StringValue)operator(()ident(str)operator(\);) + ident(start) operator(=) ident(rb_reg_search)operator(()ident(re)operator(,) ident(str)operator(,) integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(start) operator(<) integer(0)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(LONG2FIX)operator(()ident(start)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * rxp === str => true or false + * + * Case Equality---Synonym for <code>Regexp#=~</code> used in case statements. + * + * a = "HELLO" + * case a + * when /^[a-z]*$/; print "Lower case\\n" + * when /^[A-Z]*$/; print "Upper case\\n" + * else; print "Mixed case\\n" + * end + * + * <em>produces:</em> + * + * Upper case + */) + +ident(VALUE) +ident(rb_reg_eqq)operator(()ident(re)operator(,) ident(str)operator(\)) + ident(VALUE) ident(re)operator(,) ident(str)operator(;) +operator({) + pre_type(long) ident(start)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(str)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + ident(str) operator(=) ident(rb_check_string_type)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(rb_backref_set)operator(()ident(Qnil)operator(\);) + reserved(return) ident(Qfalse)operator(;) + operator(}) + operator(}) + ident(StringValue)operator(()ident(str)operator(\);) + ident(start) operator(=) ident(rb_reg_search)operator(()ident(re)operator(,) ident(str)operator(,) integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(start) operator(<) integer(0)operator(\)) operator({) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(Qtrue)operator(;) +operator(}) + + +comment(/* + * call-seq: + * ~ rxp => integer or nil + * + * Match---Matches <i>rxp</i> against the contents of <code>$_</code>. + * Equivalent to <code><i>rxp</i> =~ $_</code>. + * + * $_ = "input data" + * ~ /at/ #=> 7 + */) + +ident(VALUE) +ident(rb_reg_match2)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + pre_type(long) ident(start)operator(;) + ident(VALUE) ident(line) operator(=) ident(rb_lastline_get)operator((\);) + + reserved(if) operator(()ident(TYPE)operator(()ident(line)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + ident(rb_backref_set)operator(()ident(Qnil)operator(\);) + reserved(return) ident(Qnil)operator(;) + operator(}) + + ident(start) operator(=) ident(rb_reg_search)operator(()ident(re)operator(,) ident(line)operator(,) integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(start) operator(<) integer(0)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(LONG2FIX)operator(()ident(start)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * rxp.match(str\) => matchdata or nil + * + * Returns a <code>MatchData</code> object describing the match, or + * <code>nil</code> if there was no match. This is equivalent to retrieving the + * value of the special variable <code>$~</code> following a normal match. + * + * /(.\)(.\)(.\)/.match("abc"\)[2] #=> "b" + */) + +directive(static) ident(VALUE) +ident(rb_reg_match_m)operator(()ident(re)operator(,) ident(str)operator(\)) + ident(VALUE) ident(re)operator(,) ident(str)operator(;) +operator({) + ident(VALUE) ident(result) operator(=) ident(rb_reg_match)operator(()ident(re)operator(,) ident(str)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(result)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(result) operator(=) ident(rb_backref_get)operator((\);) + ident(rb_match_busy)operator(()ident(result)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * Document-method: compile + * + * Synonym for <code>Regexp.new</code> + */) + +comment(/* + * call-seq: + * Regexp.new(string [, options [, lang]]\) => regexp + * Regexp.new(regexp\) => regexp + * Regexp.compile(string [, options [, lang]]\) => regexp + * Regexp.compile(regexp\) => regexp + * + * Constructs a new regular expression from <i>pattern</i>, which can be either + * a <code>String</code> or a <code>Regexp</code> (in which case that regexp's + * options are propagated, and new options may not be specified (a change as of + * Ruby 1.8\). If <i>options</i> is a <code>Fixnum</code>, it should be one or + * more of the constants <code>Regexp::EXTENDED</code>, + * <code>Regexp::IGNORECASE</code>, and <code>Regexp::MULTILINE</code>, + * <em>or</em>-ed together. Otherwise, if <i>options</i> is not + * <code>nil</code>, the regexp will be case insensitive. The <i>lang</i> + * parameter enables multibyte support for the regexp: `n', `N' = none, `e', + * `E' = EUC, `s', `S' = SJIS, `u', `U' = UTF-8. + * + * r1 = Regexp.new('^a-z+:\\\\s+\\w+'\) #=> /^a-z+:\\s+\\w+/ + * r2 = Regexp.new('cat', true\) #=> /cat/i + * r3 = Regexp.new('dog', Regexp::EXTENDED\) #=> /dog/x + * r4 = Regexp.new(r2\) #=> /cat/i + */) + +directive(static) ident(VALUE) +ident(rb_reg_initialize_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(flags) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0) operator(||) ident(argc) operator(>) integer(3)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_REGEXP)operator(\)) operator({) + reserved(if) operator(()ident(argc) operator(>) integer(1)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(flags%s ignored)delimiter(")>operator(,) operator(()ident(argc) operator(==) integer(3)operator(\)) operator(?) string<delimiter(")content( and encoding)delimiter(")>operator(:) string<delimiter(")delimiter(")>operator(\);) + operator(}) + ident(rb_reg_check)operator(()ident(argv)operator([)integer(0)operator(]\);) + ident(flags) operator(=) ident(RREGEXP)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator(->)ident(options) operator(&) hex(0xf)operator(;) + reserved(if) operator(()ident(FL_TEST)operator(()ident(argv)operator([)integer(0)operator(],) ident(KCODE_FIXED)operator(\)\)) operator({) + reserved(switch) operator(()ident(RBASIC)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(flags) operator(&) ident(KCODE_MASK)operator(\)) operator({) + reserved(case) label(KCODE_NONE)operator(:) + ident(flags) operator(|=) integer(16)operator(;) + reserved(break)operator(;) + reserved(case) label(KCODE_EUC)operator(:) + ident(flags) operator(|=) integer(32)operator(;) + reserved(break)operator(;) + reserved(case) label(KCODE_SJIS)operator(:) + ident(flags) operator(|=) integer(48)operator(;) + reserved(break)operator(;) + reserved(case) label(KCODE_UTF8)operator(:) + ident(flags) operator(|=) integer(64)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + ident(s) operator(=) ident(RREGEXP)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(str)operator(;) + ident(len) operator(=) ident(RREGEXP)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(len)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(argc) operator(>=) integer(2)operator(\)) operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(argv)operator([)integer(1)operator(]\)\)) ident(flags) operator(=) ident(FIX2INT)operator(()ident(argv)operator([)integer(1)operator(]\);) + reserved(else) reserved(if) operator(()ident(RTEST)operator(()ident(argv)operator([)integer(1)operator(]\)\)) ident(flags) operator(=) ident(RE_OPTION_IGNORECASE)operator(;) + operator(}) + reserved(if) operator(()ident(argc) operator(==) integer(3) operator(&&) operator(!)ident(NIL_P)operator(()ident(argv)operator([)integer(2)operator(]\)\)) operator({) + pre_type(char) operator(*)ident(kcode) operator(=) ident(StringValuePtr)operator(()ident(argv)operator([)integer(2)operator(]\);) + + ident(flags) operator(&=) operator(~)hex(0x70)operator(;) + reserved(switch) operator(()ident(kcode)operator([)integer(0)operator(]\)) operator({) + reserved(case) char('n')operator(:) reserved(case) char('N')operator(:) + ident(flags) operator(|=) integer(16)operator(;) + reserved(break)operator(;) + reserved(case) char('e')operator(:) reserved(case) char('E')operator(:) + ident(flags) operator(|=) integer(32)operator(;) + reserved(break)operator(;) + reserved(case) char('s')operator(:) reserved(case) char('S')operator(:) + ident(flags) operator(|=) integer(48)operator(;) + reserved(break)operator(;) + reserved(case) char('u')operator(:) reserved(case) char('U')operator(:) + ident(flags) operator(|=) integer(64)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + ident(s) operator(=) ident(StringValuePtr)operator(()ident(argv)operator([)integer(0)operator(]\);) + ident(len) operator(=) ident(RSTRING)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(len)operator(;) + operator(}) + ident(rb_reg_initialize)operator(()ident(self)operator(,) ident(s)operator(,) ident(len)operator(,) ident(flags)operator(\);) + reserved(return) ident(self)operator(;) +operator(}) + +ident(VALUE) +ident(rb_reg_quote)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(,) operator(*)ident(t)operator(;) + ident(VALUE) ident(tmp)operator(;) + pre_type(int) ident(c)operator(;) + + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(for) operator((;) ident(s) operator(<) ident(send)operator(;) ident(s)operator(++\)) operator({) + ident(c) operator(=) operator(*)ident(s)operator(;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + pre_type(int) ident(n) operator(=) ident(mbclen)operator(()ident(c)operator(\);) + + reserved(while) operator(()ident(n)operator(--) operator(&&) ident(s) operator(<) ident(send)operator(\)) + ident(s)operator(++;) + ident(s)operator(--;) + reserved(continue)operator(;) + operator(}) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('[')operator(:) reserved(case) char(']')operator(:) reserved(case) char('{')operator(:) reserved(case) char('}')operator(:) + reserved(case) char('(')operator(:) reserved(case) char('\)')operator(:) reserved(case) char('|')operator(:) reserved(case) char('-')operator(:) + reserved(case) char('*')operator(:) reserved(case) char('.')operator(:) reserved(case) char('\\\\')operator(:) + reserved(case) char('?')operator(:) reserved(case) char('+')operator(:) reserved(case) char('^')operator(:) reserved(case) char('$')operator(:) + reserved(case) char(' ')operator(:) reserved(case) char('#')operator(:) + reserved(case) char('\\t')operator(:) reserved(case) char('\\f')operator(:) reserved(case) char('\\n')operator(:) reserved(case) char('\\r')operator(:) + reserved(goto) ident(meta_found)operator(;) + operator(}) + operator(}) + reserved(return) ident(rb_str_new3)operator(()ident(str)operator(\);) + + label(meta_found)operator(:) + ident(tmp) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(*)integer(2)operator(\);) + ident(t) operator(=) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(;) + comment(/* copy upto metacharacter */) + ident(memcpy)operator(()ident(t)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(s) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(t) operator(+=) ident(s) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + + reserved(for) operator((;) ident(s) operator(<) ident(send)operator(;) ident(s)operator(++\)) operator({) + ident(c) operator(=) operator(*)ident(s)operator(;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + pre_type(int) ident(n) operator(=) ident(mbclen)operator(()ident(c)operator(\);) + + reserved(while) operator(()ident(n)operator(--) operator(&&) ident(s) operator(<) ident(send)operator(\)) + operator(*)ident(t)operator(++) operator(=) operator(*)ident(s)operator(++;) + ident(s)operator(--;) + reserved(continue)operator(;) + operator(}) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('[')operator(:) reserved(case) char(']')operator(:) reserved(case) char('{')operator(:) reserved(case) char('}')operator(:) + reserved(case) char('(')operator(:) reserved(case) char('\)')operator(:) reserved(case) char('|')operator(:) reserved(case) char('-')operator(:) + reserved(case) char('*')operator(:) reserved(case) char('.')operator(:) reserved(case) char('\\\\')operator(:) + reserved(case) char('?')operator(:) reserved(case) char('+')operator(:) reserved(case) char('^')operator(:) reserved(case) char('$')operator(:) + reserved(case) char('#')operator(:) + operator(*)ident(t)operator(++) operator(=) char('\\\\')operator(;) + reserved(break)operator(;) + reserved(case) char(' ')operator(:) + operator(*)ident(t)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(t)operator(++) operator(=) char(' ')operator(;) + reserved(continue)operator(;) + reserved(case) char('\\t')operator(:) + operator(*)ident(t)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(t)operator(++) operator(=) char('t')operator(;) + reserved(continue)operator(;) + reserved(case) char('\\n')operator(:) + operator(*)ident(t)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(t)operator(++) operator(=) char('n')operator(;) + reserved(continue)operator(;) + reserved(case) char('\\r')operator(:) + operator(*)ident(t)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(t)operator(++) operator(=) char('r')operator(;) + reserved(continue)operator(;) + reserved(case) char('\\f')operator(:) + operator(*)ident(t)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(t)operator(++) operator(=) char('f')operator(;) + reserved(continue)operator(;) + operator(}) + operator(*)ident(t)operator(++) operator(=) ident(c)operator(;) + operator(}) + ident(rb_str_resize)operator(()ident(tmp)operator(,) ident(t) operator(-) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(\);) + ident(OBJ_INFECT)operator(()ident(tmp)operator(,) ident(str)operator(\);) + reserved(return) ident(tmp)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Regexp.escape(str\) => a_str + * Regexp.quote(str\) => a_str + * + * Escapes any characters that would have special meaning in a regular + * expression. Returns a new escaped string, or self if no characters are + * escaped. For any string, + * <code>Regexp.escape(<i>str</i>\)=~<i>str</i></code> will be true. + * + * Regexp.escape('\\\\*?{}.'\) #=> \\\\\\\\\\*\\?\\{\\}\\. + */) + +directive(static) ident(VALUE) +ident(rb_reg_s_quote)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(str)operator(,) ident(kcode)operator(;) + pre_type(int) ident(kcode_saved) operator(=) ident(reg_kcode)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(str)operator(,) operator(&)ident(kcode)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(kcode)operator(\)\)) operator({) + ident(rb_set_kcode)operator(()ident(StringValuePtr)operator(()ident(kcode)operator(\)\);) + ident(curr_kcode) operator(=) ident(reg_kcode)operator(;) + ident(reg_kcode) operator(=) ident(kcode_saved)operator(;) + operator(}) + ident(StringValue)operator(()ident(str)operator(\);) + ident(str) operator(=) ident(rb_reg_quote)operator(()ident(str)operator(\);) + ident(rb_kcode_reset_option)operator((\);) + reserved(return) ident(str)operator(;) +operator(}) + +pre_type(int) +ident(rb_kcode)operator((\)) +operator({) + reserved(switch) operator(()ident(reg_kcode)operator(\)) operator({) + reserved(case) label(KCODE_EUC)operator(:) + reserved(return) ident(MBCTYPE_EUC)operator(;) + reserved(case) label(KCODE_SJIS)operator(:) + reserved(return) ident(MBCTYPE_SJIS)operator(;) + reserved(case) label(KCODE_UTF8)operator(:) + reserved(return) ident(MBCTYPE_UTF8)operator(;) + reserved(case) label(KCODE_NONE)operator(:) + reserved(return) ident(MBCTYPE_ASCII)operator(;) + operator(}) + ident(rb_bug)operator(()string<delimiter(")content(wrong reg_kcode value (0x%x\))delimiter(")>operator(,) ident(reg_kcode)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(rb_reg_get_kcode)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + reserved(switch) operator(()ident(RBASIC)operator(()ident(re)operator(\)->)ident(flags) operator(&) ident(KCODE_MASK)operator(\)) operator({) + reserved(case) label(KCODE_NONE)operator(:) + reserved(return) integer(16)operator(;) + reserved(case) label(KCODE_EUC)operator(:) + reserved(return) integer(32)operator(;) + reserved(case) label(KCODE_SJIS)operator(:) + reserved(return) integer(48)operator(;) + reserved(case) label(KCODE_UTF8)operator(:) + reserved(return) integer(64)operator(;) + reserved(default)operator(:) + reserved(return) integer(0)operator(;) + operator(}) +operator(}) + +pre_type(int) +ident(rb_reg_options)operator(()ident(re)operator(\)) + ident(VALUE) ident(re)operator(;) +operator({) + pre_type(int) ident(options)operator(;) + + ident(rb_reg_check)operator(()ident(re)operator(\);) + ident(options) operator(=) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(ptr)operator(->)ident(options) operator(&) + operator(()ident(RE_OPTION_IGNORECASE)operator(|)ident(RE_OPTION_MULTILINE)operator(|)ident(RE_OPTION_EXTENDED)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(re)operator(,) ident(KCODE_FIXED)operator(\)\)) operator({) + ident(options) operator(|=) ident(rb_reg_get_kcode)operator(()ident(re)operator(\);) + operator(}) + reserved(return) ident(options)operator(;) +operator(}) + + +comment(/* + * call-seq: + * Regexp.union([pattern]*\) => new_str + * + * Return a <code>Regexp</code> object that is the union of the given + * <em>pattern</em>s, i.e., will match any of its parts. The <em>pattern</em>s + * can be Regexp objects, in which case their options will be preserved, or + * Strings. If no arguments are given, returns <code>/(?!\)/</code>. + * + * Regexp.union #=> /(?!\)/ + * Regexp.union("penzance"\) #=> /penzance/ + * Regexp.union("skiing", "sledding"\) #=> /skiing|sledding/ + * Regexp.union(/dogs/, /cats/i\) #=> /(?-mix:dogs\)|(?i-mx:cats\)/ + */) +directive(static) ident(VALUE) +ident(rb_reg_s_union)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(VALUE) ident(args)operator([)integer(1)operator(];) + ident(args)operator([)integer(0)operator(]) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content((?!\))delimiter(")>operator(\);) + reserved(return) ident(rb_class_new_instance)operator(()integer(1)operator(,) ident(args)operator(,) ident(rb_cRegexp)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(VALUE) ident(v)operator(;) + ident(v) operator(=) ident(rb_check_convert_type)operator(()ident(argv)operator([)integer(0)operator(],) ident(T_REGEXP)operator(,) string<delimiter(")content(Regexp)delimiter(")>operator(,) string<delimiter(")content(to_regexp)delimiter(")>operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(v)operator(\)\)) + reserved(return) ident(v)operator(;) + reserved(else) operator({) + ident(VALUE) ident(args)operator([)integer(1)operator(];) + ident(args)operator([)integer(0)operator(]) operator(=) ident(rb_reg_s_quote)operator(()ident(argc)operator(,) ident(argv)operator(\);) + reserved(return) ident(rb_class_new_instance)operator(()integer(1)operator(,) ident(args)operator(,) ident(rb_cRegexp)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + pre_type(int) ident(i)operator(,) ident(kcode) operator(=) operator(-)integer(1)operator(;) + ident(VALUE) ident(kcode_re) operator(=) ident(Qnil)operator(;) + ident(VALUE) ident(source) operator(=) ident(rb_str_buf_new)operator(()integer(0)operator(\);) + ident(VALUE) ident(args)operator([)integer(3)operator(];) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(argc)operator(;) ident(i)operator(++\)) operator({) + directive(volatile) ident(VALUE) ident(v)operator(;) + reserved(if) operator(()integer(0) operator(<) ident(i)operator(\)) + ident(rb_str_buf_cat2)operator(()ident(source)operator(,) string<delimiter(")content(|)delimiter(")>operator(\);) + ident(v) operator(=) ident(rb_check_convert_type)operator(()ident(argv)operator([)ident(i)operator(],) ident(T_REGEXP)operator(,) string<delimiter(")content(Regexp)delimiter(")>operator(,) string<delimiter(")content(to_regexp)delimiter(")>operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(v)operator(\)\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(v)operator(,) ident(KCODE_FIXED)operator(\)\)) operator({) + reserved(if) operator(()ident(kcode) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(kcode_re) operator(=) ident(v)operator(;) + ident(kcode) operator(=) ident(RBASIC)operator(()ident(v)operator(\)->)ident(flags) operator(&) ident(KCODE_MASK)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(RBASIC)operator(()ident(v)operator(\)->)ident(flags) operator(&) ident(KCODE_MASK)operator(\)) operator(!=) ident(kcode)operator(\)) operator({) + directive(volatile) ident(VALUE) ident(str1)operator(,) ident(str2)operator(;) + ident(str1) operator(=) ident(rb_inspect)operator(()ident(kcode_re)operator(\);) + ident(str2) operator(=) ident(rb_inspect)operator(()ident(v)operator(\);) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(mixed kcode: %s and %s)delimiter(")>operator(,) + ident(RSTRING)operator(()ident(str1)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(\);) + operator(}) + operator(}) + ident(v) operator(=) ident(rb_reg_to_s)operator(()ident(v)operator(\);) + operator(}) + reserved(else) operator({) + ident(args)operator([)integer(0)operator(]) operator(=) ident(argv)operator([)ident(i)operator(];) + ident(v) operator(=) ident(rb_reg_s_quote)operator(()integer(1)operator(,) ident(args)operator(\);) + operator(}) + ident(rb_str_buf_append)operator(()ident(source)operator(,) ident(v)operator(\);) + operator(}) + ident(args)operator([)integer(0)operator(]) operator(=) ident(source)operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(Qnil)operator(;) + reserved(switch) operator(()ident(kcode)operator(\)) operator({) + reserved(case) operator(-)integer(1)operator(:) + ident(args)operator([)integer(2)operator(]) operator(=) ident(Qnil)operator(;) + reserved(break)operator(;) + reserved(case) label(KCODE_NONE)operator(:) + ident(args)operator([)integer(2)operator(]) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(n)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_EUC)operator(:) + ident(args)operator([)integer(2)operator(]) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(e)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_SJIS)operator(:) + ident(args)operator([)integer(2)operator(]) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(s)delimiter(")>operator(\);) + reserved(break)operator(;) + reserved(case) label(KCODE_UTF8)operator(:) + ident(args)operator([)integer(2)operator(]) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(u)delimiter(")>operator(\);) + reserved(break)operator(;) + operator(}) + reserved(return) ident(rb_class_new_instance)operator(()integer(3)operator(,) ident(args)operator(,) ident(rb_cRegexp)operator(\);) + operator(}) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(rb_reg_init_copy)operator(()ident(copy)operator(,) ident(re)operator(\)) + ident(VALUE) ident(copy)operator(,) ident(re)operator(;) +operator({) + reserved(if) operator(()ident(copy) operator(==) ident(re)operator(\)) reserved(return) ident(copy)operator(;) + ident(rb_check_frozen)operator(()ident(copy)operator(\);) + comment(/* need better argument type check */) + reserved(if) operator((!)ident(rb_obj_is_instance_of)operator(()ident(re)operator(,) ident(rb_obj_class)operator(()ident(copy)operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type)delimiter(")>operator(\);) + operator(}) + ident(rb_reg_check)operator(()ident(re)operator(\);) + ident(rb_reg_initialize)operator(()ident(copy)operator(,) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(str)operator(,) ident(RREGEXP)operator(()ident(re)operator(\)->)ident(len)operator(,) + ident(rb_reg_options)operator(()ident(re)operator(\)\);) + reserved(return) ident(copy)operator(;) +operator(}) + +ident(VALUE) +ident(rb_reg_regsub)operator(()ident(str)operator(,) ident(src)operator(,) ident(regs)operator(\)) + ident(VALUE) ident(str)operator(,) ident(src)operator(;) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) +operator({) + ident(VALUE) ident(val) operator(=) integer(0)operator(;) + pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(s)operator(,) operator(*)ident(e)operator(,) ident(c)operator(;) + pre_type(int) ident(no)operator(;) + + ident(p) operator(=) ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(e) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + + reserved(while) operator(()ident(s) operator(<) ident(e)operator(\)) operator({) + pre_type(char) operator(*)ident(ss) operator(=) ident(s)operator(;) + + ident(c) operator(=) operator(*)ident(s)operator(++;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + ident(s) operator(+=) ident(mbclen)operator(()ident(c)operator(\)) operator(-) integer(1)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(!=) char('\\\\') operator(||) ident(s) operator(==) ident(e)operator(\)) reserved(continue)operator(;) + + reserved(if) operator((!)ident(val)operator(\)) operator({) + ident(val) operator(=) ident(rb_str_buf_new)operator(()ident(ss)operator(-)ident(p)operator(\);) + ident(rb_str_buf_cat)operator(()ident(val)operator(,) ident(p)operator(,) ident(ss)operator(-)ident(p)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_buf_cat)operator(()ident(val)operator(,) ident(p)operator(,) ident(ss)operator(-)ident(p)operator(\);) + operator(}) + + ident(c) operator(=) operator(*)ident(s)operator(++;) + ident(p) operator(=) ident(s)operator(;) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('0')operator(:) reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) reserved(case) char('4')operator(:) + reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) reserved(case) char('7')operator(:) reserved(case) char('8')operator(:) reserved(case) char('9')operator(:) + ident(no) operator(=) ident(c) operator(-) char('0')operator(;) + reserved(break)operator(;) + reserved(case) char('&')operator(:) + ident(no) operator(=) integer(0)operator(;) + reserved(break)operator(;) + + reserved(case) char('`')operator(:) + ident(rb_str_buf_cat)operator(()ident(val)operator(,) ident(RSTRING)operator(()ident(src)operator(\)->)ident(ptr)operator(,) ident(BEG)operator(()integer(0)operator(\)\);) + reserved(continue)operator(;) + + reserved(case) char('\\'')operator(:) + ident(rb_str_buf_cat)operator(()ident(val)operator(,) ident(RSTRING)operator(()ident(src)operator(\)->)ident(ptr)operator(+)ident(END)operator(()integer(0)operator(\),) ident(RSTRING)operator(()ident(src)operator(\)->)ident(len)operator(-)ident(END)operator(()integer(0)operator(\)\);) + reserved(continue)operator(;) + + reserved(case) char('+')operator(:) + ident(no) operator(=) ident(regs)operator(->)ident(num_regs)operator(-)integer(1)operator(;) + reserved(while) operator(()ident(BEG)operator(()ident(no)operator(\)) operator(==) operator(-)integer(1) operator(&&) ident(no) operator(>) integer(0)operator(\)) ident(no)operator(--;) + reserved(if) operator(()ident(no) operator(==) integer(0)operator(\)) reserved(continue)operator(;) + reserved(break)operator(;) + + reserved(case) char('\\\\')operator(:) + ident(rb_str_buf_cat)operator(()ident(val)operator(,) ident(s)operator(-)integer(1)operator(,) integer(1)operator(\);) + reserved(continue)operator(;) + + reserved(default)operator(:) + ident(rb_str_buf_cat)operator(()ident(val)operator(,) ident(s)operator(-)integer(2)operator(,) integer(2)operator(\);) + reserved(continue)operator(;) + operator(}) + + reserved(if) operator(()ident(no) operator(>=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(no) operator(>=) ident(regs)operator(->)ident(num_regs)operator(\)) reserved(continue)operator(;) + reserved(if) operator(()ident(BEG)operator(()ident(no)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(continue)operator(;) + ident(rb_str_buf_cat)operator(()ident(val)operator(,) ident(RSTRING)operator(()ident(src)operator(\)->)ident(ptr)operator(+)ident(BEG)operator(()ident(no)operator(\),) ident(END)operator(()ident(no)operator(\)-)ident(BEG)operator(()ident(no)operator(\)\);) + operator(}) + operator(}) + + reserved(if) operator(()ident(p) operator(<) ident(e)operator(\)) operator({) + reserved(if) operator((!)ident(val)operator(\)) operator({) + ident(val) operator(=) ident(rb_str_buf_new)operator(()ident(e)operator(-)ident(p)operator(\);) + ident(rb_str_buf_cat)operator(()ident(val)operator(,) ident(p)operator(,) ident(e)operator(-)ident(p)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_buf_cat)operator(()ident(val)operator(,) ident(p)operator(,) ident(e)operator(-)ident(p)operator(\);) + operator(}) + operator(}) + reserved(if) operator((!)ident(val)operator(\)) reserved(return) ident(str)operator(;) + + reserved(return) ident(val)operator(;) +operator(}) + +directive(const) pre_type(char)operator(*) +ident(rb_get_kcode)operator((\)) +operator({) + reserved(switch) operator(()ident(reg_kcode)operator(\)) operator({) + reserved(case) label(KCODE_SJIS)operator(:) + reserved(return) string<delimiter(")content(SJIS)delimiter(")>operator(;) + reserved(case) label(KCODE_EUC)operator(:) + reserved(return) string<delimiter(")content(EUC)delimiter(")>operator(;) + reserved(case) label(KCODE_UTF8)operator(:) + reserved(return) string<delimiter(")content(UTF8)delimiter(")>operator(;) + reserved(default)operator(:) + reserved(return) string<delimiter(")content(NONE)delimiter(")>operator(;) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(kcode_getter)operator((\)) +operator({) + reserved(return) ident(rb_str_new2)operator(()ident(rb_get_kcode)operator((\)\);) +operator(}) + +directive(void) +ident(rb_set_kcode)operator(()ident(code)operator(\)) + directive(const) pre_type(char) operator(*)ident(code)operator(;) +operator({) + reserved(if) operator(()ident(code) operator(==) integer(0)operator(\)) reserved(goto) ident(set_no_conversion)operator(;) + + reserved(switch) operator(()ident(code)operator([)integer(0)operator(]\)) operator({) + reserved(case) char('E')operator(:) + reserved(case) char('e')operator(:) + ident(reg_kcode) operator(=) ident(KCODE_EUC)operator(;) + ident(re_mbcinit)operator(()ident(MBCTYPE_EUC)operator(\);) + reserved(break)operator(;) + reserved(case) char('S')operator(:) + reserved(case) char('s')operator(:) + ident(reg_kcode) operator(=) ident(KCODE_SJIS)operator(;) + ident(re_mbcinit)operator(()ident(MBCTYPE_SJIS)operator(\);) + reserved(break)operator(;) + reserved(case) char('U')operator(:) + reserved(case) char('u')operator(:) + ident(reg_kcode) operator(=) ident(KCODE_UTF8)operator(;) + ident(re_mbcinit)operator(()ident(MBCTYPE_UTF8)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(case) char('N')operator(:) + reserved(case) char('n')operator(:) + reserved(case) char('A')operator(:) + reserved(case) char('a')operator(:) + label(set_no_conversion)operator(:) + ident(reg_kcode) operator(=) ident(KCODE_NONE)operator(;) + ident(re_mbcinit)operator(()ident(MBCTYPE_ASCII)operator(\);) + reserved(break)operator(;) + operator(}) +operator(}) + +directive(static) directive(void) +ident(kcode_setter)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + ident(may_need_recompile) operator(=) integer(1)operator(;) + ident(rb_set_kcode)operator(()ident(StringValuePtr)operator(()ident(val)operator(\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(ignorecase_getter)operator((\)) +operator({) + reserved(return) ident(ruby_ignorecase)operator(?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + +directive(static) directive(void) +ident(ignorecase_setter)operator(()ident(val)operator(,) ident(id)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(modifying %s is deprecated)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + ident(may_need_recompile) operator(=) integer(1)operator(;) + ident(ruby_ignorecase) operator(=) ident(RTEST)operator(()ident(val)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(match_getter)operator((\)) +operator({) + ident(VALUE) ident(match) operator(=) ident(rb_backref_get)operator((\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(match)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(rb_match_busy)operator(()ident(match)operator(\);) + reserved(return) ident(match)operator(;) +operator(}) + +directive(static) directive(void) +ident(match_setter)operator(()ident(val)operator(\)) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + ident(Check_Type)operator(()ident(val)operator(,) ident(T_MATCH)operator(\);) + operator(}) + ident(rb_backref_set)operator(()ident(val)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Regexp.last_match => matchdata + * Regexp.last_match(fixnum\) => str + * + * The first form returns the <code>MatchData</code> object generated by the + * last successful pattern match. Equivalent to reading the global variable + * <code>$~</code>. The second form returns the nth field in this + * <code>MatchData</code> object. + * + * /c(.\)t/ =~ 'cat' #=> 0 + * Regexp.last_match #=> #<MatchData:0x401b3d30> + * Regexp.last_match(0\) #=> "cat" + * Regexp.last_match(1\) #=> "a" + * Regexp.last_match(2\) #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_reg_s_last_match)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(nth)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(nth)operator(\)) operator(==) integer(1)operator(\)) operator({) + reserved(return) ident(rb_reg_nth_match)operator(()ident(NUM2INT)operator(()ident(nth)operator(\),) ident(rb_backref_get)operator((\)\);) + operator(}) + reserved(return) ident(match_getter)operator((\);) +operator(}) + + +comment(/* + * Document-class: Regexp + * + * A <code>Regexp</code> holds a regular expression, used to match a pattern + * against strings. Regexps are created using the <code>/.../</code> and + * <code>%r{...}</code> literals, and by the <code>Regexp::new</code> + * constructor. + * + */) + +directive(void) +ident(Init_Regexp)operator((\)) +operator({) + ident(rb_eRegexpError) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(RegexpError)delimiter(")>operator(,) ident(rb_eStandardError)operator(\);) + + ident(re_set_casetable)operator(()ident(casetable)operator(\);) +preprocessor(#if) ident(DEFAULT_KCODE) operator(==) ident(KCODE_EUC) + ident(re_mbcinit)operator(()ident(MBCTYPE_EUC)operator(\);) +preprocessor(#else) +preprocessor(#if) ident(DEFAULT_KCODE) operator(==) ident(KCODE_SJIS) + ident(re_mbcinit)operator(()ident(MBCTYPE_SJIS)operator(\);) +preprocessor(#else) +preprocessor(#if) ident(DEFAULT_KCODE) operator(==) ident(KCODE_UTF8) + ident(re_mbcinit)operator(()ident(MBCTYPE_UTF8)operator(\);) +preprocessor(#else) + ident(re_mbcinit)operator(()ident(MBCTYPE_ASCII)operator(\);) +preprocessor(#endif) +preprocessor(#endif) +preprocessor(#endif) + + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($~)delimiter(")>operator(,) ident(match_getter)operator(,) ident(match_setter)operator(\);) + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($&)delimiter(")>operator(,) ident(last_match_getter)operator(,) integer(0)operator(\);) + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($`)delimiter(")>operator(,) ident(prematch_getter)operator(,) integer(0)operator(\);) + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($')delimiter(")>operator(,) ident(postmatch_getter)operator(,) integer(0)operator(\);) + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($+)delimiter(")>operator(,) ident(last_paren_match_getter)operator(,) integer(0)operator(\);) + + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($=)delimiter(")>operator(,) ident(ignorecase_getter)operator(,) ident(ignorecase_setter)operator(\);) + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($KCODE)delimiter(")>operator(,) ident(kcode_getter)operator(,) ident(kcode_setter)operator(\);) + ident(rb_define_virtual_variable)operator(()string<delimiter(")content($-K)delimiter(")>operator(,) ident(kcode_getter)operator(,) ident(kcode_setter)operator(\);) + + ident(rb_cRegexp) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Regexp)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_define_alloc_func)operator(()ident(rb_cRegexp)operator(,) ident(rb_reg_s_alloc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(compile)delimiter(")>operator(,) ident(rb_class_new_instance)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(quote)delimiter(")>operator(,) ident(rb_reg_s_quote)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(escape)delimiter(")>operator(,) ident(rb_reg_s_quote)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(union)delimiter(")>operator(,) ident(rb_reg_s_union)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(last_match)delimiter(")>operator(,) ident(rb_reg_s_last_match)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_reg_initialize_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_reg_init_copy)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(hash)delimiter(")>operator(,) ident(rb_reg_hash)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(rb_reg_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(rb_reg_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(=~)delimiter(")>operator(,) ident(rb_reg_match)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(===)delimiter(")>operator(,) ident(rb_reg_eqq)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(~)delimiter(")>operator(,) ident(rb_reg_match2)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(match)delimiter(")>operator(,) ident(rb_reg_match_m)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(rb_reg_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_reg_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(source)delimiter(")>operator(,) ident(rb_reg_source)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(casefold?)delimiter(")>operator(,) ident(rb_reg_casefold_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(options)delimiter(")>operator(,) ident(rb_reg_options_m)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(kcode)delimiter(")>operator(,) ident(rb_reg_kcode_m)operator(,) integer(0)operator(\);) + + ident(rb_define_const)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(IGNORECASE)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RE_OPTION_IGNORECASE)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(EXTENDED)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RE_OPTION_EXTENDED)operator(\)\);) + ident(rb_define_const)operator(()ident(rb_cRegexp)operator(,) string<delimiter(")content(MULTILINE)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RE_OPTION_MULTILINE)operator(\)\);) + + ident(rb_global_variable)operator((&)ident(reg_cache)operator(\);) + + ident(rb_cMatch) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(MatchData)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(MatchingData)delimiter(")>operator(,) ident(rb_cMatch)operator(\);) + ident(rb_define_alloc_func)operator(()ident(rb_cMatch)operator(,) ident(match_alloc)operator(\);) + ident(rb_undef_method)operator(()ident(CLASS_OF)operator(()ident(rb_cMatch)operator(\),) string<delimiter(")content(new)delimiter(")>operator(\);) + + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(match_init_copy)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(size)delimiter(")>operator(,) ident(match_size)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(length)delimiter(")>operator(,) ident(match_size)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(offset)delimiter(")>operator(,) ident(match_offset)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(begin)delimiter(")>operator(,) ident(match_begin)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(end)delimiter(")>operator(,) ident(match_end)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(to_a)delimiter(")>operator(,) ident(match_to_a)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(match_aref)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(captures)delimiter(")>operator(,) ident(match_captures)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(select)delimiter(")>operator(,) ident(match_select)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(values_at)delimiter(")>operator(,) ident(match_values_at)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(pre_match)delimiter(")>operator(,) ident(rb_reg_match_pre)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(post_match)delimiter(")>operator(,) ident(rb_reg_match_post)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(match_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_any_to_s)operator(,) integer(0)operator(\);) comment(/* in object.c */) + ident(rb_define_method)operator(()ident(rb_cMatch)operator(,) string<delimiter(")content(string)delimiter(")>operator(,) ident(match_string)operator(,) integer(0)operator(\);) +operator(}) +comment(/* Extended regular expression matching and search library. + Copyright (C\) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option\) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file LGPL. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */) +comment(/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto\) + Last change: May 21, 1993 by t^2 */) +comment(/* removed gapped buffer support, multiple syntax support by matz <matz@nts.co.jp> */) +comment(/* Perl5 extension added by matz <matz@caelum.co.jp> */) +comment(/* UTF-8 extension added Jan 16 1999 by Yoshida Masato <yoshidam@tau.bekkoame.ne.jp> */) + +preprocessor(#include) include("config.h") + +preprocessor(#ifdef) ident(HAVE_STRING_H) +preprocessor(# include) include(<string.h>) +preprocessor(#else) +preprocessor(# include) include(<strings.h>) +preprocessor(#endif) + +comment(/* We write fatal error messages on standard error. */) +preprocessor(#include) include(<stdio.h>) + +comment(/* isalpha(3\) etc. are used for the character classes. */) +preprocessor(#include) include(<ctype.h>) +preprocessor(#include) include(<sys/types.h>) + +preprocessor(#ifndef) ident(PARAMS) +preprocessor(# if) ident(defined) ident(__GNUC__) operator(||) operator(()ident(defined) ident(__STDC__) operator(&&) ident(__STDC__)operator(\)) +preprocessor(# define) ident(PARAMS)operator(()ident(args)operator(\)) ident(args) +preprocessor(# else) +preprocessor(# define) ident(PARAMS)operator(()ident(args)operator(\)) operator((\)) +preprocessor(# endif) comment(/* GCC. */) +preprocessor(#endif) comment(/* Not PARAMS. */) + +preprocessor(#if) ident(defined)operator(()ident(STDC_HEADERS)operator(\)) +preprocessor(# include) include(<stddef.h>) +preprocessor(#else) +comment(/* We need this for `regex.h', and perhaps for the Emacs include files. */) +preprocessor(# include) include(<sys/types.h>) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_STDLIB_H) +preprocessor(# include) include(<stdlib.h>) +preprocessor(#endif) + +preprocessor(#if) operator(!)ident(defined)operator(()ident(__STDC__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(_MSC_VER)operator(\)) +preprocessor(# define) directive(volatile) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_PROTOTYPES) +preprocessor(# define) ident(_)operator(()ident(args)operator(\)) ident(args) +preprocessor(#else) +preprocessor(# define) ident(_)operator(()ident(args)operator(\)) operator((\)) +preprocessor(#endif) + +preprocessor(#ifdef) ident(RUBY_PLATFORM) +preprocessor(#include) include("defines.h") +preprocessor(#undef) ident(xmalloc) +preprocessor(#undef) ident(xrealloc) +preprocessor(#undef) ident(xcalloc) +preprocessor(#undef) ident(xfree) + +preprocessor(# define) ident(RUBY) +directive(extern) pre_type(int) ident(rb_prohibit_interrupt)operator(;) +directive(extern) pre_type(int) ident(rb_trap_pending)operator(;) +directive(void) ident(rb_trap_exec) ident(_)operator((()directive(void)operator(\)\);) + +preprocessor(# define) ident(CHECK_INTS) reserved(do) operator({)\ + reserved(if) operator((!)ident(rb_prohibit_interrupt)operator(\)) operator({)\ + reserved(if) operator(()ident(rb_trap_pending)operator(\)) ident(rb_trap_exec)operator((\);)\ + operator(})\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#endif) + +comment(/* Make alloca work the best possible way. */) +preprocessor(#ifdef) ident(__GNUC__) +preprocessor(# ifndef) ident(atarist) +preprocessor(# ifndef) ident(alloca) +preprocessor(# define) ident(alloca) ident(__builtin_alloca) +preprocessor(# endif) +preprocessor(# endif) comment(/* atarist */) +preprocessor(#else) +preprocessor(# ifdef) ident(HAVE_ALLOCA_H) +preprocessor(# include) include(<alloca.h>) +preprocessor(# else) +preprocessor(# ifdef) ident(_AIX) + preprocessor(#pragma) ident(alloca) +preprocessor(# else) +preprocessor(# ifndef) ident(alloca) comment(/* predefined by HP cc +Olibcalls */) +directive(void) operator(*)ident(alloca) operator((\);) +preprocessor(# endif) +preprocessor(# endif) comment(/* AIX */) +preprocessor(# endif) comment(/* HAVE_ALLOCA_H */) + +preprocessor(#endif) comment(/* __GNUC__ */) + +preprocessor(#ifdef) ident(HAVE_STRING_H) +preprocessor(# include) include(<string.h>) +preprocessor(#else) +preprocessor(# include) include(<strings.h>) +preprocessor(#endif) + +preprocessor(#define) ident(xmalloc) ident(malloc) +preprocessor(#define) ident(xrealloc) ident(realloc) +preprocessor(#define) ident(xcalloc) ident(calloc) +preprocessor(#define) ident(xfree) ident(free) + +preprocessor(#ifdef) ident(C_ALLOCA) +preprocessor(#define) ident(FREE_VARIABLES)operator((\)) ident(alloca)operator(()integer(0)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(FREE_VARIABLES)operator((\)) +preprocessor(#endif) + +preprocessor(#define) ident(FREE_AND_RETURN_VOID)operator(()ident(stackb)operator(\)) reserved(do) operator({) \ + ident(FREE_VARIABLES)operator((\);) \ + reserved(if) operator(()ident(stackb) operator(!=) ident(stacka)operator(\)) ident(xfree)operator(()ident(stackb)operator(\);) \ + reserved(return)operator(;) \ +operator(}) reserved(while)operator(()integer(0)operator(\)) + +preprocessor(#define) ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,)ident(val)operator(\)) reserved(do) operator({) \ + ident(FREE_VARIABLES)operator((\);) \ + reserved(if) operator(()ident(stackb) operator(!=) ident(stacka)operator(\)) ident(xfree)operator(()ident(stackb)operator(\);) \ + reserved(return)operator(()ident(val)operator(\);) \ +operator(}) reserved(while)operator(()integer(0)operator(\)) + +preprocessor(#define) ident(DOUBLE_STACK)operator(()ident(type)operator(\)) reserved(do) operator({) \ + ident(type) operator(*)ident(stackx)operator(;) \ + pre_type(unsigned) pre_type(int) ident(xlen) operator(=) ident(stacke) operator(-) ident(stackb)operator(;) \ + reserved(if) operator(()ident(stackb) operator(==) ident(stacka)operator(\)) operator({) \ + ident(stackx) operator(=) operator(()ident(type)operator(*\))ident(xmalloc)operator(()integer(2) operator(*) ident(xlen) operator(*) reserved(sizeof)operator(()ident(type)operator(\)\);) \ + reserved(if) operator((!)ident(stackx)operator(\)) reserved(goto) ident(memory_exhausted)operator(;) \ + ident(memcpy)operator(()ident(stackx)operator(,) ident(stackb)operator(,) ident(xlen) operator(*) reserved(sizeof) operator(()ident(type)operator(\)\);) \ + operator(}) \ + reserved(else) operator({) \ + ident(stackx) operator(=) operator(()ident(type)operator(*\))ident(xrealloc)operator(()ident(stackb)operator(,) integer(2) operator(*) ident(xlen) operator(*) reserved(sizeof)operator(()ident(type)operator(\)\);) \ + reserved(if) operator((!)ident(stackx)operator(\)) reserved(goto) ident(memory_exhausted)operator(;) \ + operator(}) \ + comment(/* Rearrange the pointers. */) \ + ident(stackp) operator(=) ident(stackx) operator(+) operator(()ident(stackp) operator(-) ident(stackb)operator(\);) \ + ident(stackb) operator(=) ident(stackx)operator(;) \ + ident(stacke) operator(=) ident(stackb) operator(+) integer(2) operator(*) ident(xlen)operator(;) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(RE_TALLOC)operator(()ident(n)operator(,)ident(t)operator(\)) operator((()ident(t)operator(*\))ident(alloca)operator((()ident(n)operator(\)*)reserved(sizeof)operator(()ident(t)operator(\)\)\)) +preprocessor(#define) ident(TMALLOC)operator(()ident(n)operator(,)ident(t)operator(\)) operator((()ident(t)operator(*\))ident(xmalloc)operator((()ident(n)operator(\)*)reserved(sizeof)operator(()ident(t)operator(\)\)\)) +preprocessor(#define) ident(TREALLOC)operator(()ident(s)operator(,)ident(n)operator(,)ident(t)operator(\)) operator(()ident(s)operator(=(()ident(t)operator(*\))ident(xrealloc)operator(()ident(s)operator(,()ident(n)operator(\)*)reserved(sizeof)operator(()ident(t)operator(\)\)\)\)) + +preprocessor(#define) ident(EXPAND_FAIL_STACK)operator((\)) ident(DOUBLE_STACK)operator(()pre_type(unsigned) pre_type(char)operator(*\)) +preprocessor(#define) ident(ENSURE_FAIL_STACK)operator(()ident(n)operator(\)) \ + reserved(do) operator({) \ + reserved(if) operator(()ident(stacke) operator(-) ident(stackp) operator(<=) operator(()ident(n)operator(\)\)) operator({) \ + comment(/* if (len > re_max_failures * MAX_NUM_FAILURE_ITEMS\) \\ + { \\ + FREE_AND_RETURN(stackb,(-2\)\); \\ + }*/) \ + \ + comment(/* Roughly double the size of the stack. */) \ + ident(EXPAND_FAIL_STACK)operator((\);) \ + operator(}) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* Get the interface, including the syntax bits. */) +preprocessor(#include) include("regex.h") + +comment(/* Subroutines for re_compile_pattern. */) +directive(static) directive(void) ident(store_jump) ident(_)operator((()pre_type(char)operator(*,) pre_type(int)operator(,) pre_type(char)operator(*\)\);) +directive(static) directive(void) ident(insert_jump) ident(_)operator((()pre_type(int)operator(,) pre_type(char)operator(*,) pre_type(char)operator(*,) pre_type(char)operator(*\)\);) +directive(static) directive(void) ident(store_jump_n) ident(_)operator((()pre_type(char)operator(*,) pre_type(int)operator(,) pre_type(char)operator(*,) pre_type(unsigned)operator(\)\);) +directive(static) directive(void) ident(insert_jump_n) ident(_)operator((()pre_type(int)operator(,) pre_type(char)operator(*,) pre_type(char)operator(*,) pre_type(char)operator(*,) pre_type(unsigned)operator(\)\);) +directive(static) directive(void) ident(insert_op) ident(_)operator((()pre_type(int)operator(,) pre_type(char)operator(*,) pre_type(char)operator(*\)\);) +directive(static) directive(void) ident(insert_op_2) ident(_)operator((()pre_type(int)operator(,) pre_type(char)operator(*,) pre_type(char)operator(*,) pre_type(int)operator(,) pre_type(int)operator(\)\);) +directive(static) pre_type(int) ident(memcmp_translate) ident(_)operator((()pre_type(unsigned) pre_type(char)operator(*,) pre_type(unsigned) pre_type(char)operator(*,) pre_type(int)operator(\)\);) + +comment(/* Define the syntax stuff, so we can do the \\<, \\>, etc. */) + +comment(/* This must be nonzero for the wordchar and notwordchar pattern + commands in re_match. */) +preprocessor(#define) ident(Sword) integer(1) +preprocessor(#define) ident(Sword2) integer(2) + +preprocessor(#define) ident(SYNTAX)operator(()ident(c)operator(\)) ident(re_syntax_table)operator([)ident(c)operator(]) + +directive(static) pre_type(char) ident(re_syntax_table)operator([)integer(256)operator(];) +directive(static) directive(void) ident(init_syntax_once) ident(_)operator((()directive(void)operator(\)\);) +directive(static) directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(translate) operator(=) integer(0)operator(;) +directive(static) directive(void) ident(init_regs) ident(_)operator((()reserved(struct) ident(re_registers)operator(*,) pre_type(unsigned) pre_type(int)operator(\)\);) +directive(static) directive(void) ident(bm_init_skip) ident(_)operator((()pre_type(int) operator(*,) pre_type(unsigned) pre_type(char)operator(*,) pre_type(int)operator(,) directive(const) pre_type(unsigned) pre_type(char)operator(*\)\);) +directive(static) pre_type(int) ident(current_mbctype) operator(=) ident(MBCTYPE_ASCII)operator(;) + +preprocessor(#undef) ident(P) + +preprocessor(#ifdef) ident(RUBY) +preprocessor(#include) include("util.h") +directive(void) ident(rb_warn) ident(_)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\);) +preprocessor(# define) ident(re_warning)operator(()ident(x)operator(\)) ident(rb_warn)operator(()ident(x)operator(\)) +preprocessor(#endif) + +preprocessor(#ifndef) ident(re_warning) +preprocessor(# define) ident(re_warning)operator(()ident(x)operator(\)) +preprocessor(#endif) + +directive(static) directive(void) +ident(init_syntax_once)operator((\)) +operator({) + directive(register) pre_type(int) ident(c)operator(;) + directive(static) pre_type(int) ident(done) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(done)operator(\)) + reserved(return)operator(;) + + ident(memset)operator(()ident(re_syntax_table)operator(,) integer(0)operator(,) reserved(sizeof) ident(re_syntax_table)operator(\);) + + reserved(for) operator(()ident(c)operator(=)integer(0)operator(;) ident(c)operator(<=)hex(0x7f)operator(;) ident(c)operator(++\)) + reserved(if) operator(()ident(isalnum)operator(()ident(c)operator(\)\)) + ident(re_syntax_table)operator([)ident(c)operator(]) operator(=) ident(Sword)operator(;) + ident(re_syntax_table)operator([)char('_')operator(]) operator(=) ident(Sword)operator(;) + + reserved(for) operator(()ident(c)operator(=)hex(0x80)operator(;) ident(c)operator(<=)hex(0xff)operator(;) ident(c)operator(++\)) + reserved(if) operator(()ident(isalnum)operator(()ident(c)operator(\)\)) + ident(re_syntax_table)operator([)ident(c)operator(]) operator(=) ident(Sword2)operator(;) + ident(done) operator(=) integer(1)operator(;) +operator(}) + +directive(void) +ident(re_set_casetable)operator(()ident(table)operator(\)) + directive(const) pre_type(char) operator(*)ident(table)operator(;) +operator({) + ident(translate) operator(=) operator(()directive(const) pre_type(unsigned) pre_type(char)operator(*\))ident(table)operator(;) +operator(}) + +comment(/* Jim Meyering writes: + + "... Some ctype macros are valid only for character codes that + isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when + using /bin/cc or gcc but without giving an ansi option\). So, all + ctype uses should be through macros like ISPRINT... If + STDC_HEADERS is defined, then autoconf has verified that the ctype + macros don't need to be guarded with references to isascii. ... + Defining isascii to 1 should let any compiler worth its salt + eliminate the && through constant folding." + Solaris defines some of these symbols so we must undefine them first. */) + +preprocessor(#undef) ident(ISASCII) +preprocessor(#if) ident(defined) ident(STDC_HEADERS) operator(||) operator((!)ident(defined) ident(isascii) operator(&&) operator(!)ident(defined) ident(HAVE_ISASCII)operator(\)) +preprocessor(# define) ident(ISASCII)operator(()ident(c)operator(\)) integer(1) +preprocessor(#else) +preprocessor(# define) ident(ISASCII)operator(()ident(c)operator(\)) ident(isascii)operator(()ident(c)operator(\)) +preprocessor(#endif) + +preprocessor(#ifdef) ident(isblank) +preprocessor(# define) ident(ISBLANK)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isblank)operator(()ident(c)operator(\)\)) +preprocessor(#else) +preprocessor(# define) ident(ISBLANK)operator(()ident(c)operator(\)) operator((()ident(c)operator(\)) operator(==) char(' ') operator(||) operator(()ident(c)operator(\)) operator(==) char('\\t')operator(\)) +preprocessor(#endif) +preprocessor(#ifdef) ident(isgraph) +preprocessor(# define) ident(ISGRAPH)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isgraph)operator(()ident(c)operator(\)\)) +preprocessor(#else) +preprocessor(# define) ident(ISGRAPH)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isprint)operator(()ident(c)operator(\)) operator(&&) operator(!)ident(isspace)operator(()ident(c)operator(\)\)) +preprocessor(#endif) + +preprocessor(#undef) ident(ISPRINT) +preprocessor(#define) ident(ISPRINT)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isprint)operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(ISDIGIT)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isdigit)operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(ISALNUM)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isalnum)operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(ISALPHA)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isalpha)operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(ISCNTRL)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(iscntrl)operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(ISLOWER)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(islower)operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(ISPUNCT)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(ispunct)operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(ISSPACE)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isspace)operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(ISUPPER)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isupper)operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(ISXDIGIT)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isxdigit)operator(()ident(c)operator(\)\)) + +preprocessor(#ifndef) pre_constant(NULL) +preprocessor(# define) pre_constant(NULL) operator(()directive(void) operator(*\))integer(0) +preprocessor(#endif) + +comment(/* We remove any previous definition of `SIGN_EXTEND_CHAR', + since ours (we hope\) works properly with all combinations of + machines, compilers, `char' and `unsigned char' argument types. + (Per Bothner suggested the basic approach.\) */) +preprocessor(#undef) ident(SIGN_EXTEND_CHAR) +preprocessor(#if) ident(__STDC__) +preprocessor(# define) ident(SIGN_EXTEND_CHAR)operator(()ident(c)operator(\)) operator((()pre_type(signed) pre_type(char)operator(\)()ident(c)operator(\)\)) +preprocessor(#else) comment(/* not __STDC__ */) +comment(/* As in Harbison and Steele. */) +preprocessor(# define) ident(SIGN_EXTEND_CHAR)operator(()ident(c)operator(\)) operator((((()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)) operator(^) integer(128)operator(\)) operator(-) integer(128)operator(\)) +preprocessor(#endif) + +comment(/* These are the command codes that appear in compiled regular + expressions, one per byte. Some command codes are followed by + argument bytes. A command code can specify any interpretation + whatsoever for its arguments. Zero-bytes may appear in the compiled + regular expression. + + The value of `exactn' is needed in search.c (search_buffer\) in emacs. + So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of + `exactn' we use here must also be 1. */) + +reserved(enum) ident(regexpcode) + operator({) + ident(unused)operator(=)integer(0)operator(,) + ident(exactn)operator(=)integer(1)operator(,) comment(/* Followed by one byte giving n, then by n literal bytes. */) + ident(begline)operator(,) comment(/* Fail unless at beginning of line. */) + ident(endline)operator(,) comment(/* Fail unless at end of line. */) + ident(begbuf)operator(,) comment(/* Succeeds if at beginning of buffer (if emacs\) or at beginning + of string to be matched (if not\). */) + ident(endbuf)operator(,) comment(/* Analogously, for end of buffer/string. */) + ident(endbuf2)operator(,) comment(/* End of buffer/string, or newline just before it. */) + ident(begpos)operator(,) comment(/* Matches where last scan//gsub left off. */) + ident(jump)operator(,) comment(/* Followed by two bytes giving relative address to jump to. */) + ident(jump_past_alt)operator(,)comment(/* Same as jump, but marks the end of an alternative. */) + ident(on_failure_jump)operator(,) comment(/* Followed by two bytes giving relative address of + place to resume at in case of failure. */) + ident(finalize_jump)operator(,) comment(/* Throw away latest failure point and then jump to + address. */) + ident(maybe_finalize_jump)operator(,) comment(/* Like jump but finalize if safe to do so. + This is used to jump back to the beginning + of a repeat. If the command that follows + this jump is clearly incompatible with the + one at the beginning of the repeat, such that + we can be sure that there is no use backtracking + out of repetitions already completed, + then we finalize. */) + ident(dummy_failure_jump)operator(,) comment(/* Jump, and push a dummy failure point. This + failure point will be thrown away if an attempt + is made to use it for a failure. A + construct + makes this before the first repeat. Also + use it as an intermediary kind of jump when + compiling an or construct. */) + ident(push_dummy_failure)operator(,) comment(/* Push a dummy failure point and continue. Used at the end of + alternatives. */) + ident(succeed_n)operator(,) comment(/* Used like on_failure_jump except has to succeed n times; + then gets turned into an on_failure_jump. The relative + address following it is useless until then. The + address is followed by two bytes containing n. */) + ident(jump_n)operator(,) comment(/* Similar to jump, but jump n times only; also the relative + address following is in turn followed by yet two more bytes + containing n. */) + ident(try_next)operator(,) comment(/* Jump to next pattern for the first time, + leaving this pattern on the failure stack. */) + ident(finalize_push)operator(,) comment(/* Finalize stack and push the beginning of the pattern + on the stack to retry (used for non-greedy match\) */) + ident(finalize_push_n)operator(,) comment(/* Similar to finalize_push, buf finalize n time only */) + ident(set_number_at)operator(,) comment(/* Set the following relative location to the + subsequent number. */) + ident(anychar)operator(,) comment(/* Matches any (more or less\) one character excluding newlines. */) + ident(anychar_repeat)operator(,) comment(/* Matches sequence of characters excluding newlines. */) + ident(charset)operator(,) comment(/* Matches any one char belonging to specified set. + First following byte is number of bitmap bytes. + Then come bytes for a bitmap saying which chars are in. + Bits in each byte are ordered low-bit-first. + A character is in the set if its bit is 1. + A character too large to have a bit in the map + is automatically not in the set. */) + ident(charset_not)operator(,) comment(/* Same parameters as charset, but match any character + that is not one of those specified. */) + ident(start_memory)operator(,) comment(/* Start remembering the text that is matched, for + storing in a memory register. Followed by one + byte containing the register number. Register numbers + must be in the range 0 through RE_NREGS. */) + ident(stop_memory)operator(,) comment(/* Stop remembering the text that is matched + and store it in a memory register. Followed by + one byte containing the register number. Register + numbers must be in the range 0 through RE_NREGS. */) + ident(start_paren)operator(,) comment(/* Place holder at the start of (?:..\). */) + ident(stop_paren)operator(,) comment(/* Place holder at the end of (?:..\). */) + ident(casefold_on)operator(,) comment(/* Turn on casefold flag. */) + ident(casefold_off)operator(,) comment(/* Turn off casefold flag. */) + ident(option_set)operator(,) comment(/* Turn on multi line match (match with newlines\). */) + ident(start_nowidth)operator(,) comment(/* Save string point to the stack. */) + ident(stop_nowidth)operator(,) comment(/* Restore string place at the point start_nowidth. */) + ident(pop_and_fail)operator(,) comment(/* Fail after popping nowidth entry from stack. */) + ident(stop_backtrack)operator(,) comment(/* Restore backtrack stack at the point start_nowidth. */) + ident(duplicate)operator(,) comment(/* Match a duplicate of something remembered. + Followed by one byte containing the index of the memory + register. */) + ident(wordchar)operator(,) comment(/* Matches any word-constituent character. */) + ident(notwordchar)operator(,) comment(/* Matches any char that is not a word-constituent. */) + ident(wordbeg)operator(,) comment(/* Succeeds if at word beginning. */) + ident(wordend)operator(,) comment(/* Succeeds if at word end. */) + ident(wordbound)operator(,) comment(/* Succeeds if at a word boundary. */) + ident(notwordbound) comment(/* Succeeds if not at a word boundary. */) + operator(};) + + +comment(/* Number of failure points to allocate space for initially, + when matching. If this number is exceeded, more space is allocated, + so it is not a hard limit. */) + +preprocessor(#ifndef) ident(NFAILURES) +preprocessor(#define) ident(NFAILURES) integer(160) +preprocessor(#endif) + +comment(/* Store NUMBER in two contiguous bytes starting at DESTINATION. */) +preprocessor(#define) ident(STORE_NUMBER)operator(()ident(destination)operator(,) ident(number)operator(\)) \ + reserved(do) operator({) operator(()ident(destination)operator(\)[)integer(0)operator(]) operator(=) operator(()ident(number)operator(\)) operator(&) oct(0377)operator(;) \ + operator(()ident(destination)operator(\)[)integer(1)operator(]) operator(=) operator(()ident(number)operator(\)) operator(>>) integer(8)operator(;) operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* Same as STORE_NUMBER, except increment the destination pointer to + the byte after where the number is stored. Watch out that values for + DESTINATION such as p + 1 won't work, whereas p will. */) +preprocessor(#define) ident(STORE_NUMBER_AND_INCR)operator(()ident(destination)operator(,) ident(number)operator(\)) \ + reserved(do) operator({) ident(STORE_NUMBER)operator(()ident(destination)operator(,) ident(number)operator(\);) \ + operator(()ident(destination)operator(\)) operator(+=) integer(2)operator(;) operator(}) reserved(while) operator(()integer(0)operator(\)) + + +comment(/* Put into DESTINATION a number stored in two contingous bytes starting + at SOURCE. */) +preprocessor(#define) ident(EXTRACT_NUMBER)operator(()ident(destination)operator(,) ident(source)operator(\)) \ + reserved(do) operator({) operator(()ident(destination)operator(\)) operator(=) operator(*()ident(source)operator(\)) operator(&) oct(0377)operator(;) \ + operator(()ident(destination)operator(\)) operator(+=) ident(SIGN_EXTEND_CHAR)operator((*()pre_type(char)operator(*\)(()ident(source)operator(\)) operator(+) integer(1)operator(\)\)) operator(<<) integer(8)operator(;) operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* Same as EXTRACT_NUMBER, except increment the pointer for source to + point to second byte of SOURCE. Note that SOURCE has to be a value + such as p, not, e.g., p + 1. */) +preprocessor(#define) ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(destination)operator(,) ident(source)operator(\)) \ + reserved(do) operator({) ident(EXTRACT_NUMBER)operator(()ident(destination)operator(,) ident(source)operator(\);) \ + operator(()ident(source)operator(\)) operator(+=) integer(2)operator(;) operator(}) reserved(while) operator(()integer(0)operator(\)) + + +comment(/* Specify the precise syntax of regexps for compilation. This provides + for compatibility for various utilities which historically have + different, incompatible syntaxes. + + The argument SYNTAX is a bit-mask comprised of the various bits + defined in regex.h. */) + +pre_type(long) +ident(re_set_syntax)operator(()ident(syntax)operator(\)) + pre_type(long) ident(syntax)operator(;) +operator({) + comment(/* obsolete */) + reserved(return) integer(0)operator(;) +operator(}) + +comment(/* Macros for re_compile_pattern, which is found below these definitions. */) + +preprocessor(#define) ident(TRANSLATE_P)operator((\)) operator((()ident(options)operator(&)ident(RE_OPTION_IGNORECASE)operator(\)) operator(&&) ident(translate)operator(\)) +preprocessor(#define) ident(MAY_TRANSLATE)operator((\)) operator((()ident(bufp)operator(->)ident(options)operator(&()ident(RE_OPTION_IGNORECASE)operator(|)ident(RE_MAY_IGNORECASE)operator(\)\)) operator(&&) ident(translate)operator(\)) +comment(/* Fetch the next character in the uncompiled pattern---translating it + if necessary. Also cast from a signed character in the constant + string passed to us by the user to an unsigned char that we can use + as an array index (in, e.g., `translate'\). */) +preprocessor(#define) ident(PATFETCH)operator(()ident(c)operator(\)) \ + reserved(do) operator({)reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) reserved(goto) ident(end_of_pattern)operator(;) \ + ident(c) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)) operator(*)ident(p)operator(++;) \ + reserved(if) operator(()ident(TRANSLATE_P)operator((\)\)) ident(c) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(translate)operator([)ident(c)operator(];) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* Fetch the next character in the uncompiled pattern, with no + translation. */) +preprocessor(#define) ident(PATFETCH_RAW)operator(()ident(c)operator(\)) \ + reserved(do) operator({)reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) reserved(goto) ident(end_of_pattern)operator(;) \ + ident(c) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)*)ident(p)operator(++;) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* Go backwards one character in the pattern. */) +preprocessor(#define) ident(PATUNFETCH) ident(p)operator(--) + +preprocessor(#define) ident(MBC2WC)operator(()ident(c)operator(,) ident(p)operator(\)) \ + reserved(do) operator({) \ + reserved(if) operator(()ident(current_mbctype) operator(==) ident(MBCTYPE_UTF8)operator(\)) operator({) \ + pre_type(int) ident(n) operator(=) ident(mbclen)operator(()ident(c)operator(\)) operator(-) integer(1)operator(;) \ + ident(c) operator(&=) operator(()integer(1)operator(<<()ident(BYTEWIDTH)operator(-)integer(2)operator(-)ident(n)operator(\)\)) operator(-) integer(1)operator(;) \ + reserved(while) operator(()ident(n)operator(--\)) operator({) \ + ident(c) operator(=) ident(c) operator(<<) integer(6) operator(|) operator((*)ident(p)operator(++) operator(&) operator((()integer(1)operator(<<)integer(6)operator(\)-)integer(1)operator(\)\);) \ + operator(}) \ + operator(}) \ + reserved(else) operator({) \ + ident(c) operator(<<=) integer(8)operator(;) \ + ident(c) operator(|=) operator(()pre_type(unsigned) pre_type(char)operator(\)*()ident(p)operator(\)++;) \ + operator(}) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(PATFETCH_MBC)operator(()ident(c)operator(\)) \ + reserved(do) operator({) \ + reserved(if) operator(()ident(p) operator(+) ident(mbclen)operator(()ident(c)operator(\)) operator(-) integer(1) operator(>=) ident(pend)operator(\)) reserved(goto) ident(end_of_pattern)operator(;) \ + ident(MBC2WC)operator(()ident(c)operator(,) ident(p)operator(\);) \ + operator(}) reserved(while)operator(()integer(0)operator(\)) + +preprocessor(#define) ident(WC2MBC1ST)operator(()ident(c)operator(\)) \ + operator((()ident(current_mbctype) operator(!=) ident(MBCTYPE_UTF8)operator(\)) operator(?) operator((()ident(c)operator(<)hex(0x100)operator(\)) operator(?) operator(()ident(c)operator(\)) operator(:) operator(((()ident(c)operator(\)>>)integer(8)operator(\)&)hex(0xff)operator(\)\)) operator(:) ident(utf8_firstbyte)operator(()ident(c)operator(\)\)) + +reserved(typedef) pre_type(unsigned) pre_type(int) operator((*)ident(mbc_startpos_func_t)operator(\)) ident(_)operator((()directive(const) pre_type(char) operator(*)ident(string)operator(,) pre_type(unsigned) pre_type(int) ident(pos)operator(\)\);) + +directive(static) pre_type(unsigned) pre_type(int) ident(asc_startpos) ident(_)operator((()directive(const) pre_type(char) operator(*)ident(string)operator(,) pre_type(unsigned) pre_type(int) ident(pos)operator(\)\);) +directive(static) pre_type(unsigned) pre_type(int) ident(euc_startpos) ident(_)operator((()directive(const) pre_type(char) operator(*)ident(string)operator(,) pre_type(unsigned) pre_type(int) ident(pos)operator(\)\);) +directive(static) pre_type(unsigned) pre_type(int) ident(sjis_startpos) ident(_)operator((()directive(const) pre_type(char) operator(*)ident(string)operator(,) pre_type(unsigned) pre_type(int) ident(pos)operator(\)\);) +directive(static) pre_type(unsigned) pre_type(int) ident(utf8_startpos) ident(_)operator((()directive(const) pre_type(char) operator(*)ident(string)operator(,) pre_type(unsigned) pre_type(int) ident(pos)operator(\)\);) + +directive(static) directive(const) ident(mbc_startpos_func_t) ident(mbc_startpos_func)operator([)integer(4)operator(]) operator(=) operator({) + ident(asc_startpos)operator(,) ident(euc_startpos)operator(,) ident(sjis_startpos)operator(,) ident(utf8_startpos) +operator(};) + +preprocessor(#define) ident(mbc_startpos)operator(()ident(start)operator(,) ident(pos)operator(\)) operator((*)ident(mbc_startpos_func)operator([)ident(current_mbctype)operator(]\)(()ident(start)operator(\),) operator(()ident(pos)operator(\)\)) + +directive(static) pre_type(unsigned) pre_type(int) +ident(utf8_firstbyte)operator(()ident(c)operator(\)) + pre_type(unsigned) pre_type(long) ident(c)operator(;) +operator({) + reserved(if) operator(()ident(c) operator(<) hex(0x80)operator(\)) reserved(return) ident(c)operator(;) + reserved(if) operator(()ident(c) operator(<=) hex(0x7ff)operator(\)) reserved(return) operator((()ident(c)operator(>>)integer(6)operator(\)&)hex(0xff)operator(\)|)hex(0xc0)operator(;) + reserved(if) operator(()ident(c) operator(<=) hex(0xffff)operator(\)) reserved(return) operator((()ident(c)operator(>>)integer(12)operator(\)&)hex(0xff)operator(\)|)hex(0xe0)operator(;) + reserved(if) operator(()ident(c) operator(<=) hex(0x1fffff)operator(\)) reserved(return) operator((()ident(c)operator(>>)integer(18)operator(\)&)hex(0xff)operator(\)|)hex(0xf0)operator(;) + reserved(if) operator(()ident(c) operator(<=) hex(0x3ffffff)operator(\)) reserved(return) operator((()ident(c)operator(>>)integer(24)operator(\)&)hex(0xff)operator(\)|)hex(0xf8)operator(;) + reserved(if) operator(()ident(c) operator(<=) hex(0x7fffffff)operator(\)) reserved(return) operator((()ident(c)operator(>>)integer(30)operator(\)&)hex(0xff)operator(\)|)hex(0xfc)operator(;) +preprocessor(#if) ident(SIZEOF_INT) operator(>) integer(4) + reserved(if) operator(()ident(c) operator(<=) hex(0xfffffffff)operator(\)) reserved(return) hex(0xfe)operator(;) +preprocessor(#else) + reserved(return) hex(0xfe)operator(;) +preprocessor(#endif) +operator(}) + +directive(static) directive(void) +ident(print_mbc)operator(()ident(c)operator(\)) + pre_type(unsigned) pre_type(int) ident(c)operator(;) +operator({) + reserved(if) operator(()ident(current_mbctype) operator(==) ident(MBCTYPE_UTF8)operator(\)) operator({) + reserved(if) operator(()ident(c) operator(<) hex(0x80)operator(\)) + ident(printf)operator(()string<delimiter(")content(%c)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(c)operator(\);) + reserved(else) reserved(if) operator(()ident(c) operator(<=) hex(0x7ff)operator(\)) + ident(printf)operator(()string<delimiter(")content(%c%c)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(utf8_firstbyte)operator(()ident(c)operator(\),) operator(()pre_type(int)operator(\)()ident(c) operator(&) hex(0x3f)operator(\)\);) + reserved(else) reserved(if) operator(()ident(c) operator(<=) hex(0xffff)operator(\)) + ident(printf)operator(()string<delimiter(")content(%c%c%c)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(utf8_firstbyte)operator(()ident(c)operator(\),) operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(6)operator(\)) operator(&) hex(0x3f)operator(\),) + operator(()pre_type(int)operator(\)()ident(c) operator(&) hex(0x3f)operator(\)\);) + reserved(else) reserved(if) operator(()ident(c) operator(<=) hex(0x1fffff)operator(\)) + ident(printf)operator(()string<delimiter(")content(%c%c%c%c)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(utf8_firstbyte)operator(()ident(c)operator(\),) operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(12)operator(\)) operator(&) hex(0x3f)operator(\),) + operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(6)operator(\)) operator(&) hex(0x3f)operator(\),) operator(()pre_type(int)operator(\)()ident(c) operator(&) hex(0x3f)operator(\)\);) + reserved(else) reserved(if) operator(()ident(c) operator(<=) hex(0x3ffffff)operator(\)) + ident(printf)operator(()string<delimiter(")content(%c%c%c%c%c)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(utf8_firstbyte)operator(()ident(c)operator(\),) operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(18)operator(\)) operator(&) hex(0x3f)operator(\),) + operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(12)operator(\)) operator(&) hex(0x3f)operator(\),) operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(6)operator(\)) operator(&) hex(0x3f)operator(\),) operator(()pre_type(int)operator(\)()ident(c) operator(&) hex(0x3f)operator(\)\);) + reserved(else) reserved(if) operator(()ident(c) operator(<=) hex(0x7fffffff)operator(\)) + ident(printf)operator(()string<delimiter(")content(%c%c%c%c%c%c)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(utf8_firstbyte)operator(()ident(c)operator(\),) operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(24)operator(\)) operator(&) hex(0x3f)operator(\),) + operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(18)operator(\)) operator(&) hex(0x3f)operator(\),) operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(12)operator(\)) operator(&) hex(0x3f)operator(\),) + operator(()pre_type(int)operator(\)(()ident(c) operator(>>) integer(6)operator(\)) operator(&) hex(0x3f)operator(\),) operator(()pre_type(int)operator(\)()ident(c) operator(&) hex(0x3f)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(<) hex(0xff)operator(\)) operator({) + ident(printf)operator(()string<delimiter(")char(\\\\)content(%o)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(c)operator(\);) + operator(}) + reserved(else) operator({) + ident(printf)operator(()string<delimiter(")content(%c%c)delimiter(")>operator(,) operator(()pre_type(int)operator(\)()ident(c) operator(>>) ident(BYTEWIDTH)operator(\),) operator(()pre_type(int)operator(\)()ident(c) operator(&)hex(0xff)operator(\)\);) + operator(}) +operator(}) + +comment(/* If the buffer isn't allocated when it comes in, use this. */) +preprocessor(#define) ident(INIT_BUF_SIZE) integer(28) + +comment(/* Make sure we have at least N more bytes of space in buffer. */) +preprocessor(#define) ident(GET_BUFFER_SPACE)operator(()ident(n)operator(\)) \ + reserved(do) operator({) \ + reserved(while) operator(()ident(b) operator(-) ident(bufp)operator(->)ident(buffer) operator(+) operator(()ident(n)operator(\)) operator(>=) ident(bufp)operator(->)ident(allocated)operator(\)) \ + ident(EXTEND_BUFFER)operator(;) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* Make sure we have one more byte of buffer space and then add CH to it. */) +preprocessor(#define) ident(BUFPUSH)operator(()ident(ch)operator(\)) \ + reserved(do) operator({) \ + ident(GET_BUFFER_SPACE)operator(()integer(1)operator(\);) \ + operator(*)ident(b)operator(++) operator(=) operator(()pre_type(char)operator(\)()ident(ch)operator(\);) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* Extend the buffer by twice its current size via reallociation and + reset the pointers that pointed into the old allocation to point to + the correct places in the new allocation. If extending the buffer + results in it being larger than 1 << 16, then flag memory exhausted. */) +preprocessor(#define) ident(EXTEND_BUFFER) \ + reserved(do) operator({) pre_type(char) operator(*)ident(old_buffer) operator(=) ident(bufp)operator(->)ident(buffer)operator(;) \ + reserved(if) operator(()ident(bufp)operator(->)ident(allocated) operator(==) operator(()integer(1L)operator(<<)integer(16)operator(\)\)) reserved(goto) ident(too_big)operator(;) \ + ident(bufp)operator(->)ident(allocated) operator(*=) integer(2)operator(;) \ + reserved(if) operator(()ident(bufp)operator(->)ident(allocated) operator(>) operator(()integer(1L)operator(<<)integer(16)operator(\)\)) ident(bufp)operator(->)ident(allocated) operator(=) operator(()integer(1L)operator(<<)integer(16)operator(\);) \ + ident(bufp)operator(->)ident(buffer) operator(=) operator(()pre_type(char)operator(*\))ident(xrealloc)operator(()ident(bufp)operator(->)ident(buffer)operator(,) ident(bufp)operator(->)ident(allocated)operator(\);) \ + reserved(if) operator(()ident(bufp)operator(->)ident(buffer) operator(==) integer(0)operator(\)) \ + reserved(goto) ident(memory_exhausted)operator(;) \ + ident(b) operator(=) operator(()ident(b) operator(-) ident(old_buffer)operator(\)) operator(+) ident(bufp)operator(->)ident(buffer)operator(;) \ + reserved(if) operator(()ident(fixup_alt_jump)operator(\)) \ + ident(fixup_alt_jump) operator(=) operator(()ident(fixup_alt_jump) operator(-) ident(old_buffer)operator(\)) operator(+) ident(bufp)operator(->)ident(buffer)operator(;) \ + reserved(if) operator(()ident(laststart)operator(\)) \ + ident(laststart) operator(=) operator(()ident(laststart) operator(-) ident(old_buffer)operator(\)) operator(+) ident(bufp)operator(->)ident(buffer)operator(;) \ + ident(begalt) operator(=) operator(()ident(begalt) operator(-) ident(old_buffer)operator(\)) operator(+) ident(bufp)operator(->)ident(buffer)operator(;) \ + reserved(if) operator(()ident(pending_exact)operator(\)) \ + ident(pending_exact) operator(=) operator(()ident(pending_exact) operator(-) ident(old_buffer)operator(\)) operator(+) ident(bufp)operator(->)ident(buffer)operator(;) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + + +comment(/* Set the bit for character C in a character set list. */) +preprocessor(#define) ident(SET_LIST_BIT)operator(()ident(c)operator(\)) \ + operator(()ident(b)operator([()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)) operator(/) ident(BYTEWIDTH)operator(]) \ + operator(|=) integer(1) operator(<<) operator((()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)) operator(%) ident(BYTEWIDTH)operator(\)\)) + +comment(/* Get the next unsigned number in the uncompiled pattern. */) +preprocessor(#define) ident(GET_UNSIGNED_NUMBER)operator(()ident(num)operator(\)) \ + reserved(do) operator({) reserved(if) operator(()ident(p) operator(!=) ident(pend)operator(\)) operator({) \ + ident(PATFETCH)operator(()ident(c)operator(\);) \ + reserved(while) operator(()ident(ISDIGIT)operator(()ident(c)operator(\)\)) operator({) \ + reserved(if) operator(()ident(num) operator(<) integer(0)operator(\)) \ + ident(num) operator(=) integer(0)operator(;) \ + ident(num) operator(=) ident(num) operator(*) integer(10) operator(+) ident(c) operator(-) char('0')operator(;) \ + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) \ + reserved(break)operator(;) \ + ident(PATFETCH)operator(()ident(c)operator(\);) \ + operator(}) \ + operator(}) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(STREQ)operator(()ident(s1)operator(,) ident(s2)operator(\)) operator((()ident(strcmp)operator(()ident(s1)operator(,) ident(s2)operator(\)) operator(==) integer(0)operator(\)\)) + +preprocessor(#define) ident(CHAR_CLASS_MAX_LENGTH) integer(6) comment(/* Namely, `xdigit'. */) + +preprocessor(#define) ident(IS_CHAR_CLASS)operator(()ident(string)operator(\)) \ + operator(()ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(alpha)delimiter(")>operator(\)) operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(upper)delimiter(")>operator(\)) \ + operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(lower)delimiter(")>operator(\)) operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(digit)delimiter(")>operator(\)) \ + operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(alnum)delimiter(")>operator(\)) operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(xdigit)delimiter(")>operator(\)) \ + operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(space)delimiter(")>operator(\)) operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(print)delimiter(")>operator(\)) \ + operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(punct)delimiter(")>operator(\)) operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(graph)delimiter(")>operator(\)) \ + operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(cntrl)delimiter(")>operator(\)) operator(||) ident(STREQ)operator(()ident(string)operator(,) string<delimiter(")content(blank)delimiter(")>operator(\)\)) + +preprocessor(#define) ident(STORE_MBC)operator(()ident(p)operator(,) ident(c)operator(\)) \ + reserved(do) operator({) \ + operator(()ident(p)operator(\)[)integer(0)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)((()ident(c)operator(\)) operator(>>)integer(24)operator(\)) operator(&) hex(0xff)operator(\);) \ + operator(()ident(p)operator(\)[)integer(1)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)((()ident(c)operator(\)) operator(>>)integer(16)operator(\)) operator(&) hex(0xff)operator(\);) \ + operator(()ident(p)operator(\)[)integer(2)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)((()ident(c)operator(\)) operator(>>) integer(8)operator(\)) operator(&) hex(0xff)operator(\);) \ + operator(()ident(p)operator(\)[)integer(3)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)((()ident(c)operator(\)) operator(>>) integer(0)operator(\)) operator(&) hex(0xff)operator(\);) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(STORE_MBC_AND_INCR)operator(()ident(p)operator(,) ident(c)operator(\)) \ + reserved(do) operator({) \ + operator(*()ident(p)operator(\)++) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)((()ident(c)operator(\)) operator(>>)integer(24)operator(\)) operator(&) hex(0xff)operator(\);) \ + operator(*()ident(p)operator(\)++) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)((()ident(c)operator(\)) operator(>>)integer(16)operator(\)) operator(&) hex(0xff)operator(\);) \ + operator(*()ident(p)operator(\)++) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)((()ident(c)operator(\)) operator(>>) integer(8)operator(\)) operator(&) hex(0xff)operator(\);) \ + operator(*()ident(p)operator(\)++) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)((()ident(c)operator(\)) operator(>>) integer(0)operator(\)) operator(&) hex(0xff)operator(\);) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(EXTRACT_MBC)operator(()ident(p)operator(\)) \ + operator((()pre_type(unsigned) pre_type(int)operator(\)(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[)integer(0)operator(]) operator(<<) integer(24) operator(|) \ + operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[)integer(1)operator(]) operator(<<) integer(16) operator(|) \ + operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[)integer(2)operator(]) operator(<<) integer(8) operator(|) \ + operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[)integer(3)operator(]\)\)) + +preprocessor(#define) ident(EXTRACT_MBC_AND_INCR)operator(()ident(p)operator(\)) \ + operator((()pre_type(unsigned) pre_type(int)operator(\)(()ident(p)operator(\)) operator(+=) integer(4)operator(,) \ + operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[-)integer(4)operator(]) operator(<<) integer(24) operator(|) \ + operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[-)integer(3)operator(]) operator(<<) integer(16) operator(|) \ + operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[-)integer(2)operator(]) operator(<<) integer(8) operator(|) \ + operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[-)integer(1)operator(]\)\)) + +preprocessor(#define) ident(EXTRACT_UNSIGNED)operator(()ident(p)operator(\)) \ + operator((()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[)integer(0)operator(]) operator(|) operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[)integer(1)operator(]) operator(<<) integer(8)operator(\)) +preprocessor(#define) ident(EXTRACT_UNSIGNED_AND_INCR)operator(()ident(p)operator(\)) \ + operator((()ident(p)operator(\)) operator(+=) integer(2)operator(,) operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[-)integer(2)operator(]) operator(|) operator(()pre_type(unsigned) pre_type(char)operator(\)()ident(p)operator(\)[-)integer(1)operator(]) operator(<<) integer(8)operator(\)) + +comment(/* Handle (mb\)?charset(_not\)?. + + Structure of mbcharset(_not\)? in compiled pattern. + + struct { + unsinged char id; mbcharset(_not\)? + unsigned char sbc_size; + unsigned char sbc_map[sbc_size]; same as charset(_not\)? up to here. + unsigned short mbc_size; number of intervals. + struct { + unsigned long beg; beginning of interval. + unsigned long end; end of interval. + } intervals[mbc_size]; + }; */) + +directive(static) directive(void) +ident(set_list_bits)operator(()ident(c1)operator(,) ident(c2)operator(,) ident(b)operator(\)) + pre_type(unsigned) pre_type(long) ident(c1)operator(,) ident(c2)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(b)operator(;) +operator({) + pre_type(unsigned) pre_type(char) ident(sbc_size) operator(=) ident(b)operator([-)integer(1)operator(];) + pre_type(unsigned) pre_type(short) ident(mbc_size) operator(=) ident(EXTRACT_UNSIGNED)operator((&)ident(b)operator([)ident(sbc_size)operator(]\);) + pre_type(unsigned) pre_type(short) ident(beg)operator(,) ident(end)operator(,) ident(upb)operator(;) + + reserved(if) operator(()ident(c1) operator(>) ident(c2)operator(\)) + reserved(return)operator(;) + ident(b) operator(=) operator(&)ident(b)operator([)ident(sbc_size) operator(+) integer(2)operator(];) + + reserved(for) operator(()ident(beg) operator(=) integer(0)operator(,) ident(upb) operator(=) ident(mbc_size)operator(;) ident(beg) operator(<) ident(upb)operator(;) operator(\)) operator({) + pre_type(unsigned) pre_type(short) ident(mid) operator(=) operator(()pre_type(unsigned) pre_type(short)operator(\)()ident(beg) operator(+) ident(upb)operator(\)) operator(>>) integer(1)operator(;) + + reserved(if) operator((()pre_type(int)operator(\))ident(c1) operator(-) integer(1) operator(>) operator(()pre_type(int)operator(\))ident(EXTRACT_MBC)operator((&)ident(b)operator([)ident(mid)operator(*)integer(8)operator(+)integer(4)operator(]\)\)) + ident(beg) operator(=) ident(mid) operator(+) integer(1)operator(;) + reserved(else) + ident(upb) operator(=) ident(mid)operator(;) + operator(}) + + reserved(for) operator(()ident(end) operator(=) ident(beg)operator(,) ident(upb) operator(=) ident(mbc_size)operator(;) ident(end) operator(<) ident(upb)operator(;) operator(\)) operator({) + pre_type(unsigned) pre_type(short) ident(mid) operator(=) operator(()pre_type(unsigned) pre_type(short)operator(\)()ident(end) operator(+) ident(upb)operator(\)) operator(>>) integer(1)operator(;) + + reserved(if) operator((()pre_type(int)operator(\))ident(c2) operator(>=) operator(()pre_type(int)operator(\))ident(EXTRACT_MBC)operator((&)ident(b)operator([)ident(mid)operator(*)integer(8)operator(]\)) operator(-) integer(1)operator(\)) + ident(end) operator(=) ident(mid) operator(+) integer(1)operator(;) + reserved(else) + ident(upb) operator(=) ident(mid)operator(;) + operator(}) + + reserved(if) operator(()ident(beg) operator(!=) ident(end)operator(\)) operator({) + reserved(if) operator(()ident(c1) operator(>) ident(EXTRACT_MBC)operator((&)ident(b)operator([)ident(beg)operator(*)integer(8)operator(]\)\)) + ident(c1) operator(=) ident(EXTRACT_MBC)operator((&)ident(b)operator([)ident(beg)operator(*)integer(8)operator(]\);) + reserved(if) operator(()ident(c2) operator(<) ident(EXTRACT_MBC)operator((&)ident(b)operator([()ident(end) operator(-) integer(1)operator(\)*)integer(8)operator(+)integer(4)operator(]\)\)) + ident(c2) operator(=) ident(EXTRACT_MBC)operator((&)ident(b)operator([()ident(end) operator(-) integer(1)operator(\)*)integer(8)operator(+)integer(4)operator(]\);) + operator(}) + reserved(if) operator(()ident(end) operator(<) ident(mbc_size) operator(&&) ident(end) operator(!=) ident(beg) operator(+) integer(1)operator(\)) + comment(/* NOTE: memcpy(\) would not work here. */) + ident(memmove)operator((&)ident(b)operator([()ident(beg) operator(+) integer(1)operator(\)*)integer(8)operator(],) operator(&)ident(b)operator([)ident(end)operator(*)integer(8)operator(],) operator(()ident(mbc_size) operator(-) ident(end)operator(\)*)integer(8)operator(\);) + ident(STORE_MBC)operator((&)ident(b)operator([)ident(beg)operator(*)integer(8) operator(+) integer(0)operator(],) ident(c1)operator(\);) + ident(STORE_MBC)operator((&)ident(b)operator([)ident(beg)operator(*)integer(8) operator(+) integer(4)operator(],) ident(c2)operator(\);) + ident(mbc_size) operator(+=) ident(beg) operator(-) ident(end) operator(+) integer(1)operator(;) + ident(STORE_NUMBER)operator((&)ident(b)operator([-)integer(2)operator(],) ident(mbc_size)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(is_in_list_sbc)operator(()ident(c)operator(,) ident(b)operator(\)) + pre_type(unsigned) pre_type(long) ident(c)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(b)operator(;) +operator({) + pre_type(unsigned) pre_type(short) ident(size)operator(;) + + ident(size) operator(=) operator(*)ident(b)operator(++;) + reserved(return) operator((()pre_type(int)operator(\))ident(c) operator(/) ident(BYTEWIDTH) operator(<) operator(()pre_type(int)operator(\))ident(size) operator(&&) ident(b)operator([)ident(c) operator(/) ident(BYTEWIDTH)operator(]) operator(&) integer(1) operator(<<) ident(c) operator(%) ident(BYTEWIDTH)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(is_in_list_mbc)operator(()ident(c)operator(,) ident(b)operator(\)) + pre_type(unsigned) pre_type(long) ident(c)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(b)operator(;) +operator({) + pre_type(unsigned) pre_type(short) ident(size)operator(;) + pre_type(unsigned) pre_type(short) ident(i)operator(,) ident(j)operator(;) + + ident(size) operator(=) operator(*)ident(b)operator(++;) + ident(b) operator(+=) ident(size) operator(+) integer(2)operator(;) + ident(size) operator(=) ident(EXTRACT_UNSIGNED)operator((&)ident(b)operator([-)integer(2)operator(]\);) + reserved(if) operator(()ident(size) operator(==) integer(0)operator(\)) reserved(return) integer(0)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(,) ident(j) operator(=) ident(size)operator(;) ident(i) operator(<) ident(j)operator(;) operator(\)) operator({) + pre_type(unsigned) pre_type(short) ident(k) operator(=) operator(()pre_type(unsigned) pre_type(short)operator(\)()ident(i) operator(+) ident(j)operator(\)) operator(>>) integer(1)operator(;) + + reserved(if) operator(()ident(c) operator(>) ident(EXTRACT_MBC)operator((&)ident(b)operator([)ident(k)operator(*)integer(8)operator(+)integer(4)operator(]\)\)) + ident(i) operator(=) ident(k) operator(+) integer(1)operator(;) + reserved(else) + ident(j) operator(=) ident(k)operator(;) + operator(}) + reserved(if) operator(()ident(i) operator(<) ident(size) operator(&&) ident(EXTRACT_MBC)operator((&)ident(b)operator([)ident(i)operator(*)integer(8)operator(]\)) operator(<=) ident(c)operator(\)) + reserved(return) integer(1)operator(;) + + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(is_in_list)operator(()ident(c)operator(,) ident(b)operator(\)) + pre_type(unsigned) pre_type(long) ident(c)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(b)operator(;) +operator({) + reserved(return) ident(is_in_list_sbc)operator(()ident(c)operator(,) ident(b)operator(\)) operator(||) operator(()ident(current_mbctype) operator(?) ident(is_in_list_mbc)operator(()ident(c)operator(,) ident(b)operator(\)) operator(:) integer(0)operator(\);) +operator(}) + +directive(static) directive(void) +ident(print_partial_compiled_pattern)operator(()ident(start)operator(,) ident(end)operator(\)) + pre_type(unsigned) pre_type(char) operator(*)ident(start)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(end)operator(;) +operator({) + pre_type(int) ident(mcnt)operator(,) ident(mcnt2)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(p) operator(=) ident(start)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(pend) operator(=) ident(end)operator(;) + + reserved(if) operator(()ident(start) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(printf)operator(()string<delimiter(")content((null\))char(\\n)delimiter(")>operator(\);) + reserved(return)operator(;) + operator(}) + + comment(/* Loop over pattern commands. */) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(switch) operator((()reserved(enum) ident(regexpcode)operator(\)*)ident(p)operator(++\)) operator({) + reserved(case) label(unused)operator(:) + ident(printf)operator(()string<delimiter(")content(/unused)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(exactn)operator(:) + ident(mcnt) operator(=) operator(*)ident(p)operator(++;) + ident(printf)operator(()string<delimiter(")content(/exactn/%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(do) operator({) + ident(putchar)operator(()char('/')operator(\);) + ident(printf)operator(()string<delimiter(")content(%c)delimiter(")>operator(,) operator(*)ident(p)operator(++\);) + operator(}) + reserved(while) operator((--)ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(start_memory)operator(:) + ident(mcnt) operator(=) operator(*)ident(p)operator(++;) + ident(printf)operator(()string<delimiter(")content(/start_memory/%d/%d)delimiter(")>operator(,) ident(mcnt)operator(,) operator(*)ident(p)operator(++\);) + reserved(break)operator(;) + + reserved(case) label(stop_memory)operator(:) + ident(mcnt) operator(=) operator(*)ident(p)operator(++;) + ident(printf)operator(()string<delimiter(")content(/stop_memory/%d/%d)delimiter(")>operator(,) ident(mcnt)operator(,) operator(*)ident(p)operator(++\);) + reserved(break)operator(;) + + reserved(case) label(start_paren)operator(:) + ident(printf)operator(()string<delimiter(")content(/start_paren)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(stop_paren)operator(:) + ident(printf)operator(()string<delimiter(")content(/stop_paren)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(casefold_on)operator(:) + ident(printf)operator(()string<delimiter(")content(/casefold_on)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(casefold_off)operator(:) + ident(printf)operator(()string<delimiter(")content(/casefold_off)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(option_set)operator(:) + ident(printf)operator(()string<delimiter(")content(/option_set/%d)delimiter(")>operator(,) operator(*)ident(p)operator(++\);) + reserved(break)operator(;) + + reserved(case) label(start_nowidth)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/start_nowidth//%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(stop_nowidth)operator(:) + ident(printf)operator(()string<delimiter(")content(/stop_nowidth//)delimiter(")>operator(\);) + ident(p) operator(+=) integer(2)operator(;) + reserved(break)operator(;) + + reserved(case) label(pop_and_fail)operator(:) + ident(printf)operator(()string<delimiter(")content(/pop_and_fail)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(stop_backtrack)operator(:) + ident(printf)operator(()string<delimiter(")content(/stop_backtrack//)delimiter(")>operator(\);) + ident(p) operator(+=) integer(2)operator(;) + reserved(break)operator(;) + + reserved(case) label(duplicate)operator(:) + ident(printf)operator(()string<delimiter(")content(/duplicate/%d)delimiter(")>operator(,) operator(*)ident(p)operator(++\);) + reserved(break)operator(;) + + reserved(case) label(anychar)operator(:) + ident(printf)operator(()string<delimiter(")content(/anychar)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(anychar_repeat)operator(:) + ident(printf)operator(()string<delimiter(")content(/anychar_repeat)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(charset)operator(:) + reserved(case) label(charset_not)operator(:) + operator({) + directive(register) pre_type(int) ident(c)operator(;) + + ident(printf)operator(()string<delimiter(")content(/charset%s)delimiter(")>operator(,) + operator(()reserved(enum) ident(regexpcode)operator(\)*()ident(p) operator(-) integer(1)operator(\)) operator(==) ident(charset_not) operator(?) string<delimiter(")content(_not)delimiter(")> operator(:) string<delimiter(")delimiter(")>operator(\);) + + ident(mcnt) operator(=) operator(*)ident(p)operator(++;) + ident(printf)operator(()string<delimiter(")content(/%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(for) operator(()ident(c) operator(=) integer(0)operator(;) ident(c) operator(<) ident(mcnt)operator(;) ident(c)operator(++\)) operator({) + pre_type(unsigned) ident(bit)operator(;) + pre_type(unsigned) pre_type(char) ident(map_byte) operator(=) ident(p)operator([)ident(c)operator(];) + + ident(putchar)operator(()char('/')operator(\);) + + reserved(for) operator(()ident(bit) operator(=) integer(0)operator(;) ident(bit) operator(<) ident(BYTEWIDTH)operator(;) ident(bit)operator(++\)) + reserved(if) operator(()ident(map_byte) operator(&) operator(()integer(1) operator(<<) ident(bit)operator(\)\)) + ident(printf)operator(()string<delimiter(")content(%c)delimiter(")>operator(,) ident(c) operator(*) ident(BYTEWIDTH) operator(+) ident(bit)operator(\);) + operator(}) + ident(p) operator(+=) ident(mcnt)operator(;) + ident(mcnt) operator(=) ident(EXTRACT_UNSIGNED_AND_INCR)operator(()ident(p)operator(\);) + ident(putchar)operator(()char('/')operator(\);) + reserved(while) operator(()ident(mcnt)operator(--\)) operator({) + ident(print_mbc)operator(()ident(EXTRACT_MBC_AND_INCR)operator(()ident(p)operator(\)\);) + ident(putchar)operator(()char('-')operator(\);) + ident(print_mbc)operator(()ident(EXTRACT_MBC_AND_INCR)operator(()ident(p)operator(\)\);) + operator(}) + reserved(break)operator(;) + operator(}) + + reserved(case) label(begline)operator(:) + ident(printf)operator(()string<delimiter(")content(/begline)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(endline)operator(:) + ident(printf)operator(()string<delimiter(")content(/endline)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(on_failure_jump)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/on_failure_jump//%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(dummy_failure_jump)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/dummy_failure_jump//%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(push_dummy_failure)operator(:) + ident(printf)operator(()string<delimiter(")content(/push_dummy_failure)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(finalize_jump)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/finalize_jump//%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(maybe_finalize_jump)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/maybe_finalize_jump//%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(jump_past_alt)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/jump_past_alt//%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(jump)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/jump//%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(succeed_n)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt2)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/succeed_n//%d//%d)delimiter(")>operator(,) ident(mcnt)operator(,) ident(mcnt2)operator(\);) + reserved(break)operator(;) + + reserved(case) label(jump_n)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt2)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/jump_n//%d//%d)delimiter(")>operator(,) ident(mcnt)operator(,) ident(mcnt2)operator(\);) + reserved(break)operator(;) + + reserved(case) label(set_number_at)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt2)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/set_number_at//%d//%d)delimiter(")>operator(,) ident(mcnt)operator(,) ident(mcnt2)operator(\);) + reserved(break)operator(;) + + reserved(case) label(try_next)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/try_next//%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(finalize_push)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/finalize_push//%d)delimiter(")>operator(,) ident(mcnt)operator(\);) + reserved(break)operator(;) + + reserved(case) label(finalize_push_n)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt2)operator(,) ident(p)operator(\);) + ident(printf)operator(()string<delimiter(")content(/finalize_push_n//%d//%d)delimiter(")>operator(,) ident(mcnt)operator(,) ident(mcnt2)operator(\);) + reserved(break)operator(;) + + reserved(case) label(wordbound)operator(:) + ident(printf)operator(()string<delimiter(")content(/wordbound)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(notwordbound)operator(:) + ident(printf)operator(()string<delimiter(")content(/notwordbound)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(wordbeg)operator(:) + ident(printf)operator(()string<delimiter(")content(/wordbeg)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(wordend)operator(:) + ident(printf)operator(()string<delimiter(")content(/wordend)delimiter(")>operator(\);) + + reserved(case) label(wordchar)operator(:) + ident(printf)operator(()string<delimiter(")content(/wordchar)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(notwordchar)operator(:) + ident(printf)operator(()string<delimiter(")content(/notwordchar)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(begbuf)operator(:) + ident(printf)operator(()string<delimiter(")content(/begbuf)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(endbuf)operator(:) + ident(printf)operator(()string<delimiter(")content(/endbuf)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(endbuf2)operator(:) + ident(printf)operator(()string<delimiter(")content(/endbuf2)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) label(begpos)operator(:) + ident(printf)operator(()string<delimiter(")content(/begpos)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(printf)operator(()string<delimiter(")content(?%d)delimiter(")>operator(,) operator(*()ident(p)operator(-)integer(1)operator(\)\);) + operator(}) + operator(}) + ident(printf)operator(()string<delimiter(")content(/)char(\\n)delimiter(")>operator(\);) +operator(}) + + +directive(static) directive(void) +ident(print_compiled_pattern)operator(()ident(bufp)operator(\)) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(bufp)operator(;) +operator({) + pre_type(unsigned) pre_type(char) operator(*)ident(buffer) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(bufp)operator(->)ident(buffer)operator(;) + + ident(print_partial_compiled_pattern)operator(()ident(buffer)operator(,) ident(buffer) operator(+) ident(bufp)operator(->)ident(used)operator(\);) +operator(}) + +directive(static) pre_type(char)operator(*) +ident(calculate_must_string)operator(()ident(start)operator(,) ident(end)operator(\)) + pre_type(char) operator(*)ident(start)operator(;) + pre_type(char) operator(*)ident(end)operator(;) +operator({) + pre_type(int) ident(mcnt)operator(;) + pre_type(int) ident(max) operator(=) integer(0)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(p) operator(=) operator(()pre_type(unsigned) pre_type(char) operator(*\))ident(start)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(pend) operator(=) operator(()pre_type(unsigned) pre_type(char) operator(*\))ident(end)operator(;) + pre_type(char) operator(*)ident(must) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(start) operator(==) pre_constant(NULL)operator(\)) reserved(return) integer(0)operator(;) + + comment(/* Loop over pattern commands. */) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + reserved(switch) operator((()reserved(enum) ident(regexpcode)operator(\)*)ident(p)operator(++\)) operator({) + reserved(case) label(unused)operator(:) + reserved(break)operator(;) + + reserved(case) label(exactn)operator(:) + ident(mcnt) operator(=) operator(*)ident(p)operator(;) + reserved(if) operator(()ident(mcnt) operator(>) ident(max)operator(\)) operator({) + ident(must) operator(=) operator(()pre_type(char) operator(*\))ident(p)operator(;) + ident(max) operator(=) ident(mcnt)operator(;) + operator(}) + ident(p) operator(+=) ident(mcnt)operator(+)integer(1)operator(;) + reserved(break)operator(;) + + reserved(case) label(start_memory)operator(:) + reserved(case) label(stop_memory)operator(:) + ident(p) operator(+=) integer(2)operator(;) + reserved(break)operator(;) + + reserved(case) label(duplicate)operator(:) + reserved(case) label(option_set)operator(:) + ident(p)operator(++;) + reserved(break)operator(;) + + reserved(case) label(casefold_on)operator(:) + reserved(case) label(casefold_off)operator(:) + reserved(return) integer(0)operator(;) comment(/* should not check must_string */) + + reserved(case) label(pop_and_fail)operator(:) + reserved(case) label(anychar)operator(:) + reserved(case) label(anychar_repeat)operator(:) + reserved(case) label(begline)operator(:) + reserved(case) label(endline)operator(:) + reserved(case) label(wordbound)operator(:) + reserved(case) label(notwordbound)operator(:) + reserved(case) label(wordbeg)operator(:) + reserved(case) label(wordend)operator(:) + reserved(case) label(wordchar)operator(:) + reserved(case) label(notwordchar)operator(:) + reserved(case) label(begbuf)operator(:) + reserved(case) label(endbuf)operator(:) + reserved(case) label(endbuf2)operator(:) + reserved(case) label(begpos)operator(:) + reserved(case) label(push_dummy_failure)operator(:) + reserved(case) label(start_paren)operator(:) + reserved(case) label(stop_paren)operator(:) + reserved(break)operator(;) + + reserved(case) label(charset)operator(:) + reserved(case) label(charset_not)operator(:) + ident(mcnt) operator(=) operator(*)ident(p)operator(++;) + ident(p) operator(+=) ident(mcnt)operator(;) + ident(mcnt) operator(=) ident(EXTRACT_UNSIGNED_AND_INCR)operator(()ident(p)operator(\);) + reserved(while) operator(()ident(mcnt)operator(--\)) operator({) + ident(p) operator(+=) integer(8)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(on_failure_jump)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + reserved(if) operator(()ident(mcnt) operator(>) integer(0)operator(\)) ident(p) operator(+=) ident(mcnt)operator(;) + reserved(if) operator((()reserved(enum) ident(regexpcode)operator(\))ident(p)operator([-)integer(3)operator(]) operator(==) ident(jump)operator(\)) operator({) + ident(p) operator(-=) integer(2)operator(;) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + reserved(if) operator(()ident(mcnt) operator(>) integer(0)operator(\)) ident(p) operator(+=) ident(mcnt)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(dummy_failure_jump)operator(:) + reserved(case) label(succeed_n)operator(:) + reserved(case) label(try_next)operator(:) + reserved(case) label(jump)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + reserved(if) operator(()ident(mcnt) operator(>) integer(0)operator(\)) ident(p) operator(+=) ident(mcnt)operator(;) + reserved(break)operator(;) + + reserved(case) label(start_nowidth)operator(:) + reserved(case) label(stop_nowidth)operator(:) + reserved(case) label(stop_backtrack)operator(:) + reserved(case) label(finalize_jump)operator(:) + reserved(case) label(maybe_finalize_jump)operator(:) + reserved(case) label(finalize_push)operator(:) + ident(p) operator(+=) integer(2)operator(;) + reserved(break)operator(;) + + reserved(case) label(jump_n)operator(:) + reserved(case) label(set_number_at)operator(:) + reserved(case) label(finalize_push_n)operator(:) + ident(p) operator(+=) integer(4)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(return) ident(must)operator(;) +operator(}) + +directive(static) pre_type(unsigned) pre_type(int) +ident(read_backslash)operator(()ident(c)operator(\)) + pre_type(int) ident(c)operator(;) +operator({) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('n')operator(:) + reserved(return) char('\\n')operator(;) + + reserved(case) char('t')operator(:) + reserved(return) char('\\t')operator(;) + + reserved(case) char('r')operator(:) + reserved(return) char('\\r')operator(;) + + reserved(case) char('f')operator(:) + reserved(return) char('\\f')operator(;) + + reserved(case) char('v')operator(:) + reserved(return) char('\\v')operator(;) + + reserved(case) char('a')operator(:) + reserved(return) char('\\007')operator(;) + + reserved(case) char('b')operator(:) + reserved(return) char('\\010')operator(;) + + reserved(case) char('e')operator(:) + reserved(return) char('\\033')operator(;) + operator(}) + reserved(return) ident(c)operator(;) +operator(}) + +directive(static) pre_type(unsigned) pre_type(int) +ident(read_special)operator(()ident(p)operator(,) ident(pend)operator(,) ident(pp)operator(\)) + directive(const) pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(,) operator(**)ident(pp)operator(;) +operator({) + pre_type(int) ident(c)operator(;) + + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('M')operator(:) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(c) operator(!=) char('-')operator(\)) reserved(return) operator(-)integer(1)operator(;) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + operator(*)ident(pp) operator(=) ident(p)operator(;) + reserved(if) operator(()ident(c) operator(==) char('\\\\')operator(\)) operator({) + reserved(return) ident(read_special)operator((--)ident(p)operator(,) ident(pend)operator(,) ident(pp)operator(\)) operator(|) hex(0x80)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) reserved(return) operator(~)integer(0)operator(;) + reserved(else) operator({) + reserved(return) operator((()ident(c) operator(&) hex(0xff)operator(\)) operator(|) hex(0x80)operator(\);) + operator(}) + + reserved(case) char('C')operator(:) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(c) operator(!=) char('-')operator(\)) reserved(return) operator(~)integer(0)operator(;) + reserved(case) char('c')operator(:) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + operator(*)ident(pp) operator(=) ident(p)operator(;) + reserved(if) operator(()ident(c) operator(==) char('\\\\')operator(\)) operator({) + ident(c) operator(=) ident(read_special)operator((--)ident(p)operator(,) ident(pend)operator(,) ident(pp)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('?')operator(\)) reserved(return) oct(0177)operator(;) + reserved(else) reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) reserved(return) operator(~)integer(0)operator(;) + reserved(return) ident(c) operator(&) hex(0x9f)operator(;) + reserved(default)operator(:) + operator(*)ident(pp) operator(=) ident(p) operator(+) integer(1)operator(;) + reserved(return) ident(read_backslash)operator(()ident(c)operator(\);) + operator(}) + + label(end_of_pattern)operator(:) + reserved(return) operator(~)integer(0)operator(;) +operator(}) + +comment(/* re_compile_pattern takes a regular-expression string + and converts it into a buffer full of byte commands for matching. + + PATTERN is the address of the pattern string + SIZE is the length of it. + BUFP is a struct re_pattern_buffer * which points to the info + on where to store the byte commands. + This structure contains a char * which points to the + actual space, which should have been obtained with malloc. + re_compile_pattern may use realloc to grow the buffer space. + + The number of bytes of commands can be found out by looking in + the `struct re_pattern_buffer' that bufp pointed to, after + re_compile_pattern returns. */) + +pre_type(char) operator(*) +ident(re_compile_pattern)operator(()ident(pattern)operator(,) ident(size)operator(,) ident(bufp)operator(\)) + directive(const) pre_type(char) operator(*)ident(pattern)operator(;) + pre_type(int) ident(size)operator(;) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(bufp)operator(;) +operator({) + directive(register) pre_type(char) operator(*)ident(b) operator(=) ident(bufp)operator(->)ident(buffer)operator(;) + directive(register) directive(const) pre_type(char) operator(*)ident(p) operator(=) ident(pattern)operator(;) + directive(const) pre_type(char) operator(*)ident(nextp)operator(;) + directive(const) pre_type(char) operator(*)ident(pend) operator(=) ident(pattern) operator(+) ident(size)operator(;) + directive(register) pre_type(unsigned) pre_type(int) ident(c)operator(,) ident(c1) operator(=) integer(0)operator(;) + directive(const) pre_type(char) operator(*)ident(p0)operator(;) + pre_type(int) ident(numlen)operator(;) +preprocessor(#define) ident(ERROR_MSG_MAX_SIZE) integer(200) + directive(static) pre_type(char) ident(error_msg)operator([)ident(ERROR_MSG_MAX_SIZE)operator(+)integer(1)operator(];) + + comment(/* Address of the count-byte of the most recently inserted `exactn' + command. This makes it possible to tell whether a new exact-match + character can be added to that command or requires a new `exactn' + command. */) + + pre_type(char) operator(*)ident(pending_exact) operator(=) integer(0)operator(;) + + comment(/* Address of the place where a forward-jump should go to the end of + the containing expression. Each alternative of an `or', except the + last, ends with a forward-jump of this sort. */) + + pre_type(char) operator(*)ident(fixup_alt_jump) operator(=) integer(0)operator(;) + + comment(/* Address of start of the most recently finished expression. + This tells postfix * where to find the start of its operand. */) + + pre_type(char) operator(*)ident(laststart) operator(=) integer(0)operator(;) + + comment(/* In processing a repeat, 1 means zero matches is allowed. */) + + pre_type(char) ident(zero_times_ok)operator(;) + + comment(/* In processing a repeat, 1 means many matches is allowed. */) + + pre_type(char) ident(many_times_ok)operator(;) + + comment(/* In processing a repeat, 1 means non-greedy matches. */) + + pre_type(char) ident(greedy)operator(;) + + comment(/* Address of beginning of regexp, or inside of last (. */) + + pre_type(char) operator(*)ident(begalt) operator(=) ident(b)operator(;) + + comment(/* Place in the uncompiled pattern (i.e., the {\) to + which to go back if the interval is invalid. */) + directive(const) pre_type(char) operator(*)ident(beg_interval)operator(;) + + comment(/* In processing an interval, at least this many matches must be made. */) + pre_type(int) ident(lower_bound)operator(;) + + comment(/* In processing an interval, at most this many matches can be made. */) + pre_type(int) ident(upper_bound)operator(;) + + comment(/* Stack of information saved by ( and restored by \). + Five stack elements are pushed by each (: + First, the value of b. + Second, the value of fixup_alt_jump. + Third, the value of begalt. + Fourth, the value of regnum. + Fifth, the type of the paren. */) + + pre_type(int) ident(stacka)operator([)integer(40)operator(];) + pre_type(int) operator(*)ident(stackb) operator(=) ident(stacka)operator(;) + pre_type(int) operator(*)ident(stackp) operator(=) ident(stackb)operator(;) + pre_type(int) operator(*)ident(stacke) operator(=) ident(stackb) operator(+) integer(40)operator(;) + + comment(/* Counts ('s as they are encountered. Remembered for the matching \), + where it becomes the register number to put in the stop_memory + command. */) + + pre_type(int) ident(regnum) operator(=) integer(1)operator(;) + + pre_type(int) ident(range) operator(=) integer(0)operator(;) + pre_type(int) ident(had_mbchar) operator(=) integer(0)operator(;) + pre_type(int) ident(had_num_literal) operator(=) integer(0)operator(;) + pre_type(int) ident(had_char_class) operator(=) integer(0)operator(;) + + pre_type(int) ident(options) operator(=) ident(bufp)operator(->)ident(options)operator(;) + + ident(bufp)operator(->)ident(fastmap_accurate) operator(=) integer(0)operator(;) + ident(bufp)operator(->)ident(must) operator(=) integer(0)operator(;) + ident(bufp)operator(->)ident(must_skip) operator(=) integer(0)operator(;) + + comment(/* Initialize the syntax table. */) + ident(init_syntax_once)operator((\);) + + reserved(if) operator(()ident(bufp)operator(->)ident(allocated) operator(==) integer(0)operator(\)) operator({) + ident(bufp)operator(->)ident(allocated) operator(=) ident(INIT_BUF_SIZE)operator(;) + comment(/* EXTEND_BUFFER loses when bufp->allocated is 0. */) + ident(bufp)operator(->)ident(buffer) operator(=) operator(()pre_type(char)operator(*\))ident(xrealloc)operator(()ident(bufp)operator(->)ident(buffer)operator(,) ident(INIT_BUF_SIZE)operator(\);) + reserved(if) operator((!)ident(bufp)operator(->)ident(buffer)operator(\)) reserved(goto) ident(memory_exhausted)operator(;) comment(/* this not happen */) + ident(begalt) operator(=) ident(b) operator(=) ident(bufp)operator(->)ident(buffer)operator(;) + operator(}) + + reserved(while) operator(()ident(p) operator(!=) ident(pend)operator(\)) operator({) + ident(PATFETCH)operator(()ident(c)operator(\);) + + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('$')operator(:) + reserved(if) operator(()ident(bufp)operator(->)ident(options) operator(&) ident(RE_OPTION_SINGLELINE)operator(\)) operator({) + ident(BUFPUSH)operator(()ident(endbuf)operator(\);) + operator(}) + reserved(else) operator({) + ident(p0) operator(=) ident(p)operator(;) + comment(/* When testing what follows the $, + look past the \\-constructs that don't consume anything. */) + + reserved(while) operator(()ident(p0) operator(!=) ident(pend)operator(\)) operator({) + reserved(if) operator((*)ident(p0) operator(==) char('\\\\') operator(&&) ident(p0) operator(+) integer(1) operator(!=) ident(pend) + operator(&&) operator(()ident(p0)operator([)integer(1)operator(]) operator(==) char('b') operator(||) ident(p0)operator([)integer(1)operator(]) operator(==) char('B')operator(\)\)) + ident(p0) operator(+=) integer(2)operator(;) + reserved(else) + reserved(break)operator(;) + operator(}) + ident(BUFPUSH)operator(()ident(endline)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('^')operator(:) + reserved(if) operator(()ident(bufp)operator(->)ident(options) operator(&) ident(RE_OPTION_SINGLELINE)operator(\)) + ident(BUFPUSH)operator(()ident(begbuf)operator(\);) + reserved(else) + ident(BUFPUSH)operator(()ident(begline)operator(\);) + reserved(break)operator(;) + + reserved(case) char('+')operator(:) + reserved(case) char('?')operator(:) + reserved(case) char('*')operator(:) + comment(/* If there is no previous pattern, char not special. */) + reserved(if) operator((!)ident(laststart)operator(\)) operator({) + ident(snprintf)operator(()ident(error_msg)operator(,) ident(ERROR_MSG_MAX_SIZE)operator(,) + string<delimiter(")content(invalid regular expression; there's no previous pattern, to which '%c' would define cardinality at %d)delimiter(")>operator(,) + ident(c)operator(,) ident(p)operator(-)ident(pattern)operator(\);) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) ident(error_msg)operator(\);) + operator(}) + comment(/* If there is a sequence of repetition chars, + collapse it down to just one. */) + ident(zero_times_ok) operator(=) ident(c) operator(!=) char('+')operator(;) + ident(many_times_ok) operator(=) ident(c) operator(!=) char('?')operator(;) + ident(greedy) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(p) operator(!=) ident(pend)operator(\)) operator({) + ident(PATFETCH)operator(()ident(c)operator(\);) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('?')operator(:) + ident(greedy) operator(=) integer(0)operator(;) + reserved(break)operator(;) + reserved(case) char('*')operator(:) + reserved(case) char('+')operator(:) + reserved(goto) ident(nested_meta)operator(;) + reserved(default)operator(:) + ident(PATUNFETCH)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + + label(repeat)operator(:) + comment(/* Star, etc. applied to an empty pattern is equivalent + to an empty pattern. */) + reserved(if) operator((!)ident(laststart)operator(\)) + reserved(break)operator(;) + + reserved(if) operator(()ident(greedy) operator(&&) ident(many_times_ok) operator(&&) operator(*)ident(laststart) operator(==) ident(anychar) operator(&&) ident(b) operator(-) ident(laststart) operator(<=) integer(2)operator(\)) operator({) + reserved(if) operator(()ident(b)operator([-)integer(1)operator(]) operator(==) ident(stop_paren)operator(\)) + ident(b)operator(--;) + reserved(if) operator(()ident(zero_times_ok)operator(\)) + operator(*)ident(laststart) operator(=) ident(anychar_repeat)operator(;) + reserved(else) operator({) + ident(BUFPUSH)operator(()ident(anychar_repeat)operator(\);) + operator(}) + reserved(break)operator(;) + operator(}) + comment(/* Now we know whether or not zero matches is allowed + and also whether or not two or more matches is allowed. */) + reserved(if) operator(()ident(many_times_ok)operator(\)) operator({) + comment(/* If more than one repetition is allowed, put in at the + end a backward relative jump from b to before the next + jump we're going to put in below (which jumps from + laststart to after this jump\). */) + ident(GET_BUFFER_SPACE)operator(()integer(3)operator(\);) + ident(store_jump)operator(()ident(b)operator(,)ident(greedy)operator(?)label(maybe_finalize_jump)operator(:)ident(finalize_push)operator(,)ident(laststart)operator(-)integer(3)operator(\);) + ident(b) operator(+=) integer(3)operator(;) comment(/* Because store_jump put stuff here. */) + operator(}) + + comment(/* On failure, jump from laststart to next pattern, which will be the + end of the buffer after this jump is inserted. */) + ident(GET_BUFFER_SPACE)operator(()integer(3)operator(\);) + ident(insert_jump)operator(()ident(on_failure_jump)operator(,) ident(laststart)operator(,) ident(b) operator(+) integer(3)operator(,) ident(b)operator(\);) + ident(b) operator(+=) integer(3)operator(;) + + reserved(if) operator(()ident(zero_times_ok)operator(\)) operator({) + reserved(if) operator(()ident(greedy) operator(==) integer(0)operator(\)) operator({) + ident(GET_BUFFER_SPACE)operator(()integer(3)operator(\);) + ident(insert_jump)operator(()ident(try_next)operator(,) ident(laststart)operator(,) ident(b) operator(+) integer(3)operator(,) ident(b)operator(\);) + ident(b) operator(+=) integer(3)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + comment(/* At least one repetition is required, so insert a + `dummy_failure_jump' before the initial + `on_failure_jump' instruction of the loop. This + effects a skip over that instruction the first time + we hit that loop. */) + ident(GET_BUFFER_SPACE)operator(()integer(3)operator(\);) + ident(insert_jump)operator(()ident(dummy_failure_jump)operator(,) ident(laststart)operator(,) ident(laststart) operator(+) integer(6)operator(,) ident(b)operator(\);) + ident(b) operator(+=) integer(3)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('.')operator(:) + ident(laststart) operator(=) ident(b)operator(;) + ident(BUFPUSH)operator(()ident(anychar)operator(\);) + reserved(break)operator(;) + + reserved(case) char('[')operator(:) + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(invalid regular expression; '[' can't be the last character ie. can't start range at the end of pattern)delimiter(")>operator(\);) + reserved(while) operator((()ident(b) operator(-) ident(bufp)operator(->)ident(buffer) operator(+) integer(9) operator(+) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(\)) + operator(>) ident(bufp)operator(->)ident(allocated)operator(\)) + ident(EXTEND_BUFFER)operator(;) + + ident(laststart) operator(=) ident(b)operator(;) + reserved(if) operator((*)ident(p) operator(==) char('^')operator(\)) operator({) + ident(BUFPUSH)operator(()ident(charset_not)operator(\);) + ident(p)operator(++;) + operator(}) + reserved(else) + ident(BUFPUSH)operator(()ident(charset)operator(\);) + ident(p0) operator(=) ident(p)operator(;) + + ident(BUFPUSH)operator((()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(\);) + comment(/* Clear the whole map */) + ident(memset)operator(()ident(b)operator(,) integer(0)operator(,) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH) operator(+) integer(2)operator(\);) + + ident(had_mbchar) operator(=) integer(0)operator(;) + ident(had_num_literal) operator(=) integer(0)operator(;) + ident(had_char_class) operator(=) integer(0)operator(;) + + comment(/* Read in characters and ranges, setting map bits. */) + reserved(for) operator((;;\)) operator({) + pre_type(int) ident(size)operator(;) + pre_type(unsigned) ident(last) operator(=) operator(()pre_type(unsigned)operator(\)-)integer(1)operator(;) + + reserved(if) operator((()ident(size) operator(=) ident(EXTRACT_UNSIGNED)operator((&)ident(b)operator([()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(]\)\)) operator(||) ident(current_mbctype)operator(\)) operator({) + comment(/* Ensure the space is enough to hold another interval + of multi-byte chars in charset(_not\)?. */) + ident(size) operator(=) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH) operator(+) integer(2) operator(+) ident(size)operator(*)integer(8) operator(+) integer(8)operator(;) + reserved(while) operator(()ident(b) operator(+) ident(size) operator(+) integer(1) operator(>) ident(bufp)operator(->)ident(buffer) operator(+) ident(bufp)operator(->)ident(allocated)operator(\)) + ident(EXTEND_BUFFER)operator(;) + operator(}) + label(range_retry)operator(:) + reserved(if) operator(()ident(range) operator(&&) ident(had_char_class)operator(\)) operator({) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(invalid regular expression; can't use character class as an end value of range)delimiter(")>operator(\);) + operator(}) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + + reserved(if) operator(()ident(c) operator(==) char(']')operator(\)) operator({) + reserved(if) operator(()ident(p) operator(==) ident(p0) operator(+) integer(1)operator(\)) operator({) + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(invalid regular expression; empty character class)delimiter(")>operator(\);) + ident(re_warning)operator(()string<delimiter(")content(character class has `]' without escape)delimiter(")>operator(\);) + operator(}) + reserved(else) + comment(/* Stop if this isn't merely a ] inside a bracket + expression, but rather the end of a bracket + expression. */) + reserved(break)operator(;) + operator(}) + comment(/* Look ahead to see if it's a range when the last thing + was a character class. */) + reserved(if) operator(()ident(had_char_class) operator(&&) ident(c) operator(==) char('-') operator(&&) operator(*)ident(p) operator(!=) char(']')operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(invalid regular expression; can't use character class as a start value of range)delimiter(")>operator(\);) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + ident(PATFETCH_MBC)operator(()ident(c)operator(\);) + ident(had_mbchar)operator(++;) + operator(}) + ident(had_char_class) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(c) operator(==) char('-') operator(&&) operator((()ident(p) operator(!=) ident(p0) operator(+) integer(1) operator(&&) operator(*)ident(p) operator(!=) char(']')operator(\)) operator(||) + operator(()ident(p)operator([)integer(0)operator(]) operator(==) char('-') operator(&&) ident(p)operator([)integer(1)operator(]) operator(!=) char(']')operator(\)) operator(||) + ident(range)operator(\)\)) + ident(re_warning)operator(()string<delimiter(")content(character class has `-' without escape)delimiter(")>operator(\);) + reserved(if) operator(()ident(c) operator(==) char('[') operator(&&) operator(*)ident(p) operator(!=) char(':')operator(\)) + ident(re_warning)operator(()string<delimiter(")content(character class has `[' without escape)delimiter(")>operator(\);) + + comment(/* \\ escapes characters when inside [...]. */) + reserved(if) operator(()ident(c) operator(==) char('\\\\')operator(\)) operator({) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('w')operator(:) + reserved(for) operator(()ident(c) operator(=) integer(0)operator(;) ident(c) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(c)operator(++\)) operator({) + reserved(if) operator(()ident(SYNTAX)operator(()ident(c)operator(\)) operator(==) ident(Sword) operator(||) + operator((!)ident(current_mbctype) operator(&&) ident(SYNTAX)operator(()ident(c)operator(\)) operator(==) ident(Sword2)operator(\)\)) + ident(SET_LIST_BIT)operator(()ident(c)operator(\);) + operator(}) + reserved(if) operator(()ident(current_mbctype)operator(\)) operator({) + ident(set_list_bits)operator(()hex(0x80)operator(,) hex(0xffffffff)operator(,) ident(b)operator(\);) + operator(}) + ident(had_char_class) operator(=) integer(1)operator(;) + ident(last) operator(=) operator(-)integer(1)operator(;) + reserved(continue)operator(;) + + reserved(case) char('W')operator(:) + reserved(for) operator(()ident(c) operator(=) integer(0)operator(;) ident(c) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(c)operator(++\)) operator({) + reserved(if) operator(()ident(SYNTAX)operator(()ident(c)operator(\)) operator(!=) ident(Sword) operator(&&) + operator((()ident(current_mbctype) operator(&&) operator(!)ident(re_mbctab)operator([)ident(c)operator(]\)) operator(||) + operator((!)ident(current_mbctype) operator(&&) ident(SYNTAX)operator(()ident(c)operator(\)) operator(!=) ident(Sword2)operator(\)\)\)) + ident(SET_LIST_BIT)operator(()ident(c)operator(\);) + operator(}) + ident(had_char_class) operator(=) integer(1)operator(;) + ident(last) operator(=) operator(-)integer(1)operator(;) + reserved(continue)operator(;) + + reserved(case) char('s')operator(:) + reserved(for) operator(()ident(c) operator(=) integer(0)operator(;) ident(c) operator(<) integer(256)operator(;) ident(c)operator(++\)) + reserved(if) operator(()ident(ISSPACE)operator(()ident(c)operator(\)\)) + ident(SET_LIST_BIT)operator(()ident(c)operator(\);) + ident(had_char_class) operator(=) integer(1)operator(;) + ident(last) operator(=) operator(-)integer(1)operator(;) + reserved(continue)operator(;) + + reserved(case) char('S')operator(:) + reserved(for) operator(()ident(c) operator(=) integer(0)operator(;) ident(c) operator(<) integer(256)operator(;) ident(c)operator(++\)) + reserved(if) operator((!)ident(ISSPACE)operator(()ident(c)operator(\)\)) + ident(SET_LIST_BIT)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(current_mbctype)operator(\)) + ident(set_list_bits)operator(()hex(0x80)operator(,) hex(0xffffffff)operator(,) ident(b)operator(\);) + ident(had_char_class) operator(=) integer(1)operator(;) + ident(last) operator(=) operator(-)integer(1)operator(;) + reserved(continue)operator(;) + + reserved(case) char('d')operator(:) + reserved(for) operator(()ident(c) operator(=) char('0')operator(;) ident(c) operator(<=) char('9')operator(;) ident(c)operator(++\)) + ident(SET_LIST_BIT)operator(()ident(c)operator(\);) + ident(had_char_class) operator(=) integer(1)operator(;) + ident(last) operator(=) operator(-)integer(1)operator(;) + reserved(continue)operator(;) + + reserved(case) char('D')operator(:) + reserved(for) operator(()ident(c) operator(=) integer(0)operator(;) ident(c) operator(<) integer(256)operator(;) ident(c)operator(++\)) + reserved(if) operator((!)ident(ISDIGIT)operator(()ident(c)operator(\)\)) + ident(SET_LIST_BIT)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(current_mbctype)operator(\)) + ident(set_list_bits)operator(()hex(0x80)operator(,) hex(0xffffffff)operator(,) ident(b)operator(\);) + ident(had_char_class) operator(=) integer(1)operator(;) + ident(last) operator(=) operator(-)integer(1)operator(;) + reserved(continue)operator(;) + + reserved(case) char('x')operator(:) + ident(c) operator(=) ident(scan_hex)operator(()ident(p)operator(,) integer(2)operator(,) operator(&)ident(numlen)operator(\);) + reserved(if) operator(()ident(numlen) operator(==) integer(0)operator(\)) reserved(goto) ident(invalid_escape)operator(;) + ident(p) operator(+=) ident(numlen)operator(;) + ident(had_num_literal) operator(=) integer(1)operator(;) + reserved(break)operator(;) + + reserved(case) char('0')operator(:) reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) reserved(case) char('4')operator(:) + reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) reserved(case) char('7')operator(:) reserved(case) char('8')operator(:) reserved(case) char('9')operator(:) + ident(PATUNFETCH)operator(;) + ident(c) operator(=) ident(scan_oct)operator(()ident(p)operator(,) integer(3)operator(,) operator(&)ident(numlen)operator(\);) + ident(p) operator(+=) ident(numlen)operator(;) + ident(had_num_literal) operator(=) integer(1)operator(;) + reserved(break)operator(;) + + reserved(case) char('M')operator(:) + reserved(case) char('C')operator(:) + reserved(case) char('c')operator(:) + operator({) + directive(const) pre_type(char) operator(*)ident(pp)operator(;) + + operator(--)ident(p)operator(;) + ident(c) operator(=) ident(read_special)operator(()ident(p)operator(,) ident(pend)operator(,) operator(&)ident(pp)operator(\);) + reserved(if) operator(()ident(c) operator(>) integer(255)operator(\)) reserved(goto) ident(invalid_escape)operator(;) + ident(p) operator(=) ident(pp)operator(;) + ident(had_num_literal) operator(=) integer(1)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(c) operator(=) ident(read_backslash)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + ident(PATFETCH_MBC)operator(()ident(c)operator(\);) + ident(had_mbchar)operator(++;) + operator(}) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('[') operator(&&) operator(*)ident(p) operator(==) char(':')operator(\)) operator({) comment(/* [:...:] */) + comment(/* Leave room for the null. */) + pre_type(char) ident(str)operator([)ident(CHAR_CLASS_MAX_LENGTH) operator(+) integer(1)operator(];) + + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + ident(c1) operator(=) integer(0)operator(;) + + comment(/* If pattern is `[[:'. */) + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(invalid regular expression; re can't end '[[:')delimiter(")>operator(\);) + + reserved(for) operator((;;\)) operator({) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(c) operator(==) char(':') operator(||) ident(c) operator(==) char(']') operator(||) ident(p) operator(==) ident(pend) + operator(||) ident(c1) operator(==) ident(CHAR_CLASS_MAX_LENGTH)operator(\)) + reserved(break)operator(;) + ident(str)operator([)ident(c1)operator(++]) operator(=) ident(c)operator(;) + operator(}) + ident(str)operator([)ident(c1)operator(]) operator(=) char('\\0')operator(;) + + comment(/* If isn't a word bracketed by `[:' and `:]': + undo the ending character, the letters, and + the leading `:' and `['. */) + reserved(if) operator(()ident(c) operator(==) char(':') operator(&&) operator(*)ident(p) operator(==) char(']')operator(\)) operator({) + pre_type(int) ident(ch)operator(;) + pre_type(char) ident(is_alnum) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(alnum)delimiter(")>operator(\);) + pre_type(char) ident(is_alpha) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(alpha)delimiter(")>operator(\);) + pre_type(char) ident(is_blank) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(blank)delimiter(")>operator(\);) + pre_type(char) ident(is_cntrl) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(cntrl)delimiter(")>operator(\);) + pre_type(char) ident(is_digit) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(digit)delimiter(")>operator(\);) + pre_type(char) ident(is_graph) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(graph)delimiter(")>operator(\);) + pre_type(char) ident(is_lower) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(lower)delimiter(")>operator(\);) + pre_type(char) ident(is_print) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(print)delimiter(")>operator(\);) + pre_type(char) ident(is_punct) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(punct)delimiter(")>operator(\);) + pre_type(char) ident(is_space) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(space)delimiter(")>operator(\);) + pre_type(char) ident(is_upper) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(upper)delimiter(")>operator(\);) + pre_type(char) ident(is_xdigit) operator(=) ident(STREQ)operator(()ident(str)operator(,) string<delimiter(")content(xdigit)delimiter(")>operator(\);) + + reserved(if) operator((!)ident(IS_CHAR_CLASS)operator(()ident(str)operator(\)\){) + ident(snprintf)operator(()ident(error_msg)operator(,) ident(ERROR_MSG_MAX_SIZE)operator(,) + string<delimiter(")content(invalid regular expression; [:%s:] is not a character class)delimiter(")>operator(,) ident(str)operator(\);) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) ident(error_msg)operator(\);) + operator(}) + + comment(/* Throw away the ] at the end of the character class. */) + ident(PATFETCH)operator(()ident(c)operator(\);) + + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(invalid regular expression; range doesn't have ending ']' after a character class)delimiter(")>operator(\);) + + reserved(for) operator(()ident(ch) operator(=) integer(0)operator(;) ident(ch) operator(<) integer(1) operator(<<) ident(BYTEWIDTH)operator(;) ident(ch)operator(++\)) operator({) + reserved(if) operator(() operator(()ident(is_alnum) operator(&&) ident(ISALNUM)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_alpha) operator(&&) ident(ISALPHA)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_blank) operator(&&) ident(ISBLANK)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_cntrl) operator(&&) ident(ISCNTRL)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_digit) operator(&&) ident(ISDIGIT)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_graph) operator(&&) ident(ISGRAPH)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_lower) operator(&&) ident(ISLOWER)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_print) operator(&&) ident(ISPRINT)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_punct) operator(&&) ident(ISPUNCT)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_space) operator(&&) ident(ISSPACE)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_upper) operator(&&) ident(ISUPPER)operator(()ident(ch)operator(\)\)) + operator(||) operator(()ident(is_xdigit) operator(&&) ident(ISXDIGIT)operator(()ident(ch)operator(\)\)\)) + ident(SET_LIST_BIT)operator(()ident(ch)operator(\);) + operator(}) + ident(had_char_class) operator(=) integer(1)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(else) operator({) + ident(c1) operator(+=) integer(2)operator(;) + reserved(while) operator(()ident(c1)operator(--\)) + ident(PATUNFETCH)operator(;) + ident(re_warning)operator(()string<delimiter(")content(character class has `[' without escape)delimiter(")>operator(\);) + ident(c) operator(=) char('[')operator(;) + operator(}) + operator(}) + + comment(/* Get a range. */) + reserved(if) operator(()ident(range)operator(\)) operator({) + reserved(if) operator(()ident(last) operator(>) ident(c)operator(\)) + reserved(goto) ident(invalid_pattern)operator(;) + + ident(range) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(had_mbchar) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(TRANSLATE_P)operator((\)\)) operator({) + reserved(for) operator((;)ident(last)operator(<=)ident(c)operator(;)ident(last)operator(++\)) + ident(SET_LIST_BIT)operator(()ident(translate)operator([)ident(last)operator(]\);) + operator(}) + reserved(else) operator({) + reserved(for) operator((;)ident(last)operator(<=)ident(c)operator(;)ident(last)operator(++\)) + ident(SET_LIST_BIT)operator(()ident(last)operator(\);) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(had_mbchar) operator(==) integer(2)operator(\)) operator({) + ident(set_list_bits)operator(()ident(last)operator(,) ident(c)operator(,) ident(b)operator(\);) + operator(}) + reserved(else) operator({) + comment(/* restriction: range between sbc and mbc */) + reserved(goto) ident(invalid_pattern)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(p)operator([)integer(0)operator(]) operator(==) char('-') operator(&&) ident(p)operator([)integer(1)operator(]) operator(!=) char(']')operator(\)) operator({) + ident(last) operator(=) ident(c)operator(;) + ident(PATFETCH_RAW)operator(()ident(c1)operator(\);) + ident(range) operator(=) integer(1)operator(;) + reserved(goto) ident(range_retry)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(TRANSLATE_P)operator((\)) operator(&&) ident(c) operator(<) hex(0x100)operator(\)) ident(c) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(translate)operator([)ident(c)operator(];) + reserved(if) operator(()ident(had_mbchar) operator(==) integer(0) operator(&&) operator((!)ident(current_mbctype) operator(||) operator(!)ident(had_num_literal)operator(\)\)) operator({) + ident(SET_LIST_BIT)operator(()ident(c)operator(\);) + ident(had_num_literal) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(set_list_bits)operator(()ident(c)operator(,) ident(c)operator(,) ident(b)operator(\);) + operator(}) + operator(}) + ident(had_mbchar) operator(=) integer(0)operator(;) + operator(}) + + comment(/* Discard any character set/class bitmap bytes that are all + 0 at the end of the map. Decrement the map-length byte too. */) + reserved(while) operator((()pre_type(int)operator(\))ident(b)operator([-)integer(1)operator(]) operator(>) integer(0) operator(&&) ident(b)operator([)ident(b)operator([-)integer(1)operator(]) operator(-) integer(1)operator(]) operator(==) integer(0)operator(\)) + ident(b)operator([-)integer(1)operator(]--;) + reserved(if) operator(()ident(b)operator([-)integer(1)operator(]) operator(!=) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(\)) + ident(memmove)operator((&)ident(b)operator([()pre_type(unsigned) pre_type(char)operator(\))ident(b)operator([-)integer(1)operator(]],) operator(&)ident(b)operator([()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(],) + integer(2) operator(+) ident(EXTRACT_UNSIGNED)operator((&)ident(b)operator([()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(]\)*)integer(8)operator(\);) + ident(b) operator(+=) ident(b)operator([-)integer(1)operator(]) operator(+) integer(2) operator(+) ident(EXTRACT_UNSIGNED)operator((&)ident(b)operator([()pre_type(unsigned) pre_type(char)operator(\))ident(b)operator([-)integer(1)operator(]]\)*)integer(8)operator(;) + ident(had_num_literal) operator(=) integer(0)operator(;) + reserved(break)operator(;) + + reserved(case) char('(')operator(:) + operator({) + pre_type(int) ident(old_options) operator(=) ident(options)operator(;) + pre_type(int) ident(push_option) operator(=) integer(0)operator(;) + pre_type(int) ident(casefold) operator(=) integer(0)operator(;) + + ident(PATFETCH)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(c) operator(==) char('?')operator(\)) operator({) + pre_type(int) ident(negative) operator(=) integer(0)operator(;) + + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('x')operator(:) reserved(case) char('m')operator(:) reserved(case) char('i')operator(:) reserved(case) char('-')operator(:) + reserved(for) operator((;;\)) operator({) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('-')operator(:) + ident(negative) operator(=) integer(1)operator(;) + reserved(break)operator(;) + + reserved(case) char(':')operator(:) + reserved(case) char('\)')operator(:) + reserved(break)operator(;) + + reserved(case) char('x')operator(:) + reserved(if) operator(()ident(negative)operator(\)) + ident(options) operator(&=) operator(~)ident(RE_OPTION_EXTENDED)operator(;) + reserved(else) + ident(options) operator(|=) ident(RE_OPTION_EXTENDED)operator(;) + reserved(break)operator(;) + + reserved(case) char('m')operator(:) + reserved(if) operator(()ident(negative)operator(\)) operator({) + reserved(if) operator(()ident(options)operator(&)ident(RE_OPTION_MULTILINE)operator(\)) operator({) + ident(options) operator(&=) operator(~)ident(RE_OPTION_MULTILINE)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator((!()ident(options)operator(&)ident(RE_OPTION_MULTILINE)operator(\)\)) operator({) + ident(options) operator(|=) ident(RE_OPTION_MULTILINE)operator(;) + operator(}) + ident(push_option) operator(=) integer(1)operator(;) + reserved(break)operator(;) + + reserved(case) char('i')operator(:) + reserved(if) operator(()ident(negative)operator(\)) operator({) + reserved(if) operator(()ident(options)operator(&)ident(RE_OPTION_IGNORECASE)operator(\)) operator({) + ident(options) operator(&=) operator(~)ident(RE_OPTION_IGNORECASE)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator((!()ident(options)operator(&)ident(RE_OPTION_IGNORECASE)operator(\)\)) operator({) + ident(options) operator(|=) ident(RE_OPTION_IGNORECASE)operator(;) + operator(}) + ident(casefold) operator(=) integer(1)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(undefined (?...\) inline option)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('\)')operator(\)) operator({) + ident(c) operator(=) char('#')operator(;) comment(/* read whole in-line options */) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char(':')operator(\)) reserved(break)operator(;) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('#')operator(:) + reserved(for) operator((;;\)) operator({) + ident(PATFETCH)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(c) operator(==) char('\)')operator(\)) reserved(break)operator(;) + operator(}) + ident(c) operator(=) char('#')operator(;) + reserved(break)operator(;) + + reserved(case) char(':')operator(:) + reserved(case) char('=')operator(:) + reserved(case) char('!')operator(:) + reserved(case) char('>')operator(:) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(undefined (?...\) sequence)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(PATUNFETCH)operator(;) + ident(c) operator(=) char('(')operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(==) char('#')operator(\)) operator({) + reserved(if) operator(()ident(push_option)operator(\)) operator({) + ident(BUFPUSH)operator(()ident(option_set)operator(\);) + ident(BUFPUSH)operator(()ident(options)operator(\);) + operator(}) + reserved(if) operator(()ident(casefold)operator(\)) operator({) + reserved(if) operator(()ident(options) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) + ident(BUFPUSH)operator(()ident(casefold_on)operator(\);) + reserved(else) + ident(BUFPUSH)operator(()ident(casefold_off)operator(\);) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(stackp)operator(+)integer(8) operator(>=) ident(stacke)operator(\)) operator({) + ident(DOUBLE_STACK)operator(()pre_type(int)operator(\);) + operator(}) + + comment(/* Laststart should point to the start_memory that we are about + to push (unless the pattern has RE_NREGS or more ('s\). */) + comment(/* obsolete: now RE_NREGS is just a default register size. */) + operator(*)ident(stackp)operator(++) operator(=) ident(b) operator(-) ident(bufp)operator(->)ident(buffer)operator(;) + operator(*)ident(stackp)operator(++) operator(=) ident(fixup_alt_jump) operator(?) ident(fixup_alt_jump) operator(-) ident(bufp)operator(->)ident(buffer) operator(+) integer(1) operator(:) integer(0)operator(;) + operator(*)ident(stackp)operator(++) operator(=) ident(begalt) operator(-) ident(bufp)operator(->)ident(buffer)operator(;) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('(')operator(:) + ident(BUFPUSH)operator(()ident(start_memory)operator(\);) + ident(BUFPUSH)operator(()ident(regnum)operator(\);) + operator(*)ident(stackp)operator(++) operator(=) ident(regnum)operator(++;) + operator(*)ident(stackp)operator(++) operator(=) ident(b) operator(-) ident(bufp)operator(->)ident(buffer)operator(;) + ident(BUFPUSH)operator(()integer(0)operator(\);) + comment(/* too many (\)'s to fit in a byte. (max 254\) */) + reserved(if) operator(()ident(regnum) operator(>=) ident(RE_REG_MAX)operator(\)) reserved(goto) ident(too_big)operator(;) + reserved(break)operator(;) + + reserved(case) char('=')operator(:) + reserved(case) char('!')operator(:) + reserved(case) char('>')operator(:) + ident(BUFPUSH)operator(()ident(start_nowidth)operator(\);) + operator(*)ident(stackp)operator(++) operator(=) ident(b) operator(-) ident(bufp)operator(->)ident(buffer)operator(;) + ident(BUFPUSH)operator(()integer(0)operator(\);) comment(/* temporary value */) + ident(BUFPUSH)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(c) operator(!=) char('!')operator(\)) reserved(break)operator(;) + + ident(BUFPUSH)operator(()ident(on_failure_jump)operator(\);) + operator(*)ident(stackp)operator(++) operator(=) ident(b) operator(-) ident(bufp)operator(->)ident(buffer)operator(;) + ident(BUFPUSH)operator(()integer(0)operator(\);) comment(/* temporary value */) + ident(BUFPUSH)operator(()integer(0)operator(\);) + reserved(break)operator(;) + + reserved(case) char(':')operator(:) + ident(BUFPUSH)operator(()ident(start_paren)operator(\);) + ident(pending_exact) operator(=) integer(0)operator(;) + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(push_option)operator(\)) operator({) + ident(BUFPUSH)operator(()ident(option_set)operator(\);) + ident(BUFPUSH)operator(()ident(options)operator(\);) + operator(}) + reserved(if) operator(()ident(casefold)operator(\)) operator({) + reserved(if) operator(()ident(options) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) + ident(BUFPUSH)operator(()ident(casefold_on)operator(\);) + reserved(else) + ident(BUFPUSH)operator(()ident(casefold_off)operator(\);) + operator(}) + operator(*)ident(stackp)operator(++) operator(=) ident(c)operator(;) + operator(*)ident(stackp)operator(++) operator(=) ident(old_options)operator(;) + ident(fixup_alt_jump) operator(=) integer(0)operator(;) + ident(laststart) operator(=) integer(0)operator(;) + ident(begalt) operator(=) ident(b)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('\)')operator(:) + reserved(if) operator(()ident(stackp) operator(==) ident(stackb)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(unmatched \))delimiter(")>operator(\);) + + ident(pending_exact) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(fixup_alt_jump)operator(\)) operator({) + comment(/* Push a dummy failure point at the end of the + alternative for a possible future + `finalize_jump' to pop. See comments at + `push_dummy_failure' in `re_match'. */) + ident(BUFPUSH)operator(()ident(push_dummy_failure)operator(\);) + + comment(/* We allocated space for this jump when we assigned + to `fixup_alt_jump', in the `handle_alt' case below. */) + ident(store_jump)operator(()ident(fixup_alt_jump)operator(,) ident(jump)operator(,) ident(b)operator(\);) + operator(}) + reserved(if) operator(()ident(options) operator(!=) ident(stackp)operator([-)integer(1)operator(]\)) operator({) + reserved(if) operator((()ident(options) operator(^) ident(stackp)operator([-)integer(1)operator(]\)) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) operator({) + ident(BUFPUSH)operator((()ident(options)operator(&)ident(RE_OPTION_IGNORECASE)operator(\)?)label(casefold_off)operator(:)ident(casefold_on)operator(\);) + operator(}) + reserved(if) operator((()ident(options) operator(^) ident(stackp)operator([-)integer(1)operator(]\)) operator(!=) ident(RE_OPTION_IGNORECASE)operator(\)) operator({) + ident(BUFPUSH)operator(()ident(option_set)operator(\);) + ident(BUFPUSH)operator(()ident(stackp)operator([-)integer(1)operator(]\);) + operator(}) + operator(}) + ident(p0) operator(=) ident(b)operator(;) + ident(options) operator(=) operator(*--)ident(stackp)operator(;) + reserved(switch) operator(()ident(c) operator(=) operator(*--)ident(stackp)operator(\)) operator({) + reserved(case) char('(')operator(:) + operator({) + pre_type(char) operator(*)ident(loc) operator(=) ident(bufp)operator(->)ident(buffer) operator(+) operator(*--)ident(stackp)operator(;) + operator(*)ident(loc) operator(=) ident(regnum) operator(-) ident(stackp)operator([-)integer(1)operator(];) + ident(BUFPUSH)operator(()ident(stop_memory)operator(\);) + ident(BUFPUSH)operator(()ident(stackp)operator([-)integer(1)operator(]\);) + ident(BUFPUSH)operator(()ident(regnum) operator(-) ident(stackp)operator([-)integer(1)operator(]\);) + ident(stackp)operator(--;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('!')operator(:) + ident(BUFPUSH)operator(()ident(pop_and_fail)operator(\);) + comment(/* back patch */) + ident(STORE_NUMBER)operator(()ident(bufp)operator(->)ident(buffer)operator(+)ident(stackp)operator([-)integer(1)operator(],) ident(b) operator(-) ident(bufp)operator(->)ident(buffer) operator(-) ident(stackp)operator([-)integer(1)operator(]) operator(-) integer(2)operator(\);) + ident(stackp)operator(--;) + comment(/* fall through */) + reserved(case) char('=')operator(:) + ident(BUFPUSH)operator(()ident(stop_nowidth)operator(\);) + comment(/* tell stack-pos place to start_nowidth */) + ident(STORE_NUMBER)operator(()ident(bufp)operator(->)ident(buffer)operator(+)ident(stackp)operator([-)integer(1)operator(],) ident(b) operator(-) ident(bufp)operator(->)ident(buffer) operator(-) ident(stackp)operator([-)integer(1)operator(]) operator(-) integer(2)operator(\);) + ident(BUFPUSH)operator(()integer(0)operator(\);) comment(/* space to hold stack pos */) + ident(BUFPUSH)operator(()integer(0)operator(\);) + ident(stackp)operator(--;) + reserved(break)operator(;) + + reserved(case) char('>')operator(:) + ident(BUFPUSH)operator(()ident(stop_backtrack)operator(\);) + comment(/* tell stack-pos place to start_nowidth */) + ident(STORE_NUMBER)operator(()ident(bufp)operator(->)ident(buffer)operator(+)ident(stackp)operator([-)integer(1)operator(],) ident(b) operator(-) ident(bufp)operator(->)ident(buffer) operator(-) ident(stackp)operator([-)integer(1)operator(]) operator(-) integer(2)operator(\);) + ident(BUFPUSH)operator(()integer(0)operator(\);) comment(/* space to hold stack pos */) + ident(BUFPUSH)operator(()integer(0)operator(\);) + ident(stackp)operator(--;) + reserved(break)operator(;) + + reserved(case) char(':')operator(:) + ident(BUFPUSH)operator(()ident(stop_paren)operator(\);) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + ident(begalt) operator(=) operator(*--)ident(stackp) operator(+) ident(bufp)operator(->)ident(buffer)operator(;) + ident(stackp)operator(--;) + ident(fixup_alt_jump) operator(=) operator(*)ident(stackp) operator(?) operator(*)ident(stackp) operator(+) ident(bufp)operator(->)ident(buffer) operator(-) integer(1) operator(:) integer(0)operator(;) + ident(laststart) operator(=) operator(*--)ident(stackp) operator(+) ident(bufp)operator(->)ident(buffer)operator(;) + reserved(if) operator(()ident(c) operator(==) char('!') operator(||) ident(c) operator(==) char('=')operator(\)) ident(laststart) operator(=) ident(b)operator(;) + reserved(break)operator(;) + + reserved(case) char('|')operator(:) + comment(/* Insert before the previous alternative a jump which + jumps to this alternative if the former fails. */) + ident(GET_BUFFER_SPACE)operator(()integer(3)operator(\);) + ident(insert_jump)operator(()ident(on_failure_jump)operator(,) ident(begalt)operator(,) ident(b) operator(+) integer(6)operator(,) ident(b)operator(\);) + ident(pending_exact) operator(=) integer(0)operator(;) + ident(b) operator(+=) integer(3)operator(;) + comment(/* The alternative before this one has a jump after it + which gets executed if it gets matched. Adjust that + jump so it will jump to this alternative's analogous + jump (put in below, which in turn will jump to the next + (if any\) alternative's such jump, etc.\). The last such + jump jumps to the correct final destination. A picture: + _____ _____ + | | | | + | v | v + a | b | c + + If we are at `b', then fixup_alt_jump right now points to a + three-byte space after `a'. We'll put in the jump, set + fixup_alt_jump to right after `b', and leave behind three + bytes which we'll fill in when we get to after `c'. */) + + reserved(if) operator(()ident(fixup_alt_jump)operator(\)) + ident(store_jump)operator(()ident(fixup_alt_jump)operator(,) ident(jump_past_alt)operator(,) ident(b)operator(\);) + + comment(/* Mark and leave space for a jump after this alternative, + to be filled in later either by next alternative or + when know we're at the end of a series of alternatives. */) + ident(fixup_alt_jump) operator(=) ident(b)operator(;) + ident(GET_BUFFER_SPACE)operator(()integer(3)operator(\);) + ident(b) operator(+=) integer(3)operator(;) + + ident(laststart) operator(=) integer(0)operator(;) + ident(begalt) operator(=) ident(b)operator(;) + reserved(break)operator(;) + + reserved(case) char('{')operator(:) + comment(/* If there is no previous pattern, this is an invalid pattern. */) + reserved(if) operator((!)ident(laststart)operator(\)) operator({) + ident(snprintf)operator(()ident(error_msg)operator(,) ident(ERROR_MSG_MAX_SIZE)operator(,) + string<delimiter(")content(invalid regular expression; there's no previous pattern, to which '{' would define cardinality at %d)delimiter(")>operator(,) + ident(p)operator(-)ident(pattern)operator(\);) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) ident(error_msg)operator(\);) + operator(}) + reserved(if)operator(() ident(p) operator(==) ident(pend)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(invalid regular expression; '{' can't be last character)delimiter(")> operator(\);) + + ident(beg_interval) operator(=) ident(p) operator(-) integer(1)operator(;) + + ident(lower_bound) operator(=) operator(-)integer(1)operator(;) comment(/* So can see if are set. */) + ident(upper_bound) operator(=) operator(-)integer(1)operator(;) + ident(GET_UNSIGNED_NUMBER)operator(()ident(lower_bound)operator(\);) + reserved(if) operator(()ident(c) operator(==) char(',')operator(\)) operator({) + ident(GET_UNSIGNED_NUMBER)operator(()ident(upper_bound)operator(\);) + operator(}) + reserved(else) + comment(/* Interval such as `{1}' => match exactly once. */) + ident(upper_bound) operator(=) ident(lower_bound)operator(;) + + reserved(if) operator(()ident(lower_bound) operator(<) integer(0) operator(||) ident(c) operator(!=) char('}')operator(\)) + reserved(goto) ident(unfetch_interval)operator(;) + + reserved(if) operator(()ident(lower_bound) operator(>=) ident(RE_DUP_MAX) operator(||) ident(upper_bound) operator(>=) ident(RE_DUP_MAX)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(too big quantifier in {,})delimiter(")>operator(\);) + reserved(if) operator(()ident(upper_bound) operator(<) integer(0)operator(\)) ident(upper_bound) operator(=) ident(RE_DUP_MAX)operator(;) + reserved(if) operator(()ident(lower_bound) operator(>) ident(upper_bound)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(can't do {n,m} with n > m)delimiter(")>operator(\);) + + ident(beg_interval) operator(=) integer(0)operator(;) + ident(pending_exact) operator(=) integer(0)operator(;) + + ident(greedy) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(p) operator(!=) ident(pend)operator(\)) operator({) + ident(PATFETCH)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(c) operator(==) char('?')operator(\)) ident(greedy) operator(=) integer(0)operator(;) + reserved(else) ident(PATUNFETCH)operator(;) + operator(}) + + reserved(if) operator(()ident(lower_bound) operator(==) integer(0)operator(\)) operator({) + ident(zero_times_ok) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(upper_bound) operator(==) ident(RE_DUP_MAX)operator(\)) operator({) + ident(many_times_ok) operator(=) integer(1)operator(;) + reserved(goto) ident(repeat)operator(;) + operator(}) + reserved(if) operator(()ident(upper_bound) operator(==) integer(1)operator(\)) operator({) + ident(many_times_ok) operator(=) integer(0)operator(;) + reserved(goto) ident(repeat)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(lower_bound) operator(==) integer(1)operator(\)) operator({) + reserved(if) operator(()ident(upper_bound) operator(==) integer(1)operator(\)) operator({) + comment(/* No need to repeat */) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(upper_bound) operator(==) ident(RE_DUP_MAX)operator(\)) operator({) + ident(many_times_ok) operator(=) integer(1)operator(;) + ident(zero_times_ok) operator(=) integer(0)operator(;) + reserved(goto) ident(repeat)operator(;) + operator(}) + operator(}) + + comment(/* If upper_bound is zero, don't want to succeed at all; + jump from laststart to b + 3, which will be the end of + the buffer after this jump is inserted. */) + + reserved(if) operator(()ident(upper_bound) operator(==) integer(0)operator(\)) operator({) + ident(GET_BUFFER_SPACE)operator(()integer(3)operator(\);) + ident(insert_jump)operator(()ident(jump)operator(,) ident(laststart)operator(,) ident(b) operator(+) integer(3)operator(,) ident(b)operator(\);) + ident(b) operator(+=) integer(3)operator(;) + reserved(break)operator(;) + operator(}) + + comment(/* If lower_bound == upper_bound, repeat count can be removed */) + reserved(if) operator(()ident(lower_bound) operator(==) ident(upper_bound)operator(\)) operator({) + pre_type(int) ident(mcnt)operator(;) + pre_type(int) ident(skip_stop_paren) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(b)operator([-)integer(1)operator(]) operator(==) ident(stop_paren)operator(\)) operator({) + ident(skip_stop_paren) operator(=) integer(1)operator(;) + ident(b)operator(--;) + operator(}) + + reserved(if) operator((*)ident(laststart) operator(==) ident(exactn) operator(&&) ident(laststart)operator([)integer(1)operator(]+)integer(2) operator(==) ident(b) operator(-) ident(laststart) + operator(&&) ident(laststart)operator([)integer(1)operator(]*)ident(lower_bound) operator(<) integer(256)operator(\)) operator({) + ident(mcnt) operator(=) ident(laststart)operator([)integer(1)operator(];) + ident(GET_BUFFER_SPACE)operator((()ident(lower_bound)operator(-)integer(1)operator(\)*)ident(mcnt)operator(\);) + ident(laststart)operator([)integer(1)operator(]) operator(=) ident(lower_bound)operator(*)ident(mcnt)operator(;) + reserved(while) operator((--)ident(lower_bound)operator(\)) operator({) + ident(memcpy)operator(()ident(b)operator(,) ident(laststart)operator(+)integer(2)operator(,) ident(mcnt)operator(\);) + ident(b) operator(+=) ident(mcnt)operator(;) + operator(}) + reserved(if) operator(()ident(skip_stop_paren)operator(\)) ident(BUFPUSH)operator(()ident(stop_paren)operator(\);) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(lower_bound) operator(<) integer(5) operator(&&) ident(b) operator(-) ident(laststart) operator(<) integer(10)operator(\)) operator({) + comment(/* 5 and 10 are the magic numbers */) + + ident(mcnt) operator(=) ident(b) operator(-) ident(laststart)operator(;) + ident(GET_BUFFER_SPACE)operator((()ident(lower_bound)operator(-)integer(1)operator(\)*)ident(mcnt)operator(\);) + reserved(while) operator((--)ident(lower_bound)operator(\)) operator({) + ident(memcpy)operator(()ident(b)operator(,) ident(laststart)operator(,) ident(mcnt)operator(\);) + ident(b) operator(+=) ident(mcnt)operator(;) + operator(}) + reserved(if) operator(()ident(skip_stop_paren)operator(\)) ident(BUFPUSH)operator(()ident(stop_paren)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(skip_stop_paren)operator(\)) ident(b)operator(++;) comment(/* push back stop_paren */) + operator(}) + + comment(/* Otherwise, we have a nontrivial interval. When + we're all done, the pattern will look like: + set_number_at <jump count> <upper bound> + set_number_at <succeed_n count> <lower bound> + succeed_n <after jump addr> <succed_n count> + <body of loop> + jump_n <succeed_n addr> <jump count> + (The upper bound and `jump_n' are omitted if + `upper_bound' is 1, though.\) */) + operator({) comment(/* If the upper bound is > 1, we need to insert + more at the end of the loop. */) + pre_type(unsigned) ident(nbytes) operator(=) ident(upper_bound) operator(==) integer(1) operator(?) integer(10) operator(:) integer(20)operator(;) + + ident(GET_BUFFER_SPACE)operator(()ident(nbytes)operator(\);) + comment(/* Initialize lower bound of the `succeed_n', even + though it will be set during matching by its + attendant `set_number_at' (inserted next\), + because `re_compile_fastmap' needs to know. + Jump to the `jump_n' we might insert below. */) + ident(insert_jump_n)operator(()ident(succeed_n)operator(,) ident(laststart)operator(,) ident(b) operator(+) operator(()ident(nbytes)operator(/)integer(2)operator(\),) + ident(b)operator(,) ident(lower_bound)operator(\);) + ident(b) operator(+=) integer(5)operator(;) comment(/* Just increment for the succeed_n here. */) + + comment(/* Code to initialize the lower bound. Insert + before the `succeed_n'. The `5' is the last two + bytes of this `set_number_at', plus 3 bytes of + the following `succeed_n'. */) + ident(insert_op_2)operator(()ident(set_number_at)operator(,) ident(laststart)operator(,) ident(b)operator(,) integer(5)operator(,) ident(lower_bound)operator(\);) + ident(b) operator(+=) integer(5)operator(;) + + reserved(if) operator(()ident(upper_bound) operator(>) integer(1)operator(\)) operator({) + comment(/* More than one repetition is allowed, so + append a backward jump to the `succeed_n' + that starts this interval. + + When we've reached this during matching, + we'll have matched the interval once, so + jump back only `upper_bound - 1' times. */) + ident(GET_BUFFER_SPACE)operator(()integer(5)operator(\);) + ident(store_jump_n)operator(()ident(b)operator(,) ident(greedy)operator(?)label(jump_n)operator(:)ident(finalize_push_n)operator(,) ident(laststart) operator(+) integer(5)operator(,) + ident(upper_bound) operator(-) integer(1)operator(\);) + ident(b) operator(+=) integer(5)operator(;) + + comment(/* The location we want to set is the second + parameter of the `jump_n'; that is `b-2' as + an absolute address. `laststart' will be + the `set_number_at' we're about to insert; + `laststart+3' the number to set, the source + for the relative address. But we are + inserting into the middle of the pattern -- + so everything is getting moved up by 5. + Conclusion: (b - 2\) - (laststart + 3\) + 5, + i.e., b - laststart. + + We insert this at the beginning of the loop + so that if we fail during matching, we'll + reinitialize the bounds. */) + ident(insert_op_2)operator(()ident(set_number_at)operator(,) ident(laststart)operator(,) ident(b)operator(,) ident(b) operator(-) ident(laststart)operator(,) + ident(upper_bound) operator(-) integer(1)operator(\);) + ident(b) operator(+=) integer(5)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + label(unfetch_interval)operator(:) + comment(/* If an invalid interval, match the characters as literals. */) + ident(re_warning)operator(()string<delimiter(")content(regexp has invalid interval)delimiter(")>operator(\);) + ident(p) operator(=) ident(beg_interval)operator(;) + ident(beg_interval) operator(=) integer(0)operator(;) + + comment(/* normal_char and normal_backslash need `c'. */) + ident(PATFETCH)operator(()ident(c)operator(\);) + reserved(goto) ident(normal_char)operator(;) + + reserved(case) char('\\\\')operator(:) + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(invalid regular expression; ')char(\\\\)content(' can't be last character)delimiter(")>operator(\);) + comment(/* Do not translate the character after the \\, so that we can + distinguish, e.g., \\B from \\b, even if we normally would + translate, e.g., B to b. */) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('s')operator(:) + reserved(case) char('S')operator(:) + reserved(case) char('d')operator(:) + reserved(case) char('D')operator(:) + reserved(while) operator(()ident(b) operator(-) ident(bufp)operator(->)ident(buffer) operator(+) integer(9) operator(+) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH) + operator(>) ident(bufp)operator(->)ident(allocated)operator(\)) + ident(EXTEND_BUFFER)operator(;) + + ident(laststart) operator(=) ident(b)operator(;) + reserved(if) operator(()ident(c) operator(==) char('s') operator(||) ident(c) operator(==) char('d')operator(\)) operator({) + ident(BUFPUSH)operator(()ident(charset)operator(\);) + operator(}) + reserved(else) operator({) + ident(BUFPUSH)operator(()ident(charset_not)operator(\);) + operator(}) + + ident(BUFPUSH)operator((()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(\);) + ident(memset)operator(()ident(b)operator(,) integer(0)operator(,) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH) operator(+) integer(2)operator(\);) + reserved(if) operator(()ident(c) operator(==) char('s') operator(||) ident(c) operator(==) char('S')operator(\)) operator({) + ident(SET_LIST_BIT)operator(()char(' ')operator(\);) + ident(SET_LIST_BIT)operator(()char('\\t')operator(\);) + ident(SET_LIST_BIT)operator(()char('\\n')operator(\);) + ident(SET_LIST_BIT)operator(()char('\\r')operator(\);) + ident(SET_LIST_BIT)operator(()char('\\f')operator(\);) + operator(}) + reserved(else) operator({) + pre_type(char) ident(cc)operator(;) + + reserved(for) operator(()ident(cc) operator(=) char('0')operator(;) ident(cc) operator(<=) char('9')operator(;) ident(cc)operator(++\)) operator({) + ident(SET_LIST_BIT)operator(()ident(cc)operator(\);) + operator(}) + operator(}) + + reserved(while) operator((()pre_type(int)operator(\))ident(b)operator([-)integer(1)operator(]) operator(>) integer(0) operator(&&) ident(b)operator([)ident(b)operator([-)integer(1)operator(]) operator(-) integer(1)operator(]) operator(==) integer(0)operator(\)) + ident(b)operator([-)integer(1)operator(]--;) + reserved(if) operator(()ident(b)operator([-)integer(1)operator(]) operator(!=) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(\)) + ident(memmove)operator((&)ident(b)operator([()pre_type(unsigned) pre_type(char)operator(\))ident(b)operator([-)integer(1)operator(]],) operator(&)ident(b)operator([()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(],) + integer(2) operator(+) ident(EXTRACT_UNSIGNED)operator((&)ident(b)operator([()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)) operator(/) ident(BYTEWIDTH)operator(]\)*)integer(8)operator(\);) + ident(b) operator(+=) ident(b)operator([-)integer(1)operator(]) operator(+) integer(2) operator(+) ident(EXTRACT_UNSIGNED)operator((&)ident(b)operator([()pre_type(unsigned) pre_type(char)operator(\))ident(b)operator([-)integer(1)operator(]]\)*)integer(8)operator(;) + reserved(break)operator(;) + + reserved(case) char('w')operator(:) + ident(laststart) operator(=) ident(b)operator(;) + ident(BUFPUSH)operator(()ident(wordchar)operator(\);) + reserved(break)operator(;) + + reserved(case) char('W')operator(:) + ident(laststart) operator(=) ident(b)operator(;) + ident(BUFPUSH)operator(()ident(notwordchar)operator(\);) + reserved(break)operator(;) + +preprocessor(#ifndef) ident(RUBY) + reserved(case) char('<')operator(:) + ident(BUFPUSH)operator(()ident(wordbeg)operator(\);) + reserved(break)operator(;) + + reserved(case) char('>')operator(:) + ident(BUFPUSH)operator(()ident(wordend)operator(\);) + reserved(break)operator(;) +preprocessor(#endif) + + reserved(case) char('b')operator(:) + ident(BUFPUSH)operator(()ident(wordbound)operator(\);) + reserved(break)operator(;) + + reserved(case) char('B')operator(:) + ident(BUFPUSH)operator(()ident(notwordbound)operator(\);) + reserved(break)operator(;) + + reserved(case) char('A')operator(:) + ident(BUFPUSH)operator(()ident(begbuf)operator(\);) + reserved(break)operator(;) + + reserved(case) char('Z')operator(:) + reserved(if) operator((()ident(bufp)operator(->)ident(options) operator(&) ident(RE_OPTION_SINGLELINE)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(BUFPUSH)operator(()ident(endbuf2)operator(\);) + reserved(break)operator(;) + operator(}) + comment(/* fall through */) + reserved(case) char('z')operator(:) + ident(BUFPUSH)operator(()ident(endbuf)operator(\);) + reserved(break)operator(;) + + reserved(case) char('G')operator(:) + ident(BUFPUSH)operator(()ident(begpos)operator(\);) + reserved(break)operator(;) + + comment(/* hex */) + reserved(case) char('x')operator(:) + ident(had_mbchar) operator(=) integer(0)operator(;) + ident(c) operator(=) ident(scan_hex)operator(()ident(p)operator(,) integer(2)operator(,) operator(&)ident(numlen)operator(\);) + reserved(if) operator(()ident(numlen) operator(==) integer(0)operator(\)) reserved(goto) ident(invalid_escape)operator(;) + ident(p) operator(+=) ident(numlen)operator(;) + ident(had_num_literal) operator(=) integer(1)operator(;) + reserved(goto) ident(numeric_char)operator(;) + + comment(/* octal */) + reserved(case) char('0')operator(:) + ident(had_mbchar) operator(=) integer(0)operator(;) + ident(c) operator(=) ident(scan_oct)operator(()ident(p)operator(,) integer(2)operator(,) operator(&)ident(numlen)operator(\);) + ident(p) operator(+=) ident(numlen)operator(;) + ident(had_num_literal) operator(=) integer(1)operator(;) + reserved(goto) ident(numeric_char)operator(;) + + comment(/* back-ref or octal */) + reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) + reserved(case) char('4')operator(:) reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) + reserved(case) char('7')operator(:) reserved(case) char('8')operator(:) reserved(case) char('9')operator(:) + ident(PATUNFETCH)operator(;) + ident(p0) operator(=) ident(p)operator(;) + + ident(had_mbchar) operator(=) integer(0)operator(;) + ident(c1) operator(=) integer(0)operator(;) + ident(GET_UNSIGNED_NUMBER)operator(()ident(c1)operator(\);) + reserved(if) operator((!)ident(ISDIGIT)operator(()ident(c)operator(\)\)) ident(PATUNFETCH)operator(;) + + reserved(if) operator(()integer(9) operator(<) ident(c1) operator(&&) ident(c1) operator(>=) ident(regnum)operator(\)) operator({) + comment(/* need to get octal */) + ident(c) operator(=) ident(scan_oct)operator(()ident(p0)operator(,) integer(3)operator(,) operator(&)ident(numlen)operator(\)) operator(&) hex(0xff)operator(;) + ident(p) operator(=) ident(p0) operator(+) ident(numlen)operator(;) + ident(c1) operator(=) integer(0)operator(;) + ident(had_num_literal) operator(=) integer(1)operator(;) + reserved(goto) ident(numeric_char)operator(;) + operator(}) + + ident(laststart) operator(=) ident(b)operator(;) + ident(BUFPUSH)operator(()ident(duplicate)operator(\);) + ident(BUFPUSH)operator(()ident(c1)operator(\);) + reserved(break)operator(;) + + reserved(case) char('M')operator(:) + reserved(case) char('C')operator(:) + reserved(case) char('c')operator(:) + ident(p0) operator(=) operator(--)ident(p)operator(;) + ident(c) operator(=) ident(read_special)operator(()ident(p)operator(,) ident(pend)operator(,) operator(&)ident(p0)operator(\);) + reserved(if) operator(()ident(c) operator(>) integer(255)operator(\)) reserved(goto) ident(invalid_escape)operator(;) + ident(p) operator(=) ident(p0)operator(;) + ident(had_num_literal) operator(=) integer(1)operator(;) + reserved(goto) ident(numeric_char)operator(;) + + reserved(default)operator(:) + ident(c) operator(=) ident(read_backslash)operator(()ident(c)operator(\);) + reserved(goto) ident(normal_char)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('#')operator(:) + reserved(if) operator(()ident(options) operator(&) ident(RE_OPTION_EXTENDED)operator(\)) operator({) + reserved(while) operator(()ident(p) operator(!=) ident(pend)operator(\)) operator({) + ident(PATFETCH)operator(()ident(c)operator(\);) + reserved(if) operator(()ident(c) operator(==) char('\\n')operator(\)) reserved(break)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(goto) ident(normal_char)operator(;) + + reserved(case) char(' ')operator(:) + reserved(case) char('\\t')operator(:) + reserved(case) char('\\f')operator(:) + reserved(case) char('\\r')operator(:) + reserved(case) char('\\n')operator(:) + reserved(if) operator(()ident(options) operator(&) ident(RE_OPTION_EXTENDED)operator(\)) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(if) operator(()ident(c) operator(==) char(']')operator(\)) + ident(re_warning)operator(()string<delimiter(")content(regexp has `]' without escape)delimiter(")>operator(\);) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('}')operator(\)) + ident(re_warning)operator(()string<delimiter(")content(regexp has `}' without escape)delimiter(")>operator(\);) + label(normal_char)operator(:) comment(/* Expects the character in `c'. */) + ident(had_mbchar) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + ident(had_mbchar) operator(=) integer(1)operator(;) + ident(c1) operator(=) ident(p) operator(-) ident(pattern)operator(;) + operator(}) + label(numeric_char)operator(:) + ident(nextp) operator(=) ident(p) operator(+) ident(mbclen)operator(()ident(c)operator(\)) operator(-) integer(1)operator(;) + reserved(if) operator((!)ident(pending_exact) operator(||) ident(pending_exact) operator(+) operator(*)ident(pending_exact) operator(+) integer(1) operator(!=) ident(b) + operator(||) operator(*)ident(pending_exact) operator(>=) operator(()ident(c1) operator(?) oct(0176) operator(:) oct(0177)operator(\)) + operator(||) operator(()ident(nextp) operator(<) ident(pend) operator(&&) + operator(() operator(*)ident(nextp) operator(==) char('+') operator(||) operator(*)ident(nextp) operator(==) char('?') + operator(||) operator(*)ident(nextp) operator(==) char('*') operator(||) operator(*)ident(nextp) operator(==) char('^') + operator(||) operator(*)ident(nextp) operator(==) char('{')operator(\)\)\)) operator({) + ident(laststart) operator(=) ident(b)operator(;) + ident(BUFPUSH)operator(()ident(exactn)operator(\);) + ident(pending_exact) operator(=) ident(b)operator(;) + ident(BUFPUSH)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(had_num_literal) operator(||) ident(c) operator(==) hex(0xff)operator(\)) operator({) + ident(BUFPUSH)operator(()hex(0xff)operator(\);) + operator((*)ident(pending_exact)operator(\)++;) + ident(had_num_literal) operator(=) integer(0)operator(;) + operator(}) + ident(BUFPUSH)operator(()ident(c)operator(\);) + operator((*)ident(pending_exact)operator(\)++;) + reserved(if) operator(()ident(had_mbchar)operator(\)) operator({) + pre_type(int) ident(len) operator(=) ident(mbclen)operator(()ident(c)operator(\)) operator(-) integer(1)operator(;) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(PATFETCH_RAW)operator(()ident(c)operator(\);) + ident(BUFPUSH)operator(()ident(c)operator(\);) + operator((*)ident(pending_exact)operator(\)++;) + operator(}) + operator(}) + operator(}) + operator(}) + + reserved(if) operator(()ident(fixup_alt_jump)operator(\)) + ident(store_jump)operator(()ident(fixup_alt_jump)operator(,) ident(jump)operator(,) ident(b)operator(\);) + + reserved(if) operator(()ident(stackp) operator(!=) ident(stackb)operator(\)) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(unmatched ()delimiter(")>operator(\);) + + comment(/* set optimize flags */) + ident(laststart) operator(=) ident(bufp)operator(->)ident(buffer)operator(;) + reserved(if) operator(()ident(laststart) operator(!=) ident(b)operator(\)) operator({) + reserved(if) operator((*)ident(laststart) operator(==) ident(dummy_failure_jump)operator(\)) ident(laststart) operator(+=) integer(3)operator(;) + reserved(else) reserved(if) operator((*)ident(laststart) operator(==) ident(try_next)operator(\)) ident(laststart) operator(+=) integer(3)operator(;) + reserved(if) operator((*)ident(laststart) operator(==) ident(anychar_repeat)operator(\)) operator({) + ident(bufp)operator(->)ident(options) operator(|=) ident(RE_OPTIMIZE_ANCHOR)operator(;) + operator(}) + operator(}) + + ident(bufp)operator(->)ident(used) operator(=) ident(b) operator(-) ident(bufp)operator(->)ident(buffer)operator(;) + ident(bufp)operator(->)ident(re_nsub) operator(=) ident(regnum)operator(;) + ident(laststart) operator(=) ident(bufp)operator(->)ident(buffer)operator(;) + reserved(if) operator(()ident(laststart) operator(!=) ident(b)operator(\)) operator({) + reserved(if) operator((*)ident(laststart) operator(==) ident(start_memory)operator(\)) ident(laststart) operator(+=) integer(3)operator(;) + reserved(if) operator((*)ident(laststart) operator(==) ident(exactn)operator(\)) operator({) + ident(bufp)operator(->)ident(options) operator(|=) ident(RE_OPTIMIZE_EXACTN)operator(;) + ident(bufp)operator(->)ident(must) operator(=) ident(laststart)operator(+)integer(1)operator(;) + operator(}) + operator(}) + reserved(if) operator((!)ident(bufp)operator(->)ident(must)operator(\)) operator({) + ident(bufp)operator(->)ident(must) operator(=) ident(calculate_must_string)operator(()ident(bufp)operator(->)ident(buffer)operator(,) ident(b)operator(\);) + operator(}) + reserved(if) operator(()ident(current_mbctype) operator(==) ident(MBCTYPE_SJIS)operator(\)) ident(bufp)operator(->)ident(options) operator(|=) ident(RE_OPTIMIZE_NO_BM)operator(;) + reserved(else) reserved(if) operator(()ident(bufp)operator(->)ident(must)operator(\)) operator({) + pre_type(int) ident(i)operator(;) + pre_type(int) ident(len) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(bufp)operator(->)ident(must)operator([)integer(0)operator(];) + + reserved(for) operator(()ident(i)operator(=)integer(1)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator((()pre_type(unsigned) pre_type(char)operator(\))ident(bufp)operator(->)ident(must)operator([)ident(i)operator(]) operator(==) hex(0xff) operator(||) + operator(()ident(current_mbctype) operator(&&) ident(ismbchar)operator(()ident(bufp)operator(->)ident(must)operator([)ident(i)operator(]\)\)\)) operator({) + ident(bufp)operator(->)ident(options) operator(|=) ident(RE_OPTIMIZE_NO_BM)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator((!()ident(bufp)operator(->)ident(options) operator(&) ident(RE_OPTIMIZE_NO_BM)operator(\)\)) operator({) + ident(bufp)operator(->)ident(must_skip) operator(=) operator(()pre_type(int) operator(*\)) ident(xmalloc)operator((()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)*)reserved(sizeof)operator(()pre_type(int)operator(\)\);) + ident(bm_init_skip)operator(()ident(bufp)operator(->)ident(must_skip)operator(,) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(bufp)operator(->)ident(must)operator(+)integer(1)operator(,) + operator(()pre_type(unsigned) pre_type(char)operator(\))ident(bufp)operator(->)ident(must)operator([)integer(0)operator(],) + operator(()pre_type(unsigned) pre_type(char)operator(*\)()ident(MAY_TRANSLATE)operator((\)?)label(translate)operator(:)integer(0)operator(\)\);) + operator(}) + operator(}) + + ident(bufp)operator(->)ident(regstart) operator(=) ident(TMALLOC)operator(()ident(regnum)operator(,) pre_type(unsigned) pre_type(char)operator(*\);) + ident(bufp)operator(->)ident(regend) operator(=) ident(TMALLOC)operator(()ident(regnum)operator(,) pre_type(unsigned) pre_type(char)operator(*\);) + ident(bufp)operator(->)ident(old_regstart) operator(=) ident(TMALLOC)operator(()ident(regnum)operator(,) pre_type(unsigned) pre_type(char)operator(*\);) + ident(bufp)operator(->)ident(old_regend) operator(=) ident(TMALLOC)operator(()ident(regnum)operator(,) pre_type(unsigned) pre_type(char)operator(*\);) + ident(bufp)operator(->)ident(reg_info) operator(=) ident(TMALLOC)operator(()ident(regnum)operator(,) ident(register_info_type)operator(\);) + ident(bufp)operator(->)ident(best_regstart) operator(=) ident(TMALLOC)operator(()ident(regnum)operator(,) pre_type(unsigned) pre_type(char)operator(*\);) + ident(bufp)operator(->)ident(best_regend) operator(=) ident(TMALLOC)operator(()ident(regnum)operator(,) pre_type(unsigned) pre_type(char)operator(*\);) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) integer(0)operator(\);) + + label(invalid_pattern)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(invalid regular expression)delimiter(")>operator(\);) + + label(end_of_pattern)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(premature end of regular expression)delimiter(")>operator(\);) + + label(too_big)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(regular expression too big)delimiter(")>operator(\);) + + label(memory_exhausted)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(memory exhausted)delimiter(")>operator(\);) + + label(nested_meta)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(nested *?+ in regexp)delimiter(")>operator(\);) + + label(invalid_escape)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) string<delimiter(")content(Invalid escape character syntax)delimiter(")>operator(\);) +operator(}) + +directive(void) +ident(re_free_pattern)operator(()ident(bufp)operator(\)) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(bufp)operator(;) +operator({) + ident(xfree)operator(()ident(bufp)operator(->)ident(buffer)operator(\);) + ident(xfree)operator(()ident(bufp)operator(->)ident(fastmap)operator(\);) + reserved(if) operator(()ident(bufp)operator(->)ident(must_skip)operator(\)) ident(xfree)operator(()ident(bufp)operator(->)ident(must_skip)operator(\);) + + ident(xfree)operator(()ident(bufp)operator(->)ident(regstart)operator(\);) + ident(xfree)operator(()ident(bufp)operator(->)ident(regend)operator(\);) + ident(xfree)operator(()ident(bufp)operator(->)ident(old_regstart)operator(\);) + ident(xfree)operator(()ident(bufp)operator(->)ident(old_regend)operator(\);) + ident(xfree)operator(()ident(bufp)operator(->)ident(best_regstart)operator(\);) + ident(xfree)operator(()ident(bufp)operator(->)ident(best_regend)operator(\);) + ident(xfree)operator(()ident(bufp)operator(->)ident(reg_info)operator(\);) + ident(xfree)operator(()ident(bufp)operator(\);) +operator(}) + +comment(/* Store a jump of the form <OPCODE> <relative address>. + Store in the location FROM a jump operation to jump to relative + address FROM - TO. OPCODE is the opcode to store. */) + +directive(static) directive(void) +ident(store_jump)operator(()ident(from)operator(,) ident(opcode)operator(,) ident(to)operator(\)) + pre_type(char) operator(*)ident(from)operator(,) operator(*)ident(to)operator(;) + pre_type(int) ident(opcode)operator(;) +operator({) + ident(from)operator([)integer(0)operator(]) operator(=) operator(()pre_type(char)operator(\))ident(opcode)operator(;) + ident(STORE_NUMBER)operator(()ident(from) operator(+) integer(1)operator(,) ident(to) operator(-) operator(()ident(from) operator(+) integer(3)operator(\)\);) +operator(}) + + +comment(/* Open up space before char FROM, and insert there a jump to TO. + CURRENT_END gives the end of the storage not in use, so we know + how much data to copy up. OP is the opcode of the jump to insert. + + If you call this function, you must zero out pending_exact. */) + +directive(static) directive(void) +ident(insert_jump)operator(()ident(op)operator(,) ident(from)operator(,) ident(to)operator(,) ident(current_end)operator(\)) + pre_type(int) ident(op)operator(;) + pre_type(char) operator(*)ident(from)operator(,) operator(*)ident(to)operator(,) operator(*)ident(current_end)operator(;) +operator({) + directive(register) pre_type(char) operator(*)ident(pfrom) operator(=) ident(current_end)operator(;) comment(/* Copy from here... */) + directive(register) pre_type(char) operator(*)ident(pto) operator(=) ident(current_end) operator(+) integer(3)operator(;) comment(/* ...to here. */) + + reserved(while) operator(()ident(pfrom) operator(!=) ident(from)operator(\)) + operator(*--)ident(pto) operator(=) operator(*--)ident(pfrom)operator(;) + ident(store_jump)operator(()ident(from)operator(,) ident(op)operator(,) ident(to)operator(\);) +operator(}) + + +comment(/* Store a jump of the form <opcode> <relative address> <n> . + + Store in the location FROM a jump operation to jump to relative + address FROM - TO. OPCODE is the opcode to store, N is a number the + jump uses, say, to decide how many times to jump. + + If you call this function, you must zero out pending_exact. */) + +directive(static) directive(void) +ident(store_jump_n)operator(()ident(from)operator(,) ident(opcode)operator(,) ident(to)operator(,) ident(n)operator(\)) + pre_type(char) operator(*)ident(from)operator(,) operator(*)ident(to)operator(;) + pre_type(int) ident(opcode)operator(;) + pre_type(unsigned) ident(n)operator(;) +operator({) + ident(from)operator([)integer(0)operator(]) operator(=) operator(()pre_type(char)operator(\))ident(opcode)operator(;) + ident(STORE_NUMBER)operator(()ident(from) operator(+) integer(1)operator(,) ident(to) operator(-) operator(()ident(from) operator(+) integer(3)operator(\)\);) + ident(STORE_NUMBER)operator(()ident(from) operator(+) integer(3)operator(,) ident(n)operator(\);) +operator(}) + + +comment(/* Similar to insert_jump, but handles a jump which needs an extra + number to handle minimum and maximum cases. Open up space at + location FROM, and insert there a jump to TO. CURRENT_END gives the + end of the storage in use, so we know how much data to copy up. OP is + the opcode of the jump to insert. + + If you call this function, you must zero out pending_exact. */) + +directive(static) directive(void) +ident(insert_jump_n)operator(()ident(op)operator(,) ident(from)operator(,) ident(to)operator(,) ident(current_end)operator(,) ident(n)operator(\)) + pre_type(int) ident(op)operator(;) + pre_type(char) operator(*)ident(from)operator(,) operator(*)ident(to)operator(,) operator(*)ident(current_end)operator(;) + pre_type(unsigned) ident(n)operator(;) +operator({) + directive(register) pre_type(char) operator(*)ident(pfrom) operator(=) ident(current_end)operator(;) comment(/* Copy from here... */) + directive(register) pre_type(char) operator(*)ident(pto) operator(=) ident(current_end) operator(+) integer(5)operator(;) comment(/* ...to here. */) + + reserved(while) operator(()ident(pfrom) operator(!=) ident(from)operator(\)) + operator(*--)ident(pto) operator(=) operator(*--)ident(pfrom)operator(;) + ident(store_jump_n)operator(()ident(from)operator(,) ident(op)operator(,) ident(to)operator(,) ident(n)operator(\);) +operator(}) + + +comment(/* Open up space at location THERE, and insert operation OP. + CURRENT_END gives the end of the storage in use, so + we know how much data to copy up. + + If you call this function, you must zero out pending_exact. */) + +directive(static) directive(void) +ident(insert_op)operator(()ident(op)operator(,) ident(there)operator(,) ident(current_end)operator(\)) + pre_type(int) ident(op)operator(;) + pre_type(char) operator(*)ident(there)operator(,) operator(*)ident(current_end)operator(;) +operator({) + directive(register) pre_type(char) operator(*)ident(pfrom) operator(=) ident(current_end)operator(;) comment(/* Copy from here... */) + directive(register) pre_type(char) operator(*)ident(pto) operator(=) ident(current_end) operator(+) integer(1)operator(;) comment(/* ...to here. */) + + reserved(while) operator(()ident(pfrom) operator(!=) ident(there)operator(\)) + operator(*--)ident(pto) operator(=) operator(*--)ident(pfrom)operator(;) + + ident(there)operator([)integer(0)operator(]) operator(=) operator(()pre_type(char)operator(\))ident(op)operator(;) +operator(}) + + +comment(/* Open up space at location THERE, and insert operation OP followed by + NUM_1 and NUM_2. CURRENT_END gives the end of the storage in use, so + we know how much data to copy up. + + If you call this function, you must zero out pending_exact. */) + +directive(static) directive(void) +ident(insert_op_2)operator(()ident(op)operator(,) ident(there)operator(,) ident(current_end)operator(,) ident(num_1)operator(,) ident(num_2)operator(\)) + pre_type(int) ident(op)operator(;) + pre_type(char) operator(*)ident(there)operator(,) operator(*)ident(current_end)operator(;) + pre_type(int) ident(num_1)operator(,) ident(num_2)operator(;) +operator({) + directive(register) pre_type(char) operator(*)ident(pfrom) operator(=) ident(current_end)operator(;) comment(/* Copy from here... */) + directive(register) pre_type(char) operator(*)ident(pto) operator(=) ident(current_end) operator(+) integer(5)operator(;) comment(/* ...to here. */) + + reserved(while) operator(()ident(pfrom) operator(!=) ident(there)operator(\)) + operator(*--)ident(pto) operator(=) operator(*--)ident(pfrom)operator(;) + + ident(there)operator([)integer(0)operator(]) operator(=) operator(()pre_type(char)operator(\))ident(op)operator(;) + ident(STORE_NUMBER)operator(()ident(there) operator(+) integer(1)operator(,) ident(num_1)operator(\);) + ident(STORE_NUMBER)operator(()ident(there) operator(+) integer(3)operator(,) ident(num_2)operator(\);) +operator(}) + + +preprocessor(#define) ident(trans_eq)operator(()ident(c1)operator(,) ident(c2)operator(,) ident(translate)operator(\)) operator(()ident(translate)operator(?()ident(translate)operator([)ident(c1)operator(]==)ident(translate)operator([)ident(c2)operator(]\):(()ident(c1)operator(\)==()ident(c2)operator(\)\)\)) +directive(static) pre_type(int) +ident(slow_match)operator(()ident(little)operator(,) ident(lend)operator(,) ident(big)operator(,) ident(bend)operator(,) ident(translate)operator(\)) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(little)operator(,) operator(*)ident(lend)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(big)operator(,) operator(*)ident(bend)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(translate)operator(;) +operator({) + pre_type(int) ident(c)operator(;) + + reserved(while) operator(()ident(little) operator(<) ident(lend) operator(&&) ident(big) operator(<) ident(bend)operator(\)) operator({) + ident(c) operator(=) operator(*)ident(little)operator(++;) + reserved(if) operator(()ident(c) operator(==) hex(0xff)operator(\)) + ident(c) operator(=) operator(*)ident(little)operator(++;) + reserved(if) operator((!)ident(trans_eq)operator((*)ident(big)operator(++,) ident(c)operator(,) ident(translate)operator(\)\)) reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(little) operator(==) ident(lend)operator(\)) reserved(return) integer(1)operator(;) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(slow_search)operator(()ident(little)operator(,) ident(llen)operator(,) ident(big)operator(,) ident(blen)operator(,) ident(translate)operator(\)) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(little)operator(;) + pre_type(int) ident(llen)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(big)operator(;) + pre_type(int) ident(blen)operator(;) + directive(const) pre_type(char) operator(*)ident(translate)operator(;) +operator({) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(bsave) operator(=) ident(big)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(bend) operator(=) ident(big) operator(+) ident(blen)operator(;) + directive(register) pre_type(int) ident(c)operator(;) + pre_type(int) ident(fescape) operator(=) integer(0)operator(;) + + ident(c) operator(=) operator(*)ident(little)operator(;) + reserved(if) operator(()ident(c) operator(==) hex(0xff)operator(\)) operator({) + ident(c) operator(=) ident(little)operator([)integer(1)operator(];) + ident(fescape) operator(=) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(translate) operator(&&) operator(!)ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + ident(c) operator(=) ident(translate)operator([)ident(c)operator(];) + operator(}) + + reserved(while) operator(()ident(big) operator(<) ident(bend)operator(\)) operator({) + comment(/* look for first character */) + reserved(if) operator(()ident(fescape)operator(\)) operator({) + reserved(while) operator(()ident(big) operator(<) ident(bend)operator(\)) operator({) + reserved(if) operator((*)ident(big) operator(==) ident(c)operator(\)) reserved(break)operator(;) + ident(big)operator(++;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(translate) operator(&&) operator(!)ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + reserved(while) operator(()ident(big) operator(<) ident(bend)operator(\)) operator({) + reserved(if) operator(()ident(ismbchar)operator((*)ident(big)operator(\)\)) ident(big)operator(+=)ident(mbclen)operator((*)ident(big)operator(\)-)integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(translate)operator([*)ident(big)operator(]) operator(==) ident(c)operator(\)) reserved(break)operator(;) + ident(big)operator(++;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(big) operator(<) ident(bend)operator(\)) operator({) + reserved(if) operator((*)ident(big) operator(==) ident(c)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(ismbchar)operator((*)ident(big)operator(\)\)) ident(big)operator(+=)ident(mbclen)operator((*)ident(big)operator(\)-)integer(1)operator(;) + ident(big)operator(++;) + operator(}) + operator(}) + + reserved(if) operator(()ident(slow_match)operator(()ident(little)operator(,) ident(little)operator(+)ident(llen)operator(,) ident(big)operator(,) ident(bend)operator(,) operator(()pre_type(unsigned) pre_type(char) operator(*\))ident(translate)operator(\)\)) + reserved(return) ident(big) operator(-) ident(bsave)operator(;) + + ident(big)operator(+=)ident(mbclen)operator((*)ident(big)operator(\);) + operator(}) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +directive(static) directive(void) +ident(bm_init_skip)operator(()ident(skip)operator(,) ident(pat)operator(,) ident(m)operator(,) ident(translate)operator(\)) + pre_type(int) operator(*)ident(skip)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(pat)operator(;) + pre_type(int) ident(m)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(translate)operator(;) +operator({) + pre_type(int) ident(j)operator(,) ident(c)operator(;) + + reserved(for) operator(()ident(c)operator(=)integer(0)operator(;) ident(c)operator(<)integer(256)operator(;) ident(c)operator(++\)) operator({) + ident(skip)operator([)ident(c)operator(]) operator(=) ident(m)operator(;) + operator(}) + reserved(if) operator(()ident(translate)operator(\)) operator({) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(j)operator(<)ident(m)operator(-)integer(1)operator(;) ident(j)operator(++\)) operator({) + ident(skip)operator([)ident(translate)operator([)ident(pat)operator([)ident(j)operator(]]]) operator(=) ident(m)operator(-)integer(1)operator(-)ident(j)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(for) operator(()ident(j)operator(=)integer(0)operator(;) ident(j)operator(<)ident(m)operator(-)integer(1)operator(;) ident(j)operator(++\)) operator({) + ident(skip)operator([)ident(pat)operator([)ident(j)operator(]]) operator(=) ident(m)operator(-)integer(1)operator(-)ident(j)operator(;) + operator(}) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(bm_search)operator(()ident(little)operator(,) ident(llen)operator(,) ident(big)operator(,) ident(blen)operator(,) ident(skip)operator(,) ident(translate)operator(\)) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(little)operator(;) + pre_type(int) ident(llen)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(big)operator(;) + pre_type(int) ident(blen)operator(;) + pre_type(int) operator(*)ident(skip)operator(;) + directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(translate)operator(;) +operator({) + pre_type(int) ident(i)operator(,) ident(j)operator(,) ident(k)operator(;) + + ident(i) operator(=) ident(llen)operator(-)integer(1)operator(;) + reserved(if) operator(()ident(translate)operator(\)) operator({) + reserved(while) operator(()ident(i) operator(<) ident(blen)operator(\)) operator({) + ident(k) operator(=) ident(i)operator(;) + ident(j) operator(=) ident(llen)operator(-)integer(1)operator(;) + reserved(while) operator(()ident(j) operator(>=) integer(0) operator(&&) ident(translate)operator([)ident(big)operator([)ident(k)operator(]]) operator(==) ident(translate)operator([)ident(little)operator([)ident(j)operator(]]\)) operator({) + ident(k)operator(--;) + ident(j)operator(--;) + operator(}) + reserved(if) operator(()ident(j) operator(<) integer(0)operator(\)) reserved(return) ident(k)operator(+)integer(1)operator(;) + + ident(i) operator(+=) ident(skip)operator([)ident(translate)operator([)ident(big)operator([)ident(i)operator(]]];) + operator(}) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(while) operator(()ident(i) operator(<) ident(blen)operator(\)) operator({) + ident(k) operator(=) ident(i)operator(;) + ident(j) operator(=) ident(llen)operator(-)integer(1)operator(;) + reserved(while) operator(()ident(j) operator(>=) integer(0) operator(&&) ident(big)operator([)ident(k)operator(]) operator(==) ident(little)operator([)ident(j)operator(]\)) operator({) + ident(k)operator(--;) + ident(j)operator(--;) + operator(}) + reserved(if) operator(()ident(j) operator(<) integer(0)operator(\)) reserved(return) ident(k)operator(+)integer(1)operator(;) + + ident(i) operator(+=) ident(skip)operator([)ident(big)operator([)ident(i)operator(]];) + operator(}) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + +comment(/* Given a pattern, compute a fastmap from it. The fastmap records + which of the (1 << BYTEWIDTH\) possible characters can start a string + that matches the pattern. This fastmap is used by re_search to skip + quickly over totally implausible text. + + The caller must supply the address of a (1 << BYTEWIDTH\)-byte data + area as bufp->fastmap. + The other components of bufp describe the pattern to be used. */) +directive(static) pre_type(int) +ident(re_compile_fastmap0)operator(()ident(bufp)operator(\)) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(bufp)operator(;) +operator({) + pre_type(unsigned) pre_type(char) operator(*)ident(pattern) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(bufp)operator(->)ident(buffer)operator(;) + pre_type(int) ident(size) operator(=) ident(bufp)operator(->)ident(used)operator(;) + directive(register) pre_type(char) operator(*)ident(fastmap) operator(=) ident(bufp)operator(->)ident(fastmap)operator(;) + directive(register) pre_type(unsigned) pre_type(char) operator(*)ident(p) operator(=) ident(pattern)operator(;) + directive(register) pre_type(unsigned) pre_type(char) operator(*)ident(pend) operator(=) ident(pattern) operator(+) ident(size)operator(;) + directive(register) pre_type(int) ident(j)operator(,) ident(k)operator(;) + pre_type(unsigned) ident(is_a_succeed_n)operator(;) + + + pre_type(unsigned) pre_type(char) operator(*)ident(stacka)operator([)ident(NFAILURES)operator(];) + pre_type(unsigned) pre_type(char) operator(**)ident(stackb) operator(=) ident(stacka)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(stackp) operator(=) ident(stackb)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(stacke) operator(=) ident(stackb) operator(+) ident(NFAILURES)operator(;) + pre_type(int) ident(options) operator(=) ident(bufp)operator(->)ident(options)operator(;) + + ident(memset)operator(()ident(fastmap)operator(,) integer(0)operator(,) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\)\);) + ident(bufp)operator(->)ident(fastmap_accurate) operator(=) integer(1)operator(;) + ident(bufp)operator(->)ident(can_be_null) operator(=) integer(0)operator(;) + + reserved(while) operator(()ident(p)operator(\)) operator({) + ident(is_a_succeed_n) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) operator({) + ident(bufp)operator(->)ident(can_be_null) operator(=) integer(1)operator(;) + reserved(break)operator(;) + operator(}) +preprocessor(#ifdef) ident(SWITCH_ENUM_BUG) + reserved(switch) operator((()pre_type(int)operator(\)(()reserved(enum) ident(regexpcode)operator(\)*)ident(p)operator(++\)\)) +preprocessor(#else) + reserved(switch) operator((()reserved(enum) ident(regexpcode)operator(\)*)ident(p)operator(++\)) +preprocessor(#endif) + operator({) + reserved(case) label(exactn)operator(:) + reserved(if) operator(()ident(p)operator([)integer(1)operator(]) operator(==) hex(0xff)operator(\)) operator({) + reserved(if) operator(()ident(TRANSLATE_P)operator((\)\)) + ident(fastmap)operator([)ident(translate)operator([)ident(p)operator([)integer(2)operator(]]]) operator(=) integer(2)operator(;) + reserved(else) + ident(fastmap)operator([)ident(p)operator([)integer(2)operator(]]) operator(=) integer(2)operator(;) + ident(bufp)operator(->)ident(options) operator(|=) ident(RE_OPTIMIZE_BMATCH)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(TRANSLATE_P)operator((\)\)) + ident(fastmap)operator([)ident(translate)operator([)ident(p)operator([)integer(1)operator(]]]) operator(=) integer(1)operator(;) + reserved(else) + ident(fastmap)operator([)ident(p)operator([)integer(1)operator(]]) operator(=) integer(1)operator(;) + reserved(break)operator(;) + + reserved(case) label(begline)operator(:) + reserved(case) label(begbuf)operator(:) + reserved(case) label(begpos)operator(:) + reserved(case) label(endbuf)operator(:) + reserved(case) label(endbuf2)operator(:) + reserved(case) label(wordbound)operator(:) + reserved(case) label(notwordbound)operator(:) + reserved(case) label(wordbeg)operator(:) + reserved(case) label(wordend)operator(:) + reserved(case) label(pop_and_fail)operator(:) + reserved(case) label(push_dummy_failure)operator(:) + reserved(case) label(start_paren)operator(:) + reserved(case) label(stop_paren)operator(:) + reserved(continue)operator(;) + + reserved(case) label(casefold_on)operator(:) + ident(bufp)operator(->)ident(options) operator(|=) ident(RE_MAY_IGNORECASE)operator(;) + ident(options) operator(|=) ident(RE_OPTION_IGNORECASE)operator(;) + reserved(continue)operator(;) + + reserved(case) label(casefold_off)operator(:) + ident(options) operator(&=) operator(~)ident(RE_OPTION_IGNORECASE)operator(;) + reserved(continue)operator(;) + + reserved(case) label(option_set)operator(:) + ident(options) operator(=) operator(*)ident(p)operator(++;) + reserved(continue)operator(;) + + reserved(case) label(endline)operator(:) + reserved(if) operator(()ident(TRANSLATE_P)operator((\)\)) + ident(fastmap)operator([)ident(translate)operator([)char('\\n')operator(]]) operator(=) integer(1)operator(;) + reserved(else) + ident(fastmap)operator([)char('\\n')operator(]) operator(=) integer(1)operator(;) + reserved(if) operator((()ident(options) operator(&) ident(RE_OPTION_SINGLELINE)operator(\)) operator(==) integer(0) operator(&&) ident(bufp)operator(->)ident(can_be_null) operator(==) integer(0)operator(\)) + ident(bufp)operator(->)ident(can_be_null) operator(=) integer(2)operator(;) + reserved(break)operator(;) + + reserved(case) label(jump_n)operator(:) + reserved(case) label(finalize_jump)operator(:) + reserved(case) label(maybe_finalize_jump)operator(:) + reserved(case) label(jump)operator(:) + reserved(case) label(jump_past_alt)operator(:) + reserved(case) label(dummy_failure_jump)operator(:) + reserved(case) label(finalize_push)operator(:) + reserved(case) label(finalize_push_n)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(j)operator(,) ident(p)operator(\);) + ident(p) operator(+=) ident(j)operator(;) + reserved(if) operator(()ident(j) operator(>) integer(0)operator(\)) + reserved(continue)operator(;) + comment(/* Jump backward reached implies we just went through + the body of a loop and matched nothing. + Opcode jumped to should be an on_failure_jump. + Just treat it like an ordinary jump. + For a * loop, it has pushed its failure point already; + If so, discard that as redundant. */) + + reserved(if) operator((()reserved(enum) ident(regexpcode)operator(\)*)ident(p) operator(!=) ident(on_failure_jump) + operator(&&) operator(()reserved(enum) ident(regexpcode)operator(\)*)ident(p) operator(!=) ident(try_next) + operator(&&) operator(()reserved(enum) ident(regexpcode)operator(\)*)ident(p) operator(!=) ident(succeed_n)operator(\)) + reserved(continue)operator(;) + ident(p)operator(++;) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(j)operator(,) ident(p)operator(\);) + ident(p) operator(+=) ident(j)operator(;) + reserved(if) operator(()ident(stackp) operator(!=) ident(stackb) operator(&&) operator(*)ident(stackp) operator(==) ident(p)operator(\)) + ident(stackp)operator(--;) comment(/* pop */) + reserved(continue)operator(;) + + reserved(case) label(try_next)operator(:) + reserved(case) label(start_nowidth)operator(:) + reserved(case) label(stop_nowidth)operator(:) + reserved(case) label(stop_backtrack)operator(:) + ident(p) operator(+=) integer(2)operator(;) + reserved(continue)operator(;) + + reserved(case) label(succeed_n)operator(:) + ident(is_a_succeed_n) operator(=) integer(1)operator(;) + comment(/* Get to the number of times to succeed. */) + ident(EXTRACT_NUMBER)operator(()ident(k)operator(,) ident(p) operator(+) integer(2)operator(\);) + comment(/* Increment p past the n for when k != 0. */) + reserved(if) operator(()ident(k) operator(!=) integer(0)operator(\)) operator({) + ident(p) operator(+=) integer(4)operator(;) + reserved(continue)operator(;) + operator(}) + comment(/* fall through */) + + reserved(case) label(on_failure_jump)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(j)operator(,) ident(p)operator(\);) + reserved(if) operator(()ident(p) operator(+) ident(j) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator(()ident(stackp) operator(==) ident(stacke)operator(\)) operator({) + ident(EXPAND_FAIL_STACK)operator((\);) + operator(}) + operator(*++)ident(stackp) operator(=) ident(p) operator(+) ident(j)operator(;) comment(/* push */) + operator(}) + reserved(else) operator({) + ident(bufp)operator(->)ident(can_be_null) operator(=) integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(is_a_succeed_n)operator(\)) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(k)operator(,) ident(p)operator(\);) comment(/* Skip the n. */) + reserved(continue)operator(;) + + reserved(case) label(set_number_at)operator(:) + ident(p) operator(+=) integer(4)operator(;) + reserved(continue)operator(;) + + reserved(case) label(start_memory)operator(:) + reserved(case) label(stop_memory)operator(:) + ident(p) operator(+=) integer(2)operator(;) + reserved(continue)operator(;) + + reserved(case) label(duplicate)operator(:) + ident(bufp)operator(->)ident(can_be_null) operator(=) integer(1)operator(;) + reserved(if) operator((*)ident(p) operator(>=) ident(bufp)operator(->)ident(re_nsub)operator(\)) reserved(break)operator(;) + ident(fastmap)operator([)char('\\n')operator(]) operator(=) integer(1)operator(;) + reserved(case) label(anychar_repeat)operator(:) + reserved(case) label(anychar)operator(:) + reserved(for) operator(()ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(j)operator(++\)) operator({) + reserved(if) operator(()ident(j) operator(!=) char('\\n') operator(||) operator(()ident(options) operator(&) ident(RE_OPTION_MULTILINE)operator(\)\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(bufp)operator(->)ident(can_be_null)operator(\)) operator({) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) integer(0)operator(\);) + operator(}) + comment(/* Don't return; check the alternative paths + so we can set can_be_null if appropriate. */) + reserved(if) operator((()reserved(enum) ident(regexpcode)operator(\))ident(p)operator([-)integer(1)operator(]) operator(==) ident(anychar_repeat)operator(\)) operator({) + reserved(continue)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(wordchar)operator(:) + reserved(for) operator(()ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) hex(0x80)operator(;) ident(j)operator(++\)) operator({) + reserved(if) operator(()ident(SYNTAX)operator(()ident(j)operator(\)) operator(==) ident(Sword)operator(\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + operator(}) + reserved(switch) operator(()ident(current_mbctype)operator(\)) operator({) + reserved(case) label(MBCTYPE_ASCII)operator(:) + reserved(for) operator(()ident(j) operator(=) hex(0x80)operator(;) ident(j) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(j)operator(++\)) operator({) + reserved(if) operator(()ident(SYNTAX)operator(()ident(j)operator(\)) operator(==) ident(Sword2)operator(\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + operator(}) + reserved(break)operator(;) + reserved(case) label(MBCTYPE_EUC)operator(:) + reserved(case) label(MBCTYPE_SJIS)operator(:) + reserved(case) label(MBCTYPE_UTF8)operator(:) + reserved(for) operator(()ident(j) operator(=) hex(0x80)operator(;) ident(j) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(j)operator(++\)) operator({) + reserved(if) operator(()ident(re_mbctab)operator([)ident(j)operator(]\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(notwordchar)operator(:) + reserved(for) operator(()ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) hex(0x80)operator(;) ident(j)operator(++\)) + reserved(if) operator(()ident(SYNTAX)operator(()ident(j)operator(\)) operator(!=) ident(Sword)operator(\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + reserved(switch) operator(()ident(current_mbctype)operator(\)) operator({) + reserved(case) label(MBCTYPE_ASCII)operator(:) + reserved(for) operator(()ident(j) operator(=) hex(0x80)operator(;) ident(j) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(j)operator(++\)) operator({) + reserved(if) operator(()ident(SYNTAX)operator(()ident(j)operator(\)) operator(!=) ident(Sword2)operator(\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + operator(}) + reserved(break)operator(;) + reserved(case) label(MBCTYPE_EUC)operator(:) + reserved(case) label(MBCTYPE_SJIS)operator(:) + reserved(case) label(MBCTYPE_UTF8)operator(:) + reserved(for) operator(()ident(j) operator(=) hex(0x80)operator(;) ident(j) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(j)operator(++\)) operator({) + reserved(if) operator((!)ident(re_mbctab)operator([)ident(j)operator(]\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(charset)operator(:) + comment(/* NOTE: Charset for single-byte chars never contain + multi-byte char. See set_list_bits(\). */) + reserved(for) operator(()ident(j) operator(=) operator(*)ident(p)operator(++) operator(*) ident(BYTEWIDTH) operator(-) integer(1)operator(;) ident(j) operator(>=) integer(0)operator(;) ident(j)operator(--\)) + reserved(if) operator(()ident(p)operator([)ident(j) operator(/) ident(BYTEWIDTH)operator(]) operator(&) operator(()integer(1) operator(<<) operator(()ident(j) operator(%) ident(BYTEWIDTH)operator(\)\)\)) operator({) + pre_type(int) ident(tmp) operator(=) ident(TRANSLATE_P)operator((\)?)ident(translate)operator([)ident(j)operator(]:)ident(j)operator(;) + ident(fastmap)operator([)ident(tmp)operator(]) operator(=) integer(1)operator(;) + operator(}) + operator({) + pre_type(unsigned) pre_type(short) ident(size)operator(;) + pre_type(unsigned) pre_type(long) ident(c)operator(,) ident(beg)operator(,) ident(end)operator(;) + + ident(p) operator(+=) ident(p)operator([-)integer(1)operator(]) operator(+) integer(2)operator(;) + ident(size) operator(=) ident(EXTRACT_UNSIGNED)operator((&)ident(p)operator([-)integer(2)operator(]\);) + reserved(for) operator(()ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) operator(()pre_type(int)operator(\))ident(size)operator(;) ident(j)operator(++\)) operator({) + ident(c) operator(=) ident(EXTRACT_MBC)operator((&)ident(p)operator([)ident(j)operator(*)integer(8)operator(]\);) + ident(beg) operator(=) ident(WC2MBC1ST)operator(()ident(c)operator(\);) + ident(c) operator(=) ident(EXTRACT_MBC)operator((&)ident(p)operator([)ident(j)operator(*)integer(8)operator(+)integer(4)operator(]\);) + ident(end) operator(=) ident(WC2MBC1ST)operator(()ident(c)operator(\);) + comment(/* set bits for 1st bytes of multi-byte chars. */) + reserved(while) operator(()ident(beg) operator(<=) ident(end)operator(\)) operator({) + comment(/* NOTE: Charset for multi-byte chars might contain + single-byte chars. We must reject them. */) + reserved(if) operator(()ident(c) operator(<) hex(0x100)operator(\)) operator({) + ident(fastmap)operator([)ident(beg)operator(]) operator(=) integer(2)operator(;) + ident(bufp)operator(->)ident(options) operator(|=) ident(RE_OPTIMIZE_BMATCH)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ismbchar)operator(()ident(beg)operator(\)\)) + ident(fastmap)operator([)ident(beg)operator(]) operator(=) integer(1)operator(;) + ident(beg)operator(++;) + operator(}) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(charset_not)operator(:) + comment(/* S: set of all single-byte chars. + M: set of all first bytes that can start multi-byte chars. + s: any set of single-byte chars. + m: any set of first bytes that can start multi-byte chars. + + We assume S+M = U. + ___ _ _ + s+m = (S*s+M*m\). */) + comment(/* Chars beyond end of map must be allowed */) + comment(/* NOTE: Charset_not for single-byte chars might contain + multi-byte chars. See set_list_bits(\). */) + reserved(for) operator(()ident(j) operator(=) operator(*)ident(p) operator(*) ident(BYTEWIDTH)operator(;) ident(j) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(j)operator(++\)) + reserved(if) operator((!)ident(ismbchar)operator(()ident(j)operator(\)\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + + reserved(for) operator(()ident(j) operator(=) operator(*)ident(p)operator(++) operator(*) ident(BYTEWIDTH) operator(-) integer(1)operator(;) ident(j) operator(>=) integer(0)operator(;) ident(j)operator(--\)) + reserved(if) operator((!()ident(p)operator([)ident(j) operator(/) ident(BYTEWIDTH)operator(]) operator(&) operator(()integer(1) operator(<<) operator(()ident(j) operator(%) ident(BYTEWIDTH)operator(\)\)\)\)) operator({) + reserved(if) operator((!)ident(ismbchar)operator(()ident(j)operator(\)\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + operator(}) + operator({) + pre_type(unsigned) pre_type(short) ident(size)operator(;) + pre_type(unsigned) pre_type(long) ident(c)operator(,) ident(beg)operator(;) + pre_type(int) ident(num_literal) operator(=) integer(0)operator(;) + + ident(p) operator(+=) ident(p)operator([-)integer(1)operator(]) operator(+) integer(2)operator(;) + ident(size) operator(=) ident(EXTRACT_UNSIGNED)operator((&)ident(p)operator([-)integer(2)operator(]\);) + reserved(if) operator(()ident(size) operator(==) integer(0)operator(\)) operator({) + reserved(for) operator(()ident(j) operator(=) hex(0x80)operator(;) ident(j) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(j)operator(++\)) + reserved(if) operator(()ident(ismbchar)operator(()ident(j)operator(\)\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + reserved(break)operator(;) + operator(}) + reserved(for) operator(()ident(j) operator(=) integer(0)operator(,)ident(c) operator(=) integer(0)operator(;)ident(j) operator(<) operator(()pre_type(int)operator(\))ident(size)operator(;) ident(j)operator(++\)) operator({) + pre_type(unsigned) pre_type(int) ident(cc) operator(=) ident(EXTRACT_MBC)operator((&)ident(p)operator([)ident(j)operator(*)integer(8)operator(]\);) + ident(beg) operator(=) ident(WC2MBC1ST)operator(()ident(cc)operator(\);) + reserved(while) operator(()ident(c) operator(<=) ident(beg)operator(\)) operator({) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) + ident(fastmap)operator([)ident(c)operator(]) operator(=) integer(1)operator(;) + ident(c)operator(++;) + operator(}) + + ident(cc) operator(=) ident(EXTRACT_MBC)operator((&)ident(p)operator([)ident(j)operator(*)integer(8)operator(+)integer(4)operator(]\);) + reserved(if) operator(()ident(cc) operator(<) hex(0xff)operator(\)) operator({) + ident(num_literal) operator(=) integer(1)operator(;) + reserved(while) operator(()ident(c) operator(<=) ident(cc)operator(\)) operator({) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) + ident(fastmap)operator([)ident(c)operator(]) operator(=) integer(1)operator(;) + ident(c)operator(++;) + operator(}) + operator(}) + ident(c) operator(=) ident(WC2MBC1ST)operator(()ident(cc)operator(\);) + operator(}) + + reserved(for) operator(()ident(j) operator(=) ident(c)operator(;) ident(j) operator(<) operator(()integer(1) operator(<<) ident(BYTEWIDTH)operator(\);) ident(j)operator(++\)) operator({) + reserved(if) operator(()ident(num_literal)operator(\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(ismbchar)operator(()ident(j)operator(\)\)) + ident(fastmap)operator([)ident(j)operator(]) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(unused)operator(:) comment(/* pacify gcc -Wall */) + reserved(break)operator(;) + operator(}) + + comment(/* Get here means we have successfully found the possible starting + characters of one path of the pattern. We need not follow this + path any farther. Instead, look at the next alternative + remembered in the stack. */) + reserved(if) operator(()ident(stackp) operator(!=) ident(stackb)operator(\)) + ident(p) operator(=) operator(*)ident(stackp)operator(--;) comment(/* pop */) + reserved(else) + reserved(break)operator(;) + operator(}) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) integer(0)operator(\);) + label(memory_exhausted)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) operator(-)integer(2)operator(\);) +operator(}) + +directive(void) +ident(re_compile_fastmap)operator(()ident(bufp)operator(\)) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(bufp)operator(;) +operator({) + operator(()directive(void)operator(\))ident(re_compile_fastmap0)operator(()ident(bufp)operator(\);) +operator(}) + +comment(/* adjust startpos value to the position between characters. */) +pre_type(int) +ident(re_mbc_startpos)operator(()ident(string)operator(,) ident(size)operator(,) ident(startpos)operator(,) ident(range)operator(\)) + directive(const) pre_type(char) operator(*)ident(string)operator(;) + pre_type(int) ident(size)operator(,) ident(startpos)operator(,) ident(range)operator(;) +operator({) + pre_type(int) ident(i) operator(=) ident(mbc_startpos)operator(()ident(string)operator(,) ident(startpos)operator(\);) + + reserved(if) operator(()ident(i) operator(<) ident(startpos)operator(\)) operator({) + reserved(if) operator(()ident(range) operator(>) integer(0)operator(\)) operator({) + ident(startpos) operator(=) ident(i) operator(+) ident(mbclen)operator(()ident(string)operator([)ident(i)operator(]\);) + operator(}) + reserved(else) operator({) + pre_type(int) ident(len) operator(=) ident(mbclen)operator(()ident(string)operator([)ident(i)operator(]\);) + reserved(if) operator(()ident(i) operator(+) ident(len) operator(<=) ident(startpos)operator(\)) + ident(startpos) operator(=) ident(i) operator(+) ident(len)operator(;) + reserved(else) + ident(startpos) operator(=) ident(i)operator(;) + operator(}) + operator(}) + reserved(return) ident(startpos)operator(;) +operator(}) + +pre_type(int) +ident(re_adjust_startpos)operator(()ident(bufp)operator(,) ident(string)operator(,) ident(size)operator(,) ident(startpos)operator(,) ident(range)operator(\)) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(bufp)operator(;) + directive(const) pre_type(char) operator(*)ident(string)operator(;) + pre_type(int) ident(size)operator(,) ident(startpos)operator(,) ident(range)operator(;) +operator({) + comment(/* Update the fastmap now if not correct already. */) + reserved(if) operator((!)ident(bufp)operator(->)ident(fastmap_accurate)operator(\)) operator({) + pre_type(int) ident(ret) operator(=) ident(re_compile_fastmap0)operator(()ident(bufp)operator(\);) + reserved(if) operator(()ident(ret)operator(\)) reserved(return) ident(ret)operator(;) + operator(}) + + comment(/* Adjust startpos for mbc string */) + reserved(if) operator(()ident(current_mbctype) operator(&&) ident(startpos)operator(>)integer(0) operator(&&) operator(!()ident(bufp)operator(->)ident(options)operator(&)ident(RE_OPTIMIZE_BMATCH)operator(\)\)) operator({) + ident(startpos) operator(=) ident(re_mbc_startpos)operator(()ident(string)operator(,) ident(size)operator(,) ident(startpos)operator(,) ident(range)operator(\);) + operator(}) + reserved(return) ident(startpos)operator(;) +operator(}) + + +directive(static) pre_type(int) ident(re_match_exec) ident(_)operator((()reserved(struct) ident(re_pattern_buffer) operator(*,) directive(const) pre_type(char) operator(*,) pre_type(int)operator(,) pre_type(int)operator(,) pre_type(int)operator(,) + reserved(struct) ident(re_registers) operator(*\)\);) + +comment(/* Using the compiled pattern in BUFP->buffer, first tries to match + STRING, starting first at index STARTPOS, then at STARTPOS + 1, and + so on. RANGE is the number of places to try before giving up. If + RANGE is negative, it searches backwards, i.e., the starting + positions tried are STARTPOS, STARTPOS - 1, etc. STRING is of SIZE. + In REGS, return the indices of STRING that matched the entire + BUFP->buffer and its contained subexpressions. + + The value returned is the position in the strings at which the match + was found, or -1 if no match was found, or -2 if error (such as + failure stack overflow\). */) + +pre_type(int) +ident(re_search)operator(()ident(bufp)operator(,) ident(string)operator(,) ident(size)operator(,) ident(startpos)operator(,) ident(range)operator(,) ident(regs)operator(\)) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(bufp)operator(;) + directive(const) pre_type(char) operator(*)ident(string)operator(;) + pre_type(int) ident(size)operator(,) ident(startpos)operator(,) ident(range)operator(;) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) +operator({) + directive(register) pre_type(char) operator(*)ident(fastmap) operator(=) ident(bufp)operator(->)ident(fastmap)operator(;) + pre_type(int) ident(val)operator(,) ident(anchor) operator(=) integer(0)operator(,) ident(initpos) operator(=) ident(startpos)operator(;) + + comment(/* Check for out-of-range starting position. */) + reserved(if) operator(()ident(startpos) operator(<) integer(0) operator(||) ident(startpos) operator(>) ident(size)operator(\)) + reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator((!)ident(string)operator(\)) operator({) + reserved(if) operator(()ident(size) operator(==) integer(0)operator(\)) ident(string) operator(=) string<delimiter(")delimiter(")>operator(;) + reserved(else) reserved(return) operator(-)integer(1)operator(;) + operator(}) + + comment(/* Update the fastmap now if not correct already. */) + reserved(if) operator(()ident(fastmap) operator(&&) operator(!)ident(bufp)operator(->)ident(fastmap_accurate)operator(\)) operator({) + pre_type(int) ident(ret) operator(=) ident(re_compile_fastmap0)operator(()ident(bufp)operator(\);) + reserved(if) operator(()ident(ret)operator(\)) reserved(return) ident(ret)operator(;) + operator(}) + + + comment(/* If the search isn't to be a backwards one, don't waste time in a + search for a pattern that must be anchored. */) + reserved(if) operator(()ident(bufp)operator(->)ident(used) operator(>) integer(0)operator(\)) operator({) + reserved(switch) operator((()reserved(enum) ident(regexpcode)operator(\))ident(bufp)operator(->)ident(buffer)operator([)integer(0)operator(]\)) operator({) + reserved(case) label(begbuf)operator(:) + label(begbuf_match)operator(:) + reserved(if) operator(()ident(range) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(startpos) operator(>) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(else) operator({) + ident(val) operator(=) ident(re_match)operator(()ident(bufp)operator(,) ident(string)operator(,) ident(size)operator(,) integer(0)operator(,) ident(regs)operator(\);) + reserved(if) operator(()ident(val) operator(>=) integer(0)operator(\)) reserved(return) integer(0)operator(;) + reserved(return) ident(val)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(begline)operator(:) + ident(anchor) operator(=) integer(1)operator(;) + reserved(break)operator(;) + + reserved(case) label(begpos)operator(:) + ident(val) operator(=) ident(re_match)operator(()ident(bufp)operator(,) ident(string)operator(,) ident(size)operator(,) ident(startpos)operator(,) ident(regs)operator(\);) + reserved(if) operator(()ident(val) operator(>=) integer(0)operator(\)) reserved(return) ident(startpos)operator(;) + reserved(return) ident(val)operator(;) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(bufp)operator(->)ident(options) operator(&) ident(RE_OPTIMIZE_ANCHOR)operator(\)) operator({) + reserved(if) operator(()ident(bufp)operator(->)ident(options)operator(&)ident(RE_OPTION_MULTILINE) operator(&&) ident(range) operator(>) integer(0)operator(\)) operator({) + reserved(goto) ident(begbuf_match)operator(;) + operator(}) + ident(anchor) operator(=) integer(1)operator(;) + operator(}) + + reserved(if) operator(()ident(bufp)operator(->)ident(must)operator(\)) operator({) + pre_type(int) ident(len) operator(=) operator((()pre_type(unsigned) pre_type(char)operator(*\))ident(bufp)operator(->)ident(must)operator(\)[)integer(0)operator(];) + pre_type(int) ident(pos)operator(,) ident(pbeg)operator(,) ident(pend)operator(;) + + ident(pbeg) operator(=) ident(startpos)operator(;) + ident(pend) operator(=) ident(startpos) operator(+) ident(range)operator(;) + reserved(if) operator(()ident(pbeg) operator(>) ident(pend)operator(\)) operator({) comment(/* swap pbeg,pend */) + ident(pos) operator(=) ident(pend)operator(;) ident(pend) operator(=) ident(pbeg)operator(;) ident(pbeg) operator(=) ident(pos)operator(;) + operator(}) + ident(pend) operator(=) ident(size)operator(;) + reserved(if) operator(()ident(bufp)operator(->)ident(options) operator(&) ident(RE_OPTIMIZE_NO_BM)operator(\)) operator({) + ident(pos) operator(=) ident(slow_search)operator((()pre_type(unsigned) pre_type(char) operator(*\)()ident(bufp)operator(->)ident(must)operator(+)integer(1)operator(\),) ident(len)operator(,) + operator(()pre_type(unsigned) pre_type(char)operator(*\)()ident(string)operator(+)ident(pbeg)operator(\),) ident(pend)operator(-)ident(pbeg)operator(,) + operator(()pre_type(char) operator(*\)()ident(MAY_TRANSLATE)operator((\)?)label(translate)operator(:)integer(0)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(pos) operator(=) ident(bm_search)operator((()pre_type(unsigned) pre_type(char) operator(*\)()ident(bufp)operator(->)ident(must)operator(+)integer(1)operator(\),) ident(len)operator(,) + operator(()pre_type(unsigned) pre_type(char) operator(*\)()ident(string)operator(+)ident(pbeg)operator(\),) ident(pend)operator(-)ident(pbeg)operator(,) + ident(bufp)operator(->)ident(must_skip)operator(,) + ident(MAY_TRANSLATE)operator((\)?)label(translate)operator(:)integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(pos) operator(==) operator(-)integer(1)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator(()ident(range) operator(>) integer(0) operator(&&) operator(()ident(bufp)operator(->)ident(options) operator(&) ident(RE_OPTIMIZE_EXACTN)operator(\)\)) operator({) + ident(startpos) operator(+=) ident(pos)operator(;) + ident(range) operator(-=) ident(pos)operator(;) + reserved(if) operator(()ident(range) operator(<) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + operator(}) + operator(}) + + reserved(for) operator((;;\)) operator({) + comment(/* If a fastmap is supplied, skip quickly over characters that + cannot possibly be the start of a match. Note, however, that + if the pattern can possibly match the null string, we must + test it at each starting point so that we take the first null + string we get. */) + + reserved(if) operator(()ident(fastmap) operator(&&) ident(startpos) operator(<) ident(size) + operator(&&) ident(bufp)operator(->)ident(can_be_null) operator(!=) integer(1) operator(&&) operator(!()ident(anchor) operator(&&) ident(startpos) operator(==) integer(0)operator(\)\)) operator({) + reserved(if) operator(()ident(range) operator(>) integer(0)operator(\)) operator({) comment(/* Searching forwards. */) + directive(register) pre_type(unsigned) pre_type(char) operator(*)ident(p)operator(,) ident(c)operator(;) + pre_type(int) ident(irange) operator(=) ident(range)operator(;) + + ident(p) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(string)operator(+)ident(startpos)operator(;) + + reserved(while) operator(()ident(range) operator(>) integer(0)operator(\)) operator({) + ident(c) operator(=) operator(*)ident(p)operator(++;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + pre_type(int) ident(len)operator(;) + + reserved(if) operator(()ident(fastmap)operator([)ident(c)operator(]\)) + reserved(break)operator(;) + ident(len) operator(=) ident(mbclen)operator(()ident(c)operator(\)) operator(-) integer(1)operator(;) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(c) operator(=) operator(*)ident(p)operator(++;) + ident(range)operator(--;) + reserved(if) operator(()ident(fastmap)operator([)ident(c)operator(]) operator(==) integer(2)operator(\)) + reserved(goto) ident(startpos_adjust)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(fastmap)operator([)ident(MAY_TRANSLATE)operator((\)) operator(?) ident(translate)operator([)ident(c)operator(]) operator(:) ident(c)operator(]\)) + reserved(break)operator(;) + operator(}) + ident(range)operator(--;) + operator(}) + label(startpos_adjust)operator(:) + ident(startpos) operator(+=) ident(irange) operator(-) ident(range)operator(;) + operator(}) + reserved(else) operator({) comment(/* Searching backwards. */) + directive(register) pre_type(unsigned) pre_type(char) ident(c)operator(;) + + ident(c) operator(=) ident(string)operator([)ident(startpos)operator(];) + ident(c) operator(&=) hex(0xff)operator(;) + reserved(if) operator(()ident(MAY_TRANSLATE)operator((\)) operator(?) operator(!)ident(fastmap)operator([)ident(translate)operator([)ident(c)operator(]]) operator(:) operator(!)ident(fastmap)operator([)ident(c)operator(]\)) + reserved(goto) ident(advance)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()ident(startpos) operator(>) ident(size)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator((()ident(anchor) operator(||) operator(!)ident(bufp)operator(->)ident(can_be_null)operator(\)) operator(&&) ident(range) operator(>) integer(0) operator(&&) ident(size) operator(>) integer(0) operator(&&) ident(startpos) operator(==) ident(size)operator(\)) + reserved(return) operator(-)integer(1)operator(;) + ident(val) operator(=) ident(re_match_exec)operator(()ident(bufp)operator(,) ident(string)operator(,) ident(size)operator(,) ident(startpos)operator(,) ident(initpos)operator(,) ident(regs)operator(\);) + reserved(if) operator(()ident(val) operator(>=) integer(0)operator(\)) reserved(return) ident(startpos)operator(;) + reserved(if) operator(()ident(val) operator(==) operator(-)integer(2)operator(\)) reserved(return) operator(-)integer(2)operator(;) + +preprocessor(#ifndef) ident(NO_ALLOCA) +preprocessor(#ifdef) ident(C_ALLOCA) + ident(alloca)operator(()integer(0)operator(\);) +preprocessor(#endif) comment(/* C_ALLOCA */) +preprocessor(#endif) comment(/* NO_ALLOCA */) + + reserved(if) operator(()ident(range) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(anchor) operator(&&) ident(startpos) operator(<) ident(size) operator(&&) + operator(()ident(startpos) operator(<) integer(1) operator(||) ident(string)operator([)ident(startpos)operator(-)integer(1)operator(]) operator(!=) char('\\n')operator(\)\)) operator({) + reserved(while) operator(()ident(range) operator(>) integer(0) operator(&&) ident(string)operator([)ident(startpos)operator(]) operator(!=) char('\\n')operator(\)) operator({) + ident(range)operator(--;) + ident(startpos)operator(++;) + operator(}) + operator(}) + operator(}) + + label(advance)operator(:) + reserved(if) operator((!)ident(range)operator(\)) + reserved(break)operator(;) + reserved(else) reserved(if) operator(()ident(range) operator(>) integer(0)operator(\)) operator({) + directive(const) pre_type(char) operator(*)ident(d) operator(=) ident(string) operator(+) ident(startpos)operator(;) + + reserved(if) operator(()ident(ismbchar)operator((*)ident(d)operator(\)\)) operator({) + pre_type(int) ident(len) operator(=) ident(mbclen)operator((*)ident(d)operator(\)) operator(-) integer(1)operator(;) + ident(range)operator(-=)ident(len)operator(,) ident(startpos)operator(+=)ident(len)operator(;) + reserved(if) operator((!)ident(range)operator(\)) + reserved(break)operator(;) + operator(}) + ident(range)operator(--,) ident(startpos)operator(++;) + operator(}) + reserved(else) operator({) + ident(range)operator(++,) ident(startpos)operator(--;) + operator({) + directive(const) pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(d)operator(,) operator(*)ident(p)operator(;) + + ident(s) operator(=) ident(string)operator(;) ident(d) operator(=) ident(string) operator(+) ident(startpos)operator(;) + reserved(for) operator(()ident(p) operator(=) ident(d)operator(;) ident(p)operator(--) operator(>) ident(s) operator(&&) ident(ismbchar)operator((*)ident(p)operator(\);) operator(\)) + comment(/* --p >= s would not work on 80[12]?86. + (when the offset of s equals 0 other than huge model.\) */) + operator(;) + reserved(if) operator((!(()ident(d) operator(-) ident(p)operator(\)) operator(&) integer(1)operator(\)\)) operator({) + reserved(if) operator((!)ident(range)operator(\)) + reserved(break)operator(;) + ident(range)operator(++,) ident(startpos)operator(--;) + operator(}) + operator(}) + operator(}) + operator(}) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + + + + +comment(/* The following are used for re_match, defined below: */) + +comment(/* Accessing macros used in re_match: */) + +preprocessor(#define) ident(IS_ACTIVE)operator(()ident(R)operator(\)) operator((()ident(R)operator(\))operator(.)ident(bits)operator(.)ident(is_active)operator(\)) +preprocessor(#define) ident(MATCHED_SOMETHING)operator(()ident(R)operator(\)) operator((()ident(R)operator(\))operator(.)ident(bits)operator(.)ident(matched_something)operator(\)) + + +comment(/* Macros used by re_match: */) + +comment(/* I.e., regstart, regend, and reg_info. */) +preprocessor(#define) ident(NUM_REG_ITEMS) integer(3) + +comment(/* I.e., ptr and count. */) +preprocessor(#define) ident(NUM_COUNT_ITEMS) integer(2) + +comment(/* Individual items aside from the registers. */) +preprocessor(#define) ident(NUM_NONREG_ITEMS) integer(4) + +comment(/* We push at most this many things on the stack whenever we + fail. The `+ 2' refers to PATTERN_PLACE and STRING_PLACE, which are + arguments to the PUSH_FAILURE_POINT macro. */) +preprocessor(#define) ident(MAX_NUM_FAILURE_ITEMS) operator(()ident(num_regs) operator(*) ident(NUM_REG_ITEMS) operator(+) ident(NUM_NONREG_ITEMS)operator(\)) + +comment(/* We push this many things on the stack whenever we fail. */) +preprocessor(#define) ident(NUM_FAILURE_ITEMS) operator(()ident(last_used_reg) operator(*) ident(NUM_REG_ITEMS) operator(+) ident(NUM_NONREG_ITEMS) operator(+) integer(1)operator(\)) + +comment(/* This pushes counter information for succeed_n and jump_n */) +preprocessor(#define) ident(PUSH_FAILURE_COUNT)operator(()ident(ptr)operator(\)) \ + reserved(do) operator({) \ + pre_type(int) ident(c)operator(;) \ + ident(EXTRACT_NUMBER)operator(()ident(c)operator(,) ident(ptr)operator(\);) \ + ident(ENSURE_FAIL_STACK)operator(()ident(NUM_COUNT_ITEMS)operator(\);) \ + operator(*)ident(stackp)operator(++) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\)()pre_type(long)operator(\))ident(c)operator(;) \ + operator(*)ident(stackp)operator(++) operator(=) operator(()ident(ptr)operator(\);) \ + ident(num_failure_counts)operator(++;) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* This pushes most of the information about the current state we will want + if we ever fail back to it. */) + +preprocessor(#define) ident(PUSH_FAILURE_POINT)operator(()ident(pattern_place)operator(,) ident(string_place)operator(\)) \ + reserved(do) operator({) \ + pre_type(long) ident(last_used_reg)operator(,) ident(this_reg)operator(;) \ + \ + comment(/* Find out how many registers are active or have been matched. \\ + (Aside from register zero, which is only set at the end.\) */) \ + reserved(for) operator(()ident(last_used_reg) operator(=) ident(num_regs)operator(-)integer(1)operator(;) ident(last_used_reg) operator(>) integer(0)operator(;) ident(last_used_reg)operator(--\))\ + reserved(if) operator((!)ident(REG_UNSET)operator(()ident(regstart)operator([)ident(last_used_reg)operator(]\)\)) \ + reserved(break)operator(;) \ + \ + ident(ENSURE_FAIL_STACK)operator(()ident(NUM_FAILURE_ITEMS)operator(\);) \ + operator(*)ident(stackp)operator(++) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\)()pre_type(long)operator(\))ident(num_failure_counts)operator(;) \ + ident(num_failure_counts) operator(=) integer(0)operator(;) \ + \ + comment(/* Now push the info for each of those registers. */) \ + reserved(for) operator(()ident(this_reg) operator(=) integer(1)operator(;) ident(this_reg) operator(<=) ident(last_used_reg)operator(;) ident(this_reg)operator(++\)) operator({) \ + operator(*)ident(stackp)operator(++) operator(=) ident(regstart)operator([)ident(this_reg)operator(];) \ + operator(*)ident(stackp)operator(++) operator(=) ident(regend)operator([)ident(this_reg)operator(];) \ + operator(*)ident(stackp)operator(++) operator(=) ident(reg_info)operator([)ident(this_reg)operator(])operator(.)ident(word)operator(;) \ + operator(}) \ + \ + comment(/* Push how many registers we saved. */) \ + operator(*)ident(stackp)operator(++) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(last_used_reg)operator(;) \ + \ + operator(*)ident(stackp)operator(++) operator(=) ident(pattern_place)operator(;) \ + operator(*)ident(stackp)operator(++) operator(=) ident(string_place)operator(;) \ + operator(*)ident(stackp)operator(++) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\)()pre_type(long)operator(\))ident(options)operator(;) comment(/* current option status */) \ + operator(*)ident(stackp)operator(++) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))integer(0)operator(;) comment(/* non-greedy flag */) \ + operator(}) reserved(while)operator(()integer(0)operator(\)) + +preprocessor(#define) ident(NON_GREEDY) operator((()pre_type(unsigned) pre_type(char)operator(*\))integer(1)operator(\)) + +preprocessor(#define) ident(POP_FAILURE_COUNT)operator((\)) \ + reserved(do) operator({) \ + pre_type(unsigned) pre_type(char) operator(*)ident(ptr) operator(=) operator(*--)ident(stackp)operator(;) \ + pre_type(int) ident(count) operator(=) operator(()pre_type(long)operator(\)*--)ident(stackp)operator(;) \ + ident(STORE_NUMBER)operator(()ident(ptr)operator(,) ident(count)operator(\);) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +comment(/* This pops what PUSH_FAILURE_POINT pushes. */) + +preprocessor(#define) ident(POP_FAILURE_POINT)operator((\)) \ + reserved(do) operator({) \ + pre_type(long) ident(temp)operator(;) \ + ident(stackp) operator(-=) ident(NUM_NONREG_ITEMS)operator(;) comment(/* Remove failure points (and flag\). */) \ + ident(temp) operator(=) operator(()pre_type(long)operator(\)*--)ident(stackp)operator(;) comment(/* How many regs pushed. */) \ + ident(temp) operator(*=) ident(NUM_REG_ITEMS)operator(;) comment(/* How much to take off the stack. */) \ + ident(stackp) operator(-=) ident(temp)operator(;) comment(/* Remove the register info. */) \ + ident(temp) operator(=) operator(()pre_type(long)operator(\)*--)ident(stackp)operator(;) comment(/* How many counters pushed. */) \ + reserved(while) operator(()ident(temp)operator(--\)) operator({) \ + ident(POP_FAILURE_COUNT)operator((\);) comment(/* Remove the counter info. */) \ + operator(}) \ + ident(num_failure_counts) operator(=) integer(0)operator(;) comment(/* Reset num_failure_counts. */) \ + operator(}) reserved(while)operator(()integer(0)operator(\)) + + comment(/* Registers are set to a sentinel when they haven't yet matched. */) +preprocessor(#define) ident(REG_UNSET_VALUE) operator((()pre_type(unsigned) pre_type(char)operator(*\)-)integer(1)operator(\)) +preprocessor(#define) ident(REG_UNSET)operator(()ident(e)operator(\)) operator((()ident(e)operator(\)) operator(==) ident(REG_UNSET_VALUE)operator(\)) + +preprocessor(#define) ident(PREFETCH) reserved(if) operator(()ident(d) operator(==) ident(dend)operator(\)) reserved(goto) ident(fail) + + comment(/* Call this when have matched something; it sets `matched' flags for the + registers corresponding to the subexpressions of which we currently + are inside. */) +preprocessor(#define) ident(SET_REGS_MATCHED) \ + reserved(do) operator({) pre_type(unsigned) ident(this_reg)operator(;) \ + reserved(for) operator(()ident(this_reg) operator(=) integer(0)operator(;) ident(this_reg) operator(<) ident(num_regs)operator(;) ident(this_reg)operator(++\)) operator({) \ + reserved(if) operator(()ident(IS_ACTIVE)operator(()ident(reg_info)operator([)ident(this_reg)operator(]\)\)) \ + ident(MATCHED_SOMETHING)operator(()ident(reg_info)operator([)ident(this_reg)operator(]\)) operator(=) integer(1)operator(;) \ + reserved(else) \ + ident(MATCHED_SOMETHING)operator(()ident(reg_info)operator([)ident(this_reg)operator(]\)) operator(=) integer(0)operator(;) \ + operator(}) \ + operator(}) reserved(while)operator(()integer(0)operator(\)) + +preprocessor(#define) ident(AT_STRINGS_BEG)operator(()ident(d)operator(\)) operator((()ident(d)operator(\)) operator(==) ident(string)operator(\)) +preprocessor(#define) ident(AT_STRINGS_END)operator(()ident(d)operator(\)) operator((()ident(d)operator(\)) operator(==) ident(dend)operator(\)) + +preprocessor(#define) ident(IS_A_LETTER)operator(()ident(d)operator(\)) operator(()ident(SYNTAX)operator((*()ident(d)operator(\)\)) operator(==) ident(Sword) operator(||) \ + operator(()ident(current_mbctype) operator(?) \ + operator(()ident(re_mbctab)operator([*()ident(d)operator(\)]) operator(&&) operator((()ident(d)operator(\)+)ident(mbclen)operator((*()ident(d)operator(\)\)\)<=)ident(dend)operator(\):) \ + ident(SYNTAX)operator((*()ident(d)operator(\)\)) operator(==) ident(Sword2)operator(\)\)) + +preprocessor(#define) ident(PREV_IS_A_LETTER)operator(()ident(d)operator(\)) operator((()ident(current_mbctype) operator(==) ident(MBCTYPE_SJIS)operator(\)?) \ + ident(IS_A_LETTER)operator((()ident(d)operator(\)-(!)ident(AT_STRINGS_BEG)operator((()ident(d)operator(\)-)integer(1)operator(\)&&) \ + ident(ismbchar)operator((()ident(d)operator(\)[-)integer(2)operator(]\)?)integer(2)operator(:)integer(1)operator(\)\):) \ + operator((()ident(current_mbctype) operator(&&) operator((()ident(d)operator(\)[-)integer(1)operator(]) operator(>=) hex(0x80)operator(\)\)) operator(||) \ + ident(IS_A_LETTER)operator((()ident(d)operator(\)-)integer(1)operator(\)\)\)) + +directive(static) directive(void) +ident(init_regs)operator(()ident(regs)operator(,) ident(num_regs)operator(\)) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) + pre_type(unsigned) pre_type(int) ident(num_regs)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + ident(regs)operator(->)ident(num_regs) operator(=) ident(num_regs)operator(;) + reserved(if) operator(()ident(num_regs) operator(<) ident(RE_NREGS)operator(\)) + ident(num_regs) operator(=) ident(RE_NREGS)operator(;) + + reserved(if) operator(()ident(regs)operator(->)ident(allocated) operator(==) integer(0)operator(\)) operator({) + ident(regs)operator(->)ident(beg) operator(=) ident(TMALLOC)operator(()ident(num_regs)operator(,) pre_type(int)operator(\);) + ident(regs)operator(->)ident(end) operator(=) ident(TMALLOC)operator(()ident(num_regs)operator(,) pre_type(int)operator(\);) + ident(regs)operator(->)ident(allocated) operator(=) ident(num_regs)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(regs)operator(->)ident(allocated) operator(<) ident(num_regs)operator(\)) operator({) + ident(TREALLOC)operator(()ident(regs)operator(->)ident(beg)operator(,) ident(num_regs)operator(,) pre_type(int)operator(\);) + ident(TREALLOC)operator(()ident(regs)operator(->)ident(end)operator(,) ident(num_regs)operator(,) pre_type(int)operator(\);) + ident(regs)operator(->)ident(allocated) operator(=) ident(num_regs)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(num_regs)operator(;) ident(i)operator(++\)) operator({) + ident(regs)operator(->)ident(beg)operator([)ident(i)operator(]) operator(=) ident(regs)operator(->)ident(end)operator([)ident(i)operator(]) operator(=) operator(-)integer(1)operator(;) + operator(}) +operator(}) + +comment(/* Match the pattern described by BUFP against STRING, which is of + SIZE. Start the match at index POS in STRING. In REGS, return the + indices of STRING that matched the entire BUFP->buffer and its + contained subexpressions. + + If bufp->fastmap is nonzero, then it had better be up to date. + + The reason that the data to match are specified as two components + which are to be regarded as concatenated is so this function can be + used directly on the contents of an Emacs buffer. + + -1 is returned if there is no match. -2 is returned if there is an + error (such as match stack overflow\). Otherwise the value is the + length of the substring which was matched. */) + +pre_type(int) +ident(re_match)operator(()ident(bufp)operator(,) ident(string_arg)operator(,) ident(size)operator(,) ident(pos)operator(,) ident(regs)operator(\)) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(bufp)operator(;) + directive(const) pre_type(char) operator(*)ident(string_arg)operator(;) + pre_type(int) ident(size)operator(,) ident(pos)operator(;) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) +operator({) + reserved(return) ident(re_match_exec)operator(()ident(bufp)operator(,) ident(string_arg)operator(,) ident(size)operator(,) ident(pos)operator(,) ident(pos)operator(,) ident(regs)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(re_match_exec)operator(()ident(bufp)operator(,) ident(string_arg)operator(,) ident(size)operator(,) ident(pos)operator(,) ident(beg)operator(,) ident(regs)operator(\)) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(bufp)operator(;) + directive(const) pre_type(char) operator(*)ident(string_arg)operator(;) + pre_type(int) ident(size)operator(,) ident(pos)operator(,) ident(beg)operator(;) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) +operator({) + directive(register) pre_type(unsigned) pre_type(char) operator(*)ident(p) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(bufp)operator(->)ident(buffer)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(p1)operator(;) + + comment(/* Pointer to beyond end of buffer. */) + directive(register) pre_type(unsigned) pre_type(char) operator(*)ident(pend) operator(=) ident(p) operator(+) ident(bufp)operator(->)ident(used)operator(;) + + pre_type(unsigned) ident(num_regs) operator(=) ident(bufp)operator(->)ident(re_nsub)operator(;) + + pre_type(unsigned) pre_type(char) operator(*)ident(string) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(string_arg)operator(;) + + directive(register) pre_type(unsigned) pre_type(char) operator(*)ident(d)operator(,) operator(*)ident(dend)operator(;) + directive(register) pre_type(int) ident(mcnt)operator(;) comment(/* Multipurpose. */) + pre_type(int) ident(options) operator(=) ident(bufp)operator(->)ident(options)operator(;) + + comment(/* Failure point stack. Each place that can handle a failure further + down the line pushes a failure point on this stack. It consists of + restart, regend, and reg_info for all registers corresponding to the + subexpressions we're currently inside, plus the number of such + registers, and, finally, two char *'s. The first char * is where to + resume scanning the pattern; the second one is where to resume + scanning the strings. If the latter is zero, the failure point is a + ``dummy''; if a failure happens and the failure point is a dummy, it + gets discarded and the next next one is tried. */) + + pre_type(unsigned) pre_type(char) operator(**)directive(const) ident(stacka) operator(=) integer(0)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(stackb)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(stackp)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(stacke)operator(;) + + comment(/* Information on the contents of registers. These are pointers into + the input strings; they record just what was matched (on this + attempt\) by a subexpression part of the pattern, that is, the + regnum-th regstart pointer points to where in the pattern we began + matching and the regnum-th regend points to right after where we + stopped matching the regnum-th subexpression. (The zeroth register + keeps track of what the whole pattern matches.\) */) + + pre_type(unsigned) pre_type(char) operator(**)ident(regstart) operator(=) ident(bufp)operator(->)ident(regstart)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(regend) operator(=) ident(bufp)operator(->)ident(regend)operator(;) + + comment(/* If a group that's operated upon by a repetition operator fails to + match anything, then the register for its start will need to be + restored because it will have been set to wherever in the string we + are when we last see its open-group operator. Similarly for a + register's end. */) + pre_type(unsigned) pre_type(char) operator(**)ident(old_regstart) operator(=) ident(bufp)operator(->)ident(old_regstart)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(old_regend) operator(=) ident(bufp)operator(->)ident(old_regend)operator(;) + + comment(/* The is_active field of reg_info helps us keep track of which (possibly + nested\) subexpressions we are currently in. The matched_something + field of reg_info[reg_num] helps us tell whether or not we have + matched any of the pattern so far this time through the reg_num-th + subexpression. These two fields get reset each time through any + loop their register is in. */) + + ident(register_info_type) operator(*)ident(reg_info) operator(=) ident(bufp)operator(->)ident(reg_info)operator(;) + + comment(/* The following record the register info as found in the above + variables when we find a match better than any we've seen before. + This happens as we backtrack through the failure points, which in + turn happens only if we have not yet matched the entire string. */) + + pre_type(unsigned) ident(best_regs_set) operator(=) integer(0)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(best_regstart) operator(=) ident(bufp)operator(->)ident(best_regstart)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(best_regend) operator(=) ident(bufp)operator(->)ident(best_regend)operator(;) + + pre_type(int) ident(num_failure_counts) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(regs)operator(\)) operator({) + ident(init_regs)operator(()ident(regs)operator(,) ident(num_regs)operator(\);) + operator(}) + + comment(/* Initialize the stack. */) + ident(stackb) operator(=) ident(TMALLOC)operator(()ident(MAX_NUM_FAILURE_ITEMS) operator(*) ident(NFAILURES)operator(,) pre_type(unsigned) pre_type(char)operator(*\);) + ident(stackp) operator(=) ident(stackb)operator(;) + ident(stacke) operator(=) operator(&)ident(stackb)operator([)ident(MAX_NUM_FAILURE_ITEMS) operator(*) ident(NFAILURES)operator(];) + +preprocessor(#ifdef) ident(DEBUG_REGEX) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content(Entering re_match(%s\))char(\\n)delimiter(")>operator(,) ident(string_arg)operator(\);) +preprocessor(#endif) + + comment(/* Initialize subexpression text positions to -1 to mark ones that no + ( or ( and \) or \) has been seen for. Also set all registers to + inactive and mark them as not having matched anything or ever + failed. */) + reserved(for) operator(()ident(mcnt) operator(=) integer(0)operator(;) ident(mcnt) operator(<) ident(num_regs)operator(;) ident(mcnt)operator(++\)) operator({) + ident(regstart)operator([)ident(mcnt)operator(]) operator(=) ident(regend)operator([)ident(mcnt)operator(]) + operator(=) ident(old_regstart)operator([)ident(mcnt)operator(]) operator(=) ident(old_regend)operator([)ident(mcnt)operator(]) + operator(=) ident(best_regstart)operator([)ident(mcnt)operator(]) operator(=) ident(best_regend)operator([)ident(mcnt)operator(]) operator(=) ident(REG_UNSET_VALUE)operator(;) +preprocessor(#ifdef) ident(__CHECKER__) + ident(reg_info)operator([)ident(mcnt)operator(])operator(.)ident(word) operator(=) integer(0)operator(;) +preprocessor(#endif) + ident(IS_ACTIVE) operator(()ident(reg_info)operator([)ident(mcnt)operator(]\)) operator(=) integer(0)operator(;) + ident(MATCHED_SOMETHING) operator(()ident(reg_info)operator([)ident(mcnt)operator(]\)) operator(=) integer(0)operator(;) + operator(}) + + comment(/* Set up pointers to ends of strings. + Don't allow the second string to be empty unless both are empty. */) + + + comment(/* `p' scans through the pattern as `d' scans through the data. `dend' + is the end of the input string that `d' points within. `d' is + advanced into the following input string whenever necessary, but + this happens before fetching; therefore, at the beginning of the + loop, `d' can be pointing at the end of a string, but it cannot + equal string2. */) + + ident(d) operator(=) ident(string) operator(+) ident(pos)operator(,) ident(dend) operator(=) ident(string) operator(+) ident(size)operator(;) + + comment(/* This loops over pattern commands. It exits by returning from the + function if match is complete, or it drops through if match fails + at this starting point in the input data. */) + + reserved(for) operator((;;\)) operator({) +preprocessor(#ifdef) ident(DEBUG_REGEX) + ident(fprintf)operator(()ident(stderr)operator(,) + string<delimiter(")content(regex loop(%d\): matching 0x%02d)char(\\n)delimiter(")>operator(,) + ident(p) operator(-) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(bufp)operator(->)ident(buffer)operator(,) + operator(*)ident(p)operator(\);) +preprocessor(#endif) + comment(/* End of pattern means we might have succeeded. */) + reserved(if) operator(()ident(p) operator(==) ident(pend)operator(\)) operator({) + comment(/* If not end of string, try backtracking. Otherwise done. */) + reserved(if) operator((()ident(bufp)operator(->)ident(options) operator(&) ident(RE_OPTION_LONGEST)operator(\)) operator(&&) ident(d) operator(!=) ident(dend)operator(\)) operator({) + reserved(if) operator(()ident(best_regs_set)operator(\)) comment(/* non-greedy, no need to backtrack */) + reserved(goto) ident(restore_best_regs)operator(;) + reserved(while) operator(()ident(stackp) operator(!=) ident(stackb) operator(&&) ident(stackp)operator([-)integer(1)operator(]) operator(==) ident(NON_GREEDY)operator(\)) operator({) + reserved(if) operator(()ident(best_regs_set)operator(\)) comment(/* non-greedy, no need to backtrack */) + reserved(goto) ident(restore_best_regs)operator(;) + ident(POP_FAILURE_POINT)operator((\);) + operator(}) + reserved(if) operator(()ident(stackp) operator(!=) ident(stackb)operator(\)) operator({) + comment(/* More failure points to try. */) + + comment(/* If exceeds best match so far, save it. */) + reserved(if) operator((!) ident(best_regs_set) operator(||) operator(()ident(d) operator(>) ident(best_regend)operator([)integer(0)operator(]\)\)) operator({) + ident(best_regs_set) operator(=) integer(1)operator(;) + ident(best_regend)operator([)integer(0)operator(]) operator(=) ident(d)operator(;) comment(/* Never use regstart[0]. */) + + reserved(for) operator(()ident(mcnt) operator(=) integer(1)operator(;) ident(mcnt) operator(<) ident(num_regs)operator(;) ident(mcnt)operator(++\)) operator({) + ident(best_regstart)operator([)ident(mcnt)operator(]) operator(=) ident(regstart)operator([)ident(mcnt)operator(];) + ident(best_regend)operator([)ident(mcnt)operator(]) operator(=) ident(regend)operator([)ident(mcnt)operator(];) + operator(}) + operator(}) + reserved(goto) ident(fail)operator(;) + operator(}) + comment(/* If no failure points, don't restore garbage. */) + reserved(else) reserved(if) operator(()ident(best_regs_set)operator(\)) operator({) + label(restore_best_regs)operator(:) + comment(/* Restore best match. */) + ident(d) operator(=) ident(best_regend)operator([)integer(0)operator(];) + + reserved(for) operator(()ident(mcnt) operator(=) integer(0)operator(;) ident(mcnt) operator(<) ident(num_regs)operator(;) ident(mcnt)operator(++\)) operator({) + ident(regstart)operator([)ident(mcnt)operator(]) operator(=) ident(best_regstart)operator([)ident(mcnt)operator(];) + ident(regend)operator([)ident(mcnt)operator(]) operator(=) ident(best_regend)operator([)ident(mcnt)operator(];) + operator(}) + operator(}) + operator(}) + + comment(/* If caller wants register contents data back, convert it + to indices. */) + reserved(if) operator(()ident(regs)operator(\)) operator({) + ident(regs)operator(->)ident(beg)operator([)integer(0)operator(]) operator(=) ident(pos)operator(;) + ident(regs)operator(->)ident(end)operator([)integer(0)operator(]) operator(=) ident(d) operator(-) ident(string)operator(;) + reserved(for) operator(()ident(mcnt) operator(=) integer(1)operator(;) ident(mcnt) operator(<) ident(num_regs)operator(;) ident(mcnt)operator(++\)) operator({) + reserved(if) operator(()ident(REG_UNSET)operator(()ident(regend)operator([)ident(mcnt)operator(]\)\)) operator({) + ident(regs)operator(->)ident(beg)operator([)ident(mcnt)operator(]) operator(=) operator(-)integer(1)operator(;) + ident(regs)operator(->)ident(end)operator([)ident(mcnt)operator(]) operator(=) operator(-)integer(1)operator(;) + reserved(continue)operator(;) + operator(}) + ident(regs)operator(->)ident(beg)operator([)ident(mcnt)operator(]) operator(=) ident(regstart)operator([)ident(mcnt)operator(]) operator(-) ident(string)operator(;) + ident(regs)operator(->)ident(end)operator([)ident(mcnt)operator(]) operator(=) ident(regend)operator([)ident(mcnt)operator(]) operator(-) ident(string)operator(;) + operator(}) + operator(}) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,) operator(()ident(d) operator(-) ident(pos) operator(-) ident(string)operator(\)\);) + operator(}) + + comment(/* Otherwise match next pattern command. */) +preprocessor(#ifdef) ident(SWITCH_ENUM_BUG) + reserved(switch) operator((()pre_type(int)operator(\)(()reserved(enum) ident(regexpcode)operator(\)*)ident(p)operator(++\)\)) +preprocessor(#else) + reserved(switch) operator((()reserved(enum) ident(regexpcode)operator(\)*)ident(p)operator(++\)) +preprocessor(#endif) + operator({) + comment(/* ( [or `(', as appropriate] is represented by start_memory, + \) by stop_memory. Both of those commands are followed by + a register number in the next byte. The text matched + within the ( and \) is recorded under that number. */) + reserved(case) label(start_memory)operator(:) + ident(old_regstart)operator([*)ident(p)operator(]) operator(=) ident(regstart)operator([*)ident(p)operator(];) + ident(regstart)operator([*)ident(p)operator(]) operator(=) ident(d)operator(;) + ident(IS_ACTIVE)operator(()ident(reg_info)operator([*)ident(p)operator(]\)) operator(=) integer(1)operator(;) + ident(MATCHED_SOMETHING)operator(()ident(reg_info)operator([*)ident(p)operator(]\)) operator(=) integer(0)operator(;) + ident(p) operator(+=) integer(2)operator(;) + reserved(continue)operator(;) + + reserved(case) label(stop_memory)operator(:) + ident(old_regend)operator([*)ident(p)operator(]) operator(=) ident(regend)operator([*)ident(p)operator(];) + ident(regend)operator([*)ident(p)operator(]) operator(=) ident(d)operator(;) + ident(IS_ACTIVE)operator(()ident(reg_info)operator([*)ident(p)operator(]\)) operator(=) integer(0)operator(;) + ident(p) operator(+=) integer(2)operator(;) + reserved(continue)operator(;) + + reserved(case) label(start_paren)operator(:) + reserved(case) label(stop_paren)operator(:) + reserved(break)operator(;) + + comment(/* \\<digit> has been turned into a `duplicate' command which is + followed by the numeric value of <digit> as the register number. */) + reserved(case) label(duplicate)operator(:) + operator({) + pre_type(int) ident(regno) operator(=) operator(*)ident(p)operator(++;) comment(/* Get which register to match against */) + directive(register) pre_type(unsigned) pre_type(char) operator(*)ident(d2)operator(,) operator(*)ident(dend2)operator(;) + + comment(/* Check if there's corresponding group */) + reserved(if) operator(()ident(regno) operator(>=) ident(num_regs)operator(\)) reserved(goto) ident(fail)operator(;) + comment(/* Check if corresponding group is still open */) + reserved(if) operator(()ident(IS_ACTIVE)operator(()ident(reg_info)operator([)ident(regno)operator(]\)\)) reserved(goto) ident(fail)operator(;) + + comment(/* Where in input to try to start matching. */) + ident(d2) operator(=) ident(regstart)operator([)ident(regno)operator(];) + reserved(if) operator(()ident(REG_UNSET)operator(()ident(d2)operator(\)\)) reserved(goto) ident(fail)operator(;) + + comment(/* Where to stop matching; if both the place to start and + the place to stop matching are in the same string, then + set to the place to stop, otherwise, for now have to use + the end of the first string. */) + + ident(dend2) operator(=) ident(regend)operator([)ident(regno)operator(];) + reserved(if) operator(()ident(REG_UNSET)operator(()ident(dend2)operator(\)\)) reserved(goto) ident(fail)operator(;) + reserved(for) operator((;;\)) operator({) + comment(/* At end of register contents => success */) + reserved(if) operator(()ident(d2) operator(==) ident(dend2)operator(\)) reserved(break)operator(;) + + comment(/* If necessary, advance to next segment in data. */) + ident(PREFETCH)operator(;) + + comment(/* How many characters left in this segment to match. */) + ident(mcnt) operator(=) ident(dend) operator(-) ident(d)operator(;) + + comment(/* Want how many consecutive characters we can match in + one shot, so, if necessary, adjust the count. */) + reserved(if) operator(()ident(mcnt) operator(>) ident(dend2) operator(-) ident(d2)operator(\)) + ident(mcnt) operator(=) ident(dend2) operator(-) ident(d2)operator(;) + + comment(/* Compare that many; failure if mismatch, else move + past them. */) + reserved(if) operator((()ident(options) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) + operator(?) ident(memcmp_translate)operator(()ident(d)operator(,) ident(d2)operator(,) ident(mcnt)operator(\)) + operator(:) ident(memcmp)operator((()pre_type(char)operator(*\))ident(d)operator(,) operator(()pre_type(char)operator(*\))ident(d2)operator(,) ident(mcnt)operator(\)\)) + reserved(goto) ident(fail)operator(;) + ident(d) operator(+=) ident(mcnt)operator(,) ident(d2) operator(+=) ident(mcnt)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) label(start_nowidth)operator(:) + ident(PUSH_FAILURE_POINT)operator(()integer(0)operator(,) ident(d)operator(\);) + reserved(if) operator(()ident(stackp) operator(-) ident(stackb) operator(>) ident(RE_DUP_MAX)operator(\)) operator({) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,(-)integer(2)operator(\)\);) + operator(}) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(STORE_NUMBER)operator(()ident(p)operator(+)ident(mcnt)operator(,) ident(stackp) operator(-) ident(stackb)operator(\);) + reserved(continue)operator(;) + + reserved(case) label(stop_nowidth)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(stackp) operator(=) ident(stackb) operator(+) ident(mcnt)operator(;) + ident(d) operator(=) ident(stackp)operator([-)integer(3)operator(];) + ident(POP_FAILURE_POINT)operator((\);) + reserved(continue)operator(;) + + reserved(case) label(stop_backtrack)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(stackp) operator(=) ident(stackb) operator(+) ident(mcnt)operator(;) + ident(POP_FAILURE_POINT)operator((\);) + reserved(continue)operator(;) + + reserved(case) label(pop_and_fail)operator(:) + ident(EXTRACT_NUMBER)operator(()ident(mcnt)operator(,) ident(p)operator(+)integer(1)operator(\);) + ident(stackp) operator(=) ident(stackb) operator(+) ident(mcnt)operator(;) + ident(POP_FAILURE_POINT)operator((\);) + reserved(goto) ident(fail)operator(;) + + reserved(case) label(anychar)operator(:) + ident(PREFETCH)operator(;) + reserved(if) operator(()ident(ismbchar)operator((*)ident(d)operator(\)\)) operator({) + reserved(if) operator(()ident(d) operator(+) ident(mbclen)operator((*)ident(d)operator(\)) operator(>) ident(dend)operator(\)) + reserved(goto) ident(fail)operator(;) + ident(SET_REGS_MATCHED)operator(;) + ident(d) operator(+=) ident(mbclen)operator((*)ident(d)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(if) operator((!()ident(options)operator(&)ident(RE_OPTION_MULTILINE)operator(\)) + operator(&&) operator(()ident(TRANSLATE_P)operator((\)) operator(?) ident(translate)operator([*)ident(d)operator(]) operator(:) operator(*)ident(d)operator(\)) operator(==) char('\\n')operator(\)) + reserved(goto) ident(fail)operator(;) + ident(SET_REGS_MATCHED)operator(;) + ident(d)operator(++;) + reserved(break)operator(;) + + reserved(case) label(anychar_repeat)operator(:) + reserved(for) operator((;;\)) operator({) + ident(PUSH_FAILURE_POINT)operator(()ident(p)operator(,) ident(d)operator(\);) + ident(PREFETCH)operator(;) + reserved(if) operator(()ident(ismbchar)operator((*)ident(d)operator(\)\)) operator({) + reserved(if) operator(()ident(d) operator(+) ident(mbclen)operator((*)ident(d)operator(\)) operator(>) ident(dend)operator(\)) + reserved(goto) ident(fail)operator(;) + ident(SET_REGS_MATCHED)operator(;) + ident(d) operator(+=) ident(mbclen)operator((*)ident(d)operator(\);) + reserved(continue)operator(;) + operator(}) + reserved(if) operator((!()ident(options)operator(&)ident(RE_OPTION_MULTILINE)operator(\)) operator(&&) + operator(()ident(TRANSLATE_P)operator((\)) operator(?) ident(translate)operator([*)ident(d)operator(]) operator(:) operator(*)ident(d)operator(\)) operator(==) char('\\n')operator(\)) + reserved(goto) ident(fail)operator(;) + ident(SET_REGS_MATCHED)operator(;) + ident(d)operator(++;) + operator(}) + reserved(break)operator(;) + + reserved(case) label(charset)operator(:) + reserved(case) label(charset_not)operator(:) + operator({) + pre_type(int) ident(not)operator(;) comment(/* Nonzero for charset_not. */) + pre_type(int) ident(part) operator(=) integer(0)operator(;) comment(/* true if matched part of mbc */) + pre_type(unsigned) pre_type(char) operator(*)ident(dsave) operator(=) ident(d) operator(+) integer(1)operator(;) + pre_type(int) ident(cc)operator(,) ident(c)operator(;) + + ident(PREFETCH)operator(;) + ident(c) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\)*)ident(d)operator(++;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + reserved(if) operator(()ident(d) operator(+) ident(mbclen)operator(()ident(c)operator(\)) operator(-) integer(1) operator(<=) ident(dend)operator(\)) operator({) + ident(cc) operator(=) ident(c)operator(;) + ident(MBC2WC)operator(()ident(c)operator(,) ident(d)operator(\);) + ident(not) operator(=) ident(is_in_list_mbc)operator(()ident(c)operator(,) ident(p)operator(\);) + reserved(if) operator((!)ident(not)operator(\)) operator({) + ident(part) operator(=) ident(not) operator(=) ident(is_in_list_sbc)operator(()ident(cc)operator(,) ident(p)operator(\);) + operator(}) + operator(}) reserved(else) operator({) + ident(not) operator(=) ident(is_in_list)operator(()ident(c)operator(,) ident(p)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(TRANSLATE_P)operator((\)\)) + ident(c) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(translate)operator([)ident(c)operator(];) + ident(not) operator(=) ident(is_in_list)operator(()ident(c)operator(,) ident(p)operator(\);) + operator(}) + + reserved(if) operator((*()ident(p) operator(-) integer(1)operator(\)) operator(==) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(charset_not)operator(\)) operator({) + ident(not) operator(=) operator(!)ident(not)operator(;) + operator(}) + reserved(if) operator((!)ident(not)operator(\)) reserved(goto) ident(fail)operator(;) + + ident(p) operator(+=) integer(1) operator(+) operator(*)ident(p) operator(+) integer(2) operator(+) ident(EXTRACT_UNSIGNED)operator((&)ident(p)operator([)integer(1) operator(+) operator(*)ident(p)operator(]\)*)integer(8)operator(;) + ident(SET_REGS_MATCHED)operator(;) + + reserved(if) operator(()ident(part)operator(\)) ident(d) operator(=) ident(dsave)operator(;) + reserved(break)operator(;) + operator(}) + + reserved(case) label(begline)operator(:) + reserved(if) operator(()ident(size) operator(==) integer(0) operator(||) ident(AT_STRINGS_BEG)operator(()ident(d)operator(\)\)) + reserved(break)operator(;) + reserved(if) operator(()ident(d)operator([-)integer(1)operator(]) operator(==) char('\\n') operator(&&) operator(!)ident(AT_STRINGS_END)operator(()ident(d)operator(\)\)) + reserved(break)operator(;) + reserved(goto) ident(fail)operator(;) + + reserved(case) label(endline)operator(:) + reserved(if) operator(()ident(AT_STRINGS_END)operator(()ident(d)operator(\)\)) operator({) + reserved(break)operator(;) + operator(}) + reserved(else) reserved(if) operator((*)ident(d) operator(==) char('\\n')operator(\)) + reserved(break)operator(;) + reserved(goto) ident(fail)operator(;) + + comment(/* Match at the very beginning of the string. */) + reserved(case) label(begbuf)operator(:) + reserved(if) operator(()ident(AT_STRINGS_BEG)operator(()ident(d)operator(\)\)) + reserved(break)operator(;) + reserved(goto) ident(fail)operator(;) + + comment(/* Match at the very end of the data. */) + reserved(case) label(endbuf)operator(:) + reserved(if) operator(()ident(AT_STRINGS_END)operator(()ident(d)operator(\)\)) + reserved(break)operator(;) + reserved(goto) ident(fail)operator(;) + + comment(/* Match at the very end of the data. */) + reserved(case) label(endbuf2)operator(:) + reserved(if) operator(()ident(AT_STRINGS_END)operator(()ident(d)operator(\)\)) operator({) + reserved(break)operator(;) + operator(}) + comment(/* .. or newline just before the end of the data. */) + reserved(if) operator((*)ident(d) operator(==) char('\\n') operator(&&) ident(AT_STRINGS_END)operator(()ident(d)operator(+)integer(1)operator(\)\)) + reserved(break)operator(;) + reserved(goto) ident(fail)operator(;) + + comment(/* `or' constructs are handled by starting each alternative with + an on_failure_jump that points to the start of the next + alternative. Each alternative except the last ends with a + jump to the joining point. (Actually, each jump except for + the last one really jumps to the following jump, because + tensioning the jumps is a hassle.\) */) + + comment(/* The start of a stupid repeat has an on_failure_jump that points + past the end of the repeat text. This makes a failure point so + that on failure to match a repetition, matching restarts past + as many repetitions have been found with no way to fail and + look for another one. */) + + comment(/* A smart repeat is similar but loops back to the on_failure_jump + so that each repetition makes another failure point. */) + + comment(/* Match at the starting position. */) + reserved(case) label(begpos)operator(:) + reserved(if) operator(()ident(d) operator(-) ident(string) operator(==) ident(beg)operator(\)) + reserved(break)operator(;) + reserved(goto) ident(fail)operator(;) + + reserved(case) label(on_failure_jump)operator(:) + label(on_failure)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(PUSH_FAILURE_POINT)operator(()ident(p) operator(+) ident(mcnt)operator(,) ident(d)operator(\);) + reserved(continue)operator(;) + + comment(/* The end of a smart repeat has a maybe_finalize_jump back. + Change it either to a finalize_jump or an ordinary jump. */) + reserved(case) label(maybe_finalize_jump)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(p1) operator(=) ident(p)operator(;) + + comment(/* Compare the beginning of the repeat with what in the + pattern follows its end. If we can establish that there + is nothing that they would both match, i.e., that we + would have to backtrack because of (as in, e.g., `a*a'\) + then we can change to finalize_jump, because we'll + never have to backtrack. + + This is not true in the case of alternatives: in + `(a|ab\)*' we do need to backtrack to the `ab' alternative + (e.g., if the string was `ab'\). But instead of trying to + detect that here, the alternative has put on a dummy + failure point which is what we will end up popping. */) + + comment(/* Skip over open/close-group commands. */) + reserved(while) operator(()ident(p1) operator(+) integer(2) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator((()reserved(enum) ident(regexpcode)operator(\)*)ident(p1) operator(==) ident(stop_memory) operator(||) + operator(()reserved(enum) ident(regexpcode)operator(\)*)ident(p1) operator(==) ident(start_memory)operator(\)) + ident(p1) operator(+=) integer(3)operator(;) comment(/* Skip over args, too. */) + reserved(else) reserved(if) operator(()comment(/*(enum regexpcode\)*p1 == start_paren ||*/) + operator(()reserved(enum) ident(regexpcode)operator(\)*)ident(p1) operator(==) ident(stop_paren)operator(\)) + ident(p1) operator(+=) integer(1)operator(;) + reserved(else) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(p1) operator(==) ident(pend)operator(\)) + ident(p)operator([-)integer(3)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(finalize_jump)operator(;) + reserved(else) reserved(if) operator((*)ident(p1) operator(==) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(exactn) operator(||) + operator(*)ident(p1) operator(==) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(endline)operator(\)) operator({) + directive(register) pre_type(int) ident(c) operator(=) operator(*)ident(p1) operator(==) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(endline) operator(?) char('\\n') operator(:) ident(p1)operator([)integer(2)operator(];) + directive(register) pre_type(unsigned) pre_type(char) operator(*)ident(p2) operator(=) ident(p) operator(+) ident(mcnt)operator(;) + comment(/* p2[0] ... p2[2] are an on_failure_jump. + Examine what follows that. */) + reserved(if) operator(()ident(p2)operator([)integer(3)operator(]) operator(==) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(exactn) operator(&&) ident(p2)operator([)integer(5)operator(]) operator(!=) ident(c)operator(\)) + ident(p)operator([-)integer(3)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(finalize_jump)operator(;) + reserved(else) reserved(if) operator(()ident(p2)operator([)integer(3)operator(]) operator(==) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(charset) operator(||) + ident(p2)operator([)integer(3)operator(]) operator(==) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(charset_not)operator(\)) operator({) + pre_type(int) ident(not)operator(;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + pre_type(unsigned) pre_type(char) operator(*)ident(pp) operator(=) ident(p1)operator(+)integer(3)operator(;) + ident(MBC2WC)operator(()ident(c)operator(,) ident(pp)operator(\);) + operator(}) + comment(/* `is_in_list(\)' is TRUE if c would match */) + comment(/* That means it is not safe to finalize. */) + ident(not) operator(=) ident(is_in_list)operator(()ident(c)operator(,) ident(p2) operator(+) integer(4)operator(\);) + reserved(if) operator(()ident(p2)operator([)integer(3)operator(]) operator(==) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(charset_not)operator(\)) + ident(not) operator(=) operator(!)ident(not)operator(;) + reserved(if) operator((!)ident(not)operator(\)) + ident(p)operator([-)integer(3)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(finalize_jump)operator(;) + operator(}) + operator(}) + ident(p) operator(-=) integer(2)operator(;) comment(/* Point at relative address again. */) + reserved(if) operator(()ident(p)operator([-)integer(1)operator(]) operator(!=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(finalize_jump)operator(\)) operator({) + ident(p)operator([-)integer(1)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(jump)operator(;) + reserved(goto) ident(nofinalize)operator(;) + operator(}) + comment(/* Note fall through. */) + + comment(/* The end of a stupid repeat has a finalize_jump back to the + start, where another failure point will be made which will + point to after all the repetitions found so far. */) + + comment(/* Take off failure points put on by matching on_failure_jump + because didn't fail. Also remove the register information + put on by the on_failure_jump. */) + reserved(case) label(finalize_jump)operator(:) + reserved(if) operator(()ident(stackp) operator(>) ident(stackb) operator(&&) ident(stackp)operator([-)integer(3)operator(]) operator(==) ident(d)operator(\)) operator({) + ident(p) operator(=) ident(stackp)operator([-)integer(4)operator(];) + ident(POP_FAILURE_POINT)operator((\);) + reserved(continue)operator(;) + operator(}) + ident(POP_FAILURE_POINT)operator((\);) + comment(/* Note fall through. */) + + comment(/* We need this opcode so we can detect where alternatives end + in `group_match_null_string_p' et al. */) + reserved(case) label(jump_past_alt)operator(:) + comment(/* fall through */) + + comment(/* Jump without taking off any failure points. */) + reserved(case) label(jump)operator(:) + label(nofinalize)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + reserved(if) operator(()ident(mcnt) operator(<) integer(0) operator(&&) ident(stackp) operator(>) ident(stackb) operator(&&) ident(stackp)operator([-)integer(3)operator(]) operator(==) ident(d)operator(\)) comment(/* avoid infinite loop */) + reserved(goto) ident(fail)operator(;) + ident(p) operator(+=) ident(mcnt)operator(;) + reserved(continue)operator(;) + + reserved(case) label(dummy_failure_jump)operator(:) + comment(/* Normally, the on_failure_jump pushes a failure point, which + then gets popped at finalize_jump. We will end up at + finalize_jump, also, and with a pattern of, say, `a+', we + are skipping over the on_failure_jump, so we have to push + something meaningless for finalize_jump to pop. */) + ident(PUSH_FAILURE_POINT)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(goto) ident(nofinalize)operator(;) + + comment(/* At the end of an alternative, we need to push a dummy failure + point in case we are followed by a `finalize_jump', because + we don't want the failure point for the alternative to be + popped. For example, matching `(a|ab\)*' against `aab' + requires that we match the `ab' alternative. */) + reserved(case) label(push_dummy_failure)operator(:) + comment(/* See comments just above at `dummy_failure_jump' about the + two zeroes. */) + ident(p1) operator(=) ident(p)operator(;) + comment(/* Skip over open/close-group commands. */) + reserved(while) operator(()ident(p1) operator(+) integer(2) operator(<) ident(pend)operator(\)) operator({) + reserved(if) operator((()reserved(enum) ident(regexpcode)operator(\)*)ident(p1) operator(==) ident(stop_memory) operator(||) + operator(()reserved(enum) ident(regexpcode)operator(\)*)ident(p1) operator(==) ident(start_memory)operator(\)) + ident(p1) operator(+=) integer(3)operator(;) comment(/* Skip over args, too. */) + reserved(else) reserved(if) operator(()comment(/*(enum regexpcode\)*p1 == start_paren ||*/) + operator(()reserved(enum) ident(regexpcode)operator(\)*)ident(p1) operator(==) ident(stop_paren)operator(\)) + ident(p1) operator(+=) integer(1)operator(;) + reserved(else) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(p1) operator(<) ident(pend) operator(&&) operator(()reserved(enum) ident(regexpcode)operator(\)*)ident(p1) operator(==) ident(jump)operator(\)) + ident(p)operator([-)integer(1)operator(]) operator(=) ident(unused)operator(;) + reserved(else) + ident(PUSH_FAILURE_POINT)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(break)operator(;) + + comment(/* Have to succeed matching what follows at least n times. Then + just handle like an on_failure_jump. */) + reserved(case) label(succeed_n)operator(:) + ident(EXTRACT_NUMBER)operator(()ident(mcnt)operator(,) ident(p) operator(+) integer(2)operator(\);) + comment(/* Originally, this is how many times we HAVE to succeed. */) + reserved(if) operator(()ident(mcnt) operator(!=) integer(0)operator(\)) operator({) + ident(mcnt)operator(--;) + ident(p) operator(+=) integer(2)operator(;) + ident(PUSH_FAILURE_COUNT)operator(()ident(p)operator(\);) + ident(STORE_NUMBER_AND_INCR)operator(()ident(p)operator(,) ident(mcnt)operator(\);) + ident(PUSH_FAILURE_POINT)operator(()integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(else) operator({) + reserved(goto) ident(on_failure)operator(;) + operator(}) + reserved(continue)operator(;) + + reserved(case) label(jump_n)operator(:) + ident(EXTRACT_NUMBER)operator(()ident(mcnt)operator(,) ident(p) operator(+) integer(2)operator(\);) + comment(/* Originally, this is how many times we CAN jump. */) + reserved(if) operator(()ident(mcnt)operator(\)) operator({) + ident(mcnt)operator(--;) + ident(PUSH_FAILURE_COUNT)operator(()ident(p) operator(+) integer(2)operator(\);) + ident(STORE_NUMBER)operator(()ident(p) operator(+) integer(2)operator(,) ident(mcnt)operator(\);) + reserved(goto) ident(nofinalize)operator(;) comment(/* Do the jump without taking off + any failure points. */) + operator(}) + comment(/* If don't have to jump any more, skip over the rest of command. */) + reserved(else) + ident(p) operator(+=) integer(4)operator(;) + reserved(continue)operator(;) + + reserved(case) label(set_number_at)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(p1) operator(=) ident(p) operator(+) ident(mcnt)operator(;) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(STORE_NUMBER)operator(()ident(p1)operator(,) ident(mcnt)operator(\);) + reserved(continue)operator(;) + + reserved(case) label(try_next)operator(:) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + reserved(if) operator(()ident(p) operator(+) ident(mcnt) operator(<) ident(pend)operator(\)) operator({) + ident(PUSH_FAILURE_POINT)operator(()ident(p)operator(,) ident(d)operator(\);) + ident(stackp)operator([-)integer(1)operator(]) operator(=) ident(NON_GREEDY)operator(;) + operator(}) + ident(p) operator(+=) ident(mcnt)operator(;) + reserved(continue)operator(;) + + reserved(case) label(finalize_push)operator(:) + ident(POP_FAILURE_POINT)operator((\);) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + reserved(if) operator(()ident(mcnt) operator(<) integer(0) operator(&&) ident(stackp) operator(>) ident(stackb) operator(&&) ident(stackp)operator([-)integer(3)operator(]) operator(==) ident(d)operator(\)) comment(/* avoid infinite loop */) + reserved(goto) ident(fail)operator(;) + ident(PUSH_FAILURE_POINT)operator(()ident(p) operator(+) ident(mcnt)operator(,) ident(d)operator(\);) + ident(stackp)operator([-)integer(1)operator(]) operator(=) ident(NON_GREEDY)operator(;) + reserved(continue)operator(;) + + reserved(case) label(finalize_push_n)operator(:) + ident(EXTRACT_NUMBER)operator(()ident(mcnt)operator(,) ident(p) operator(+) integer(2)operator(\);) + comment(/* Originally, this is how many times we CAN jump. */) + reserved(if) operator(()ident(mcnt)operator(\)) operator({) + pre_type(int) ident(pos)operator(,) ident(i)operator(;) + + ident(mcnt)operator(--;) + ident(STORE_NUMBER)operator(()ident(p) operator(+) integer(2)operator(,) ident(mcnt)operator(\);) + ident(EXTRACT_NUMBER)operator(()ident(pos)operator(,) ident(p)operator(\);) + ident(EXTRACT_NUMBER)operator(()ident(i)operator(,) ident(p)operator(+)ident(pos)operator(+)integer(5)operator(\);) + reserved(if) operator(()ident(i) operator(>) integer(0)operator(\)) reserved(goto) ident(nofinalize)operator(;) + ident(POP_FAILURE_POINT)operator((\);) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p)operator(\);) + ident(PUSH_FAILURE_POINT)operator(()ident(p) operator(+) ident(mcnt)operator(,) ident(d)operator(\);) + ident(stackp)operator([-)integer(1)operator(]) operator(=) ident(NON_GREEDY)operator(;) + ident(p) operator(+=) integer(2)operator(;) comment(/* skip n */) + operator(}) + comment(/* If don't have to push any more, skip over the rest of command. */) + reserved(else) + ident(p) operator(+=) integer(4)operator(;) + reserved(continue)operator(;) + + comment(/* Ignore these. Used to ignore the n of succeed_n's which + currently have n == 0. */) + reserved(case) label(unused)operator(:) + reserved(continue)operator(;) + + reserved(case) label(casefold_on)operator(:) + ident(options) operator(|=) ident(RE_OPTION_IGNORECASE)operator(;) + reserved(continue)operator(;) + + reserved(case) label(casefold_off)operator(:) + ident(options) operator(&=) operator(~)ident(RE_OPTION_IGNORECASE)operator(;) + reserved(continue)operator(;) + + reserved(case) label(option_set)operator(:) + ident(options) operator(=) operator(*)ident(p)operator(++;) + reserved(continue)operator(;) + + reserved(case) label(wordbound)operator(:) + reserved(if) operator(()ident(AT_STRINGS_BEG)operator(()ident(d)operator(\)\)) operator({) + reserved(if) operator(()ident(AT_STRINGS_END)operator(()ident(d)operator(\)\)) reserved(goto) ident(fail)operator(;) + reserved(if) operator(()ident(IS_A_LETTER)operator(()ident(d)operator(\)\)) reserved(break)operator(;) + reserved(else) reserved(goto) ident(fail)operator(;) + operator(}) + reserved(if) operator(()ident(AT_STRINGS_END)operator(()ident(d)operator(\)\)) operator({) + reserved(if) operator(()ident(PREV_IS_A_LETTER)operator(()ident(d)operator(\)\)) reserved(break)operator(;) + reserved(else) reserved(goto) ident(fail)operator(;) + operator(}) + reserved(if) operator(()ident(PREV_IS_A_LETTER)operator(()ident(d)operator(\)) operator(!=) ident(IS_A_LETTER)operator(()ident(d)operator(\)\)) + reserved(break)operator(;) + reserved(goto) ident(fail)operator(;) + + reserved(case) label(notwordbound)operator(:) + reserved(if) operator(()ident(AT_STRINGS_BEG)operator(()ident(d)operator(\)\)) operator({) + reserved(if) operator(()ident(IS_A_LETTER)operator(()ident(d)operator(\)\)) reserved(goto) ident(fail)operator(;) + reserved(else) reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(AT_STRINGS_END)operator(()ident(d)operator(\)\)) operator({) + reserved(if) operator(()ident(PREV_IS_A_LETTER)operator(()ident(d)operator(\)\)) reserved(goto) ident(fail)operator(;) + reserved(else) reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(PREV_IS_A_LETTER)operator(()ident(d)operator(\)) operator(!=) ident(IS_A_LETTER)operator(()ident(d)operator(\)\)) + reserved(goto) ident(fail)operator(;) + reserved(break)operator(;) + + reserved(case) label(wordbeg)operator(:) + reserved(if) operator(()ident(IS_A_LETTER)operator(()ident(d)operator(\)) operator(&&) operator(()ident(AT_STRINGS_BEG)operator(()ident(d)operator(\)) operator(||) operator(!)ident(PREV_IS_A_LETTER)operator(()ident(d)operator(\)\)\)) + reserved(break)operator(;) + reserved(goto) ident(fail)operator(;) + + reserved(case) label(wordend)operator(:) + reserved(if) operator((!)ident(AT_STRINGS_BEG)operator(()ident(d)operator(\)) operator(&&) ident(PREV_IS_A_LETTER)operator(()ident(d)operator(\)) + operator(&&) operator((!)ident(IS_A_LETTER)operator(()ident(d)operator(\)) operator(||) ident(AT_STRINGS_END)operator(()ident(d)operator(\)\)\)) + reserved(break)operator(;) + reserved(goto) ident(fail)operator(;) + + reserved(case) label(wordchar)operator(:) + ident(PREFETCH)operator(;) + reserved(if) operator((!)ident(IS_A_LETTER)operator(()ident(d)operator(\)\)) + reserved(goto) ident(fail)operator(;) + reserved(if) operator(()ident(ismbchar)operator((*)ident(d)operator(\)) operator(&&) ident(d) operator(+) ident(mbclen)operator((*)ident(d)operator(\)) operator(-) integer(1) operator(<) ident(dend)operator(\)) + ident(d) operator(+=) ident(mbclen)operator((*)ident(d)operator(\)) operator(-) integer(1)operator(;) + ident(d)operator(++;) + ident(SET_REGS_MATCHED)operator(;) + reserved(break)operator(;) + + reserved(case) label(notwordchar)operator(:) + ident(PREFETCH)operator(;) + reserved(if) operator(()ident(IS_A_LETTER)operator(()ident(d)operator(\)\)) + reserved(goto) ident(fail)operator(;) + reserved(if) operator(()ident(ismbchar)operator((*)ident(d)operator(\)) operator(&&) ident(d) operator(+) ident(mbclen)operator((*)ident(d)operator(\)) operator(-) integer(1) operator(<) ident(dend)operator(\)) + ident(d) operator(+=) ident(mbclen)operator((*)ident(d)operator(\)) operator(-) integer(1)operator(;) + ident(d)operator(++;) + ident(SET_REGS_MATCHED)operator(;) + reserved(break)operator(;) + + reserved(case) label(exactn)operator(:) + comment(/* Match the next few pattern characters exactly. + mcnt is how many characters to match. */) + ident(mcnt) operator(=) operator(*)ident(p)operator(++;) + comment(/* This is written out as an if-else so we don't waste time + testing `translate' inside the loop. */) + reserved(if) operator(()ident(TRANSLATE_P)operator((\)\)) operator({) + reserved(do) operator({) + pre_type(unsigned) pre_type(char) ident(c)operator(;) + + ident(PREFETCH)operator(;) + reserved(if) operator((*)ident(p) operator(==) hex(0xff)operator(\)) operator({) + ident(p)operator(++;) + reserved(if) operator((!--)ident(mcnt) + operator(||) ident(AT_STRINGS_END)operator(()ident(d)operator(\)) + operator(||) operator(()pre_type(unsigned) pre_type(char)operator(\)*)ident(d)operator(++) operator(!=) operator(()pre_type(unsigned) pre_type(char)operator(\)*)ident(p)operator(++\)) + reserved(goto) ident(fail)operator(;) + reserved(continue)operator(;) + operator(}) + ident(c) operator(=) operator(*)ident(d)operator(++;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + pre_type(int) ident(n)operator(;) + + reserved(if) operator(()ident(c) operator(!=) operator(()pre_type(unsigned) pre_type(char)operator(\)*)ident(p)operator(++\)) + reserved(goto) ident(fail)operator(;) + reserved(for) operator(()ident(n) operator(=) ident(mbclen)operator(()ident(c)operator(\)) operator(-) integer(1)operator(;) ident(n) operator(>) integer(0)operator(;) ident(n)operator(--\)) + reserved(if) operator((!--)ident(mcnt) comment(/* redundant check if pattern was + compiled properly. */) + operator(||) ident(AT_STRINGS_END)operator(()ident(d)operator(\)) + operator(||) operator(()pre_type(unsigned) pre_type(char)operator(\)*)ident(d)operator(++) operator(!=) operator(()pre_type(unsigned) pre_type(char)operator(\)*)ident(p)operator(++\)) + reserved(goto) ident(fail)operator(;) + reserved(continue)operator(;) + operator(}) + comment(/* compiled code translation needed for ruby */) + reserved(if) operator((()pre_type(unsigned) pre_type(char)operator(\))ident(translate)operator([)ident(c)operator(]) operator(!=) operator(()pre_type(unsigned) pre_type(char)operator(\))ident(translate)operator([*)ident(p)operator(++]\)) + reserved(goto) ident(fail)operator(;) + operator(}) + reserved(while) operator((--)ident(mcnt)operator(\);) + operator(}) + reserved(else) operator({) + reserved(do) operator({) + ident(PREFETCH)operator(;) + reserved(if) operator((*)ident(p) operator(==) hex(0xff)operator(\)) operator({)ident(p)operator(++;) ident(mcnt)operator(--;}) + reserved(if) operator((*)ident(d)operator(++) operator(!=) operator(*)ident(p)operator(++\)) reserved(goto) ident(fail)operator(;) + operator(}) + reserved(while) operator((--)ident(mcnt)operator(\);) + operator(}) + ident(SET_REGS_MATCHED)operator(;) + reserved(break)operator(;) + operator(}) +preprocessor(#ifdef) ident(RUBY) + ident(CHECK_INTS)operator(;) +preprocessor(#endif) + reserved(continue)operator(;) comment(/* Successfully executed one pattern command; keep going. */) + + comment(/* Jump here if any matching operation fails. */) + label(fail)operator(:) + reserved(if) operator(()ident(stackp) operator(!=) ident(stackb)operator(\)) operator({) + comment(/* A restart point is known. Restart there and pop it. */) + pre_type(short) ident(last_used_reg)operator(,) ident(this_reg)operator(;) + + comment(/* If this failure point is from a dummy_failure_point, just + skip it. */) + reserved(if) operator(()ident(stackp)operator([-)integer(4)operator(]) operator(==) integer(0) operator(||) operator(()ident(best_regs_set) operator(&&) ident(stackp)operator([-)integer(1)operator(]) operator(==) ident(NON_GREEDY)operator(\)\)) operator({) + ident(POP_FAILURE_POINT)operator((\);) + reserved(goto) ident(fail)operator(;) + operator(}) + ident(stackp)operator(--;) comment(/* discard greedy flag */) + ident(options) operator(=) operator(()pre_type(long)operator(\)*--)ident(stackp)operator(;) + ident(d) operator(=) operator(*--)ident(stackp)operator(;) + ident(p) operator(=) operator(*--)ident(stackp)operator(;) + comment(/* Restore register info. */) + ident(last_used_reg) operator(=) operator(()pre_type(long)operator(\)*--)ident(stackp)operator(;) + + comment(/* Make the ones that weren't saved -1 or 0 again. */) + reserved(for) operator(()ident(this_reg) operator(=) ident(num_regs) operator(-) integer(1)operator(;) ident(this_reg) operator(>) ident(last_used_reg)operator(;) ident(this_reg)operator(--\)) operator({) + ident(regend)operator([)ident(this_reg)operator(]) operator(=) ident(REG_UNSET_VALUE)operator(;) + ident(regstart)operator([)ident(this_reg)operator(]) operator(=) ident(REG_UNSET_VALUE)operator(;) + ident(IS_ACTIVE)operator(()ident(reg_info)operator([)ident(this_reg)operator(]\)) operator(=) integer(0)operator(;) + ident(MATCHED_SOMETHING)operator(()ident(reg_info)operator([)ident(this_reg)operator(]\)) operator(=) integer(0)operator(;) + operator(}) + + comment(/* And restore the rest from the stack. */) + reserved(for) operator(() operator(;) ident(this_reg) operator(>) integer(0)operator(;) ident(this_reg)operator(--\)) operator({) + ident(reg_info)operator([)ident(this_reg)operator(])operator(.)ident(word) operator(=) operator(*--)ident(stackp)operator(;) + ident(regend)operator([)ident(this_reg)operator(]) operator(=) operator(*--)ident(stackp)operator(;) + ident(regstart)operator([)ident(this_reg)operator(]) operator(=) operator(*--)ident(stackp)operator(;) + operator(}) + ident(mcnt) operator(=) operator(()pre_type(long)operator(\)*--)ident(stackp)operator(;) + reserved(while) operator(()ident(mcnt)operator(--\)) operator({) + ident(POP_FAILURE_COUNT)operator((\);) + operator(}) + reserved(if) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + pre_type(int) ident(is_a_jump_n) operator(=) integer(0)operator(;) + pre_type(int) ident(failed_paren) operator(=) integer(0)operator(;) + + ident(p1) operator(=) ident(p)operator(;) + comment(/* If failed to a backwards jump that's part of a repetition + loop, need to pop this failure point and use the next one. */) + reserved(switch) operator((()reserved(enum) ident(regexpcode)operator(\)*)ident(p1)operator(\)) operator({) + reserved(case) label(jump_n)operator(:) + reserved(case) label(finalize_push_n)operator(:) + ident(is_a_jump_n) operator(=) integer(1)operator(;) + reserved(case) label(maybe_finalize_jump)operator(:) + reserved(case) label(finalize_jump)operator(:) + reserved(case) label(finalize_push)operator(:) + reserved(case) label(jump)operator(:) + ident(p1)operator(++;) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p1)operator(\);) + + reserved(if) operator(()ident(mcnt) operator(>=) integer(0)operator(\)) reserved(break)operator(;) comment(/* should be backward jump */) + ident(p1) operator(+=) ident(mcnt)operator(;) + + reserved(if) operator((() ident(is_a_jump_n) operator(&&) operator(()reserved(enum) ident(regexpcode)operator(\)*)ident(p1) operator(==) ident(succeed_n)operator(\)) operator(||) + operator((!)ident(is_a_jump_n) operator(&&) operator(()reserved(enum) ident(regexpcode)operator(\)*)ident(p1) operator(==) ident(on_failure_jump)operator(\)\)) operator({) + reserved(if) operator(()ident(failed_paren)operator(\)) operator({) + ident(p1)operator(++;) + ident(EXTRACT_NUMBER_AND_INCR)operator(()ident(mcnt)operator(,) ident(p1)operator(\);) + ident(PUSH_FAILURE_POINT)operator(()ident(p1) operator(+) ident(mcnt)operator(,) ident(d)operator(\);) + operator(}) + reserved(goto) ident(fail)operator(;) + operator(}) + reserved(break)operator(;) + reserved(default)operator(:) + comment(/* do nothing */)operator(;) + operator(}) + operator(}) + operator(}) + reserved(else) + reserved(break)operator(;) comment(/* Matching at this starting point really fails. */) + operator(}) + + reserved(if) operator(()ident(best_regs_set)operator(\)) + reserved(goto) ident(restore_best_regs)operator(;) + + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,(-)integer(1)operator(\)\);) comment(/* Failure to match. */) + label(memory_exhausted)operator(:) + ident(FREE_AND_RETURN)operator(()ident(stackb)operator(,(-)integer(2)operator(\)\);) +operator(}) + + +directive(static) pre_type(int) +ident(memcmp_translate)operator(()ident(s1)operator(,) ident(s2)operator(,) ident(len)operator(\)) + pre_type(unsigned) pre_type(char) operator(*)ident(s1)operator(,) operator(*)ident(s2)operator(;) + directive(register) pre_type(int) ident(len)operator(;) +operator({) + directive(register) pre_type(unsigned) pre_type(char) operator(*)ident(p1) operator(=) ident(s1)operator(,) operator(*)ident(p2) operator(=) ident(s2)operator(,) ident(c)operator(;) + reserved(while) operator(()ident(len)operator(\)) operator({) + ident(c) operator(=) operator(*)ident(p1)operator(++;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)\)) operator({) + pre_type(int) ident(n)operator(;) + + reserved(if) operator(()ident(c) operator(!=) operator(*)ident(p2)operator(++\)) reserved(return) integer(1)operator(;) + reserved(for) operator(()ident(n) operator(=) ident(mbclen)operator(()ident(c)operator(\)) operator(-) integer(1)operator(;) ident(n) operator(>) integer(0)operator(;) ident(n)operator(--\)) + reserved(if) operator((!--)ident(len) operator(||) operator(*)ident(p1)operator(++) operator(!=) operator(*)ident(p2)operator(++\)) + reserved(return) integer(1)operator(;) + operator(}) + reserved(else) + reserved(if) operator(()ident(translate)operator([)ident(c)operator(]) operator(!=) ident(translate)operator([*)ident(p2)operator(++]\)) + reserved(return) integer(1)operator(;) + ident(len)operator(--;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(void) +ident(re_copy_registers)operator(()ident(regs1)operator(,) ident(regs2)operator(\)) + reserved(struct) ident(re_registers) operator(*)ident(regs1)operator(,) operator(*)ident(regs2)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(regs1) operator(==) ident(regs2)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(regs1)operator(->)ident(allocated) operator(==) integer(0)operator(\)) operator({) + ident(regs1)operator(->)ident(beg) operator(=) ident(TMALLOC)operator(()ident(regs2)operator(->)ident(num_regs)operator(,) pre_type(int)operator(\);) + ident(regs1)operator(->)ident(end) operator(=) ident(TMALLOC)operator(()ident(regs2)operator(->)ident(num_regs)operator(,) pre_type(int)operator(\);) + ident(regs1)operator(->)ident(allocated) operator(=) ident(regs2)operator(->)ident(num_regs)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(regs1)operator(->)ident(allocated) operator(<) ident(regs2)operator(->)ident(num_regs)operator(\)) operator({) + ident(TREALLOC)operator(()ident(regs1)operator(->)ident(beg)operator(,) ident(regs2)operator(->)ident(num_regs)operator(,) pre_type(int)operator(\);) + ident(TREALLOC)operator(()ident(regs1)operator(->)ident(end)operator(,) ident(regs2)operator(->)ident(num_regs)operator(,) pre_type(int)operator(\);) + ident(regs1)operator(->)ident(allocated) operator(=) ident(regs2)operator(->)ident(num_regs)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(regs2)operator(->)ident(num_regs)operator(;) ident(i)operator(++\)) operator({) + ident(regs1)operator(->)ident(beg)operator([)ident(i)operator(]) operator(=) ident(regs2)operator(->)ident(beg)operator([)ident(i)operator(];) + ident(regs1)operator(->)ident(end)operator([)ident(i)operator(]) operator(=) ident(regs2)operator(->)ident(end)operator([)ident(i)operator(];) + operator(}) + ident(regs1)operator(->)ident(num_regs) operator(=) ident(regs2)operator(->)ident(num_regs)operator(;) +operator(}) + +directive(void) +ident(re_free_registers)operator(()ident(regs)operator(\)) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) +operator({) + reserved(if) operator(()ident(regs)operator(->)ident(allocated) operator(==) integer(0)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(regs)operator(->)ident(beg)operator(\)) ident(xfree)operator(()ident(regs)operator(->)ident(beg)operator(\);) + reserved(if) operator(()ident(regs)operator(->)ident(end)operator(\)) ident(xfree)operator(()ident(regs)operator(->)ident(end)operator(\);) +operator(}) + +comment(/* Functions for multi-byte support. + Created for grep multi-byte extension Jul., 1993 by t^2 (Takahiro Tanimoto\) + Last change: Jul. 9, 1993 by t^2 */) +directive(static) directive(const) pre_type(unsigned) pre_type(char) ident(mbctab_ascii)operator([]) operator(=) operator({) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) +operator(};) + +directive(static) directive(const) pre_type(unsigned) pre_type(char) ident(mbctab_euc)operator([]) operator(=) operator({) comment(/* 0xA1-0xFE */) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(1)operator(,) integer(2)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(0)operator(,) +operator(};) + +directive(static) directive(const) pre_type(unsigned) pre_type(char) ident(mbctab_sjis)operator([]) operator(=) operator({) comment(/* 0x81-0x9F,0xE0-0xFC */) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0) +operator(};) + +directive(static) directive(const) pre_type(unsigned) pre_type(char) ident(mbctab_sjis_trail)operator([]) operator(=) operator({) comment(/* 0x40-0x7E,0x80-0xFC */) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(0)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0) +operator(};) + +directive(static) directive(const) pre_type(unsigned) pre_type(char) ident(mbctab_utf8)operator([]) operator(=) operator({) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) integer(1)operator(,) + integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) integer(2)operator(,) + integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(3)operator(,) integer(4)operator(,) integer(4)operator(,) integer(4)operator(,) integer(4)operator(,) integer(5)operator(,) integer(5)operator(,) integer(0)operator(,) integer(0)operator(,) +operator(};) + +directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(re_mbctab) operator(=) ident(mbctab_ascii)operator(;) + +directive(void) +ident(re_mbcinit)operator(()ident(mbctype)operator(\)) + pre_type(int) ident(mbctype)operator(;) +operator({) + reserved(switch) operator(()ident(mbctype)operator(\)) operator({) + reserved(case) label(MBCTYPE_ASCII)operator(:) + ident(re_mbctab) operator(=) ident(mbctab_ascii)operator(;) + ident(current_mbctype) operator(=) ident(MBCTYPE_ASCII)operator(;) + reserved(break)operator(;) + reserved(case) label(MBCTYPE_EUC)operator(:) + ident(re_mbctab) operator(=) ident(mbctab_euc)operator(;) + ident(current_mbctype) operator(=) ident(MBCTYPE_EUC)operator(;) + reserved(break)operator(;) + reserved(case) label(MBCTYPE_SJIS)operator(:) + ident(re_mbctab) operator(=) ident(mbctab_sjis)operator(;) + ident(current_mbctype) operator(=) ident(MBCTYPE_SJIS)operator(;) + reserved(break)operator(;) + reserved(case) label(MBCTYPE_UTF8)operator(:) + ident(re_mbctab) operator(=) ident(mbctab_utf8)operator(;) + ident(current_mbctype) operator(=) ident(MBCTYPE_UTF8)operator(;) + reserved(break)operator(;) + operator(}) +operator(}) + +preprocessor(#define) ident(mbc_isfirst)operator(()ident(t)operator(,) ident(c)operator(\)) operator(()ident(t)operator(\)[()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)]) +preprocessor(#define) ident(mbc_len)operator(()ident(t)operator(,) ident(c)operator(\)) operator((()ident(t)operator(\)[()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)]+)integer(1)operator(\)) + +directive(static) pre_type(unsigned) pre_type(int) +ident(asc_startpos)operator(()ident(string)operator(,) ident(pos)operator(\)) + directive(const) pre_type(char) operator(*)ident(string)operator(;) + pre_type(unsigned) pre_type(int) ident(pos)operator(;) +operator({) + reserved(return) ident(pos)operator(;) +operator(}) + +preprocessor(#define) ident(euc_islead)operator(()ident(c)operator(\)) operator((()pre_type(unsigned) pre_type(char)operator(\)(()ident(c)operator(\)) operator(-) hex(0xa1)operator(\)) operator(>) hex(0xfe) operator(-) hex(0xa1)operator(\)) +preprocessor(#define) ident(euc_mbclen)operator(()ident(c)operator(\)) ident(mbc_len)operator(()ident(mbctab_euc)operator(,) operator(()ident(c)operator(\)\)) +directive(static) pre_type(unsigned) pre_type(int) +ident(euc_startpos)operator(()ident(string)operator(,) ident(pos)operator(\)) + directive(const) pre_type(char) operator(*)ident(string)operator(;) + pre_type(unsigned) pre_type(int) ident(pos)operator(;) +operator({) + pre_type(unsigned) pre_type(int) ident(i) operator(=) ident(pos)operator(,) ident(w)operator(;) + + reserved(while) operator(()ident(i) operator(>) integer(0) operator(&&) operator(!)ident(euc_islead)operator(()ident(string)operator([)ident(i)operator(]\)\)) operator({) + operator(--)ident(i)operator(;) + operator(}) + reserved(if) operator(()ident(i) operator(==) ident(pos) operator(||) ident(i) operator(+) operator(()ident(w) operator(=) ident(euc_mbclen)operator(()ident(string)operator([)ident(i)operator(]\)\)) operator(>) ident(pos)operator(\)) operator({) + reserved(return) ident(i)operator(;) + operator(}) + ident(i) operator(+=) ident(w)operator(;) + reserved(return) ident(i) operator(+) operator((()ident(pos) operator(-) ident(i)operator(\)) operator(&) operator(~)integer(1)operator(\);) +operator(}) + +preprocessor(#define) ident(sjis_isfirst)operator(()ident(c)operator(\)) ident(mbc_isfirst)operator(()ident(mbctab_sjis)operator(,) operator(()ident(c)operator(\)\)) +preprocessor(#define) ident(sjis_istrail)operator(()ident(c)operator(\)) ident(mbctab_sjis_trail)operator([()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)]) +preprocessor(#define) ident(sjis_mbclen)operator(()ident(c)operator(\)) ident(mbc_len)operator(()ident(mbctab_sjis)operator(,) operator(()ident(c)operator(\)\)) +directive(static) pre_type(unsigned) pre_type(int) +ident(sjis_startpos)operator(()ident(string)operator(,) ident(pos)operator(\)) + directive(const) pre_type(char) operator(*)ident(string)operator(;) + pre_type(unsigned) pre_type(int) ident(pos)operator(;) +operator({) + pre_type(unsigned) pre_type(int) ident(i) operator(=) ident(pos)operator(,) ident(w)operator(;) + + reserved(if) operator(()ident(i) operator(>) integer(0) operator(&&) ident(sjis_istrail)operator(()ident(string)operator([)ident(i)operator(]\)\)) operator({) + reserved(do) operator({) + reserved(if) operator((!)ident(sjis_isfirst)operator(()ident(string)operator([--)ident(i)operator(]\)\)) operator({) + operator(++)ident(i)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) reserved(while) operator(()ident(i) operator(>) integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(i) operator(==) ident(pos) operator(||) ident(i) operator(+) operator(()ident(w) operator(=) ident(sjis_mbclen)operator(()ident(string)operator([)ident(i)operator(]\)\)) operator(>) ident(pos)operator(\)) operator({) + reserved(return) ident(i)operator(;) + operator(}) + ident(i) operator(+=) ident(w)operator(;) + reserved(return) ident(i) operator(+) operator((()ident(pos) operator(-) ident(i)operator(\)) operator(&) operator(~)integer(1)operator(\);) +operator(}) + +preprocessor(#define) ident(utf8_islead)operator(()ident(c)operator(\)) operator((()pre_type(unsigned) pre_type(char)operator(\)(()ident(c)operator(\)) operator(&) hex(0xc0)operator(\)) operator(!=) hex(0x80)operator(\)) +preprocessor(#define) ident(utf8_mbclen)operator(()ident(c)operator(\)) ident(mbc_len)operator(()ident(mbctab_utf8)operator(,) operator(()ident(c)operator(\)\)) +directive(static) pre_type(unsigned) pre_type(int) +ident(utf8_startpos)operator(()ident(string)operator(,) ident(pos)operator(\)) + directive(const) pre_type(char) operator(*)ident(string)operator(;) + pre_type(unsigned) pre_type(int) ident(pos)operator(;) +operator({) + pre_type(unsigned) pre_type(int) ident(i) operator(=) ident(pos)operator(,) ident(w)operator(;) + + reserved(while) operator(()ident(i) operator(>) integer(0) operator(&&) operator(!)ident(utf8_islead)operator(()ident(string)operator([)ident(i)operator(]\)\)) operator({) + operator(--)ident(i)operator(;) + operator(}) + reserved(if) operator(()ident(i) operator(==) ident(pos) operator(||) ident(i) operator(+) operator(()ident(w) operator(=) ident(utf8_mbclen)operator(()ident(string)operator([)ident(i)operator(]\)\)) operator(>) ident(pos)operator(\)) operator({) + reserved(return) ident(i)operator(;) + operator(}) + reserved(return) ident(i) operator(+) ident(w)operator(;) +operator(}) + +comment(/* + vi: sw=2 ts=8 + Local variables: + mode : C + c-file-style : "gnu" + tab-width : 8 + End +*/) +comment(/********************************************************************** + + ruby.c - + + $Author: shyouhei $ + $Date: 2008-07-10 11:36:08 +0200 (Thu, 10 Jul 2008\) $ + created at: Tue Aug 10 12:47:31 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#if) ident(defined) ident(_WIN32) operator(||) ident(defined) ident(__CYGWIN__) +preprocessor(#include) include(<windows.h>) +preprocessor(#endif) +preprocessor(#if) ident(defined) ident(__CYGWIN__) +preprocessor(#include) include(<sys/cygwin.h>) +preprocessor(#endif) +preprocessor(#ifdef) ident(_WIN32_WCE) +preprocessor(#include) include(<winsock.h>) +preprocessor(#include) include("wince.h") +preprocessor(#endif) +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("dln.h") +preprocessor(#include) include("node.h") +preprocessor(#include) include(<stdio.h>) +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<ctype.h>) + +preprocessor(#ifdef) ident(__hpux) +preprocessor(#include) include(<sys/pstat.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_STRING_H) +pre_type(char) operator(*)ident(strchr) ident(_)operator((()directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(\)\);) +pre_type(char) operator(*)ident(strrchr) ident(_)operator((()directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(\)\);) +pre_type(char) operator(*)ident(strstr) ident(_)operator((()directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(*\)\);) +preprocessor(#endif) + +preprocessor(#include) include("util.h") + +preprocessor(#ifndef) ident(HAVE_STDLIB_H) +pre_type(char) operator(*)ident(getenv)operator((\);) +preprocessor(#endif) + +ident(VALUE) ident(ruby_debug) operator(=) ident(Qfalse)operator(;) +ident(VALUE) ident(ruby_verbose) operator(=) ident(Qfalse)operator(;) +directive(static) pre_type(int) ident(sflag) operator(=) integer(0)operator(;) +directive(static) pre_type(int) ident(xflag) operator(=) integer(0)operator(;) +directive(extern) pre_type(int) ident(ruby_yydebug)operator(;) + +pre_type(char) operator(*)ident(ruby_inplace_mode) operator(=) ident(Qfalse)operator(;) + +directive(static) directive(void) ident(load_stdin) ident(_)operator((()directive(void)operator(\)\);) +directive(static) directive(void) ident(load_file) ident(_)operator((()directive(const) pre_type(char) operator(*,) pre_type(int)operator(\)\);) +directive(static) directive(void) ident(forbid_setid) ident(_)operator((()directive(const) pre_type(char) operator(*\)\);) + +directive(static) ident(VALUE) ident(do_loop) operator(=) ident(Qfalse)operator(,) ident(do_print) operator(=) ident(Qfalse)operator(;) +directive(static) ident(VALUE) ident(do_check) operator(=) ident(Qfalse)operator(,) ident(do_line) operator(=) ident(Qfalse)operator(;) +directive(static) ident(VALUE) ident(do_split) operator(=) ident(Qfalse)operator(;) + +directive(static) pre_type(char) operator(*)ident(script)operator(;) + +directive(static) pre_type(int) ident(origargc)operator(;) +directive(static) pre_type(char) operator(**)ident(origargv)operator(;) + +directive(static) directive(void) +ident(usage)operator(()ident(name)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + comment(/* This message really ought to be max 23 lines. + * Removed -h because the user already knows that option. Others? */) + + directive(static) pre_type(char) operator(*)ident(usage_msg)operator([]) operator(=) operator({) +string<delimiter(")content(-0[octal] specify record separator ()char(\\\\)content(0, if no argument\))delimiter(")>operator(,) +string<delimiter(")content(-a autosplit mode with -n or -p (splits $_ into $F\))delimiter(")>operator(,) +string<delimiter(")content(-c check syntax only)delimiter(")>operator(,) +string<delimiter(")content(-Cdirectory cd to directory, before executing your script)delimiter(")>operator(,) +string<delimiter(")content(-d set debugging flags (set $DEBUG to true\))delimiter(")>operator(,) +string<delimiter(")content(-e 'command' one line of script. Several -e's allowed. Omit [programfile])delimiter(")>operator(,) +string<delimiter(")content(-Fpattern split(\) pattern for autosplit (-a\))delimiter(")>operator(,) +string<delimiter(")content(-i[extension] edit ARGV files in place (make backup if extension supplied\))delimiter(")>operator(,) +string<delimiter(")content(-Idirectory specify $LOAD_PATH directory (may be used more than once\))delimiter(")>operator(,) +string<delimiter(")content(-Kkcode specifies KANJI (Japanese\) code-set)delimiter(")>operator(,) +string<delimiter(")content(-l enable line ending processing)delimiter(")>operator(,) +string<delimiter(")content(-n assume 'while gets(\); ... end' loop around your script)delimiter(")>operator(,) +string<delimiter(")content(-p assume loop like -n but print line also like sed)delimiter(")>operator(,) +string<delimiter(")content(-rlibrary require the library, before executing your script)delimiter(")>operator(,) +string<delimiter(")content(-s enable some switch parsing for switches after script name)delimiter(")>operator(,) +string<delimiter(")content(-S look for the script using PATH environment variable)delimiter(")>operator(,) +string<delimiter(")content(-T[level] turn on tainting checks)delimiter(")>operator(,) +string<delimiter(")content(-v print version number, then turn on verbose mode)delimiter(")>operator(,) +string<delimiter(")content(-w turn warnings on for your script)delimiter(")>operator(,) +string<delimiter(")content(-W[level] set warning level; 0=silence, 1=medium, 2=verbose (default\))delimiter(")>operator(,) +string<delimiter(")content(-x[directory] strip off text before #!ruby line and perhaps cd to directory)delimiter(")>operator(,) +string<delimiter(")content(--copyright print the copyright)delimiter(")>operator(,) +string<delimiter(")content(--version print the version)delimiter(")>operator(,) +pre_constant(NULL) +operator(};) + pre_type(char) operator(**)ident(p) operator(=) ident(usage_msg)operator(;) + + ident(printf)operator(()string<delimiter(")content(Usage: %s [switches] [--] [programfile] [arguments])char(\\n)delimiter(")>operator(,) ident(name)operator(\);) + reserved(while) operator((*)ident(p)operator(\)) + ident(printf)operator(()string<delimiter(")content( %s)char(\\n)delimiter(")>operator(,) operator(*)ident(p)operator(++\);) +operator(}) + +directive(extern) ident(VALUE) ident(rb_load_path)operator(;) + +preprocessor(#ifndef) ident(CharNext) comment(/* defined as CharNext[AW] on Windows. */) +preprocessor(#define) ident(CharNext)operator(()ident(p)operator(\)) operator((()ident(p)operator(\)) operator(+) ident(mblen)operator(()ident(p)operator(,) ident(RUBY_MBCHAR_MAXSIZE)operator(\)\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__CYGWIN__) +directive(static) directive(inline) directive(void) +ident(translate_char)operator(()pre_type(char) operator(*)ident(p)operator(,) pre_type(int) ident(from)operator(,) pre_type(int) ident(to)operator(\)) +operator({) + reserved(while) operator((*)ident(p)operator(\)) operator({) + reserved(if) operator((()pre_type(unsigned) pre_type(char)operator(\)*)ident(p) operator(==) ident(from)operator(\)) + operator(*)ident(p) operator(=) ident(to)operator(;) + ident(p) operator(=) ident(CharNext)operator(()ident(p)operator(\);) + operator(}) +operator(}) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(_WIN32) operator(||) ident(defined) ident(__CYGWIN__) operator(||) ident(defined) ident(__DJGPP__) +directive(static) ident(VALUE) +ident(rubylib_mangled_path)operator(()directive(const) pre_type(char) operator(*)ident(s)operator(,) pre_type(unsigned) pre_type(int) ident(l)operator(\)) +operator({) + directive(static) pre_type(char) operator(*)ident(newp)operator(,) operator(*)ident(oldp)operator(;) + directive(static) pre_type(int) ident(newl)operator(,) ident(oldl)operator(,) ident(notfound)operator(;) + pre_type(char) operator(*)ident(ptr)operator(;) + ident(VALUE) ident(ret)operator(;) + + reserved(if) operator((!)ident(newp) operator(&&) operator(!)ident(notfound)operator(\)) operator({) + ident(newp) operator(=) ident(getenv)operator(()string<delimiter(")content(RUBYLIB_PREFIX)delimiter(")>operator(\);) + reserved(if) operator(()ident(newp)operator(\)) operator({) + ident(oldp) operator(=) ident(newp) operator(=) ident(strdup)operator(()ident(newp)operator(\);) + reserved(while) operator((*)ident(newp) operator(&&) operator(!)ident(ISSPACE)operator((*)ident(newp)operator(\)) operator(&&) operator(*)ident(newp) operator(!=) char(';')operator(\)) operator({) + ident(newp) operator(=) ident(CharNext)operator(()ident(newp)operator(\);) comment(/* Skip digits. */) + operator(}) + ident(oldl) operator(=) ident(newp) operator(-) ident(oldp)operator(;) + reserved(while) operator((*)ident(newp) operator(&&) operator(()ident(ISSPACE)operator((*)ident(newp)operator(\)) operator(||) operator(*)ident(newp) operator(==) char(';')operator(\)\)) operator({) + ident(newp) operator(=) ident(CharNext)operator(()ident(newp)operator(\);) comment(/* Skip whitespace. */) + operator(}) + ident(newl) operator(=) ident(strlen)operator(()ident(newp)operator(\);) + reserved(if) operator(()ident(newl) operator(==) integer(0) operator(||) ident(oldl) operator(==) integer(0)operator(\)) operator({) + ident(rb_fatal)operator(()string<delimiter(")content(malformed RUBYLIB_PREFIX)delimiter(")>operator(\);) + operator(}) + ident(translate_char)operator(()ident(newp)operator(,) char('\\\\')operator(,) char('/')operator(\);) + operator(}) + reserved(else) operator({) + ident(notfound) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(if) operator((!)ident(newp) operator(||) ident(l) operator(<) ident(oldl) operator(||) ident(strncasecmp)operator(()ident(oldp)operator(,) ident(s)operator(,) ident(oldl)operator(\)) operator(!=) integer(0)operator(\)) operator({) + reserved(return) ident(rb_str_new)operator(()ident(s)operator(,) ident(l)operator(\);) + operator(}) + ident(ret) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(l) operator(+) ident(newl) operator(-) ident(oldl)operator(\);) + ident(ptr) operator(=) ident(RSTRING_PTR)operator(()ident(ret)operator(\);) + ident(memcpy)operator(()ident(ptr)operator(,) ident(newp)operator(,) ident(newl)operator(\);) + ident(memcpy)operator(()ident(ptr) operator(+) ident(newl)operator(,) ident(s) operator(+) ident(oldl)operator(,) ident(l) operator(-) ident(oldl)operator(\);) + ident(ptr)operator([)ident(l) operator(+) ident(newl) operator(-) ident(oldl)operator(]) operator(=) integer(0)operator(;) + reserved(return) ident(ret)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rubylib_mangled_path2)operator(()directive(const) pre_type(char) operator(*)ident(s)operator(\)) +operator({) + reserved(return) ident(rubylib_mangled_path)operator(()ident(s)operator(,) ident(strlen)operator(()ident(s)operator(\)\);) +operator(}) +preprocessor(#else) +preprocessor(#define) ident(rubylib_mangled_path) ident(rb_str_new) +preprocessor(#define) ident(rubylib_mangled_path2) ident(rb_str_new2) +preprocessor(#endif) + +directive(static) directive(void) ident(push_include) ident(_)operator((()directive(const) pre_type(char) operator(*)ident(path)operator(\)\);) + +directive(static) directive(void) +ident(push_include)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) + directive(const) pre_type(char) ident(sep) operator(=) ident(PATH_SEP_CHAR)operator(;) + directive(const) pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(s)operator(;) + + ident(p) operator(=) ident(path)operator(;) + reserved(while) operator((*)ident(p)operator(\)) operator({) + reserved(while) operator((*)ident(p) operator(==) ident(sep)operator(\)) + ident(p)operator(++;) + reserved(if) operator((!*)ident(p)operator(\)) reserved(break)operator(;) + reserved(for) operator(()ident(s) operator(=) ident(p)operator(;) operator(*)ident(s) operator(&&) operator(*)ident(s) operator(!=) ident(sep)operator(;) ident(s) operator(=) ident(CharNext)operator(()ident(s)operator(\)\);) + ident(rb_ary_push)operator(()ident(rb_load_path)operator(,) ident(rubylib_mangled_path)operator(()ident(p)operator(,) ident(s) operator(-) ident(p)operator(\)\);) + ident(p) operator(=) ident(s)operator(;) + operator(}) +operator(}) + +preprocessor(#ifdef) ident(__CYGWIN__) +directive(static) directive(void) +ident(push_include_cygwin)operator(()directive(const) pre_type(char) operator(*)ident(path)operator(\)) +operator({) + directive(const) pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(s)operator(;) + pre_type(char) ident(rubylib)operator([)ident(FILENAME_MAX)operator(];) + ident(VALUE) ident(buf) operator(=) integer(0)operator(;) + + ident(p) operator(=) ident(path)operator(;) + reserved(while) operator((*)ident(p)operator(\)) operator({) + pre_type(unsigned) pre_type(int) ident(len)operator(;) + reserved(while) operator((*)ident(p) operator(==) char(';')operator(\)) + ident(p)operator(++;) + reserved(if) operator((!*)ident(p)operator(\)) reserved(break)operator(;) + reserved(for) operator(()ident(s) operator(=) ident(p)operator(;) operator(*)ident(s) operator(&&) operator(*)ident(s) operator(!=) char(';')operator(;) ident(s) operator(=) ident(CharNext)operator(()ident(s)operator(\)\);) + ident(len) operator(=) ident(s) operator(-) ident(p)operator(;) + reserved(if) operator((*)ident(s)operator(\)) operator({) + reserved(if) operator((!)ident(buf)operator(\)) operator({) + ident(buf) operator(=) ident(rb_str_new)operator(()ident(p)operator(,) ident(len)operator(\);) + ident(p) operator(=) ident(RSTRING_PTR)operator(()ident(buf)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_resize)operator(()ident(buf)operator(,) ident(len)operator(\);) + ident(p) operator(=) ident(strncpy)operator(()ident(RSTRING_PTR)operator(()ident(buf)operator(\),) ident(p)operator(,) ident(len)operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(cygwin_conv_to_posix_path)operator(()ident(p)operator(,) ident(rubylib)operator(\)) operator(==) integer(0)operator(\)) + ident(p) operator(=) ident(rubylib)operator(;) + ident(push_include)operator(()ident(p)operator(\);) + reserved(if) operator((!*)ident(s)operator(\)) reserved(break)operator(;) + ident(p) operator(=) ident(s) operator(+) integer(1)operator(;) + operator(}) +operator(}) + +preprocessor(#define) ident(push_include) ident(push_include_cygwin) +preprocessor(#endif) + +directive(void) +ident(ruby_incpush)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) + reserved(if) operator(()ident(path) operator(==) integer(0)operator(\)) + reserved(return)operator(;) + ident(push_include)operator(()ident(path)operator(\);) +operator(}) + +preprocessor(#if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__CYGWIN__) +preprocessor(#define) ident(LOAD_RELATIVE) integer(1) +preprocessor(#endif) + +directive(void) +ident(ruby_init_loadpath)operator((\)) +operator({) +preprocessor(#if) ident(defined) ident(LOAD_RELATIVE) + pre_type(char) ident(libpath)operator([)ident(FILENAME_MAX)operator(+)integer(1)operator(];) + pre_type(char) operator(*)ident(p)operator(;) + pre_type(int) ident(rest)operator(;) +preprocessor(#if) ident(defined) ident(_WIN32) operator(||) ident(defined) ident(__CYGWIN__) + ident(HMODULE) ident(libruby) operator(=) pre_constant(NULL)operator(;) + ident(MEMORY_BASIC_INFORMATION) ident(m)operator(;) + +preprocessor(#ifndef) ident(_WIN32_WCE) + ident(memset)operator((&)ident(m)operator(,) integer(0)operator(,) reserved(sizeof)operator(()ident(m)operator(\)\);) + reserved(if) operator(()ident(VirtualQuery)operator(()ident(ruby_init_loadpath)operator(,) operator(&)ident(m)operator(,) reserved(sizeof)operator(()ident(m)operator(\)\)) operator(&&) ident(m)operator(.)ident(State) operator(==) ident(MEM_COMMIT)operator(\)) + ident(libruby) operator(=) operator(()ident(HMODULE)operator(\))ident(m)operator(.)ident(AllocationBase)operator(;) +preprocessor(#endif) + ident(GetModuleFileName)operator(()ident(libruby)operator(,) ident(libpath)operator(,) reserved(sizeof) ident(libpath)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(DJGPP)operator(\)) + directive(extern) pre_type(char) operator(*)ident(__dos_argv0)operator(;) + ident(strncpy)operator(()ident(libpath)operator(,) ident(__dos_argv0)operator(,) ident(FILENAME_MAX)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(__human68k__)operator(\)) + directive(extern) pre_type(char) operator(**)ident(_argv)operator(;) + ident(strncpy)operator(()ident(libpath)operator(,) ident(_argv)operator([)integer(0)operator(],) ident(FILENAME_MAX)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(__EMX__)operator(\)) + ident(_execname)operator(()ident(libpath)operator(,) ident(FILENAME_MAX)operator(\);) +preprocessor(#endif) + + ident(libpath)operator([)ident(FILENAME_MAX)operator(]) operator(=) char('\\0')operator(;) +preprocessor(#if) ident(defined) ident(DOSISH) + ident(translate_char)operator(()ident(libpath)operator(,) char('\\\\')operator(,) char('/')operator(\);) +preprocessor(#elif) ident(defined) ident(__CYGWIN__) + operator({) + pre_type(char) ident(rubylib)operator([)ident(FILENAME_MAX)operator(];) + ident(cygwin_conv_to_posix_path)operator(()ident(libpath)operator(,) ident(rubylib)operator(\);) + ident(strncpy)operator(()ident(libpath)operator(,) ident(rubylib)operator(,) reserved(sizeof)operator(()ident(libpath)operator(\)\);) + operator(}) +preprocessor(#endif) + ident(p) operator(=) ident(strrchr)operator(()ident(libpath)operator(,) char('/')operator(\);) + reserved(if) operator(()ident(p)operator(\)) operator({) + operator(*)ident(p) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(p) operator(-) ident(libpath) operator(>) integer(3) operator(&&) operator(!)ident(strcasecmp)operator(()ident(p) operator(-) integer(4)operator(,) string<delimiter(")content(/bin)delimiter(")>operator(\)\)) operator({) + ident(p) operator(-=) integer(4)operator(;) + operator(*)ident(p) operator(=) integer(0)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(strcpy)operator(()ident(libpath)operator(,) string<delimiter(")content(.)delimiter(")>operator(\);) + ident(p) operator(=) ident(libpath) operator(+) integer(1)operator(;) + operator(}) + + ident(rest) operator(=) ident(FILENAME_MAX) operator(-) operator(()ident(p) operator(-) ident(libpath)operator(\);) + +preprocessor(#define) ident(RUBY_RELATIVE)operator(()ident(path)operator(\)) operator(()ident(strncpy)operator(()ident(p)operator(,) operator(()ident(path)operator(\),) ident(rest)operator(\),) ident(libpath)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(RUBY_RELATIVE)operator(()ident(path)operator(\)) operator(()ident(path)operator(\)) +preprocessor(#endif) +preprocessor(#define) ident(incpush)operator(()ident(path)operator(\)) ident(rb_ary_push)operator(()ident(rb_load_path)operator(,) ident(rubylib_mangled_path2)operator(()ident(path)operator(\)\)) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(==) integer(0)operator(\)) operator({) + ident(ruby_incpush)operator(()ident(getenv)operator(()string<delimiter(")content(RUBYLIB)delimiter(")>operator(\)\);) + operator(}) + +preprocessor(#ifdef) ident(RUBY_SEARCH_PATH) + ident(incpush)operator(()ident(RUBY_RELATIVE)operator(()ident(RUBY_SEARCH_PATH)operator(\)\);) +preprocessor(#endif) + + ident(incpush)operator(()ident(RUBY_RELATIVE)operator(()ident(RUBY_SITE_LIB2)operator(\)\);) +preprocessor(#ifdef) ident(RUBY_SITE_THIN_ARCHLIB) + ident(incpush)operator(()ident(RUBY_RELATIVE)operator(()ident(RUBY_SITE_THIN_ARCHLIB)operator(\)\);) +preprocessor(#endif) + ident(incpush)operator(()ident(RUBY_RELATIVE)operator(()ident(RUBY_SITE_ARCHLIB)operator(\)\);) + ident(incpush)operator(()ident(RUBY_RELATIVE)operator(()ident(RUBY_SITE_LIB)operator(\)\);) + + ident(incpush)operator(()ident(RUBY_RELATIVE)operator(()ident(RUBY_LIB)operator(\)\);) +preprocessor(#ifdef) ident(RUBY_THIN_ARCHLIB) + ident(incpush)operator(()ident(RUBY_RELATIVE)operator(()ident(RUBY_THIN_ARCHLIB)operator(\)\);) +preprocessor(#endif) + ident(incpush)operator(()ident(RUBY_RELATIVE)operator(()ident(RUBY_ARCHLIB)operator(\)\);) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(==) integer(0)operator(\)) operator({) + ident(incpush)operator(()string<delimiter(")content(.)delimiter(")>operator(\);) + operator(}) +operator(}) + +reserved(struct) ident(req_list) operator({) + pre_type(char) operator(*)ident(name)operator(;) + reserved(struct) ident(req_list) operator(*)ident(next)operator(;) +operator(};) +directive(static) reserved(struct) ident(req_list) ident(req_list_head)operator(,) operator(*)ident(req_list_last) operator(=) operator(&)ident(req_list_head)operator(;) + +directive(static) directive(void) +ident(add_modules)operator(()ident(mod)operator(\)) + directive(const) pre_type(char) operator(*)ident(mod)operator(;) +operator({) + reserved(struct) ident(req_list) operator(*)ident(list)operator(;) + + ident(list) operator(=) ident(ALLOC)operator(()reserved(struct) ident(req_list)operator(\);) + ident(list)operator(->)ident(name) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,) ident(strlen)operator(()ident(mod)operator(\)+)integer(1)operator(\);) + ident(strcpy)operator(()ident(list)operator(->)ident(name)operator(,) ident(mod)operator(\);) + ident(list)operator(->)ident(next) operator(=) integer(0)operator(;) + ident(req_list_last)operator(->)ident(next) operator(=) ident(list)operator(;) + ident(req_list_last) operator(=) ident(list)operator(;) +operator(}) + +directive(extern) directive(void) ident(Init_ext) ident(_)operator((()directive(void)operator(\)\);) + +directive(static) directive(void) +ident(require_libraries)operator((\)) +operator({) + directive(extern) ident(NODE) operator(*)ident(ruby_eval_tree)operator(;) + directive(extern) ident(NODE) operator(*)ident(ruby_eval_tree_begin)operator(;) + ident(NODE) operator(*)ident(save)operator([)integer(3)operator(];) + reserved(struct) ident(req_list) operator(*)ident(list) operator(=) ident(req_list_head)operator(.)ident(next)operator(;) + reserved(struct) ident(req_list) operator(*)ident(tmp)operator(;) + + ident(save)operator([)integer(0)operator(]) operator(=) ident(ruby_eval_tree)operator(;) + ident(save)operator([)integer(1)operator(]) operator(=) ident(ruby_eval_tree_begin)operator(;) + ident(save)operator([)integer(2)operator(]) operator(=) ident(NEW_NEWLINE)operator(()integer(0)operator(\);) + ident(ruby_eval_tree) operator(=) ident(ruby_eval_tree_begin) operator(=) integer(0)operator(;) + ident(ruby_current_node) operator(=) integer(0)operator(;) + ident(Init_ext)operator((\);) comment(/* should be called here for some reason :-( */) + ident(ruby_current_node) operator(=) ident(save)operator([)integer(2)operator(];) + ident(ruby_set_current_source)operator((\);) + ident(req_list_last) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(list)operator(\)) operator({) + pre_type(int) ident(state)operator(;) + + ident(ruby_current_node) operator(=) integer(0)operator(;) + ident(rb_protect)operator((()ident(VALUE) operator((*\)()ident(VALUE)operator(\)\))ident(rb_require)operator(,) operator(()ident(VALUE)operator(\))ident(list)operator(->)ident(name)operator(,) operator(&)ident(state)operator(\);) + reserved(if) operator(()ident(state)operator(\)) ident(rb_jump_tag)operator(()ident(state)operator(\);) + ident(tmp) operator(=) ident(list)operator(->)ident(next)operator(;) + ident(free)operator(()ident(list)operator(->)ident(name)operator(\);) + ident(free)operator(()ident(list)operator(\);) + ident(list) operator(=) ident(tmp)operator(;) + ident(ruby_current_node) operator(=) ident(save)operator([)integer(2)operator(];) + ident(ruby_set_current_source)operator((\);) + operator(}) + ident(req_list_head)operator(.)ident(next) operator(=) integer(0)operator(;) + ident(ruby_eval_tree) operator(=) ident(save)operator([)integer(0)operator(];) + ident(ruby_eval_tree_begin) operator(=) ident(save)operator([)integer(1)operator(];) + ident(rb_gc_force_recycle)operator((()ident(VALUE)operator(\))ident(save)operator([)integer(2)operator(]\);) + ident(ruby_current_node) operator(=) integer(0)operator(;) +operator(}) + +directive(static) directive(void) +ident(process_sflag)operator((\)) +operator({) + reserved(if) operator(()ident(sflag)operator(\)) operator({) + pre_type(long) ident(n)operator(;) + ident(VALUE) operator(*)ident(args)operator(;) + + ident(n) operator(=) ident(RARRAY)operator(()ident(rb_argv)operator(\)->)ident(len)operator(;) + ident(args) operator(=) ident(RARRAY)operator(()ident(rb_argv)operator(\)->)ident(ptr)operator(;) + reserved(while) operator(()ident(n) operator(>) integer(0)operator(\)) operator({) + ident(VALUE) ident(v) operator(=) operator(*)ident(args)operator(++;) + pre_type(char) operator(*)ident(s) operator(=) ident(StringValuePtr)operator(()ident(v)operator(\);) + pre_type(char) operator(*)ident(p)operator(;) + pre_type(int) ident(hyphen) operator(=) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(s)operator([)integer(0)operator(]) operator(!=) char('-')operator(\)) reserved(break)operator(;) + ident(n)operator(--;) + reserved(if) operator(()ident(s)operator([)integer(1)operator(]) operator(==) char('-') operator(&&) ident(s)operator([)integer(2)operator(]) operator(==) char('\\0')operator(\)) reserved(break)operator(;) + + ident(v) operator(=) ident(Qtrue)operator(;) + comment(/* check if valid name before replacing - with _ */) + reserved(for) operator(()ident(p) operator(=) ident(s) operator(+) integer(1)operator(;) operator(*)ident(p)operator(;) ident(p)operator(++\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('=')operator(\)) operator({) + operator(*)ident(p)operator(++) operator(=) char('\\0')operator(;) + ident(v) operator(=) ident(rb_str_new2)operator(()ident(p)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(if) operator((*)ident(p) operator(==) char('-')operator(\)) operator({) + ident(hyphen) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(else) reserved(if) operator((*)ident(p) operator(!=) char('_') operator(&&) operator(!)ident(ISALNUM)operator((*)ident(p)operator(\)\)) operator({) + ident(VALUE) ident(name_error)operator([)integer(2)operator(];) + ident(name_error)operator([)integer(0)operator(]) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(invalid name for global variable - )delimiter(")>operator(\);) + reserved(if) operator((!()ident(p) operator(=) ident(strchr)operator(()ident(p)operator(,) char('=')operator(\)\)\)) operator({) + ident(rb_str_cat2)operator(()ident(name_error)operator([)integer(0)operator(],) ident(s)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_cat)operator(()ident(name_error)operator([)integer(0)operator(],) ident(s)operator(,) ident(p) operator(-) ident(s)operator(\);) + operator(}) + ident(name_error)operator([)integer(1)operator(]) operator(=) ident(args)operator([-)integer(1)operator(];) + ident(rb_exc_raise)operator(()ident(rb_class_new_instance)operator(()integer(2)operator(,) ident(name_error)operator(,) ident(rb_eNameError)operator(\)\);) + operator(}) + operator(}) + ident(s)operator([)integer(0)operator(]) operator(=) char('$')operator(;) + reserved(if) operator(()ident(hyphen)operator(\)) operator({) + reserved(for) operator(()ident(p) operator(=) ident(s) operator(+) integer(1)operator(;) operator(*)ident(p)operator(;) operator(++)ident(p)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) char('-')operator(\)) operator(*)ident(p) operator(=) char('_')operator(;) + operator(}) + operator(}) + ident(rb_gv_set)operator(()ident(s)operator(,) ident(v)operator(\);) + operator(}) + ident(n) operator(=) ident(RARRAY)operator(()ident(rb_argv)operator(\)->)ident(len) operator(-) ident(n)operator(;) + reserved(while) operator(()ident(n)operator(--\)) operator({) + ident(rb_ary_shift)operator(()ident(rb_argv)operator(\);) + operator(}) + operator(}) + ident(sflag) operator(=) integer(0)operator(;) +operator(}) + +directive(static) directive(void) ident(proc_options) ident(_)operator((()pre_type(int) ident(argc)operator(,) pre_type(char) operator(**)ident(argv)operator(\)\);) + +directive(static) pre_type(char)operator(*) +ident(moreswitches)operator(()ident(s)operator(\)) + pre_type(char) operator(*)ident(s)operator(;) +operator({) + pre_type(int) ident(argc)operator(;) pre_type(char) operator(*)ident(argv)operator([)integer(3)operator(];) + pre_type(char) operator(*)ident(p) operator(=) ident(s)operator(;) + + ident(argc) operator(=) integer(2)operator(;) ident(argv)operator([)integer(0)operator(]) operator(=) ident(argv)operator([)integer(2)operator(]) operator(=) integer(0)operator(;) + reserved(while) operator((*)ident(s) operator(&&) operator(!)ident(ISSPACE)operator((*)ident(s)operator(\)\)) + ident(s)operator(++;) + ident(argv)operator([)integer(1)operator(]) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(s)operator(-)ident(p)operator(+)integer(2)operator(\);) + ident(argv)operator([)integer(1)operator(][)integer(0)operator(]) operator(=) char('-')operator(;) + ident(strncpy)operator(()ident(argv)operator([)integer(1)operator(]+)integer(1)operator(,) ident(p)operator(,) ident(s)operator(-)ident(p)operator(\);) + ident(argv)operator([)integer(1)operator(][)ident(s)operator(-)ident(p)operator(+)integer(1)operator(]) operator(=) char('\\0')operator(;) + ident(proc_options)operator(()ident(argc)operator(,) ident(argv)operator(\);) + reserved(while) operator((*)ident(s) operator(&&) ident(ISSPACE)operator((*)ident(s)operator(\)\)) + ident(s)operator(++;) + reserved(return) ident(s)operator(;) +operator(}) + +directive(static) directive(void) +ident(proc_options)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + pre_type(char) operator(**)ident(argv)operator(;) +operator({) + pre_type(char) operator(*)ident(argv0) operator(=) ident(argv)operator([)integer(0)operator(];) + pre_type(int) ident(do_search)operator(;) + pre_type(char) operator(*)ident(s)operator(;) + ident(NODE) operator(*)directive(volatile) ident(script_node) operator(=) integer(0)operator(;) + + pre_type(int) ident(version) operator(=) integer(0)operator(;) + pre_type(int) ident(copyright) operator(=) integer(0)operator(;) + pre_type(int) ident(verbose) operator(=) integer(0)operator(;) + ident(VALUE) ident(e_script) operator(=) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) reserved(return)operator(;) + + ident(do_search) operator(=) ident(Qfalse)operator(;) + + reserved(for) operator(()ident(argc)operator(--,)ident(argv)operator(++;) ident(argc) operator(>) integer(0)operator(;) ident(argc)operator(--,)ident(argv)operator(++\)) operator({) + reserved(if) operator(()ident(argv)operator([)integer(0)operator(][)integer(0)operator(]) operator(!=) char('-') operator(||) operator(!)ident(argv)operator([)integer(0)operator(][)integer(1)operator(]\)) reserved(break)operator(;) + + ident(s) operator(=) ident(argv)operator([)integer(0)operator(]+)integer(1)operator(;) + label(reswitch)operator(:) + reserved(switch) operator((*)ident(s)operator(\)) operator({) + reserved(case) char('a')operator(:) + ident(do_split) operator(=) ident(Qtrue)operator(;) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('p')operator(:) + ident(do_print) operator(=) ident(Qtrue)operator(;) + comment(/* through */) + reserved(case) char('n')operator(:) + ident(do_loop) operator(=) ident(Qtrue)operator(;) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('d')operator(:) + ident(ruby_debug) operator(=) ident(Qtrue)operator(;) + ident(ruby_verbose) operator(=) ident(Qtrue)operator(;) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('y')operator(:) + ident(ruby_yydebug) operator(=) integer(1)operator(;) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('v')operator(:) + reserved(if) operator(()ident(argv0) operator(==) integer(0) operator(||) ident(verbose)operator(\)) operator({) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + operator(}) + ident(ruby_show_version)operator((\);) + ident(verbose) operator(=) integer(1)operator(;) + reserved(case) char('w')operator(:) + ident(ruby_verbose) operator(=) ident(Qtrue)operator(;) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('W')operator(:) + operator({) + pre_type(int) ident(numlen)operator(;) + pre_type(int) ident(v) operator(=) integer(2)operator(;) comment(/* -W as -W2 */) + + reserved(if) operator((*++)ident(s)operator(\)) operator({) + ident(v) operator(=) ident(scan_oct)operator(()ident(s)operator(,) integer(1)operator(,) operator(&)ident(numlen)operator(\);) + reserved(if) operator(()ident(numlen) operator(==) integer(0)operator(\)) ident(v) operator(=) integer(1)operator(;) + ident(s) operator(+=) ident(numlen)operator(;) + operator(}) + reserved(switch) operator(()ident(v)operator(\)) operator({) + reserved(case) integer(0)operator(:) + ident(ruby_verbose) operator(=) ident(Qnil)operator(;) reserved(break)operator(;) + reserved(case) integer(1)operator(:) + ident(ruby_verbose) operator(=) ident(Qfalse)operator(;) reserved(break)operator(;) + reserved(default)operator(:) + ident(ruby_verbose) operator(=) ident(Qtrue)operator(;) reserved(break)operator(;) + operator(}) + operator(}) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('c')operator(:) + ident(do_check) operator(=) ident(Qtrue)operator(;) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('s')operator(:) + ident(forbid_setid)operator(()string<delimiter(")content(-s)delimiter(")>operator(\);) + ident(sflag) operator(=) integer(1)operator(;) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('h')operator(:) + ident(usage)operator(()ident(origargv)operator([)integer(0)operator(]\);) + ident(exit)operator(()integer(0)operator(\);) + + reserved(case) char('l')operator(:) + ident(do_line) operator(=) ident(Qtrue)operator(;) + ident(rb_output_rs) operator(=) ident(rb_rs)operator(;) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('S')operator(:) + ident(forbid_setid)operator(()string<delimiter(")content(-S)delimiter(")>operator(\);) + ident(do_search) operator(=) ident(Qtrue)operator(;) + ident(s)operator(++;) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('e')operator(:) + ident(forbid_setid)operator(()string<delimiter(")content(-e)delimiter(")>operator(\);) + reserved(if) operator((!*++)ident(s)operator(\)) operator({) + ident(s) operator(=) ident(argv)operator([)integer(1)operator(];) + ident(argc)operator(--,)ident(argv)operator(++;) + operator(}) + reserved(if) operator((!)ident(s)operator(\)) operator({) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content(%s: no code specified for -e)char(\\n)delimiter(")>operator(,) ident(origargv)operator([)integer(0)operator(]\);) + ident(exit)operator(()integer(2)operator(\);) + operator(}) + reserved(if) operator((!)ident(e_script)operator(\)) operator({) + ident(e_script) operator(=) ident(rb_str_new)operator(()integer(0)operator(,)integer(0)operator(\);) + reserved(if) operator(()ident(script) operator(==) integer(0)operator(\)) ident(script) operator(=) string<delimiter(")content(-e)delimiter(")>operator(;) + operator(}) + ident(rb_str_cat2)operator(()ident(e_script)operator(,) ident(s)operator(\);) + ident(rb_str_cat2)operator(()ident(e_script)operator(,) string<delimiter(")char(\\n)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) char('r')operator(:) + ident(forbid_setid)operator(()string<delimiter(")content(-r)delimiter(")>operator(\);) + reserved(if) operator((*++)ident(s)operator(\)) operator({) + ident(add_modules)operator(()ident(s)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(argv)operator([)integer(1)operator(]\)) operator({) + ident(add_modules)operator(()ident(argv)operator([)integer(1)operator(]\);) + ident(argc)operator(--,)ident(argv)operator(++;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('i')operator(:) + ident(forbid_setid)operator(()string<delimiter(")content(-i)delimiter(")>operator(\);) + reserved(if) operator(()ident(ruby_inplace_mode)operator(\)) ident(free)operator(()ident(ruby_inplace_mode)operator(\);) + ident(ruby_inplace_mode) operator(=) ident(strdup)operator(()ident(s)operator(+)integer(1)operator(\);) + reserved(break)operator(;) + + reserved(case) char('x')operator(:) + ident(xflag) operator(=) ident(Qtrue)operator(;) + ident(s)operator(++;) + reserved(if) operator((*)ident(s) operator(&&) ident(chdir)operator(()ident(s)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_fatal)operator(()string<delimiter(")content(Can't chdir to %s)delimiter(")>operator(,) ident(s)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('C')operator(:) + reserved(case) char('X')operator(:) + ident(s)operator(++;) + reserved(if) operator((!*)ident(s)operator(\)) operator({) + ident(s) operator(=) ident(argv)operator([)integer(1)operator(];) + ident(argc)operator(--,)ident(argv)operator(++;) + operator(}) + reserved(if) operator((!)ident(s) operator(||) operator(!*)ident(s)operator(\)) operator({) + ident(rb_fatal)operator(()string<delimiter(")content(Can't chdir)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(chdir)operator(()ident(s)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_fatal)operator(()string<delimiter(")content(Can't chdir to %s)delimiter(")>operator(,) ident(s)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('F')operator(:) + reserved(if) operator((*++)ident(s)operator(\)) operator({) + ident(rb_fs) operator(=) ident(rb_reg_new)operator(()ident(s)operator(,) ident(strlen)operator(()ident(s)operator(\),) integer(0)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('K')operator(:) + reserved(if) operator((*++)ident(s)operator(\)) operator({) + ident(rb_set_kcode)operator(()ident(s)operator(\);) + ident(s)operator(++;) + operator(}) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('T')operator(:) + operator({) + pre_type(int) ident(numlen)operator(;) + pre_type(int) ident(v) operator(=) integer(1)operator(;) + + reserved(if) operator((*++)ident(s)operator(\)) operator({) + ident(v) operator(=) ident(scan_oct)operator(()ident(s)operator(,) integer(2)operator(,) operator(&)ident(numlen)operator(\);) + reserved(if) operator(()ident(numlen) operator(==) integer(0)operator(\)) ident(v) operator(=) integer(1)operator(;) + ident(s) operator(+=) ident(numlen)operator(;) + operator(}) + ident(rb_set_safe_level)operator(()ident(v)operator(\);) + operator(}) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('I')operator(:) + ident(forbid_setid)operator(()string<delimiter(")content(-I)delimiter(")>operator(\);) + reserved(if) operator((*++)ident(s)operator(\)) + ident(ruby_incpush)operator(()ident(s)operator(\);) + reserved(else) reserved(if) operator(()ident(argv)operator([)integer(1)operator(]\)) operator({) + ident(ruby_incpush)operator(()ident(argv)operator([)integer(1)operator(]\);) + ident(argc)operator(--,)ident(argv)operator(++;) + operator(}) + reserved(break)operator(;) + + reserved(case) char('0')operator(:) + operator({) + pre_type(int) ident(numlen)operator(;) + pre_type(int) ident(v)operator(;) + pre_type(char) ident(c)operator(;) + + ident(v) operator(=) ident(scan_oct)operator(()ident(s)operator(,) integer(4)operator(,) operator(&)ident(numlen)operator(\);) + ident(s) operator(+=) ident(numlen)operator(;) + reserved(if) operator(()ident(v) operator(>) oct(0377)operator(\)) ident(rb_rs) operator(=) ident(Qnil)operator(;) + reserved(else) reserved(if) operator(()ident(v) operator(==) integer(0) operator(&&) ident(numlen) operator(>=) integer(2)operator(\)) operator({) + ident(rb_rs) operator(=) ident(rb_str_new2)operator(()string<delimiter(")char(\\n)char(\\n)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(c) operator(=) ident(v) operator(&) hex(0xff)operator(;) + ident(rb_rs) operator(=) ident(rb_str_new)operator((&)ident(c)operator(,) integer(1)operator(\);) + operator(}) + operator(}) + reserved(goto) ident(reswitch)operator(;) + + reserved(case) char('-')operator(:) + reserved(if) operator((!)ident(s)operator([)integer(1)operator(]) operator(||) operator(()ident(s)operator([)integer(1)operator(]) operator(==) char('\\r') operator(&&) operator(!)ident(s)operator([)integer(2)operator(]\)\)) operator({) + ident(argc)operator(--,)ident(argv)operator(++;) + reserved(goto) ident(switch_end)operator(;) + operator(}) + ident(s)operator(++;) + reserved(if) operator(()ident(strcmp)operator(()string<delimiter(")content(copyright)delimiter(")>operator(,) ident(s)operator(\)) operator(==) integer(0)operator(\)) + ident(copyright) operator(=) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(strcmp)operator(()string<delimiter(")content(debug)delimiter(")>operator(,) ident(s)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(ruby_debug) operator(=) ident(Qtrue)operator(;) + ident(ruby_verbose) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(strcmp)operator(()string<delimiter(")content(version)delimiter(")>operator(,) ident(s)operator(\)) operator(==) integer(0)operator(\)) + ident(version) operator(=) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(strcmp)operator(()string<delimiter(")content(verbose)delimiter(")>operator(,) ident(s)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(verbose) operator(=) integer(1)operator(;) + ident(ruby_verbose) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(strcmp)operator(()string<delimiter(")content(yydebug)delimiter(")>operator(,) ident(s)operator(\)) operator(==) integer(0)operator(\)) + ident(ruby_yydebug) operator(=) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(strcmp)operator(()string<delimiter(")content(help)delimiter(")>operator(,) ident(s)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(usage)operator(()ident(origargv)operator([)integer(0)operator(]\);) + ident(exit)operator(()integer(0)operator(\);) + operator(}) + reserved(else) operator({) + ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content(%s: invalid option --%s (-h will show valid options\))char(\\n)delimiter(")>operator(,) + ident(origargv)operator([)integer(0)operator(],) ident(s)operator(\);) + ident(exit)operator(()integer(2)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('\\r')operator(:) + reserved(if) operator((!)ident(s)operator([)integer(1)operator(]\)) reserved(break)operator(;) + + reserved(default)operator(:) + operator({) + directive(const) pre_type(char) operator(*)ident(format)operator(;) + reserved(if) operator(()ident(ISPRINT)operator((*)ident(s)operator(\)\)) operator({) + ident(format) operator(=) string<delimiter(")content(%s: invalid option -%c (-h will show valid options\))char(\\n)delimiter(")>operator(;) + operator(}) + reserved(else) operator({) + ident(format) operator(=) string<delimiter(")content(%s: invalid option -)char(\\\\)content(%03o (-h will show valid options\))char(\\n)delimiter(")>operator(;) + operator(}) + ident(fprintf)operator(()ident(stderr)operator(,) ident(format)operator(,) ident(origargv)operator([)integer(0)operator(],) operator(()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)*)ident(s)operator(\);) + operator(}) + ident(exit)operator(()integer(2)operator(\);) + + reserved(case) integer(0)operator(:) + reserved(break)operator(;) + operator(}) + operator(}) + + label(switch_end)operator(:) + reserved(if) operator(()ident(argv0) operator(==) integer(0)operator(\)) reserved(return)operator(;) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(==) integer(0) operator(&&) operator(()ident(s) operator(=) ident(getenv)operator(()string<delimiter(")content(RUBYOPT)delimiter(")>operator(\)\)\)) operator({) + reserved(while) operator(()ident(ISSPACE)operator((*)ident(s)operator(\)\)) ident(s)operator(++;) + reserved(if) operator((*)ident(s) operator(==) char('T') operator(||) operator((*)ident(s) operator(==) char('-') operator(&&) operator(*()ident(s)operator(+)integer(1)operator(\)) operator(==) char('T')operator(\)\)) operator({) + pre_type(int) ident(numlen)operator(;) + pre_type(int) ident(v) operator(=) integer(1)operator(;) + + reserved(if) operator((*)ident(s) operator(!=) char('T')operator(\)) operator(++)ident(s)operator(;) + reserved(if) operator((*++)ident(s)operator(\)) operator({) + ident(v) operator(=) ident(scan_oct)operator(()ident(s)operator(,) integer(2)operator(,) operator(&)ident(numlen)operator(\);) + reserved(if) operator(()ident(numlen) operator(==) integer(0)operator(\)) ident(v) operator(=) integer(1)operator(;) + operator(}) + ident(rb_set_safe_level)operator(()ident(v)operator(\);) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(s) operator(&&) operator(*)ident(s)operator(\)) operator({) + reserved(if) operator((*)ident(s) operator(==) char('-')operator(\)) operator({) + ident(s)operator(++;) + reserved(if) operator(()ident(ISSPACE)operator((*)ident(s)operator(\)\)) operator({) + reserved(do) operator({)ident(s)operator(++;}) reserved(while) operator(()ident(ISSPACE)operator((*)ident(s)operator(\)\);) + reserved(continue)operator(;) + operator(}) + operator(}) + reserved(if) operator((!*)ident(s)operator(\)) reserved(break)operator(;) + reserved(if) operator((!)ident(strchr)operator(()string<delimiter(")content(IdvwWrK)delimiter(")>operator(,) operator(*)ident(s)operator(\)\)) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(illegal switch in RUBYOPT: -%c)delimiter(")>operator(,) operator(*)ident(s)operator(\);) + ident(s) operator(=) ident(moreswitches)operator(()ident(s)operator(\);) + operator(}) + operator(}) + operator(}) + + reserved(if) operator(()ident(version)operator(\)) operator({) + ident(ruby_show_version)operator((\);) + ident(exit)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(copyright)operator(\)) operator({) + ident(ruby_show_copyright)operator((\);) + operator(}) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) operator({) + ident(OBJ_TAINT)operator(()ident(rb_argv)operator(\);) + ident(OBJ_TAINT)operator(()ident(rb_load_path)operator(\);) + operator(}) + + reserved(if) operator((!)ident(e_script)operator(\)) operator({) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) comment(/* no more args */) + reserved(if) operator(()ident(verbose)operator(\)) ident(exit)operator(()integer(0)operator(\);) + ident(script) operator(=) string<delimiter(")content(-)delimiter(")>operator(;) + operator(}) + reserved(else) operator({) + ident(script) operator(=) ident(argv)operator([)integer(0)operator(];) + reserved(if) operator(()ident(script)operator([)integer(0)operator(]) operator(==) char('\\0')operator(\)) operator({) + ident(script) operator(=) string<delimiter(")content(-)delimiter(")>operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(do_search)operator(\)) operator({) + pre_type(char) operator(*)ident(path) operator(=) ident(getenv)operator(()string<delimiter(")content(RUBYPATH)delimiter(")>operator(\);) + + ident(script) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(path)operator(\)) operator({) + ident(script) operator(=) ident(dln_find_file)operator(()ident(argv)operator([)integer(0)operator(],) ident(path)operator(\);) + operator(}) + reserved(if) operator((!)ident(script)operator(\)) operator({) + ident(script) operator(=) ident(dln_find_file)operator(()ident(argv)operator([)integer(0)operator(],) ident(getenv)operator(()ident(PATH_ENV)operator(\)\);) + operator(}) + reserved(if) operator((!)ident(script)operator(\)) ident(script) operator(=) ident(argv)operator([)integer(0)operator(];) + ident(script) operator(=) ident(ruby_sourcefile) operator(=) ident(rb_source_filename)operator(()ident(script)operator(\);) + ident(script_node) operator(=) ident(NEW_NEWLINE)operator(()integer(0)operator(\);) + operator(}) +preprocessor(#if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__CYGWIN__) + ident(translate_char)operator(()ident(script)operator(,) char('\\\\')operator(,) char('/')operator(\);) +preprocessor(#endif) + ident(argc)operator(--;) ident(argv)operator(++;) + operator(}) + operator(}) + + ident(ruby_script)operator(()ident(script)operator(\);) + ident(ruby_set_argv)operator(()ident(argc)operator(,) ident(argv)operator(\);) + ident(process_sflag)operator((\);) + + ident(ruby_init_loadpath)operator((\);) + ident(ruby_sourcefile) operator(=) ident(rb_source_filename)operator(()ident(argv0)operator(\);) + reserved(if) operator(()ident(e_script)operator(\)) operator({) + ident(require_libraries)operator((\);) + ident(rb_compile_string)operator(()ident(script)operator(,) ident(e_script)operator(,) integer(1)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(strlen)operator(()ident(script)operator(\)) operator(==) integer(1) operator(&&) ident(script)operator([)integer(0)operator(]) operator(==) char('-')operator(\)) operator({) + ident(load_stdin)operator((\);) + operator(}) + reserved(else) operator({) + ident(load_file)operator(()ident(script)operator(,) integer(1)operator(\);) + operator(}) + + ident(process_sflag)operator((\);) + ident(xflag) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) operator({) + ident(FL_UNSET)operator(()ident(rb_argv)operator(,) ident(FL_TAINT)operator(\);) + ident(FL_UNSET)operator(()ident(rb_load_path)operator(,) ident(FL_TAINT)operator(\);) + operator(}) +operator(}) + +directive(extern) pre_type(int) ident(ruby__end__seen)operator(;) + +directive(static) directive(void) +ident(load_file)operator(()ident(fname)operator(,) ident(script)operator(\)) + directive(const) pre_type(char) operator(*)ident(fname)operator(;) + pre_type(int) ident(script)operator(;) +operator({) + directive(extern) ident(VALUE) ident(rb_stdin)operator(;) + ident(VALUE) ident(f)operator(;) + pre_type(int) ident(line_start) operator(=) integer(1)operator(;) + + reserved(if) operator((!)ident(fname)operator(\)) ident(rb_load_fail)operator(()ident(fname)operator(\);) + reserved(if) operator(()ident(strcmp)operator(()ident(fname)operator(,) string<delimiter(")content(-)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(f) operator(=) ident(rb_stdin)operator(;) + operator(}) + reserved(else) operator({) + ident(FILE) operator(*)ident(fp) operator(=) ident(fopen)operator(()ident(fname)operator(,) string<delimiter(")content(r)delimiter(")>operator(\);) + + reserved(if) operator(()ident(fp) operator(==) pre_constant(NULL)operator(\)) operator({) + ident(rb_load_fail)operator(()ident(fname)operator(\);) + operator(}) + ident(fclose)operator(()ident(fp)operator(\);) + + ident(f) operator(=) ident(rb_file_open)operator(()ident(fname)operator(,) string<delimiter(")content(r)delimiter(")>operator(\);) +preprocessor(#if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__CYGWIN__) + operator({) + pre_type(char) operator(*)ident(ext) operator(=) ident(strrchr)operator(()ident(fname)operator(,) char('.')operator(\);) + reserved(if) operator(()ident(ext) operator(&&) ident(strcasecmp)operator(()ident(ext)operator(,) string<delimiter(")content(.exe)delimiter(")>operator(\)) operator(==) integer(0)operator(\)) + ident(rb_io_binmode)operator(()ident(f)operator(\);) + operator(}) +preprocessor(#endif) + operator(}) + + reserved(if) operator(()ident(script)operator(\)) operator({) + ident(VALUE) ident(c) operator(=) integer(1)operator(;) comment(/* something not nil */) + ident(VALUE) ident(line)operator(;) + pre_type(char) operator(*)ident(p)operator(;) + + reserved(if) operator(()ident(xflag)operator(\)) operator({) + ident(forbid_setid)operator(()string<delimiter(")content(-x)delimiter(")>operator(\);) + ident(xflag) operator(=) ident(Qfalse)operator(;) + reserved(while) operator((!)ident(NIL_P)operator(()ident(line) operator(=) ident(rb_io_gets)operator(()ident(f)operator(\)\)\)) operator({) + ident(line_start)operator(++;) + reserved(if) operator(()ident(RSTRING)operator(()ident(line)operator(\)->)ident(len) operator(>) integer(2) + operator(&&) ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(==) char('#') + operator(&&) ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator([)integer(1)operator(]) operator(==) char('!')operator(\)) operator({) + reserved(if) operator((()ident(p) operator(=) ident(strstr)operator(()ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator(,) string<delimiter(")content(ruby)delimiter(")>operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + reserved(goto) ident(start_read)operator(;) + operator(}) + operator(}) + operator(}) + ident(rb_raise)operator(()ident(rb_eLoadError)operator(,) string<delimiter(")content(no Ruby script found in input)delimiter(")>operator(\);) + operator(}) + + ident(c) operator(=) ident(rb_io_getc)operator(()ident(f)operator(\);) + reserved(if) operator(()ident(c) operator(==) ident(INT2FIX)operator(()char('#')operator(\)\)) operator({) + ident(line) operator(=) ident(rb_io_gets)operator(()ident(f)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(line)operator(\)\)) reserved(return)operator(;) + ident(line_start)operator(++;) + + reserved(if) operator(()ident(RSTRING)operator(()ident(line)operator(\)->)ident(len) operator(>) integer(2) operator(&&) ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(==) char('!')operator(\)) operator({) + reserved(if) operator((()ident(p) operator(=) ident(strstr)operator(()ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator(,) string<delimiter(")content(ruby)delimiter(")>operator(\)\)) operator(==) integer(0)operator(\)) operator({) + comment(/* not ruby script, kick the program */) + pre_type(char) operator(**)ident(argv)operator(;) + pre_type(char) operator(*)ident(path)operator(;) + pre_type(char) operator(*)ident(pend) operator(=) ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr) operator(+) ident(RSTRING)operator(()ident(line)operator(\)->)ident(len)operator(;) + + ident(p) operator(=) ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr) operator(+) integer(1)operator(;) comment(/* skip `#!' */) + reserved(if) operator(()ident(pend)operator([-)integer(1)operator(]) operator(==) char('\\n')operator(\)) ident(pend)operator(--;) comment(/* chomp line */) + reserved(if) operator(()ident(pend)operator([-)integer(1)operator(]) operator(==) char('\\r')operator(\)) ident(pend)operator(--;) + operator(*)ident(pend) operator(=) char('\\0')operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend) operator(&&) ident(ISSPACE)operator((*)ident(p)operator(\)\)) + ident(p)operator(++;) + ident(path) operator(=) ident(p)operator(;) comment(/* interpreter path */) + reserved(while) operator(()ident(p) operator(<) ident(pend) operator(&&) operator(!)ident(ISSPACE)operator((*)ident(p)operator(\)\)) + ident(p)operator(++;) + operator(*)ident(p)operator(++) operator(=) char('\\0')operator(;) + reserved(if) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(argv) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(*,) ident(origargc)operator(+)integer(3)operator(\);) + ident(argv)operator([)integer(1)operator(]) operator(=) ident(p)operator(;) + ident(MEMCPY)operator(()ident(argv)operator(+)integer(2)operator(,) ident(origargv)operator(+)integer(1)operator(,) pre_type(char)operator(*,) ident(origargc)operator(\);) + operator(}) + reserved(else) operator({) + ident(argv) operator(=) ident(origargv)operator(;) + operator(}) + ident(argv)operator([)integer(0)operator(]) operator(=) ident(path)operator(;) + ident(execv)operator(()ident(path)operator(,) ident(argv)operator(\);) + + ident(ruby_sourcefile) operator(=) ident(rb_source_filename)operator(()ident(fname)operator(\);) + ident(ruby_sourceline) operator(=) integer(1)operator(;) + ident(rb_fatal)operator(()string<delimiter(")content(Can't exec %s)delimiter(")>operator(,) ident(path)operator(\);) + operator(}) + + label(start_read)operator(:) + ident(p) operator(+=) integer(4)operator(;) + ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(line)operator(\)->)ident(len)operator(-)integer(1)operator(]) operator(=) char('\\0')operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(line)operator(\)->)ident(len)operator(-)integer(2)operator(]) operator(==) char('\\r')operator(\)) + ident(RSTRING)operator(()ident(line)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(line)operator(\)->)ident(len)operator(-)integer(2)operator(]) operator(=) char('\\0')operator(;) + reserved(if) operator((()ident(p) operator(=) ident(strstr)operator(()ident(p)operator(,) string<delimiter(")content( -)delimiter(")>operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + ident(p)operator(++;) comment(/* skip space before `-' */) + reserved(while) operator((*)ident(p) operator(==) char('-')operator(\)) operator({) + ident(p) operator(=) ident(moreswitches)operator(()ident(p)operator(+)integer(1)operator(\);) + operator(}) + operator(}) + operator(}) + operator(}) + reserved(else) reserved(if) operator((!)ident(NIL_P)operator(()ident(c)operator(\)\)) operator({) + ident(rb_io_ungetc)operator(()ident(f)operator(,) ident(c)operator(\);) + operator(}) + ident(require_libraries)operator((\);) comment(/* Why here? unnatural */) + reserved(if) operator(()ident(NIL_P)operator(()ident(c)operator(\)\)) reserved(return)operator(;) + operator(}) + ident(rb_compile_file)operator(()ident(fname)operator(,) ident(f)operator(,) ident(line_start)operator(\);) + reserved(if) operator(()ident(script) operator(&&) ident(ruby__end__seen)operator(\)) operator({) + ident(rb_define_global_const)operator(()string<delimiter(")content(DATA)delimiter(")>operator(,) ident(f)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(f) operator(!=) ident(rb_stdin)operator(\)) operator({) + ident(rb_io_close)operator(()ident(f)operator(\);) + operator(}) + + reserved(if) operator(()ident(ruby_parser_stack_on_heap)operator((\)\)) operator({) + ident(rb_gc)operator((\);) + operator(}) +operator(}) + +directive(void) +ident(rb_load_file)operator(()ident(fname)operator(\)) + directive(const) pre_type(char) operator(*)ident(fname)operator(;) +operator({) + ident(load_file)operator(()ident(fname)operator(,) integer(0)operator(\);) +operator(}) + +directive(static) directive(void) +ident(load_stdin)operator((\)) +operator({) + ident(forbid_setid)operator(()string<delimiter(")content(program input from stdin)delimiter(")>operator(\);) + ident(load_file)operator(()string<delimiter(")content(-)delimiter(")>operator(,) integer(1)operator(\);) +operator(}) + +ident(VALUE) ident(rb_progname)operator(;) +ident(VALUE) ident(rb_argv)operator(;) +ident(VALUE) ident(rb_argv0)operator(;) + +preprocessor(#if) ident(defined)operator(()ident(PSTAT_SETCMD)operator(\)) operator(||) ident(defined)operator(()ident(HAVE_SETPROCTITLE)operator(\)) +preprocessor(#elif) ident(defined)operator(()ident(_WIN32)operator(\)) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETENV)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_UNSETENV)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(USE_ENVSPACE_FOR_ARG0) +preprocessor(#endif) + +preprocessor(#ifdef) ident(USE_ENVSPACE_FOR_ARG0) +directive(static) reserved(struct) operator({) + pre_type(char) operator(*)ident(begin)operator(,) operator(*)ident(end)operator(;) +operator(}) ident(envspace)operator(;) +directive(extern) pre_type(char) operator(**)ident(environ)operator(;) + +directive(static) directive(void) +ident(set_arg0space)operator((\)) +operator({) + pre_type(char) operator(*)ident(s)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(if) operator((!)ident(environ) operator(||) operator(()ident(s) operator(=) ident(environ)operator([)integer(0)operator(]\)) operator(==) pre_constant(NULL)operator(\)) reserved(return)operator(;) + ident(envspace)operator(.)ident(begin) operator(=) ident(s)operator(;) + ident(s) operator(+=) ident(strlen)operator(()ident(s)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(1)operator(;) ident(environ)operator([)ident(i)operator(];) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(environ)operator([)ident(i)operator(]) operator(==) ident(s) operator(+) integer(1)operator(\)) operator({) + ident(s)operator(++;) + ident(s) operator(+=) ident(strlen)operator(()ident(s)operator(\);) comment(/* this one is ok too */) + operator(}) + operator(}) + ident(envspace)operator(.)ident(end) operator(=) ident(s)operator(;) +operator(}) +preprocessor(#else) +preprocessor(#define) ident(set_arg0space)operator((\)) operator((()directive(void)operator(\))integer(0)operator(\)) +preprocessor(#endif) + +directive(static) pre_type(int) +ident(get_arglen)operator(()pre_type(int) ident(argc)operator(,) pre_type(char) operator(**)ident(argv)operator(\)) +operator({) + pre_type(char) operator(*)ident(s) operator(=) ident(argv)operator([)integer(0)operator(];) + pre_type(int) ident(i)operator(;) + + reserved(if) operator((!)ident(argc)operator(\)) reserved(return) integer(0)operator(;) + ident(s) operator(+=) ident(strlen)operator(()ident(s)operator(\);) + comment(/* See if all the arguments are contiguous in memory */) + reserved(for) operator(()ident(i) operator(=) integer(1)operator(;) ident(i) operator(<) ident(argc)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(argv)operator([)ident(i)operator(]) operator(==) ident(s) operator(+) integer(1)operator(\)) operator({) + ident(s)operator(++;) + ident(s) operator(+=) ident(strlen)operator(()ident(s)operator(\);) comment(/* this one is ok too */) + operator(}) + reserved(else) operator({) + reserved(break)operator(;) + operator(}) + operator(}) +preprocessor(#if) ident(defined)operator(()ident(USE_ENVSPACE_FOR_ARG0)operator(\)) + reserved(if) operator(()ident(environ) operator(&&) operator(()ident(s) operator(==) ident(environ)operator([)integer(0)operator(]\)\)) operator({) + ident(s) operator(+=) ident(strlen)operator(()ident(s)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(1)operator(;) ident(environ)operator([)ident(i)operator(];) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(environ)operator([)ident(i)operator(]) operator(==) ident(s) operator(+) integer(1)operator(\)) operator({) + ident(s)operator(++;) + ident(s) operator(+=) ident(strlen)operator(()ident(s)operator(\);) comment(/* this one is ok too */) + operator(}) + operator(}) + ident(ruby_setenv)operator(()string<delimiter(")delimiter(")>operator(,) pre_constant(NULL)operator(\);) comment(/* duplicate environ vars */) + operator(}) +preprocessor(#endif) + reserved(return) ident(s) operator(-) ident(argv)operator([)integer(0)operator(];) +operator(}) + +directive(static) directive(void) +ident(set_arg0)operator(()ident(val)operator(,) ident(id)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(progname)operator(;) + pre_type(char) operator(*)ident(s)operator(;) + pre_type(long) ident(i)operator(;) + pre_type(int) ident(j)operator(;) +preprocessor(#if) operator(!)ident(defined)operator(()ident(PSTAT_SETCMD)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(HAVE_SETPROCTITLE)operator(\)) + directive(static) pre_type(int) ident(len) operator(=) integer(0)operator(;) +preprocessor(#endif) + + reserved(if) operator(()ident(origargv) operator(==) integer(0)operator(\)) ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content($0 not initialized)delimiter(")>operator(\);) + ident(StringValue)operator(()ident(val)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(val)operator(\)->)ident(ptr)operator(;) + ident(i) operator(=) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len)operator(;) +preprocessor(#if) ident(defined)operator(()ident(PSTAT_SETCMD)operator(\)) + reserved(if) operator(()ident(i) operator(>=) ident(PST_CLEN)operator(\)) operator({) + reserved(union) ident(pstun) ident(j)operator(;) + ident(j)operator(.)ident(pst_command) operator(=) ident(s)operator(;) + ident(i) operator(=) ident(PST_CLEN)operator(;) + ident(RSTRING)operator(()ident(val)operator(\)->)ident(len) operator(=) ident(i)operator(;) + operator(*()ident(s) operator(+) ident(i)operator(\)) operator(=) char('\\0')operator(;) + ident(pstat)operator(()ident(PSTAT_SETCMD)operator(,) ident(j)operator(,) ident(PST_CLEN)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + reserved(else) operator({) + reserved(union) ident(pstun) ident(j)operator(;) + ident(j)operator(.)ident(pst_command) operator(=) ident(s)operator(;) + ident(pstat)operator(()ident(PSTAT_SETCMD)operator(,) ident(j)operator(,) ident(i)operator(,) integer(0)operator(,) integer(0)operator(\);) + operator(}) + ident(progname) operator(=) ident(rb_tainted_str_new)operator(()ident(s)operator(,) ident(i)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_SETPROCTITLE)operator(\)) + ident(setproctitle)operator(()string<delimiter(")content(%.*s)delimiter(")>operator(,) operator(()pre_type(int)operator(\))ident(i)operator(,) ident(s)operator(\);) + ident(progname) operator(=) ident(rb_tainted_str_new)operator(()ident(s)operator(,) ident(i)operator(\);) +preprocessor(#else) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) operator({) + ident(len) operator(=) ident(get_arglen)operator(()ident(origargc)operator(,) ident(origargv)operator(\);) + operator(}) + + reserved(if) operator(()ident(i) operator(>=) ident(len)operator(\)) operator({) + ident(i) operator(=) ident(len)operator(;) + operator(}) + ident(memcpy)operator(()ident(origargv)operator([)integer(0)operator(],) ident(s)operator(,) ident(i)operator(\);) + ident(s) operator(=) ident(origargv)operator([)integer(0)operator(]) operator(+) ident(i)operator(;) + operator(*)ident(s) operator(=) char('\\0')operator(;) + reserved(if) operator((++)ident(i) operator(<) ident(len)operator(\)) ident(memset)operator(()ident(s) operator(+) integer(1)operator(,) char(' ')operator(,) ident(len) operator(-) ident(i)operator(\);) + reserved(for) operator(()ident(i) operator(=) ident(len)operator(-)integer(1)operator(,) ident(j) operator(=) ident(origargc)operator(-)integer(1)operator(;) ident(j) operator(>) integer(0) operator(&&) ident(i) operator(>=) integer(0)operator(;) operator(--)ident(i)operator(,) operator(--)ident(j)operator(\)) operator({) + ident(origargv)operator([)ident(j)operator(]) operator(=) ident(origargv)operator([)integer(0)operator(]) operator(+) ident(i)operator(;) + operator(*)ident(origargv)operator([)ident(j)operator(]) operator(=) char('\\0')operator(;) + operator(}) + ident(progname) operator(=) ident(rb_tainted_str_new2)operator(()ident(origargv)operator([)integer(0)operator(]\);) +preprocessor(#endif) + ident(rb_progname) operator(=) ident(rb_obj_freeze)operator(()ident(progname)operator(\);) +operator(}) + +directive(void) +ident(ruby_script)operator(()ident(name)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + reserved(if) operator(()ident(name)operator(\)) operator({) + ident(rb_progname) operator(=) ident(rb_obj_freeze)operator(()ident(rb_tainted_str_new2)operator(()ident(name)operator(\)\);) + ident(ruby_sourcefile) operator(=) ident(rb_source_filename)operator(()ident(name)operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) ident(uid)operator(,) ident(euid)operator(,) ident(gid)operator(,) ident(egid)operator(;) + +directive(static) directive(void) +ident(init_ids)operator((\)) +operator({) + ident(uid) operator(=) operator(()pre_type(int)operator(\))ident(getuid)operator((\);) + ident(euid) operator(=) operator(()pre_type(int)operator(\))ident(geteuid)operator((\);) + ident(gid) operator(=) operator(()pre_type(int)operator(\))ident(getgid)operator((\);) + ident(egid) operator(=) operator(()pre_type(int)operator(\))ident(getegid)operator((\);) +preprocessor(#ifdef) ident(VMS) + ident(uid) operator(|=) ident(gid) operator(<<) integer(16)operator(;) + ident(euid) operator(|=) ident(egid) operator(<<) integer(16)operator(;) +preprocessor(#endif) + reserved(if) operator(()ident(uid) operator(&&) operator(()ident(euid) operator(!=) ident(uid) operator(||) ident(egid) operator(!=) ident(gid)operator(\)\)) operator({) + ident(rb_set_safe_level)operator(()integer(1)operator(\);) + operator(}) +operator(}) + +directive(static) directive(void) +ident(forbid_setid)operator(()ident(s)operator(\)) + directive(const) pre_type(char) operator(*)ident(s)operator(;) +operator({) + reserved(if) operator(()ident(euid) operator(!=) ident(uid)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(no %s allowed while running setuid)delimiter(")>operator(,) ident(s)operator(\);) + reserved(if) operator(()ident(egid) operator(!=) ident(gid)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(no %s allowed while running setgid)delimiter(")>operator(,) ident(s)operator(\);) + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>) integer(0)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(no %s allowed in tainted mode)delimiter(")>operator(,) ident(s)operator(\);) +operator(}) + +directive(static) directive(void) +ident(verbose_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(variable)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(variable)operator(;) +operator({) + ident(ruby_verbose) operator(=) ident(RTEST)operator(()ident(val)operator(\)) operator(?) ident(Qtrue) operator(:) ident(val)operator(;) +operator(}) + +directive(void) +ident(ruby_prog_init)operator((\)) +operator({) + ident(init_ids)operator((\);) + + ident(ruby_sourcefile) operator(=) ident(rb_source_filename)operator(()string<delimiter(")content(ruby)delimiter(")>operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($VERBOSE)delimiter(")>operator(,) operator(&)ident(ruby_verbose)operator(,) integer(0)operator(,) ident(verbose_setter)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($-v)delimiter(")>operator(,) operator(&)ident(ruby_verbose)operator(,) integer(0)operator(,) ident(verbose_setter)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($-w)delimiter(")>operator(,) operator(&)ident(ruby_verbose)operator(,) integer(0)operator(,) ident(verbose_setter)operator(\);) + ident(rb_define_variable)operator(()string<delimiter(")content($DEBUG)delimiter(")>operator(,) operator(&)ident(ruby_debug)operator(\);) + ident(rb_define_variable)operator(()string<delimiter(")content($-d)delimiter(")>operator(,) operator(&)ident(ruby_debug)operator(\);) + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($-p)delimiter(")>operator(,) operator(&)ident(do_print)operator(\);) + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($-l)delimiter(")>operator(,) operator(&)ident(do_line)operator(\);) + + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($0)delimiter(")>operator(,) operator(&)ident(rb_progname)operator(,) integer(0)operator(,) ident(set_arg0)operator(\);) + ident(rb_define_hooked_variable)operator(()string<delimiter(")content($PROGRAM_NAME)delimiter(")>operator(,) operator(&)ident(rb_progname)operator(,) integer(0)operator(,) ident(set_arg0)operator(\);) + + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($*)delimiter(")>operator(,) operator(&)ident(rb_argv)operator(\);) + ident(rb_argv) operator(=) ident(rb_ary_new)operator((\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(ARGV)delimiter(")>operator(,) ident(rb_argv)operator(\);) + ident(rb_define_readonly_variable)operator(()string<delimiter(")content($-a)delimiter(")>operator(,) operator(&)ident(do_split)operator(\);) + ident(rb_global_variable)operator((&)ident(rb_argv0)operator(\);) + +preprocessor(#ifdef) ident(MSDOS) + comment(/* + * There is no way we can refer to them from ruby, so close them to save + * space. + */) + operator(()directive(void)operator(\))ident(fclose)operator(()ident(stdaux)operator(\);) + operator(()directive(void)operator(\))ident(fclose)operator(()ident(stdprn)operator(\);) +preprocessor(#endif) +operator(}) + +directive(void) +ident(ruby_set_argv)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + pre_type(char) operator(**)ident(argv)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + +preprocessor(#if) ident(defined)operator(()ident(USE_DLN_A_OUT)operator(\)) + reserved(if) operator(()ident(origargv)operator(\)) ident(dln_argv0) operator(=) ident(origargv)operator([)integer(0)operator(];) + reserved(else) ident(dln_argv0) operator(=) ident(argv)operator([)integer(0)operator(];) +preprocessor(#endif) + ident(rb_ary_clear)operator(()ident(rb_argv)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i) operator(<) ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(arg) operator(=) ident(rb_tainted_str_new2)operator(()ident(argv)operator([)ident(i)operator(]\);) + + ident(OBJ_FREEZE)operator(()ident(arg)operator(\);) + ident(rb_ary_push)operator(()ident(rb_argv)operator(,) ident(arg)operator(\);) + operator(}) +operator(}) + +directive(void) +ident(ruby_process_options)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + pre_type(char) operator(**)ident(argv)operator(;) +operator({) + ident(origargc) operator(=) ident(argc)operator(;) ident(origargv) operator(=) ident(argv)operator(;) + + ident(ruby_script)operator(()ident(argv)operator([)integer(0)operator(]\);) comment(/* for the time being */) + ident(rb_argv0) operator(=) ident(rb_progname)operator(;) +preprocessor(#if) ident(defined)operator(()ident(USE_DLN_A_OUT)operator(\)) + ident(dln_argv0) operator(=) ident(argv)operator([)integer(0)operator(];) +preprocessor(#endif) + ident(set_arg0space)operator((\);) + ident(proc_options)operator(()ident(argc)operator(,) ident(argv)operator(\);) + + reserved(if) operator(()ident(do_check) operator(&&) ident(ruby_nerrs) operator(==) integer(0)operator(\)) operator({) + ident(printf)operator(()string<delimiter(")content(Syntax OK)char(\\n)delimiter(")>operator(\);) + ident(exit)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(do_print)operator(\)) operator({) + ident(rb_parser_append_print)operator((\);) + operator(}) + reserved(if) operator(()ident(do_loop)operator(\)) operator({) + ident(rb_parser_while_loop)operator(()ident(do_line)operator(,) ident(do_split)operator(\);) + operator(}) +operator(}) +comment(/********************************************************************** + + signal.c - + + $Author: shyouhei $ + $Date: 2008-06-29 09:52:47 +0200 (Sun, 29 Jun 2008\) $ + created at: Tue Dec 20 10:13:44 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("rubysig.h") +preprocessor(#include) include(<signal.h>) +preprocessor(#include) include(<stdio.h>) + +preprocessor(#ifdef) ident(__BEOS__) +preprocessor(#undef) ident(SIGBUS) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(HAVE_SIGPROCMASK) operator(||) ident(defined) ident(HAVE_SIGSETMASK) +preprocessor(#define) ident(USE_TRAP_MASK) integer(1) +preprocessor(#else) +preprocessor(#define) ident(USE_TRAP_MASK) integer(0) +preprocessor(#endif) + +preprocessor(#ifndef) ident(NSIG) +preprocessor(# ifdef) ident(DJGPP) +preprocessor(# define) ident(NSIG) ident(SIGMAX) +preprocessor(# else) +preprocessor(# define) ident(NSIG) operator(()ident(_SIGMAX) operator(+) integer(1)operator(\)) comment(/* For QNX */) +preprocessor(# endif) +preprocessor(#endif) + +directive(static) reserved(struct) ident(signals) operator({) + pre_type(char) operator(*)ident(signm)operator(;) + pre_type(int) ident(signo)operator(;) +operator(}) ident(siglist) operator([]) operator(=) operator({) + operator({)string<delimiter(")content(EXIT)delimiter(")>operator(,) integer(0)operator(},) +preprocessor(#ifdef) ident(SIGHUP) + operator({)string<delimiter(")content(HUP)delimiter(")>operator(,) ident(SIGHUP)operator(},) +preprocessor(#endif) + operator({)string<delimiter(")content(INT)delimiter(")>operator(,) ident(SIGINT)operator(},) +preprocessor(#ifdef) ident(SIGQUIT) + operator({)string<delimiter(")content(QUIT)delimiter(")>operator(,) ident(SIGQUIT)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGILL) + operator({)string<delimiter(")content(ILL)delimiter(")>operator(,) ident(SIGILL)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGTRAP) + operator({)string<delimiter(")content(TRAP)delimiter(")>operator(,) ident(SIGTRAP)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGIOT) + operator({)string<delimiter(")content(IOT)delimiter(")>operator(,) ident(SIGIOT)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGABRT) + operator({)string<delimiter(")content(ABRT)delimiter(")>operator(,) ident(SIGABRT)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGEMT) + operator({)string<delimiter(")content(EMT)delimiter(")>operator(,) ident(SIGEMT)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGFPE) + operator({)string<delimiter(")content(FPE)delimiter(")>operator(,) ident(SIGFPE)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGKILL) + operator({)string<delimiter(")content(KILL)delimiter(")>operator(,) ident(SIGKILL)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGBUS) + operator({)string<delimiter(")content(BUS)delimiter(")>operator(,) ident(SIGBUS)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGSEGV) + operator({)string<delimiter(")content(SEGV)delimiter(")>operator(,) ident(SIGSEGV)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGSYS) + operator({)string<delimiter(")content(SYS)delimiter(")>operator(,) ident(SIGSYS)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGPIPE) + operator({)string<delimiter(")content(PIPE)delimiter(")>operator(,) ident(SIGPIPE)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGALRM) + operator({)string<delimiter(")content(ALRM)delimiter(")>operator(,) ident(SIGALRM)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGTERM) + operator({)string<delimiter(")content(TERM)delimiter(")>operator(,) ident(SIGTERM)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGURG) + operator({)string<delimiter(")content(URG)delimiter(")>operator(,) ident(SIGURG)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGSTOP) + operator({)string<delimiter(")content(STOP)delimiter(")>operator(,) ident(SIGSTOP)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGTSTP) + operator({)string<delimiter(")content(TSTP)delimiter(")>operator(,) ident(SIGTSTP)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGCONT) + operator({)string<delimiter(")content(CONT)delimiter(")>operator(,) ident(SIGCONT)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGCHLD) + operator({)string<delimiter(")content(CHLD)delimiter(")>operator(,) ident(SIGCHLD)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGCLD) + operator({)string<delimiter(")content(CLD)delimiter(")>operator(,) ident(SIGCLD)operator(},) +preprocessor(#else) +preprocessor(# ifdef) ident(SIGCHLD) + operator({)string<delimiter(")content(CLD)delimiter(")>operator(,) ident(SIGCHLD)operator(},) +preprocessor(# endif) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGTTIN) + operator({)string<delimiter(")content(TTIN)delimiter(")>operator(,) ident(SIGTTIN)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGTTOU) + operator({)string<delimiter(")content(TTOU)delimiter(")>operator(,) ident(SIGTTOU)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGIO) + operator({)string<delimiter(")content(IO)delimiter(")>operator(,) ident(SIGIO)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGXCPU) + operator({)string<delimiter(")content(XCPU)delimiter(")>operator(,) ident(SIGXCPU)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGXFSZ) + operator({)string<delimiter(")content(XFSZ)delimiter(")>operator(,) ident(SIGXFSZ)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGVTALRM) + operator({)string<delimiter(")content(VTALRM)delimiter(")>operator(,) ident(SIGVTALRM)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGPROF) + operator({)string<delimiter(")content(PROF)delimiter(")>operator(,) ident(SIGPROF)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGWINCH) + operator({)string<delimiter(")content(WINCH)delimiter(")>operator(,) ident(SIGWINCH)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGUSR1) + operator({)string<delimiter(")content(USR1)delimiter(")>operator(,) ident(SIGUSR1)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGUSR2) + operator({)string<delimiter(")content(USR2)delimiter(")>operator(,) ident(SIGUSR2)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGLOST) + operator({)string<delimiter(")content(LOST)delimiter(")>operator(,) ident(SIGLOST)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGMSG) + operator({)string<delimiter(")content(MSG)delimiter(")>operator(,) ident(SIGMSG)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGPWR) + operator({)string<delimiter(")content(PWR)delimiter(")>operator(,) ident(SIGPWR)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGPOLL) + operator({)string<delimiter(")content(POLL)delimiter(")>operator(,) ident(SIGPOLL)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGDANGER) + operator({)string<delimiter(")content(DANGER)delimiter(")>operator(,) ident(SIGDANGER)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGMIGRATE) + operator({)string<delimiter(")content(MIGRATE)delimiter(")>operator(,) ident(SIGMIGRATE)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGPRE) + operator({)string<delimiter(")content(PRE)delimiter(")>operator(,) ident(SIGPRE)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGGRANT) + operator({)string<delimiter(")content(GRANT)delimiter(")>operator(,) ident(SIGGRANT)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGRETRACT) + operator({)string<delimiter(")content(RETRACT)delimiter(")>operator(,) ident(SIGRETRACT)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGSOUND) + operator({)string<delimiter(")content(SOUND)delimiter(")>operator(,) ident(SIGSOUND)operator(},) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGINFO) + operator({)string<delimiter(")content(INFO)delimiter(")>operator(,) ident(SIGINFO)operator(},) +preprocessor(#endif) + operator({)pre_constant(NULL)operator(,) integer(0)operator(}) +operator(};) + +directive(static) pre_type(int) +ident(signm2signo)operator(()ident(nm)operator(\)) + directive(const) pre_type(char) operator(*)ident(nm)operator(;) +operator({) + reserved(struct) ident(signals) operator(*)ident(sigs)operator(;) + + reserved(for) operator(()ident(sigs) operator(=) ident(siglist)operator(;) ident(sigs)operator(->)ident(signm)operator(;) ident(sigs)operator(++\)) + reserved(if) operator(()ident(strcmp)operator(()ident(sigs)operator(->)ident(signm)operator(,) ident(nm)operator(\)) operator(==) integer(0)operator(\)) + reserved(return) ident(sigs)operator(->)ident(signo)operator(;) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) pre_type(char)operator(*) +ident(signo2signm)operator(()ident(no)operator(\)) + pre_type(int) ident(no)operator(;) +operator({) + reserved(struct) ident(signals) operator(*)ident(sigs)operator(;) + + reserved(for) operator(()ident(sigs) operator(=) ident(siglist)operator(;) ident(sigs)operator(->)ident(signm)operator(;) ident(sigs)operator(++\)) + reserved(if) operator(()ident(sigs)operator(->)ident(signo) operator(==) ident(no)operator(\)) + reserved(return) ident(sigs)operator(->)ident(signm)operator(;) + reserved(return) integer(0)operator(;) +operator(}) + +directive(const) pre_type(char) operator(*) +ident(ruby_signal_name)operator(()ident(no)operator(\)) + pre_type(int) ident(no)operator(;) +operator({) + reserved(return) ident(signo2signm)operator(()ident(no)operator(\);) +operator(}) + +comment(/* + * call-seq: + * SignalException.new(sig\) => signal_exception + * + * Construct a new SignalException object. +sig+ should be a known + * signal name, or a signal number. + */) + +directive(static) ident(VALUE) +ident(esignal_init)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(self)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(self)operator(;) +operator({) + pre_type(int) ident(argnum) operator(=) integer(1)operator(;) + ident(VALUE) ident(sig) operator(=) ident(Qnil)operator(;) + pre_type(int) ident(signo)operator(;) + directive(const) pre_type(char) operator(*)ident(signm)operator(;) + pre_type(char) ident(tmpnm)operator([()reserved(sizeof)operator(()pre_type(int)operator(\)*)ident(CHAR_BIT)operator(\))operator(/)integer(3)operator(+)integer(4)operator(];) + + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + ident(sig) operator(=) ident(argv)operator([)integer(0)operator(];) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(sig)operator(\)\)) ident(argnum) operator(=) integer(2)operator(;) + operator(}) + reserved(if) operator(()ident(argc) operator(<) integer(1) operator(||) ident(argnum) operator(<) ident(argc)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for %d\))delimiter(")>operator(,) + ident(argc)operator(,) ident(argnum)operator(\);) + operator(}) + reserved(if) operator(()ident(argnum) operator(==) integer(2)operator(\)) operator({) + ident(signo) operator(=) ident(FIX2INT)operator(()ident(sig)operator(\);) + reserved(if) operator(()ident(signo) operator(<) integer(0) operator(||) ident(signo) operator(>) ident(NSIG)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(invalid signal number (%d\))delimiter(")>operator(,) ident(signo)operator(\);) + operator(}) + reserved(if) operator(()ident(argc) operator(>) integer(1)operator(\)) operator({) + ident(sig) operator(=) ident(argv)operator([)integer(1)operator(];) + operator(}) + reserved(else) operator({) + ident(signm) operator(=) ident(signo2signm)operator(()ident(signo)operator(\);) + reserved(if) operator(()ident(signm)operator(\)) operator({) + ident(snprintf)operator(()ident(tmpnm)operator(,) reserved(sizeof)operator(()ident(tmpnm)operator(\),) string<delimiter(")content(SIG%s)delimiter(")>operator(,) ident(signm)operator(\);) + operator(}) + reserved(else) operator({) + ident(snprintf)operator(()ident(tmpnm)operator(,) reserved(sizeof)operator(()ident(tmpnm)operator(\),) string<delimiter(")content(SIG%u)delimiter(")>operator(,) ident(signo)operator(\);) + operator(}) + ident(sig) operator(=) ident(rb_str_new2)operator(()ident(signm) operator(=) ident(tmpnm)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(signm) operator(=) ident(SYMBOL_P)operator(()ident(sig)operator(\)) operator(?) ident(rb_id2name)operator(()ident(SYM2ID)operator(()ident(sig)operator(\)\)) operator(:) ident(StringValuePtr)operator(()ident(sig)operator(\);) + reserved(if) operator(()ident(strncmp)operator(()ident(signm)operator(,) string<delimiter(")content(SIG)delimiter(")>operator(,) integer(3)operator(\)) operator(==) integer(0)operator(\)) ident(signm) operator(+=) integer(3)operator(;) + ident(signo) operator(=) ident(signm2signo)operator(()ident(signm)operator(\);) + reserved(if) operator((!)ident(signo)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(unsupported name `SIG%s')delimiter(")>operator(,) ident(signm)operator(\);) + operator(}) + reserved(if) operator(()ident(SYMBOL_P)operator(()ident(sig)operator(\)\)) operator({) + ident(sig) operator(=) ident(rb_str_new2)operator(()ident(signm)operator(\);) + operator(}) + operator(}) + ident(rb_call_super)operator(()integer(1)operator(,) operator(&)ident(sig)operator(\);) + ident(rb_iv_set)operator(()ident(self)operator(,) string<delimiter(")content(signo)delimiter(")>operator(,) ident(INT2NUM)operator(()ident(signo)operator(\)\);) + + reserved(return) ident(self)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(interrupt_init)operator(()ident(self)operator(,) ident(mesg)operator(\)) + ident(VALUE) ident(self)operator(,) ident(mesg)operator(;) +operator({) + ident(VALUE) ident(argv)operator([)integer(2)operator(];) + + ident(argv)operator([)integer(0)operator(]) operator(=) ident(INT2FIX)operator(()ident(SIGINT)operator(\);) + ident(argv)operator([)integer(1)operator(]) operator(=) ident(mesg)operator(;) + reserved(return) ident(rb_call_super)operator(()integer(2)operator(,) ident(argv)operator(\);) +operator(}) + +directive(void) +ident(ruby_default_signal)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) +preprocessor(#ifndef) ident(MACOS_UNUSE_SIGNAL) + directive(extern) ident(rb_pid_t) ident(getpid) ident(_)operator((()directive(void)operator(\)\);) + + ident(signal)operator(()ident(sig)operator(,) ident(SIG_DFL)operator(\);) + ident(kill)operator(()ident(getpid)operator((\),) ident(sig)operator(\);) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * Process.kill(signal, pid, ...\) => fixnum + * + * Sends the given signal to the specified process id(s\), or to the + * current process if _pid_ is zero. _signal_ may be an + * integer signal number or a POSIX signal name (either with or without + * a +SIG+ prefix\). If _signal_ is negative (or starts + * with a minus sign\), kills process groups instead of + * processes. Not all signals are available on all platforms. + * + * pid = fork do + * Signal.trap("HUP"\) { puts "Ouch!"; exit } + * # ... do some work ... + * end + * # ... + * Process.kill("HUP", pid\) + * Process.wait + * + * <em>produces:</em> + * + * Ouch! + */) + +ident(VALUE) +ident(rb_f_kill)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + pre_type(int) ident(negative) operator(=) integer(0)operator(;) + pre_type(int) ident(sig)operator(;) + pre_type(int) ident(i)operator(;) + pre_type(char) operator(*)ident(s)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(if) operator(()ident(argc) operator(<) integer(2)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments -- kill(sig, pid...\))delimiter(")>operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(sig) operator(=) ident(FIX2INT)operator(()ident(argv)operator([)integer(0)operator(]\);) + reserved(break)operator(;) + + reserved(case) label(T_SYMBOL)operator(:) + ident(s) operator(=) ident(rb_id2name)operator(()ident(SYM2ID)operator(()ident(argv)operator([)integer(0)operator(]\)\);) + reserved(if) operator((!)ident(s)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad signal)delimiter(")>operator(\);) + reserved(goto) ident(str_signal)operator(;) + + reserved(case) label(T_STRING)operator(:) + ident(s) operator(=) ident(RSTRING)operator(()ident(argv)operator([)integer(0)operator(]\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(s)operator([)integer(0)operator(]) operator(==) char('-')operator(\)) operator({) + ident(negative)operator(++;) + ident(s)operator(++;) + operator(}) + label(str_signal)operator(:) + reserved(if) operator(()ident(strncmp)operator(()string<delimiter(")content(SIG)delimiter(")>operator(,) ident(s)operator(,) integer(3)operator(\)) operator(==) integer(0)operator(\)) + ident(s) operator(+=) integer(3)operator(;) + reserved(if)operator((()ident(sig) operator(=) ident(signm2signo)operator(()ident(s)operator(\)\)) operator(==) integer(0)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(unsupported name `SIG%s')delimiter(")>operator(,) ident(s)operator(\);) + + reserved(if) operator(()ident(negative)operator(\)) + ident(sig) operator(=) operator(-)ident(sig)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + operator({) + ident(VALUE) ident(str)operator(;) + + ident(str) operator(=) ident(rb_check_string_type)operator(()ident(argv)operator([)integer(0)operator(]\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)\)) operator({) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(goto) ident(str_signal)operator(;) + operator(}) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad signal type %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(argv)operator([)integer(0)operator(]\)\);) + operator(}) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(sig) operator(<) integer(0)operator(\)) operator({) + ident(sig) operator(=) operator(-)ident(sig)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(1)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + pre_type(int) ident(pid) operator(=) ident(NUM2INT)operator(()ident(argv)operator([)ident(i)operator(]\);) +preprocessor(#ifdef) ident(HAS_KILLPG) + reserved(if) operator(()ident(killpg)operator(()ident(pid)operator(,) ident(sig)operator(\)) operator(<) integer(0)operator(\)) +preprocessor(#else) + reserved(if) operator(()ident(kill)operator((-)ident(pid)operator(,) ident(sig)operator(\)) operator(<) integer(0)operator(\)) +preprocessor(#endif) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + reserved(for) operator(()ident(i)operator(=)integer(1)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(Check_Type)operator(()ident(argv)operator([)ident(i)operator(],) ident(T_FIXNUM)operator(\);) + reserved(if) operator(()ident(kill)operator(()ident(FIX2INT)operator(()ident(argv)operator([)ident(i)operator(]\),) ident(sig)operator(\)) operator(<) integer(0)operator(\)) + ident(rb_sys_fail)operator(()integer(0)operator(\);) + operator(}) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(i)operator(-)integer(1)operator(\);) +operator(}) + +directive(static) reserved(struct) operator({) + ident(VALUE) ident(cmd)operator(;) + pre_type(int) ident(safe)operator(;) +operator(}) ident(trap_list)operator([)ident(NSIG)operator(];) +directive(static) ident(rb_atomic_t) ident(trap_pending_list)operator([)ident(NSIG)operator(];) +directive(static) pre_type(char) ident(rb_trap_accept_nativethreads)operator([)ident(NSIG)operator(];) +ident(rb_atomic_t) ident(rb_trap_pending)operator(;) +ident(rb_atomic_t) ident(rb_trap_immediate)operator(;) +pre_type(int) ident(rb_prohibit_interrupt) operator(=) integer(1)operator(;) + +directive(void) +ident(rb_gc_mark_trap_list)operator((\)) +operator({) +preprocessor(#ifndef) ident(MACOS_UNUSE_SIGNAL) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(NSIG)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(trap_list)operator([)ident(i)operator(])operator(.)ident(cmd)operator(\)) + ident(rb_gc_mark)operator(()ident(trap_list)operator([)ident(i)operator(])operator(.)ident(cmd)operator(\);) + operator(}) +preprocessor(#endif) comment(/* MACOS_UNUSE_SIGNAL */) +operator(}) + +preprocessor(#ifdef) ident(__dietlibc__) +preprocessor(#define) ident(sighandler_t) ident(sh_t) +preprocessor(#endif) + +reserved(typedef) ident(RETSIGTYPE) operator((*)ident(sighandler_t)operator(\))ident(_)operator((()pre_type(int)operator(\)\);) + +preprocessor(#ifdef) ident(POSIX_SIGNAL) +directive(static) ident(sighandler_t) +ident(ruby_signal)operator(()ident(signum)operator(,) ident(handler)operator(\)) + pre_type(int) ident(signum)operator(;) + ident(sighandler_t) ident(handler)operator(;) +operator({) + reserved(struct) ident(sigaction) ident(sigact)operator(,) ident(old)operator(;) + + ident(rb_trap_accept_nativethreads)operator([)ident(signum)operator(]) operator(=) integer(0)operator(;) + + ident(sigact)operator(.)ident(sa_handler) operator(=) ident(handler)operator(;) + ident(sigemptyset)operator((&)ident(sigact)operator(.)ident(sa_mask)operator(\);) + ident(sigact)operator(.)ident(sa_flags) operator(=) integer(0)operator(;) +preprocessor(# ifdef) ident(SA_NOCLDWAIT) + reserved(if) operator(()ident(signum) operator(==) ident(SIGCHLD) operator(&&) ident(handler) operator(==) ident(SIG_IGN)operator(\)) + ident(sigact)operator(.)ident(sa_flags) operator(|=) ident(SA_NOCLDWAIT)operator(;) +preprocessor(# endif) + ident(sigaction)operator(()ident(signum)operator(,) operator(&)ident(sigact)operator(,) operator(&)ident(old)operator(\);) + reserved(return) ident(old)operator(.)ident(sa_handler)operator(;) +operator(}) + +directive(void) +ident(posix_signal)operator(()ident(signum)operator(,) ident(handler)operator(\)) + pre_type(int) ident(signum)operator(;) + ident(sighandler_t) ident(handler)operator(;) +operator({) + ident(ruby_signal)operator(()ident(signum)operator(,) ident(handler)operator(\);) +operator(}) + +preprocessor(# ifdef) ident(HAVE_NATIVETHREAD) +directive(static) ident(sighandler_t) +ident(ruby_nativethread_signal)operator(()ident(signum)operator(,) ident(handler)operator(\)) + pre_type(int) ident(signum)operator(;) + ident(sighandler_t) ident(handler)operator(;) +operator({) + ident(sighandler_t) ident(old)operator(;) + + ident(old) operator(=) ident(ruby_signal)operator(()ident(signum)operator(,) ident(handler)operator(\);) + ident(rb_trap_accept_nativethreads)operator([)ident(signum)operator(]) operator(=) integer(1)operator(;) + reserved(return) ident(old)operator(;) +operator(}) + +directive(void) +ident(posix_nativethread_signal)operator(()ident(signum)operator(,) ident(handler)operator(\)) + pre_type(int) ident(signum)operator(;) + ident(sighandler_t) ident(handler)operator(;) +operator({) + ident(ruby_nativethread_signal)operator(()ident(signum)operator(,) ident(handler)operator(\);) +operator(}) +preprocessor(# endif) + +preprocessor(#else) comment(/* !POSIX_SIGNAL */) +preprocessor(#define) ident(ruby_signal)operator(()ident(sig)operator(,)ident(handler)operator(\)) operator(()ident(rb_trap_accept_nativethreads)operator([)ident(sig)operator(]) operator(=) integer(0)operator(,) ident(signal)operator((()ident(sig)operator(\),()ident(handler)operator(\)\)\)) + +preprocessor(# ifdef) ident(HAVE_NATIVETHREAD) +directive(static) ident(sighandler_t) +ident(ruby_nativethread_signal)operator(()ident(signum)operator(,) ident(handler)operator(\)) + pre_type(int) ident(signum)operator(;) + ident(sighandler_t) ident(handler)operator(;) +operator({) + ident(sighandler_t) ident(old)operator(;) + + ident(old) operator(=) ident(signal)operator(()ident(signum)operator(,) ident(handler)operator(\);) + ident(rb_trap_accept_nativethreads)operator([)ident(signum)operator(]) operator(=) integer(1)operator(;) + reserved(return) ident(old)operator(;) +operator(}) +preprocessor(# endif) +preprocessor(#endif) comment(/* POSIX_SIGNAL */) + +directive(static) directive(void) ident(signal_exec) ident(_)operator((()pre_type(int) ident(sig)operator(\)\);) +directive(static) directive(void) +ident(signal_exec)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) + reserved(if) operator(()ident(trap_list)operator([)ident(sig)operator(])operator(.)ident(cmd) operator(==) integer(0)operator(\)) operator({) + reserved(switch) operator(()ident(sig)operator(\)) operator({) + reserved(case) label(SIGINT)operator(:) + ident(rb_thread_interrupt)operator((\);) + reserved(break)operator(;) +preprocessor(#ifdef) ident(SIGHUP) + reserved(case) label(SIGHUP)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGQUIT) + reserved(case) label(SIGQUIT)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGTERM) + reserved(case) label(SIGTERM)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGALRM) + reserved(case) label(SIGALRM)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGUSR1) + reserved(case) label(SIGUSR1)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGUSR2) + reserved(case) label(SIGUSR2)operator(:) +preprocessor(#endif) + ident(rb_thread_signal_raise)operator(()ident(sig)operator(\);) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(trap_list)operator([)ident(sig)operator(])operator(.)ident(cmd) operator(==) ident(Qundef)operator(\)) operator({) + ident(rb_thread_signal_exit)operator((\);) + operator(}) + reserved(else) operator({) + ident(rb_thread_trap_eval)operator(()ident(trap_list)operator([)ident(sig)operator(])operator(.)ident(cmd)operator(,) ident(sig)operator(,) ident(trap_list)operator([)ident(sig)operator(])operator(.)ident(safe)operator(\);) + operator(}) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_NATIVETHREAD)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_NATIVETHREAD_KILL)operator(\)) +directive(static) directive(void) +ident(sigsend_to_ruby_thread)operator(()pre_type(int) ident(sig)operator(\)) +operator({) +preprocessor(# ifdef) ident(HAVE_SIGPROCMASK) + ident(sigset_t) ident(mask)operator(,) ident(old_mask)operator(;) +preprocessor(# else) + pre_type(int) ident(mask)operator(,) ident(old_mask)operator(;) +preprocessor(# endif) + +preprocessor(# ifdef) ident(HAVE_SIGPROCMASK) + ident(sigfillset)operator((&)ident(mask)operator(\);) + ident(sigprocmask)operator(()ident(SIG_BLOCK)operator(,) operator(&)ident(mask)operator(,) operator(&)ident(old_mask)operator(\);) +preprocessor(# else) + ident(mask) operator(=) ident(sigblock)operator((~)integer(0)operator(\);) + ident(sigsetmask)operator(()ident(mask)operator(\);) +preprocessor(# endif) + + ident(ruby_native_thread_kill)operator(()ident(sig)operator(\);) +operator(}) +preprocessor(#endif) + +directive(static) ident(RETSIGTYPE) ident(sighandler) ident(_)operator((()pre_type(int)operator(\)\);) +directive(static) ident(RETSIGTYPE) +ident(sighandler)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) +preprocessor(#ifdef) ident(_WIN32) +preprocessor(#define) ident(IN_MAIN_CONTEXT)operator(()ident(f)operator(,) ident(a)operator(\)) operator(()ident(rb_w32_main_context)operator(()ident(a)operator(,) ident(f)operator(\)) operator(?) operator(()directive(void)operator(\))integer(0) operator(:) ident(f)operator(()ident(a)operator(\)\)) +preprocessor(#else) +preprocessor(#define) ident(IN_MAIN_CONTEXT)operator(()ident(f)operator(,) ident(a)operator(\)) ident(f)operator(()ident(a)operator(\)) +preprocessor(#endif) + + reserved(if) operator(()ident(sig) operator(>=) ident(NSIG)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(trap_handler: Bad signal %d)delimiter(")>operator(,) ident(sig)operator(\);) + operator(}) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_NATIVETHREAD)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_NATIVETHREAD_KILL)operator(\)) + reserved(if) operator((!)ident(is_ruby_native_thread)operator((\)) operator(&&) operator(!)ident(rb_trap_accept_nativethreads)operator([)ident(sig)operator(]\)) operator({) + ident(sigsend_to_ruby_thread)operator(()ident(sig)operator(\);) + reserved(return)operator(;) + operator(}) +preprocessor(#endif) + +preprocessor(#if) operator(!)ident(defined)operator(()ident(BSD_SIGNAL)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(POSIX_SIGNAL)operator(\)) + reserved(if) operator(()ident(rb_trap_accept_nativethreads)operator([)ident(sig)operator(]\)) operator({) + ident(ruby_nativethread_signal)operator(()ident(sig)operator(,) ident(sighandler)operator(\);) + operator(}) + reserved(else) operator({) + ident(ruby_signal)operator(()ident(sig)operator(,) ident(sighandler)operator(\);) + operator(}) +preprocessor(#endif) + + reserved(if) operator(()ident(trap_list)operator([)ident(sig)operator(])operator(.)ident(cmd) operator(==) integer(0) operator(&&) ident(ATOMIC_TEST)operator(()ident(rb_trap_immediate)operator(\)\)) operator({) + ident(IN_MAIN_CONTEXT)operator(()ident(signal_exec)operator(,) ident(sig)operator(\);) + ident(ATOMIC_SET)operator(()ident(rb_trap_immediate)operator(,) integer(1)operator(\);) + operator(}) + reserved(else) operator({) + ident(ATOMIC_INC)operator(()ident(rb_trap_pending)operator(\);) + ident(ATOMIC_INC)operator(()ident(trap_pending_list)operator([)ident(sig)operator(]\);) +preprocessor(#ifdef) ident(_WIN32) + ident(rb_w32_interrupted)operator((\);) +preprocessor(#endif) + operator(}) +operator(}) + +preprocessor(#ifdef) ident(SIGBUS) +directive(static) ident(RETSIGTYPE) ident(sigbus) ident(_)operator((()pre_type(int)operator(\)\);) +directive(static) ident(RETSIGTYPE) +ident(sigbus)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_NATIVETHREAD)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_NATIVETHREAD_KILL)operator(\)) + reserved(if) operator((!)ident(is_ruby_native_thread)operator((\)) operator(&&) operator(!)ident(rb_trap_accept_nativethreads)operator([)ident(sig)operator(]\)) operator({) + ident(sigsend_to_ruby_thread)operator(()ident(sig)operator(\);) + reserved(return)operator(;) + operator(}) +preprocessor(#endif) + + ident(rb_bug)operator(()string<delimiter(")content(Bus Error)delimiter(")>operator(\);) +operator(}) +preprocessor(#endif) + +preprocessor(#ifdef) ident(SIGSEGV) +directive(static) ident(RETSIGTYPE) ident(sigsegv) ident(_)operator((()pre_type(int)operator(\)\);) +directive(static) ident(RETSIGTYPE) +ident(sigsegv)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_NATIVETHREAD)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_NATIVETHREAD_KILL)operator(\)) + reserved(if) operator((!)ident(is_ruby_native_thread)operator((\)) operator(&&) operator(!)ident(rb_trap_accept_nativethreads)operator([)ident(sig)operator(]\)) operator({) + ident(sigsend_to_ruby_thread)operator(()ident(sig)operator(\);) + reserved(return)operator(;) + operator(}) +preprocessor(#endif) + + ident(rb_bug)operator(()string<delimiter(")content(Segmentation fault)delimiter(")>operator(\);) +operator(}) +preprocessor(#endif) + +preprocessor(#ifdef) ident(SIGPIPE) +directive(static) ident(RETSIGTYPE) ident(sigpipe) ident(_)operator((()pre_type(int)operator(\)\);) +directive(static) ident(RETSIGTYPE) +ident(sigpipe)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) + comment(/* do nothing */) +operator(}) +preprocessor(#endif) + +directive(void) +ident(rb_trap_exit)operator((\)) +operator({) +preprocessor(#ifndef) ident(MACOS_UNUSE_SIGNAL) + reserved(if) operator(()ident(trap_list)operator([)integer(0)operator(])operator(.)ident(cmd)operator(\)) operator({) + ident(VALUE) ident(trap_exit) operator(=) ident(trap_list)operator([)integer(0)operator(])operator(.)ident(cmd)operator(;) + + ident(trap_list)operator([)integer(0)operator(])operator(.)ident(cmd) operator(=) integer(0)operator(;) + ident(rb_eval_cmd)operator(()ident(trap_exit)operator(,) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(INT2FIX)operator(()integer(0)operator(\)\),) ident(trap_list)operator([)integer(0)operator(])operator(.)ident(safe)operator(\);) + operator(}) +preprocessor(#endif) +operator(}) + +directive(void) +ident(rb_trap_exec)operator((\)) +operator({) +preprocessor(#ifndef) ident(MACOS_UNUSE_SIGNAL) + pre_type(int) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(NSIG)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(trap_pending_list)operator([)ident(i)operator(]\)) operator({) + ident(trap_pending_list)operator([)ident(i)operator(]) operator(=) integer(0)operator(;) + ident(signal_exec)operator(()ident(i)operator(\);) + operator(}) + operator(}) +preprocessor(#endif) comment(/* MACOS_UNUSE_SIGNAL */) + ident(rb_trap_pending) operator(=) integer(0)operator(;) +operator(}) + +reserved(struct) ident(trap_arg) operator({) +preprocessor(#if) ident(USE_TRAP_MASK) +preprocessor(# ifdef) ident(HAVE_SIGPROCMASK) + ident(sigset_t) ident(mask)operator(;) +preprocessor(# else) + pre_type(int) ident(mask)operator(;) +preprocessor(# endif) +preprocessor(#endif) + ident(VALUE) ident(sig)operator(,) ident(cmd)operator(;) +operator(};) + +preprocessor(# ifdef) ident(HAVE_SIGPROCMASK) +directive(static) ident(sigset_t) ident(trap_last_mask)operator(;) +preprocessor(# else) +directive(static) pre_type(int) ident(trap_last_mask)operator(;) +preprocessor(# endif) + +directive(static) ident(RETSIGTYPE) ident(sigexit) ident(_)operator((()pre_type(int)operator(\)\);) +directive(static) ident(RETSIGTYPE) +ident(sigexit)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) + ident(rb_thread_signal_exit)operator((\);) +operator(}) + +directive(static) ident(VALUE) +ident(trap)operator(()ident(arg)operator(\)) + reserved(struct) ident(trap_arg) operator(*)ident(arg)operator(;) +operator({) + ident(sighandler_t) ident(func)operator(,) ident(oldfunc)operator(;) + ident(VALUE) ident(command)operator(,) ident(oldcmd)operator(;) + pre_type(int) ident(sig) operator(=) operator(-)integer(1)operator(;) + pre_type(char) operator(*)ident(s)operator(;) + + ident(func) operator(=) ident(sighandler)operator(;) + ident(command) operator(=) ident(arg)operator(->)ident(cmd)operator(;) + reserved(if) operator(()ident(NIL_P)operator(()ident(command)operator(\)\)) operator({) + ident(func) operator(=) ident(SIG_IGN)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(TYPE)operator(()ident(command)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(SafeStringValue)operator(()ident(command)operator(\);) comment(/* taint check */) + reserved(if) operator(()ident(RSTRING)operator(()ident(command)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + ident(func) operator(=) ident(SIG_IGN)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(RSTRING)operator(()ident(command)operator(\)->)ident(len) operator(==) integer(7)operator(\)) operator({) + reserved(if) operator(()ident(strncmp)operator(()ident(RSTRING)operator(()ident(command)operator(\)->)ident(ptr)operator(,) string<delimiter(")content(SIG_IGN)delimiter(")>operator(,) integer(7)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(func) operator(=) ident(SIG_IGN)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(strncmp)operator(()ident(RSTRING)operator(()ident(command)operator(\)->)ident(ptr)operator(,) string<delimiter(")content(SIG_DFL)delimiter(")>operator(,) integer(7)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(func) operator(=) ident(SIG_DFL)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(strncmp)operator(()ident(RSTRING)operator(()ident(command)operator(\)->)ident(ptr)operator(,) string<delimiter(")content(DEFAULT)delimiter(")>operator(,) integer(7)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(func) operator(=) ident(SIG_DFL)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(RSTRING)operator(()ident(command)operator(\)->)ident(len) operator(==) integer(6)operator(\)) operator({) + reserved(if) operator(()ident(strncmp)operator(()ident(RSTRING)operator(()ident(command)operator(\)->)ident(ptr)operator(,) string<delimiter(")content(IGNORE)delimiter(")>operator(,) integer(6)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(func) operator(=) ident(SIG_IGN)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(RSTRING)operator(()ident(command)operator(\)->)ident(len) operator(==) integer(4)operator(\)) operator({) + reserved(if) operator(()ident(strncmp)operator(()ident(RSTRING)operator(()ident(command)operator(\)->)ident(ptr)operator(,) string<delimiter(")content(EXIT)delimiter(")>operator(,) integer(4)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(func) operator(=) ident(sigexit)operator(;) + operator(}) + operator(}) + operator(}) + reserved(if) operator(()ident(func) operator(==) ident(SIG_IGN) operator(||) ident(func) operator(==) ident(SIG_DFL)operator(\)) operator({) + ident(command) operator(=) integer(0)operator(;) + operator(}) + + reserved(switch) operator(()ident(TYPE)operator(()ident(arg)operator(->)ident(sig)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(sig) operator(=) ident(FIX2INT)operator(()ident(arg)operator(->)ident(sig)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_SYMBOL)operator(:) + ident(s) operator(=) ident(rb_id2name)operator(()ident(SYM2ID)operator(()ident(arg)operator(->)ident(sig)operator(\)\);) + reserved(if) operator((!)ident(s)operator(\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(bad signal)delimiter(")>operator(\);) + reserved(goto) ident(str_signal)operator(;) + + reserved(case) label(T_STRING)operator(:) + ident(s) operator(=) ident(RSTRING)operator(()ident(arg)operator(->)ident(sig)operator(\)->)ident(ptr)operator(;) + + label(str_signal)operator(:) + reserved(if) operator(()ident(strncmp)operator(()string<delimiter(")content(SIG)delimiter(")>operator(,) ident(s)operator(,) integer(3)operator(\)) operator(==) integer(0)operator(\)) + ident(s) operator(+=) integer(3)operator(;) + ident(sig) operator(=) ident(signm2signo)operator(()ident(s)operator(\);) + reserved(if) operator(()ident(sig) operator(==) integer(0) operator(&&) ident(strcmp)operator(()ident(s)operator(,) string<delimiter(")content(EXIT)delimiter(")>operator(\)) operator(!=) integer(0)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(unsupported signal SIG%s)delimiter(")>operator(,) ident(s)operator(\);) + operator(}) + + reserved(if) operator(()ident(sig) operator(<) integer(0) operator(||) ident(sig) operator(>=) ident(NSIG)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(invalid signal number (%d\))delimiter(")>operator(,) ident(sig)operator(\);) + operator(}) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETITIMER)operator(\)) + reserved(if) operator(()ident(sig) operator(==) ident(SIGVTALRM)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(SIGVTALRM reserved for Thread; can't set handler)delimiter(")>operator(\);) + operator(}) +preprocessor(#endif) + reserved(if) operator(()ident(func) operator(==) ident(SIG_DFL)operator(\)) operator({) + reserved(switch) operator(()ident(sig)operator(\)) operator({) + reserved(case) label(SIGINT)operator(:) +preprocessor(#ifdef) ident(SIGHUP) + reserved(case) label(SIGHUP)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGQUIT) + reserved(case) label(SIGQUIT)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGTERM) + reserved(case) label(SIGTERM)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGALRM) + reserved(case) label(SIGALRM)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGUSR1) + reserved(case) label(SIGUSR1)operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGUSR2) + reserved(case) label(SIGUSR2)operator(:) +preprocessor(#endif) + ident(func) operator(=) ident(sighandler)operator(;) + reserved(break)operator(;) +preprocessor(#ifdef) ident(SIGBUS) + reserved(case) label(SIGBUS)operator(:) + ident(func) operator(=) ident(sigbus)operator(;) + reserved(break)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGSEGV) + reserved(case) label(SIGSEGV)operator(:) + ident(func) operator(=) ident(sigsegv)operator(;) + reserved(break)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGPIPE) + reserved(case) label(SIGPIPE)operator(:) + ident(func) operator(=) ident(sigpipe)operator(;) + reserved(break)operator(;) +preprocessor(#endif) + operator(}) + operator(}) + ident(oldfunc) operator(=) ident(ruby_signal)operator(()ident(sig)operator(,) ident(func)operator(\);) + ident(oldcmd) operator(=) ident(trap_list)operator([)ident(sig)operator(])operator(.)ident(cmd)operator(;) + reserved(if) operator((!)ident(oldcmd)operator(\)) operator({) + reserved(if) operator(()ident(oldfunc) operator(==) ident(SIG_IGN)operator(\)) ident(oldcmd) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(IGNORE)delimiter(")>operator(\);) + reserved(else) reserved(if) operator(()ident(oldfunc) operator(==) ident(sighandler)operator(\)) ident(oldcmd) operator(=) ident(rb_str_new2)operator(()string<delimiter(")content(DEFAULT)delimiter(")>operator(\);) + reserved(else) ident(oldcmd) operator(=) ident(Qnil)operator(;) + operator(}) + + ident(trap_list)operator([)ident(sig)operator(])operator(.)ident(cmd) operator(=) ident(command)operator(;) + ident(trap_list)operator([)ident(sig)operator(])operator(.)ident(safe) operator(=) ident(ruby_safe_level)operator(;) + comment(/* enable at least specified signal. */) +preprocessor(#if) ident(USE_TRAP_MASK) +preprocessor(#ifdef) ident(HAVE_SIGPROCMASK) + ident(sigdelset)operator((&)ident(arg)operator(->)ident(mask)operator(,) ident(sig)operator(\);) +preprocessor(#else) + ident(arg)operator(->)ident(mask) operator(&=) operator(~)ident(sigmask)operator(()ident(sig)operator(\);) +preprocessor(#endif) +preprocessor(#endif) + reserved(return) ident(oldcmd)operator(;) +operator(}) + +preprocessor(#if) ident(USE_TRAP_MASK) +directive(static) ident(VALUE) +ident(trap_ensure)operator(()ident(arg)operator(\)) + reserved(struct) ident(trap_arg) operator(*)ident(arg)operator(;) +operator({) + comment(/* enable interrupt */) +preprocessor(#ifdef) ident(HAVE_SIGPROCMASK) + ident(sigprocmask)operator(()ident(SIG_SETMASK)operator(,) operator(&)ident(arg)operator(->)ident(mask)operator(,) pre_constant(NULL)operator(\);) +preprocessor(#else) + ident(sigsetmask)operator(()ident(arg)operator(->)ident(mask)operator(\);) +preprocessor(#endif) + ident(trap_last_mask) operator(=) ident(arg)operator(->)ident(mask)operator(;) + reserved(return) integer(0)operator(;) +operator(}) +preprocessor(#endif) + +directive(void) +ident(rb_trap_restore_mask)operator((\)) +operator({) +preprocessor(#if) ident(USE_TRAP_MASK) +preprocessor(# ifdef) ident(HAVE_SIGPROCMASK) + ident(sigprocmask)operator(()ident(SIG_SETMASK)operator(,) operator(&)ident(trap_last_mask)operator(,) pre_constant(NULL)operator(\);) +preprocessor(# else) + ident(sigsetmask)operator(()ident(trap_last_mask)operator(\);) +preprocessor(# endif) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * Signal.trap( signal, proc \) => obj + * Signal.trap( signal \) {| | block } => obj + * + * Specifies the handling of signals. The first parameter is a signal + * name (a string such as ``SIGALRM'', ``SIGUSR1'', and so on\) or a + * signal number. The characters ``SIG'' may be omitted from the + * signal name. The command or block specifies code to be run when the + * signal is raised. If the command is the string ``IGNORE'' or + * ``SIG_IGN'', the signal will be ignored. If the command is + * ``DEFAULT'' or ``SIG_DFL'', the operating system's default handler + * will be invoked. If the command is ``EXIT'', the script will be + * terminated by the signal. Otherwise, the given command or block + * will be run. + * The special signal name ``EXIT'' or signal number zero will be + * invoked just prior to program termination. + * trap returns the previous handler for the given signal. + * + * Signal.trap(0, proc { puts "Terminating: #{$$}" }\) + * Signal.trap("CLD"\) { puts "Child died" } + * fork && Process.wait + * + * produces: + * Terminating: 27461 + * Child died + * Terminating: 27460 + */) +directive(static) ident(VALUE) +ident(sig_trap)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(struct) ident(trap_arg) ident(arg)operator(;) + + ident(rb_secure)operator(()integer(2)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0) operator(||) ident(argc) operator(>) integer(2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments -- trap(sig, cmd\)/trap(sig\){...})delimiter(")>operator(\);) + operator(}) + + ident(arg)operator(.)ident(sig) operator(=) ident(argv)operator([)integer(0)operator(];) + reserved(if) operator(()ident(argc) operator(==) integer(1)operator(\)) operator({) + ident(arg)operator(.)ident(cmd) operator(=) ident(rb_block_proc)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(arg)operator(.)ident(cmd) operator(=) ident(argv)operator([)integer(1)operator(];) + operator(}) + + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(arg)operator(.)ident(cmd)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: tainted signal trap)delimiter(")>operator(\);) + operator(}) +preprocessor(#if) ident(USE_TRAP_MASK) + comment(/* disable interrupt */) +preprocessor(# ifdef) ident(HAVE_SIGPROCMASK) + ident(sigfillset)operator((&)ident(arg)operator(.)ident(mask)operator(\);) + ident(sigprocmask)operator(()ident(SIG_BLOCK)operator(,) operator(&)ident(arg)operator(.)ident(mask)operator(,) operator(&)ident(arg)operator(.)ident(mask)operator(\);) +preprocessor(# else) + ident(arg)operator(.)ident(mask) operator(=) ident(sigblock)operator((~)integer(0)operator(\);) +preprocessor(# endif) + + reserved(return) ident(rb_ensure)operator(()ident(trap)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(,) ident(trap_ensure)operator(,) operator(()ident(VALUE)operator(\)&)ident(arg)operator(\);) +preprocessor(#else) + reserved(return) ident(trap)operator((&)ident(arg)operator(\);) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * Signal.list => a_hash + * + * Returns a list of signal names mapped to the corresponding + * underlying signal numbers. + * + * Signal.list #=> {"ABRT"=>6, "ALRM"=>14, "BUS"=>7, "CHLD"=>17, "CLD"=>17, "CONT"=>18, "FPE"=>8, "HUP"=>1, "ILL"=>4, "INT"=>2, "IO"=>29, "IOT"=>6, "KILL"=>9, "PIPE"=>13, "POLL"=>29, "PROF"=>27, "PWR"=>30, "QUIT"=>3, "SEGV"=>11, "STOP"=>19, "SYS"=>31, "TERM"=>15, "TRAP"=>5, "TSTP"=>20, "TTIN"=>21, "TTOU"=>22, "URG"=>23, "USR1"=>10, "USR2"=>12, "VTALRM"=>26, "WINCH"=>28, "XCPU"=>24, "XFSZ"=>25} + */) +directive(static) ident(VALUE) +ident(sig_list)operator((\)) +operator({) + ident(VALUE) ident(h) operator(=) ident(rb_hash_new)operator((\);) + reserved(struct) ident(signals) operator(*)ident(sigs)operator(;) + + reserved(for) operator(()ident(sigs) operator(=) ident(siglist)operator(;) ident(sigs)operator(->)ident(signm)operator(;) ident(sigs)operator(++\)) operator({) + ident(rb_hash_aset)operator(()ident(h)operator(,) ident(rb_str_new2)operator(()ident(sigs)operator(->)ident(signm)operator(\),) ident(INT2FIX)operator(()ident(sigs)operator(->)ident(signo)operator(\)\);) + operator(}) + reserved(return) ident(h)operator(;) +operator(}) + +directive(static) directive(void) +ident(install_sighandler)operator(()ident(signum)operator(,) ident(handler)operator(\)) + pre_type(int) ident(signum)operator(;) + ident(sighandler_t) ident(handler)operator(;) +operator({) + ident(sighandler_t) ident(old)operator(;) + + ident(old) operator(=) ident(ruby_signal)operator(()ident(signum)operator(,) ident(handler)operator(\);) + reserved(if) operator(()ident(old) operator(!=) ident(SIG_DFL)operator(\)) operator({) + ident(ruby_signal)operator(()ident(signum)operator(,) ident(old)operator(\);) + operator(}) +operator(}) + +comment(#if 0 +/* + * If you write a handler which works on any native thread + * (even if the thread is NOT a ruby's one\), please enable + * this function and use it to install the handler, instead + * of `install_sighandler(\)'. + */ +#ifdef HAVE_NATIVETHREAD +static void +install_nativethread_sighandler(signum, handler\) + int signum; + sighandler_t handler; +{ + sighandler_t old; + int old_st; + + old_st = rb_trap_accept_nativethreads[signum]; + old = ruby_nativethread_signal(signum, handler\); + if (old != SIG_DFL\) { + if (old_st\) { + ruby_nativethread_signal(signum, old\); + } else { + ruby_signal(signum, old\); + } + } +} +#endif) +preprocessor(#endif) + +directive(static) directive(void) +ident(init_sigchld)operator(()ident(sig)operator(\)) + pre_type(int) ident(sig)operator(;) +operator({) + ident(sighandler_t) ident(oldfunc)operator(;) +preprocessor(#if) ident(USE_TRAP_MASK) +preprocessor(# ifdef) ident(HAVE_SIGPROCMASK) + ident(sigset_t) ident(mask)operator(;) +preprocessor(# else) + pre_type(int) ident(mask)operator(;) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#if) ident(USE_TRAP_MASK) + comment(/* disable interrupt */) +preprocessor(# ifdef) ident(HAVE_SIGPROCMASK) + ident(sigfillset)operator((&)ident(mask)operator(\);) + ident(sigprocmask)operator(()ident(SIG_BLOCK)operator(,) operator(&)ident(mask)operator(,) operator(&)ident(mask)operator(\);) +preprocessor(# else) + ident(mask) operator(=) ident(sigblock)operator((~)integer(0)operator(\);) +preprocessor(# endif) +preprocessor(#endif) + + ident(oldfunc) operator(=) ident(ruby_signal)operator(()ident(sig)operator(,) ident(SIG_DFL)operator(\);) + reserved(if) operator(()ident(oldfunc) operator(!=) ident(SIG_DFL) operator(&&) ident(oldfunc) operator(!=) ident(SIG_IGN)operator(\)) operator({) + ident(ruby_signal)operator(()ident(sig)operator(,) ident(oldfunc)operator(\);) + operator(}) reserved(else) operator({) + ident(trap_list)operator([)ident(sig)operator(])operator(.)ident(cmd) operator(=) integer(0)operator(;) + operator(}) + +preprocessor(#if) ident(USE_TRAP_MASK) +preprocessor(#ifdef) ident(HAVE_SIGPROCMASK) + ident(sigdelset)operator((&)ident(mask)operator(,) ident(sig)operator(\);) + ident(sigprocmask)operator(()ident(SIG_SETMASK)operator(,) operator(&)ident(mask)operator(,) pre_constant(NULL)operator(\);) +preprocessor(#else) + ident(mask) operator(&=) operator(~)ident(sigmask)operator(()ident(sig)operator(\);) + ident(sigsetmask)operator(()ident(mask)operator(\);) +preprocessor(#endif) + ident(trap_last_mask) operator(=) ident(mask)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* + * Many operating systems allow signals to be sent to running + * processes. Some signals have a defined effect on the process, while + * others may be trapped at the code level and acted upon. For + * example, your process may trap the USR1 signal and use it to toggle + * debugging, and may use TERM to initiate a controlled shutdown. + * + * pid = fork do + * Signal.trap("USR1"\) do + * $debug = !$debug + * puts "Debug now: #$debug" + * end + * Signal.trap("TERM"\) do + * puts "Terminating..." + * shutdown(\) + * end + * # . . . do some work . . . + * end + * + * Process.detach(pid\) + * + * # Controlling program: + * Process.kill("USR1", pid\) + * # ... + * Process.kill("USR1", pid\) + * # ... + * Process.kill("TERM", pid\) + * + * produces: + * Debug now: true + * Debug now: false + * Terminating... + * + * The list of available signal names and their interpretation is + * system dependent. Signal delivery semantics may also vary between + * systems; in particular signal delivery may not always be reliable. + */) +directive(void) +ident(Init_signal)operator((\)) +operator({) +preprocessor(#ifndef) ident(MACOS_UNUSE_SIGNAL) + ident(VALUE) ident(mSignal) operator(=) ident(rb_define_module)operator(()string<delimiter(")content(Signal)delimiter(")>operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(trap)delimiter(")>operator(,) ident(sig_trap)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(mSignal)operator(,) string<delimiter(")content(trap)delimiter(")>operator(,) ident(sig_trap)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_module_function)operator(()ident(mSignal)operator(,) string<delimiter(")content(list)delimiter(")>operator(,) ident(sig_list)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_eSignal)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(esignal_init)operator(,) operator(-)integer(1)operator(\);) + ident(rb_attr)operator(()ident(rb_eSignal)operator(,) ident(rb_intern)operator(()string<delimiter(")content(signo)delimiter(")>operator(\),) integer(1)operator(,) integer(0)operator(,) integer(0)operator(\);) + ident(rb_alias)operator(()ident(rb_eSignal)operator(,) ident(rb_intern)operator(()string<delimiter(")content(signm)delimiter(")>operator(\),) ident(rb_intern)operator(()string<delimiter(")content(message)delimiter(")>operator(\)\);) + ident(rb_define_method)operator(()ident(rb_eInterrupt)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(interrupt_init)operator(,) integer(1)operator(\);) + + ident(install_sighandler)operator(()ident(SIGINT)operator(,) ident(sighandler)operator(\);) +preprocessor(#ifdef) ident(SIGHUP) + ident(install_sighandler)operator(()ident(SIGHUP)operator(,) ident(sighandler)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGQUIT) + ident(install_sighandler)operator(()ident(SIGQUIT)operator(,) ident(sighandler)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGTERM) + ident(install_sighandler)operator(()ident(SIGTERM)operator(,) ident(sighandler)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGALRM) + ident(install_sighandler)operator(()ident(SIGALRM)operator(,) ident(sighandler)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGUSR1) + ident(install_sighandler)operator(()ident(SIGUSR1)operator(,) ident(sighandler)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGUSR2) + ident(install_sighandler)operator(()ident(SIGUSR2)operator(,) ident(sighandler)operator(\);) +preprocessor(#endif) + +preprocessor(#ifdef) ident(SIGBUS) + ident(install_sighandler)operator(()ident(SIGBUS)operator(,) ident(sigbus)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGSEGV) + ident(install_sighandler)operator(()ident(SIGSEGV)operator(,) ident(sigsegv)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(SIGPIPE) + ident(install_sighandler)operator(()ident(SIGPIPE)operator(,) ident(sigpipe)operator(\);) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(SIGCLD)operator(\)) + ident(init_sigchld)operator(()ident(SIGCLD)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(SIGCHLD)operator(\)) + ident(init_sigchld)operator(()ident(SIGCHLD)operator(\);) +preprocessor(#endif) + +preprocessor(#endif) comment(/* MACOS_UNUSE_SIGNAL */) +operator(}) +comment(/********************************************************************** + + sprintf.c - + + $Author: shyouhei $ + $Date: 2008-06-20 01:12:46 +0200 (Fri, 20 Jun 2008\) $ + created at: Fri Oct 15 10:39:26 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("re.h") +preprocessor(#include) include(<ctype.h>) +preprocessor(#include) include(<math.h>) + +preprocessor(#define) ident(BIT_DIGITS)operator(()ident(N)operator(\)) operator(((()ident(N)operator(\)*)integer(146)operator(\))operator(/)integer(485) operator(+) integer(1)operator(\)) comment(/* log2(10\) =~ 146/485 */) +preprocessor(#define) ident(BITSPERDIG) operator(()ident(SIZEOF_BDIGITS)operator(*)ident(CHAR_BIT)operator(\)) +preprocessor(#define) ident(EXTENDSIGN)operator(()ident(n)operator(,) ident(l)operator(\)) operator((((~)integer(0) operator(<<) operator(()ident(n)operator(\)\)) operator(>>) operator(((()ident(n)operator(\)*()ident(l)operator(\)\)) operator(%) ident(BITSPERDIG)operator(\)\)) operator(&) operator(~(~)integer(0) operator(<<) operator(()ident(n)operator(\)\)\)) + +directive(static) directive(void) ident(fmt_setup) ident(_)operator((()pre_type(char)operator(*,)pre_type(int)operator(,)pre_type(int)operator(,)pre_type(int)operator(,)pre_type(int)operator(\)\);) + +directive(static) pre_type(char)operator(*) +ident(remove_sign_bits)operator(()ident(str)operator(,) ident(base)operator(\)) + pre_type(char) operator(*)ident(str)operator(;) + pre_type(int) ident(base)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(t)operator(;) + + ident(s) operator(=) ident(t) operator(=) ident(str)operator(;) + + reserved(if) operator(()ident(base) operator(==) integer(16)operator(\)) operator({) + reserved(while) operator((*)ident(t) operator(==) char('f')operator(\)) operator({) + ident(t)operator(++;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(base) operator(==) integer(8)operator(\)) operator({) + operator(*)ident(t) operator(|=) ident(EXTENDSIGN)operator(()integer(3)operator(,) ident(strlen)operator(()ident(t)operator(\)\);) + reserved(while) operator((*)ident(t) operator(==) char('7')operator(\)) operator({) + ident(t)operator(++;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(base) operator(==) integer(2)operator(\)) operator({) + reserved(while) operator((*)ident(t) operator(==) char('1')operator(\)) operator({) + ident(t)operator(++;) + operator(}) + operator(}) + reserved(if) operator(()ident(t) operator(>) ident(s)operator(\)) operator({) + reserved(while) operator((*)ident(t)operator(\)) operator(*)ident(s)operator(++) operator(=) operator(*)ident(t)operator(++;) + operator(*)ident(s) operator(=) char('\\0')operator(;) + operator(}) + + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) pre_type(char) +ident(sign_bits)operator(()ident(base)operator(,) ident(p)operator(\)) + pre_type(int) ident(base)operator(;) + directive(const) pre_type(char) operator(*)ident(p)operator(;) +operator({) + pre_type(char) ident(c) operator(=) char('.')operator(;) + + reserved(switch) operator(()ident(base)operator(\)) operator({) + reserved(case) integer(16)operator(:) + reserved(if) operator((*)ident(p) operator(==) char('X')operator(\)) ident(c) operator(=) char('F')operator(;) + reserved(else) ident(c) operator(=) char('f')operator(;) + reserved(break)operator(;) + reserved(case) integer(8)operator(:) + ident(c) operator(=) char('7')operator(;) reserved(break)operator(;) + reserved(case) integer(2)operator(:) + ident(c) operator(=) char('1')operator(;) reserved(break)operator(;) + operator(}) + reserved(return) ident(c)operator(;) +operator(}) + +preprocessor(#define) ident(FNONE) integer(0) +preprocessor(#define) ident(FSHARP) integer(1) +preprocessor(#define) ident(FMINUS) integer(2) +preprocessor(#define) ident(FPLUS) integer(4) +preprocessor(#define) ident(FZERO) integer(8) +preprocessor(#define) ident(FSPACE) integer(16) +preprocessor(#define) ident(FWIDTH) integer(32) +preprocessor(#define) ident(FPREC) integer(64) +preprocessor(#define) ident(FPREC0) integer(128) + +preprocessor(#define) ident(CHECK)operator(()ident(l)operator(\)) reserved(do) operator({)\ + reserved(while) operator(()ident(blen) operator(+) operator(()ident(l)operator(\)) operator(>=) ident(bsiz)operator(\)) operator({)\ + ident(bsiz)operator(*=)integer(2)operator(;)\ + operator(})\ + ident(rb_str_resize)operator(()ident(result)operator(,) ident(bsiz)operator(\);)\ + ident(buf) operator(=) ident(RSTRING)operator(()ident(result)operator(\)->)ident(ptr)operator(;)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(PUSH)operator(()ident(s)operator(,) ident(l)operator(\)) reserved(do) operator({) \ + ident(CHECK)operator(()ident(l)operator(\);)\ + ident(memcpy)operator((&)ident(buf)operator([)ident(blen)operator(],) ident(s)operator(,) ident(l)operator(\);)\ + ident(blen) operator(+=) operator(()ident(l)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(GETARG)operator((\)) operator(()ident(nextvalue) operator(!=) ident(Qundef) operator(?) ident(nextvalue) operator(:) \ + ident(posarg) operator(<) integer(0) operator(?) \ + operator(()ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(unnumbered(%d\) mixed with numbered)delimiter(")>operator(,) ident(nextarg)operator(\),) integer(0)operator(\)) operator(:) \ + operator(()ident(posarg) operator(=) ident(nextarg)operator(++,) ident(GETNTHARG)operator(()ident(posarg)operator(\)\)\)) + +preprocessor(#define) ident(GETPOSARG)operator(()ident(n)operator(\)) operator(()ident(posarg) operator(>) integer(0) operator(?) \ + operator(()ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(numbered(%d\) after unnumbered(%d\))delimiter(")>operator(,) ident(n)operator(,) ident(posarg)operator(\),) integer(0)operator(\)) operator(:) \ + operator((()ident(n) operator(<) integer(1)operator(\)) operator(?) operator(()ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(invalid index - %d$)delimiter(")>operator(,) ident(n)operator(\),) integer(0)operator(\)) operator(:) \ + operator(()ident(posarg) operator(=) operator(-)integer(1)operator(,) ident(GETNTHARG)operator(()ident(n)operator(\)\)\)\)) + +preprocessor(#define) ident(GETNTHARG)operator(()ident(nth)operator(\)) \ + operator((()ident(nth) operator(>=) ident(argc)operator(\)) operator(?) operator(()ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(too few arguments)delimiter(")>operator(\),) integer(0)operator(\)) operator(:) ident(argv)operator([)ident(nth)operator(]\)) + +preprocessor(#define) ident(GETNUM)operator(()ident(n)operator(,) ident(val)operator(\)) \ + reserved(for) operator((;) ident(p) operator(<) ident(end) operator(&&) ident(ISDIGIT)operator((*)ident(p)operator(\);) ident(p)operator(++\)) operator({) \ + pre_type(int) ident(next_n) operator(=) integer(10) operator(*) ident(n) operator(+) operator((*)ident(p) operator(-) char('0')operator(\);) \ + reserved(if) operator(()ident(next_n) operator(/) integer(10) operator(!=) ident(n)operator(\)) operator({)\ + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) preprocessor(#val) string<delimiter(")content( too big)delimiter(")>operator(\);) \ + operator(}) \ + ident(n) operator(=) ident(next_n)operator(;) \ + operator(}) \ + reserved(if) operator(()ident(p) operator(>=) ident(end)operator(\)) operator({) \ + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(malformed format string - %%*[0-9])delimiter(")>operator(\);) \ + operator(}) + +preprocessor(#define) ident(GETASTER)operator(()ident(val)operator(\)) reserved(do) operator({) \ + ident(t) operator(=) ident(p)operator(++;) \ + ident(n) operator(=) integer(0)operator(;) \ + ident(GETNUM)operator(()ident(n)operator(,) ident(val)operator(\);) \ + reserved(if) operator((*)ident(p) operator(==) char('$')operator(\)) operator({) \ + ident(tmp) operator(=) ident(GETPOSARG)operator(()ident(n)operator(\);) \ + operator(}) \ + reserved(else) operator({) \ + ident(tmp) operator(=) ident(GETARG)operator((\);) \ + ident(p) operator(=) ident(t)operator(;) \ + operator(}) \ + ident(val) operator(=) ident(NUM2INT)operator(()ident(tmp)operator(\);) \ +operator(}) reserved(while) operator(()integer(0)operator(\)) + + +comment(/* + * call-seq: + * format(format_string [, arguments...] \) => string + * sprintf(format_string [, arguments...] \) => string + * + * Returns the string resulting from applying <i>format_string</i> to + * any additional arguments. Within the format string, any characters + * other than format sequences are copied to the result. A format + * sequence consists of a percent sign, followed by optional flags, + * width, and precision indicators, then terminated with a field type + * character. The field type controls how the corresponding + * <code>sprintf</code> argument is to be interpreted, while the flags + * modify that interpretation. The field type characters are listed + * in the table at the end of this section. The flag characters are: + * + * Flag | Applies to | Meaning + * ---------+--------------+----------------------------------------- + * space | bdeEfgGiouxX | Leave a space at the start of + * | | positive numbers. + * ---------+--------------+----------------------------------------- + * (digit\)$ | all | Specifies the absolute argument number + * | | for this field. Absolute and relative + * | | argument numbers cannot be mixed in a + * | | sprintf string. + * ---------+--------------+----------------------------------------- + * # | beEfgGoxX | Use an alternative format. For the + * | | conversions `o', `x', `X', and `b', + * | | prefix the result with ``0'', ``0x'', ``0X'', + * | | and ``0b'', respectively. For `e', + * | | `E', `f', `g', and 'G', force a decimal + * | | point to be added, even if no digits follow. + * | | For `g' and 'G', do not remove trailing zeros. + * ---------+--------------+----------------------------------------- + * + | bdeEfgGiouxX | Add a leading plus sign to positive numbers. + * ---------+--------------+----------------------------------------- + * - | all | Left-justify the result of this conversion. + * ---------+--------------+----------------------------------------- + * 0 (zero\) | bdeEfgGiouxX | Pad with zeros, not spaces. + * ---------+--------------+----------------------------------------- + * * | all | Use the next argument as the field width. + * | | If negative, left-justify the result. If the + * | | asterisk is followed by a number and a dollar + * | | sign, use the indicated argument as the width. + * + * + * The field width is an optional integer, followed optionally by a + * period and a precision. The width specifies the minimum number of + * characters that will be written to the result for this field. For + * numeric fields, the precision controls the number of decimal places + * displayed. For string fields, the precision determines the maximum + * number of characters to be copied from the string. (Thus, the format + * sequence <code>%10.10s</code> will always contribute exactly ten + * characters to the result.\) + * + * The field types are: + * + * Field | Conversion + * ------+-------------------------------------------------------------- + * b | Convert argument as a binary number. + * c | Argument is the numeric code for a single character. + * d | Convert argument as a decimal number. + * E | Equivalent to `e', but uses an uppercase E to indicate + * | the exponent. + * e | Convert floating point argument into exponential notation + * | with one digit before the decimal point. The precision + * | determines the number of fractional digits (defaulting to six\). + * f | Convert floating point argument as [-]ddd.ddd, + * | where the precision determines the number of digits after + * | the decimal point. + * G | Equivalent to `g', but use an uppercase `E' in exponent form. + * g | Convert a floating point number using exponential form + * | if the exponent is less than -4 or greater than or + * | equal to the precision, or in d.dddd form otherwise. + * i | Identical to `d'. + * o | Convert argument as an octal number. + * p | The valuing of argument.inspect. + * s | Argument is a string to be substituted. If the format + * | sequence contains a precision, at most that many characters + * | will be copied. + * u | Treat argument as an unsigned decimal number. Negative integers + * | are displayed as a 32 bit two's complement plus one for the + * | underlying architecture; that is, 2 ** 32 + n. However, since + * | Ruby has no inherent limit on bits used to represent the + * | integer, this value is preceded by two dots (..\) in order to + * | indicate a infinite number of leading sign bits. + * X | Convert argument as a hexadecimal number using uppercase + * | letters. Negative numbers will be displayed with two + * | leading periods (representing an infinite string of + * | leading 'FF's. + * x | Convert argument as a hexadecimal number. + * | Negative numbers will be displayed with two + * | leading periods (representing an infinite string of + * | leading 'ff's. + * + * Examples: + * + * sprintf("%d %04x", 123, 123\) #=> "123 007b" + * sprintf("%08b '%4s'", 123, 123\) #=> "01111011 ' 123'" + * sprintf("%1$*2$s %2$d %1$s", "hello", 8\) #=> " hello 8 hello" + * sprintf("%1$*2$s %2$d", "hello", -8\) #=> "hello -8" + * sprintf("%+g:% g:%-g", 1.23, 1.23, 1.23\) #=> "+1.23: 1.23:1.23" + * sprintf("%u", -123\) #=> "..4294967173" + */) + +ident(VALUE) +ident(rb_f_sprintf)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(return) ident(rb_str_format)operator(()ident(argc) operator(-) integer(1)operator(,) ident(argv) operator(+) integer(1)operator(,) ident(GETNTHARG)operator(()integer(0)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_str_format)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(fmt)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(fmt)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(end)operator(;) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(int) ident(blen)operator(,) ident(bsiz)operator(;) + ident(VALUE) ident(result)operator(;) + + pre_type(int) ident(width)operator(,) ident(prec)operator(,) ident(flags) operator(=) ident(FNONE)operator(;) + pre_type(int) ident(nextarg) operator(=) integer(1)operator(;) + pre_type(int) ident(posarg) operator(=) integer(0)operator(;) + pre_type(int) ident(tainted) operator(=) integer(0)operator(;) + ident(VALUE) ident(nextvalue)operator(;) + ident(VALUE) ident(tmp)operator(;) + ident(VALUE) ident(str)operator(;) + +preprocessor(#define) ident(CHECK_FOR_WIDTH)operator(()ident(f)operator(\)) \ + reserved(if) operator((()ident(f)operator(\)) operator(&) ident(FWIDTH)operator(\)) operator({) \ + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(width given twice)delimiter(")>operator(\);) \ + operator(}) \ + reserved(if) operator((()ident(f)operator(\)) operator(&) ident(FPREC0)operator(\)) operator({) \ + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(width after precision)delimiter(")>operator(\);) \ + operator(}) +preprocessor(#define) ident(CHECK_FOR_FLAGS)operator(()ident(f)operator(\)) \ + reserved(if) operator((()ident(f)operator(\)) operator(&) ident(FWIDTH)operator(\)) operator({) \ + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(flag after width)delimiter(")>operator(\);) \ + operator(}) \ + reserved(if) operator((()ident(f)operator(\)) operator(&) ident(FPREC0)operator(\)) operator({) \ + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(flag after precision)delimiter(")>operator(\);) \ + operator(}) + + operator(++)ident(argc)operator(;) + operator(--)ident(argv)operator(;) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(fmt)operator(\)\)) ident(tainted) operator(=) integer(1)operator(;) + ident(StringValue)operator(()ident(fmt)operator(\);) + ident(fmt) operator(=) ident(rb_str_new4)operator(()ident(fmt)operator(\);) + ident(p) operator(=) ident(RSTRING)operator(()ident(fmt)operator(\)->)ident(ptr)operator(;) + ident(end) operator(=) ident(p) operator(+) ident(RSTRING)operator(()ident(fmt)operator(\)->)ident(len)operator(;) + ident(blen) operator(=) integer(0)operator(;) + ident(bsiz) operator(=) integer(120)operator(;) + ident(result) operator(=) ident(rb_str_buf_new)operator(()ident(bsiz)operator(\);) + ident(buf) operator(=) ident(RSTRING)operator(()ident(result)operator(\)->)ident(ptr)operator(;) + + reserved(for) operator((;) ident(p) operator(<) ident(end)operator(;) ident(p)operator(++\)) operator({) + directive(const) pre_type(char) operator(*)ident(t)operator(;) + pre_type(int) ident(n)operator(;) + + reserved(for) operator(()ident(t) operator(=) ident(p)operator(;) ident(t) operator(<) ident(end) operator(&&) operator(*)ident(t) operator(!=) char('%')operator(;) ident(t)operator(++\)) operator(;) + ident(PUSH)operator(()ident(p)operator(,) ident(t) operator(-) ident(p)operator(\);) + reserved(if) operator(()ident(t) operator(>=) ident(end)operator(\)) operator({) + comment(/* end of fmt string */) + reserved(goto) ident(sprint_exit)operator(;) + operator(}) + ident(p) operator(=) ident(t) operator(+) integer(1)operator(;) comment(/* skip `%' */) + + ident(width) operator(=) ident(prec) operator(=) operator(-)integer(1)operator(;) + ident(nextvalue) operator(=) ident(Qundef)operator(;) + label(retry)operator(:) + reserved(switch) operator((*)ident(p)operator(\)) operator({) + reserved(default)operator(:) + reserved(if) operator(()ident(ISPRINT)operator((*)ident(p)operator(\)\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(malformed format string - %%%c)delimiter(")>operator(,) operator(*)ident(p)operator(\);) + reserved(else) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(malformed format string)delimiter(")>operator(\);) + reserved(break)operator(;) + + reserved(case) char(' ')operator(:) + ident(CHECK_FOR_FLAGS)operator(()ident(flags)operator(\);) + ident(flags) operator(|=) ident(FSPACE)operator(;) + ident(p)operator(++;) + reserved(goto) ident(retry)operator(;) + + reserved(case) char('#')operator(:) + ident(CHECK_FOR_FLAGS)operator(()ident(flags)operator(\);) + ident(flags) operator(|=) ident(FSHARP)operator(;) + ident(p)operator(++;) + reserved(goto) ident(retry)operator(;) + + reserved(case) char('+')operator(:) + ident(CHECK_FOR_FLAGS)operator(()ident(flags)operator(\);) + ident(flags) operator(|=) ident(FPLUS)operator(;) + ident(p)operator(++;) + reserved(goto) ident(retry)operator(;) + + reserved(case) char('-')operator(:) + ident(CHECK_FOR_FLAGS)operator(()ident(flags)operator(\);) + ident(flags) operator(|=) ident(FMINUS)operator(;) + ident(p)operator(++;) + reserved(goto) ident(retry)operator(;) + + reserved(case) char('0')operator(:) + ident(CHECK_FOR_FLAGS)operator(()ident(flags)operator(\);) + ident(flags) operator(|=) ident(FZERO)operator(;) + ident(p)operator(++;) + reserved(goto) ident(retry)operator(;) + + reserved(case) char('1')operator(:) reserved(case) char('2')operator(:) reserved(case) char('3')operator(:) reserved(case) char('4')operator(:) + reserved(case) char('5')operator(:) reserved(case) char('6')operator(:) reserved(case) char('7')operator(:) reserved(case) char('8')operator(:) reserved(case) char('9')operator(:) + ident(n) operator(=) integer(0)operator(;) + ident(GETNUM)operator(()ident(n)operator(,) ident(width)operator(\);) + reserved(if) operator((*)ident(p) operator(==) char('$')operator(\)) operator({) + reserved(if) operator(()ident(nextvalue) operator(!=) ident(Qundef)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(value given twice - %d$)delimiter(")>operator(,) ident(n)operator(\);) + operator(}) + ident(nextvalue) operator(=) ident(GETPOSARG)operator(()ident(n)operator(\);) + ident(p)operator(++;) + reserved(goto) ident(retry)operator(;) + operator(}) + ident(CHECK_FOR_WIDTH)operator(()ident(flags)operator(\);) + ident(width) operator(=) ident(n)operator(;) + ident(flags) operator(|=) ident(FWIDTH)operator(;) + reserved(goto) ident(retry)operator(;) + + reserved(case) char('*')operator(:) + ident(CHECK_FOR_WIDTH)operator(()ident(flags)operator(\);) + ident(flags) operator(|=) ident(FWIDTH)operator(;) + ident(GETASTER)operator(()ident(width)operator(\);) + reserved(if) operator(()ident(width) operator(<) integer(0)operator(\)) operator({) + ident(flags) operator(|=) ident(FMINUS)operator(;) + ident(width) operator(=) operator(-)ident(width)operator(;) + operator(}) + ident(p)operator(++;) + reserved(goto) ident(retry)operator(;) + + reserved(case) char('.')operator(:) + reserved(if) operator(()ident(flags) operator(&) ident(FPREC0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(precision given twice)delimiter(")>operator(\);) + operator(}) + ident(flags) operator(|=) ident(FPREC)operator(|)ident(FPREC0)operator(;) + + ident(prec) operator(=) integer(0)operator(;) + ident(p)operator(++;) + reserved(if) operator((*)ident(p) operator(==) char('*')operator(\)) operator({) + ident(GETASTER)operator(()ident(prec)operator(\);) + reserved(if) operator(()ident(prec) operator(<) integer(0)operator(\)) operator({) comment(/* ignore negative precision */) + ident(flags) operator(&=) operator(~)ident(FPREC)operator(;) + operator(}) + ident(p)operator(++;) + reserved(goto) ident(retry)operator(;) + operator(}) + + ident(GETNUM)operator(()ident(prec)operator(,) ident(precision)operator(\);) + reserved(goto) ident(retry)operator(;) + + reserved(case) char('\\n')operator(:) + reserved(case) char('\\0')operator(:) + ident(p)operator(--;) + reserved(case) char('%')operator(:) + reserved(if) operator(()ident(flags) operator(!=) ident(FNONE)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(illegal format character - %%)delimiter(")>operator(\);) + operator(}) + ident(PUSH)operator(()string<delimiter(")content(%)delimiter(")>operator(,) integer(1)operator(\);) + reserved(break)operator(;) + + reserved(case) char('c')operator(:) + operator({) + ident(VALUE) ident(val) operator(=) ident(GETARG)operator((\);) + pre_type(char) ident(c)operator(;) + + reserved(if) operator((!()ident(flags) operator(&) ident(FMINUS)operator(\)\)) + reserved(while) operator((--)ident(width) operator(>) integer(0)operator(\)) + ident(PUSH)operator(()string<delimiter(")content( )delimiter(")>operator(,) integer(1)operator(\);) + ident(c) operator(=) ident(NUM2INT)operator(()ident(val)operator(\)) operator(&) hex(0xff)operator(;) + ident(PUSH)operator((&)ident(c)operator(,) integer(1)operator(\);) + reserved(while) operator((--)ident(width) operator(>) integer(0)operator(\)) + ident(PUSH)operator(()string<delimiter(")content( )delimiter(")>operator(,) integer(1)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('s')operator(:) + reserved(case) char('p')operator(:) + operator({) + ident(VALUE) ident(arg) operator(=) ident(GETARG)operator((\);) + pre_type(long) ident(len)operator(;) + + reserved(if) operator((*)ident(p) operator(==) char('p')operator(\)) ident(arg) operator(=) ident(rb_inspect)operator(()ident(arg)operator(\);) + ident(str) operator(=) ident(rb_obj_as_string)operator(()ident(arg)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(str)operator(\)\)) ident(tainted) operator(=) integer(1)operator(;) + ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(flags)operator(&)ident(FPREC)operator(\)) operator({) + reserved(if) operator(()ident(prec) operator(<) ident(len)operator(\)) operator({) + ident(len) operator(=) ident(prec)operator(;) + operator(}) + operator(}) + comment(/* need to adjust multi-byte string pos */) + reserved(if) operator(()ident(flags)operator(&)ident(FWIDTH)operator(\)) operator({) + reserved(if) operator(()ident(width) operator(>) ident(len)operator(\)) operator({) + ident(CHECK)operator(()ident(width)operator(\);) + ident(width) operator(-=) ident(len)operator(;) + reserved(if) operator((!()ident(flags)operator(&)ident(FMINUS)operator(\)\)) operator({) + reserved(while) operator(()ident(width)operator(--\)) operator({) + ident(buf)operator([)ident(blen)operator(++]) operator(=) char(' ')operator(;) + operator(}) + operator(}) + ident(memcpy)operator((&)ident(buf)operator([)ident(blen)operator(],) ident(RSTRING_PTR)operator(()ident(str)operator(\),) ident(len)operator(\);) + ident(blen) operator(+=) ident(len)operator(;) + reserved(if) operator(()ident(flags)operator(&)ident(FMINUS)operator(\)) operator({) + reserved(while) operator(()ident(width)operator(--\)) operator({) + ident(buf)operator([)ident(blen)operator(++]) operator(=) char(' ')operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + operator(}) + operator(}) + ident(PUSH)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) char('d')operator(:) + reserved(case) char('i')operator(:) + reserved(case) char('o')operator(:) + reserved(case) char('x')operator(:) + reserved(case) char('X')operator(:) + reserved(case) char('b')operator(:) + reserved(case) char('B')operator(:) + reserved(case) char('u')operator(:) + operator({) + directive(volatile) ident(VALUE) ident(val) operator(=) ident(GETARG)operator((\);) + pre_type(char) ident(fbuf)operator([)integer(32)operator(],) ident(nbuf)operator([)integer(64)operator(],) operator(*)ident(s)operator(,) operator(*)ident(t)operator(;) + directive(const) pre_type(char) operator(*)ident(prefix) operator(=) integer(0)operator(;) + pre_type(int) ident(sign) operator(=) integer(0)operator(;) + pre_type(char) ident(sc) operator(=) integer(0)operator(;) + pre_type(long) ident(v) operator(=) integer(0)operator(;) + pre_type(int) ident(base)operator(,) ident(bignum) operator(=) integer(0)operator(;) + pre_type(int) ident(len)operator(,) ident(pos)operator(;) + directive(volatile) ident(VALUE) ident(tmp)operator(;) + directive(volatile) ident(VALUE) ident(tmp1)operator(;) + + reserved(switch) operator((*)ident(p)operator(\)) operator({) + reserved(case) char('d')operator(:) + reserved(case) char('i')operator(:) + ident(sign) operator(=) integer(1)operator(;) reserved(break)operator(;) + reserved(case) char('o')operator(:) + reserved(case) char('x')operator(:) + reserved(case) char('X')operator(:) + reserved(case) char('b')operator(:) + reserved(case) char('B')operator(:) + reserved(case) char('u')operator(:) + reserved(default)operator(:) + reserved(if) operator(()ident(flags)operator(&()ident(FPLUS)operator(|)ident(FSPACE)operator(\)\)) ident(sign) operator(=) integer(1)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(flags) operator(&) ident(FSHARP)operator(\)) operator({) + reserved(switch) operator((*)ident(p)operator(\)) operator({) + reserved(case) char('o')operator(:) + ident(prefix) operator(=) string<delimiter(")content(0)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) char('x')operator(:) + ident(prefix) operator(=) string<delimiter(")content(0x)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) char('X')operator(:) + ident(prefix) operator(=) string<delimiter(")content(0X)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) char('b')operator(:) + ident(prefix) operator(=) string<delimiter(")content(0b)delimiter(")>operator(;) reserved(break)operator(;) + reserved(case) char('B')operator(:) + ident(prefix) operator(=) string<delimiter(")content(0B)delimiter(")>operator(;) reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(prefix)operator(\)) operator({) + ident(width) operator(-=) ident(strlen)operator(()ident(prefix)operator(\);) + operator(}) + operator(}) + + label(bin_retry)operator(:) + reserved(switch) operator(()ident(TYPE)operator(()ident(val)operator(\)\)) operator({) + reserved(case) label(T_FLOAT)operator(:) + ident(val) operator(=) ident(rb_dbl2big)operator(()ident(RFLOAT)operator(()ident(val)operator(\)->)ident(value)operator(\);) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(val)operator(\)\)) reserved(goto) ident(bin_retry)operator(;) + ident(bignum) operator(=) integer(1)operator(;) + reserved(break)operator(;) + reserved(case) label(T_STRING)operator(:) + ident(val) operator(=) ident(rb_str_to_inum)operator(()ident(val)operator(,) integer(0)operator(,) ident(Qtrue)operator(\);) + reserved(goto) ident(bin_retry)operator(;) + reserved(case) label(T_BIGNUM)operator(:) + ident(bignum) operator(=) integer(1)operator(;) + reserved(break)operator(;) + reserved(case) label(T_FIXNUM)operator(:) + ident(v) operator(=) ident(FIX2LONG)operator(()ident(val)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(val) operator(=) ident(rb_Integer)operator(()ident(val)operator(\);) + reserved(goto) ident(bin_retry)operator(;) + operator(}) + + reserved(switch) operator((*)ident(p)operator(\)) operator({) + reserved(case) char('o')operator(:) + ident(base) operator(=) integer(8)operator(;) reserved(break)operator(;) + reserved(case) char('x')operator(:) + reserved(case) char('X')operator(:) + ident(base) operator(=) integer(16)operator(;) reserved(break)operator(;) + reserved(case) char('b')operator(:) + reserved(case) char('B')operator(:) + ident(base) operator(=) integer(2)operator(;) reserved(break)operator(;) + reserved(case) char('u')operator(:) + reserved(case) char('d')operator(:) + reserved(case) char('i')operator(:) + reserved(default)operator(:) + ident(base) operator(=) integer(10)operator(;) reserved(break)operator(;) + operator(}) + + reserved(if) operator((!)ident(bignum)operator(\)) operator({) + reserved(if) operator(()ident(base) operator(==) integer(2)operator(\)) operator({) + ident(val) operator(=) ident(rb_int2big)operator(()ident(v)operator(\);) + reserved(goto) ident(bin_retry)operator(;) + operator(}) + reserved(if) operator(()ident(sign)operator(\)) operator({) + pre_type(char) ident(c) operator(=) operator(*)ident(p)operator(;) + reserved(if) operator(()ident(c) operator(==) char('i')operator(\)) ident(c) operator(=) char('d')operator(;) comment(/* %d and %i are identical */) + reserved(if) operator(()ident(v) operator(<) integer(0)operator(\)) operator({) + ident(v) operator(=) operator(-)ident(v)operator(;) + ident(sc) operator(=) char('-')operator(;) + ident(width)operator(--;) + operator(}) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FPLUS)operator(\)) operator({) + ident(sc) operator(=) char('+')operator(;) + ident(width)operator(--;) + operator(}) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FSPACE)operator(\)) operator({) + ident(sc) operator(=) char(' ')operator(;) + ident(width)operator(--;) + operator(}) + ident(sprintf)operator(()ident(fbuf)operator(,) string<delimiter(")content(%%l%c)delimiter(")>operator(,) ident(c)operator(\);) + ident(sprintf)operator(()ident(nbuf)operator(,) ident(fbuf)operator(,) ident(v)operator(\);) + ident(s) operator(=) ident(nbuf)operator(;) + reserved(goto) ident(format_integer)operator(;) + operator(}) + ident(s) operator(=) ident(nbuf)operator(;) + reserved(if) operator(()ident(v) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(base) operator(==) integer(10)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(negative number for %%u specifier)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!()ident(flags)operator(&()ident(FPREC)operator(|)ident(FZERO)operator(\)\)\)) operator({) + ident(strcpy)operator(()ident(s)operator(,) string<delimiter(")content(..)delimiter(")>operator(\);) + ident(s) operator(+=) integer(2)operator(;) + operator(}) + operator(}) + ident(sprintf)operator(()ident(fbuf)operator(,) string<delimiter(")content(%%l%c)delimiter(")>operator(,) operator(*)ident(p) operator(==) char('X') operator(?) char('x') operator(:) operator(*)ident(p)operator(\);) + ident(sprintf)operator(()ident(s)operator(,) ident(fbuf)operator(,) ident(v)operator(\);) + reserved(if) operator(()ident(v) operator(<) integer(0)operator(\)) operator({) + pre_type(char) ident(d) operator(=) integer(0)operator(;) + + ident(remove_sign_bits)operator(()ident(s)operator(,) ident(base)operator(\);) + reserved(switch) operator(()ident(base)operator(\)) operator({) + reserved(case) integer(16)operator(:) + ident(d) operator(=) char('f')operator(;) reserved(break)operator(;) + reserved(case) integer(8)operator(:) + ident(d) operator(=) char('7')operator(;) reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(d) operator(&&) operator(*)ident(s) operator(!=) ident(d)operator(\)) operator({) + ident(memmove)operator(()ident(s)operator(+)integer(1)operator(,) ident(s)operator(,) ident(strlen)operator(()ident(s)operator(\)+)integer(1)operator(\);) + operator(*)ident(s) operator(=) ident(d)operator(;) + operator(}) + operator(}) + ident(s) operator(=) ident(nbuf)operator(;) + reserved(goto) ident(format_integer)operator(;) + operator(}) + + reserved(if) operator(()ident(sign)operator(\)) operator({) + ident(tmp) operator(=) ident(rb_big2str)operator(()ident(val)operator(,) ident(base)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(s)operator([)integer(0)operator(]) operator(==) char('-')operator(\)) operator({) + ident(s)operator(++;) + ident(sc) operator(=) char('-')operator(;) + ident(width)operator(--;) + operator(}) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FPLUS)operator(\)) operator({) + ident(sc) operator(=) char('+')operator(;) + ident(width)operator(--;) + operator(}) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FSPACE)operator(\)) operator({) + ident(sc) operator(=) char(' ')operator(;) + ident(width)operator(--;) + operator(}) + reserved(goto) ident(format_integer)operator(;) + operator(}) + reserved(if) operator((!)ident(RBIGNUM)operator(()ident(val)operator(\)->)ident(sign)operator(\)) operator({) + ident(val) operator(=) ident(rb_big_clone)operator(()ident(val)operator(\);) + ident(rb_big_2comp)operator(()ident(val)operator(\);) + operator(}) + ident(tmp1) operator(=) ident(tmp) operator(=) ident(rb_big2str0)operator(()ident(val)operator(,) ident(base)operator(,) ident(RBIGNUM)operator(()ident(val)operator(\)->)ident(sign)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(;) + reserved(if) operator((*)ident(s) operator(==) char('-')operator(\)) operator({) + reserved(if) operator(()ident(base) operator(==) integer(10)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(negative number for %%u specifier)delimiter(")>operator(\);) + operator(}) + ident(remove_sign_bits)operator((++)ident(s)operator(,) ident(base)operator(\);) + ident(tmp) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) integer(3)operator(+)ident(strlen)operator(()ident(s)operator(\)\);) + ident(t) operator(=) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(;) + reserved(if) operator((!()ident(flags)operator(&()ident(FPREC)operator(|)ident(FZERO)operator(\)\)\)) operator({) + ident(strcpy)operator(()ident(t)operator(,) string<delimiter(")content(..)delimiter(")>operator(\);) + ident(t) operator(+=) integer(2)operator(;) + operator(}) + reserved(switch) operator(()ident(base)operator(\)) operator({) + reserved(case) integer(16)operator(:) + reserved(if) operator(()ident(s)operator([)integer(0)operator(]) operator(!=) char('f')operator(\)) ident(strcpy)operator(()ident(t)operator(++,) string<delimiter(")content(f)delimiter(")>operator(\);) reserved(break)operator(;) + reserved(case) integer(8)operator(:) + reserved(if) operator(()ident(s)operator([)integer(0)operator(]) operator(!=) char('7')operator(\)) ident(strcpy)operator(()ident(t)operator(++,) string<delimiter(")content(7)delimiter(")>operator(\);) reserved(break)operator(;) + reserved(case) integer(2)operator(:) + reserved(if) operator(()ident(s)operator([)integer(0)operator(]) operator(!=) char('1')operator(\)) ident(strcpy)operator(()ident(t)operator(++,) string<delimiter(")content(1)delimiter(")>operator(\);) reserved(break)operator(;) + operator(}) + ident(strcpy)operator(()ident(t)operator(,) ident(s)operator(\);) + ident(bignum) operator(=) integer(2)operator(;) + operator(}) + ident(s) operator(=) ident(RSTRING)operator(()ident(tmp)operator(\)->)ident(ptr)operator(;) + + label(format_integer)operator(:) + ident(pos) operator(=) operator(-)integer(1)operator(;) + ident(len) operator(=) ident(strlen)operator(()ident(s)operator(\);) + + reserved(if) operator((*)ident(p) operator(==) char('X')operator(\)) operator({) + pre_type(char) operator(*)ident(pp) operator(=) ident(s)operator(;) + reserved(while) operator((*)ident(pp)operator(\)) operator({) + operator(*)ident(pp) operator(=) ident(toupper)operator((*)ident(pp)operator(\);) + ident(pp)operator(++;) + operator(}) + operator(}) + reserved(if) operator((()ident(flags)operator(&()ident(FZERO)operator(|)ident(FPREC)operator(\)\)) operator(==) ident(FZERO)operator(\)) operator({) + ident(prec) operator(=) ident(width)operator(;) + ident(width) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(prec) operator(<) ident(len)operator(\)) ident(prec) operator(=) ident(len)operator(;) + ident(width) operator(-=) ident(prec)operator(;) + operator(}) + reserved(if) operator((!()ident(flags)operator(&)ident(FMINUS)operator(\)\)) operator({) + ident(CHECK)operator(()ident(width)operator(\);) + reserved(while) operator(()ident(width)operator(--) operator(>) integer(0)operator(\)) operator({) + ident(buf)operator([)ident(blen)operator(++]) operator(=) char(' ')operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(sc)operator(\)) ident(PUSH)operator((&)ident(sc)operator(,) integer(1)operator(\);) + reserved(if) operator(()ident(prefix)operator(\)) operator({) + pre_type(int) ident(plen) operator(=) ident(strlen)operator(()ident(prefix)operator(\);) + ident(PUSH)operator(()ident(prefix)operator(,) ident(plen)operator(\);) + operator(}) + ident(CHECK)operator(()ident(prec) operator(-) ident(len)operator(\);) + reserved(if) operator((!)ident(bignum) operator(&&) ident(v) operator(<) integer(0)operator(\)) operator({) + pre_type(char) ident(c) operator(=) ident(sign_bits)operator(()ident(base)operator(,) ident(p)operator(\);) + reserved(while) operator(()ident(len) operator(<) ident(prec)operator(--\)) operator({) + ident(buf)operator([)ident(blen)operator(++]) operator(=) ident(c)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + pre_type(char) ident(c)operator(;) + + reserved(if) operator((!)ident(sign) operator(&&) ident(bignum) operator(&&) operator(!)ident(RBIGNUM)operator(()ident(val)operator(\)->)ident(sign)operator(\)) + ident(c) operator(=) ident(sign_bits)operator(()ident(base)operator(,) ident(p)operator(\);) + reserved(else) + ident(c) operator(=) char('0')operator(;) + reserved(while) operator(()ident(len) operator(<) ident(prec)operator(--\)) operator({) + ident(buf)operator([)ident(blen)operator(++]) operator(=) ident(c)operator(;) + operator(}) + operator(}) + ident(PUSH)operator(()ident(s)operator(,) ident(len)operator(\);) + ident(CHECK)operator(()ident(width)operator(\);) + reserved(while) operator(()ident(width)operator(--) operator(>) integer(0)operator(\)) operator({) + ident(buf)operator([)ident(blen)operator(++]) operator(=) char(' ')operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(case) char('f')operator(:) + reserved(case) char('g')operator(:) + reserved(case) char('G')operator(:) + reserved(case) char('e')operator(:) + reserved(case) char('E')operator(:) + operator({) + ident(VALUE) ident(val) operator(=) ident(GETARG)operator((\);) + pre_type(double) ident(fval)operator(;) + pre_type(int) ident(i)operator(,) ident(need) operator(=) integer(6)operator(;) + pre_type(char) ident(fbuf)operator([)integer(32)operator(];) + + ident(fval) operator(=) ident(RFLOAT)operator(()ident(rb_Float)operator(()ident(val)operator(\)\)->)ident(value)operator(;) +preprocessor(#if) ident(defined)operator(()ident(_WIN32)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__BORLANDC__)operator(\)) + reserved(if) operator(()ident(isnan)operator(()ident(fval)operator(\)) operator(||) ident(isinf)operator(()ident(fval)operator(\)\)) operator({) + pre_type(char) operator(*)ident(expr)operator(;) + + reserved(if) operator(()ident(isnan)operator(()ident(fval)operator(\)\)) operator({) + ident(expr) operator(=) string<delimiter(")content(NaN)delimiter(")>operator(;) + operator(}) + reserved(else) operator({) + ident(expr) operator(=) string<delimiter(")content(Inf)delimiter(")>operator(;) + operator(}) + ident(need) operator(=) ident(strlen)operator(()ident(expr)operator(\);) + reserved(if) operator(((!)ident(isnan)operator(()ident(fval)operator(\)) operator(&&) ident(fval) operator(<) float(0)float(.0)operator(\)) operator(||) operator(()ident(flags) operator(&) ident(FPLUS)operator(\)\)) + ident(need)operator(++;) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FSPACE)operator(\)) + ident(need)operator(++;) + reserved(if) operator((()ident(flags) operator(&) ident(FWIDTH)operator(\)) operator(&&) ident(need) operator(<) ident(width)operator(\)) + ident(need) operator(=) ident(width)operator(;) + + ident(CHECK)operator(()ident(need)operator(\);) + ident(sprintf)operator((&)ident(buf)operator([)ident(blen)operator(],) string<delimiter(")content(%*s)delimiter(")>operator(,) ident(need)operator(,) string<delimiter(")delimiter(")>operator(\);) + reserved(if) operator(()ident(flags) operator(&) ident(FMINUS)operator(\)) operator({) + reserved(if) operator((!)ident(isnan)operator(()ident(fval)operator(\)) operator(&&) ident(fval) operator(<) float(0)float(.0)operator(\)) + ident(buf)operator([)ident(blen)operator(++]) operator(=) char('-')operator(;) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FPLUS)operator(\)) + ident(buf)operator([)ident(blen)operator(++]) operator(=) char('+')operator(;) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FSPACE)operator(\)) + ident(blen)operator(++;) + ident(strncpy)operator((&)ident(buf)operator([)ident(blen)operator(],) ident(expr)operator(,) ident(strlen)operator(()ident(expr)operator(\)\);) + operator(}) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FZERO)operator(\)) operator({) + reserved(if) operator((!)ident(isnan)operator(()ident(fval)operator(\)) operator(&&) ident(fval) operator(<) float(0)float(.0)operator(\)) operator({) + ident(buf)operator([)ident(blen)operator(++]) operator(=) char('-')operator(;) + ident(need)operator(--;) + operator(}) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FPLUS)operator(\)) operator({) + ident(buf)operator([)ident(blen)operator(++]) operator(=) char('+')operator(;) + ident(need)operator(--;) + operator(}) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FSPACE)operator(\)) operator({) + ident(blen)operator(++;) + ident(need)operator(--;) + operator(}) + reserved(while) operator(()ident(need)operator(--) operator(-) ident(strlen)operator(()ident(expr)operator(\)) operator(>) integer(0)operator(\)) operator({) + ident(buf)operator([)ident(blen)operator(++]) operator(=) char('0')operator(;) + operator(}) + ident(strncpy)operator((&)ident(buf)operator([)ident(blen)operator(],) ident(expr)operator(,) ident(strlen)operator(()ident(expr)operator(\)\);) + operator(}) + reserved(else) operator({) + reserved(if) operator((!)ident(isnan)operator(()ident(fval)operator(\)) operator(&&) ident(fval) operator(<) float(0)float(.0)operator(\)) + ident(buf)operator([)ident(blen) operator(+) ident(need) operator(-) ident(strlen)operator(()ident(expr)operator(\)) operator(-) integer(1)operator(]) operator(=) char('-')operator(;) + reserved(else) reserved(if) operator(()ident(flags) operator(&) ident(FPLUS)operator(\)) + ident(buf)operator([)ident(blen) operator(+) ident(need) operator(-) ident(strlen)operator(()ident(expr)operator(\)) operator(-) integer(1)operator(]) operator(=) char('+')operator(;) + ident(strncpy)operator((&)ident(buf)operator([)ident(blen) operator(+) ident(need) operator(-) ident(strlen)operator(()ident(expr)operator(\)],) ident(expr)operator(,) + ident(strlen)operator(()ident(expr)operator(\)\);) + operator(}) + ident(blen) operator(+=) ident(strlen)operator((&)ident(buf)operator([)ident(blen)operator(]\);) + reserved(break)operator(;) + operator(}) +preprocessor(#endif) comment(/* defined(_WIN32\) && !defined(__BORLANDC__\) */) + ident(fmt_setup)operator(()ident(fbuf)operator(,) operator(*)ident(p)operator(,) ident(flags)operator(,) ident(width)operator(,) ident(prec)operator(\);) + ident(need) operator(=) integer(0)operator(;) + reserved(if) operator((*)ident(p) operator(!=) char('e') operator(&&) operator(*)ident(p) operator(!=) char('E')operator(\)) operator({) + ident(i) operator(=) ident(INT_MIN)operator(;) + ident(frexp)operator(()ident(fval)operator(,) operator(&)ident(i)operator(\);) + reserved(if) operator(()ident(i) operator(>) integer(0)operator(\)) + ident(need) operator(=) ident(BIT_DIGITS)operator(()ident(i)operator(\);) + operator(}) + ident(need) operator(+=) operator(()ident(flags)operator(&)ident(FPREC)operator(\)) operator(?) ident(prec) operator(:) integer(6)operator(;) + reserved(if) operator((()ident(flags)operator(&)ident(FWIDTH)operator(\)) operator(&&) ident(need) operator(<) ident(width)operator(\)) + ident(need) operator(=) ident(width)operator(;) + ident(need) operator(+=) integer(20)operator(;) + + ident(CHECK)operator(()ident(need)operator(\);) + ident(sprintf)operator((&)ident(buf)operator([)ident(blen)operator(],) ident(fbuf)operator(,) ident(fval)operator(\);) + ident(blen) operator(+=) ident(strlen)operator((&)ident(buf)operator([)ident(blen)operator(]\);) + operator(}) + reserved(break)operator(;) + operator(}) + ident(flags) operator(=) ident(FNONE)operator(;) + operator(}) + + label(sprint_exit)operator(:) + comment(/* XXX - We cannot validiate the number of arguments if (digit\)$ style used. + */) + reserved(if) operator(()ident(posarg) operator(>=) integer(0) operator(&&) ident(nextarg) operator(<) ident(argc)operator(\)) operator({) + directive(const) pre_type(char) operator(*)ident(mesg) operator(=) string<delimiter(")content(too many arguments for format string)delimiter(")>operator(;) + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_debug)operator(\)\)) ident(rb_raise)operator(()ident(rb_eArgError)operator(,) ident(mesg)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)) ident(rb_warn)operator(()ident(mesg)operator(\);) + operator(}) + ident(rb_str_resize)operator(()ident(result)operator(,) ident(blen)operator(\);) + + reserved(if) operator(()ident(tainted)operator(\)) ident(OBJ_TAINT)operator(()ident(result)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) directive(void) +ident(fmt_setup)operator(()ident(buf)operator(,) ident(c)operator(,) ident(flags)operator(,) ident(width)operator(,) ident(prec)operator(\)) + pre_type(char) operator(*)ident(buf)operator(;) + pre_type(int) ident(c)operator(;) + pre_type(int) ident(flags)operator(,) ident(width)operator(,) ident(prec)operator(;) +operator({) + operator(*)ident(buf)operator(++) operator(=) char('%')operator(;) + reserved(if) operator(()ident(flags) operator(&) ident(FSHARP)operator(\)) operator(*)ident(buf)operator(++) operator(=) char('#')operator(;) + reserved(if) operator(()ident(flags) operator(&) ident(FPLUS)operator(\)) operator(*)ident(buf)operator(++) operator(=) char('+')operator(;) + reserved(if) operator(()ident(flags) operator(&) ident(FMINUS)operator(\)) operator(*)ident(buf)operator(++) operator(=) char('-')operator(;) + reserved(if) operator(()ident(flags) operator(&) ident(FZERO)operator(\)) operator(*)ident(buf)operator(++) operator(=) char('0')operator(;) + reserved(if) operator(()ident(flags) operator(&) ident(FSPACE)operator(\)) operator(*)ident(buf)operator(++) operator(=) char(' ')operator(;) + + reserved(if) operator(()ident(flags) operator(&) ident(FWIDTH)operator(\)) operator({) + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(%d)delimiter(")>operator(,) ident(width)operator(\);) + ident(buf) operator(+=) ident(strlen)operator(()ident(buf)operator(\);) + operator(}) + + reserved(if) operator(()ident(flags) operator(&) ident(FPREC)operator(\)) operator({) + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content(.%d)delimiter(")>operator(,) ident(prec)operator(\);) + ident(buf) operator(+=) ident(strlen)operator(()ident(buf)operator(\);) + operator(}) + + operator(*)ident(buf)operator(++) operator(=) ident(c)operator(;) + operator(*)ident(buf) operator(=) char('\\0')operator(;) +operator(}) +comment(/* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */) + +comment(/* static char sccsid[] = "@(#\) st.c 5.1 89/12/14 Crucible"; */) + +preprocessor(#include) include("config.h") +preprocessor(#include) include("defines.h") +preprocessor(#include) include(<stdio.h>) +preprocessor(#ifdef) ident(HAVE_STDLIB_H) +preprocessor(#include) include(<stdlib.h>) +preprocessor(#endif) +preprocessor(#include) include(<string.h>) +preprocessor(#include) include("st.h") + +reserved(typedef) reserved(struct) ident(st_table_entry) ident(st_table_entry)operator(;) + +reserved(struct) ident(st_table_entry) operator({) + pre_type(unsigned) pre_type(int) ident(hash)operator(;) + ident(st_data_t) ident(key)operator(;) + ident(st_data_t) ident(record)operator(;) + ident(st_table_entry) operator(*)ident(next)operator(;) +operator(};) + +preprocessor(#define) ident(ST_DEFAULT_MAX_DENSITY) integer(5) +preprocessor(#define) ident(ST_DEFAULT_INIT_TABLE_SIZE) integer(11) + + comment(/* + * DEFAULT_MAX_DENSITY is the default for the largest we allow the + * average number of items per bin before increasing the number of + * bins + * + * DEFAULT_INIT_TABLE_SIZE is the default for the number of bins + * allocated initially + * + */) +directive(static) pre_type(int) ident(numcmp)operator(()pre_type(long)operator(,) pre_type(long)operator(\);) +directive(static) pre_type(int) ident(numhash)operator(()pre_type(long)operator(\);) +directive(static) reserved(struct) ident(st_hash_type) ident(type_numhash) operator(=) operator({) + ident(numcmp)operator(,) + ident(numhash)operator(,) +operator(};) + +comment(/* extern int strcmp(const char *, const char *\); */) +directive(static) pre_type(int) ident(strhash)operator(()directive(const) pre_type(char) operator(*\);) +directive(static) reserved(struct) ident(st_hash_type) ident(type_strhash) operator(=) operator({) + ident(strcmp)operator(,) + ident(strhash)operator(,) +operator(};) + +directive(static) directive(void) ident(rehash)operator(()ident(st_table) operator(*\);) + +preprocessor(#ifdef) ident(RUBY) +preprocessor(#define) ident(malloc) ident(xmalloc) +preprocessor(#define) ident(calloc) ident(xcalloc) +preprocessor(#endif) + +preprocessor(#define) ident(alloc)operator(()ident(type)operator(\)) operator(()ident(type)operator(*\))ident(malloc)operator((()pre_type(unsigned)operator(\))reserved(sizeof)operator(()ident(type)operator(\)\)) +preprocessor(#define) ident(Calloc)operator(()ident(n)operator(,)ident(s)operator(\)) operator(()pre_type(char)operator(*\))ident(calloc)operator((()ident(n)operator(\),()ident(s)operator(\)\)) + +preprocessor(#define) ident(EQUAL)operator(()ident(table)operator(,)ident(x)operator(,)ident(y)operator(\)) operator((()ident(x)operator(\)==()ident(y)operator(\)) operator(||) operator((*)ident(table)operator(->)ident(type)operator(->)ident(compare)operator(\)(()ident(x)operator(\),()ident(y)operator(\)\)) operator(==) integer(0)operator(\)) + +preprocessor(#define) ident(do_hash)operator(()ident(key)operator(,)ident(table)operator(\)) operator(()pre_type(unsigned) pre_type(int)operator(\)(*()ident(table)operator(\)->)ident(type)operator(->)ident(hash)operator(\)(()ident(key)operator(\)\)) +preprocessor(#define) ident(do_hash_bin)operator(()ident(key)operator(,)ident(table)operator(\)) operator(()ident(do_hash)operator(()ident(key)operator(,) ident(table)operator(\)%()ident(table)operator(\)->)ident(num_bins)operator(\)) + +comment(/* + * MINSIZE is the minimum size of a dictionary. + */) + +preprocessor(#define) ident(MINSIZE) integer(8) + +comment(/* +Table of prime numbers 2^n+a, 2<=n<=30. +*/) +directive(static) pre_type(long) ident(primes)operator([]) operator(=) operator({) + integer(8) operator(+) integer(3)operator(,) + integer(16) operator(+) integer(3)operator(,) + integer(32) operator(+) integer(5)operator(,) + integer(64) operator(+) integer(3)operator(,) + integer(128) operator(+) integer(3)operator(,) + integer(256) operator(+) integer(27)operator(,) + integer(512) operator(+) integer(9)operator(,) + integer(1024) operator(+) integer(9)operator(,) + integer(2048) operator(+) integer(5)operator(,) + integer(4096) operator(+) integer(3)operator(,) + integer(8192) operator(+) integer(27)operator(,) + integer(16384) operator(+) integer(43)operator(,) + integer(32768) operator(+) integer(3)operator(,) + integer(65536) operator(+) integer(45)operator(,) + integer(131072) operator(+) integer(29)operator(,) + integer(262144) operator(+) integer(3)operator(,) + integer(524288) operator(+) integer(21)operator(,) + integer(1048576) operator(+) integer(7)operator(,) + integer(2097152) operator(+) integer(17)operator(,) + integer(4194304) operator(+) integer(15)operator(,) + integer(8388608) operator(+) integer(9)operator(,) + integer(16777216) operator(+) integer(43)operator(,) + integer(33554432) operator(+) integer(35)operator(,) + integer(67108864) operator(+) integer(15)operator(,) + integer(134217728) operator(+) integer(29)operator(,) + integer(268435456) operator(+) integer(3)operator(,) + integer(536870912) operator(+) integer(11)operator(,) + integer(1073741824) operator(+) integer(85)operator(,) + integer(0) +operator(};) + +directive(static) pre_type(int) +ident(new_size)operator(()ident(size)operator(\)) + pre_type(int) ident(size)operator(;) +operator({) + pre_type(int) ident(i)operator(;) + +comment(#if 0 + for (i=3; i<31; i++\) { + if ((1<<i\) > size\) return 1<<i; + } + return -1; +#else) + pre_type(int) ident(newsize)operator(;) + + reserved(for) operator(()ident(i) operator(=) integer(0)operator(,) ident(newsize) operator(=) ident(MINSIZE)operator(;) + ident(i) operator(<) reserved(sizeof)operator(()ident(primes)operator(\))operator(/)reserved(sizeof)operator(()ident(primes)operator([)integer(0)operator(]\);) + ident(i)operator(++,) ident(newsize) operator(<<=) integer(1)operator(\)) + operator({) + reserved(if) operator(()ident(newsize) operator(>) ident(size)operator(\)) reserved(return) ident(primes)operator([)ident(i)operator(];) + operator(}) + comment(/* Ran out of polynomials */) + reserved(return) operator(-)integer(1)operator(;) comment(/* should raise exception */) +preprocessor(#endif) +operator(}) + +preprocessor(#ifdef) ident(HASH_LOG) +directive(static) pre_type(int) ident(collision) operator(=) integer(0)operator(;) +directive(static) pre_type(int) ident(init_st) operator(=) integer(0)operator(;) + +directive(static) directive(void) +ident(stat_col)operator((\)) +operator({) + ident(FILE) operator(*)ident(f) operator(=) ident(fopen)operator(()string<delimiter(")content(/tmp/col)delimiter(")>operator(,) string<delimiter(")content(w)delimiter(")>operator(\);) + ident(fprintf)operator(()ident(f)operator(,) string<delimiter(")content(collision: %d)char(\\n)delimiter(")>operator(,) ident(collision)operator(\);) + ident(fclose)operator(()ident(f)operator(\);) +operator(}) +preprocessor(#endif) + +ident(st_table)operator(*) +ident(st_init_table_with_size)operator(()ident(type)operator(,) ident(size)operator(\)) + reserved(struct) ident(st_hash_type) operator(*)ident(type)operator(;) + pre_type(int) ident(size)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + +preprocessor(#ifdef) ident(HASH_LOG) + reserved(if) operator(()ident(init_st) operator(==) integer(0)operator(\)) operator({) + ident(init_st) operator(=) integer(1)operator(;) + ident(atexit)operator(()ident(stat_col)operator(\);) + operator(}) +preprocessor(#endif) + + ident(size) operator(=) ident(new_size)operator(()ident(size)operator(\);) comment(/* round up to prime number */) + + ident(tbl) operator(=) ident(alloc)operator(()ident(st_table)operator(\);) + ident(tbl)operator(->)ident(type) operator(=) ident(type)operator(;) + ident(tbl)operator(->)ident(num_entries) operator(=) integer(0)operator(;) + ident(tbl)operator(->)ident(num_bins) operator(=) ident(size)operator(;) + ident(tbl)operator(->)ident(bins) operator(=) operator(()ident(st_table_entry) operator(**\))ident(Calloc)operator(()ident(size)operator(,) reserved(sizeof)operator(()ident(st_table_entry)operator(*\)\);) + + reserved(return) ident(tbl)operator(;) +operator(}) + +ident(st_table)operator(*) +ident(st_init_table)operator(()ident(type)operator(\)) + reserved(struct) ident(st_hash_type) operator(*)ident(type)operator(;) +operator({) + reserved(return) ident(st_init_table_with_size)operator(()ident(type)operator(,) integer(0)operator(\);) +operator(}) + +ident(st_table)operator(*) +ident(st_init_numtable)operator(()directive(void)operator(\)) +operator({) + reserved(return) ident(st_init_table)operator((&)ident(type_numhash)operator(\);) +operator(}) + +ident(st_table)operator(*) +ident(st_init_numtable_with_size)operator(()ident(size)operator(\)) + pre_type(int) ident(size)operator(;) +operator({) + reserved(return) ident(st_init_table_with_size)operator((&)ident(type_numhash)operator(,) ident(size)operator(\);) +operator(}) + +ident(st_table)operator(*) +ident(st_init_strtable)operator(()directive(void)operator(\)) +operator({) + reserved(return) ident(st_init_table)operator((&)ident(type_strhash)operator(\);) +operator(}) + +ident(st_table)operator(*) +ident(st_init_strtable_with_size)operator(()ident(size)operator(\)) + pre_type(int) ident(size)operator(;) +operator({) + reserved(return) ident(st_init_table_with_size)operator((&)ident(type_strhash)operator(,) ident(size)operator(\);) +operator(}) + +directive(void) +ident(st_free_table)operator(()ident(table)operator(\)) + ident(st_table) operator(*)ident(table)operator(;) +operator({) + directive(register) ident(st_table_entry) operator(*)ident(ptr)operator(,) operator(*)ident(next)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(for)operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(table)operator(->)ident(num_bins)operator(;) ident(i)operator(++\)) operator({) + ident(ptr) operator(=) ident(table)operator(->)ident(bins)operator([)ident(i)operator(];) + reserved(while) operator(()ident(ptr) operator(!=) integer(0)operator(\)) operator({) + ident(next) operator(=) ident(ptr)operator(->)ident(next)operator(;) + ident(free)operator(()ident(ptr)operator(\);) + ident(ptr) operator(=) ident(next)operator(;) + operator(}) + operator(}) + ident(free)operator(()ident(table)operator(->)ident(bins)operator(\);) + ident(free)operator(()ident(table)operator(\);) +operator(}) + +preprocessor(#define) ident(PTR_NOT_EQUAL)operator(()ident(table)operator(,) ident(ptr)operator(,) ident(hash_val)operator(,) ident(key)operator(\)) \ +operator((()ident(ptr)operator(\)) operator(!=) integer(0) operator(&&) operator(()ident(ptr)operator(->)ident(hash) operator(!=) operator(()ident(hash_val)operator(\)) operator(||) operator(!)ident(EQUAL)operator((()ident(table)operator(\),) operator(()ident(key)operator(\),) operator(()ident(ptr)operator(\)->)ident(key)operator(\)\)\)) + +preprocessor(#ifdef) ident(HASH_LOG) +preprocessor(#define) ident(COLLISION) ident(collision)operator(++) +preprocessor(#else) +preprocessor(#define) ident(COLLISION) +preprocessor(#endif) + +preprocessor(#define) ident(FIND_ENTRY)operator(()ident(table)operator(,) ident(ptr)operator(,) ident(hash_val)operator(,) ident(bin_pos)operator(\)) reserved(do) operator({)\ + ident(bin_pos) operator(=) ident(hash_val)operator(%()ident(table)operator(\)->)ident(num_bins)operator(;)\ + ident(ptr) operator(=) operator(()ident(table)operator(\)->)ident(bins)operator([)ident(bin_pos)operator(];)\ + reserved(if) operator(()ident(PTR_NOT_EQUAL)operator(()ident(table)operator(,) ident(ptr)operator(,) ident(hash_val)operator(,) ident(key)operator(\)\)) operator({)\ + ident(COLLISION)operator(;)\ + reserved(while) operator(()ident(PTR_NOT_EQUAL)operator(()ident(table)operator(,) ident(ptr)operator(->)ident(next)operator(,) ident(hash_val)operator(,) ident(key)operator(\)\)) operator({)\ + ident(ptr) operator(=) ident(ptr)operator(->)ident(next)operator(;)\ + operator(})\ + ident(ptr) operator(=) ident(ptr)operator(->)ident(next)operator(;)\ + operator(})\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +pre_type(int) +ident(st_lookup)operator(()ident(table)operator(,) ident(key)operator(,) ident(value)operator(\)) + ident(st_table) operator(*)ident(table)operator(;) + directive(register) ident(st_data_t) ident(key)operator(;) + ident(st_data_t) operator(*)ident(value)operator(;) +operator({) + pre_type(unsigned) pre_type(int) ident(hash_val)operator(,) ident(bin_pos)operator(;) + directive(register) ident(st_table_entry) operator(*)ident(ptr)operator(;) + + ident(hash_val) operator(=) ident(do_hash)operator(()ident(key)operator(,) ident(table)operator(\);) + ident(FIND_ENTRY)operator(()ident(table)operator(,) ident(ptr)operator(,) ident(hash_val)operator(,) ident(bin_pos)operator(\);) + + reserved(if) operator(()ident(ptr) operator(==) integer(0)operator(\)) operator({) + reserved(return) integer(0)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(value) operator(!=) integer(0)operator(\)) operator(*)ident(value) operator(=) ident(ptr)operator(->)ident(record)operator(;) + reserved(return) integer(1)operator(;) + operator(}) +operator(}) + +preprocessor(#define) ident(ADD_DIRECT)operator(()ident(table)operator(,) ident(key)operator(,) ident(value)operator(,) ident(hash_val)operator(,) ident(bin_pos)operator(\))\ +reserved(do) operator({)\ + ident(st_table_entry) operator(*)ident(entry)operator(;)\ + reserved(if) operator(()ident(table)operator(->)ident(num_entries)operator(/)operator(()ident(table)operator(->)ident(num_bins)operator(\)) operator(>) ident(ST_DEFAULT_MAX_DENSITY)operator(\)) operator({)\ + ident(rehash)operator(()ident(table)operator(\);)\ + ident(bin_pos) operator(=) ident(hash_val) operator(%) ident(table)operator(->)ident(num_bins)operator(;)\ + operator(})\ + \ + ident(entry) operator(=) ident(alloc)operator(()ident(st_table_entry)operator(\);)\ + \ + ident(entry)operator(->)ident(hash) operator(=) ident(hash_val)operator(;)\ + ident(entry)operator(->)ident(key) operator(=) ident(key)operator(;)\ + ident(entry)operator(->)ident(record) operator(=) ident(value)operator(;)\ + ident(entry)operator(->)ident(next) operator(=) ident(table)operator(->)ident(bins)operator([)ident(bin_pos)operator(];)\ + ident(table)operator(->)ident(bins)operator([)ident(bin_pos)operator(]) operator(=) ident(entry)operator(;)\ + ident(table)operator(->)ident(num_entries)operator(++;)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +pre_type(int) +ident(st_insert)operator(()ident(table)operator(,) ident(key)operator(,) ident(value)operator(\)) + directive(register) ident(st_table) operator(*)ident(table)operator(;) + directive(register) ident(st_data_t) ident(key)operator(;) + ident(st_data_t) ident(value)operator(;) +operator({) + pre_type(unsigned) pre_type(int) ident(hash_val)operator(,) ident(bin_pos)operator(;) + directive(register) ident(st_table_entry) operator(*)ident(ptr)operator(;) + + ident(hash_val) operator(=) ident(do_hash)operator(()ident(key)operator(,) ident(table)operator(\);) + ident(FIND_ENTRY)operator(()ident(table)operator(,) ident(ptr)operator(,) ident(hash_val)operator(,) ident(bin_pos)operator(\);) + + reserved(if) operator(()ident(ptr) operator(==) integer(0)operator(\)) operator({) + ident(ADD_DIRECT)operator(()ident(table)operator(,) ident(key)operator(,) ident(value)operator(,) ident(hash_val)operator(,) ident(bin_pos)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(ptr)operator(->)ident(record) operator(=) ident(value)operator(;) + reserved(return) integer(1)operator(;) + operator(}) +operator(}) + +directive(void) +ident(st_add_direct)operator(()ident(table)operator(,) ident(key)operator(,) ident(value)operator(\)) + ident(st_table) operator(*)ident(table)operator(;) + ident(st_data_t) ident(key)operator(;) + ident(st_data_t) ident(value)operator(;) +operator({) + pre_type(unsigned) pre_type(int) ident(hash_val)operator(,) ident(bin_pos)operator(;) + + ident(hash_val) operator(=) ident(do_hash)operator(()ident(key)operator(,) ident(table)operator(\);) + ident(bin_pos) operator(=) ident(hash_val) operator(%) ident(table)operator(->)ident(num_bins)operator(;) + ident(ADD_DIRECT)operator(()ident(table)operator(,) ident(key)operator(,) ident(value)operator(,) ident(hash_val)operator(,) ident(bin_pos)operator(\);) +operator(}) + +directive(static) directive(void) +ident(rehash)operator(()ident(table)operator(\)) + directive(register) ident(st_table) operator(*)ident(table)operator(;) +operator({) + directive(register) ident(st_table_entry) operator(*)ident(ptr)operator(,) operator(*)ident(next)operator(,) operator(**)ident(new_bins)operator(;) + pre_type(int) ident(i)operator(,) ident(old_num_bins) operator(=) ident(table)operator(->)ident(num_bins)operator(,) ident(new_num_bins)operator(;) + pre_type(unsigned) pre_type(int) ident(hash_val)operator(;) + + ident(new_num_bins) operator(=) ident(new_size)operator(()ident(old_num_bins)operator(+)integer(1)operator(\);) + ident(new_bins) operator(=) operator(()ident(st_table_entry)operator(**\))ident(Calloc)operator(()ident(new_num_bins)operator(,) reserved(sizeof)operator(()ident(st_table_entry)operator(*\)\);) + + reserved(for)operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(old_num_bins)operator(;) ident(i)operator(++\)) operator({) + ident(ptr) operator(=) ident(table)operator(->)ident(bins)operator([)ident(i)operator(];) + reserved(while) operator(()ident(ptr) operator(!=) integer(0)operator(\)) operator({) + ident(next) operator(=) ident(ptr)operator(->)ident(next)operator(;) + ident(hash_val) operator(=) ident(ptr)operator(->)ident(hash) operator(%) ident(new_num_bins)operator(;) + ident(ptr)operator(->)ident(next) operator(=) ident(new_bins)operator([)ident(hash_val)operator(];) + ident(new_bins)operator([)ident(hash_val)operator(]) operator(=) ident(ptr)operator(;) + ident(ptr) operator(=) ident(next)operator(;) + operator(}) + operator(}) + ident(free)operator(()ident(table)operator(->)ident(bins)operator(\);) + ident(table)operator(->)ident(num_bins) operator(=) ident(new_num_bins)operator(;) + ident(table)operator(->)ident(bins) operator(=) ident(new_bins)operator(;) +operator(}) + +ident(st_table)operator(*) +ident(st_copy)operator(()ident(old_table)operator(\)) + ident(st_table) operator(*)ident(old_table)operator(;) +operator({) + ident(st_table) operator(*)ident(new_table)operator(;) + ident(st_table_entry) operator(*)ident(ptr)operator(,) operator(*)ident(entry)operator(;) + pre_type(int) ident(i)operator(,) ident(num_bins) operator(=) ident(old_table)operator(->)ident(num_bins)operator(;) + + ident(new_table) operator(=) ident(alloc)operator(()ident(st_table)operator(\);) + reserved(if) operator(()ident(new_table) operator(==) integer(0)operator(\)) operator({) + reserved(return) integer(0)operator(;) + operator(}) + + operator(*)ident(new_table) operator(=) operator(*)ident(old_table)operator(;) + ident(new_table)operator(->)ident(bins) operator(=) operator(()ident(st_table_entry)operator(**\)) + ident(Calloc)operator((()pre_type(unsigned)operator(\))ident(num_bins)operator(,) reserved(sizeof)operator(()ident(st_table_entry)operator(*\)\);) + + reserved(if) operator(()ident(new_table)operator(->)ident(bins) operator(==) integer(0)operator(\)) operator({) + ident(free)operator(()ident(new_table)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + + reserved(for)operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(num_bins)operator(;) ident(i)operator(++\)) operator({) + ident(new_table)operator(->)ident(bins)operator([)ident(i)operator(]) operator(=) integer(0)operator(;) + ident(ptr) operator(=) ident(old_table)operator(->)ident(bins)operator([)ident(i)operator(];) + reserved(while) operator(()ident(ptr) operator(!=) integer(0)operator(\)) operator({) + ident(entry) operator(=) ident(alloc)operator(()ident(st_table_entry)operator(\);) + reserved(if) operator(()ident(entry) operator(==) integer(0)operator(\)) operator({) + ident(free)operator(()ident(new_table)operator(->)ident(bins)operator(\);) + ident(free)operator(()ident(new_table)operator(\);) + reserved(return) integer(0)operator(;) + operator(}) + operator(*)ident(entry) operator(=) operator(*)ident(ptr)operator(;) + ident(entry)operator(->)ident(next) operator(=) ident(new_table)operator(->)ident(bins)operator([)ident(i)operator(];) + ident(new_table)operator(->)ident(bins)operator([)ident(i)operator(]) operator(=) ident(entry)operator(;) + ident(ptr) operator(=) ident(ptr)operator(->)ident(next)operator(;) + operator(}) + operator(}) + reserved(return) ident(new_table)operator(;) +operator(}) + +pre_type(int) +ident(st_delete)operator(()ident(table)operator(,) ident(key)operator(,) ident(value)operator(\)) + directive(register) ident(st_table) operator(*)ident(table)operator(;) + directive(register) ident(st_data_t) operator(*)ident(key)operator(;) + ident(st_data_t) operator(*)ident(value)operator(;) +operator({) + pre_type(unsigned) pre_type(int) ident(hash_val)operator(;) + ident(st_table_entry) operator(*)ident(tmp)operator(;) + directive(register) ident(st_table_entry) operator(*)ident(ptr)operator(;) + + ident(hash_val) operator(=) ident(do_hash_bin)operator((*)ident(key)operator(,) ident(table)operator(\);) + ident(ptr) operator(=) ident(table)operator(->)ident(bins)operator([)ident(hash_val)operator(];) + + reserved(if) operator(()ident(ptr) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(value) operator(!=) integer(0)operator(\)) operator(*)ident(value) operator(=) integer(0)operator(;) + reserved(return) integer(0)operator(;) + operator(}) + + reserved(if) operator(()ident(EQUAL)operator(()ident(table)operator(,) operator(*)ident(key)operator(,) ident(ptr)operator(->)ident(key)operator(\)\)) operator({) + ident(table)operator(->)ident(bins)operator([)ident(hash_val)operator(]) operator(=) ident(ptr)operator(->)ident(next)operator(;) + ident(table)operator(->)ident(num_entries)operator(--;) + reserved(if) operator(()ident(value) operator(!=) integer(0)operator(\)) operator(*)ident(value) operator(=) ident(ptr)operator(->)ident(record)operator(;) + operator(*)ident(key) operator(=) ident(ptr)operator(->)ident(key)operator(;) + ident(free)operator(()ident(ptr)operator(\);) + reserved(return) integer(1)operator(;) + operator(}) + + reserved(for)operator((;) ident(ptr)operator(->)ident(next) operator(!=) integer(0)operator(;) ident(ptr) operator(=) ident(ptr)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(EQUAL)operator(()ident(table)operator(,) ident(ptr)operator(->)ident(next)operator(->)ident(key)operator(,) operator(*)ident(key)operator(\)\)) operator({) + ident(tmp) operator(=) ident(ptr)operator(->)ident(next)operator(;) + ident(ptr)operator(->)ident(next) operator(=) ident(ptr)operator(->)ident(next)operator(->)ident(next)operator(;) + ident(table)operator(->)ident(num_entries)operator(--;) + reserved(if) operator(()ident(value) operator(!=) integer(0)operator(\)) operator(*)ident(value) operator(=) ident(tmp)operator(->)ident(record)operator(;) + operator(*)ident(key) operator(=) ident(tmp)operator(->)ident(key)operator(;) + ident(free)operator(()ident(tmp)operator(\);) + reserved(return) integer(1)operator(;) + operator(}) + operator(}) + + reserved(return) integer(0)operator(;) +operator(}) + +pre_type(int) +ident(st_delete_safe)operator(()ident(table)operator(,) ident(key)operator(,) ident(value)operator(,) ident(never)operator(\)) + directive(register) ident(st_table) operator(*)ident(table)operator(;) + directive(register) ident(st_data_t) operator(*)ident(key)operator(;) + ident(st_data_t) operator(*)ident(value)operator(;) + ident(st_data_t) ident(never)operator(;) +operator({) + pre_type(unsigned) pre_type(int) ident(hash_val)operator(;) + directive(register) ident(st_table_entry) operator(*)ident(ptr)operator(;) + + ident(hash_val) operator(=) ident(do_hash_bin)operator((*)ident(key)operator(,) ident(table)operator(\);) + ident(ptr) operator(=) ident(table)operator(->)ident(bins)operator([)ident(hash_val)operator(];) + + reserved(if) operator(()ident(ptr) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(value) operator(!=) integer(0)operator(\)) operator(*)ident(value) operator(=) integer(0)operator(;) + reserved(return) integer(0)operator(;) + operator(}) + + reserved(for)operator((;) ident(ptr) operator(!=) integer(0)operator(;) ident(ptr) operator(=) ident(ptr)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator((()ident(ptr)operator(->)ident(key) operator(!=) ident(never)operator(\)) operator(&&) ident(EQUAL)operator(()ident(table)operator(,) ident(ptr)operator(->)ident(key)operator(,) operator(*)ident(key)operator(\)\)) operator({) + ident(table)operator(->)ident(num_entries)operator(--;) + operator(*)ident(key) operator(=) ident(ptr)operator(->)ident(key)operator(;) + reserved(if) operator(()ident(value) operator(!=) integer(0)operator(\)) operator(*)ident(value) operator(=) ident(ptr)operator(->)ident(record)operator(;) + ident(ptr)operator(->)ident(key) operator(=) ident(ptr)operator(->)ident(record) operator(=) ident(never)operator(;) + reserved(return) integer(1)operator(;) + operator(}) + operator(}) + + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(delete_never)operator(()ident(key)operator(,) ident(value)operator(,) ident(never)operator(\)) + ident(st_data_t) ident(key)operator(,) ident(value)operator(,) ident(never)operator(;) +operator({) + reserved(if) operator(()ident(value) operator(==) ident(never)operator(\)) reserved(return) ident(ST_DELETE)operator(;) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(void) +ident(st_cleanup_safe)operator(()ident(table)operator(,) ident(never)operator(\)) + ident(st_table) operator(*)ident(table)operator(;) + ident(st_data_t) ident(never)operator(;) +operator({) + pre_type(int) ident(num_entries) operator(=) ident(table)operator(->)ident(num_entries)operator(;) + + ident(st_foreach)operator(()ident(table)operator(,) ident(delete_never)operator(,) ident(never)operator(\);) + ident(table)operator(->)ident(num_entries) operator(=) ident(num_entries)operator(;) +operator(}) + +pre_type(int) +ident(st_foreach)operator(()ident(table)operator(,) ident(func)operator(,) ident(arg)operator(\)) + ident(st_table) operator(*)ident(table)operator(;) + pre_type(int) operator((*)ident(func)operator(\)(\);) + ident(st_data_t) ident(arg)operator(;) +operator({) + ident(st_table_entry) operator(*)ident(ptr)operator(,) operator(*)ident(last)operator(,) operator(*)ident(tmp)operator(;) + reserved(enum) ident(st_retval) ident(retval)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(for)operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(table)operator(->)ident(num_bins)operator(;) ident(i)operator(++\)) operator({) + ident(last) operator(=) integer(0)operator(;) + reserved(for)operator(()ident(ptr) operator(=) ident(table)operator(->)ident(bins)operator([)ident(i)operator(];) ident(ptr) operator(!=) integer(0)operator(;\)) operator({) + ident(retval) operator(=) operator((*)ident(func)operator(\)()ident(ptr)operator(->)ident(key)operator(,) ident(ptr)operator(->)ident(record)operator(,) ident(arg)operator(\);) + reserved(switch) operator(()ident(retval)operator(\)) operator({) + reserved(case) label(ST_CHECK)operator(:) comment(/* check if hash is modified during iteration */) + ident(tmp) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(i) operator(<) ident(table)operator(->)ident(num_bins)operator(\)) operator({) + reserved(for) operator(()ident(tmp) operator(=) ident(table)operator(->)ident(bins)operator([)ident(i)operator(];) ident(tmp)operator(;) ident(tmp)operator(=)ident(tmp)operator(->)ident(next)operator(\)) operator({) + reserved(if) operator(()ident(tmp) operator(==) ident(ptr)operator(\)) reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator((!)ident(tmp)operator(\)) operator({) + comment(/* call func with error notice */) + reserved(return) integer(1)operator(;) + operator(}) + comment(/* fall through */) + reserved(case) label(ST_CONTINUE)operator(:) + ident(last) operator(=) ident(ptr)operator(;) + ident(ptr) operator(=) ident(ptr)operator(->)ident(next)operator(;) + reserved(break)operator(;) + reserved(case) label(ST_STOP)operator(:) + reserved(return) integer(0)operator(;) + reserved(case) label(ST_DELETE)operator(:) + ident(tmp) operator(=) ident(ptr)operator(;) + reserved(if) operator(()ident(last) operator(==) integer(0)operator(\)) operator({) + ident(table)operator(->)ident(bins)operator([)ident(i)operator(]) operator(=) ident(ptr)operator(->)ident(next)operator(;) + operator(}) + reserved(else) operator({) + ident(last)operator(->)ident(next) operator(=) ident(ptr)operator(->)ident(next)operator(;) + operator(}) + ident(ptr) operator(=) ident(ptr)operator(->)ident(next)operator(;) + ident(free)operator(()ident(tmp)operator(\);) + ident(table)operator(->)ident(num_entries)operator(--;) + operator(}) + operator(}) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(strhash)operator(()ident(string)operator(\)) + directive(register) directive(const) pre_type(char) operator(*)ident(string)operator(;) +operator({) + directive(register) pre_type(int) ident(c)operator(;) + +preprocessor(#ifdef) ident(HASH_ELFHASH) + directive(register) pre_type(unsigned) pre_type(int) ident(h) operator(=) integer(0)operator(,) ident(g)operator(;) + + reserved(while) operator((()ident(c) operator(=) operator(*)ident(string)operator(++\)) operator(!=) char('\\0')operator(\)) operator({) + ident(h) operator(=) operator(() ident(h) operator(<<) integer(4) operator(\)) operator(+) ident(c)operator(;) + reserved(if) operator(() ident(g) operator(=) ident(h) operator(&) hex(0xF0000000) operator(\)) + ident(h) operator(^=) ident(g) operator(>>) integer(24)operator(;) + ident(h) operator(&=) operator(~)ident(g)operator(;) + operator(}) + reserved(return) ident(h)operator(;) +preprocessor(#elif) ident(defined)operator(()ident(HASH_PERL)operator(\)) + directive(register) pre_type(int) ident(val) operator(=) integer(0)operator(;) + + reserved(while) operator((()ident(c) operator(=) operator(*)ident(string)operator(++\)) operator(!=) char('\\0')operator(\)) operator({) + ident(val) operator(+=) ident(c)operator(;) + ident(val) operator(+=) operator(()ident(val) operator(<<) integer(10)operator(\);) + ident(val) operator(^=) operator(()ident(val) operator(>>) integer(6)operator(\);) + operator(}) + ident(val) operator(+=) operator(()ident(val) operator(<<) integer(3)operator(\);) + ident(val) operator(^=) operator(()ident(val) operator(>>) integer(11)operator(\);) + + reserved(return) ident(val) operator(+) operator(()ident(val) operator(<<) integer(15)operator(\);) +preprocessor(#else) + directive(register) pre_type(int) ident(val) operator(=) integer(0)operator(;) + + reserved(while) operator((()ident(c) operator(=) operator(*)ident(string)operator(++\)) operator(!=) char('\\0')operator(\)) operator({) + ident(val) operator(=) ident(val)operator(*)integer(997) operator(+) ident(c)operator(;) + operator(}) + + reserved(return) ident(val) operator(+) operator(()ident(val)operator(>>)integer(5)operator(\);) +preprocessor(#endif) +operator(}) + +directive(static) pre_type(int) +ident(numcmp)operator(()ident(x)operator(,) ident(y)operator(\)) + pre_type(long) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(return) ident(x) operator(!=) ident(y)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(numhash)operator(()ident(n)operator(\)) + pre_type(long) ident(n)operator(;) +operator({) + reserved(return) ident(n)operator(;) +operator(}) +comment(/********************************************************************** + + string.c - + + $Author: shyouhei $ + $Date: 2009-02-17 03:58:28 +0100 (Tue, 17 Feb 2009\) $ + created at: Mon Aug 9 17:12:58 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("re.h") + +preprocessor(#define) ident(BEG)operator(()ident(no)operator(\)) ident(regs)operator(->)ident(beg)operator([)ident(no)operator(]) +preprocessor(#define) ident(END)operator(()ident(no)operator(\)) ident(regs)operator(->)ident(end)operator([)ident(no)operator(]) + +preprocessor(#include) include(<math.h>) +preprocessor(#include) include(<ctype.h>) + +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) + +ident(VALUE) ident(rb_cString)operator(;) + +preprocessor(#define) ident(STR_TMPLOCK) ident(FL_USER1) +preprocessor(#define) ident(STR_ASSOC) ident(FL_USER3) +preprocessor(#define) ident(STR_NOCAPA) operator(()ident(ELTS_SHARED)operator(|)ident(STR_ASSOC)operator(\)) + +preprocessor(#define) ident(RESIZE_CAPA)operator(()ident(str)operator(,)ident(capacity)operator(\)) reserved(do) operator({)\ + ident(REALLOC_N)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) pre_type(char)operator(,) operator(()ident(capacity)operator(\)+)integer(1)operator(\);)\ + reserved(if) operator((!)ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_NOCAPA)operator(\)\))\ + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) operator(()ident(capacity)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +ident(VALUE) ident(rb_fs)operator(;) + +directive(static) directive(inline) directive(void) +ident(str_mod_check)operator(()ident(s)operator(,) ident(p)operator(,) ident(len)operator(\)) + ident(VALUE) ident(s)operator(;) + pre_type(char) operator(*)ident(p)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr) operator(!=) ident(p) operator(||) ident(RSTRING)operator(()ident(s)operator(\)->)ident(len) operator(!=) ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(string modified)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(static) directive(inline) directive(void) +ident(str_frozen_check)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(s)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(string frozen)delimiter(")>operator(\);) + operator(}) +operator(}) + +directive(static) ident(VALUE) ident(str_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(str_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(NEWOBJ)operator(()ident(str)operator(,) reserved(struct) ident(RString)operator(\);) + ident(OBJSETUP)operator(()ident(str)operator(,) ident(klass)operator(,) ident(T_STRING)operator(\);) + + ident(str)operator(->)ident(ptr) operator(=) integer(0)operator(;) + ident(str)operator(->)ident(len) operator(=) integer(0)operator(;) + ident(str)operator(->)ident(aux)operator(.)ident(capa) operator(=) integer(0)operator(;) + + reserved(return) operator(()ident(VALUE)operator(\))ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(str_new)operator(()ident(klass)operator(,) ident(ptr)operator(,) ident(len)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative string size (or size too big\))delimiter(")>operator(\);) + operator(}) + + ident(str) operator(=) ident(str_alloc)operator(()ident(klass)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(len)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(len)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,)ident(len)operator(+)integer(1)operator(\);) + reserved(if) operator(()ident(ptr)operator(\)) operator({) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(ptr)operator(,) ident(len)operator(\);) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_new)operator(()ident(ptr)operator(,) ident(len)operator(\)) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + reserved(return) ident(str_new)operator(()ident(rb_cString)operator(,) ident(ptr)operator(,) ident(len)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_str_new2)operator(()ident(ptr)operator(\)) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) +operator({) + reserved(if) operator((!)ident(ptr)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(NULL pointer given)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(rb_str_new)operator(()ident(ptr)operator(,) ident(strlen)operator(()ident(ptr)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_tainted_str_new)operator(()ident(ptr)operator(,) ident(len)operator(\)) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(rb_str_new)operator(()ident(ptr)operator(,) ident(len)operator(\);) + + ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_tainted_str_new2)operator(()ident(ptr)operator(\)) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(rb_str_new2)operator(()ident(ptr)operator(\);) + + ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(str_new3)operator(()ident(klass)operator(,) ident(str)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(str)operator(;) +operator({) + ident(VALUE) ident(str2) operator(=) ident(str_alloc)operator(()ident(klass)operator(\);) + + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) ident(str)operator(;) + ident(FL_SET)operator(()ident(str2)operator(,) ident(ELTS_SHARED)operator(\);) + + reserved(return) ident(str2)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_new3)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(str2) operator(=) ident(str_new3)operator(()ident(rb_obj_class)operator(()ident(str)operator(\),) ident(str)operator(\);) + + ident(OBJ_INFECT)operator(()ident(str2)operator(,) ident(str)operator(\);) + reserved(return) ident(str2)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(str_new4)operator(()ident(klass)operator(,) ident(str)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(str)operator(;) +operator({) + ident(VALUE) ident(str2) operator(=) ident(str_alloc)operator(()ident(klass)operator(\);) + + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + ident(FL_SET)operator(()ident(str2)operator(,) ident(ELTS_SHARED)operator(\);) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared)operator(;) + operator(}) + reserved(else) operator({) + ident(FL_SET)operator(()ident(str)operator(,) ident(ELTS_SHARED)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) ident(str2)operator(;) + operator(}) + + reserved(return) ident(str2)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_new4)operator(()ident(orig)operator(\)) + ident(VALUE) ident(orig)operator(;) +operator({) + ident(VALUE) ident(klass)operator(,) ident(str)operator(;) + + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(orig)operator(\)\)) reserved(return) ident(orig)operator(;) + ident(klass) operator(=) ident(rb_obj_class)operator(()ident(orig)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(orig)operator(,) ident(ELTS_SHARED)operator(\)) operator(&&) operator(()ident(str) operator(=) ident(RSTRING)operator(()ident(orig)operator(\)->)ident(aux)operator(.)ident(shared)operator(\)) operator(&&) ident(klass) operator(==) ident(RBASIC)operator(()ident(str)operator(\)->)ident(klass)operator(\)) operator({) + pre_type(long) ident(ofs)operator(;) + ident(ofs) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(RSTRING)operator(()ident(orig)operator(\)->)ident(len)operator(;) + reserved(if) operator((()ident(ofs) operator(>) integer(0)operator(\)) operator(||) operator((!)ident(OBJ_TAINTED)operator(()ident(str)operator(\)) operator(&&) ident(OBJ_TAINTED)operator(()ident(orig)operator(\)\)\)) operator({) + ident(str) operator(=) ident(str_new3)operator(()ident(klass)operator(,) ident(str)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+=) ident(ofs)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-=) ident(ofs)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(FL_TEST)operator(()ident(orig)operator(,) ident(STR_ASSOC)operator(\)\)) operator({) + ident(str) operator(=) ident(str_new)operator(()ident(klass)operator(,) ident(RSTRING)operator(()ident(orig)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(orig)operator(\)->)ident(len)operator(\);) + operator(}) + reserved(else) operator({) + ident(str) operator(=) ident(str_new4)operator(()ident(klass)operator(,) ident(orig)operator(\);) + operator(}) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(orig)operator(\);) + ident(OBJ_FREEZE)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_new5)operator(()ident(obj)operator(,) ident(ptr)operator(,) ident(len)operator(\)) + ident(VALUE) ident(obj)operator(;) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + reserved(return) ident(str_new)operator(()ident(rb_obj_class)operator(()ident(obj)operator(\),) ident(ptr)operator(,) ident(len)operator(\);) +operator(}) + +preprocessor(#define) ident(STR_BUF_MIN_SIZE) integer(128) + +ident(VALUE) +ident(rb_str_buf_new)operator(()ident(capa)operator(\)) + pre_type(long) ident(capa)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(str_alloc)operator(()ident(rb_cString)operator(\);) + + reserved(if) operator(()ident(capa) operator(<) ident(STR_BUF_MIN_SIZE)operator(\)) operator({) + ident(capa) operator(=) ident(STR_BUF_MIN_SIZE)operator(;) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(=) integer(0)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) integer(0)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(capa)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,) ident(capa)operator(+)integer(1)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(=) char('\\0')operator(;) + + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_buf_new2)operator(()ident(ptr)operator(\)) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + pre_type(long) ident(len) operator(=) ident(strlen)operator(()ident(ptr)operator(\);) + + ident(str) operator(=) ident(rb_str_buf_new)operator(()ident(len)operator(\);) + ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_to_str)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(rb_convert_type)operator(()ident(str)operator(,) ident(T_STRING)operator(,) string<delimiter(")content(String)delimiter(")>operator(,) string<delimiter(")content(to_str)delimiter(")>operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_str_shared_replace)operator(()ident(str)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str)operator(,) ident(str2)operator(;) +operator({) + reserved(if) operator(()ident(str) operator(==) ident(str2)operator(\)) reserved(return)operator(;) + ident(rb_str_modify)operator(()ident(str)operator(\);) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(str)operator(,) ident(ELTS_SHARED)operator(\)\)) ident(free)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(str2)operator(\)\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(=) integer(0)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) integer(0)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) integer(0)operator(;) + ident(FL_UNSET)operator(()ident(str)operator(,) ident(STR_NOCAPA)operator(\);) + reserved(return)operator(;) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(;) + ident(FL_UNSET)operator(()ident(str)operator(,) ident(STR_NOCAPA)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str2)operator(,) ident(STR_NOCAPA)operator(\)\)) operator({) + ident(FL_SET)operator(()ident(str)operator(,) ident(RBASIC)operator(()ident(str2)operator(\)->)ident(flags) operator(&) ident(STR_NOCAPA)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(aux)operator(.)ident(shared)operator(;) + operator(}) + reserved(else) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(aux)operator(.)ident(capa)operator(;) + operator(}) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr) operator(=) integer(0)operator(;) comment(/* abandon str2 */) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len) operator(=) integer(0)operator(;) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) integer(0)operator(;) + ident(FL_UNSET)operator(()ident(str2)operator(,) ident(STR_NOCAPA)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(str2)operator(\)\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) +operator(}) + +directive(static) ident(ID) ident(id_to_s)operator(;) + +ident(VALUE) +ident(rb_obj_as_string)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(obj)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + reserved(return) ident(obj)operator(;) + operator(}) + ident(str) operator(=) ident(rb_funcall)operator(()ident(obj)operator(,) ident(id_to_s)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(str)operator(\)) operator(!=) ident(T_STRING)operator(\)) + reserved(return) ident(rb_any_to_s)operator(()ident(obj)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(obj)operator(\)\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(rb_str_s_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(rb_str_replace) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) + +ident(VALUE) +ident(rb_str_dup)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(dup) operator(=) ident(str_alloc)operator(()ident(rb_obj_class)operator(()ident(str)operator(\)\);) + ident(rb_str_replace)operator(()ident(dup)operator(,) ident(str)operator(\);) + reserved(return) ident(dup)operator(;) +operator(}) + + +comment(/* + * call-seq: + * String.new(str=""\) => new_str + * + * Returns a new string object containing a copy of <i>str</i>. + */) + +directive(static) ident(VALUE) +ident(rb_str_init)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(orig)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(orig)operator(\)) operator(==) integer(1)operator(\)) + ident(rb_str_replace)operator(()ident(str)operator(,) ident(orig)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * str.length => integer + * + * Returns the length of <i>str</i>. + */) + +directive(static) ident(VALUE) +ident(rb_str_length)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(LONG2NUM)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) +operator(}) + +comment(/* + * call-seq: + * str.empty? => true or false + * + * Returns <code>true</code> if <i>str</i> has a length of zero. + * + * "hello".empty? #=> false + * "".empty? #=> true + */) + +directive(static) ident(VALUE) +ident(rb_str_empty)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * str + other_str => new_str + * + * Concatenation---Returns a new <code>String</code> containing + * <i>other_str</i> concatenated to <i>str</i>. + * + * "Hello from " + self.to_s #=> "Hello from main" + */) + +ident(VALUE) +ident(rb_str_plus)operator(()ident(str1)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str1)operator(,) ident(str2)operator(;) +operator({) + ident(VALUE) ident(str3)operator(;) + + ident(StringValue)operator(()ident(str2)operator(\);) + ident(str3) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len)operator(+)ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\);) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str3)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str1)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len)operator(\);) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str3)operator(\)->)ident(ptr) operator(+) ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len)operator(,) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\);) + ident(RSTRING)operator(()ident(str3)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str3)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(str1)operator(\)) operator(||) ident(OBJ_TAINTED)operator(()ident(str2)operator(\)\)) + ident(OBJ_TAINT)operator(()ident(str3)operator(\);) + reserved(return) ident(str3)operator(;) +operator(}) + +comment(/* + * call-seq: + * str * integer => new_str + * + * Copy---Returns a new <code>String</code> containing <i>integer</i> copies of + * the receiver. + * + * "Ho! " * 3 #=> "Ho! Ho! Ho! " + */) + +ident(VALUE) +ident(rb_str_times)operator(()ident(str)operator(,) ident(times)operator(\)) + ident(VALUE) ident(str)operator(;) + ident(VALUE) ident(times)operator(;) +operator({) + ident(VALUE) ident(str2)operator(;) + pre_type(long) ident(i)operator(,) ident(len)operator(;) + + ident(len) operator(=) ident(NUM2LONG)operator(()ident(times)operator(\);) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative argument)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(len) operator(&&) ident(LONG_MAX)operator(/)ident(len) operator(<) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(argument too big)delimiter(")>operator(\);) + operator(}) + + ident(str2) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,)integer(0)operator(,) ident(len) operator(*=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i) operator(+=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr) operator(+) ident(i)operator(,) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + operator(}) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + + ident(OBJ_INFECT)operator(()ident(str2)operator(,) ident(str)operator(\);) + + reserved(return) ident(str2)operator(;) +operator(}) + +comment(/* + * call-seq: + * str % arg => new_str + * + * Format---Uses <i>str</i> as a format specification, and returns the result + * of applying it to <i>arg</i>. If the format specification contains more than + * one substitution, then <i>arg</i> must be an <code>Array</code> containing + * the values to be substituted. See <code>Kernel::sprintf</code> for details + * of the format string. + * + * "%05d" % 123 #=> "00123" + * "%-5s: %08x" % [ "ID", self.id ] #=> "ID : 200e14d6" + */) + +directive(static) ident(VALUE) +ident(rb_str_format_m)operator(()ident(str)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(str)operator(,) ident(arg)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(tmp) operator(=) ident(rb_check_array_type)operator(()ident(arg)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(return) ident(rb_str_format)operator(()ident(RARRAY_LEN)operator(()ident(tmp)operator(\),) ident(RARRAY_PTR)operator(()ident(tmp)operator(\),) ident(str)operator(\);) + operator(}) + reserved(return) ident(rb_str_format)operator(()integer(1)operator(,) operator(&)ident(arg)operator(,) ident(str)operator(\);) +operator(}) + +directive(static) directive(const) pre_type(char) ident(null_str)operator([]) operator(=) string<delimiter(")delimiter(")>operator(;) + +directive(static) pre_type(int) +ident(str_independent)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_TMPLOCK)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(can't modify string; temporarily locked)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(str)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(string)delimiter(")>operator(\);) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(str)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify string)delimiter(")>operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(==) ident(null_str)operator(\)) reserved(return) integer(0)operator(;) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(str)operator(,) ident(ELTS_SHARED)operator(\)\)) reserved(return) integer(1)operator(;) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) directive(void) +ident(str_make_independent)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(ptr)operator(;) + + ident(ptr) operator(=) ident(ALLOC_N)operator(()pre_type(char)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(+)integer(1)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) operator({) + ident(memcpy)operator(()ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + operator(}) + ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) integer(0)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(=) ident(ptr)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(FL_UNSET)operator(()ident(str)operator(,) ident(STR_NOCAPA)operator(\);) +operator(}) + +directive(void) +ident(rb_str_modify)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator((!)ident(str_independent)operator(()ident(str)operator(\)\)) + ident(str_make_independent)operator(()ident(str)operator(\);) +operator(}) + +directive(void) +ident(rb_str_associate)operator(()ident(str)operator(,) ident(add)operator(\)) + ident(VALUE) ident(str)operator(,) ident(add)operator(;) +operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\)\)) operator({) + comment(/* already associated */) + ident(rb_ary_concat)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared)operator(,) ident(add)operator(\);) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + ident(str_make_independent)operator(()ident(str)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(!=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + ident(RESIZE_CAPA)operator(()ident(str)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) ident(add)operator(;) + ident(FL_SET)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\);) + operator(}) +operator(}) + +ident(VALUE) +ident(rb_str_associated)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\)\)) operator({) + reserved(return) ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +preprocessor(#define) ident(make_null_str)operator(()ident(s)operator(\)) reserved(do) operator({) \ + ident(FL_SET)operator(()ident(s)operator(,) ident(ELTS_SHARED)operator(\);) \ + ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr) operator(=) operator(()pre_type(char) operator(*\))ident(null_str)operator(;) \ + ident(RSTRING)operator(()ident(s)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) integer(0)operator(;) \ + operator(}) reserved(while) operator(()integer(0)operator(\)) + +directive(static) ident(VALUE) +ident(rb_str_s_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(str_alloc)operator(()ident(klass)operator(\);) + ident(make_null_str)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_string_value)operator(()ident(ptr)operator(\)) + directive(volatile) ident(VALUE) operator(*)ident(ptr)operator(;) +operator({) + ident(VALUE) ident(s) operator(=) operator(*)ident(ptr)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(s)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + ident(s) operator(=) ident(rb_str_to_str)operator(()ident(s)operator(\);) + operator(*)ident(ptr) operator(=) ident(s)operator(;) + operator(}) + reserved(if) operator((!)ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr)operator(\)) operator({) + ident(make_null_str)operator(()ident(s)operator(\);) + operator(}) + reserved(return) ident(s)operator(;) +operator(}) + +pre_type(char) operator(*) +ident(rb_string_value_ptr)operator(()ident(ptr)operator(\)) + directive(volatile) ident(VALUE) operator(*)ident(ptr)operator(;) +operator({) + reserved(return) ident(RSTRING)operator(()ident(rb_string_value)operator(()ident(ptr)operator(\)\)->)ident(ptr)operator(;) +operator(}) + +pre_type(char) operator(*) +ident(rb_string_value_cstr)operator(()ident(ptr)operator(\)) + directive(volatile) ident(VALUE) operator(*)ident(ptr)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(rb_string_value)operator(()ident(ptr)operator(\);) + pre_type(char) operator(*)ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + + reserved(if) operator((!)ident(s) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(!=) ident(strlen)operator(()ident(s)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(string contains null byte)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(s)operator(;) +operator(}) + +ident(VALUE) +ident(rb_check_string_type)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_check_convert_type)operator(()ident(str)operator(,) ident(T_STRING)operator(,) string<delimiter(")content(String)delimiter(")>operator(,) string<delimiter(")content(to_str)delimiter(")>operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(str)operator(\)) operator(&&) operator(!)ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) operator({) + ident(make_null_str)operator(()ident(str)operator(\);) + operator(}) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_substr)operator(()ident(str)operator(,) ident(beg)operator(,) ident(len)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(long) ident(beg)operator(,) ident(len)operator(;) +operator({) + ident(VALUE) ident(str2)operator(;) + + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(beg) operator(>) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(+=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(if) operator(()ident(beg) operator(+) ident(len) operator(>) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(beg)operator(;) + operator(}) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(len) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) operator({) + ident(str2) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,)integer(0)operator(,)integer(0)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(len) operator(>) reserved(sizeof)operator(()reserved(struct) ident(RString)operator(\))operator(/)integer(2) operator(&&) + ident(beg) operator(+) ident(len) operator(==) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(&&) operator(!)ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\)\)) operator({) + ident(str2) operator(=) ident(rb_str_new4)operator(()ident(str)operator(\);) + ident(str2) operator(=) ident(str_new3)operator(()ident(rb_obj_class)operator(()ident(str2)operator(\),) ident(str2)operator(\);) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr) operator(+=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len) operator(-) ident(len)operator(;) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len) operator(=) ident(len)operator(;) + operator(}) + reserved(else) operator({) + ident(str2) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(+)ident(beg)operator(,) ident(len)operator(\);) + operator(}) + ident(OBJ_INFECT)operator(()ident(str2)operator(,) ident(str)operator(\);) + + reserved(return) ident(str2)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_freeze)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(rb_obj_freeze)operator(()ident(str)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_str_dup_frozen)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(ELTS_SHARED)operator(\)) operator(&&) ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared)operator(\)) operator({) + ident(VALUE) ident(shared) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(shared)operator(\)->)ident(len) operator(==) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + ident(OBJ_FREEZE)operator(()ident(shared)operator(\);) + reserved(return) ident(shared)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(str)operator(\)\)) reserved(return) ident(str)operator(;) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(OBJ_FREEZE)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_locktmp)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_TMPLOCK)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(temporal locking already locked string)delimiter(")>operator(\);) + operator(}) + ident(FL_SET)operator(()ident(str)operator(,) ident(STR_TMPLOCK)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_unlocktmp)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_TMPLOCK)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(temporal unlocking already unlocked string)delimiter(")>operator(\);) + operator(}) + ident(FL_UNSET)operator(()ident(str)operator(,) ident(STR_TMPLOCK)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_resize)operator(()ident(str)operator(,) ident(len)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative string size (or size too big\))delimiter(")>operator(\);) + operator(}) + + ident(rb_str_modify)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(len) operator(!=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<) ident(len) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(len) operator(>) integer(1024)operator(\)) operator({) + ident(REALLOC_N)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) pre_type(char)operator(,) ident(len)operator(+)integer(1)operator(\);) + reserved(if) operator((!)ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_NOCAPA)operator(\)\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(len)operator(;) + operator(}) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(len)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) comment(/* sentinel */) + operator(}) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(str_buf_cat)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\)) + ident(VALUE) ident(str)operator(;) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + pre_type(long) ident(capa)operator(,) ident(total)operator(,) ident(off) operator(=) operator(-)integer(1)operator(;;) + + ident(rb_str_modify)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(ptr) operator(>=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(&&) ident(ptr) operator(<=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + ident(off) operator(=) ident(ptr) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + operator(}) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) integer(0)operator(;) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\)\)) operator({) + ident(FL_UNSET)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\);) + ident(capa) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + operator(}) + reserved(else) operator({) + ident(capa) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa)operator(;) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>=) ident(LONG_MAX) operator(-) ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(string sizes too big)delimiter(")>operator(\);) + operator(}) + ident(total) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(+)ident(len)operator(;) + reserved(if) operator(()ident(capa) operator(<=) ident(total)operator(\)) operator({) + reserved(while) operator(()ident(total) operator(>) ident(capa)operator(\)) operator({) + reserved(if) operator(()ident(capa) operator(+) integer(1) operator(>=) ident(LONG_MAX) operator(/) integer(2)operator(\)) operator({) + ident(capa) operator(=) ident(total)operator(;) + reserved(break)operator(;) + operator(}) + ident(capa) operator(=) operator(()ident(capa) operator(+) integer(1)operator(\)) operator(*) integer(2)operator(;) + operator(}) + ident(RESIZE_CAPA)operator(()ident(str)operator(,) ident(capa)operator(\);) + operator(}) + reserved(if) operator(()ident(off) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(ptr) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(off)operator(;) + operator(}) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) ident(ptr)operator(,) ident(len)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(total)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(total)operator(]) operator(=) char('\\0')operator(;) comment(/* sentinel */) + + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\)) + ident(VALUE) ident(str)operator(;) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(str)operator(;) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative string size (or size too big\))delimiter(")>operator(\);) + operator(}) + reserved(return) ident(str_buf_cat)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_str_buf_cat2)operator(()ident(str)operator(,) ident(ptr)operator(\)) + ident(VALUE) ident(str)operator(;) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) +operator({) + reserved(return) ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(strlen)operator(()ident(ptr)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_str_cat)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\)) + ident(VALUE) ident(str)operator(;) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) +operator({) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(negative string size (or size too big\))delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\)\)) operator({) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(REALLOC_N)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) pre_type(char)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(+)ident(len)operator(+)integer(1)operator(\);) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) ident(ptr)operator(,) ident(len)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+=) ident(len)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) comment(/* sentinel */) + reserved(return) ident(str)operator(;) + operator(}) + + reserved(return) ident(rb_str_buf_cat)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_str_cat2)operator(()ident(str)operator(,) ident(ptr)operator(\)) + ident(VALUE) ident(str)operator(;) + directive(const) pre_type(char) operator(*)ident(ptr)operator(;) +operator({) + reserved(return) ident(rb_str_cat)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(strlen)operator(()ident(ptr)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str)operator(,) ident(str2)operator(;) +operator({) + ident(str_buf_cat)operator(()ident(str)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(str2)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_append)operator(()ident(str)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str)operator(,) ident(str2)operator(;) +operator({) + ident(StringValue)operator(()ident(str2)operator(\);) + ident(rb_str_modify)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\)\)) operator({) + pre_type(long) ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(+)ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(;) + ident(REALLOC_N)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) pre_type(char)operator(,) ident(len)operator(+)integer(1)operator(\);) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) + ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) comment(/* sentinel */) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(len)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(rb_str_buf_append)operator(()ident(str)operator(,) ident(str2)operator(\);) + operator(}) + operator(}) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(str2)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str << fixnum => str + * str.concat(fixnum\) => str + * str << obj => str + * str.concat(obj\) => str + * + * Append---Concatenates the given object to <i>str</i>. If the object is a + * <code>Fixnum</code> between 0 and 255, it is converted to a character before + * concatenation. + * + * a = "hello " + * a << "world" #=> "hello world" + * a.concat(33\) #=> "hello world!" + */) + +ident(VALUE) +ident(rb_str_concat)operator(()ident(str1)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str1)operator(,) ident(str2)operator(;) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(str2)operator(\)\)) operator({) + pre_type(int) ident(i) operator(=) ident(FIX2INT)operator(()ident(str2)operator(\);) + reserved(if) operator(()integer(0) operator(<=) ident(i) operator(&&) ident(i) operator(<=) hex(0xff)operator(\)) operator({) comment(/* byte */) + pre_type(char) ident(c) operator(=) ident(i)operator(;) + reserved(return) ident(rb_str_cat)operator(()ident(str1)operator(,) operator(&)ident(c)operator(,) integer(1)operator(\);) + operator(}) + operator(}) + ident(str1) operator(=) ident(rb_str_append)operator(()ident(str1)operator(,) ident(str2)operator(\);) + + reserved(return) ident(str1)operator(;) +operator(}) + +pre_type(int) +ident(rb_str_hash)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + directive(register) pre_type(long) ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + directive(register) pre_type(char) operator(*)ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + directive(register) pre_type(int) ident(key) operator(=) integer(0)operator(;) + +preprocessor(#if) ident(defined)operator(()ident(HASH_ELFHASH)operator(\)) + directive(register) pre_type(unsigned) pre_type(int) ident(g)operator(;) + + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(key) operator(=) operator(()ident(key) operator(<<) integer(4)operator(\)) operator(+) operator(*)ident(p)operator(++;) + reserved(if) operator(()ident(g) operator(=) ident(key) operator(&) hex(0xF0000000)operator(\)) + ident(key) operator(^=) ident(g) operator(>>) integer(24)operator(;) + ident(key) operator(&=) operator(~)ident(g)operator(;) + operator(}) +preprocessor(#elif) ident(defined)operator(()ident(HASH_PERL)operator(\)) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(key) operator(+=) operator(*)ident(p)operator(++;) + ident(key) operator(+=) operator(()ident(key) operator(<<) integer(10)operator(\);) + ident(key) operator(^=) operator(()ident(key) operator(>>) integer(6)operator(\);) + operator(}) + ident(key) operator(+=) operator(()ident(key) operator(<<) integer(3)operator(\);) + ident(key) operator(^=) operator(()ident(key) operator(>>) integer(11)operator(\);) + ident(key) operator(+=) operator(()ident(key) operator(<<) integer(15)operator(\);) +preprocessor(#else) + reserved(while) operator(()ident(len)operator(--\)) operator({) + ident(key) operator(=) ident(key)operator(*)integer(65599) operator(+) operator(*)ident(p)operator(;) + ident(p)operator(++;) + operator(}) + ident(key) operator(=) ident(key) operator(+) operator(()ident(key)operator(>>)integer(5)operator(\);) +preprocessor(#endif) + reserved(return) ident(key)operator(;) +operator(}) + +comment(/* + * call-seq: + * str.hash => fixnum + * + * Return a hash based on the string's length and content. + */) + +directive(static) ident(VALUE) +ident(rb_str_hash_m)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(int) ident(key) operator(=) ident(rb_str_hash)operator(()ident(str)operator(\);) + reserved(return) ident(INT2FIX)operator(()ident(key)operator(\);) +operator(}) + +preprocessor(#define) ident(lesser)operator(()ident(a)operator(,)ident(b)operator(\)) operator(((()ident(a)operator(\)>()ident(b)operator(\)\)?()ident(b)operator(\):()ident(a)operator(\)\)) + +pre_type(int) +ident(rb_str_cmp)operator(()ident(str1)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str1)operator(,) ident(str2)operator(;) +operator({) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(retval)operator(;) + + ident(len) operator(=) ident(lesser)operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\);) + ident(retval) operator(=) ident(rb_memcmp)operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(,) ident(len)operator(\);) + reserved(if) operator(()ident(retval) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len) operator(==) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\)) reserved(return) integer(0)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len) operator(>) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\)) reserved(return) integer(1)operator(;) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(retval) operator(>) integer(0)operator(\)) reserved(return) integer(1)operator(;) + reserved(return) operator(-)integer(1)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str == obj => true or false + * + * Equality---If <i>obj</i> is not a <code>String</code>, returns + * <code>false</code>. Otherwise, returns <code>true</code> if <i>str</i> + * <code><=></code> <i>obj</i> returns zero. + */) + +directive(static) ident(VALUE) +ident(rb_str_equal)operator(()ident(str1)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str1)operator(,) ident(str2)operator(;) +operator({) + reserved(if) operator(()ident(str1) operator(==) ident(str2)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(str2)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(str2)operator(,) ident(rb_intern)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\)\)\)) operator({) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(rb_equal)operator(()ident(str2)operator(,) ident(str1)operator(\);) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len) operator(==) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len) operator(&&) + ident(rb_str_cmp)operator(()ident(str1)operator(,) ident(str2)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +preprocessor(#define) ident(IS_EVSTR)operator(()ident(p)operator(,)ident(e)operator(\)) operator((()ident(p)operator(\)) operator(<) operator(()ident(e)operator(\)) operator(&&) operator((*()ident(p)operator(\)) operator(==) char('$') operator(||) operator(*()ident(p)operator(\)) operator(==) char('@') operator(||) operator(*()ident(p)operator(\)) operator(==) char('{')operator(\)\)) + +comment(/* + * call-seq: + * str.eql?(other\) => true or false + * + * Two strings are equal if the have the same length and content. + */) + +directive(static) ident(VALUE) +ident(rb_str_eql)operator(()ident(str1)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str1)operator(,) ident(str2)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(str2)operator(\)) operator(!=) ident(T_STRING) operator(||) ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len) operator(!=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\)) + reserved(return) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(memcmp)operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(,) + ident(lesser)operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\)\)) operator(==) integer(0)operator(\)) + reserved(return) ident(Qtrue)operator(;) + + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * str <=> other_str => -1, 0, +1 + * + * Comparison---Returns -1 if <i>other_str</i> is less than, 0 if + * <i>other_str</i> is equal to, and +1 if <i>other_str</i> is greater than + * <i>str</i>. If the strings are of different lengths, and the strings are + * equal when compared up to the shortest length, then the longer string is + * considered greater than the shorter one. If the variable <code>$=</code> is + * <code>false</code>, the comparison is based on comparing the binary values + * of each character in the string. In older versions of Ruby, setting + * <code>$=</code> allowed case-insensitive comparisons; this is now deprecated + * in favor of using <code>String#casecmp</code>. + * + * <code><=></code> is the basis for the methods <code><</code>, + * <code><=</code>, <code>></code>, <code>>=</code>, and <code>between?</code>, + * included from module <code>Comparable</code>. The method + * <code>String#==</code> does not use <code>Comparable#==</code>. + * + * "abcdef" <=> "abcde" #=> 1 + * "abcdef" <=> "abcdef" #=> 0 + * "abcdef" <=> "abcdefg" #=> -1 + * "abcdef" <=> "ABCDEF" #=> 1 + */) + +directive(static) ident(VALUE) +ident(rb_str_cmp_m)operator(()ident(str1)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str1)operator(,) ident(str2)operator(;) +operator({) + pre_type(long) ident(result)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(str2)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + reserved(if) operator((!)ident(rb_respond_to)operator(()ident(str2)operator(,) ident(rb_intern)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\)\)\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(else) reserved(if) operator((!)ident(rb_respond_to)operator(()ident(str2)operator(,) ident(rb_intern)operator(()string<delimiter(")content(<=>)delimiter(")>operator(\)\)\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(tmp) operator(=) ident(rb_funcall)operator(()ident(str2)operator(,) ident(rb_intern)operator(()string<delimiter(")content(<=>)delimiter(")>operator(\),) integer(1)operator(,) ident(str1)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(if) operator((!)ident(FIXNUM_P)operator(()ident(tmp)operator(\)\)) operator({) + reserved(return) ident(rb_funcall)operator(()ident(LONG2FIX)operator(()integer(0)operator(\),) char('-')operator(,) integer(1)operator(,) ident(tmp)operator(\);) + operator(}) + ident(result) operator(=) operator(-)ident(FIX2LONG)operator(()ident(tmp)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(result) operator(=) ident(rb_str_cmp)operator(()ident(str1)operator(,) ident(str2)operator(\);) + operator(}) + reserved(return) ident(LONG2NUM)operator(()ident(result)operator(\);) +operator(}) + +comment(/* + * call-seq: + * str.casecmp(other_str\) => -1, 0, +1 + * + * Case-insensitive version of <code>String#<=></code>. + * + * "abcdef".casecmp("abcde"\) #=> 1 + * "aBcDeF".casecmp("abcdef"\) #=> 0 + * "abcdef".casecmp("abcdefg"\) #=> -1 + * "abcdef".casecmp("ABCDEF"\) #=> 0 + */) + +directive(static) ident(VALUE) +ident(rb_str_casecmp)operator(()ident(str1)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str1)operator(,) ident(str2)operator(;) +operator({) + pre_type(long) ident(len)operator(;) + pre_type(int) ident(retval)operator(;) + + ident(StringValue)operator(()ident(str2)operator(\);) + ident(len) operator(=) ident(lesser)operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\);) + ident(retval) operator(=) ident(rb_memcicmp)operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(,) ident(len)operator(\);) + reserved(if) operator(()ident(retval) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len) operator(==) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str1)operator(\)->)ident(len) operator(>) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(retval) operator(==) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(retval) operator(>) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) +operator(}) + +directive(static) pre_type(long) +ident(rb_str_index)operator(()ident(str)operator(,) ident(sub)operator(,) ident(offset)operator(\)) + ident(VALUE) ident(str)operator(,) ident(sub)operator(;) + pre_type(long) ident(offset)operator(;) +operator({) + pre_type(long) ident(pos)operator(;) + + reserved(if) operator(()ident(offset) operator(<) integer(0)operator(\)) operator({) + ident(offset) operator(+=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(offset) operator(<) integer(0)operator(\)) reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(offset) operator(<) ident(RSTRING)operator(()ident(sub)operator(\)->)ident(len)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(sub)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(offset)operator(;) + ident(pos) operator(=) ident(rb_memsearch)operator(()ident(RSTRING)operator(()ident(sub)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(sub)operator(\)->)ident(len)operator(,) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(+)ident(offset)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(-)ident(offset)operator(\);) + reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) reserved(return) ident(pos)operator(;) + reserved(return) ident(pos) operator(+) ident(offset)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.index(substring [, offset]\) => fixnum or nil + * str.index(fixnum [, offset]\) => fixnum or nil + * str.index(regexp [, offset]\) => fixnum or nil + * + * Returns the index of the first occurrence of the given <i>substring</i>, + * character (<i>fixnum</i>\), or pattern (<i>regexp</i>\) in <i>str</i>. Returns + * <code>nil</code> if not found. If the second parameter is present, it + * specifies the position in the string to begin the search. + * + * "hello".index('e'\) #=> 1 + * "hello".index('lo'\) #=> 3 + * "hello".index('a'\) #=> nil + * "hello".index(101\) #=> 1 + * "hello".index(/[aeiou]/, -3\) #=> 4 + */) + +directive(static) ident(VALUE) +ident(rb_str_index_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(sub)operator(;) + ident(VALUE) ident(initpos)operator(;) + pre_type(long) ident(pos)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(sub)operator(,) operator(&)ident(initpos)operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(pos) operator(=) ident(NUM2LONG)operator(()ident(initpos)operator(\);) + operator(}) + reserved(else) operator({) + ident(pos) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(pos) operator(+=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(sub)operator(\)) operator(==) ident(T_REGEXP)operator(\)) operator({) + ident(rb_backref_set)operator(()ident(Qnil)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) + operator(}) + operator(}) + + reserved(switch) operator(()ident(TYPE)operator(()ident(sub)operator(\)\)) operator({) + reserved(case) label(T_REGEXP)operator(:) + ident(pos) operator(=) ident(rb_reg_adjust_startpos)operator(()ident(sub)operator(,) ident(str)operator(,) ident(pos)operator(,) integer(0)operator(\);) + ident(pos) operator(=) ident(rb_reg_search)operator(()ident(sub)operator(,) ident(str)operator(,) ident(pos)operator(,) integer(0)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FIXNUM)operator(:) + operator({) + pre_type(int) ident(c) operator(=) ident(FIX2INT)operator(()ident(sub)operator(\);) + pre_type(long) ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(p) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + + reserved(for) operator((;)ident(pos)operator(<)ident(len)operator(;)ident(pos)operator(++\)) operator({) + reserved(if) operator(()ident(p)operator([)ident(pos)operator(]) operator(==) ident(c)operator(\)) reserved(return) ident(LONG2NUM)operator(()ident(pos)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) + operator(}) + + reserved(default)operator(:) operator({) + ident(VALUE) ident(tmp)operator(;) + + ident(tmp) operator(=) ident(rb_check_string_type)operator(()ident(sub)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(tmp)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(type mismatch: %s given)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(sub)operator(\)\);) + operator(}) + ident(sub) operator(=) ident(tmp)operator(;) + operator(}) + comment(/* fall through */) + reserved(case) label(T_STRING)operator(:) + ident(pos) operator(=) ident(rb_str_index)operator(()ident(str)operator(,) ident(sub)operator(,) ident(pos)operator(\);) + reserved(break)operator(;) + operator(}) + + reserved(if) operator(()ident(pos) operator(==) operator(-)integer(1)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(LONG2NUM)operator(()ident(pos)operator(\);) +operator(}) + +directive(static) pre_type(long) +ident(rb_str_rindex)operator(()ident(str)operator(,) ident(sub)operator(,) ident(pos)operator(\)) + ident(VALUE) ident(str)operator(,) ident(sub)operator(;) + pre_type(long) ident(pos)operator(;) +operator({) + pre_type(long) ident(len) operator(=) ident(RSTRING)operator(()ident(sub)operator(\)->)ident(len)operator(;) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(sbeg)operator(,) operator(*)ident(t)operator(;) + + comment(/* substring longer than string */) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<) ident(len)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(pos) operator(<) ident(len)operator(\)) operator({) + ident(pos) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(len)operator(;) + operator(}) + ident(sbeg) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(pos)operator(;) + ident(t) operator(=) ident(RSTRING)operator(()ident(sub)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(len)operator(\)) operator({) + reserved(while) operator(()ident(sbeg) operator(<=) ident(s)operator(\)) operator({) + reserved(if) operator(()ident(rb_memcmp)operator(()ident(s)operator(,) ident(t)operator(,) ident(len)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(s) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + operator(}) + ident(s)operator(--;) + operator(}) + reserved(return) operator(-)integer(1)operator(;) + operator(}) + reserved(else) operator({) + reserved(return) ident(pos)operator(;) + operator(}) +operator(}) + + +comment(/* + * call-seq: + * str.rindex(substring [, fixnum]\) => fixnum or nil + * str.rindex(fixnum [, fixnum]\) => fixnum or nil + * str.rindex(regexp [, fixnum]\) => fixnum or nil + * + * Returns the index of the last occurrence of the given <i>substring</i>, + * character (<i>fixnum</i>\), or pattern (<i>regexp</i>\) in <i>str</i>. Returns + * <code>nil</code> if not found. If the second parameter is present, it + * specifies the position in the string to end the search---characters beyond + * this point will not be considered. + * + * "hello".rindex('e'\) #=> 1 + * "hello".rindex('l'\) #=> 3 + * "hello".rindex('a'\) #=> nil + * "hello".rindex(101\) #=> 1 + * "hello".rindex(/[aeiou]/, -2\) #=> 1 + */) + +directive(static) ident(VALUE) +ident(rb_str_rindex_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(sub)operator(;) + ident(VALUE) ident(position)operator(;) + pre_type(long) ident(pos)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(sub)operator(,) operator(&)ident(position)operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(pos) operator(=) ident(NUM2LONG)operator(()ident(position)operator(\);) + reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(pos) operator(+=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(sub)operator(\)) operator(==) ident(T_REGEXP)operator(\)) operator({) + ident(rb_backref_set)operator(()ident(Qnil)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(pos) operator(>) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) ident(pos) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + operator(}) + reserved(else) operator({) + ident(pos) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + operator(}) + + reserved(switch) operator(()ident(TYPE)operator(()ident(sub)operator(\)\)) operator({) + reserved(case) label(T_REGEXP)operator(:) + reserved(if) operator(()ident(RREGEXP)operator(()ident(sub)operator(\)->)ident(len)operator(\)) operator({) + ident(pos) operator(=) ident(rb_reg_adjust_startpos)operator(()ident(sub)operator(,) ident(str)operator(,) ident(pos)operator(,) integer(1)operator(\);) + ident(pos) operator(=) ident(rb_reg_search)operator(()ident(sub)operator(,) ident(str)operator(,) ident(pos)operator(,) integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(pos) operator(>=) integer(0)operator(\)) reserved(return) ident(LONG2NUM)operator(()ident(pos)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_STRING)operator(:) + ident(pos) operator(=) ident(rb_str_rindex)operator(()ident(str)operator(,) ident(sub)operator(,) ident(pos)operator(\);) + reserved(if) operator(()ident(pos) operator(>=) integer(0)operator(\)) reserved(return) ident(LONG2NUM)operator(()ident(pos)operator(\);) + reserved(break)operator(;) + + reserved(case) label(T_FIXNUM)operator(:) + operator({) + pre_type(int) ident(c) operator(=) ident(FIX2INT)operator(()ident(sub)operator(\);) + pre_type(unsigned) pre_type(char) operator(*)ident(p) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(pos)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(pbeg) operator(=) operator(()pre_type(unsigned) pre_type(char)operator(*\))ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + + reserved(if) operator(()ident(pos) operator(==) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + reserved(if) operator(()ident(pos) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + operator(--)ident(p)operator(;) + operator(}) + reserved(while) operator(()ident(pbeg) operator(<=) ident(p)operator(\)) operator({) + reserved(if) operator((*)ident(p) operator(==) ident(c)operator(\)) reserved(return) ident(LONG2NUM)operator((()pre_type(char)operator(*\))ident(p) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(p)operator(--;) + operator(}) + reserved(return) ident(Qnil)operator(;) + operator(}) + + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(type mismatch: %s given)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(sub)operator(\)\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * str =~ obj => fixnum or nil + * + * Match---If <i>obj</i> is a <code>Regexp</code>, use it as a pattern to match + * against <i>str</i>,and returns the position the match starts, or + * <code>nil</code> if there is no match. Otherwise, invokes + * <i>obj.=~</i>, passing <i>str</i> as an argument. The default + * <code>=~</code> in <code>Object</code> returns <code>false</code>. + * + * "cat o' 9 tails" =~ /\\d/ #=> 7 + * "cat o' 9 tails" =~ 9 #=> false + */) + +directive(static) ident(VALUE) +ident(rb_str_match)operator(()ident(x)operator(,) ident(y)operator(\)) + ident(VALUE) ident(x)operator(,) ident(y)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(y)operator(\)\)) operator({) + reserved(case) label(T_STRING)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(type mismatch: String given)delimiter(")>operator(\);) + + reserved(case) label(T_REGEXP)operator(:) + reserved(return) ident(rb_reg_match)operator(()ident(y)operator(,) ident(x)operator(\);) + + reserved(default)operator(:) + reserved(return) ident(rb_funcall)operator(()ident(y)operator(,) ident(rb_intern)operator(()string<delimiter(")content(=~)delimiter(")>operator(\),) integer(1)operator(,) ident(x)operator(\);) + operator(}) +operator(}) + + +directive(static) ident(VALUE) ident(get_pat) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(\)\);) + + +comment(/* + * call-seq: + * str.match(pattern\) => matchdata or nil + * + * Converts <i>pattern</i> to a <code>Regexp</code> (if it isn't already one\), + * then invokes its <code>match</code> method on <i>str</i>. + * + * 'hello'.match('(.\)\\1'\) #=> #<MatchData:0x401b3d30> + * 'hello'.match('(.\)\\1'\)[0] #=> "ll" + * 'hello'.match(/(.\)\\1/\)[0] #=> "ll" + * 'hello'.match('xx'\) #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_str_match_m)operator(()ident(str)operator(,) ident(re)operator(\)) + ident(VALUE) ident(str)operator(,) ident(re)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(get_pat)operator(()ident(re)operator(,) integer(0)operator(\),) ident(rb_intern)operator(()string<delimiter(")content(match)delimiter(")>operator(\),) integer(1)operator(,) ident(str)operator(\);) +operator(}) + +directive(static) pre_type(char) +ident(succ_char)operator(()ident(s)operator(\)) + pre_type(char) operator(*)ident(s)operator(;) +operator({) + pre_type(char) ident(c) operator(=) operator(*)ident(s)operator(;) + + comment(/* numerics */) + reserved(if) operator(()char('0') operator(<=) ident(c) operator(&&) ident(c) operator(<) char('9')operator(\)) operator((*)ident(s)operator(\)++;) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('9')operator(\)) operator({) + operator(*)ident(s) operator(=) char('0')operator(;) + reserved(return) char('1')operator(;) + operator(}) + comment(/* small alphabets */) + reserved(else) reserved(if) operator(()char('a') operator(<=) ident(c) operator(&&) ident(c) operator(<) char('z')operator(\)) operator((*)ident(s)operator(\)++;) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('z')operator(\)) operator({) + reserved(return) operator(*)ident(s) operator(=) char('a')operator(;) + operator(}) + comment(/* capital alphabets */) + reserved(else) reserved(if) operator(()char('A') operator(<=) ident(c) operator(&&) ident(c) operator(<) char('Z')operator(\)) operator((*)ident(s)operator(\)++;) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('Z')operator(\)) operator({) + reserved(return) operator(*)ident(s) operator(=) char('A')operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.succ => new_str + * str.next => new_str + * + * Returns the successor to <i>str</i>. The successor is calculated by + * incrementing characters starting from the rightmost alphanumeric (or + * the rightmost character if there are no alphanumerics\) in the + * string. Incrementing a digit always results in another digit, and + * incrementing a letter results in another letter of the same case. + * Incrementing nonalphanumerics uses the underlying character set's + * collating sequence. + * + * If the increment generates a ``carry,'' the character to the left of + * it is incremented. This process repeats until there is no carry, + * adding an additional character if necessary. + * + * "abcd".succ #=> "abce" + * "THX1138".succ #=> "THX1139" + * "<<koala>>".succ #=> "<<koalb>>" + * "1999zzz".succ #=> "2000aaa" + * "ZZZ9999".succ #=> "AAAA0000" + * "***".succ #=> "**+" + */) + +directive(static) ident(VALUE) +ident(rb_str_succ)operator(()ident(orig)operator(\)) + ident(VALUE) ident(orig)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + pre_type(char) operator(*)ident(sbeg)operator(,) operator(*)ident(s)operator(;) + pre_type(int) ident(c) operator(=) operator(-)integer(1)operator(;) + pre_type(long) ident(n) operator(=) integer(0)operator(;) + + ident(str) operator(=) ident(rb_str_new5)operator(()ident(orig)operator(,) ident(RSTRING)operator(()ident(orig)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(orig)operator(\)->)ident(len)operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(orig)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(str)operator(;) + + ident(sbeg) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(s) operator(=) ident(sbeg) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) integer(1)operator(;) + + reserved(while) operator(()ident(sbeg) operator(<=) ident(s)operator(\)) operator({) + reserved(if) operator(()ident(ISALNUM)operator((*)ident(s)operator(\)\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(succ_char)operator(()ident(s)operator(\)\)) operator(==) integer(0)operator(\)) reserved(break)operator(;) + ident(n) operator(=) ident(s) operator(-) ident(sbeg)operator(;) + operator(}) + ident(s)operator(--;) + operator(}) + reserved(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) operator({) comment(/* str contains no alnum */) + ident(sbeg) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(s) operator(=) ident(sbeg) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) integer(1)operator(;) + ident(c) operator(=) char('\\001')operator(;) + reserved(while) operator(()ident(sbeg) operator(<=) ident(s)operator(\)) operator({) + reserved(if) operator(((*)ident(s) operator(+=) integer(1)operator(\)) operator(!=) integer(0)operator(\)) reserved(break)operator(;) + ident(s)operator(--;) + operator(}) + operator(}) + reserved(if) operator(()ident(s) operator(<) ident(sbeg)operator(\)) operator({) + ident(RESIZE_CAPA)operator(()ident(str)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+) integer(1)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(n)operator(;) + ident(memmove)operator(()ident(s)operator(+)integer(1)operator(,) ident(s)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(n)operator(\);) + operator(*)ident(s) operator(=) ident(c)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+=) integer(1)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + operator(}) + + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.succ! => str + * str.next! => str + * + * Equivalent to <code>String#succ</code>, but modifies the receiver in + * place. + */) + +directive(static) ident(VALUE) +ident(rb_str_succ_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(rb_str_shared_replace)operator(()ident(str)operator(,) ident(rb_str_succ)operator(()ident(str)operator(\)\);) + + reserved(return) ident(str)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_upto)operator(()ident(beg)operator(,) ident(end)operator(,) ident(excl)operator(\)) + ident(VALUE) ident(beg)operator(,) ident(end)operator(;) + pre_type(int) ident(excl)operator(;) +operator({) + ident(VALUE) ident(current)operator(,) ident(after_end)operator(;) + ident(ID) ident(succ) operator(=) ident(rb_intern)operator(()string<delimiter(")content(succ)delimiter(")>operator(\);) + pre_type(int) ident(n)operator(;) + + ident(StringValue)operator(()ident(end)operator(\);) + ident(n) operator(=) ident(rb_str_cmp)operator(()ident(beg)operator(,) ident(end)operator(\);) + reserved(if) operator(()ident(n) operator(>) integer(0) operator(||) operator(()ident(excl) operator(&&) ident(n) operator(==) integer(0)operator(\)\)) reserved(return) ident(beg)operator(;) + ident(after_end) operator(=) ident(rb_funcall)operator(()ident(end)operator(,) ident(succ)operator(,) integer(0)operator(,) integer(0)operator(\);) + ident(current) operator(=) ident(beg)operator(;) + reserved(while) operator((!)ident(rb_str_equal)operator(()ident(current)operator(,) ident(after_end)operator(\)\)) operator({) + ident(rb_yield)operator(()ident(current)operator(\);) + reserved(if) operator((!)ident(excl) operator(&&) ident(rb_str_equal)operator(()ident(current)operator(,) ident(end)operator(\)\)) reserved(break)operator(;) + ident(current) operator(=) ident(rb_funcall)operator(()ident(current)operator(,) ident(succ)operator(,) integer(0)operator(,) integer(0)operator(\);) + ident(StringValue)operator(()ident(current)operator(\);) + reserved(if) operator(()ident(excl) operator(&&) ident(rb_str_equal)operator(()ident(current)operator(,) ident(end)operator(\)\)) reserved(break)operator(;) + ident(StringValue)operator(()ident(current)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(current)operator(\)->)ident(len) operator(>) ident(RSTRING)operator(()ident(end)operator(\)->)ident(len) operator(||) ident(RSTRING)operator(()ident(current)operator(\)->)ident(len) operator(==) integer(0)operator(\)) + reserved(break)operator(;) + operator(}) + + reserved(return) ident(beg)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.upto(other_str\) {|s| block } => str + * + * Iterates through successive values, starting at <i>str</i> and + * ending at <i>other_str</i> inclusive, passing each value in turn to + * the block. The <code>String#succ</code> method is used to generate + * each value. + * + * "a8".upto("b6"\) {|s| print s, ' ' } + * for s in "a8".."b6" + * print s, ' ' + * end + * + * <em>produces:</em> + * + * a8 a9 b0 b1 b2 b3 b4 b5 b6 + * a8 a9 b0 b1 b2 b3 b4 b5 b6 + */) + +directive(static) ident(VALUE) +ident(rb_str_upto_m)operator(()ident(beg)operator(,) ident(end)operator(\)) + ident(VALUE) ident(beg)operator(,) ident(end)operator(;) +operator({) + reserved(return) ident(rb_str_upto)operator(()ident(beg)operator(,) ident(end)operator(,) ident(Qfalse)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_str_subpat)operator(()ident(str)operator(,) ident(re)operator(,) ident(nth)operator(\)) + ident(VALUE) ident(str)operator(,) ident(re)operator(;) + pre_type(int) ident(nth)operator(;) +operator({) + reserved(if) operator(()ident(rb_reg_search)operator(()ident(re)operator(,) ident(str)operator(,) integer(0)operator(,) integer(0)operator(\)) operator(>=) integer(0)operator(\)) operator({) + reserved(return) ident(rb_reg_nth_match)operator(()ident(nth)operator(,) ident(rb_backref_get)operator((\)\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_str_aref)operator(()ident(str)operator(,) ident(indx)operator(\)) + ident(VALUE) ident(str)operator(;) + ident(VALUE) ident(indx)operator(;) +operator({) + pre_type(long) ident(idx)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(indx)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(idx) operator(=) ident(FIX2LONG)operator(()ident(indx)operator(\);) + + label(num_index)operator(:) + reserved(if) operator(()ident(idx) operator(<) integer(0)operator(\)) operator({) + ident(idx) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+) ident(idx)operator(;) + operator(}) + reserved(if) operator(()ident(idx) operator(<) integer(0) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<=) ident(idx)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(idx)operator(]) operator(&) hex(0xff)operator(\);) + + reserved(case) label(T_REGEXP)operator(:) + reserved(return) ident(rb_str_subpat)operator(()ident(str)operator(,) ident(indx)operator(,) integer(0)operator(\);) + + reserved(case) label(T_STRING)operator(:) + reserved(if) operator(()ident(rb_str_index)operator(()ident(str)operator(,) ident(indx)operator(,) integer(0)operator(\)) operator(!=) operator(-)integer(1)operator(\)) + reserved(return) ident(rb_str_dup)operator(()ident(indx)operator(\);) + reserved(return) ident(Qnil)operator(;) + + reserved(default)operator(:) + comment(/* check if indx is Range */) + operator({) + pre_type(long) ident(beg)operator(,) ident(len)operator(;) + ident(VALUE) ident(tmp)operator(;) + + reserved(switch) operator(()ident(rb_range_beg_len)operator(()ident(indx)operator(,) operator(&)ident(beg)operator(,) operator(&)ident(len)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) integer(0)operator(\)\)) operator({) + reserved(case) label(Qfalse)operator(:) + reserved(break)operator(;) + reserved(case) label(Qnil)operator(:) + reserved(return) ident(Qnil)operator(;) + reserved(default)operator(:) + ident(tmp) operator(=) ident(rb_str_substr)operator(()ident(str)operator(,) ident(beg)operator(,) ident(len)operator(\);) + ident(OBJ_INFECT)operator(()ident(tmp)operator(,) ident(indx)operator(\);) + reserved(return) ident(tmp)operator(;) + operator(}) + operator(}) + ident(idx) operator(=) ident(NUM2LONG)operator(()ident(indx)operator(\);) + reserved(goto) ident(num_index)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + + +comment(/* + * call-seq: + * str[fixnum] => fixnum or nil + * str[fixnum, fixnum] => new_str or nil + * str[range] => new_str or nil + * str[regexp] => new_str or nil + * str[regexp, fixnum] => new_str or nil + * str[other_str] => new_str or nil + * str.slice(fixnum\) => fixnum or nil + * str.slice(fixnum, fixnum\) => new_str or nil + * str.slice(range\) => new_str or nil + * str.slice(regexp\) => new_str or nil + * str.slice(regexp, fixnum\) => new_str or nil + * str.slice(other_str\) => new_str or nil + * + * Element Reference---If passed a single <code>Fixnum</code>, returns the code + * of the character at that position. If passed two <code>Fixnum</code> + * objects, returns a substring starting at the offset given by the first, and + * a length given by the second. If given a range, a substring containing + * characters at offsets given by the range is returned. In all three cases, if + * an offset is negative, it is counted from the end of <i>str</i>. Returns + * <code>nil</code> if the initial offset falls outside the string, the length + * is negative, or the beginning of the range is greater than the end. + * + * If a <code>Regexp</code> is supplied, the matching portion of <i>str</i> is + * returned. If a numeric parameter follows the regular expression, that + * component of the <code>MatchData</code> is returned instead. If a + * <code>String</code> is given, that string is returned if it occurs in + * <i>str</i>. In both cases, <code>nil</code> is returned if there is no + * match. + * + * a = "hello there" + * a[1] #=> 101 + * a[1,3] #=> "ell" + * a[1..3] #=> "ell" + * a[-3,2] #=> "er" + * a[-4..-2] #=> "her" + * a[12..-1] #=> nil + * a[-2..-4] #=> "" + * a[/[aeiou](.\)\\1/] #=> "ell" + * a[/[aeiou](.\)\\1/, 0] #=> "ell" + * a[/[aeiou](.\)\\1/, 1] #=> "l" + * a[/[aeiou](.\)\\1/, 2] #=> nil + * a["lo"] #=> "lo" + * a["bye"] #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_str_aref_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_REGEXP)operator(\)) operator({) + reserved(return) ident(rb_str_subpat)operator(()ident(str)operator(,) ident(argv)operator([)integer(0)operator(],) ident(NUM2INT)operator(()ident(argv)operator([)integer(1)operator(]\)\);) + operator(}) + reserved(return) ident(rb_str_substr)operator(()ident(str)operator(,) ident(NUM2LONG)operator(()ident(argv)operator([)integer(0)operator(]\),) ident(NUM2LONG)operator(()ident(argv)operator([)integer(1)operator(]\)\);) + operator(}) + reserved(if) operator(()ident(argc) operator(!=) integer(1)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 1\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + reserved(return) ident(rb_str_aref)operator(()ident(str)operator(,) ident(argv)operator([)integer(0)operator(]\);) +operator(}) + +directive(static) directive(void) +ident(rb_str_splice)operator(()ident(str)operator(,) ident(beg)operator(,) ident(len)operator(,) ident(val)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(long) ident(beg)operator(,) ident(len)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(if) operator(()ident(len) operator(<) integer(0)operator(\)) ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(negative length %ld)delimiter(")>operator(,) ident(len)operator(\);) + + ident(StringValue)operator(()ident(val)operator(\);) + ident(rb_str_modify)operator(()ident(str)operator(\);) + + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<) ident(beg)operator(\)) operator({) + label(out_of_range)operator(:) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %ld out of string)delimiter(")>operator(,) ident(beg)operator(\);) + operator(}) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator((-)ident(beg) operator(>) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + reserved(goto) ident(out_of_range)operator(;) + operator(}) + ident(beg) operator(+=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<) ident(len) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<) ident(beg) operator(+) ident(len)operator(\)) operator({) + ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(beg)operator(;) + operator(}) + + reserved(if) operator(()ident(len) operator(<) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len)operator(\)) operator({) + comment(/* expand string */) + ident(RESIZE_CAPA)operator(()ident(str)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len) operator(-) ident(len) operator(+) integer(1)operator(\);) + operator(}) + + reserved(if) operator(()ident(RSTRING)operator(()ident(val)operator(\)->)ident(len) operator(!=) ident(len)operator(\)) operator({) + ident(memmove)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(beg) operator(+) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len)operator(,) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(beg) operator(+) ident(len)operator(,) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) operator(()ident(beg) operator(+) ident(len)operator(\)\);) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<) ident(beg) operator(&&) ident(len) operator(<) integer(0)operator(\)) operator({) + ident(MEMZERO)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) pre_type(char)operator(,) operator(-)ident(len)operator(\);) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(val)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(memmove)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(+)ident(beg)operator(,) ident(RSTRING)operator(()ident(val)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len)operator(\);) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+=) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len) operator(-) ident(len)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + operator(}) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(val)operator(\);) +operator(}) + +directive(void) +ident(rb_str_update)operator(()ident(str)operator(,) ident(beg)operator(,) ident(len)operator(,) ident(val)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(long) ident(beg)operator(,) ident(len)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(rb_str_splice)operator(()ident(str)operator(,) ident(beg)operator(,) ident(len)operator(,) ident(val)operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_str_subpat_set)operator(()ident(str)operator(,) ident(re)operator(,) ident(nth)operator(,) ident(val)operator(\)) + ident(VALUE) ident(str)operator(,) ident(re)operator(;) + pre_type(int) ident(nth)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(VALUE) ident(match)operator(;) + pre_type(long) ident(start)operator(,) ident(end)operator(,) ident(len)operator(;) + + reserved(if) operator(()ident(rb_reg_search)operator(()ident(re)operator(,) ident(str)operator(,) integer(0)operator(,) integer(0)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(regexp not matched)delimiter(")>operator(\);) + operator(}) + ident(match) operator(=) ident(rb_backref_get)operator((\);) + reserved(if) operator(()ident(nth) operator(>=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(\)) operator({) + label(out_of_range)operator(:) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %d out of regexp)delimiter(")>operator(,) ident(nth)operator(\);) + operator(}) + reserved(if) operator(()ident(nth) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator((-)ident(nth) operator(>=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(\)) operator({) + reserved(goto) ident(out_of_range)operator(;) + operator(}) + ident(nth) operator(+=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(->)ident(num_regs)operator(;) + operator(}) + + ident(start) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(BEG)operator(()ident(nth)operator(\);) + reserved(if) operator(()ident(start) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(regexp group %d not matched)delimiter(")>operator(,) ident(nth)operator(\);) + operator(}) + ident(end) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(END)operator(()ident(nth)operator(\);) + ident(len) operator(=) ident(end) operator(-) ident(start)operator(;) + ident(rb_str_splice)operator(()ident(str)operator(,) ident(start)operator(,) ident(len)operator(,) ident(val)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_str_aset)operator(()ident(str)operator(,) ident(indx)operator(,) ident(val)operator(\)) + ident(VALUE) ident(str)operator(;) + ident(VALUE) ident(indx)operator(,) ident(val)operator(;) +operator({) + pre_type(long) ident(idx)operator(,) ident(beg)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(indx)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(idx) operator(=) ident(FIX2LONG)operator(()ident(indx)operator(\);) + label(num_index)operator(:) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<=) ident(idx)operator(\)) operator({) + label(out_of_range)operator(:) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(index %ld out of string)delimiter(")>operator(,) ident(idx)operator(\);) + operator(}) + reserved(if) operator(()ident(idx) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator((-)ident(idx) operator(>) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) + reserved(goto) ident(out_of_range)operator(;) + ident(idx) operator(+=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + operator(}) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(val)operator(\)\)) operator({) + ident(rb_str_modify)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) ident(idx)operator(\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+=) integer(1)operator(;) + ident(RESIZE_CAPA)operator(()ident(str)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(idx)operator(]) operator(=) ident(FIX2INT)operator(()ident(val)operator(\)) operator(&) hex(0xff)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_str_splice)operator(()ident(str)operator(,) ident(idx)operator(,) integer(1)operator(,) ident(val)operator(\);) + operator(}) + reserved(return) ident(val)operator(;) + + reserved(case) label(T_REGEXP)operator(:) + ident(rb_str_subpat_set)operator(()ident(str)operator(,) ident(indx)operator(,) integer(0)operator(,) ident(val)operator(\);) + reserved(return) ident(val)operator(;) + + reserved(case) label(T_STRING)operator(:) + ident(beg) operator(=) ident(rb_str_index)operator(()ident(str)operator(,) ident(indx)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(string not matched)delimiter(")>operator(\);) + operator(}) + ident(rb_str_splice)operator(()ident(str)operator(,) ident(beg)operator(,) ident(RSTRING)operator(()ident(indx)operator(\)->)ident(len)operator(,) ident(val)operator(\);) + reserved(return) ident(val)operator(;) + + reserved(default)operator(:) + comment(/* check if indx is Range */) + operator({) + pre_type(long) ident(beg)operator(,) ident(len)operator(;) + reserved(if) operator(()ident(rb_range_beg_len)operator(()ident(indx)operator(,) operator(&)ident(beg)operator(,) operator(&)ident(len)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) integer(2)operator(\)\)) operator({) + ident(rb_str_splice)operator(()ident(str)operator(,) ident(beg)operator(,) ident(len)operator(,) ident(val)operator(\);) + reserved(return) ident(val)operator(;) + operator(}) + operator(}) + ident(idx) operator(=) ident(NUM2LONG)operator(()ident(indx)operator(\);) + reserved(goto) ident(num_index)operator(;) + operator(}) +operator(}) + +comment(/* + * call-seq: + * str[fixnum] = fixnum + * str[fixnum] = new_str + * str[fixnum, fixnum] = new_str + * str[range] = aString + * str[regexp] = new_str + * str[regexp, fixnum] = new_str + * str[other_str] = new_str + * + * Element Assignment---Replaces some or all of the content of <i>str</i>. The + * portion of the string affected is determined using the same criteria as + * <code>String#[]</code>. If the replacement string is not the same length as + * the text it is replacing, the string will be adjusted accordingly. If the + * regular expression or string is used as the index doesn't match a position + * in the string, <code>IndexError</code> is raised. If the regular expression + * form is used, the optional second <code>Fixnum</code> allows you to specify + * which portion of the match to replace (effectively using the + * <code>MatchData</code> indexing rules. The forms that take a + * <code>Fixnum</code> will raise an <code>IndexError</code> if the value is + * out of range; the <code>Range</code> form will raise a + * <code>RangeError</code>, and the <code>Regexp</code> and <code>String</code> + * forms will silently ignore the assignment. + */) + +directive(static) ident(VALUE) +ident(rb_str_aset_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator(()ident(argc) operator(==) integer(3)operator(\)) operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(argv)operator([)integer(0)operator(]\)) operator(==) ident(T_REGEXP)operator(\)) operator({) + ident(rb_str_subpat_set)operator(()ident(str)operator(,) ident(argv)operator([)integer(0)operator(],) ident(NUM2INT)operator(()ident(argv)operator([)integer(1)operator(]\),) ident(argv)operator([)integer(2)operator(]\);) + operator(}) + reserved(else) operator({) + ident(rb_str_splice)operator(()ident(str)operator(,) ident(NUM2LONG)operator(()ident(argv)operator([)integer(0)operator(]\),) ident(NUM2LONG)operator(()ident(argv)operator([)integer(1)operator(]\),) ident(argv)operator([)integer(2)operator(]\);) + operator(}) + reserved(return) ident(argv)operator([)integer(2)operator(];) + operator(}) + reserved(if) operator(()ident(argc) operator(!=) integer(2)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 2\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + reserved(return) ident(rb_str_aset)operator(()ident(str)operator(,) ident(argv)operator([)integer(0)operator(],) ident(argv)operator([)integer(1)operator(]\);) +operator(}) + +comment(/* + * call-seq: + * str.insert(index, other_str\) => str + * + * Inserts <i>other_str</i> before the character at the given + * <i>index</i>, modifying <i>str</i>. Negative indices count from the + * end of the string, and insert <em>after</em> the given character. + * The intent is insert <i>aString</i> so that it starts at the given + * <i>index</i>. + * + * "abcd".insert(0, 'X'\) #=> "Xabcd" + * "abcd".insert(3, 'X'\) #=> "abcXd" + * "abcd".insert(4, 'X'\) #=> "abcdX" + * "abcd".insert(-3, 'X'\) #=> "abXcd" + * "abcd".insert(-1, 'X'\) #=> "abcdX" + */) + +directive(static) ident(VALUE) +ident(rb_str_insert)operator(()ident(str)operator(,) ident(idx)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str)operator(,) ident(idx)operator(,) ident(str2)operator(;) +operator({) + pre_type(long) ident(pos) operator(=) ident(NUM2LONG)operator(()ident(idx)operator(\);) + + reserved(if) operator(()ident(pos) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(pos) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(pos)operator(++;) + operator(}) + ident(rb_str_splice)operator(()ident(str)operator(,) ident(pos)operator(,) integer(0)operator(,) ident(str2)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * str.slice!(fixnum\) => fixnum or nil + * str.slice!(fixnum, fixnum\) => new_str or nil + * str.slice!(range\) => new_str or nil + * str.slice!(regexp\) => new_str or nil + * str.slice!(other_str\) => new_str or nil + * + * Deletes the specified portion from <i>str</i>, and returns the portion + * deleted. The forms that take a <code>Fixnum</code> will raise an + * <code>IndexError</code> if the value is out of range; the <code>Range</code> + * form will raise a <code>RangeError</code>, and the <code>Regexp</code> and + * <code>String</code> forms will silently ignore the assignment. + * + * string = "this is a string" + * string.slice!(2\) #=> 105 + * string.slice!(3..6\) #=> " is " + * string.slice!(/s.*t/\) #=> "sa st" + * string.slice!("r"\) #=> "r" + * string #=> "thing" + */) + +directive(static) ident(VALUE) +ident(rb_str_slice_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(result)operator(;) + ident(VALUE) ident(buf)operator([)integer(3)operator(];) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(argc) operator(<) integer(1) operator(||) integer(2) operator(<) ident(argc)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 1\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(buf)operator([)ident(i)operator(]) operator(=) ident(argv)operator([)ident(i)operator(];) + operator(}) + ident(buf)operator([)ident(i)operator(]) operator(=) ident(rb_str_new)operator(()integer(0)operator(,)integer(0)operator(\);) + ident(result) operator(=) ident(rb_str_aref_m)operator(()ident(argc)operator(,) ident(buf)operator(,) ident(str)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(result)operator(\)\)) operator({) + ident(rb_str_aset_m)operator(()ident(argc)operator(+)integer(1)operator(,) ident(buf)operator(,) ident(str)operator(\);) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(get_pat)operator(()ident(pat)operator(,) ident(quote)operator(\)) + ident(VALUE) ident(pat)operator(;) + pre_type(int) ident(quote)operator(;) +operator({) + ident(VALUE) ident(val)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(pat)operator(\)\)) operator({) + reserved(case) label(T_REGEXP)operator(:) + reserved(return) ident(pat)operator(;) + + reserved(case) label(T_STRING)operator(:) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(val) operator(=) ident(rb_check_string_type)operator(()ident(pat)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(val)operator(\)\)) operator({) + ident(Check_Type)operator(()ident(pat)operator(,) ident(T_REGEXP)operator(\);) + operator(}) + ident(pat) operator(=) ident(val)operator(;) + operator(}) + + reserved(if) operator(()ident(quote)operator(\)) operator({) + ident(pat) operator(=) ident(rb_reg_quote)operator(()ident(pat)operator(\);) + operator(}) + + reserved(return) ident(rb_reg_regcomp)operator(()ident(pat)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.sub!(pattern, replacement\) => str or nil + * str.sub!(pattern\) {|match| block } => str or nil + * + * Performs the substitutions of <code>String#sub</code> in place, + * returning <i>str</i>, or <code>nil</code> if no substitutions were + * performed. + */) + +directive(static) ident(VALUE) +ident(rb_str_sub_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(pat)operator(,) ident(repl)operator(,) ident(match)operator(;) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) + pre_type(int) ident(iter) operator(=) integer(0)operator(;) + pre_type(int) ident(tainted) operator(=) integer(0)operator(;) + pre_type(long) ident(plen)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(1) operator(&&) ident(rb_block_given_p)operator((\)\)) operator({) + ident(iter) operator(=) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(repl) operator(=) ident(argv)operator([)integer(1)operator(];) + ident(StringValue)operator(()ident(repl)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(repl)operator(\)\)) ident(tainted) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 2\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + + ident(pat) operator(=) ident(get_pat)operator(()ident(argv)operator([)integer(0)operator(],) integer(1)operator(\);) + reserved(if) operator(()ident(rb_reg_search)operator(()ident(pat)operator(,) ident(str)operator(,) integer(0)operator(,) integer(0)operator(\)) operator(>=) integer(0)operator(\)) operator({) + ident(match) operator(=) ident(rb_backref_get)operator((\);) + ident(regs) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(;) + + reserved(if) operator(()ident(iter)operator(\)) operator({) + pre_type(char) operator(*)ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) pre_type(long) ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + + ident(rb_match_busy)operator(()ident(match)operator(\);) + ident(repl) operator(=) ident(rb_obj_as_string)operator(()ident(rb_yield)operator(()ident(rb_reg_nth_match)operator(()integer(0)operator(,) ident(match)operator(\)\)\);) + ident(str_mod_check)operator(()ident(str)operator(,) ident(p)operator(,) ident(len)operator(\);) + ident(str_frozen_check)operator(()ident(str)operator(\);) + ident(rb_backref_set)operator(()ident(match)operator(\);) + operator(}) + reserved(else) operator({) + ident(repl) operator(=) ident(rb_reg_regsub)operator(()ident(repl)operator(,) ident(str)operator(,) ident(regs)operator(\);) + operator(}) + ident(rb_str_modify)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(repl)operator(\)\)) ident(tainted) operator(=) integer(1)operator(;) + ident(plen) operator(=) ident(END)operator(()integer(0)operator(\)) operator(-) ident(BEG)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(repl)operator(\)->)ident(len) operator(>) ident(plen)operator(\)) operator({) + ident(RESIZE_CAPA)operator(()ident(str)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+) ident(RSTRING)operator(()ident(repl)operator(\)->)ident(len) operator(-) ident(plen)operator(\);) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(repl)operator(\)->)ident(len) operator(!=) ident(plen)operator(\)) operator({) + ident(memmove)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(BEG)operator(()integer(0)operator(\)) operator(+) ident(RSTRING)operator(()ident(repl)operator(\)->)ident(len)operator(,) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(BEG)operator(()integer(0)operator(\)) operator(+) ident(plen)operator(,) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(BEG)operator(()integer(0)operator(\)) operator(-) ident(plen)operator(\);) + operator(}) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(BEG)operator(()integer(0)operator(\),) + ident(RSTRING)operator(()ident(repl)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(repl)operator(\)->)ident(len)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+=) ident(RSTRING)operator(()ident(repl)operator(\)->)ident(len) operator(-) ident(plen)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + reserved(if) operator(()ident(tainted)operator(\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + + reserved(return) ident(str)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.sub(pattern, replacement\) => new_str + * str.sub(pattern\) {|match| block } => new_str + * + * Returns a copy of <i>str</i> with the <em>first</em> occurrence of + * <i>pattern</i> replaced with either <i>replacement</i> or the value of the + * block. The <i>pattern</i> will typically be a <code>Regexp</code>; if it is + * a <code>String</code> then no regular expression metacharacters will be + * interpreted (that is <code>/\\d/</code> will match a digit, but + * <code>'\\d'</code> will match a backslash followed by a 'd'\). + * + * If the method call specifies <i>replacement</i>, special variables such as + * <code>$&</code> will not be useful, as substitution into the string occurs + * before the pattern match starts. However, the sequences <code>\\1</code>, + * <code>\\2</code>, etc., may be used. + * + * In the block form, the current match string is passed in as a parameter, and + * variables such as <code>$1</code>, <code>$2</code>, <code>$`</code>, + * <code>$&</code>, and <code>$'</code> will be set appropriately. The value + * returned by the block will be substituted for the match on each call. + * + * The result inherits any tainting in the original string or any supplied + * replacement string. + * + * "hello".sub(/[aeiou]/, '*'\) #=> "h*llo" + * "hello".sub(/([aeiou]\)/, '<\\1>'\) #=> "h<e>llo" + * "hello".sub(/./\) {|s| s[0].to_s + ' ' } #=> "104 ello" + */) + +directive(static) ident(VALUE) +ident(rb_str_sub)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_sub_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(str_gsub)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(,) ident(bang)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) + pre_type(int) ident(bang)operator(;) +operator({) + ident(VALUE) ident(pat)operator(,) ident(val)operator(,) ident(repl)operator(,) ident(match)operator(,) ident(dest)operator(;) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) + pre_type(long) ident(beg)operator(,) ident(n)operator(;) + pre_type(long) ident(offset)operator(,) ident(blen)operator(,) ident(slen)operator(,) ident(len)operator(;) + pre_type(int) ident(iter) operator(=) integer(0)operator(;) + pre_type(char) operator(*)ident(buf)operator(,) operator(*)ident(bp)operator(,) operator(*)ident(sp)operator(,) operator(*)ident(cp)operator(;) + pre_type(int) ident(tainted) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(1) operator(&&) ident(rb_block_given_p)operator((\)\)) operator({) + ident(iter) operator(=) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(repl) operator(=) ident(argv)operator([)integer(1)operator(];) + ident(StringValue)operator(()ident(repl)operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(repl)operator(\)\)) ident(tainted) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 2\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + + ident(pat) operator(=) ident(get_pat)operator(()ident(argv)operator([)integer(0)operator(],) integer(1)operator(\);) + ident(offset)operator(=)integer(0)operator(;) ident(n)operator(=)integer(0)operator(;) + ident(beg) operator(=) ident(rb_reg_search)operator(()ident(pat)operator(,) ident(str)operator(,) integer(0)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(bang)operator(\)) reserved(return) ident(Qnil)operator(;) comment(/* no match, no substitution */) + reserved(return) ident(rb_str_dup)operator(()ident(str)operator(\);) + operator(}) + + ident(blen) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(+) integer(30)operator(;) comment(/* len + margin */) + ident(dest) operator(=) ident(str_new)operator(()integer(0)operator(,) integer(0)operator(,) ident(blen)operator(\);) + ident(buf) operator(=) ident(RSTRING)operator(()ident(dest)operator(\)->)ident(ptr)operator(;) + ident(bp) operator(=) ident(buf)operator(;) + ident(sp) operator(=) ident(cp) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(slen) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + + ident(rb_str_locktmp)operator(()ident(dest)operator(\);) + reserved(while) operator(()ident(beg) operator(>=) integer(0)operator(\)) operator({) + ident(n)operator(++;) + ident(match) operator(=) ident(rb_backref_get)operator((\);) + ident(regs) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(;) + reserved(if) operator(()ident(iter)operator(\)) operator({) + ident(rb_match_busy)operator(()ident(match)operator(\);) + ident(val) operator(=) ident(rb_obj_as_string)operator(()ident(rb_yield)operator(()ident(rb_reg_nth_match)operator(()integer(0)operator(,) ident(match)operator(\)\)\);) + ident(str_mod_check)operator(()ident(str)operator(,) ident(sp)operator(,) ident(slen)operator(\);) + reserved(if) operator(()ident(bang)operator(\)) ident(str_frozen_check)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(val) operator(==) ident(dest)operator(\)) operator({) comment(/* paranoid chack [ruby-dev:24827] */) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(block should not cheat)delimiter(")>operator(\);) + operator(}) + ident(rb_backref_set)operator(()ident(match)operator(\);) + operator(}) + reserved(else) operator({) + ident(val) operator(=) ident(rb_reg_regsub)operator(()ident(repl)operator(,) ident(str)operator(,) ident(regs)operator(\);) + operator(}) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(val)operator(\)\)) ident(tainted) operator(=) integer(1)operator(;) + ident(len) operator(=) operator(()ident(bp) operator(-) ident(buf)operator(\)) operator(+) operator(()ident(beg) operator(-) ident(offset)operator(\)) operator(+) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len) operator(+) integer(3)operator(;) + reserved(if) operator(()ident(blen) operator(<) ident(len)operator(\)) operator({) + reserved(while) operator(()ident(blen) operator(<) ident(len)operator(\)) ident(blen) operator(*=) integer(2)operator(;) + ident(len) operator(=) ident(bp) operator(-) ident(buf)operator(;) + ident(RESIZE_CAPA)operator(()ident(dest)operator(,) ident(blen)operator(\);) + ident(RSTRING)operator(()ident(dest)operator(\)->)ident(len) operator(=) ident(blen)operator(;) + ident(buf) operator(=) ident(RSTRING)operator(()ident(dest)operator(\)->)ident(ptr)operator(;) + ident(bp) operator(=) ident(buf) operator(+) ident(len)operator(;) + operator(}) + ident(len) operator(=) ident(beg) operator(-) ident(offset)operator(;) comment(/* copy pre-match substr */) + ident(memcpy)operator(()ident(bp)operator(,) ident(cp)operator(,) ident(len)operator(\);) + ident(bp) operator(+=) ident(len)operator(;) + ident(memcpy)operator(()ident(bp)operator(,) ident(RSTRING)operator(()ident(val)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len)operator(\);) + ident(bp) operator(+=) ident(RSTRING)operator(()ident(val)operator(\)->)ident(len)operator(;) + ident(offset) operator(=) ident(END)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(BEG)operator(()integer(0)operator(\)) operator(==) ident(END)operator(()integer(0)operator(\)\)) operator({) + comment(/* + * Always consume at least one character of the input string + * in order to prevent infinite loops. + */) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<=) ident(END)operator(()integer(0)operator(\)\)) reserved(break)operator(;) + ident(len) operator(=) ident(mbclen2)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(END)operator(()integer(0)operator(\)],) ident(pat)operator(\);) + ident(memcpy)operator(()ident(bp)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(+)ident(END)operator(()integer(0)operator(\),) ident(len)operator(\);) + ident(bp) operator(+=) ident(len)operator(;) + ident(offset) operator(=) ident(END)operator(()integer(0)operator(\)) operator(+) ident(len)operator(;) + operator(}) + ident(cp) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(+) ident(offset)operator(;) + reserved(if) operator(()ident(offset) operator(>) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) reserved(break)operator(;) + ident(beg) operator(=) ident(rb_reg_search)operator(()ident(pat)operator(,) ident(str)operator(,) ident(offset)operator(,) integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) ident(offset)operator(\)) operator({) + ident(len) operator(=) ident(bp) operator(-) ident(buf)operator(;) + reserved(if) operator(()ident(blen) operator(-) ident(len) operator(<) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(offset)operator(\)) operator({) + ident(blen) operator(=) ident(len) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(offset)operator(;) + ident(RESIZE_CAPA)operator(()ident(dest)operator(,) ident(blen)operator(\);) + ident(buf) operator(=) ident(RSTRING)operator(()ident(dest)operator(\)->)ident(ptr)operator(;) + ident(bp) operator(=) ident(buf) operator(+) ident(len)operator(;) + operator(}) + ident(memcpy)operator(()ident(bp)operator(,) ident(cp)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(offset)operator(\);) + ident(bp) operator(+=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) ident(offset)operator(;) + operator(}) + ident(rb_backref_set)operator(()ident(match)operator(\);) + operator(*)ident(bp) operator(=) char('\\0')operator(;) + ident(rb_str_unlocktmp)operator(()ident(dest)operator(\);) + reserved(if) operator(()ident(bang)operator(\)) operator({) + reserved(if) operator(()ident(str_independent)operator(()ident(str)operator(\)\)) operator({) + ident(free)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + operator(}) + ident(FL_UNSET)operator(()ident(str)operator(,) ident(STR_NOCAPA)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(=) ident(buf)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(capa) operator(=) ident(blen)operator(;) + ident(RSTRING)operator(()ident(dest)operator(\)->)ident(ptr) operator(=) integer(0)operator(;) + ident(RSTRING)operator(()ident(dest)operator(\)->)ident(len) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(RBASIC)operator(()ident(dest)operator(\)->)ident(klass) operator(=) ident(rb_obj_class)operator(()ident(str)operator(\);) + ident(OBJ_INFECT)operator(()ident(dest)operator(,) ident(str)operator(\);) + ident(str) operator(=) ident(dest)operator(;) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(bp) operator(-) ident(buf)operator(;) + + reserved(if) operator(()ident(tainted)operator(\)) ident(OBJ_TAINT)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.gsub!(pattern, replacement\) => str or nil + * str.gsub!(pattern\) {|match| block } => str or nil + * + * Performs the substitutions of <code>String#gsub</code> in place, returning + * <i>str</i>, or <code>nil</code> if no substitutions were performed. + */) + +directive(static) ident(VALUE) +ident(rb_str_gsub_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(str_gsub)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(,) integer(1)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.gsub(pattern, replacement\) => new_str + * str.gsub(pattern\) {|match| block } => new_str + * + * Returns a copy of <i>str</i> with <em>all</em> occurrences of <i>pattern</i> + * replaced with either <i>replacement</i> or the value of the block. The + * <i>pattern</i> will typically be a <code>Regexp</code>; if it is a + * <code>String</code> then no regular expression metacharacters will be + * interpreted (that is <code>/\\d/</code> will match a digit, but + * <code>'\\d'</code> will match a backslash followed by a 'd'\). + * + * If a string is used as the replacement, special variables from the match + * (such as <code>$&</code> and <code>$1</code>\) cannot be substituted into it, + * as substitution into the string occurs before the pattern match + * starts. However, the sequences <code>\\1</code>, <code>\\2</code>, and so on + * may be used to interpolate successive groups in the match. + * + * In the block form, the current match string is passed in as a parameter, and + * variables such as <code>$1</code>, <code>$2</code>, <code>$`</code>, + * <code>$&</code>, and <code>$'</code> will be set appropriately. The value + * returned by the block will be substituted for the match on each call. + * + * The result inherits any tainting in the original string or any supplied + * replacement string. + * + * "hello".gsub(/[aeiou]/, '*'\) #=> "h*ll*" + * "hello".gsub(/([aeiou]\)/, '<\\1>'\) #=> "h<e>ll<o>" + * "hello".gsub(/./\) {|s| s[0].to_s + ' '} #=> "104 101 108 108 111 " + */) + +directive(static) ident(VALUE) +ident(rb_str_gsub)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(str_gsub)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(,) integer(0)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.replace(other_str\) => str + * + * Replaces the contents and taintedness of <i>str</i> with the corresponding + * values in <i>other_str</i>. + * + * s = "hello" #=> "hello" + * s.replace "world" #=> "world" + */) + +directive(static) ident(VALUE) +ident(rb_str_replace)operator(()ident(str)operator(,) ident(str2)operator(\)) + ident(VALUE) ident(str)operator(,) ident(str2)operator(;) +operator({) + reserved(if) operator(()ident(str) operator(==) ident(str2)operator(\)) reserved(return) ident(str)operator(;) + + ident(StringValue)operator(()ident(str2)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str2)operator(,) ident(ELTS_SHARED)operator(\)\)) operator({) + reserved(if) operator(()ident(str_independent)operator(()ident(str)operator(\)\)) operator({) + ident(free)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(;) + ident(FL_SET)operator(()ident(str)operator(,) ident(ELTS_SHARED)operator(\);) + ident(FL_UNSET)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(aux)operator(.)ident(shared)operator(;) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(str_independent)operator(()ident(str)operator(\)\)) operator({) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\);) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(\);) + reserved(if) operator((!)ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) operator({) + ident(make_null_str)operator(()ident(str)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(ptr)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(len)operator(;) + ident(str_make_independent)operator(()ident(str)operator(\);) + operator(}) + reserved(if) operator(()ident(FL_TEST)operator(()ident(str2)operator(,) ident(STR_ASSOC)operator(\)\)) operator({) + ident(FL_SET)operator(()ident(str)operator(,) ident(STR_ASSOC)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(aux)operator(.)ident(shared) operator(=) ident(RSTRING)operator(()ident(str2)operator(\)->)ident(aux)operator(.)ident(shared)operator(;) + operator(}) + operator(}) + + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(str2)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(uscore_get)operator((\)) +operator({) + ident(VALUE) ident(line)operator(;) + + ident(line) operator(=) ident(rb_lastline_get)operator((\);) + reserved(if) operator(()ident(TYPE)operator(()ident(line)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content($_ value need to be String (%s given\))delimiter(")>operator(,) + ident(NIL_P)operator(()ident(line)operator(\)) operator(?) string<delimiter(")content(nil)delimiter(")> operator(:) ident(rb_obj_classname)operator(()ident(line)operator(\)\);) + operator(}) + reserved(return) ident(line)operator(;) +operator(}) + +comment(/* + * call-seq: + * sub!(pattern, replacement\) => $_ or nil + * sub!(pattern\) {|...| block } => $_ or nil + * + * Equivalent to <code>$_.sub!(<i>args</i>\)</code>. + */) + +directive(static) ident(VALUE) +ident(rb_f_sub_bang)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(return) ident(rb_str_sub_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(uscore_get)operator((\)\);) +operator(}) + +comment(/* + * call-seq: + * sub(pattern, replacement\) => $_ + * sub(pattern\) { block } => $_ + * + * Equivalent to <code>$_.sub(<i>args</i>\)</code>, except that + * <code>$_</code> will be updated if substitution occurs. + */) + +directive(static) ident(VALUE) +ident(rb_f_sub)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(rb_str_dup)operator(()ident(uscore_get)operator((\)\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(rb_str_sub_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)\)\)) + reserved(return) ident(str)operator(;) + ident(rb_lastline_set)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * gsub!(pattern, replacement\) => string or nil + * gsub!(pattern\) {|...| block } => string or nil + * + * Equivalent to <code>Kernel::gsub</code>, except <code>nil</code> is + * returned if <code>$_</code> is not modified. + * + * $_ = "quick brown fox" + * gsub! /cat/, '*' #=> nil + * $_ #=> "quick brown fox" + */) + +directive(static) ident(VALUE) +ident(rb_f_gsub_bang)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(return) ident(rb_str_gsub_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(uscore_get)operator((\)\);) +operator(}) + +comment(/* + * call-seq: + * gsub(pattern, replacement\) => string + * gsub(pattern\) {|...| block } => string + * + * Equivalent to <code>$_.gsub...</code>, except that <code>$_</code> + * receives the modified result. + * + * $_ = "quick brown fox" + * gsub /[aeiou]/, '*' #=> "q**ck br*wn f*x" + * $_ #=> "q**ck br*wn f*x" + */) + +directive(static) ident(VALUE) +ident(rb_f_gsub)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(rb_str_dup)operator(()ident(uscore_get)operator((\)\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(rb_str_gsub_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)\)\)) + reserved(return) ident(str)operator(;) + ident(rb_lastline_set)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.reverse! => str + * + * Reverses <i>str</i> in place. + */) + +directive(static) ident(VALUE) +ident(rb_str_reverse_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(e)operator(;) + pre_type(char) ident(c)operator(;) + + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(1)operator(\)) operator({) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(e) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) integer(1)operator(;) + reserved(while) operator(()ident(s) operator(<) ident(e)operator(\)) operator({) + ident(c) operator(=) operator(*)ident(s)operator(;) + operator(*)ident(s)operator(++) operator(=) operator(*)ident(e)operator(;) + operator(*)ident(e)operator(--) operator(=) ident(c)operator(;) + operator(}) + operator(}) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.reverse => new_str + * + * Returns a new string with the characters from <i>str</i> in reverse order. + * + * "stressed".reverse #=> "desserts" + */) + +directive(static) ident(VALUE) +ident(rb_str_reverse)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(obj)operator(;) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(e)operator(,) operator(*)ident(p)operator(;) + + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(<=) integer(1)operator(\)) reserved(return) ident(rb_str_dup)operator(()ident(str)operator(\);) + + ident(obj) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,) integer(0)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(e) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-) integer(1)operator(;) + ident(p) operator(=) ident(RSTRING)operator(()ident(obj)operator(\)->)ident(ptr)operator(;) + + reserved(while) operator(()ident(e) operator(>=) ident(s)operator(\)) operator({) + operator(*)ident(p)operator(++) operator(=) operator(*)ident(e)operator(--;) + operator(}) + ident(OBJ_INFECT)operator(()ident(obj)operator(,) ident(str)operator(\);) + + reserved(return) ident(obj)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.include? other_str => true or false + * str.include? fixnum => true or false + * + * Returns <code>true</code> if <i>str</i> contains the given string or + * character. + * + * "hello".include? "lo" #=> true + * "hello".include? "ol" #=> false + * "hello".include? ?h #=> true + */) + +directive(static) ident(VALUE) +ident(rb_str_include)operator(()ident(str)operator(,) ident(arg)operator(\)) + ident(VALUE) ident(str)operator(,) ident(arg)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(arg)operator(\)\)) operator({) + reserved(if) operator(()ident(memchr)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(FIX2INT)operator(()ident(arg)operator(\),) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) + operator(}) + + ident(StringValue)operator(()ident(arg)operator(\);) + ident(i) operator(=) ident(rb_str_index)operator(()ident(str)operator(,) ident(arg)operator(,) integer(0)operator(\);) + + reserved(if) operator(()ident(i) operator(==) operator(-)integer(1)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.to_i(base=10\) => integer + * + * Returns the result of interpreting leading characters in <i>str</i> as an + * integer base <i>base</i> (2, 8, 10, or 16\). Extraneous characters past the + * end of a valid number are ignored. If there is not a valid number at the + * start of <i>str</i>, <code>0</code> is returned. This method never raises an + * exception. + * + * "12345".to_i #=> 12345 + * "99 red balloons".to_i #=> 99 + * "0a".to_i #=> 0 + * "0a".to_i(16\) #=> 10 + * "hello".to_i #=> 0 + * "1100101".to_i(2\) #=> 101 + * "1100101".to_i(8\) #=> 294977 + * "1100101".to_i(10\) #=> 1100101 + * "1100101".to_i(16\) #=> 17826049 + */) + +directive(static) ident(VALUE) +ident(rb_str_to_i)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(b)operator(;) + pre_type(int) ident(base)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(b)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) ident(base) operator(=) integer(10)operator(;) + reserved(else) ident(base) operator(=) ident(NUM2INT)operator(()ident(b)operator(\);) + + reserved(if) operator(()ident(base) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(illegal radix %d)delimiter(")>operator(,) ident(base)operator(\);) + operator(}) + reserved(return) ident(rb_str_to_inum)operator(()ident(str)operator(,) ident(base)operator(,) ident(Qfalse)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.to_f => float + * + * Returns the result of interpreting leading characters in <i>str</i> as a + * floating point number. Extraneous characters past the end of a valid number + * are ignored. If there is not a valid number at the start of <i>str</i>, + * <code>0.0</code> is returned. This method never raises an exception. + * + * "123.45e1".to_f #=> 1234.5 + * "45.67 degrees".to_f #=> 45.67 + * "thx1138".to_f #=> 0.0 + */) + +directive(static) ident(VALUE) +ident(rb_str_to_f)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(rb_float_new)operator(()ident(rb_str_to_dbl)operator(()ident(str)operator(,) ident(Qfalse)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * str.to_s => str + * str.to_str => str + * + * Returns the receiver. + */) + +directive(static) ident(VALUE) +ident(rb_str_to_s)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator(()ident(rb_obj_class)operator(()ident(str)operator(\)) operator(!=) ident(rb_cString)operator(\)) operator({) + ident(VALUE) ident(dup) operator(=) ident(str_alloc)operator(()ident(rb_cString)operator(\);) + ident(rb_str_replace)operator(()ident(dup)operator(,) ident(str)operator(\);) + reserved(return) ident(dup)operator(;) + operator(}) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * str.inspect => string + * + * Returns a printable version of _str_, with special characters + * escaped. + * + * str = "hello" + * str[3] = 8 + * str.inspect #=> "hel\\010o" + */) + +ident(VALUE) +ident(rb_str_inspect)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + ident(VALUE) ident(result) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")char(\\")delimiter(")>operator(\);) + pre_type(char) ident(s)operator([)integer(5)operator(];) + + ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + pre_type(char) ident(c) operator(=) operator(*)ident(p)operator(++;) + reserved(if) operator(()ident(ismbchar)operator(()ident(c)operator(\)) operator(&&) ident(p) operator(<) ident(pend)operator(\)) operator({) + pre_type(int) ident(len) operator(=) ident(mbclen)operator(()ident(c)operator(\);) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(p) operator(-) integer(1)operator(,) ident(len)operator(\);) + ident(p) operator(+=) ident(len) operator(-) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('"')operator(||) ident(c) operator(==) char('\\\\') operator(||) operator(()ident(c) operator(==) char('#') operator(&&) ident(IS_EVSTR)operator(()ident(p)operator(,) ident(pend)operator(\)\)\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) char('\\\\')operator(;) ident(s)operator([)integer(1)operator(]) operator(=) ident(c)operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(2)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(ISPRINT)operator(()ident(c)operator(\)\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) ident(c)operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(1)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\n')operator(\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) char('\\\\')operator(;) ident(s)operator([)integer(1)operator(]) operator(=) char('n')operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(2)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\r')operator(\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) char('\\\\')operator(;) ident(s)operator([)integer(1)operator(]) operator(=) char('r')operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(2)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\t')operator(\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) char('\\\\')operator(;) ident(s)operator([)integer(1)operator(]) operator(=) char('t')operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(2)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\f')operator(\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) char('\\\\')operator(;) ident(s)operator([)integer(1)operator(]) operator(=) char('f')operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(2)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\013')operator(\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) char('\\\\')operator(;) ident(s)operator([)integer(1)operator(]) operator(=) char('v')operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(2)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\010')operator(\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) char('\\\\')operator(;) ident(s)operator([)integer(1)operator(]) operator(=) char('b')operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(2)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\007')operator(\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) char('\\\\')operator(;) ident(s)operator([)integer(1)operator(]) operator(=) char('a')operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(2)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) oct(033)operator(\)) operator({) + ident(s)operator([)integer(0)operator(]) operator(=) char('\\\\')operator(;) ident(s)operator([)integer(1)operator(]) operator(=) char('e')operator(;) + ident(rb_str_buf_cat)operator(()ident(result)operator(,) ident(s)operator(,) integer(2)operator(\);) + operator(}) + reserved(else) operator({) + ident(sprintf)operator(()ident(s)operator(,) string<delimiter(")char(\\\\)content(%03o)delimiter(")>operator(,) ident(c) operator(&) oct(0377)operator(\);) + ident(rb_str_buf_cat2)operator(()ident(result)operator(,) ident(s)operator(\);) + operator(}) + operator(}) + ident(rb_str_buf_cat2)operator(()ident(result)operator(,) string<delimiter(")char(\\")delimiter(")>operator(\);) + + ident(OBJ_INFECT)operator(()ident(result)operator(,) ident(str)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.dump => new_str + * + * Produces a version of <i>str</i> with all nonprinting characters replaced by + * <code>\\nnn</code> notation and all special characters escaped. + */) + +ident(VALUE) +ident(rb_str_dump)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(long) ident(len)operator(;) + pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + pre_type(char) operator(*)ident(q)operator(,) operator(*)ident(qend)operator(;) + ident(VALUE) ident(result)operator(;) + + ident(len) operator(=) integer(2)operator(;) comment(/* "" */) + ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + pre_type(char) ident(c) operator(=) operator(*)ident(p)operator(++;) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('"')operator(:) reserved(case) char('\\\\')operator(:) + reserved(case) char('\\n')operator(:) reserved(case) char('\\r')operator(:) + reserved(case) char('\\t')operator(:) reserved(case) char('\\f')operator(:) + reserved(case) char('\\013')operator(:) reserved(case) char('\\010')operator(:) reserved(case) char('\\007')operator(:) reserved(case) char('\\033')operator(:) + ident(len) operator(+=) integer(2)operator(;) + reserved(break)operator(;) + + reserved(case) char('#')operator(:) + ident(len) operator(+=) ident(IS_EVSTR)operator(()ident(p)operator(,) ident(pend)operator(\)) operator(?) integer(2) operator(:) integer(1)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(if) operator(()ident(ISPRINT)operator(()ident(c)operator(\)\)) operator({) + ident(len)operator(++;) + operator(}) + reserved(else) operator({) + ident(len) operator(+=) integer(4)operator(;) comment(/* \\nnn */) + operator(}) + reserved(break)operator(;) + operator(}) + operator(}) + + ident(result) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,) integer(0)operator(,) ident(len)operator(\);) + ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(q) operator(=) ident(RSTRING)operator(()ident(result)operator(\)->)ident(ptr)operator(;) ident(qend) operator(=) ident(q) operator(+) ident(len)operator(;) + + operator(*)ident(q)operator(++) operator(=) char('"')operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + pre_type(char) ident(c) operator(=) operator(*)ident(p)operator(++;) + + reserved(if) operator(()ident(c) operator(==) char('"') operator(||) ident(c) operator(==) char('\\\\')operator(\)) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) ident(c)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('#')operator(\)) operator({) + reserved(if) operator(()ident(IS_EVSTR)operator(()ident(p)operator(,) ident(pend)operator(\)\)) operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) char('#')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISPRINT)operator(()ident(c)operator(\)\)) operator({) + operator(*)ident(q)operator(++) operator(=) ident(c)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\n')operator(\)) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) char('n')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\r')operator(\)) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) char('r')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\t')operator(\)) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) char('t')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\f')operator(\)) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) char('f')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\013')operator(\)) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) char('v')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\010')operator(\)) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) char('b')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\007')operator(\)) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) char('a')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(c) operator(==) char('\\033')operator(\)) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + operator(*)ident(q)operator(++) operator(=) char('e')operator(;) + operator(}) + reserved(else) operator({) + operator(*)ident(q)operator(++) operator(=) char('\\\\')operator(;) + ident(sprintf)operator(()ident(q)operator(,) string<delimiter(")content(%03o)delimiter(")>operator(,) ident(c)operator(&)hex(0xff)operator(\);) + ident(q) operator(+=) integer(3)operator(;) + operator(}) + operator(}) + operator(*)ident(q)operator(++) operator(=) char('"')operator(;) + + ident(OBJ_INFECT)operator(()ident(result)operator(,) ident(str)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.upcase! => str or nil + * + * Upcases the contents of <i>str</i>, returning <code>nil</code> if no changes + * were made. + */) + +directive(static) ident(VALUE) +ident(rb_str_upcase_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(;) + pre_type(int) ident(modify) operator(=) integer(0)operator(;) + + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + reserved(if) operator(()ident(ismbchar)operator((*)ident(s)operator(\)\)) operator({) + ident(s)operator(+=)ident(mbclen)operator((*)ident(s)operator(\)) operator(-) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISLOWER)operator((*)ident(s)operator(\)\)) operator({) + operator(*)ident(s) operator(=) ident(toupper)operator((*)ident(s)operator(\);) + ident(modify) operator(=) integer(1)operator(;) + operator(}) + ident(s)operator(++;) + operator(}) + + reserved(if) operator(()ident(modify)operator(\)) reserved(return) ident(str)operator(;) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.upcase => new_str + * + * Returns a copy of <i>str</i> with all lowercase letters replaced with their + * uppercase counterparts. The operation is locale insensitive---only + * characters ``a'' to ``z'' are affected. + * + * "hEllO".upcase #=> "HELLO" + */) + +directive(static) ident(VALUE) +ident(rb_str_upcase)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_upcase_bang)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.downcase! => str or nil + * + * Downcases the contents of <i>str</i>, returning <code>nil</code> if no + * changes were made. + */) + +directive(static) ident(VALUE) +ident(rb_str_downcase_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(;) + pre_type(int) ident(modify) operator(=) integer(0)operator(;) + + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + reserved(if) operator(()ident(ismbchar)operator((*)ident(s)operator(\)\)) operator({) + ident(s)operator(+=)ident(mbclen)operator((*)ident(s)operator(\)) operator(-) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISUPPER)operator((*)ident(s)operator(\)\)) operator({) + operator(*)ident(s) operator(=) ident(tolower)operator((*)ident(s)operator(\);) + ident(modify) operator(=) integer(1)operator(;) + operator(}) + ident(s)operator(++;) + operator(}) + + reserved(if) operator(()ident(modify)operator(\)) reserved(return) ident(str)operator(;) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.downcase => new_str + * + * Returns a copy of <i>str</i> with all uppercase letters replaced with their + * lowercase counterparts. The operation is locale insensitive---only + * characters ``A'' to ``Z'' are affected. + * + * "hEllO".downcase #=> "hello" + */) + +directive(static) ident(VALUE) +ident(rb_str_downcase)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_downcase_bang)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.capitalize! => str or nil + * + * Modifies <i>str</i> by converting the first character to uppercase and the + * remainder to lowercase. Returns <code>nil</code> if no changes are made. + * + * a = "hello" + * a.capitalize! #=> "Hello" + * a #=> "Hello" + * a.capitalize! #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_str_capitalize_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(;) + pre_type(int) ident(modify) operator(=) integer(0)operator(;) + + ident(rb_str_modify)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0) operator(||) operator(!)ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(ISLOWER)operator((*)ident(s)operator(\)\)) operator({) + operator(*)ident(s) operator(=) ident(toupper)operator((*)ident(s)operator(\);) + ident(modify) operator(=) integer(1)operator(;) + operator(}) + reserved(while) operator((++)ident(s) operator(<) ident(send)operator(\)) operator({) + reserved(if) operator(()ident(ismbchar)operator((*)ident(s)operator(\)\)) operator({) + ident(s)operator(+=)ident(mbclen)operator((*)ident(s)operator(\)) operator(-) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISUPPER)operator((*)ident(s)operator(\)\)) operator({) + operator(*)ident(s) operator(=) ident(tolower)operator((*)ident(s)operator(\);) + ident(modify) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(modify)operator(\)) reserved(return) ident(str)operator(;) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.capitalize => new_str + * + * Returns a copy of <i>str</i> with the first character converted to uppercase + * and the remainder to lowercase. + * + * "hello".capitalize #=> "Hello" + * "HELLO".capitalize #=> "Hello" + * "123ABC".capitalize #=> "123abc" + */) + +directive(static) ident(VALUE) +ident(rb_str_capitalize)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_capitalize_bang)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.swapcase! => str or nil + * + * Equivalent to <code>String#swapcase</code>, but modifies the receiver in + * place, returning <i>str</i>, or <code>nil</code> if no changes were made. + */) + +directive(static) ident(VALUE) +ident(rb_str_swapcase_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(;) + pre_type(int) ident(modify) operator(=) integer(0)operator(;) + + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + reserved(if) operator(()ident(ismbchar)operator((*)ident(s)operator(\)\)) operator({) + ident(s)operator(+=)ident(mbclen)operator((*)ident(s)operator(\)) operator(-) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISUPPER)operator((*)ident(s)operator(\)\)) operator({) + operator(*)ident(s) operator(=) ident(tolower)operator((*)ident(s)operator(\);) + ident(modify) operator(=) integer(1)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ISLOWER)operator((*)ident(s)operator(\)\)) operator({) + operator(*)ident(s) operator(=) ident(toupper)operator((*)ident(s)operator(\);) + ident(modify) operator(=) integer(1)operator(;) + operator(}) + ident(s)operator(++;) + operator(}) + + reserved(if) operator(()ident(modify)operator(\)) reserved(return) ident(str)operator(;) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.swapcase => new_str + * + * Returns a copy of <i>str</i> with uppercase alphabetic characters converted + * to lowercase and lowercase characters converted to uppercase. + * + * "Hello".swapcase #=> "hELLO" + * "cYbEr_PuNk11".swapcase #=> "CyBeR_pUnK11" + */) + +directive(static) ident(VALUE) +ident(rb_str_swapcase)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_swapcase_bang)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +reserved(typedef) pre_type(unsigned) pre_type(char) operator(*)ident(USTR)operator(;) + +reserved(struct) ident(tr) operator({) + pre_type(int) ident(gen)operator(,) ident(now)operator(,) ident(max)operator(;) + pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(trnext)operator(()ident(t)operator(\)) + reserved(struct) ident(tr) operator(*)ident(t)operator(;) +operator({) + reserved(for) operator((;;\)) operator({) + reserved(if) operator((!)ident(t)operator(->)ident(gen)operator(\)) operator({) + reserved(if) operator(()ident(t)operator(->)ident(p) operator(==) ident(t)operator(->)ident(pend)operator(\)) reserved(return) operator(-)integer(1)operator(;) + reserved(if) operator(()ident(t)operator(->)ident(p) operator(<) ident(t)operator(->)ident(pend) operator(-) integer(1) operator(&&) operator(*)ident(t)operator(->)ident(p) operator(==) char('\\\\')operator(\)) operator({) + ident(t)operator(->)ident(p)operator(++;) + operator(}) + ident(t)operator(->)ident(now) operator(=) operator(*()ident(USTR)operator(\))ident(t)operator(->)ident(p)operator(++;) + reserved(if) operator(()ident(t)operator(->)ident(p) operator(<) ident(t)operator(->)ident(pend) operator(-) integer(1) operator(&&) operator(*)ident(t)operator(->)ident(p) operator(==) char('-')operator(\)) operator({) + ident(t)operator(->)ident(p)operator(++;) + reserved(if) operator(()ident(t)operator(->)ident(p) operator(<) ident(t)operator(->)ident(pend)operator(\)) operator({) + reserved(if) operator(()ident(t)operator(->)ident(now) operator(>) operator(*()ident(USTR)operator(\))ident(t)operator(->)ident(p)operator(\)) operator({) + ident(t)operator(->)ident(p)operator(++;) + reserved(continue)operator(;) + operator(}) + ident(t)operator(->)ident(gen) operator(=) integer(1)operator(;) + ident(t)operator(->)ident(max) operator(=) operator(*()ident(USTR)operator(\))ident(t)operator(->)ident(p)operator(++;) + operator(}) + operator(}) + reserved(return) ident(t)operator(->)ident(now)operator(;) + operator(}) + reserved(else) reserved(if) operator((++)ident(t)operator(->)ident(now) operator(<) ident(t)operator(->)ident(max)operator(\)) operator({) + reserved(return) ident(t)operator(->)ident(now)operator(;) + operator(}) + reserved(else) operator({) + ident(t)operator(->)ident(gen) operator(=) integer(0)operator(;) + reserved(return) ident(t)operator(->)ident(max)operator(;) + operator(}) + operator(}) +operator(}) + +directive(static) ident(VALUE) ident(rb_str_delete_bang) ident(_)operator((()pre_type(int)operator(,)ident(VALUE)operator(*,)ident(VALUE)operator(\)\);) + +directive(static) ident(VALUE) +ident(tr_trans)operator(()ident(str)operator(,) ident(src)operator(,) ident(repl)operator(,) ident(sflag)operator(\)) + ident(VALUE) ident(str)operator(,) ident(src)operator(,) ident(repl)operator(;) + pre_type(int) ident(sflag)operator(;) +operator({) + reserved(struct) ident(tr) ident(trsrc)operator(,) ident(trrepl)operator(;) + pre_type(int) ident(cflag) operator(=) integer(0)operator(;) + pre_type(int) ident(trans)operator([)integer(256)operator(];) + pre_type(int) ident(i)operator(,) ident(c)operator(,) ident(modify) operator(=) integer(0)operator(;) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(;) + + ident(StringValue)operator(()ident(src)operator(\);) + ident(StringValue)operator(()ident(repl)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0) operator(||) operator(!)ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(trsrc)operator(.)ident(p) operator(=) ident(RSTRING)operator(()ident(src)operator(\)->)ident(ptr)operator(;) ident(trsrc)operator(.)ident(pend) operator(=) ident(trsrc)operator(.)ident(p) operator(+) ident(RSTRING)operator(()ident(src)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(src)operator(\)->)ident(len) operator(>=) integer(2) operator(&&) ident(RSTRING)operator(()ident(src)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(==) char('^')operator(\)) operator({) + ident(cflag)operator(++;) + ident(trsrc)operator(.)ident(p)operator(++;) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(repl)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + reserved(return) ident(rb_str_delete_bang)operator(()integer(1)operator(,) operator(&)ident(src)operator(,) ident(str)operator(\);) + operator(}) + ident(trrepl)operator(.)ident(p) operator(=) ident(RSTRING)operator(()ident(repl)operator(\)->)ident(ptr)operator(;) + ident(trrepl)operator(.)ident(pend) operator(=) ident(trrepl)operator(.)ident(p) operator(+) ident(RSTRING)operator(()ident(repl)operator(\)->)ident(len)operator(;) + ident(trsrc)operator(.)ident(gen) operator(=) ident(trrepl)operator(.)ident(gen) operator(=) integer(0)operator(;) + ident(trsrc)operator(.)ident(now) operator(=) ident(trrepl)operator(.)ident(now) operator(=) integer(0)operator(;) + ident(trsrc)operator(.)ident(max) operator(=) ident(trrepl)operator(.)ident(max) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(cflag)operator(\)) operator({) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(256)operator(;) ident(i)operator(++\)) operator({) + ident(trans)operator([)ident(i)operator(]) operator(=) integer(1)operator(;) + operator(}) + reserved(while) operator((()ident(c) operator(=) ident(trnext)operator((&)ident(trsrc)operator(\)\)) operator(>=) integer(0)operator(\)) operator({) + ident(trans)operator([)ident(c) operator(&) hex(0xff)operator(]) operator(=) operator(-)integer(1)operator(;) + operator(}) + reserved(while) operator((()ident(c) operator(=) ident(trnext)operator((&)ident(trrepl)operator(\)\)) operator(>=) integer(0)operator(\)) + comment(/* retrieve last replacer */)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(256)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(trans)operator([)ident(i)operator(]) operator(>=) integer(0)operator(\)) operator({) + ident(trans)operator([)ident(i)operator(]) operator(=) ident(trrepl)operator(.)ident(now)operator(;) + operator(}) + operator(}) + operator(}) + reserved(else) operator({) + pre_type(int) ident(r)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(256)operator(;) ident(i)operator(++\)) operator({) + ident(trans)operator([)ident(i)operator(]) operator(=) operator(-)integer(1)operator(;) + operator(}) + reserved(while) operator((()ident(c) operator(=) ident(trnext)operator((&)ident(trsrc)operator(\)\)) operator(>=) integer(0)operator(\)) operator({) + ident(r) operator(=) ident(trnext)operator((&)ident(trrepl)operator(\);) + reserved(if) operator(()ident(r) operator(==) operator(-)integer(1)operator(\)) ident(r) operator(=) ident(trrepl)operator(.)ident(now)operator(;) + ident(trans)operator([)ident(c) operator(&) hex(0xff)operator(]) operator(=) ident(r)operator(;) + operator(}) + operator(}) + + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(sflag)operator(\)) operator({) + pre_type(char) operator(*)ident(t) operator(=) ident(s)operator(;) + pre_type(int) ident(c0)operator(,) ident(last) operator(=) operator(-)integer(1)operator(;) + + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + ident(c0) operator(=) operator(*)ident(s)operator(++;) + reserved(if) operator((()ident(c) operator(=) ident(trans)operator([)ident(c0) operator(&) hex(0xff)operator(]\)) operator(>=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(last) operator(==) ident(c)operator(\)) reserved(continue)operator(;) + ident(last) operator(=) ident(c)operator(;) + operator(*)ident(t)operator(++) operator(=) ident(c) operator(&) hex(0xff)operator(;) + ident(modify) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(last) operator(=) operator(-)integer(1)operator(;) + operator(*)ident(t)operator(++) operator(=) ident(c0)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) operator(()ident(t) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) operator(()ident(t) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + ident(modify) operator(=) integer(1)operator(;) + operator(*)ident(t) operator(=) char('\\0')operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + reserved(if) operator((()ident(c) operator(=) ident(trans)operator([*)ident(s) operator(&) hex(0xff)operator(]\)) operator(>=) integer(0)operator(\)) operator({) + operator(*)ident(s) operator(=) ident(c) operator(&) hex(0xff)operator(;) + ident(modify) operator(=) integer(1)operator(;) + operator(}) + ident(s)operator(++;) + operator(}) + operator(}) + + reserved(if) operator(()ident(modify)operator(\)) reserved(return) ident(str)operator(;) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.tr!(from_str, to_str\) => str or nil + * + * Translates <i>str</i> in place, using the same rules as + * <code>String#tr</code>. Returns <i>str</i>, or <code>nil</code> if no + * changes were made. + */) + +directive(static) ident(VALUE) +ident(rb_str_tr_bang)operator(()ident(str)operator(,) ident(src)operator(,) ident(repl)operator(\)) + ident(VALUE) ident(str)operator(,) ident(src)operator(,) ident(repl)operator(;) +operator({) + reserved(return) ident(tr_trans)operator(()ident(str)operator(,) ident(src)operator(,) ident(repl)operator(,) integer(0)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.tr(from_str, to_str\) => new_str + * + * Returns a copy of <i>str</i> with the characters in <i>from_str</i> replaced + * by the corresponding characters in <i>to_str</i>. If <i>to_str</i> is + * shorter than <i>from_str</i>, it is padded with its last character. Both + * strings may use the c1--c2 notation to denote ranges of characters, and + * <i>from_str</i> may start with a <code>^</code>, which denotes all + * characters except those listed. + * + * "hello".tr('aeiou', '*'\) #=> "h*ll*" + * "hello".tr('^aeiou', '*'\) #=> "*e**o" + * "hello".tr('el', 'ip'\) #=> "hippo" + * "hello".tr('a-y', 'b-z'\) #=> "ifmmp" + */) + +directive(static) ident(VALUE) +ident(rb_str_tr)operator(()ident(str)operator(,) ident(src)operator(,) ident(repl)operator(\)) + ident(VALUE) ident(str)operator(,) ident(src)operator(,) ident(repl)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(tr_trans)operator(()ident(str)operator(,) ident(src)operator(,) ident(repl)operator(,) integer(0)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) directive(void) +ident(tr_setup_table)operator(()ident(str)operator(,) ident(table)operator(,) ident(init)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(char) ident(table)operator([)integer(256)operator(];) + pre_type(int) ident(init)operator(;) +operator({) + pre_type(char) ident(buf)operator([)integer(256)operator(];) + reserved(struct) ident(tr) ident(tr)operator(;) + pre_type(int) ident(i)operator(,) ident(c)operator(;) + pre_type(int) ident(cflag) operator(=) integer(0)operator(;) + + ident(tr)operator(.)ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) ident(tr)operator(.)ident(pend) operator(=) ident(tr)operator(.)ident(p) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(tr)operator(.)ident(gen) operator(=) ident(tr)operator(.)ident(now) operator(=) ident(tr)operator(.)ident(max) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(1) operator(&&) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(==) char('^')operator(\)) operator({) + ident(cflag) operator(=) integer(1)operator(;) + ident(tr)operator(.)ident(p)operator(++;) + operator(}) + + reserved(if) operator(()ident(init)operator(\)) operator({) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(256)operator(;) ident(i)operator(++\)) operator({) + ident(table)operator([)ident(i)operator(]) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(256)operator(;) ident(i)operator(++\)) operator({) + ident(buf)operator([)ident(i)operator(]) operator(=) ident(cflag)operator(;) + operator(}) + reserved(while) operator((()ident(c) operator(=) ident(trnext)operator((&)ident(tr)operator(\)\)) operator(>=) integer(0)operator(\)) operator({) + ident(buf)operator([)ident(c) operator(&) hex(0xff)operator(]) operator(=) operator(!)ident(cflag)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(256)operator(;) ident(i)operator(++\)) operator({) + ident(table)operator([)ident(i)operator(]) operator(=) ident(table)operator([)ident(i)operator(]) operator(&&) ident(buf)operator([)ident(i)operator(];) + operator(}) +operator(}) + + +comment(/* + * call-seq: + * str.delete!([other_str]+>\) => str or nil + * + * Performs a <code>delete</code> operation in place, returning <i>str</i>, or + * <code>nil</code> if <i>str</i> was not modified. + */) + +directive(static) ident(VALUE) +ident(rb_str_delete_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(,) operator(*)ident(t)operator(;) + pre_type(char) ident(squeez)operator([)integer(256)operator(];) + pre_type(int) ident(modify) operator(=) integer(0)operator(;) + pre_type(int) ident(init) operator(=) integer(1)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(argc) operator(<) integer(1)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(s) operator(=) ident(argv)operator([)ident(i)operator(];) + + ident(StringValue)operator(()ident(s)operator(\);) + ident(tr_setup_table)operator(()ident(s)operator(,) ident(squeez)operator(,) ident(init)operator(\);) + ident(init) operator(=) integer(0)operator(;) + operator(}) + + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(s) operator(=) ident(t) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(if) operator((!)ident(s) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + reserved(if) operator(()ident(squeez)operator([*)ident(s) operator(&) hex(0xff)operator(]\)) + ident(modify) operator(=) integer(1)operator(;) + reserved(else) + operator(*)ident(t)operator(++) operator(=) operator(*)ident(s)operator(;) + ident(s)operator(++;) + operator(}) + operator(*)ident(t) operator(=) char('\\0')operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(t) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + + reserved(if) operator(()ident(modify)operator(\)) reserved(return) ident(str)operator(;) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.delete([other_str]+\) => new_str + * + * Returns a copy of <i>str</i> with all characters in the intersection of its + * arguments deleted. Uses the same rules for building the set of characters as + * <code>String#count</code>. + * + * "hello".delete "l","lo" #=> "heo" + * "hello".delete "lo" #=> "he" + * "hello".delete "aeiou", "^e" #=> "hell" + * "hello".delete "ej-m" #=> "ho" + */) + +directive(static) ident(VALUE) +ident(rb_str_delete)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_delete_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.squeeze!([other_str]*\) => str or nil + * + * Squeezes <i>str</i> in place, returning either <i>str</i>, or + * <code>nil</code> if no changes were made. + */) + +directive(static) ident(VALUE) +ident(rb_str_squeeze_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) ident(squeez)operator([)integer(256)operator(];) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(,) operator(*)ident(t)operator(;) + pre_type(int) ident(c)operator(,) ident(save)operator(,) ident(modify) operator(=) integer(0)operator(;) + pre_type(int) ident(init) operator(=) integer(1)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(256)operator(;) ident(i)operator(++\)) operator({) + ident(squeez)operator([)ident(i)operator(]) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(s) operator(=) ident(argv)operator([)ident(i)operator(];) + + ident(StringValue)operator(()ident(s)operator(\);) + ident(tr_setup_table)operator(()ident(s)operator(,) ident(squeez)operator(,) ident(init)operator(\);) + ident(init) operator(=) integer(0)operator(;) + operator(}) + operator(}) + + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(s) operator(=) ident(t) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(if) operator((!)ident(s) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(save) operator(=) operator(-)integer(1)operator(;) + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + ident(c) operator(=) operator(*)ident(s)operator(++) operator(&) hex(0xff)operator(;) + reserved(if) operator(()ident(c) operator(!=) ident(save) operator(||) operator(!)ident(squeez)operator([)ident(c)operator(]\)) operator({) + operator(*)ident(t)operator(++) operator(=) ident(save) operator(=) ident(c)operator(;) + operator(}) + operator(}) + operator(*)ident(t) operator(=) char('\\0')operator(;) + reserved(if) operator(()ident(t) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(!=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(t) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(modify) operator(=) integer(1)operator(;) + operator(}) + + reserved(if) operator(()ident(modify)operator(\)) reserved(return) ident(str)operator(;) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.squeeze([other_str]*\) => new_str + * + * Builds a set of characters from the <i>other_str</i> parameter(s\) using the + * procedure described for <code>String#count</code>. Returns a new string + * where runs of the same character that occur in this set are replaced by a + * single character. If no arguments are given, all runs of identical + * characters are replaced by a single character. + * + * "yellow moon".squeeze #=> "yelow mon" + * " now is the".squeeze(" "\) #=> " now is the" + * "putters shoot balls".squeeze("m-z"\) #=> "puters shot balls" + */) + +directive(static) ident(VALUE) +ident(rb_str_squeeze)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_squeeze_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.tr_s!(from_str, to_str\) => str or nil + * + * Performs <code>String#tr_s</code> processing on <i>str</i> in place, + * returning <i>str</i>, or <code>nil</code> if no changes were made. + */) + +directive(static) ident(VALUE) +ident(rb_str_tr_s_bang)operator(()ident(str)operator(,) ident(src)operator(,) ident(repl)operator(\)) + ident(VALUE) ident(str)operator(,) ident(src)operator(,) ident(repl)operator(;) +operator({) + reserved(return) ident(tr_trans)operator(()ident(str)operator(,) ident(src)operator(,) ident(repl)operator(,) integer(1)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.tr_s(from_str, to_str\) => new_str + * + * Processes a copy of <i>str</i> as described under <code>String#tr</code>, + * then removes duplicate characters in regions that were affected by the + * translation. + * + * "hello".tr_s('l', 'r'\) #=> "hero" + * "hello".tr_s('el', '*'\) #=> "h*o" + * "hello".tr_s('el', 'hx'\) #=> "hhxo" + */) + +directive(static) ident(VALUE) +ident(rb_str_tr_s)operator(()ident(str)operator(,) ident(src)operator(,) ident(repl)operator(\)) + ident(VALUE) ident(str)operator(,) ident(src)operator(,) ident(repl)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(tr_trans)operator(()ident(str)operator(,) ident(src)operator(,) ident(repl)operator(,) integer(1)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.count([other_str]+\) => fixnum + * + * Each <i>other_str</i> parameter defines a set of characters to count. The + * intersection of these sets defines the characters to count in + * <i>str</i>. Any <i>other_str</i> that starts with a caret (^\) is + * negated. The sequence c1--c2 means all characters between c1 and c2. + * + * a = "hello world" + * a.count "lo" #=> 5 + * a.count "lo", "o" #=> 2 + * a.count "hello", "^l" #=> 4 + * a.count "ej-m" #=> 4 + */) + +directive(static) ident(VALUE) +ident(rb_str_count)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) ident(table)operator([)integer(256)operator(];) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(send)operator(;) + pre_type(int) ident(init) operator(=) integer(1)operator(;) + pre_type(int) ident(i)operator(;) + + reserved(if) operator(()ident(argc) operator(<) integer(1)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(argc)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(s) operator(=) ident(argv)operator([)ident(i)operator(];) + + ident(StringValue)operator(()ident(s)operator(\);) + ident(tr_setup_table)operator(()ident(s)operator(,) ident(table)operator(,) ident(init)operator(\);) + ident(init) operator(=) integer(0)operator(;) + operator(}) + + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(if) operator((!)ident(s) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + ident(send) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(i) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + reserved(if) operator(()ident(table)operator([*)ident(s)operator(++) operator(&) hex(0xff)operator(]\)) operator({) + ident(i)operator(++;) + operator(}) + operator(}) + reserved(return) ident(INT2NUM)operator(()ident(i)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.split(pattern=$;, [limit]\) => anArray + * + * Divides <i>str</i> into substrings based on a delimiter, returning an array + * of these substrings. + * + * If <i>pattern</i> is a <code>String</code>, then its contents are used as + * the delimiter when splitting <i>str</i>. If <i>pattern</i> is a single + * space, <i>str</i> is split on whitespace, with leading whitespace and runs + * of contiguous whitespace characters ignored. + * + * If <i>pattern</i> is a <code>Regexp</code>, <i>str</i> is divided where the + * pattern matches. Whenever the pattern matches a zero-length string, + * <i>str</i> is split into individual characters. + * + * If <i>pattern</i> is omitted, the value of <code>$;</code> is used. If + * <code>$;</code> is <code>nil</code> (which is the default\), <i>str</i> is + * split on whitespace as if ` ' were specified. + * + * If the <i>limit</i> parameter is omitted, trailing null fields are + * suppressed. If <i>limit</i> is a positive number, at most that number of + * fields will be returned (if <i>limit</i> is <code>1</code>, the entire + * string is returned as the only entry in an array\). If negative, there is no + * limit to the number of fields returned, and trailing null fields are not + * suppressed. + * + * " now's the time".split #=> ["now's", "the", "time"] + * " now's the time".split(' '\) #=> ["now's", "the", "time"] + * " now's the time".split(/ /\) #=> ["", "now's", "", "the", "time"] + * "1, 2.34,56, 7".split(%r{,\\s*}\) #=> ["1", "2.34", "56", "7"] + * "hello".split(//\) #=> ["h", "e", "l", "l", "o"] + * "hello".split(//, 3\) #=> ["h", "e", "llo"] + * "hi mom".split(%r{\\s*}\) #=> ["h", "i", "m", "o", "m"] + * + * "mellow yellow".split("ello"\) #=> ["m", "w y", "w"] + * "1,2,,3,4,,".split(','\) #=> ["1", "2", "", "3", "4"] + * "1,2,,3,4,,".split(',', 4\) #=> ["1", "2", "", "3,4,,"] + * "1,2,,3,4,,".split(',', -4\) #=> ["1", "2", "", "3", "4", "", ""] + */) + +directive(static) ident(VALUE) +ident(rb_str_split_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(spat)operator(;) + ident(VALUE) ident(limit)operator(;) + pre_type(int) ident(awk_split) operator(=) ident(Qfalse)operator(;) + pre_type(long) ident(beg)operator(,) ident(end)operator(,) ident(i) operator(=) integer(0)operator(;) + pre_type(int) ident(lim) operator(=) integer(0)operator(;) + ident(VALUE) ident(result)operator(,) ident(tmp)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(02)delimiter(")>operator(,) operator(&)ident(spat)operator(,) operator(&)ident(limit)operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(lim) operator(=) ident(NUM2INT)operator(()ident(limit)operator(\);) + reserved(if) operator(()ident(lim) operator(<=) integer(0)operator(\)) ident(limit) operator(=) ident(Qnil)operator(;) + reserved(else) reserved(if) operator(()ident(lim) operator(==) integer(1)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) + reserved(return) ident(rb_ary_new2)operator(()integer(0)operator(\);) + reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(str)operator(\);) + operator(}) + ident(i) operator(=) integer(1)operator(;) + operator(}) + + reserved(if) operator(()ident(NIL_P)operator(()ident(spat)operator(\)\)) operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(rb_fs)operator(\)\)) operator({) + ident(spat) operator(=) ident(rb_fs)operator(;) + reserved(goto) ident(fs_set)operator(;) + operator(}) + ident(awk_split) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(else) operator({) + label(fs_set)operator(:) + reserved(if) operator(()ident(TYPE)operator(()ident(spat)operator(\)) operator(==) ident(T_STRING) operator(&&) ident(RSTRING)operator(()ident(spat)operator(\)->)ident(len) operator(==) integer(1)operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(spat)operator(\)->)ident(ptr)operator([)integer(0)operator(]) operator(==) char(' ')operator(\)) operator({) + ident(awk_split) operator(=) ident(Qtrue)operator(;) + operator(}) + reserved(else) operator({) + ident(spat) operator(=) ident(rb_reg_regcomp)operator(()ident(rb_reg_quote)operator(()ident(spat)operator(\)\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(spat) operator(=) ident(get_pat)operator(()ident(spat)operator(,) integer(1)operator(\);) + operator(}) + operator(}) + + ident(result) operator(=) ident(rb_ary_new)operator((\);) + ident(beg) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(awk_split)operator(\)) operator({) + pre_type(char) operator(*)ident(ptr) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + pre_type(long) ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + pre_type(char) operator(*)ident(eptr) operator(=) ident(ptr) operator(+) ident(len)operator(;) + pre_type(int) ident(skip) operator(=) integer(1)operator(;) + + reserved(for) operator(()ident(end) operator(=) ident(beg) operator(=) integer(0)operator(;) ident(ptr)operator(<)ident(eptr)operator(;) ident(ptr)operator(++\)) operator({) + reserved(if) operator(()ident(skip)operator(\)) operator({) + reserved(if) operator(()ident(ISSPACE)operator((*)ident(ptr)operator(\)\)) operator({) + ident(beg)operator(++;) + operator(}) + reserved(else) operator({) + ident(end) operator(=) ident(beg)operator(+)integer(1)operator(;) + ident(skip) operator(=) integer(0)operator(;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(limit)operator(\)) operator(&&) ident(lim) operator(<=) ident(i)operator(\)) reserved(break)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator(()ident(ISSPACE)operator((*)ident(ptr)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_str_substr)operator(()ident(str)operator(,) ident(beg)operator(,) ident(end)operator(-)ident(beg)operator(\)\);) + ident(skip) operator(=) integer(1)operator(;) + ident(beg) operator(=) ident(end) operator(+) integer(1)operator(;) + reserved(if) operator((!)ident(NIL_P)operator(()ident(limit)operator(\)\)) operator(++)ident(i)operator(;) + operator(}) + reserved(else) operator({) + ident(end)operator(++;) + operator(}) + operator(}) + operator(}) + operator(}) + reserved(else) operator({) + pre_type(long) ident(start) operator(=) ident(beg)operator(;) + pre_type(long) ident(idx)operator(;) + pre_type(int) ident(last_null) operator(=) integer(0)operator(;) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) + + reserved(while) operator((()ident(end) operator(=) ident(rb_reg_search)operator(()ident(spat)operator(,) ident(str)operator(,) ident(start)operator(,) integer(0)operator(\)\)) operator(>=) integer(0)operator(\)) operator({) + ident(regs) operator(=) ident(RMATCH)operator(()ident(rb_backref_get)operator((\)\)->)ident(regs)operator(;) + reserved(if) operator(()ident(start) operator(==) ident(end) operator(&&) ident(BEG)operator(()integer(0)operator(\)) operator(==) ident(END)operator(()integer(0)operator(\)\)) operator({) + reserved(if) operator((!)ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_str_new)operator(()string<delimiter(")delimiter(")>operator(,) integer(0)operator(\)\);) + reserved(break)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(last_null) operator(==) integer(1)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_str_substr)operator(()ident(str)operator(,) ident(beg)operator(,) ident(mbclen2)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(beg)operator(],)ident(spat)operator(\)\)\);) + ident(beg) operator(=) ident(start)operator(;) + operator(}) + reserved(else) operator({) + ident(start) operator(+=) ident(mbclen2)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(start)operator(],)ident(spat)operator(\);) + ident(last_null) operator(=) integer(1)operator(;) + reserved(continue)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_str_substr)operator(()ident(str)operator(,) ident(beg)operator(,) ident(end)operator(-)ident(beg)operator(\)\);) + ident(beg) operator(=) ident(start) operator(=) ident(END)operator(()integer(0)operator(\);) + operator(}) + ident(last_null) operator(=) integer(0)operator(;) + + reserved(for) operator(()ident(idx)operator(=)integer(1)operator(;) ident(idx) operator(<) ident(regs)operator(->)ident(num_regs)operator(;) ident(idx)operator(++\)) operator({) + reserved(if) operator(()ident(BEG)operator(()ident(idx)operator(\)) operator(==) operator(-)integer(1)operator(\)) reserved(continue)operator(;) + reserved(if) operator(()ident(BEG)operator(()ident(idx)operator(\)) operator(==) ident(END)operator(()ident(idx)operator(\)\)) + ident(tmp) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,) integer(0)operator(,) integer(0)operator(\);) + reserved(else) + ident(tmp) operator(=) ident(rb_str_substr)operator(()ident(str)operator(,) ident(BEG)operator(()ident(idx)operator(\),) ident(END)operator(()ident(idx)operator(\)-)ident(BEG)operator(()ident(idx)operator(\)\);) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(tmp)operator(\);) + operator(}) + reserved(if) operator((!)ident(NIL_P)operator(()ident(limit)operator(\)) operator(&&) ident(lim) operator(<=) operator(++)ident(i)operator(\)) reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(0) operator(&&) operator((!)ident(NIL_P)operator(()ident(limit)operator(\)) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) ident(beg) operator(||) ident(lim) operator(<) integer(0)operator(\)\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) ident(beg)operator(\)) + ident(tmp) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,) integer(0)operator(,) integer(0)operator(\);) + reserved(else) + ident(tmp) operator(=) ident(rb_str_substr)operator(()ident(str)operator(,) ident(beg)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(-)ident(beg)operator(\);) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(tmp)operator(\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(limit)operator(\)) operator(&&) ident(lim) operator(==) integer(0)operator(\)) operator({) + reserved(while) operator(()ident(RARRAY)operator(()ident(result)operator(\)->)ident(len) operator(>) integer(0) operator(&&) + ident(RSTRING)operator(()ident(RARRAY)operator(()ident(result)operator(\)->)ident(ptr)operator([)ident(RARRAY)operator(()ident(result)operator(\)->)ident(len)operator(-)integer(1)operator(]\)->)ident(len) operator(==) integer(0)operator(\)) + ident(rb_ary_pop)operator(()ident(result)operator(\);) + operator(}) + + reserved(return) ident(result)operator(;) +operator(}) + +ident(VALUE) +ident(rb_str_split)operator(()ident(str)operator(,) ident(sep0)operator(\)) + ident(VALUE) ident(str)operator(;) + directive(const) pre_type(char) operator(*)ident(sep0)operator(;) +operator({) + ident(VALUE) ident(sep)operator(;) + + ident(StringValue)operator(()ident(str)operator(\);) + ident(sep) operator(=) ident(rb_str_new2)operator(()ident(sep0)operator(\);) + reserved(return) ident(rb_str_split_m)operator(()integer(1)operator(,) operator(&)ident(sep)operator(,) ident(str)operator(\);) +operator(}) + +comment(/* + * call-seq: + * split([pattern [, limit]]\) => array + * + * Equivalent to <code>$_.split(<i>pattern</i>, <i>limit</i>\)</code>. + * See <code>String#split</code>. + */) + +directive(static) ident(VALUE) +ident(rb_f_split)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(return) ident(rb_str_split_m)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(uscore_get)operator((\)\);) +operator(}) + +comment(/* + * call-seq: + * str.each(separator=$/\) {|substr| block } => str + * str.each_line(separator=$/\) {|substr| block } => str + * + * Splits <i>str</i> using the supplied parameter as the record separator + * (<code>$/</code> by default\), passing each substring in turn to the supplied + * block. If a zero-length record separator is supplied, the string is split on + * <code>\\n</code> characters, except that multiple successive newlines are + * appended together. + * + * print "Example one\\n" + * "hello\\nworld".each {|s| p s} + * print "Example two\\n" + * "hello\\nworld".each('l'\) {|s| p s} + * print "Example three\\n" + * "hello\\n\\n\\nworld".each(''\) {|s| p s} + * + * <em>produces:</em> + * + * Example one + * "hello\\n" + * "world" + * Example two + * "hel" + * "l" + * "o\\nworl" + * "d" + * Example three + * "hello\\n\\n\\n" + * "world" + */) + +directive(static) ident(VALUE) +ident(rb_str_each_line)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(rs)operator(;) + pre_type(int) ident(newline)operator(;) + pre_type(char) operator(*)ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) operator(*)ident(pend) operator(=) ident(p) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) operator(*)ident(s)operator(;) + pre_type(char) operator(*)ident(ptr) operator(=) ident(p)operator(;) + pre_type(long) ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(,) ident(rslen)operator(;) + ident(VALUE) ident(line)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(rs)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(rs) operator(=) ident(rb_rs)operator(;) + operator(}) + + reserved(if) operator(()ident(NIL_P)operator(()ident(rs)operator(\)\)) operator({) + ident(rb_yield)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) + operator(}) + ident(StringValue)operator(()ident(rs)operator(\);) + ident(rslen) operator(=) ident(RSTRING)operator(()ident(rs)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(rslen) operator(==) integer(0)operator(\)) operator({) + ident(newline) operator(=) char('\\n')operator(;) + operator(}) + reserved(else) operator({) + ident(newline) operator(=) ident(RSTRING)operator(()ident(rs)operator(\)->)ident(ptr)operator([)ident(rslen)operator(-)integer(1)operator(];) + operator(}) + + reserved(for) operator(()ident(s) operator(=) ident(p)operator(,) ident(p) operator(+=) ident(rslen)operator(;) ident(p) operator(<) ident(pend)operator(;) ident(p)operator(++\)) operator({) + reserved(if) operator(()ident(rslen) operator(==) integer(0) operator(&&) operator(*)ident(p) operator(==) char('\\n')operator(\)) operator({) + reserved(if) operator((*++)ident(p) operator(!=) char('\\n')operator(\)) reserved(continue)operator(;) + reserved(while) operator((*)ident(p) operator(==) char('\\n')operator(\)) ident(p)operator(++;) + operator(}) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(<) ident(p) operator(&&) ident(p)operator([-)integer(1)operator(]) operator(==) ident(newline) operator(&&) + operator(()ident(rslen) operator(<=) integer(1) operator(||) + ident(rb_memcmp)operator(()ident(RSTRING)operator(()ident(rs)operator(\)->)ident(ptr)operator(,) ident(p)operator(-)ident(rslen)operator(,) ident(rslen)operator(\)) operator(==) integer(0)operator(\)\)) operator({) + ident(line) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,) ident(s)operator(,) ident(p) operator(-) ident(s)operator(\);) + ident(OBJ_INFECT)operator(()ident(line)operator(,) ident(str)operator(\);) + ident(rb_yield)operator(()ident(line)operator(\);) + ident(str_mod_check)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\);) + ident(s) operator(=) ident(p)operator(;) + operator(}) + operator(}) + + reserved(if) operator(()ident(s) operator(!=) ident(pend)operator(\)) operator({) + reserved(if) operator(()ident(p) operator(>) ident(pend)operator(\)) ident(p) operator(=) ident(pend)operator(;) + ident(line) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,) ident(s)operator(,) ident(p) operator(-) ident(s)operator(\);) + ident(OBJ_INFECT)operator(()ident(line)operator(,) ident(str)operator(\);) + ident(rb_yield)operator(()ident(line)operator(\);) + operator(}) + + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.each_byte {|fixnum| block } => str + * + * Passes each byte in <i>str</i> to the given block. + * + * "hello".each_byte {|c| print c, ' ' } + * + * <em>produces:</em> + * + * 104 101 108 108 111 + */) + +directive(static) ident(VALUE) +ident(rb_str_each_byte)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(INT2FIX)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(&) hex(0xff)operator(\)\);) + operator(}) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.chop! => str or nil + * + * Processes <i>str</i> as for <code>String#chop</code>, returning <i>str</i>, + * or <code>nil</code> if <i>str</i> is the empty string. See also + * <code>String#chomp!</code>. + */) + +directive(static) ident(VALUE) +ident(rb_str_chop_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(--;) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(==) char('\\n')operator(\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(0) operator(&&) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(-)integer(1)operator(]) operator(==) char('\\r')operator(\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(--;) + operator(}) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + reserved(return) ident(str)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.chop => new_str + * + * Returns a new <code>String</code> with the last character removed. If the + * string ends with <code>\\r\\n</code>, both characters are removed. Applying + * <code>chop</code> to an empty string returns an empty + * string. <code>String#chomp</code> is often a safer alternative, as it leaves + * the string unchanged if it doesn't end in a record separator. + * + * "string\\r\\n".chop #=> "string" + * "string\\n\\r".chop #=> "string\\n" + * "string\\n".chop #=> "string" + * "string".chop #=> "strin" + * "x".chop.chop #=> "" + */) + +directive(static) ident(VALUE) +ident(rb_str_chop)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_chop_bang)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * chop! => $_ or nil + * + * Equivalent to <code>$_.chop!</code>. + * + * a = "now\\r\\n" + * $_ = a + * chop! #=> "now" + * chop! #=> "no" + * chop! #=> "n" + * chop! #=> "" + * chop! #=> nil + * $_ #=> "" + * a #=> "" + */) + +directive(static) ident(VALUE) +ident(rb_f_chop_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(rb_str_chop_bang)operator(()ident(uscore_get)operator((\)\);) +operator(}) + +comment(/* + * call-seq: + * chop => string + * + * Equivalent to <code>($_.dup\).chop!</code>, except <code>nil</code> + * is never returned. See <code>String#chop!</code>. + * + * a = "now\\r\\n" + * $_ = a + * chop #=> "now" + * $_ #=> "now" + * chop #=> "no" + * chop #=> "n" + * chop #=> "" + * chop #=> "" + * a #=> "now\\r\\n" + */) + +directive(static) ident(VALUE) +ident(rb_f_chop)operator((\)) +operator({) + ident(VALUE) ident(str) operator(=) ident(uscore_get)operator((\);) + + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(0)operator(\)) operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_chop_bang)operator(()ident(str)operator(\);) + ident(rb_lastline_set)operator(()ident(str)operator(\);) + operator(}) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.chomp!(separator=$/\) => str or nil + * + * Modifies <i>str</i> in place as described for <code>String#chomp</code>, + * returning <i>str</i>, or <code>nil</code> if no modifications were made. + */) + +directive(static) ident(VALUE) +ident(rb_str_chomp_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(rs)operator(;) + pre_type(int) ident(newline)operator(;) + pre_type(char) operator(*)ident(p)operator(;) + pre_type(long) ident(len)operator(,) ident(rslen)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(rs)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(rs) operator(=) ident(rb_rs)operator(;) + reserved(if) operator(()ident(rs) operator(==) ident(rb_default_rs)operator(\)) operator({) + label(smart_chomp)operator(:) + ident(rb_str_modify)operator(()ident(str)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(len)operator(-)integer(1)operator(]) operator(==) char('\\n')operator(\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(--;) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(0) operator(&&) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(-)integer(1)operator(]) operator(==) char('\\r')operator(\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(--;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(len)operator(-)integer(1)operator(]) operator(==) char('\\r')operator(\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(--;) + operator(}) + reserved(else) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + reserved(return) ident(str)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(rs)operator(\)\)) reserved(return) ident(Qnil)operator(;) + ident(StringValue)operator(()ident(rs)operator(\);) + ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(rslen) operator(=) ident(RSTRING)operator(()ident(rs)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(rslen) operator(==) integer(0)operator(\)) operator({) + reserved(while) operator(()ident(len)operator(>)integer(0) operator(&&) ident(p)operator([)ident(len)operator(-)integer(1)operator(]) operator(==) char('\\n')operator(\)) operator({) + ident(len)operator(--;) + reserved(if) operator(()ident(len)operator(>)integer(0) operator(&&) ident(p)operator([)ident(len)operator(-)integer(1)operator(]) operator(==) char('\\r')operator(\)) + ident(len)operator(--;) + operator(}) + reserved(if) operator(()ident(len) operator(<) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(len)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) + reserved(return) ident(str)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(if) operator(()ident(rslen) operator(>) ident(len)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(newline) operator(=) ident(RSTRING)operator(()ident(rs)operator(\)->)ident(ptr)operator([)ident(rslen)operator(-)integer(1)operator(];) + reserved(if) operator(()ident(rslen) operator(==) integer(1) operator(&&) ident(newline) operator(==) char('\\n')operator(\)) + reserved(goto) ident(smart_chomp)operator(;) + + reserved(if) operator(()ident(p)operator([)ident(len)operator(-)integer(1)operator(]) operator(==) ident(newline) operator(&&) + operator(()ident(rslen) operator(<=) integer(1) operator(||) + ident(rb_memcmp)operator(()ident(RSTRING)operator(()ident(rs)operator(\)->)ident(ptr)operator(,) ident(p)operator(+)ident(len)operator(-)ident(rslen)operator(,) ident(rslen)operator(\)) operator(==) integer(0)operator(\)\)) operator({) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(-=) ident(rslen)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + reserved(return) ident(str)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.chomp(separator=$/\) => new_str + * + * Returns a new <code>String</code> with the given record separator removed + * from the end of <i>str</i> (if present\). If <code>$/</code> has not been + * changed from the default Ruby record separator, then <code>chomp</code> also + * removes carriage return characters (that is it will remove <code>\\n</code>, + * <code>\\r</code>, and <code>\\r\\n</code>\). + * + * "hello".chomp #=> "hello" + * "hello\\n".chomp #=> "hello" + * "hello\\r\\n".chomp #=> "hello" + * "hello\\n\\r".chomp #=> "hello\\n" + * "hello\\r".chomp #=> "hello" + * "hello \\n there".chomp #=> "hello \\n there" + * "hello".chomp("llo"\) #=> "he" + */) + +directive(static) ident(VALUE) +ident(rb_str_chomp)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_chomp_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * chomp! => $_ or nil + * chomp!(string\) => $_ or nil + * + * Equivalent to <code>$_.chomp!(<em>string</em>\)</code>. See + * <code>String#chomp!</code> + * + * $_ = "now\\n" + * chomp! #=> "now" + * $_ #=> "now" + * chomp! "x" #=> nil + * $_ #=> "now" + */) + +directive(static) ident(VALUE) +ident(rb_f_chomp_bang)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + reserved(return) ident(rb_str_chomp_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(uscore_get)operator((\)\);) +operator(}) + +comment(/* + * call-seq: + * chomp => $_ + * chomp(string\) => $_ + * + * Equivalent to <code>$_ = $_.chomp(<em>string</em>\)</code>. See + * <code>String#chomp</code>. + * + * $_ = "now\\n" + * chomp #=> "now" + * $_ #=> "now" + * chomp "ow" #=> "n" + * $_ #=> "n" + * chomp "xxx" #=> "n" + * $_ #=> "n" + */) + +directive(static) ident(VALUE) +ident(rb_f_chomp)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(str) operator(=) ident(uscore_get)operator((\);) + ident(VALUE) ident(dup) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(rb_str_chomp_bang)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(dup)operator(\)\)\)) + reserved(return) ident(str)operator(;) + ident(rb_lastline_set)operator(()ident(dup)operator(\);) + reserved(return) ident(dup)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.lstrip! => self or nil + * + * Removes leading whitespace from <i>str</i>, returning <code>nil</code> if no + * change was made. See also <code>String#rstrip!</code> and + * <code>String#strip!</code>. + * + * " hello ".lstrip #=> "hello " + * "hello".lstrip! #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_str_lstrip_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(t)operator(,) operator(*)ident(e)operator(;) + + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(if) operator((!)ident(s) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(e) operator(=) ident(t) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + comment(/* remove spaces at head */) + reserved(while) operator(()ident(s) operator(<) ident(t) operator(&&) ident(ISSPACE)operator((*)ident(s)operator(\)\)) ident(s)operator(++;) + + reserved(if) operator(()ident(s) operator(>) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) operator({) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(t)operator(-)ident(s)operator(;) + ident(memmove)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(s)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + reserved(return) ident(str)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.lstrip => new_str + * + * Returns a copy of <i>str</i> with leading whitespace removed. See also + * <code>String#rstrip</code> and <code>String#strip</code>. + * + * " hello ".lstrip #=> "hello " + * "hello".lstrip #=> "hello" + */) + +directive(static) ident(VALUE) +ident(rb_str_lstrip)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_lstrip_bang)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.rstrip! => self or nil + * + * Removes trailing whitespace from <i>str</i>, returning <code>nil</code> if + * no change was made. See also <code>String#lstrip!</code> and + * <code>String#strip!</code>. + * + * " hello ".rstrip #=> " hello" + * "hello".rstrip! #=> nil + */) + +directive(static) ident(VALUE) +ident(rb_str_rstrip_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(t)operator(,) operator(*)ident(e)operator(;) + + ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(if) operator((!)ident(s) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) reserved(return) ident(Qnil)operator(;) + ident(e) operator(=) ident(t) operator(=) ident(s) operator(+) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + + comment(/* remove trailing '\\0's */) + reserved(while) operator(()ident(s) operator(<) ident(t) operator(&&) ident(t)operator([-)integer(1)operator(]) operator(==) char('\\0')operator(\)) ident(t)operator(--;) + + comment(/* remove trailing spaces */) + reserved(while) operator(()ident(s) operator(<) ident(t) operator(&&) ident(ISSPACE)operator((*()ident(t)operator(-)integer(1)operator(\)\)\)) ident(t)operator(--;) + + reserved(if) operator(()ident(t) operator(<) ident(e)operator(\)) operator({) + ident(rb_str_modify)operator(()ident(str)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(t)operator(-)ident(s)operator(;) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(]) operator(=) char('\\0')operator(;) + reserved(return) ident(str)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.rstrip => new_str + * + * Returns a copy of <i>str</i> with trailing whitespace removed. See also + * <code>String#lstrip</code> and <code>String#strip</code>. + * + * " hello ".rstrip #=> " hello" + * "hello".rstrip #=> "hello" + */) + +directive(static) ident(VALUE) +ident(rb_str_rstrip)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_rstrip_bang)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.strip! => str or nil + * + * Removes leading and trailing whitespace from <i>str</i>. Returns + * <code>nil</code> if <i>str</i> was not altered. + */) + +directive(static) ident(VALUE) +ident(rb_str_strip_bang)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(l) operator(=) ident(rb_str_lstrip_bang)operator(()ident(str)operator(\);) + ident(VALUE) ident(r) operator(=) ident(rb_str_rstrip_bang)operator(()ident(str)operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(l)operator(\)) operator(&&) ident(NIL_P)operator(()ident(r)operator(\)\)) reserved(return) ident(Qnil)operator(;) + reserved(return) ident(str)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.strip => new_str + * + * Returns a copy of <i>str</i> with leading and trailing whitespace removed. + * + * " hello ".strip #=> "hello" + * "\\tgoodbye\\r\\n".strip #=> "goodbye" + */) + +directive(static) ident(VALUE) +ident(rb_str_strip)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(rb_str_strip_bang)operator(()ident(str)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(scan_once)operator(()ident(str)operator(,) ident(pat)operator(,) ident(start)operator(\)) + ident(VALUE) ident(str)operator(,) ident(pat)operator(;) + pre_type(long) operator(*)ident(start)operator(;) +operator({) + ident(VALUE) ident(result)operator(,) ident(match)operator(;) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(rb_reg_search)operator(()ident(pat)operator(,) ident(str)operator(,) operator(*)ident(start)operator(,) integer(0)operator(\)) operator(>=) integer(0)operator(\)) operator({) + ident(match) operator(=) ident(rb_backref_get)operator((\);) + ident(regs) operator(=) ident(RMATCH)operator(()ident(match)operator(\)->)ident(regs)operator(;) + reserved(if) operator(()ident(BEG)operator(()integer(0)operator(\)) operator(==) ident(END)operator(()integer(0)operator(\)\)) operator({) + comment(/* + * Always consume at least one character of the input string + */) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) ident(END)operator(()integer(0)operator(\)\)) + operator(*)ident(start) operator(=) ident(END)operator(()integer(0)operator(\)+)ident(mbclen2)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(END)operator(()integer(0)operator(\)],)ident(pat)operator(\);) + reserved(else) + operator(*)ident(start) operator(=) ident(END)operator(()integer(0)operator(\)+)integer(1)operator(;) + operator(}) + reserved(else) operator({) + operator(*)ident(start) operator(=) ident(END)operator(()integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(regs)operator(->)ident(num_regs) operator(==) integer(1)operator(\)) operator({) + reserved(return) ident(rb_reg_nth_match)operator(()integer(0)operator(,) ident(match)operator(\);) + operator(}) + ident(result) operator(=) ident(rb_ary_new2)operator(()ident(regs)operator(->)ident(num_regs)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(1)operator(;) ident(i) operator(<) ident(regs)operator(->)ident(num_regs)operator(;) ident(i)operator(++\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(rb_reg_nth_match)operator(()ident(i)operator(,) ident(match)operator(\)\);) + operator(}) + + reserved(return) ident(result)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.scan(pattern\) => array + * str.scan(pattern\) {|match, ...| block } => str + * + * Both forms iterate through <i>str</i>, matching the pattern (which may be a + * <code>Regexp</code> or a <code>String</code>\). For each match, a result is + * generated and either added to the result array or passed to the block. If + * the pattern contains no groups, each individual result consists of the + * matched string, <code>$&</code>. If the pattern contains groups, each + * individual result is itself an array containing one entry per group. + * + * a = "cruel world" + * a.scan(/\\w+/\) #=> ["cruel", "world"] + * a.scan(/.../\) #=> ["cru", "el ", "wor"] + * a.scan(/(...\)/\) #=> [["cru"], ["el "], ["wor"]] + * a.scan(/(..\)(..\)/\) #=> [["cr", "ue"], ["l ", "wo"]] + * + * And the block form: + * + * a.scan(/\\w+/\) {|w| print "<<#{w}>> " } + * print "\\n" + * a.scan(/(.\)(.\)/\) {|x,y| print y, x } + * print "\\n" + * + * <em>produces:</em> + * + * <<cruel>> <<world>> + * rceu lowlr + */) + +directive(static) ident(VALUE) +ident(rb_str_scan)operator(()ident(str)operator(,) ident(pat)operator(\)) + ident(VALUE) ident(str)operator(,) ident(pat)operator(;) +operator({) + ident(VALUE) ident(result)operator(;) + pre_type(long) ident(start) operator(=) integer(0)operator(;) + ident(VALUE) ident(match) operator(=) ident(Qnil)operator(;) + pre_type(char) operator(*)ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) pre_type(long) ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + + ident(pat) operator(=) ident(get_pat)operator(()ident(pat)operator(,) integer(1)operator(\);) + reserved(if) operator((!)ident(rb_block_given_p)operator((\)\)) operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + reserved(while) operator((!)ident(NIL_P)operator(()ident(result) operator(=) ident(scan_once)operator(()ident(str)operator(,) ident(pat)operator(,) operator(&)ident(start)operator(\)\)\)) operator({) + ident(match) operator(=) ident(rb_backref_get)operator((\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(result)operator(\);) + operator(}) + ident(rb_backref_set)operator(()ident(match)operator(\);) + reserved(return) ident(ary)operator(;) + operator(}) + + reserved(while) operator((!)ident(NIL_P)operator(()ident(result) operator(=) ident(scan_once)operator(()ident(str)operator(,) ident(pat)operator(,) operator(&)ident(start)operator(\)\)\)) operator({) + ident(match) operator(=) ident(rb_backref_get)operator((\);) + ident(rb_match_busy)operator(()ident(match)operator(\);) + ident(rb_yield)operator(()ident(result)operator(\);) + ident(str_mod_check)operator(()ident(str)operator(,) ident(p)operator(,) ident(len)operator(\);) + ident(rb_backref_set)operator(()ident(match)operator(\);) comment(/* restore $~ value */) + operator(}) + ident(rb_backref_set)operator(()ident(match)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * scan(pattern\) => array + * scan(pattern\) {|///| block } => $_ + * + * Equivalent to calling <code>$_.scan</code>. See + * <code>String#scan</code>. + */) + +directive(static) ident(VALUE) +ident(rb_f_scan)operator(()ident(self)operator(,) ident(pat)operator(\)) + ident(VALUE) ident(self)operator(,) ident(pat)operator(;) +operator({) + reserved(return) ident(rb_str_scan)operator(()ident(uscore_get)operator((\),) ident(pat)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.hex => integer + * + * Treats leading characters from <i>str</i> as a string of hexadecimal digits + * (with an optional sign and an optional <code>0x</code>\) and returns the + * corresponding number. Zero is returned on error. + * + * "0x0a".hex #=> 10 + * "-1234".hex #=> -4660 + * "0".hex #=> 0 + * "wombat".hex #=> 0 + */) + +directive(static) ident(VALUE) +ident(rb_str_hex)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(rb_str_to_inum)operator(()ident(str)operator(,) integer(16)operator(,) ident(Qfalse)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.oct => integer + * + * Treats leading characters of <i>str</i> as a string of octal digits (with an + * optional sign\) and returns the corresponding number. Returns 0 if the + * conversion fails. + * + * "123".oct #=> 83 + * "-377".oct #=> -255 + * "bad".oct #=> 0 + * "0377bad".oct #=> 255 + */) + +directive(static) ident(VALUE) +ident(rb_str_oct)operator(()ident(str)operator(\)) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(rb_str_to_inum)operator(()ident(str)operator(,) operator(-)integer(8)operator(,) ident(Qfalse)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.crypt(other_str\) => new_str + * + * Applies a one-way cryptographic hash to <i>str</i> by invoking the standard + * library function <code>crypt</code>. The argument is the salt string, which + * should be two characters long, each character drawn from + * <code>[a-zA-Z0-9./]</code>. + */) + +directive(static) ident(VALUE) +ident(rb_str_crypt)operator(()ident(str)operator(,) ident(salt)operator(\)) + ident(VALUE) ident(str)operator(,) ident(salt)operator(;) +operator({) + directive(extern) pre_type(char) operator(*)ident(crypt)operator((\);) + ident(VALUE) ident(result)operator(;) + pre_type(char) operator(*)ident(s)operator(;) + + ident(StringValue)operator(()ident(salt)operator(\);) + reserved(if) operator(()ident(RSTRING)operator(()ident(salt)operator(\)->)ident(len) operator(<) integer(2)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(salt too short(need >=2 bytes\))delimiter(")>operator(\);) + + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(else) ident(s) operator(=) string<delimiter(")delimiter(")>operator(;) + ident(result) operator(=) ident(rb_str_new2)operator(()ident(crypt)operator(()ident(s)operator(,) ident(RSTRING)operator(()ident(salt)operator(\)->)ident(ptr)operator(\)\);) + ident(OBJ_INFECT)operator(()ident(result)operator(,) ident(str)operator(\);) + ident(OBJ_INFECT)operator(()ident(result)operator(,) ident(salt)operator(\);) + reserved(return) ident(result)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.intern => symbol + * str.to_sym => symbol + * + * Returns the <code>Symbol</code> corresponding to <i>str</i>, creating the + * symbol if it did not previously exist. See <code>Symbol#id2name</code>. + * + * "Koala".intern #=> :Koala + * s = 'cat'.to_sym #=> :cat + * s == :cat #=> true + * s = '@cat'.to_sym #=> :@cat + * s == :@cat #=> true + * + * This can also be used to create symbols that cannot be represented using the + * <code>:xxx</code> notation. + * + * 'cat and dog'.to_sym #=> :"cat and dog" + */) + +ident(VALUE) +ident(rb_str_intern)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + directive(volatile) ident(VALUE) ident(str) operator(=) ident(s)operator(;) + ident(ID) ident(id)operator(;) + + reserved(if) operator((!)ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(==) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(interning empty string)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(strlen)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)) operator(!=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(symbol string may not contain `)char(\\\\)content(0')delimiter(")>operator(\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(str)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(1) operator(&&) operator(!)ident(rb_sym_interned_p)operator(()ident(str)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't intern tainted string)delimiter(")>operator(\);) + operator(}) + ident(id) operator(=) ident(rb_intern)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + reserved(return) ident(ID2SYM)operator(()ident(id)operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.sum(n=16\) => integer + * + * Returns a basic <em>n</em>-bit checksum of the characters in <i>str</i>, + * where <em>n</em> is the optional <code>Fixnum</code> parameter, defaulting + * to 16. The result is simply the sum of the binary value of each character in + * <i>str</i> modulo <code>2n - 1</code>. This is not a particularly good + * checksum. + */) + +directive(static) ident(VALUE) +ident(rb_str_sum)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + ident(VALUE) ident(vbits)operator(;) + pre_type(int) ident(bits)operator(;) + pre_type(char) operator(*)ident(ptr)operator(,) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + pre_type(long) ident(len)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) operator(&)ident(vbits)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(bits) operator(=) integer(16)operator(;) + operator(}) + reserved(else) ident(bits) operator(=) ident(NUM2INT)operator(()ident(vbits)operator(\);) + + ident(ptr) operator(=) ident(p) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + ident(len) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(pend) operator(=) ident(p) operator(+) ident(len)operator(;) + reserved(if) operator(()ident(bits) operator(>=) reserved(sizeof)operator(()pre_type(long)operator(\)*)ident(CHAR_BIT)operator(\)) operator({) + ident(VALUE) ident(sum) operator(=) ident(INT2FIX)operator(()integer(0)operator(\);) + + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(str_mod_check)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\);) + ident(sum) operator(=) ident(rb_funcall)operator(()ident(sum)operator(,) char('+')operator(,) integer(1)operator(,) ident(INT2FIX)operator((()pre_type(unsigned) pre_type(char)operator(\)*)ident(p)operator(\)\);) + ident(p)operator(++;) + operator(}) + reserved(if) operator(()ident(bits) operator(!=) integer(0)operator(\)) operator({) + ident(VALUE) ident(mod)operator(;) + + ident(mod) operator(=) ident(rb_funcall)operator(()ident(INT2FIX)operator(()integer(1)operator(\),) ident(rb_intern)operator(()string<delimiter(")content(<<)delimiter(")>operator(\),) integer(1)operator(,) ident(INT2FIX)operator(()ident(bits)operator(\)\);) + ident(mod) operator(=) ident(rb_funcall)operator(()ident(mod)operator(,) char('-')operator(,) integer(1)operator(,) ident(INT2FIX)operator(()integer(1)operator(\)\);) + ident(sum) operator(=) ident(rb_funcall)operator(()ident(sum)operator(,) char('&')operator(,) integer(1)operator(,) ident(mod)operator(\);) + operator(}) + reserved(return) ident(sum)operator(;) + operator(}) + reserved(else) operator({) + pre_type(unsigned) pre_type(long) ident(sum) operator(=) integer(0)operator(;) + + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(str_mod_check)operator(()ident(str)operator(,) ident(ptr)operator(,) ident(len)operator(\);) + ident(sum) operator(+=) operator(()pre_type(unsigned) pre_type(char)operator(\)*)ident(p)operator(;) + ident(p)operator(++;) + operator(}) + reserved(if) operator(()ident(bits) operator(!=) integer(0)operator(\)) operator({) + ident(sum) operator(&=) operator(((()pre_type(unsigned) pre_type(long)operator(\))integer(1)operator(\)<<)ident(bits)operator(\)-)integer(1)operator(;) + operator(}) + reserved(return) ident(rb_int2inum)operator(()ident(sum)operator(\);) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(rb_str_justify)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(,) ident(jflag)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) + pre_type(char) ident(jflag)operator(;) +operator({) + ident(VALUE) ident(w)operator(;) + pre_type(long) ident(width)operator(,) ident(flen) operator(=) integer(0)operator(;) + ident(VALUE) ident(res)operator(;) + pre_type(char) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(,) operator(*)ident(f) operator(=) string<delimiter(")content( )delimiter(")>operator(;) + pre_type(long) ident(n)operator(;) + ident(VALUE) ident(pad)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(w)operator(,) operator(&)ident(pad)operator(\);) + ident(width) operator(=) ident(NUM2LONG)operator(()ident(w)operator(\);) + reserved(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(StringValue)operator(()ident(pad)operator(\);) + ident(f) operator(=) ident(RSTRING)operator(()ident(pad)operator(\)->)ident(ptr)operator(;) + ident(flen) operator(=) ident(RSTRING)operator(()ident(pad)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(flen) operator(==) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(zero width padding)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(if) operator(()ident(width) operator(<) integer(0) operator(||) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>=) ident(width)operator(\)) reserved(return) ident(rb_str_dup)operator(()ident(str)operator(\);) + ident(res) operator(=) ident(rb_str_new5)operator(()ident(str)operator(,) integer(0)operator(,) ident(width)operator(\);) + ident(p) operator(=) ident(RSTRING)operator(()ident(res)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(jflag) operator(!=) char('l')operator(\)) operator({) + ident(n) operator(=) ident(width) operator(-) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(pend) operator(=) ident(p) operator(+) operator((()ident(jflag) operator(==) char('r')operator(\)) operator(?) ident(n) operator(:) ident(n)operator(/)integer(2)operator(\);) + reserved(if) operator(()ident(flen) operator(<=) integer(1)operator(\)) operator({) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + operator(*)ident(p)operator(++) operator(=) operator(*)ident(f)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + pre_type(char) operator(*)ident(q) operator(=) ident(f)operator(;) + reserved(while) operator(()ident(p) operator(+) ident(flen) operator(<=) ident(pend)operator(\)) operator({) + ident(memcpy)operator(()ident(p)operator(,)ident(f)operator(,)ident(flen)operator(\);) + ident(p) operator(+=) ident(flen)operator(;) + operator(}) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + operator(*)ident(p)operator(++) operator(=) operator(*)ident(q)operator(++;) + operator(}) + operator(}) + operator(}) + ident(memcpy)operator(()ident(p)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + reserved(if) operator(()ident(jflag) operator(!=) char('r')operator(\)) operator({) + ident(p) operator(+=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) ident(pend) operator(=) ident(RSTRING)operator(()ident(res)operator(\)->)ident(ptr) operator(+) ident(width)operator(;) + reserved(if) operator(()ident(flen) operator(<=) integer(1)operator(\)) operator({) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + operator(*)ident(p)operator(++) operator(=) operator(*)ident(f)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(p) operator(+) ident(flen) operator(<=) ident(pend)operator(\)) operator({) + ident(memcpy)operator(()ident(p)operator(,)ident(f)operator(,)ident(flen)operator(\);) + ident(p) operator(+=) ident(flen)operator(;) + operator(}) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + operator(*)ident(p)operator(++) operator(=) operator(*)ident(f)operator(++;) + operator(}) + operator(}) + operator(}) + ident(OBJ_INFECT)operator(()ident(res)operator(,) ident(str)operator(\);) + reserved(if) operator(()ident(flen) operator(>) integer(0)operator(\)) ident(OBJ_INFECT)operator(()ident(res)operator(,) ident(pad)operator(\);) + reserved(return) ident(res)operator(;) +operator(}) + + +comment(/* + * call-seq: + * str.ljust(integer, padstr=' '\) => new_str + * + * If <i>integer</i> is greater than the length of <i>str</i>, returns a new + * <code>String</code> of length <i>integer</i> with <i>str</i> left justified + * and padded with <i>padstr</i>; otherwise, returns <i>str</i>. + * + * "hello".ljust(4\) #=> "hello" + * "hello".ljust(20\) #=> "hello " + * "hello".ljust(20, '1234'\) #=> "hello123412341234123" + */) + +directive(static) ident(VALUE) +ident(rb_str_ljust)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(rb_str_justify)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(,) char('l')operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.rjust(integer, padstr=' '\) => new_str + * + * If <i>integer</i> is greater than the length of <i>str</i>, returns a new + * <code>String</code> of length <i>integer</i> with <i>str</i> right justified + * and padded with <i>padstr</i>; otherwise, returns <i>str</i>. + * + * "hello".rjust(4\) #=> "hello" + * "hello".rjust(20\) #=> " hello" + * "hello".rjust(20, '1234'\) #=> "123412341234123hello" + */) + +directive(static) ident(VALUE) +ident(rb_str_rjust)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(rb_str_justify)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(,) char('r')operator(\);) +operator(}) + + +comment(/* + * call-seq: + * str.center(integer, padstr\) => new_str + * + * If <i>integer</i> is greater than the length of <i>str</i>, returns a new + * <code>String</code> of length <i>integer</i> with <i>str</i> centered and + * padded with <i>padstr</i>; otherwise, returns <i>str</i>. + * + * "hello".center(4\) #=> "hello" + * "hello".center(20\) #=> " hello " + * "hello".center(20, '123'\) #=> "1231231hello12312312" + */) + +directive(static) ident(VALUE) +ident(rb_str_center)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(str)operator(;) +operator({) + reserved(return) ident(rb_str_justify)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(str)operator(,) char('c')operator(\);) +operator(}) + +directive(void) +ident(rb_str_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(var)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + reserved(if) operator((!)ident(NIL_P)operator(()ident(val)operator(\)) operator(&&) ident(TYPE)operator(()ident(val)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(value of %s must be String)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + operator(*)ident(var) operator(=) ident(val)operator(;) +operator(}) + + +comment(/* + * A <code>String</code> object holds and manipulates an arbitrary sequence of + * bytes, typically representing characters. String objects may be created + * using <code>String::new</code> or as literals. + * + * Because of aliasing issues, users of strings should be aware of the methods + * that modify the contents of a <code>String</code> object. Typically, + * methods with names ending in ``!'' modify their receiver, while those + * without a ``!'' return a new <code>String</code>. However, there are + * exceptions, such as <code>String#[]=</code>. + * + */) + +directive(void) +ident(Init_String)operator((\)) +operator({) + ident(rb_cString) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(String)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_include_module)operator(()ident(rb_cString)operator(,) ident(rb_mComparable)operator(\);) + ident(rb_include_module)operator(()ident(rb_cString)operator(,) ident(rb_mEnumerable)operator(\);) + ident(rb_define_alloc_func)operator(()ident(rb_cString)operator(,) ident(rb_str_s_alloc)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_str_init)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_str_replace)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(rb_str_cmp_m)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(rb_str_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(rb_str_eql)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(hash)delimiter(")>operator(,) ident(rb_str_hash_m)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(casecmp)delimiter(")>operator(,) ident(rb_str_casecmp)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(rb_str_plus)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(rb_str_times)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(rb_str_format_m)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(rb_str_aref_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content([]=)delimiter(")>operator(,) ident(rb_str_aset_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(insert)delimiter(")>operator(,) ident(rb_str_insert)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(length)delimiter(")>operator(,) ident(rb_str_length)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(size)delimiter(")>operator(,) ident(rb_str_length)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(empty?)delimiter(")>operator(,) ident(rb_str_empty)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(=~)delimiter(")>operator(,) ident(rb_str_match)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(match)delimiter(")>operator(,) ident(rb_str_match_m)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(succ)delimiter(")>operator(,) ident(rb_str_succ)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(succ!)delimiter(")>operator(,) ident(rb_str_succ_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(next)delimiter(")>operator(,) ident(rb_str_succ)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(next!)delimiter(")>operator(,) ident(rb_str_succ_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(upto)delimiter(")>operator(,) ident(rb_str_upto_m)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(index)delimiter(")>operator(,) ident(rb_str_index_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(rindex)delimiter(")>operator(,) ident(rb_str_rindex_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(replace)delimiter(")>operator(,) ident(rb_str_replace)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) ident(rb_str_to_i)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(to_f)delimiter(")>operator(,) ident(rb_str_to_f)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(rb_str_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(to_str)delimiter(")>operator(,) ident(rb_str_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_str_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(dump)delimiter(")>operator(,) ident(rb_str_dump)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(upcase)delimiter(")>operator(,) ident(rb_str_upcase)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(downcase)delimiter(")>operator(,) ident(rb_str_downcase)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(capitalize)delimiter(")>operator(,) ident(rb_str_capitalize)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(swapcase)delimiter(")>operator(,) ident(rb_str_swapcase)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(upcase!)delimiter(")>operator(,) ident(rb_str_upcase_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(downcase!)delimiter(")>operator(,) ident(rb_str_downcase_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(capitalize!)delimiter(")>operator(,) ident(rb_str_capitalize_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(swapcase!)delimiter(")>operator(,) ident(rb_str_swapcase_bang)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(hex)delimiter(")>operator(,) ident(rb_str_hex)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(oct)delimiter(")>operator(,) ident(rb_str_oct)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(split)delimiter(")>operator(,) ident(rb_str_split_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(reverse)delimiter(")>operator(,) ident(rb_str_reverse)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(reverse!)delimiter(")>operator(,) ident(rb_str_reverse_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(concat)delimiter(")>operator(,) ident(rb_str_concat)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(<<)delimiter(")>operator(,) ident(rb_str_concat)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(crypt)delimiter(")>operator(,) ident(rb_str_crypt)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(intern)delimiter(")>operator(,) ident(rb_str_intern)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(to_sym)delimiter(")>operator(,) ident(rb_str_intern)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(include?)delimiter(")>operator(,) ident(rb_str_include)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(scan)delimiter(")>operator(,) ident(rb_str_scan)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(ljust)delimiter(")>operator(,) ident(rb_str_ljust)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(rjust)delimiter(")>operator(,) ident(rb_str_rjust)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(center)delimiter(")>operator(,) ident(rb_str_center)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(sub)delimiter(")>operator(,) ident(rb_str_sub)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(gsub)delimiter(")>operator(,) ident(rb_str_gsub)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(chop)delimiter(")>operator(,) ident(rb_str_chop)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(chomp)delimiter(")>operator(,) ident(rb_str_chomp)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(strip)delimiter(")>operator(,) ident(rb_str_strip)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(lstrip)delimiter(")>operator(,) ident(rb_str_lstrip)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(rstrip)delimiter(")>operator(,) ident(rb_str_rstrip)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(sub!)delimiter(")>operator(,) ident(rb_str_sub_bang)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(gsub!)delimiter(")>operator(,) ident(rb_str_gsub_bang)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(chop!)delimiter(")>operator(,) ident(rb_str_chop_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(chomp!)delimiter(")>operator(,) ident(rb_str_chomp_bang)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(strip!)delimiter(")>operator(,) ident(rb_str_strip_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(lstrip!)delimiter(")>operator(,) ident(rb_str_lstrip_bang)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(rstrip!)delimiter(")>operator(,) ident(rb_str_rstrip_bang)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(tr)delimiter(")>operator(,) ident(rb_str_tr)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(tr_s)delimiter(")>operator(,) ident(rb_str_tr_s)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(delete)delimiter(")>operator(,) ident(rb_str_delete)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(squeeze)delimiter(")>operator(,) ident(rb_str_squeeze)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(count)delimiter(")>operator(,) ident(rb_str_count)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(tr!)delimiter(")>operator(,) ident(rb_str_tr_bang)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(tr_s!)delimiter(")>operator(,) ident(rb_str_tr_s_bang)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(delete!)delimiter(")>operator(,) ident(rb_str_delete_bang)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(squeeze!)delimiter(")>operator(,) ident(rb_str_squeeze_bang)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(each_line)delimiter(")>operator(,) ident(rb_str_each_line)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(each)delimiter(")>operator(,) ident(rb_str_each_line)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(each_byte)delimiter(")>operator(,) ident(rb_str_each_byte)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(sum)delimiter(")>operator(,) ident(rb_str_sum)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(sub)delimiter(")>operator(,) ident(rb_f_sub)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(gsub)delimiter(")>operator(,) ident(rb_f_gsub)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(sub!)delimiter(")>operator(,) ident(rb_f_sub_bang)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(gsub!)delimiter(")>operator(,) ident(rb_f_gsub_bang)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(chop)delimiter(")>operator(,) ident(rb_f_chop)operator(,) integer(0)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(chop!)delimiter(")>operator(,) ident(rb_f_chop_bang)operator(,) integer(0)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(chomp)delimiter(")>operator(,) ident(rb_f_chomp)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(chomp!)delimiter(")>operator(,) ident(rb_f_chomp_bang)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_global_function)operator(()string<delimiter(")content(split)delimiter(")>operator(,) ident(rb_f_split)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_global_function)operator(()string<delimiter(")content(scan)delimiter(")>operator(,) ident(rb_f_scan)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(slice)delimiter(")>operator(,) ident(rb_str_aref_m)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cString)operator(,) string<delimiter(")content(slice!)delimiter(")>operator(,) ident(rb_str_slice_bang)operator(,) operator(-)integer(1)operator(\);) + + ident(id_to_s) operator(=) ident(rb_intern)operator(()string<delimiter(")content(to_s)delimiter(")>operator(\);) + + ident(rb_fs) operator(=) ident(Qnil)operator(;) + ident(rb_define_variable)operator(()string<delimiter(")content($;)delimiter(")>operator(,) operator(&)ident(rb_fs)operator(\);) + ident(rb_define_variable)operator(()string<delimiter(")content($-F)delimiter(")>operator(,) operator(&)ident(rb_fs)operator(\);) +operator(}) +comment(/********************************************************************** + + struct.c - + + $Author: shyouhei $ + $Date: 2008-06-15 15:44:44 +0200 (Sun, 15 Jun 2008\) $ + created at: Tue Mar 22 18:44:30 JST 1995 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("env.h") + +ident(VALUE) ident(rb_cStruct)operator(;) + +directive(static) ident(VALUE) ident(struct_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) + +ident(VALUE) +ident(rb_struct_iv_get)operator(()ident(c)operator(,) ident(name)operator(\)) + ident(VALUE) ident(c)operator(;) + pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(ID) ident(id)operator(;) + + ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + reserved(for) operator((;;\)) operator({) + reserved(if) operator(()ident(rb_ivar_defined)operator(()ident(c)operator(,) ident(id)operator(\)\)) + reserved(return) ident(rb_ivar_get)operator(()ident(c)operator(,) ident(id)operator(\);) + ident(c) operator(=) ident(RCLASS)operator(()ident(c)operator(\)->)ident(super)operator(;) + reserved(if) operator(()ident(c) operator(==) integer(0) operator(||) ident(c) operator(==) ident(rb_cStruct)operator(\)) + reserved(return) ident(Qnil)operator(;) + operator(}) +operator(}) + +ident(VALUE) +ident(rb_struct_s_members)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(members) operator(=) ident(rb_struct_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__members__)delimiter(")>operator(\);) + + reserved(if) operator(()ident(NIL_P)operator(()ident(members)operator(\)\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(non-initialized struct)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(members)operator(;) +operator(}) + +ident(VALUE) +ident(rb_struct_members)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + ident(VALUE) ident(members) operator(=) ident(rb_struct_s_members)operator(()ident(rb_obj_class)operator(()ident(s)operator(\)\);) + + reserved(if) operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len) operator(!=) ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(struct size differs (%d required %d given\))delimiter(")>operator(,) + ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(\);) + operator(}) + reserved(return) ident(members)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_struct_s_members_m)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(members)operator(,) ident(ary)operator(;) + ident(VALUE) operator(*)ident(p)operator(,) operator(*)ident(pend)operator(;) + + ident(members) operator(=) ident(rb_struct_s_members)operator(()ident(klass)operator(\);) + ident(ary) operator(=) ident(rb_ary_new2)operator(()ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(\);) + ident(p) operator(=) ident(RARRAY)operator(()ident(members)operator(\)->)ident(ptr)operator(;) ident(pend) operator(=) ident(p) operator(+) ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(;) + reserved(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(SYM2ID)operator((*)ident(p)operator(\)\)\)\);) + ident(p)operator(++;) + operator(}) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * struct.members => array + * + * Returns an array of strings representing the names of the instance + * variables. + * + * Customer = Struct.new(:name, :address, :zip\) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345\) + * joe.members #=> ["name", "address", "zip"] + */) + +directive(static) ident(VALUE) +ident(rb_struct_members_m)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_struct_s_members_m)operator(()ident(rb_obj_class)operator(()ident(obj)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_struct_getmember)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(members)operator(,) ident(slot)operator(;) + pre_type(long) ident(i)operator(;) + + ident(members) operator(=) ident(rb_struct_members)operator(()ident(obj)operator(\);) + ident(slot) operator(=) ident(ID2SYM)operator(()ident(id)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(RARRAY)operator(()ident(members)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(==) ident(slot)operator(\)) operator({) + reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + operator(}) + operator(}) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(%s is not struct member)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +directive(static) ident(VALUE) +ident(rb_struct_ref)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_struct_getmember)operator(()ident(obj)operator(,) ident(ruby_frame)operator(->)ident(orig_func)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(rb_struct_ref0)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(0)operator(];}) +directive(static) ident(VALUE) ident(rb_struct_ref1)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(1)operator(];}) +directive(static) ident(VALUE) ident(rb_struct_ref2)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(2)operator(];}) +directive(static) ident(VALUE) ident(rb_struct_ref3)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(3)operator(];}) +directive(static) ident(VALUE) ident(rb_struct_ref4)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(4)operator(];}) +directive(static) ident(VALUE) ident(rb_struct_ref5)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(5)operator(];}) +directive(static) ident(VALUE) ident(rb_struct_ref6)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(6)operator(];}) +directive(static) ident(VALUE) ident(rb_struct_ref7)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(7)operator(];}) +directive(static) ident(VALUE) ident(rb_struct_ref8)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(8)operator(];}) +directive(static) ident(VALUE) ident(rb_struct_ref9)operator(()ident(obj)operator(\)) ident(VALUE) ident(obj)operator(;) operator({)reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)integer(9)operator(];}) + +directive(static) ident(VALUE) operator((*)ident(ref_func)operator([)integer(10)operator(]\)(\)) operator(=) operator({) + ident(rb_struct_ref0)operator(,) + ident(rb_struct_ref1)operator(,) + ident(rb_struct_ref2)operator(,) + ident(rb_struct_ref3)operator(,) + ident(rb_struct_ref4)operator(,) + ident(rb_struct_ref5)operator(,) + ident(rb_struct_ref6)operator(,) + ident(rb_struct_ref7)operator(,) + ident(rb_struct_ref8)operator(,) + ident(rb_struct_ref9)operator(,) +operator(};) + +directive(static) directive(void) +ident(rb_struct_modify)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(s)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(Struct)delimiter(")>operator(\);) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(s)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify Struct)delimiter(")>operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_struct_set)operator(()ident(obj)operator(,) ident(val)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(val)operator(;) +operator({) + ident(VALUE) ident(members)operator(,) ident(slot)operator(;) + ident(ID) ident(id)operator(;) + pre_type(long) ident(i)operator(;) + + ident(members) operator(=) ident(rb_struct_members)operator(()ident(obj)operator(\);) + ident(rb_struct_modify)operator(()ident(obj)operator(\);) + ident(id) operator(=) ident(ruby_frame)operator(->)ident(orig_func)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(slot) operator(=) ident(RARRAY)operator(()ident(members)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + reserved(if) operator(()ident(rb_id_attrset)operator(()ident(SYM2ID)operator(()ident(slot)operator(\)\)) operator(==) ident(id)operator(\)) operator({) + reserved(return) ident(RSTRUCT)operator(()ident(obj)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(val)operator(;) + operator(}) + operator(}) + ident(rb_name_error)operator(()ident(ruby_frame)operator(->)ident(last_func)operator(,) string<delimiter(")content(`%s' is not a struct member)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +directive(static) ident(VALUE) +ident(make_struct)operator(()ident(name)operator(,) ident(members)operator(,) ident(klass)operator(\)) + ident(VALUE) ident(name)operator(,) ident(members)operator(,) ident(klass)operator(;) +operator({) + ident(VALUE) ident(nstr)operator(;) + ident(ID) ident(id)operator(;) + pre_type(long) ident(i)operator(;) + + ident(OBJ_FREEZE)operator(()ident(members)operator(\);) + reserved(if) operator(()ident(NIL_P)operator(()ident(name)operator(\)\)) operator({) + ident(nstr) operator(=) ident(rb_class_new)operator(()ident(klass)operator(\);) + ident(rb_make_metaclass)operator(()ident(nstr)operator(,) ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass)operator(\);) + ident(rb_class_inherited)operator(()ident(klass)operator(,) ident(nstr)operator(\);) + operator(}) + reserved(else) operator({) + pre_type(char) operator(*)ident(cname) operator(=) ident(StringValuePtr)operator(()ident(name)operator(\);) + ident(id) operator(=) ident(rb_intern)operator(()ident(cname)operator(\);) + reserved(if) operator((!)ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(identifier %s needs to be constant)delimiter(")>operator(,) ident(cname)operator(\);) + operator(}) + reserved(if) operator(()ident(rb_const_defined_at)operator(()ident(klass)operator(,) ident(id)operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(redefining constant Struct::%s)delimiter(")>operator(,) ident(cname)operator(\);) + ident(rb_mod_remove_const)operator(()ident(klass)operator(,) ident(ID2SYM)operator(()ident(id)operator(\)\);) + operator(}) + ident(nstr) operator(=) ident(rb_define_class_under)operator(()ident(klass)operator(,) ident(rb_id2name)operator(()ident(id)operator(\),) ident(klass)operator(\);) + operator(}) + ident(rb_iv_set)operator(()ident(nstr)operator(,) string<delimiter(")content(__size__)delimiter(")>operator(,) ident(LONG2NUM)operator(()ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(\)\);) + ident(rb_iv_set)operator(()ident(nstr)operator(,) string<delimiter(")content(__members__)delimiter(")>operator(,) ident(members)operator(\);) + + ident(rb_define_alloc_func)operator(()ident(nstr)operator(,) ident(struct_alloc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(nstr)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(rb_class_new_instance)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(nstr)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(rb_class_new_instance)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(nstr)operator(,) string<delimiter(")content(members)delimiter(")>operator(,) ident(rb_struct_s_members_m)operator(,) integer(0)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<) ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(ID) ident(id) operator(=) ident(SYM2ID)operator(()ident(RARRAY)operator(()ident(members)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + reserved(if) operator(()ident(rb_is_local_id)operator(()ident(id)operator(\)) operator(||) ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + reserved(if) operator(()ident(i)operator(<)integer(10)operator(\)) operator({) + ident(rb_define_method_id)operator(()ident(nstr)operator(,) ident(id)operator(,) ident(ref_func)operator([)ident(i)operator(],) integer(0)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_define_method_id)operator(()ident(nstr)operator(,) ident(id)operator(,) ident(rb_struct_ref)operator(,) integer(0)operator(\);) + operator(}) + ident(rb_define_method_id)operator(()ident(nstr)operator(,) ident(rb_id_attrset)operator(()ident(id)operator(\),) ident(rb_struct_set)operator(,) integer(1)operator(\);) + operator(}) + operator(}) + + reserved(return) ident(nstr)operator(;) +operator(}) + +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(#include) include(<stdarg.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(,)ident(b)operator(\)) +preprocessor(#else) +preprocessor(#include) include(<varargs.h>) +preprocessor(#define) ident(va_init_list)operator(()ident(a)operator(,)ident(b)operator(\)) ident(va_start)operator(()ident(a)operator(\)) +preprocessor(#endif) + +ident(VALUE) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_struct_define)operator(()directive(const) pre_type(char) operator(*)ident(name)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_struct_define)operator(()ident(name)operator(,) ident(va_alist)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(va_list) ident(ar)operator(;) + ident(VALUE) ident(nm)operator(,) ident(ary)operator(;) + pre_type(char) operator(*)ident(mem)operator(;) + + reserved(if) operator((!)ident(name)operator(\)) ident(nm) operator(=) ident(Qnil)operator(;) + reserved(else) ident(nm) operator(=) ident(rb_str_new2)operator(()ident(name)operator(\);) + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + ident(va_init_list)operator(()ident(ar)operator(,) ident(name)operator(\);) + reserved(while) operator((()ident(mem) operator(=) ident(va_arg)operator(()ident(ar)operator(,) pre_type(char)operator(*\)\)) operator(!=) integer(0)operator(\)) operator({) + ident(ID) ident(slot) operator(=) ident(rb_intern)operator(()ident(mem)operator(\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(ID2SYM)operator(()ident(slot)operator(\)\);) + operator(}) + ident(va_end)operator(()ident(ar)operator(\);) + + reserved(return) ident(make_struct)operator(()ident(nm)operator(,) ident(ary)operator(,) ident(rb_cStruct)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Struct.new( [aString] [, aSym]+> \) => StructClass + * StructClass.new(arg, ...\) => obj + * StructClass[arg, ...] => obj + * + * Creates a new class, named by <i>aString</i>, containing accessor + * methods for the given symbols. If the name <i>aString</i> is + * omitted, an anonymous structure class will be created. Otherwise, + * the name of this struct will appear as a constant in class + * <code>Struct</code>, so it must be unique for all + * <code>Struct</code>s in the system and should start with a capital + * letter. Assigning a structure class to a constant effectively gives + * the class the name of the constant. + * + * <code>Struct::new</code> returns a new <code>Class</code> object, + * which can then be used to create specific instances of the new + * structure. The number of actual parameters must be + * less than or equal to the number of attributes defined for this + * class; unset parameters default to \\nil{}. Passing too many + * parameters will raise an \\E{ArgumentError}. + * + * The remaining methods listed in this section (class and instance\) + * are defined for this generated class. + * + * # Create a structure with a name in Struct + * Struct.new("Customer", :name, :address\) #=> Struct::Customer + * Struct::Customer.new("Dave", "123 Main"\) #=> #<Struct::Customer name="Dave", address="123 Main"> + * + * # Create a structure named by its constant + * Customer = Struct.new(:name, :address\) #=> Customer + * Customer.new("Dave", "123 Main"\) #=> #<Customer name="Dave", address="123 Main"> + */) + +directive(static) ident(VALUE) +ident(rb_struct_s_def)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(name)operator(,) ident(rest)operator(;) + pre_type(long) ident(i)operator(;) + ident(VALUE) ident(st)operator(;) + ident(ID) ident(id)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(1*)delimiter(")>operator(,) operator(&)ident(name)operator(,) operator(&)ident(rest)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(name)operator(\)) operator(&&) ident(SYMBOL_P)operator(()ident(name)operator(\)\)) operator({) + ident(rb_ary_unshift)operator(()ident(rest)operator(,) ident(name)operator(\);) + ident(name) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RARRAY)operator(()ident(rest)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(id) operator(=) ident(rb_to_id)operator(()ident(RARRAY)operator(()ident(rest)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + ident(RARRAY)operator(()ident(rest)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(ID2SYM)operator(()ident(id)operator(\);) + operator(}) + ident(st) operator(=) ident(make_struct)operator(()ident(name)operator(,) ident(rest)operator(,) ident(klass)operator(\);) + reserved(if) operator(()ident(rb_block_given_p)operator((\)\)) operator({) + ident(rb_mod_module_eval)operator(()integer(0)operator(,) integer(0)operator(,) ident(st)operator(\);) + operator(}) + + reserved(return) ident(st)operator(;) +operator(}) + +comment(/* + */) + +directive(static) ident(VALUE) +ident(rb_struct_initialize)operator(()ident(self)operator(,) ident(values)operator(\)) + ident(VALUE) ident(self)operator(,) ident(values)operator(;) +operator({) + ident(VALUE) ident(klass) operator(=) ident(rb_obj_class)operator(()ident(self)operator(\);) + ident(VALUE) ident(size)operator(;) + pre_type(long) ident(n)operator(;) + + ident(rb_struct_modify)operator(()ident(self)operator(\);) + ident(size) operator(=) ident(rb_struct_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__size__)delimiter(")>operator(\);) + ident(n) operator(=) ident(FIX2LONG)operator(()ident(size)operator(\);) + reserved(if) operator(()ident(n) operator(<) ident(RARRAY)operator(()ident(values)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(struct size differs)delimiter(")>operator(\);) + operator(}) + ident(MEMCPY)operator(()ident(RSTRUCT)operator(()ident(self)operator(\)->)ident(ptr)operator(,) ident(RARRAY)operator(()ident(values)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RARRAY)operator(()ident(values)operator(\)->)ident(len)operator(\);) + reserved(if) operator(()ident(n) operator(>) ident(RARRAY)operator(()ident(values)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_mem_clear)operator(()ident(RSTRUCT)operator(()ident(self)operator(\)->)ident(ptr)operator(+)ident(RARRAY)operator(()ident(values)operator(\)->)ident(len)operator(,) + ident(n)operator(-)ident(RARRAY)operator(()ident(values)operator(\)->)ident(len)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(struct_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(size)operator(;) + pre_type(long) ident(n)operator(;) + ident(NEWOBJ)operator(()ident(st)operator(,) reserved(struct) ident(RStruct)operator(\);) + ident(OBJSETUP)operator(()ident(st)operator(,) ident(klass)operator(,) ident(T_STRUCT)operator(\);) + + ident(size) operator(=) ident(rb_struct_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__size__)delimiter(")>operator(\);) + ident(n) operator(=) ident(FIX2LONG)operator(()ident(size)operator(\);) + + ident(st)operator(->)ident(ptr) operator(=) ident(ALLOC_N)operator(()ident(VALUE)operator(,) ident(n)operator(\);) + ident(rb_mem_clear)operator(()ident(st)operator(->)ident(ptr)operator(,) ident(n)operator(\);) + ident(st)operator(->)ident(len) operator(=) ident(n)operator(;) + + reserved(return) operator(()ident(VALUE)operator(\))ident(st)operator(;) +operator(}) + +ident(VALUE) +ident(rb_struct_alloc)operator(()ident(klass)operator(,) ident(values)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(values)operator(;) +operator({) + reserved(return) ident(rb_class_new_instance)operator(()ident(RARRAY)operator(()ident(values)operator(\)->)ident(len)operator(,) ident(RARRAY)operator(()ident(values)operator(\)->)ident(ptr)operator(,) ident(klass)operator(\);) +operator(}) + +ident(VALUE) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +ident(rb_struct_new)operator(()ident(VALUE) ident(klass)operator(,) operator(.)operator(.)operator(.)operator(\)) +preprocessor(#else) +ident(rb_struct_new)operator(()ident(klass)operator(,) ident(va_alist)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(va_dcl) +preprocessor(#endif) +operator({) + ident(VALUE) ident(sz)operator(,) operator(*)ident(mem)operator(;) + pre_type(long) ident(size)operator(,) ident(i)operator(;) + ident(va_list) ident(args)operator(;) + + ident(sz) operator(=) ident(rb_struct_iv_get)operator(()ident(klass)operator(,) string<delimiter(")content(__size__)delimiter(")>operator(\);) + ident(size) operator(=) ident(FIX2LONG)operator(()ident(sz)operator(\);) + ident(mem) operator(=) ident(ALLOCA_N)operator(()ident(VALUE)operator(,) ident(size)operator(\);) + ident(va_init_list)operator(()ident(args)operator(,) ident(klass)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(size)operator(;) ident(i)operator(++\)) operator({) + ident(mem)operator([)ident(i)operator(]) operator(=) ident(va_arg)operator(()ident(args)operator(,) ident(VALUE)operator(\);) + operator(}) + ident(va_end)operator(()ident(args)operator(\);) + + reserved(return) ident(rb_class_new_instance)operator(()ident(size)operator(,) ident(mem)operator(,) ident(klass)operator(\);) +operator(}) + +comment(/* + * call-seq: + * struct.each {|obj| block } => struct + * + * Calls <i>block</i> once for each instance variable, passing the + * value as a parameter. + * + * Customer = Struct.new(:name, :address, :zip\) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345\) + * joe.each {|x| puts(x\) } + * + * <em>produces:</em> + * + * Joe Smith + * 123 Maple, Anytown NC + * 12345 + */) + +directive(static) ident(VALUE) +ident(rb_struct_each)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield)operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + reserved(return) ident(s)operator(;) +operator(}) + +comment(/* + * call-seq: + * struct.each_pair {|sym, obj| block } => struct + * + * Calls <i>block</i> once for each instance variable, passing the name + * (as a symbol\) and the value as parameters. + * + * Customer = Struct.new(:name, :address, :zip\) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345\) + * joe.each_pair {|name, value| puts("#{name} => #{value}"\) } + * + * <em>produces:</em> + * + * name => Joe Smith + * address => 123 Maple, Anytown NC + * zip => 12345 + */) + +directive(static) ident(VALUE) +ident(rb_struct_each_pair)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + ident(VALUE) ident(members)operator(;) + pre_type(long) ident(i)operator(;) + + ident(members) operator(=) ident(rb_struct_members)operator(()ident(s)operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(rb_yield_values)operator(()integer(2)operator(,) ident(rb_ary_entry)operator(()ident(members)operator(,) ident(i)operator(\),) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + reserved(return) ident(s)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(inspect_struct)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + pre_type(char) operator(*)ident(cname) operator(=) ident(rb_class2name)operator(()ident(rb_obj_class)operator(()ident(s)operator(\)\);) + ident(VALUE) ident(str)operator(,) ident(members)operator(;) + pre_type(long) ident(i)operator(;) + + ident(members) operator(=) ident(rb_struct_members)operator(()ident(s)operator(\);) + ident(str) operator(=) ident(rb_str_buf_new2)operator(()string<delimiter(")content(#<struct )delimiter(")>operator(\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) ident(cname)operator(\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content( )delimiter(")>operator(\);) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(VALUE) ident(slot)operator(;) + ident(ID) ident(id)operator(;) + pre_type(char) operator(*)ident(p)operator(;) + + reserved(if) operator(()ident(i) operator(>) integer(0)operator(\)) operator({) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(, )delimiter(")>operator(\);) + operator(}) + ident(slot) operator(=) ident(RARRAY)operator(()ident(members)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + ident(id) operator(=) ident(SYM2ID)operator(()ident(slot)operator(\);) + reserved(if) operator(()ident(rb_is_local_id)operator(()ident(id)operator(\)) operator(||) ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + ident(p) operator(=) ident(rb_id2name)operator(()ident(id)operator(\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) ident(p)operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_str_append)operator(()ident(str)operator(,) ident(rb_inspect)operator(()ident(slot)operator(\)\);) + operator(}) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(=)delimiter(")>operator(\);) + ident(rb_str_append)operator(()ident(str)operator(,) ident(rb_inspect)operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)\);) + operator(}) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(>)delimiter(")>operator(\);) + ident(OBJ_INFECT)operator(()ident(str)operator(,) ident(s)operator(\);) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * struct.to_s => string + * struct.inspect => string + * + * Describe the contents of this struct in a string. + */) + +directive(static) ident(VALUE) +ident(rb_struct_inspect)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + reserved(if) operator(()ident(rb_inspecting_p)operator(()ident(s)operator(\)\)) operator({) + pre_type(char) operator(*)ident(cname) operator(=) ident(rb_class2name)operator(()ident(rb_obj_class)operator(()ident(s)operator(\)\);) + ident(size_t) ident(len) operator(=) ident(strlen)operator(()ident(cname)operator(\)) operator(+) integer(14)operator(;) + ident(VALUE) ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) + + ident(snprintf)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(len)operator(+)integer(1)operator(,) string<delimiter(")content(#<struct %s:...>)delimiter(")>operator(,) ident(cname)operator(\);) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(strlen)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + reserved(return) ident(str)operator(;) + operator(}) + reserved(return) ident(rb_protect_inspect)operator(()ident(inspect_struct)operator(,) ident(s)operator(,) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * struct.to_a => array + * struct.values => array + * + * Returns the values for this instance as an array. + * + * Customer = Struct.new(:name, :address, :zip\) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345\) + * joe.to_a[1] #=> "123 Maple, Anytown NC" + */) + +directive(static) ident(VALUE) +ident(rb_struct_to_a)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + reserved(return) ident(rb_ary_new4)operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator(\);) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(rb_struct_init_copy)operator(()ident(copy)operator(,) ident(s)operator(\)) + ident(VALUE) ident(copy)operator(,) ident(s)operator(;) +operator({) + reserved(if) operator(()ident(copy) operator(==) ident(s)operator(\)) reserved(return) ident(copy)operator(;) + ident(rb_check_frozen)operator(()ident(copy)operator(\);) + reserved(if) operator((!)ident(rb_obj_is_instance_of)operator(()ident(s)operator(,) ident(rb_obj_class)operator(()ident(copy)operator(\)\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument class)delimiter(")>operator(\);) + operator(}) + reserved(if) operator(()ident(RSTRUCT)operator(()ident(copy)operator(\)->)ident(len) operator(!=) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(struct size mismatch)delimiter(")>operator(\);) + operator(}) + ident(MEMCPY)operator(()ident(RSTRUCT)operator(()ident(copy)operator(\)->)ident(ptr)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator(,) ident(VALUE)operator(,) ident(RSTRUCT)operator(()ident(copy)operator(\)->)ident(len)operator(\);) + + reserved(return) ident(copy)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(rb_struct_aref_id)operator(()ident(s)operator(,) ident(id)operator(\)) + ident(VALUE) ident(s)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(members)operator(;) + pre_type(long) ident(i)operator(,) ident(len)operator(;) + + ident(members) operator(=) ident(rb_struct_members)operator(()ident(s)operator(\);) + ident(len) operator(=) ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(SYM2ID)operator(()ident(RARRAY)operator(()ident(members)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)) operator(==) ident(id)operator(\)) operator({) + reserved(return) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(];) + operator(}) + operator(}) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(no member '%s' in struct)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +comment(/* + * call-seq: + * struct[symbol] => anObject + * struct[fixnum] => anObject + * + * Attribute Reference---Returns the value of the instance variable + * named by <i>symbol</i>, or indexed (0..length-1\) by + * <i>fixnum</i>. Will raise <code>NameError</code> if the named + * variable does not exist, or <code>IndexError</code> if the index is + * out of range. + * + * Customer = Struct.new(:name, :address, :zip\) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345\) + * + * joe["name"] #=> "Joe Smith" + * joe[:name] #=> "Joe Smith" + * joe[0] #=> "Joe Smith" + */) + +ident(VALUE) +ident(rb_struct_aref)operator(()ident(s)operator(,) ident(idx)operator(\)) + ident(VALUE) ident(s)operator(,) ident(idx)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(idx)operator(\)) operator(==) ident(T_STRING) operator(||) ident(TYPE)operator(()ident(idx)operator(\)) operator(==) ident(T_SYMBOL)operator(\)) operator({) + reserved(return) ident(rb_struct_aref_id)operator(()ident(s)operator(,) ident(rb_to_id)operator(()ident(idx)operator(\)\);) + operator(}) + + ident(i) operator(=) ident(NUM2LONG)operator(()ident(idx)operator(\);) + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) ident(i) operator(=) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len) operator(+) ident(i)operator(;) + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(offset %ld too small for struct(size:%ld\))delimiter(")>operator(,) + ident(i)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(\);) + reserved(if) operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len) operator(<=) ident(i)operator(\)) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(offset %ld too large for struct(size:%ld\))delimiter(")>operator(,) + ident(i)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(\);) + reserved(return) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(];) +operator(}) + +directive(static) ident(VALUE) +ident(rb_struct_aset_id)operator(()ident(s)operator(,) ident(id)operator(,) ident(val)operator(\)) + ident(VALUE) ident(s)operator(,) ident(val)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(members)operator(;) + pre_type(long) ident(i)operator(,) ident(len)operator(;) + + ident(members) operator(=) ident(rb_struct_members)operator(()ident(s)operator(\);) + ident(rb_struct_modify)operator(()ident(s)operator(\);) + ident(len) operator(=) ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len) operator(!=) ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(struct size differs (%d required %d given\))delimiter(")>operator(,) + ident(RARRAY)operator(()ident(members)operator(\)->)ident(len)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(SYM2ID)operator(()ident(RARRAY)operator(()ident(members)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)) operator(==) ident(id)operator(\)) operator({) + ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(val)operator(;) + reserved(return) ident(val)operator(;) + operator(}) + operator(}) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(no member '%s' in struct)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * struct[symbol] = obj => obj + * struct[fixnum] = obj => obj + * + * Attribute Assignment---Assigns to the instance variable named by + * <i>symbol</i> or <i>fixnum</i> the value <i>obj</i> and + * returns it. Will raise a <code>NameError</code> if the named + * variable does not exist, or an <code>IndexError</code> if the index + * is out of range. + * + * Customer = Struct.new(:name, :address, :zip\) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345\) + * + * joe["name"] = "Luke" + * joe[:zip] = "90210" + * + * joe.name #=> "Luke" + * joe.zip #=> "90210" + */) + +ident(VALUE) +ident(rb_struct_aset)operator(()ident(s)operator(,) ident(idx)operator(,) ident(val)operator(\)) + ident(VALUE) ident(s)operator(,) ident(idx)operator(,) ident(val)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(idx)operator(\)) operator(==) ident(T_STRING) operator(||) ident(TYPE)operator(()ident(idx)operator(\)) operator(==) ident(T_SYMBOL)operator(\)) operator({) + reserved(return) ident(rb_struct_aset_id)operator(()ident(s)operator(,) ident(rb_to_id)operator(()ident(idx)operator(\),) ident(val)operator(\);) + operator(}) + + ident(i) operator(=) ident(NUM2LONG)operator(()ident(idx)operator(\);) + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) ident(i) operator(=) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len) operator(+) ident(i)operator(;) + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(offset %ld too small for struct(size:%ld\))delimiter(")>operator(,) + ident(i)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(\);) + operator(}) + reserved(if) operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len) operator(<=) ident(i)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eIndexError)operator(,) string<delimiter(")content(offset %ld too large for struct(size:%ld\))delimiter(")>operator(,) + ident(i)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(\);) + operator(}) + ident(rb_struct_modify)operator(()ident(s)operator(\);) + reserved(return) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(]) operator(=) ident(val)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(struct_entry) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(\)\);) +directive(static) ident(VALUE) +ident(struct_entry)operator(()ident(s)operator(,) ident(n)operator(\)) + ident(VALUE) ident(s)operator(;) + pre_type(long) ident(n)operator(;) +operator({) + reserved(return) ident(rb_struct_aref)operator(()ident(s)operator(,) ident(LONG2NUM)operator(()ident(n)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * struct.values_at(selector,... \) => an_array + * + * Returns an array containing the elements in + * _self_ corresponding to the given selector(s\). The selectors + * may be either integer indices or ranges. + * See also </code>.select<code>. + * + * a = %w{ a b c d e f } + * a.values_at(1, 3, 5\) + * a.values_at(1, 3, 5, 7\) + * a.values_at(-1, -3, -5, -7\) + * a.values_at(1..3, 2...5\) + */) + +directive(static) ident(VALUE) +ident(rb_struct_values_at)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(s)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(s)operator(;) +operator({) + reserved(return) ident(rb_values_at)operator(()ident(s)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(,) ident(argc)operator(,) ident(argv)operator(,) ident(struct_entry)operator(\);) +operator(}) + +comment(/* + * call-seq: + * struct.select {|i| block } => array + * + * Invokes the block passing in successive elements from + * <i>struct</i>, returning an array containing those elements + * for which the block returns a true value (equivalent to + * <code>Enumerable#select</code>\). + * + * Lots = Struct.new(:a, :b, :c, :d, :e, :f\) + * l = Lots.new(11, 22, 33, 44, 55, 66\) + * l.select {|v| (v % 2\).zero? } #=> [22, 44, 66] + */) + +directive(static) ident(VALUE) +ident(rb_struct_select)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(s)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(s)operator(;) +operator({) + ident(VALUE) ident(result)operator(;) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(argc) operator(>) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(wrong number of arguments (%d for 0\))delimiter(")>operator(,) ident(argc)operator(\);) + operator(}) + ident(result) operator(=) ident(rb_ary_new)operator((\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(rb_yield)operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)\)\)) operator({) + ident(rb_ary_push)operator(()ident(result)operator(,) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + operator(}) + operator(}) + + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * struct == other_struct => true or false + * + * Equality---Returns <code>true</code> if <i>other_struct</i> is + * equal to this one: they must be of the same class as generated by + * <code>Struct::new</code>, and the values of all instance variables + * must be equal (according to <code>Object#==</code>\). + * + * Customer = Struct.new(:name, :address, :zip\) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345\) + * joejr = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345\) + * jane = Customer.new("Jane Doe", "456 Elm, Anytown NC", 12345\) + * joe == joejr #=> true + * joe == jane #=> false + */) + +directive(static) ident(VALUE) +ident(rb_struct_equal)operator(()ident(s)operator(,) ident(s2)operator(\)) + ident(VALUE) ident(s)operator(,) ident(s2)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(s) operator(==) ident(s2)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(s2)operator(\)) operator(!=) ident(T_STRUCT)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(rb_obj_class)operator(()ident(s)operator(\)) operator(!=) ident(rb_obj_class)operator(()ident(s2)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len) operator(!=) ident(RSTRUCT)operator(()ident(s2)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(inconsistent struct)delimiter(")>operator(\);) comment(/* should never happen */) + operator(}) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator((!)ident(rb_equal)operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(RSTRUCT)operator(()ident(s2)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)\)) reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * struct.hash => fixnum + * + * Return a hash value based on this struct's contents. + */) + +directive(static) ident(VALUE) +ident(rb_struct_hash)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + pre_type(long) ident(i)operator(,) ident(h)operator(;) + ident(VALUE) ident(n)operator(;) + + ident(h) operator(=) ident(rb_hash)operator(()ident(rb_obj_class)operator(()ident(s)operator(\)\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + ident(h) operator(=) operator(()ident(h) operator(<<) integer(1)operator(\)) operator(|) operator(()ident(h)operator(<)integer(0) operator(?) integer(1) operator(:) integer(0)operator(\);) + ident(n) operator(=) ident(rb_hash)operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(]\);) + ident(h) operator(^=) ident(NUM2LONG)operator(()ident(n)operator(\);) + operator(}) + reserved(return) ident(LONG2FIX)operator(()ident(h)operator(\);) +operator(}) + +comment(/* + * code-seq: + * struct.eql?(other\) => true or false + * + * Two structures are equal if they are the same object, or if all their + * fields are equal (using <code>eql?</code>\). + */) + +directive(static) ident(VALUE) +ident(rb_struct_eql)operator(()ident(s)operator(,) ident(s2)operator(\)) + ident(VALUE) ident(s)operator(,) ident(s2)operator(;) +operator({) + pre_type(long) ident(i)operator(;) + + reserved(if) operator(()ident(s) operator(==) ident(s2)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(if) operator(()ident(TYPE)operator(()ident(s2)operator(\)) operator(!=) ident(T_STRUCT)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(rb_obj_class)operator(()ident(s)operator(\)) operator(!=) ident(rb_obj_class)operator(()ident(s2)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len) operator(!=) ident(RSTRUCT)operator(()ident(s2)operator(\)->)ident(len)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(inconsistent struct)delimiter(")>operator(\);) comment(/* should never happen */) + operator(}) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator((!)ident(rb_eql)operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(ptr)operator([)ident(i)operator(],) ident(RSTRUCT)operator(()ident(s2)operator(\)->)ident(ptr)operator([)ident(i)operator(]\)\)) reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +comment(/* + * call-seq: + * struct.length => fixnum + * struct.size => fixnum + * + * Returns the number of instance variables. + * + * Customer = Struct.new(:name, :address, :zip\) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345\) + * joe.length #=> 3 + */) + +directive(static) ident(VALUE) +ident(rb_struct_size)operator(()ident(s)operator(\)) + ident(VALUE) ident(s)operator(;) +operator({) + reserved(return) ident(LONG2FIX)operator(()ident(RSTRUCT)operator(()ident(s)operator(\)->)ident(len)operator(\);) +operator(}) + +comment(/* + * A <code>Struct</code> is a convenient way to bundle a number of + * attributes together, using accessor methods, without having to write + * an explicit class. + * + * The <code>Struct</code> class is a generator of specific classes, + * each one of which is defined to hold a set of variables and their + * accessors. In these examples, we'll call the generated class + * ``<i>Customer</i>Class,'' and we'll show an example instance of that + * class as ``<i>Customer</i>Inst.'' + * + * In the descriptions that follow, the parameter <i>symbol</i> refers + * to a symbol, which is either a quoted string or a + * <code>Symbol</code> (such as <code>:name</code>\). + */) +directive(void) +ident(Init_Struct)operator((\)) +operator({) + ident(rb_cStruct) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Struct)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_include_module)operator(()ident(rb_cStruct)operator(,) ident(rb_mEnumerable)operator(\);) + + ident(rb_undef_alloc_func)operator(()ident(rb_cStruct)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(rb_struct_s_def)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rb_struct_initialize)operator(,) operator(-)integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(rb_struct_init_copy)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(rb_struct_equal)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(rb_struct_eql)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(hash)delimiter(")>operator(,) ident(rb_struct_hash)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(rb_struct_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(rb_struct_inspect)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(to_a)delimiter(")>operator(,) ident(rb_struct_to_a)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(values)delimiter(")>operator(,) ident(rb_struct_to_a)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(size)delimiter(")>operator(,) ident(rb_struct_size)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(length)delimiter(")>operator(,) ident(rb_struct_size)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(each)delimiter(")>operator(,) ident(rb_struct_each)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(each_pair)delimiter(")>operator(,) ident(rb_struct_each_pair)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(rb_struct_aref)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content([]=)delimiter(")>operator(,) ident(rb_struct_aset)operator(,) integer(2)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(select)delimiter(")>operator(,) ident(rb_struct_select)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(values_at)delimiter(")>operator(,) ident(rb_struct_values_at)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cStruct)operator(,) string<delimiter(")content(members)delimiter(")>operator(,) ident(rb_struct_members_m)operator(,) integer(0)operator(\);) +operator(}) +comment(/********************************************************************** + + time.c - + + $Author: shyouhei $ + $Date: 2009-02-02 12:03:25 +0100 (Mon, 02 Feb 2009\) $ + created at: Tue Dec 28 14:31:59 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<time.h>) + +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) + +preprocessor(#include) include(<errno.h>) +preprocessor(#include) include(<math.h>) + +ident(VALUE) ident(rb_cTime)operator(;) + +reserved(struct) ident(time_object) operator({) + reserved(struct) ident(timeval) ident(tv)operator(;) + reserved(struct) ident(tm) ident(tm)operator(;) + pre_type(int) ident(gmt)operator(;) + pre_type(int) ident(tm_got)operator(;) +operator(};) + +preprocessor(#define) ident(GetTimeval)operator(()ident(obj)operator(,) ident(tobj)operator(\)) \ + ident(Data_Get_Struct)operator(()ident(obj)operator(,) reserved(struct) ident(time_object)operator(,) ident(tobj)operator(\)) + +directive(static) directive(void) ident(time_free) ident(_)operator((()directive(void) operator(*\)\);) +directive(static) ident(VALUE) ident(time_utc_offset) ident(_)operator((()ident(VALUE)operator(\)\);) + +directive(static) directive(void) +ident(time_free)operator(()ident(tobj)operator(\)) + directive(void) operator(*)ident(tobj)operator(;) +operator({) + reserved(if) operator(()ident(tobj)operator(\)) ident(free)operator(()ident(tobj)operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(time_s_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) +ident(time_s_alloc)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(obj)operator(;) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(obj) operator(=) ident(Data_Make_Struct)operator(()ident(klass)operator(,) reserved(struct) ident(time_object)operator(,) integer(0)operator(,) ident(time_free)operator(,) ident(tobj)operator(\);) + ident(tobj)operator(->)ident(tm_got)operator(=)integer(0)operator(;) + ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec) operator(=) integer(0)operator(;) + ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec) operator(=) integer(0)operator(;) + + reserved(return) ident(obj)operator(;) +operator(}) + +directive(static) directive(void) +ident(time_modify)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + ident(rb_check_frozen)operator(()ident(time)operator(\);) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(time)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify Time)delimiter(")>operator(\);) +operator(}) + +comment(/* + * Document-method: now + * + * Synonym for <code>Time.new</code>. Returns a +Time+ object + * initialized tot he current system time. + * + * call-seq: + * Time.new -> time + * + * Returns a <code>Time</code> object initialized to the current system + * time. <b>Note:</b> The object created will be created using the + * resolution available on your system clock, and so may include + * fractional seconds. + * + * a = Time.new #=> Wed Apr 09 08:56:03 CDT 2003 + * b = Time.new #=> Wed Apr 09 08:56:03 CDT 2003 + * a == b #=> false + * "%.6f" % a.to_f #=> "1049896563.230740" + * "%.6f" % b.to_f #=> "1049896563.231466" + * + */) + +directive(static) ident(VALUE) +ident(time_init)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(time_modify)operator(()ident(time)operator(\);) + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + ident(tobj)operator(->)ident(tm_got)operator(=)integer(0)operator(;) + ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec) operator(=) integer(0)operator(;) + ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(gettimeofday)operator((&)ident(tobj)operator(->)ident(tv)operator(,) integer(0)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(rb_sys_fail)operator(()string<delimiter(")content(gettimeofday)delimiter(")>operator(\);) + operator(}) + + reserved(return) ident(time)operator(;) +operator(}) + +preprocessor(#define) ident(NDIV)operator(()ident(x)operator(,)ident(y)operator(\)) operator((-(-(()ident(x)operator(\)+)integer(1)operator(\))operator(/)operator(()ident(y)operator(\)\)-)integer(1)operator(\)) +preprocessor(#define) ident(NMOD)operator(()ident(x)operator(,)ident(y)operator(\)) operator((()ident(y)operator(\)-(-(()ident(x)operator(\)+)integer(1)operator(\)%()ident(y)operator(\)\)-)integer(1)operator(\)) + +directive(static) directive(void) +ident(time_overflow_p)operator(()ident(secp)operator(,) ident(usecp)operator(\)) + ident(time_t) operator(*)ident(secp)operator(,) operator(*)ident(usecp)operator(;) +operator({) + ident(time_t) ident(tmp)operator(,) ident(sec) operator(=) operator(*)ident(secp)operator(,) ident(usec) operator(=) operator(*)ident(usecp)operator(;) + + reserved(if) operator(()ident(usec) operator(>=) integer(1000000)operator(\)) operator({) comment(/* usec positive overflow */) + ident(tmp) operator(=) ident(sec) operator(+) ident(usec) operator(/) integer(1000000)operator(;) + ident(usec) operator(%=) integer(1000000)operator(;) + reserved(if) operator(()ident(sec) operator(>) integer(0) operator(&&) ident(tmp) operator(<) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(out of Time range)delimiter(")>operator(\);) + operator(}) + ident(sec) operator(=) ident(tmp)operator(;) + operator(}) + reserved(if) operator(()ident(usec) operator(<) integer(0)operator(\)) operator({) comment(/* usec negative overflow */) + ident(tmp) operator(=) ident(sec) operator(+) ident(NDIV)operator(()ident(usec)operator(,)integer(1000000)operator(\);) comment(/* negative div */) + ident(usec) operator(=) ident(NMOD)operator(()ident(usec)operator(,)integer(1000000)operator(\);) comment(/* negative mod */) + reserved(if) operator(()ident(sec) operator(<) integer(0) operator(&&) ident(tmp) operator(>) integer(0)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(out of Time range)delimiter(")>operator(\);) + operator(}) + ident(sec) operator(=) ident(tmp)operator(;) + operator(}) +preprocessor(#ifndef) ident(NEGATIVE_TIME_T) + reserved(if) operator(()ident(sec) operator(<) integer(0) operator(||) operator(()ident(sec) operator(==) integer(0) operator(&&) ident(usec) operator(<) integer(0)operator(\)\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(time must be positive)delimiter(")>operator(\);) +preprocessor(#endif) + operator(*)ident(secp) operator(=) ident(sec)operator(;) + operator(*)ident(usecp) operator(=) ident(usec)operator(;) +operator(}) + +directive(static) ident(VALUE) ident(time_new_internal) ident(_)operator((()ident(VALUE)operator(,) ident(time_t)operator(,) ident(time_t)operator(\)\);) +directive(static) ident(VALUE) +ident(time_new_internal)operator(()ident(klass)operator(,) ident(sec)operator(,) ident(usec)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(time_t) ident(sec)operator(,) ident(usec)operator(;) +operator({) + ident(VALUE) ident(time) operator(=) ident(time_s_alloc)operator(()ident(klass)operator(\);) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + ident(time_overflow_p)operator((&)ident(sec)operator(,) operator(&)ident(usec)operator(\);) + ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec) operator(=) ident(sec)operator(;) + ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec) operator(=) ident(usec)operator(;) + + reserved(return) ident(time)operator(;) +operator(}) + +ident(VALUE) +ident(rb_time_new)operator(()ident(sec)operator(,) ident(usec)operator(\)) + ident(time_t) ident(sec)operator(,) ident(usec)operator(;) +operator({) + reserved(return) ident(time_new_internal)operator(()ident(rb_cTime)operator(,) ident(sec)operator(,) ident(usec)operator(\);) +operator(}) + +directive(static) reserved(struct) ident(timeval) +ident(time_timeval)operator(()ident(time)operator(,) ident(interval)operator(\)) + ident(VALUE) ident(time)operator(;) + pre_type(int) ident(interval)operator(;) +operator({) + reserved(struct) ident(timeval) ident(t)operator(;) + pre_type(char) operator(*)ident(tstr) operator(=) ident(interval) operator(?) string<delimiter(")content(time interval)delimiter(")> operator(:) string<delimiter(")content(time)delimiter(")>operator(;) + +preprocessor(#ifndef) ident(NEGATIVE_TIME_T) + ident(interval) operator(=) integer(1)operator(;) +preprocessor(#endif) + + reserved(switch) operator(()ident(TYPE)operator(()ident(time)operator(\)\)) operator({) + reserved(case) label(T_FIXNUM)operator(:) + ident(t)operator(.)ident(tv_sec) operator(=) ident(FIX2LONG)operator(()ident(time)operator(\);) + reserved(if) operator(()ident(interval) operator(&&) ident(t)operator(.)ident(tv_sec) operator(<) integer(0)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(%s must be positive)delimiter(")>operator(,) ident(tstr)operator(\);) + ident(t)operator(.)ident(tv_usec) operator(=) integer(0)operator(;) + reserved(break)operator(;) + + reserved(case) label(T_FLOAT)operator(:) + reserved(if) operator(()ident(interval) operator(&&) ident(RFLOAT)operator(()ident(time)operator(\)->)ident(value) operator(<) float(0)float(.0)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(%s must be positive)delimiter(")>operator(,) ident(tstr)operator(\);) + reserved(else) operator({) + pre_type(double) ident(f)operator(,) ident(d)operator(;) + + ident(d) operator(=) ident(modf)operator(()ident(RFLOAT)operator(()ident(time)operator(\)->)ident(value)operator(,) operator(&)ident(f)operator(\);) + reserved(if) operator(()ident(d) operator(<) integer(0)operator(\)) operator({) + ident(d) operator(+=) integer(1)operator(;) + ident(f) operator(-=) integer(1)operator(;) + operator(}) + ident(t)operator(.)ident(tv_sec) operator(=) operator(()ident(time_t)operator(\))ident(f)operator(;) + reserved(if) operator(()ident(f) operator(!=) ident(t)operator(.)ident(tv_sec)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(%f out of Time range)delimiter(")>operator(,) ident(RFLOAT)operator(()ident(time)operator(\)->)ident(value)operator(\);) + operator(}) + ident(t)operator(.)ident(tv_usec) operator(=) operator(()ident(time_t)operator(\)()ident(d)operator(*)float(1)ident(e6)operator(+)float(0)float(.5)operator(\);) + operator(}) + reserved(break)operator(;) + + reserved(case) label(T_BIGNUM)operator(:) + ident(t)operator(.)ident(tv_sec) operator(=) ident(NUM2LONG)operator(()ident(time)operator(\);) + reserved(if) operator(()ident(interval) operator(&&) ident(t)operator(.)ident(tv_sec) operator(<) integer(0)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(%s must be positive)delimiter(")>operator(,) ident(tstr)operator(\);) + ident(t)operator(.)ident(tv_usec) operator(=) integer(0)operator(;) + reserved(break)operator(;) + + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(can't convert %s into %s)delimiter(")>operator(,) + ident(rb_obj_classname)operator(()ident(time)operator(\),) ident(tstr)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(return) ident(t)operator(;) +operator(}) + +reserved(struct) ident(timeval) +ident(rb_time_interval)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(return) ident(time_timeval)operator(()ident(time)operator(,) ident(Qtrue)operator(\);) +operator(}) + +reserved(struct) ident(timeval) +ident(rb_time_timeval)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + reserved(struct) ident(timeval) ident(t)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(time)operator(\)) operator(==) ident(T_DATA) operator(&&) ident(RDATA)operator(()ident(time)operator(\)->)ident(dfree) operator(==) ident(time_free)operator(\)) operator({) + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + ident(t) operator(=) ident(tobj)operator(->)ident(tv)operator(;) + reserved(return) ident(t)operator(;) + operator(}) + reserved(return) ident(time_timeval)operator(()ident(time)operator(,) ident(Qfalse)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Time.at( aTime \) => time + * Time.at( seconds [, microseconds] \) => time + * + * Creates a new time object with the value given by <i>aTime</i>, or + * the given number of <i>seconds</i> (and optional + * <i>microseconds</i>\) from epoch. A non-portable feature allows the + * offset to be negative on some systems. + * + * Time.at(0\) #=> Wed Dec 31 18:00:00 CST 1969 + * Time.at(946702800\) #=> Fri Dec 31 23:00:00 CST 1999 + * Time.at(-284061600\) #=> Sat Dec 31 00:00:00 CST 1960 + */) + +directive(static) ident(VALUE) +ident(time_s_at)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(struct) ident(timeval) ident(tv)operator(;) + ident(VALUE) ident(time)operator(,) ident(t)operator(;) + + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(time)operator(,) operator(&)ident(t)operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(tv)operator(.)ident(tv_sec) operator(=) ident(NUM2LONG)operator(()ident(time)operator(\);) + ident(tv)operator(.)ident(tv_usec) operator(=) ident(NUM2LONG)operator(()ident(t)operator(\);) + operator(}) + reserved(else) operator({) + ident(tv) operator(=) ident(rb_time_timeval)operator(()ident(time)operator(\);) + operator(}) + ident(t) operator(=) ident(time_new_internal)operator(()ident(klass)operator(,) ident(tv)operator(.)ident(tv_sec)operator(,) ident(tv)operator(.)ident(tv_usec)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(time)operator(\)) operator(==) ident(T_DATA) operator(&&) ident(RDATA)operator(()ident(time)operator(\)->)ident(dfree) operator(==) ident(time_free)operator(\)) operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(,) operator(*)ident(tobj2)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + ident(GetTimeval)operator(()ident(t)operator(,) ident(tobj2)operator(\);) + ident(tobj2)operator(->)ident(gmt) operator(=) ident(tobj)operator(->)ident(gmt)operator(;) + operator(}) + reserved(return) ident(t)operator(;) +operator(}) + +directive(static) pre_type(char) operator(*)ident(months) operator([)integer(12)operator(]) operator(=) operator({) + string<delimiter(")content(jan)delimiter(")>operator(,) string<delimiter(")content(feb)delimiter(")>operator(,) string<delimiter(")content(mar)delimiter(")>operator(,) string<delimiter(")content(apr)delimiter(")>operator(,) string<delimiter(")content(may)delimiter(")>operator(,) string<delimiter(")content(jun)delimiter(")>operator(,) + string<delimiter(")content(jul)delimiter(")>operator(,) string<delimiter(")content(aug)delimiter(")>operator(,) string<delimiter(")content(sep)delimiter(")>operator(,) string<delimiter(")content(oct)delimiter(")>operator(,) string<delimiter(")content(nov)delimiter(")>operator(,) string<delimiter(")content(dec)delimiter(")>operator(,) +operator(};) + +directive(static) pre_type(long) +ident(obj2long)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(obj)operator(\)) operator(==) ident(T_STRING)operator(\)) operator({) + ident(obj) operator(=) ident(rb_str_to_inum)operator(()ident(obj)operator(,) integer(10)operator(,) ident(Qfalse)operator(\);) + operator(}) + + reserved(return) ident(NUM2LONG)operator(()ident(obj)operator(\);) +operator(}) + +directive(static) directive(void) +ident(time_arg)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(tm)operator(,) ident(usec)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + reserved(struct) ident(tm) operator(*)ident(tm)operator(;) + ident(time_t) operator(*)ident(usec)operator(;) +operator({) + ident(VALUE) ident(v)operator([)integer(8)operator(];) + pre_type(int) ident(i)operator(;) + pre_type(long) ident(year)operator(;) + + ident(MEMZERO)operator(()ident(tm)operator(,) reserved(struct) ident(tm)operator(,) integer(1)operator(\);) + operator(*)ident(usec) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(argc) operator(==) integer(10)operator(\)) operator({) + ident(v)operator([)integer(0)operator(]) operator(=) ident(argv)operator([)integer(5)operator(];) + ident(v)operator([)integer(1)operator(]) operator(=) ident(argv)operator([)integer(4)operator(];) + ident(v)operator([)integer(2)operator(]) operator(=) ident(argv)operator([)integer(3)operator(];) + ident(v)operator([)integer(3)operator(]) operator(=) ident(argv)operator([)integer(2)operator(];) + ident(v)operator([)integer(4)operator(]) operator(=) ident(argv)operator([)integer(1)operator(];) + ident(v)operator([)integer(5)operator(]) operator(=) ident(argv)operator([)integer(0)operator(];) + ident(v)operator([)integer(6)operator(]) operator(=) ident(Qnil)operator(;) + ident(tm)operator(->)ident(tm_isdst) operator(=) ident(RTEST)operator(()ident(argv)operator([)integer(8)operator(]\)) operator(?) integer(1) operator(:) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(17)delimiter(")>operator(,) operator(&)ident(v)operator([)integer(0)operator(],&)ident(v)operator([)integer(1)operator(],&)ident(v)operator([)integer(2)operator(],&)ident(v)operator([)integer(3)operator(],&)ident(v)operator([)integer(4)operator(],&)ident(v)operator([)integer(5)operator(],&)ident(v)operator([)integer(6)operator(],&)ident(v)operator([)integer(7)operator(]\);) + comment(/* v[6] may be usec or zone (parsedate\) */) + comment(/* v[7] is wday (parsedate; ignored\) */) + ident(tm)operator(->)ident(tm_wday) operator(=) operator(-)integer(1)operator(;) + ident(tm)operator(->)ident(tm_isdst) operator(=) operator(-)integer(1)operator(;) + operator(}) + + ident(year) operator(=) ident(obj2long)operator(()ident(v)operator([)integer(0)operator(]\);) + + reserved(if) operator(()integer(0) operator(<=) ident(year) operator(&&) ident(year) operator(<) integer(39)operator(\)) operator({) + ident(year) operator(+=) integer(100)operator(;) + ident(rb_warning)operator(()string<delimiter(")content(2 digits year is used)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()integer(69) operator(<=) ident(year) operator(&&) ident(year) operator(<) integer(139)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(2 or 3 digits year is used)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(year) operator(-=) integer(1900)operator(;) + operator(}) + + ident(tm)operator(->)ident(tm_year) operator(=) ident(year)operator(;) + + reserved(if) operator(()ident(NIL_P)operator(()ident(v)operator([)integer(1)operator(]\)\)) operator({) + ident(tm)operator(->)ident(tm_mon) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(VALUE) ident(s) operator(=) ident(rb_check_string_type)operator(()ident(v)operator([)integer(1)operator(]\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(s)operator(\)\)) operator({) + ident(tm)operator(->)ident(tm_mon) operator(=) operator(-)integer(1)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(12)operator(;) ident(i)operator(++\)) operator({) + reserved(if) operator(()ident(RSTRING)operator(()ident(s)operator(\)->)ident(len) operator(==) integer(3) operator(&&) + ident(strcasecmp)operator(()ident(months)operator([)ident(i)operator(],) ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(tm)operator(->)ident(tm_mon) operator(=) ident(i)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(tm)operator(->)ident(tm_mon) operator(==) operator(-)integer(1)operator(\)) operator({) + pre_type(char) ident(c) operator(=) ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr)operator([)integer(0)operator(];) + + reserved(if) operator(()char('0') operator(<=) ident(c) operator(&&) ident(c) operator(<=) char('9')operator(\)) operator({) + ident(tm)operator(->)ident(tm_mon) operator(=) ident(obj2long)operator(()ident(s)operator(\)-)integer(1)operator(;) + operator(}) + operator(}) + operator(}) + reserved(else) operator({) + ident(tm)operator(->)ident(tm_mon) operator(=) ident(obj2long)operator(()ident(v)operator([)integer(1)operator(]\)-)integer(1)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(v)operator([)integer(2)operator(]\)\)) operator({) + ident(tm)operator(->)ident(tm_mday) operator(=) integer(1)operator(;) + operator(}) + reserved(else) operator({) + ident(tm)operator(->)ident(tm_mday) operator(=) ident(obj2long)operator(()ident(v)operator([)integer(2)operator(]\);) + operator(}) + ident(tm)operator(->)ident(tm_hour) operator(=) ident(NIL_P)operator(()ident(v)operator([)integer(3)operator(]\)?)integer(0)operator(:)ident(obj2long)operator(()ident(v)operator([)integer(3)operator(]\);) + ident(tm)operator(->)ident(tm_min) operator(=) ident(NIL_P)operator(()ident(v)operator([)integer(4)operator(]\)?)integer(0)operator(:)ident(obj2long)operator(()ident(v)operator([)integer(4)operator(]\);) + ident(tm)operator(->)ident(tm_sec) operator(=) ident(NIL_P)operator(()ident(v)operator([)integer(5)operator(]\)?)integer(0)operator(:)ident(obj2long)operator(()ident(v)operator([)integer(5)operator(]\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(v)operator([)integer(6)operator(]\)\)) operator({) + reserved(if) operator(()ident(argc) operator(==) integer(8)operator(\)) operator({) + comment(/* v[6] is timezone, but ignored */) + operator(}) + reserved(else) reserved(if) operator(()ident(argc) operator(==) integer(7)operator(\)) operator({) + operator(*)ident(usec) operator(=) ident(obj2long)operator(()ident(v)operator([)integer(6)operator(]\);) + operator(}) + operator(}) + + comment(/* value validation */) + reserved(if) operator(() + ident(tm)operator(->)ident(tm_year) operator(!=) ident(year) operator(||) +preprocessor(#ifndef) ident(NEGATIVE_TIME_T) + ident(tm)operator(->)ident(tm_year) operator(<) integer(69) operator(||) +preprocessor(#endif) + ident(tm)operator(->)ident(tm_mon) operator(<) integer(0) operator(||) ident(tm)operator(->)ident(tm_mon) operator(>) integer(11) + operator(||) ident(tm)operator(->)ident(tm_mday) operator(<) integer(1) operator(||) ident(tm)operator(->)ident(tm_mday) operator(>) integer(31) + operator(||) ident(tm)operator(->)ident(tm_hour) operator(<) integer(0) operator(||) ident(tm)operator(->)ident(tm_hour) operator(>) integer(23) + operator(||) ident(tm)operator(->)ident(tm_min) operator(<) integer(0) operator(||) ident(tm)operator(->)ident(tm_min) operator(>) integer(59) + operator(||) ident(tm)operator(->)ident(tm_sec) operator(<) integer(0) operator(||) ident(tm)operator(->)ident(tm_sec) operator(>) integer(60)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(argument out of range)delimiter(")>operator(\);) +operator(}) + +directive(static) ident(VALUE) ident(time_gmtime) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(time_localtime) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(static) ident(VALUE) ident(time_get_tm) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(\)\);) + +directive(static) pre_type(int) +ident(leap_year_p)operator(()ident(y)operator(\)) + pre_type(long) ident(y)operator(;) +operator({) + reserved(return) operator((()ident(y) operator(%) integer(4) operator(==) integer(0)operator(\)) operator(&&) operator(()ident(y) operator(%) integer(100) operator(!=) integer(0)operator(\)\)) operator(||) operator(()ident(y) operator(%) integer(400) operator(==) integer(0)operator(\);) +operator(}) + +preprocessor(#define) ident(DIV)operator(()ident(n)operator(,)ident(d)operator(\)) operator((()ident(n)operator(\)<)integer(0) operator(?) ident(NDIV)operator((()ident(n)operator(\),()ident(d)operator(\)\)) operator(:) operator(()ident(n)operator(\))operator(/)operator(()ident(d)operator(\)\)) + +directive(static) ident(time_t) +ident(timegm_noleapsecond)operator(()ident(tm)operator(\)) + reserved(struct) ident(tm) operator(*)ident(tm)operator(;) +operator({) + directive(static) pre_type(int) ident(common_year_yday_offset)operator([]) operator(=) operator({) + operator(-)integer(1)operator(,) + operator(-)integer(1) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28) operator(+) integer(31) operator(+) integer(30)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(31) operator(+) integer(30)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(28) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) + comment(/* 1 2 3 4 5 6 7 8 9 10 11 */) + operator(};) + directive(static) pre_type(int) ident(leap_year_yday_offset)operator([]) operator(=) operator({) + operator(-)integer(1)operator(,) + operator(-)integer(1) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29) operator(+) integer(31) operator(+) integer(30)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(31) operator(+) integer(30)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31)operator(,) + operator(-)integer(1) operator(+) integer(31) operator(+) integer(29) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(31) operator(+) integer(30) operator(+) integer(31) operator(+) integer(30) + comment(/* 1 2 3 4 5 6 7 8 9 10 11 */) + operator(};) + + pre_type(long) ident(tm_year) operator(=) ident(tm)operator(->)ident(tm_year)operator(;) + pre_type(int) ident(tm_yday) operator(=) ident(tm)operator(->)ident(tm_mday)operator(;) + reserved(if) operator(()ident(leap_year_p)operator(()ident(tm_year) operator(+) integer(1900)operator(\)\)) + ident(tm_yday) operator(+=) ident(leap_year_yday_offset)operator([)ident(tm)operator(->)ident(tm_mon)operator(];) + reserved(else) + ident(tm_yday) operator(+=) ident(common_year_yday_offset)operator([)ident(tm)operator(->)ident(tm_mon)operator(];) + + comment(/* + * `Seconds Since the Epoch' in SUSv3: + * tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + + * (tm_year-70\)*31536000 + ((tm_year-69\)/4\)*86400 - + * ((tm_year-1\)/100\)*86400 + ((tm_year+299\)/400\)*86400 + */) + reserved(return) ident(tm)operator(->)ident(tm_sec) operator(+) ident(tm)operator(->)ident(tm_min)operator(*)integer(60) operator(+) ident(tm)operator(->)ident(tm_hour)operator(*)integer(3600) operator(+) + operator(()ident(time_t)operator(\)()ident(tm_yday) operator(+) + operator(()ident(tm_year)operator(-)integer(70)operator(\)*)integer(365) operator(+) + ident(DIV)operator(()ident(tm_year)operator(-)integer(69)operator(,)integer(4)operator(\)) operator(-) + ident(DIV)operator(()ident(tm_year)operator(-)integer(1)operator(,)integer(100)operator(\)) operator(+) + ident(DIV)operator(()ident(tm_year)operator(+)integer(299)operator(,)integer(400)operator(\)\)*)integer(86400)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(tmcmp)operator(()ident(a)operator(,) ident(b)operator(\)) + reserved(struct) ident(tm) operator(*)ident(a)operator(;) + reserved(struct) ident(tm) operator(*)ident(b)operator(;) +operator({) + reserved(if) operator(()ident(a)operator(->)ident(tm_year) operator(!=) ident(b)operator(->)ident(tm_year)operator(\)) + reserved(return) ident(a)operator(->)ident(tm_year) operator(<) ident(b)operator(->)ident(tm_year) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(a)operator(->)ident(tm_mon) operator(!=) ident(b)operator(->)ident(tm_mon)operator(\)) + reserved(return) ident(a)operator(->)ident(tm_mon) operator(<) ident(b)operator(->)ident(tm_mon) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(a)operator(->)ident(tm_mday) operator(!=) ident(b)operator(->)ident(tm_mday)operator(\)) + reserved(return) ident(a)operator(->)ident(tm_mday) operator(<) ident(b)operator(->)ident(tm_mday) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(a)operator(->)ident(tm_hour) operator(!=) ident(b)operator(->)ident(tm_hour)operator(\)) + reserved(return) ident(a)operator(->)ident(tm_hour) operator(<) ident(b)operator(->)ident(tm_hour) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(a)operator(->)ident(tm_min) operator(!=) ident(b)operator(->)ident(tm_min)operator(\)) + reserved(return) ident(a)operator(->)ident(tm_min) operator(<) ident(b)operator(->)ident(tm_min) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(a)operator(->)ident(tm_sec) operator(!=) ident(b)operator(->)ident(tm_sec)operator(\)) + reserved(return) ident(a)operator(->)ident(tm_sec) operator(<) ident(b)operator(->)ident(tm_sec) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(else) + reserved(return) integer(0)operator(;) +operator(}) + +preprocessor(#if) ident(SIZEOF_TIME_T) operator(==) ident(SIZEOF_LONG) +reserved(typedef) pre_type(unsigned) pre_type(long) ident(unsigned_time_t)operator(;) +preprocessor(#elif) ident(SIZEOF_TIME_T) operator(==) ident(SIZEOF_INT) +reserved(typedef) pre_type(unsigned) pre_type(int) ident(unsigned_time_t)operator(;) +preprocessor(#elif) ident(SIZEOF_TIME_T) operator(==) ident(SIZEOF_LONG_LONG) +reserved(typedef) pre_type(unsigned) ident(LONG_LONG) ident(unsigned_time_t)operator(;) +preprocessor(#else) +preprocessor(# error) ident(cannot) ident(find) ident(integer) ident(type) ident(which) ident(size) ident(is) ident(same) ident(as) ident(time_t)operator(.) +preprocessor(#endif) + +directive(static) ident(time_t) +ident(search_time_t)operator(()ident(tptr)operator(,) ident(utc_p)operator(\)) + reserved(struct) ident(tm) operator(*)ident(tptr)operator(;) + pre_type(int) ident(utc_p)operator(;) +operator({) + ident(time_t) ident(guess)operator(,) ident(guess_lo)operator(,) ident(guess_hi)operator(;) + reserved(struct) ident(tm) operator(*)ident(tm)operator(,) ident(tm_lo)operator(,) ident(tm_hi)operator(;) + pre_type(int) ident(d)operator(,) ident(have_guess)operator(;) + pre_type(int) ident(find_dst)operator(;) + + ident(find_dst) operator(=) integer(0) operator(<) ident(tptr)operator(->)ident(tm_isdst)operator(;) + +preprocessor(#ifdef) ident(NEGATIVE_TIME_T) + ident(guess_lo) operator(=) operator(()ident(time_t)operator(\)~(()ident(unsigned_time_t)operator(\)~()ident(time_t)operator(\))integer(0) operator(>>) integer(1)operator(\);) +preprocessor(#else) + ident(guess_lo) operator(=) integer(0)operator(;) +preprocessor(#endif) + ident(guess_hi) operator(=) operator((()ident(time_t)operator(\)-)integer(1)operator(\)) operator(<) operator((()ident(time_t)operator(\))integer(0)operator(\)) operator(?) + operator(()ident(time_t)operator(\)(()ident(unsigned_time_t)operator(\)~()ident(time_t)operator(\))integer(0) operator(>>) integer(1)operator(\)) operator(:) + operator(~()ident(time_t)operator(\))integer(0)operator(;) + + ident(guess) operator(=) ident(timegm_noleapsecond)operator(()ident(tptr)operator(\);) + ident(tm) operator(=) operator(()ident(utc_p) operator(?) ident(gmtime) operator(:) ident(localtime)operator(\)(&)ident(guess)operator(\);) + reserved(if) operator(()ident(tm)operator(\)) operator({) + ident(d) operator(=) ident(tmcmp)operator(()ident(tptr)operator(,) ident(tm)operator(\);) + reserved(if) operator(()ident(d) operator(==) integer(0)operator(\)) reserved(return) ident(guess)operator(;) + reserved(if) operator(()ident(d) operator(<) integer(0)operator(\)) operator({) + ident(guess_hi) operator(=) ident(guess)operator(;) + ident(guess) operator(-=) integer(24) operator(*) integer(60) operator(*) integer(60)operator(;) + operator(}) + reserved(else) operator({) + ident(guess_lo) operator(=) ident(guess)operator(;) + ident(guess) operator(+=) integer(24) operator(*) integer(60) operator(*) integer(60)operator(;) + operator(}) + reserved(if) operator(()ident(guess_lo) operator(<) ident(guess) operator(&&) ident(guess) operator(<) ident(guess_hi) operator(&&) + operator(()ident(tm) operator(=) operator(()ident(utc_p) operator(?) ident(gmtime) operator(:) ident(localtime)operator(\)(&)ident(guess)operator(\)\)) operator(!=) pre_constant(NULL)operator(\)) operator({) + ident(d) operator(=) ident(tmcmp)operator(()ident(tptr)operator(,) ident(tm)operator(\);) + reserved(if) operator(()ident(d) operator(==) integer(0)operator(\)) reserved(return) ident(guess)operator(;) + reserved(if) operator(()ident(d) operator(<) integer(0)operator(\)) + ident(guess_hi) operator(=) ident(guess)operator(;) + reserved(else) + ident(guess_lo) operator(=) ident(guess)operator(;) + operator(}) + operator(}) + + ident(tm) operator(=) operator(()ident(utc_p) operator(?) ident(gmtime) operator(:) ident(localtime)operator(\)(&)ident(guess_lo)operator(\);) + reserved(if) operator((!)ident(tm)operator(\)) reserved(goto) ident(error)operator(;) + ident(d) operator(=) ident(tmcmp)operator(()ident(tptr)operator(,) ident(tm)operator(\);) + reserved(if) operator(()ident(d) operator(<) integer(0)operator(\)) reserved(goto) ident(out_of_range)operator(;) + reserved(if) operator(()ident(d) operator(==) integer(0)operator(\)) reserved(return) ident(guess_lo)operator(;) + ident(tm_lo) operator(=) operator(*)ident(tm)operator(;) + + ident(tm) operator(=) operator(()ident(utc_p) operator(?) ident(gmtime) operator(:) ident(localtime)operator(\)(&)ident(guess_hi)operator(\);) + reserved(if) operator((!)ident(tm)operator(\)) reserved(goto) ident(error)operator(;) + ident(d) operator(=) ident(tmcmp)operator(()ident(tptr)operator(,) ident(tm)operator(\);) + reserved(if) operator(()ident(d) operator(>) integer(0)operator(\)) reserved(goto) ident(out_of_range)operator(;) + reserved(if) operator(()ident(d) operator(==) integer(0)operator(\)) reserved(return) ident(guess_hi)operator(;) + ident(tm_hi) operator(=) operator(*)ident(tm)operator(;) + + ident(have_guess) operator(=) integer(0)operator(;) + + reserved(while) operator(()ident(guess_lo) operator(+) integer(1) operator(<) ident(guess_hi)operator(\)) operator({) + comment(/* there is a gap between guess_lo and guess_hi. */) + pre_type(unsigned) pre_type(long) ident(range) operator(=) integer(0)operator(;) + reserved(if) operator((!)ident(have_guess)operator(\)) operator({) + pre_type(int) ident(a)operator(,) ident(b)operator(;) + comment(/* + Try precious guess by a linear interpolation at first. + `a' and `b' is a coefficient of guess_lo and guess_hi as: + + guess = (guess_lo * a + guess_hi * b\) / (a + b\) + + However this causes overflow in most cases, following assignment + is used instead: + + guess = guess_lo / d * a + (guess_lo % d\) * a / d + + guess_hi / d * b + (guess_hi % d\) * b / d + where d = a + b + + To avoid overflow in this assignment, `d' is restricted to less than + sqrt(2**31\). By this restriction and other reasons, the guess is + not accurate and some error is expected. `range' approximates + the maximum error. + + When these parameters are not suitable, i.e. guess is not within + guess_lo and guess_hi, simple guess by binary search is used. + */) + ident(range) operator(=) integer(366) operator(*) integer(24) operator(*) integer(60) operator(*) integer(60)operator(;) + ident(a) operator(=) operator(()ident(tm_hi)operator(.)ident(tm_year) operator(-) ident(tptr)operator(->)ident(tm_year)operator(\);) + ident(b) operator(=) operator(()ident(tptr)operator(->)ident(tm_year) operator(-) ident(tm_lo)operator(.)ident(tm_year)operator(\);) + comment(/* 46000 is selected as `some big number less than sqrt(2**31\)'. */) + reserved(if) operator(()ident(a) operator(+) ident(b) operator(<=) integer(46000) operator(/) integer(12)operator(\)) operator({) + ident(range) operator(=) integer(31) operator(*) integer(24) operator(*) integer(60) operator(*) integer(60)operator(;) + ident(a) operator(*=) integer(12)operator(;) + ident(b) operator(*=) integer(12)operator(;) + ident(a) operator(+=) ident(tm_hi)operator(.)ident(tm_mon) operator(-) ident(tptr)operator(->)ident(tm_mon)operator(;) + ident(b) operator(+=) ident(tptr)operator(->)ident(tm_mon) operator(-) ident(tm_lo)operator(.)ident(tm_mon)operator(;) + reserved(if) operator(()ident(a) operator(+) ident(b) operator(<=) integer(46000) operator(/) integer(31)operator(\)) operator({) + ident(range) operator(=) integer(24) operator(*) integer(60) operator(*) integer(60)operator(;) + ident(a) operator(*=) integer(31)operator(;) + ident(b) operator(*=) integer(31)operator(;) + ident(a) operator(+=) ident(tm_hi)operator(.)ident(tm_mday) operator(-) ident(tptr)operator(->)ident(tm_mday)operator(;) + ident(b) operator(+=) ident(tptr)operator(->)ident(tm_mday) operator(-) ident(tm_lo)operator(.)ident(tm_mday)operator(;) + reserved(if) operator(()ident(a) operator(+) ident(b) operator(<=) integer(46000) operator(/) integer(24)operator(\)) operator({) + ident(range) operator(=) integer(60) operator(*) integer(60)operator(;) + ident(a) operator(*=) integer(24)operator(;) + ident(b) operator(*=) integer(24)operator(;) + ident(a) operator(+=) ident(tm_hi)operator(.)ident(tm_hour) operator(-) ident(tptr)operator(->)ident(tm_hour)operator(;) + ident(b) operator(+=) ident(tptr)operator(->)ident(tm_hour) operator(-) ident(tm_lo)operator(.)ident(tm_hour)operator(;) + reserved(if) operator(()ident(a) operator(+) ident(b) operator(<=) integer(46000) operator(/) integer(60)operator(\)) operator({) + ident(range) operator(=) integer(60)operator(;) + ident(a) operator(*=) integer(60)operator(;) + ident(b) operator(*=) integer(60)operator(;) + ident(a) operator(+=) ident(tm_hi)operator(.)ident(tm_min) operator(-) ident(tptr)operator(->)ident(tm_min)operator(;) + ident(b) operator(+=) ident(tptr)operator(->)ident(tm_min) operator(-) ident(tm_lo)operator(.)ident(tm_min)operator(;) + reserved(if) operator(()ident(a) operator(+) ident(b) operator(<=) integer(46000) operator(/) integer(60)operator(\)) operator({) + ident(range) operator(=) integer(1)operator(;) + ident(a) operator(*=) integer(60)operator(;) + ident(b) operator(*=) integer(60)operator(;) + ident(a) operator(+=) ident(tm_hi)operator(.)ident(tm_sec) operator(-) ident(tptr)operator(->)ident(tm_sec)operator(;) + ident(b) operator(+=) ident(tptr)operator(->)ident(tm_sec) operator(-) ident(tm_lo)operator(.)ident(tm_sec)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + operator(}) + reserved(if) operator(()ident(a) operator(<=) integer(0)operator(\)) ident(a) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(b) operator(<=) integer(0)operator(\)) ident(b) operator(=) integer(1)operator(;) + ident(d) operator(=) ident(a) operator(+) ident(b)operator(;) + comment(/* + Although `/' and `%' may produce unexpected result with negative + argument, it doesn't cause serious problem because there is a + fail safe. + */) + ident(guess) operator(=) ident(guess_lo) operator(/) ident(d) operator(*) ident(a) operator(+) operator(()ident(guess_lo) operator(%) ident(d)operator(\)) operator(*) ident(a) operator(/) ident(d) + operator(+) ident(guess_hi) operator(/) ident(d) operator(*) ident(b) operator(+) operator(()ident(guess_hi) operator(%) ident(d)operator(\)) operator(*) ident(b) operator(/) ident(d)operator(;) + ident(have_guess) operator(=) integer(1)operator(;) + operator(}) + + reserved(if) operator(()ident(guess) operator(<=) ident(guess_lo) operator(||) ident(guess_hi) operator(<=) ident(guess)operator(\)) operator({) + comment(/* Precious guess is invalid. try binary search. */) + ident(guess) operator(=) ident(guess_lo) operator(/) integer(2) operator(+) ident(guess_hi) operator(/) integer(2)operator(;) + reserved(if) operator(()ident(guess) operator(<=) ident(guess_lo)operator(\)) + ident(guess) operator(=) ident(guess_lo) operator(+) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(guess) operator(>=) ident(guess_hi)operator(\)) + ident(guess) operator(=) ident(guess_hi) operator(-) integer(1)operator(;) + ident(range) operator(=) integer(0)operator(;) + operator(}) + + ident(tm) operator(=) operator(()ident(utc_p) operator(?) ident(gmtime) operator(:) ident(localtime)operator(\)(&)ident(guess)operator(\);) + reserved(if) operator((!)ident(tm)operator(\)) reserved(goto) ident(error)operator(;) + ident(have_guess) operator(=) integer(0)operator(;) + + ident(d) operator(=) ident(tmcmp)operator(()ident(tptr)operator(,) ident(tm)operator(\);) + reserved(if) operator(()ident(d) operator(<) integer(0)operator(\)) operator({) + ident(guess_hi) operator(=) ident(guess)operator(;) + ident(tm_hi) operator(=) operator(*)ident(tm)operator(;) + reserved(if) operator(()ident(range)operator(\)) operator({) + ident(guess) operator(=) ident(guess) operator(-) ident(range)operator(;) + ident(range) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(guess_lo) operator(<) ident(guess) operator(&&) ident(guess) operator(<) ident(guess_hi)operator(\)) + ident(have_guess) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(d) operator(>) integer(0)operator(\)) operator({) + ident(guess_lo) operator(=) ident(guess)operator(;) + ident(tm_lo) operator(=) operator(*)ident(tm)operator(;) + reserved(if) operator(()ident(range)operator(\)) operator({) + ident(guess) operator(=) ident(guess) operator(+) ident(range)operator(;) + ident(range) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(guess_lo) operator(<) ident(guess) operator(&&) ident(guess) operator(<) ident(guess_hi)operator(\)) + ident(have_guess) operator(=) integer(1)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + reserved(if) operator((!)ident(utc_p)operator(\)) operator({) + comment(/* If localtime is nonmonotonic, another result may exist. */) + ident(time_t) ident(guess2)operator(;) + reserved(if) operator(()ident(find_dst)operator(\)) operator({) + ident(guess2) operator(=) ident(guess) operator(-) integer(2) operator(*) integer(60) operator(*) integer(60)operator(;) + ident(tm) operator(=) ident(localtime)operator((&)ident(guess2)operator(\);) + reserved(if) operator(()ident(tm)operator(\)) operator({) + reserved(if) operator(()ident(tptr)operator(->)ident(tm_hour) operator(!=) operator(()ident(tm)operator(->)ident(tm_hour) operator(+) integer(2)operator(\)) operator(%) integer(24) operator(||) + ident(tptr)operator(->)ident(tm_min) operator(!=) ident(tm)operator(->)ident(tm_min) operator(||) + ident(tptr)operator(->)ident(tm_sec) operator(!=) ident(tm)operator(->)ident(tm_sec)operator(\)) operator({) + ident(guess2) operator(-=) operator(()ident(tm)operator(->)ident(tm_hour) operator(-) ident(tptr)operator(->)ident(tm_hour)operator(\)) operator(*) integer(60) operator(*) integer(60) operator(+) + operator(()ident(tm)operator(->)ident(tm_min) operator(-) ident(tptr)operator(->)ident(tm_min)operator(\)) operator(*) integer(60) operator(+) + operator(()ident(tm)operator(->)ident(tm_sec) operator(-) ident(tptr)operator(->)ident(tm_sec)operator(\);) + reserved(if) operator(()ident(tptr)operator(->)ident(tm_mday) operator(!=) ident(tm)operator(->)ident(tm_mday)operator(\)) + ident(guess2) operator(+=) integer(24) operator(*) integer(60) operator(*) integer(60)operator(;) + reserved(if) operator(()ident(guess) operator(!=) ident(guess2)operator(\)) operator({) + ident(tm) operator(=) ident(localtime)operator((&)ident(guess2)operator(\);) + reserved(if) operator(()ident(tmcmp)operator(()ident(tptr)operator(,) ident(tm)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(guess) operator(<) ident(guess2)operator(\)) + reserved(return) ident(guess)operator(;) + reserved(else) + reserved(return) ident(guess2)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + operator(}) + reserved(else) operator({) + ident(guess2) operator(=) ident(guess) operator(+) integer(2) operator(*) integer(60) operator(*) integer(60)operator(;) + ident(tm) operator(=) ident(localtime)operator((&)ident(guess2)operator(\);) + reserved(if) operator(()ident(tm)operator(\)) operator({) + reserved(if) operator((()ident(tptr)operator(->)ident(tm_hour) operator(+) integer(2)operator(\)) operator(%) integer(24) operator(!=) ident(tm)operator(->)ident(tm_hour) operator(||) + ident(tptr)operator(->)ident(tm_min) operator(!=) ident(tm)operator(->)ident(tm_min) operator(||) + ident(tptr)operator(->)ident(tm_sec) operator(!=) ident(tm)operator(->)ident(tm_sec)operator(\)) operator({) + ident(guess2) operator(-=) operator(()ident(tm)operator(->)ident(tm_hour) operator(-) ident(tptr)operator(->)ident(tm_hour)operator(\)) operator(*) integer(60) operator(*) integer(60) operator(+) + operator(()ident(tm)operator(->)ident(tm_min) operator(-) ident(tptr)operator(->)ident(tm_min)operator(\)) operator(*) integer(60) operator(+) + operator(()ident(tm)operator(->)ident(tm_sec) operator(-) ident(tptr)operator(->)ident(tm_sec)operator(\);) + reserved(if) operator(()ident(tptr)operator(->)ident(tm_mday) operator(!=) ident(tm)operator(->)ident(tm_mday)operator(\)) + ident(guess2) operator(-=) integer(24) operator(*) integer(60) operator(*) integer(60)operator(;) + reserved(if) operator(()ident(guess) operator(!=) ident(guess2)operator(\)) operator({) + ident(tm) operator(=) ident(localtime)operator((&)ident(guess2)operator(\);) + reserved(if) operator(()ident(tmcmp)operator(()ident(tptr)operator(,) ident(tm)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(guess) operator(<) ident(guess2)operator(\)) + reserved(return) ident(guess2)operator(;) + reserved(else) + reserved(return) ident(guess)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + operator(}) + operator(}) + reserved(return) ident(guess)operator(;) + operator(}) + operator(}) + comment(/* Given argument has no corresponding time_t. Let's outerpolation. */) + reserved(if) operator(()ident(tm_lo)operator(.)ident(tm_year) operator(==) ident(tptr)operator(->)ident(tm_year) operator(&&) ident(tm_lo)operator(.)ident(tm_mon) operator(==) ident(tptr)operator(->)ident(tm_mon)operator(\)) operator({) + reserved(return) ident(guess_lo) operator(+) + operator(()ident(tptr)operator(->)ident(tm_mday) operator(-) ident(tm_lo)operator(.)ident(tm_mday)operator(\)) operator(*) integer(24) operator(*) integer(60) operator(*) integer(60) operator(+) + operator(()ident(tptr)operator(->)ident(tm_hour) operator(-) ident(tm_lo)operator(.)ident(tm_hour)operator(\)) operator(*) integer(60) operator(*) integer(60) operator(+) + operator(()ident(tptr)operator(->)ident(tm_min) operator(-) ident(tm_lo)operator(.)ident(tm_min)operator(\)) operator(*) integer(60) operator(+) + operator(()ident(tptr)operator(->)ident(tm_sec) operator(-) ident(tm_lo)operator(.)ident(tm_sec)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(tm_hi)operator(.)ident(tm_year) operator(==) ident(tptr)operator(->)ident(tm_year) operator(&&) ident(tm_hi)operator(.)ident(tm_mon) operator(==) ident(tptr)operator(->)ident(tm_mon)operator(\)) operator({) + reserved(return) ident(guess_hi) operator(+) + operator(()ident(tptr)operator(->)ident(tm_mday) operator(-) ident(tm_hi)operator(.)ident(tm_mday)operator(\)) operator(*) integer(24) operator(*) integer(60) operator(*) integer(60) operator(+) + operator(()ident(tptr)operator(->)ident(tm_hour) operator(-) ident(tm_hi)operator(.)ident(tm_hour)operator(\)) operator(*) integer(60) operator(*) integer(60) operator(+) + operator(()ident(tptr)operator(->)ident(tm_min) operator(-) ident(tm_hi)operator(.)ident(tm_min)operator(\)) operator(*) integer(60) operator(+) + operator(()ident(tptr)operator(->)ident(tm_sec) operator(-) ident(tm_hi)operator(.)ident(tm_sec)operator(\);) + operator(}) + + label(out_of_range)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(time out of range)delimiter(")>operator(\);) + + label(error)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(gmtime/localtime error)delimiter(")>operator(\);) + reserved(return) integer(0)operator(;) comment(/* not reached */) +operator(}) + +directive(static) ident(time_t) +ident(make_time_t)operator(()ident(tptr)operator(,) ident(utc_p)operator(\)) + reserved(struct) ident(tm) operator(*)ident(tptr)operator(;) + pre_type(int) ident(utc_p)operator(;) +operator({) + ident(time_t) ident(t)operator(;) + reserved(struct) ident(tm) operator(*)ident(tmp)operator(,) ident(buf)operator(;) + ident(buf) operator(=) operator(*)ident(tptr)operator(;) + reserved(if) operator(()ident(utc_p)operator(\)) operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_TIMEGM)operator(\)) + reserved(if) operator((()ident(t) operator(=) ident(timegm)operator((&)ident(buf)operator(\)\)) operator(!=) operator(-)integer(1)operator(\)) + reserved(return) ident(t)operator(;) +preprocessor(#ifdef) ident(NEGATIVE_TIME_T) + reserved(if) operator((()ident(tmp) operator(=) ident(gmtime)operator((&)ident(t)operator(\)\)) operator(&&) + ident(tptr)operator(->)ident(tm_year) operator(==) ident(tmp)operator(->)ident(tm_year) operator(&&) + ident(tptr)operator(->)ident(tm_mon) operator(==) ident(tmp)operator(->)ident(tm_mon) operator(&&) + ident(tptr)operator(->)ident(tm_mday) operator(==) ident(tmp)operator(->)ident(tm_mday) operator(&&) + ident(tptr)operator(->)ident(tm_hour) operator(==) ident(tmp)operator(->)ident(tm_hour) operator(&&) + ident(tptr)operator(->)ident(tm_min) operator(==) ident(tmp)operator(->)ident(tm_min) operator(&&) + ident(tptr)operator(->)ident(tm_sec) operator(==) ident(tmp)operator(->)ident(tm_sec)operator(\)) + reserved(return) ident(t)operator(;) +preprocessor(#endif) +preprocessor(#endif) + reserved(return) ident(search_time_t)operator((&)ident(buf)operator(,) ident(utc_p)operator(\);) + operator(}) + reserved(else) operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_MKTIME)operator(\)) + reserved(if) operator((()ident(t) operator(=) ident(mktime)operator((&)ident(buf)operator(\)\)) operator(!=) operator(-)integer(1)operator(\)) + reserved(return) ident(t)operator(;) +preprocessor(#ifdef) ident(NEGATIVE_TIME_T) + reserved(if) operator((()ident(tmp) operator(=) ident(localtime)operator((&)ident(t)operator(\)\)) operator(&&) + ident(tptr)operator(->)ident(tm_year) operator(==) ident(tmp)operator(->)ident(tm_year) operator(&&) + ident(tptr)operator(->)ident(tm_mon) operator(==) ident(tmp)operator(->)ident(tm_mon) operator(&&) + ident(tptr)operator(->)ident(tm_mday) operator(==) ident(tmp)operator(->)ident(tm_mday) operator(&&) + ident(tptr)operator(->)ident(tm_hour) operator(==) ident(tmp)operator(->)ident(tm_hour) operator(&&) + ident(tptr)operator(->)ident(tm_min) operator(==) ident(tmp)operator(->)ident(tm_min) operator(&&) + ident(tptr)operator(->)ident(tm_sec) operator(==) ident(tmp)operator(->)ident(tm_sec)operator(\)) + reserved(return) ident(t)operator(;) +preprocessor(#endif) +preprocessor(#endif) + reserved(return) ident(search_time_t)operator((&)ident(buf)operator(,) ident(utc_p)operator(\);) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(time_utc_or_local)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(utc_p)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + pre_type(int) ident(utc_p)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(struct) ident(tm) ident(tm)operator(;) + ident(VALUE) ident(time)operator(;) + ident(time_t) ident(usec)operator(;) + + ident(time_arg)operator(()ident(argc)operator(,) ident(argv)operator(,) operator(&)ident(tm)operator(,) operator(&)ident(usec)operator(\);) + ident(time) operator(=) ident(time_new_internal)operator(()ident(klass)operator(,) ident(make_time_t)operator((&)ident(tm)operator(,) ident(utc_p)operator(\),) ident(usec)operator(\);) + reserved(if) operator(()ident(utc_p)operator(\)) reserved(return) ident(time_gmtime)operator(()ident(time)operator(\);) + reserved(return) ident(time_localtime)operator(()ident(time)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Time.utc( year [, month, day, hour, min, sec, usec] \) => time + * Time.utc( sec, min, hour, day, month, year, wday, yday, isdst, tz + * \) => time + * Time.gm( year [, month, day, hour, min, sec, usec] \) => time + * Time.gm( sec, min, hour, day, month, year, wday, yday, isdst, tz + * \) => time + * + * Creates a time based on given values, interpreted as UTC (GMT\). The + * year must be specified. Other values default to the minimum value + * for that field (and may be <code>nil</code> or omitted\). Months may + * be specified by numbers from 1 to 12, or by the three-letter English + * month names. Hours are specified on a 24-hour clock (0..23\). Raises + * an <code>ArgumentError</code> if any values are out of range. Will + * also accept ten arguments in the order output by + * <code>Time#to_a</code>. + * + * Time.utc(2000,"jan",1,20,15,1\) #=> Sat Jan 01 20:15:01 UTC 2000 + * Time.gm(2000,"jan",1,20,15,1\) #=> Sat Jan 01 20:15:01 UTC 2000 + */) +directive(static) ident(VALUE) +ident(time_s_mkutc)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(return) ident(time_utc_or_local)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(Qtrue)operator(,) ident(klass)operator(\);) +operator(}) + +comment(/* + * call-seq: + * Time.local( year [, month, day, hour, min, sec, usec] \) => time + * Time.local( sec, min, hour, day, month, year, wday, yday, isdst, + * tz \) => time + * Time.mktime( year, month, day, hour, min, sec, usec \) => time + * + * Same as <code>Time::gm</code>, but interprets the values in the + * local time zone. + * + * Time.local(2000,"jan",1,20,15,1\) #=> Sat Jan 01 20:15:01 CST 2000 + */) + +directive(static) ident(VALUE) +ident(time_s_mktime)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(klass)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(return) ident(time_utc_or_local)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(Qfalse)operator(,) ident(klass)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.to_i => int + * time.tv_sec => int + * + * Returns the value of <i>time</i> as an integer number of seconds + * since epoch. + * + * t = Time.now + * "%10.5f" % t.to_f #=> "1049896564.17839" + * t.to_i #=> 1049896564 + */) + +directive(static) ident(VALUE) +ident(time_to_i)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(return) ident(LONG2NUM)operator(()ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.to_f => float + * + * Returns the value of <i>time</i> as a floating point number of + * seconds since epoch. + * + * t = Time.now + * "%10.5f" % t.to_f #=> "1049896564.13654" + * t.to_i #=> 1049896564 + */) + +directive(static) ident(VALUE) +ident(time_to_f)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(return) ident(rb_float_new)operator((()pre_type(double)operator(\))ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec)operator(+()pre_type(double)operator(\))ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec)operator(/)float(1)ident(e6)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.usec => int + * time.tv_usec => int + * + * Returns just the number of microseconds for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * "%10.6f" % t.to_f #=> "1049896564.259970" + * t.usec #=> 259970 + */) + +directive(static) ident(VALUE) +ident(time_usec)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(return) ident(LONG2NUM)operator(()ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time <=> other_time => -1, 0, +1 + * time <=> numeric => -1, 0, +1 + * + * Comparison---Compares <i>time</i> with <i>other_time</i> or with + * <i>numeric</i>, which is the number of seconds (possibly + * fractional\) since epoch. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t2 = t + 2592000 #=> Fri May 09 08:56:03 CDT 2003 + * t <=> t2 #=> -1 + * t2 <=> t #=> 1 + * t <=> t #=> 0 + */) + +directive(static) ident(VALUE) +ident(time_cmp)operator(()ident(time1)operator(,) ident(time2)operator(\)) + ident(VALUE) ident(time1)operator(,) ident(time2)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj1)operator(,) operator(*)ident(tobj2)operator(;) + + ident(GetTimeval)operator(()ident(time1)operator(,) ident(tobj1)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(time2)operator(\)) operator(==) ident(T_DATA) operator(&&) ident(RDATA)operator(()ident(time2)operator(\)->)ident(dfree) operator(==) ident(time_free)operator(\)) operator({) + ident(GetTimeval)operator(()ident(time2)operator(,) ident(tobj2)operator(\);) + reserved(if) operator(()ident(tobj1)operator(->)ident(tv)operator(.)ident(tv_sec) operator(==) ident(tobj2)operator(->)ident(tv)operator(.)ident(tv_sec)operator(\)) operator({) + reserved(if) operator(()ident(tobj1)operator(->)ident(tv)operator(.)ident(tv_usec) operator(==) ident(tobj2)operator(->)ident(tv)operator(.)ident(tv_usec)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + reserved(if) operator(()ident(tobj1)operator(->)ident(tv)operator(.)ident(tv_usec) operator(>) ident(tobj2)operator(->)ident(tv)operator(.)ident(tv_usec)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(tobj1)operator(->)ident(tv)operator(.)ident(tv_sec) operator(>) ident(tobj2)operator(->)ident(tv)operator(.)ident(tv_sec)operator(\)) reserved(return) ident(INT2FIX)operator(()integer(1)operator(\);) + reserved(return) ident(INT2FIX)operator((-)integer(1)operator(\);) + operator(}) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +comment(/* + * call-seq: + * time.eql?(other_time\) + * + * Return <code>true</code> if <i>time</i> and <i>other_time</i> are + * both <code>Time</code> objects with the same seconds and fractional + * seconds. + */) + +directive(static) ident(VALUE) +ident(time_eql)operator(()ident(time1)operator(,) ident(time2)operator(\)) + ident(VALUE) ident(time1)operator(,) ident(time2)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj1)operator(,) operator(*)ident(tobj2)operator(;) + + ident(GetTimeval)operator(()ident(time1)operator(,) ident(tobj1)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(time2)operator(\)) operator(==) ident(T_DATA) operator(&&) ident(RDATA)operator(()ident(time2)operator(\)->)ident(dfree) operator(==) ident(time_free)operator(\)) operator({) + ident(GetTimeval)operator(()ident(time2)operator(,) ident(tobj2)operator(\);) + reserved(if) operator(()ident(tobj1)operator(->)ident(tv)operator(.)ident(tv_sec) operator(==) ident(tobj2)operator(->)ident(tv)operator(.)ident(tv_sec)operator(\)) operator({) + reserved(if) operator(()ident(tobj1)operator(->)ident(tv)operator(.)ident(tv_usec) operator(==) ident(tobj2)operator(->)ident(tv)operator(.)ident(tv_usec)operator(\)) reserved(return) ident(Qtrue)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * time.utc? => true or false + * time.gmt? => true or false + * + * Returns <code>true</code> if <i>time</i> represents a time in UTC + * (GMT\). + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.utc? #=> false + * t = Time.gm(2000,"jan",1,20,15,1\) #=> Sat Jan 01 20:15:01 UTC 2000 + * t.utc? #=> true + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.gmt? #=> false + * t = Time.gm(2000,1,1,20,15,1\) #=> Sat Jan 01 20:15:01 UTC 2000 + * t.gmt? #=> true + */) + +directive(static) ident(VALUE) +ident(time_utc_p)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(gmt)operator(\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * time.hash => fixnum + * + * Return a hash code for this time object. + */) + +directive(static) ident(VALUE) +ident(time_hash)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + pre_type(long) ident(hash)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + ident(hash) operator(=) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec) operator(^) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec)operator(;) + reserved(return) ident(LONG2FIX)operator(()ident(hash)operator(\);) +operator(}) + +comment(/* :nodoc: */) +directive(static) ident(VALUE) +ident(time_init_copy)operator(()ident(copy)operator(,) ident(time)operator(\)) + ident(VALUE) ident(copy)operator(,) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(,) operator(*)ident(tcopy)operator(;) + + reserved(if) operator(()ident(copy) operator(==) ident(time)operator(\)) reserved(return) ident(copy)operator(;) + ident(time_modify)operator(()ident(copy)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(time)operator(\)) operator(!=) ident(T_DATA) operator(||) ident(RDATA)operator(()ident(time)operator(\)->)ident(dfree) operator(!=) ident(time_free)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong argument type)delimiter(")>operator(\);) + operator(}) + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + ident(GetTimeval)operator(()ident(copy)operator(,) ident(tcopy)operator(\);) + ident(MEMCPY)operator(()ident(tcopy)operator(,) ident(tobj)operator(,) reserved(struct) ident(time_object)operator(,) integer(1)operator(\);) + + reserved(return) ident(copy)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(time_dup)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + ident(VALUE) ident(dup) operator(=) ident(time_s_alloc)operator(()ident(CLASS_OF)operator(()ident(time)operator(\)\);) + ident(time_init_copy)operator(()ident(dup)operator(,) ident(time)operator(\);) + reserved(return) ident(dup)operator(;) +operator(}) + +comment(/* + * call-seq: + * time.localtime => time + * + * Converts <i>time</i> to local time (using the local time zone in + * effect for this process\) modifying the receiver. + * + * t = Time.gm(2000, "jan", 1, 20, 15, 1\) + * t.gmt? #=> true + * t.localtime #=> Sat Jan 01 14:15:01 CST 2000 + * t.gmt? #=> false + */) + +directive(static) ident(VALUE) +ident(time_localtime)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + reserved(struct) ident(tm) operator(*)ident(tm_tmp)operator(;) + ident(time_t) ident(t)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator((!)ident(tobj)operator(->)ident(gmt)operator(\)) operator({) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got)operator(\)) + reserved(return) ident(time)operator(;) + operator(}) + reserved(else) operator({) + ident(time_modify)operator(()ident(time)operator(\);) + operator(}) + ident(t) operator(=) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec)operator(;) + ident(tm_tmp) operator(=) ident(localtime)operator((&)ident(t)operator(\);) + reserved(if) operator((!)ident(tm_tmp)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(localtime error)delimiter(")>operator(\);) + ident(tobj)operator(->)ident(tm) operator(=) operator(*)ident(tm_tmp)operator(;) + ident(tobj)operator(->)ident(tm_got) operator(=) integer(1)operator(;) + ident(tobj)operator(->)ident(gmt) operator(=) integer(0)operator(;) + reserved(return) ident(time)operator(;) +operator(}) + +comment(/* + * call-seq: + * time.gmtime => time + * time.utc => time + * + * Converts <i>time</i> to UTC (GMT\), modifying the receiver. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.gmt? #=> false + * t.gmtime #=> Wed Apr 09 13:56:03 UTC 2003 + * t.gmt? #=> true + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.utc? #=> false + * t.utc #=> Wed Apr 09 13:56:04 UTC 2003 + * t.utc? #=> true + */) + +directive(static) ident(VALUE) +ident(time_gmtime)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + reserved(struct) ident(tm) operator(*)ident(tm_tmp)operator(;) + ident(time_t) ident(t)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(gmt)operator(\)) operator({) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got)operator(\)) + reserved(return) ident(time)operator(;) + operator(}) + reserved(else) operator({) + ident(time_modify)operator(()ident(time)operator(\);) + operator(}) + ident(t) operator(=) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec)operator(;) + ident(tm_tmp) operator(=) ident(gmtime)operator((&)ident(t)operator(\);) + reserved(if) operator((!)ident(tm_tmp)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(gmtime error)delimiter(")>operator(\);) + ident(tobj)operator(->)ident(tm) operator(=) operator(*)ident(tm_tmp)operator(;) + ident(tobj)operator(->)ident(tm_got) operator(=) integer(1)operator(;) + ident(tobj)operator(->)ident(gmt) operator(=) integer(1)operator(;) + reserved(return) ident(time)operator(;) +operator(}) + +comment(/* + * call-seq: + * time.getlocal => new_time + * + * Returns a new <code>new_time</code> object representing <i>time</i> in + * local time (using the local time zone in effect for this process\). + * + * t = Time.gm(2000,1,1,20,15,1\) #=> Sat Jan 01 20:15:01 UTC 2000 + * t.gmt? #=> true + * l = t.getlocal #=> Sat Jan 01 14:15:01 CST 2000 + * l.gmt? #=> false + * t == l #=> true + */) + +directive(static) ident(VALUE) +ident(time_getlocaltime)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(return) ident(time_localtime)operator(()ident(time_dup)operator(()ident(time)operator(\)\);) +operator(}) + +comment(/* + * call-seq: + * time.getgm => new_time + * time.getutc => new_time + * + * Returns a new <code>new_time</code> object representing <i>time</i> in + * UTC. + * + * t = Time.local(2000,1,1,20,15,1\) #=> Sat Jan 01 20:15:01 CST 2000 + * t.gmt? #=> false + * y = t.getgm #=> Sun Jan 02 02:15:01 UTC 2000 + * y.gmt? #=> true + * t == y #=> true + */) + +directive(static) ident(VALUE) +ident(time_getgmtime)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(return) ident(time_gmtime)operator(()ident(time_dup)operator(()ident(time)operator(\)\);) +operator(}) + +directive(static) ident(VALUE) +ident(time_get_tm)operator(()ident(time)operator(,) ident(gmt)operator(\)) + ident(VALUE) ident(time)operator(;) + pre_type(int) ident(gmt)operator(;) +operator({) + reserved(if) operator(()ident(gmt)operator(\)) reserved(return) ident(time_gmtime)operator(()ident(time)operator(\);) + reserved(return) ident(time_localtime)operator(()ident(time)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.asctime => string + * time.ctime => string + * + * Returns a canonical string representation of <i>time</i>. + * + * Time.now.asctime #=> "Wed Apr 9 08:56:03 2003" + */) + +directive(static) ident(VALUE) +ident(time_asctime)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + pre_type(char) operator(*)ident(s)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + ident(s) operator(=) ident(asctime)operator((&)ident(tobj)operator(->)ident(tm)operator(\);) + reserved(if) operator(()ident(s)operator([)integer(24)operator(]) operator(==) char('\\n')operator(\)) ident(s)operator([)integer(24)operator(]) operator(=) char('\\0')operator(;) + + reserved(return) ident(rb_str_new2)operator(()ident(s)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.inspect => string + * time.to_s => string + * + * Returns a string representing <i>time</i>. Equivalent to calling + * <code>Time#strftime</code> with a format string of ``<code>%a</code> + * <code>%b</code> <code>%d</code> <code>%H:%M:%S</code> + * <code>%Z</code> <code>%Y</code>''. + * + * Time.now.to_s #=> "Wed Apr 09 08:56:04 CDT 2003" + */) + +directive(static) ident(VALUE) +ident(time_to_s)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + pre_type(char) ident(buf)operator([)integer(128)operator(];) + pre_type(int) ident(len)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(if) operator(()ident(tobj)operator(->)ident(gmt) operator(==) integer(1)operator(\)) operator({) + ident(len) operator(=) ident(strftime)operator(()ident(buf)operator(,) integer(128)operator(,) string<delimiter(")content(%a %b %d %H:%M:%S UTC %Y)delimiter(")>operator(,) operator(&)ident(tobj)operator(->)ident(tm)operator(\);) + operator(}) + reserved(else) operator({) + ident(time_t) ident(off)operator(;) + pre_type(char) ident(buf2)operator([)integer(32)operator(];) + pre_type(char) ident(sign) operator(=) char('+')operator(;) +preprocessor(#if) ident(defined)operator(()ident(HAVE_STRUCT_TM_TM_GMTOFF)operator(\)) + ident(off) operator(=) ident(tobj)operator(->)ident(tm)operator(.)ident(tm_gmtoff)operator(;) +preprocessor(#else) + ident(VALUE) ident(tmp) operator(=) ident(time_utc_offset)operator(()ident(time)operator(\);) + ident(off) operator(=) ident(NUM2INT)operator(()ident(tmp)operator(\);) +preprocessor(#endif) + reserved(if) operator(()ident(off) operator(<) integer(0)operator(\)) operator({) + ident(sign) operator(=) char('-')operator(;) + ident(off) operator(=) operator(-)ident(off)operator(;) + operator(}) + ident(sprintf)operator(()ident(buf2)operator(,) string<delimiter(")content(%%a %%b %%d %%H:%%M:%%S %c%02d%02d %%Y)delimiter(")>operator(,) + ident(sign)operator(,) operator(()pre_type(int)operator(\)()ident(off)operator(/)integer(3600)operator(\),) operator(()pre_type(int)operator(\)()ident(off)operator(%)integer(3600)operator(/)integer(60)operator(\)\);) + ident(len) operator(=) ident(strftime)operator(()ident(buf)operator(,) integer(128)operator(,) ident(buf2)operator(,) operator(&)ident(tobj)operator(->)ident(tm)operator(\);) + operator(}) + reserved(return) ident(rb_str_new)operator(()ident(buf)operator(,) ident(len)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(time_add)operator(()ident(tobj)operator(,) ident(offset)operator(,) ident(sign)operator(\)) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + ident(VALUE) ident(offset)operator(;) + pre_type(int) ident(sign)operator(;) +operator({) + pre_type(double) ident(v) operator(=) ident(NUM2DBL)operator(()ident(offset)operator(\);) + pre_type(double) ident(f)operator(,) ident(d)operator(;) + ident(unsigned_time_t) ident(sec_off)operator(;) + ident(time_t) ident(usec_off)operator(,) ident(sec)operator(,) ident(usec)operator(;) + ident(VALUE) ident(result)operator(;) + + reserved(if) operator(()ident(v) operator(<) integer(0)operator(\)) operator({) + ident(v) operator(=) operator(-)ident(v)operator(;) + ident(sign) operator(=) operator(-)ident(sign)operator(;) + operator(}) + ident(d) operator(=) ident(modf)operator(()ident(v)operator(,) operator(&)ident(f)operator(\);) + ident(sec_off) operator(=) operator(()ident(unsigned_time_t)operator(\))ident(f)operator(;) + reserved(if) operator(()ident(f) operator(!=) operator(()pre_type(double)operator(\))ident(sec_off)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(time %s %f out of Time range)delimiter(")>operator(,) + ident(sign) operator(<) integer(0) operator(?) string<delimiter(")content(-)delimiter(")> operator(:) string<delimiter(")content(+)delimiter(")>operator(,) ident(v)operator(\);) + ident(usec_off) operator(=) operator(()ident(time_t)operator(\)()ident(d)operator(*)float(1)ident(e6)operator(+)float(0)float(.5)operator(\);) + + reserved(if) operator(()ident(sign) operator(<) integer(0)operator(\)) operator({) + ident(sec) operator(=) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec) operator(-) ident(sec_off)operator(;) + ident(usec) operator(=) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec) operator(-) ident(usec_off)operator(;) + reserved(if) operator(()ident(sec) operator(>) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(time - %f out of Time range)delimiter(")>operator(,) ident(v)operator(\);) + operator(}) + reserved(else) operator({) + ident(sec) operator(=) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec) operator(+) ident(sec_off)operator(;) + ident(usec) operator(=) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec) operator(+) ident(usec_off)operator(;) + reserved(if) operator(()ident(sec) operator(<) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec)operator(\)) + ident(rb_raise)operator(()ident(rb_eRangeError)operator(,) string<delimiter(")content(time + %f out of Time range)delimiter(")>operator(,) ident(v)operator(\);) + operator(}) + ident(result) operator(=) ident(rb_time_new)operator(()ident(sec)operator(,) ident(usec)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(gmt)operator(\)) operator({) + ident(GetTimeval)operator(()ident(result)operator(,) ident(tobj)operator(\);) + ident(tobj)operator(->)ident(gmt) operator(=) integer(1)operator(;) + operator(}) + reserved(return) ident(result)operator(;) +operator(}) + +comment(/* + * call-seq: + * time + numeric => time + * + * Addition---Adds some number of seconds (possibly fractional\) to + * <i>time</i> and returns that value as a new time. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t + (60 * 60 * 24\) #=> Thu Apr 10 08:56:03 CDT 2003 + */) + +directive(static) ident(VALUE) +ident(time_plus)operator(()ident(time1)operator(,) ident(time2)operator(\)) + ident(VALUE) ident(time1)operator(,) ident(time2)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + ident(GetTimeval)operator(()ident(time1)operator(,) ident(tobj)operator(\);) + + reserved(if) operator(()ident(TYPE)operator(()ident(time2)operator(\)) operator(==) ident(T_DATA) operator(&&) ident(RDATA)operator(()ident(time2)operator(\)->)ident(dfree) operator(==) ident(time_free)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(time + time?)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(time_add)operator(()ident(tobj)operator(,) ident(time2)operator(,) integer(1)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time - other_time => float + * time - numeric => time + * + * Difference---Returns a new time that represents the difference + * between two times, or subtracts the given number of seconds in + * <i>numeric</i> from <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t2 = t + 2592000 #=> Fri May 09 08:56:03 CDT 2003 + * t2 - t #=> 2592000.0 + * t2 - 2592000 #=> Wed Apr 09 08:56:03 CDT 2003 + */) + +directive(static) ident(VALUE) +ident(time_minus)operator(()ident(time1)operator(,) ident(time2)operator(\)) + ident(VALUE) ident(time1)operator(,) ident(time2)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time1)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(TYPE)operator(()ident(time2)operator(\)) operator(==) ident(T_DATA) operator(&&) ident(RDATA)operator(()ident(time2)operator(\)->)ident(dfree) operator(==) ident(time_free)operator(\)) operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj2)operator(;) + pre_type(double) ident(f)operator(;) + + ident(GetTimeval)operator(()ident(time2)operator(,) ident(tobj2)operator(\);) + ident(f) operator(=) operator(()pre_type(double)operator(\))ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec) operator(-) operator(()pre_type(double)operator(\))ident(tobj2)operator(->)ident(tv)operator(.)ident(tv_sec)operator(;) + ident(f) operator(+=) operator((()pre_type(double)operator(\))ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec) operator(-) operator(()pre_type(double)operator(\))ident(tobj2)operator(->)ident(tv)operator(.)ident(tv_usec)operator(\)*)float(1)ident(e)operator(-)integer(6)operator(;) + comment(/* XXX: should check float overflow on 64bit time_t platforms */) + + reserved(return) ident(rb_float_new)operator(()ident(f)operator(\);) + operator(}) + reserved(return) ident(time_add)operator(()ident(tobj)operator(,) ident(time2)operator(,) operator(-)integer(1)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.succ => new_time + * + * Return a new time object, one second later than <code>time</code>. + */) + +directive(static) ident(VALUE) +ident(time_succ)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + pre_type(int) ident(gmt)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + ident(gmt) operator(=) ident(tobj)operator(->)ident(gmt)operator(;) + ident(time) operator(=) ident(rb_time_new)operator(()ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec) operator(+) integer(1)operator(,) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec)operator(\);) + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + ident(tobj)operator(->)ident(gmt) operator(=) ident(gmt)operator(;) + reserved(return) ident(time)operator(;) +operator(}) + +comment(/* + * call-seq: + * time.sec => fixnum + * + * Returns the second of the minute (0..60\)<em>[Yes, seconds really can + * range from zero to 60. This allows the system to inject leap seconds + * every now and then to correct for the fact that years are not really + * a convenient number of hours long.]</em> for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.sec #=> 4 + */) + +directive(static) ident(VALUE) +ident(time_sec)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_sec)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.min => fixnum + * + * Returns the minute of the hour (0..59\) for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.min #=> 56 + */) + +directive(static) ident(VALUE) +ident(time_min)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_min)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.hour => fixnum + * + * Returns the hour of the day (0..23\) for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.hour #=> 8 + */) + +directive(static) ident(VALUE) +ident(time_hour)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_hour)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.day => fixnum + * time.mday => fixnum + * + * Returns the day of the month (1..n\) for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.day #=> 9 + * t.mday #=> 9 + */) + +directive(static) ident(VALUE) +ident(time_mday)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_mday)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.mon => fixnum + * time.month => fixnum + * + * Returns the month of the year (1..12\) for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.mon #=> 4 + * t.month #=> 4 + */) + +directive(static) ident(VALUE) +ident(time_mon)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_mon)operator(+)integer(1)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.year => fixnum + * + * Returns the year for <i>time</i> (including the century\). + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.year #=> 2003 + */) + +directive(static) ident(VALUE) +ident(time_year)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(LONG2NUM)operator((()pre_type(long)operator(\))ident(tobj)operator(->)ident(tm)operator(.)ident(tm_year)operator(+)integer(1900)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.wday => fixnum + * + * Returns an integer representing the day of the week, 0..6, with + * Sunday == 0. + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.wday #=> 3 + */) + +directive(static) ident(VALUE) +ident(time_wday)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_wday)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.yday => fixnum + * + * Returns an integer representing the day of the year, 1..366. + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.yday #=> 99 + */) + +directive(static) ident(VALUE) +ident(time_yday)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_yday)operator(+)integer(1)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time.isdst => true or false + * time.dst? => true or false + * + * Returns <code>true</code> if <i>time</i> occurs during Daylight + * Saving Time in its time zone. + * + * Time.local(2000, 7, 1\).isdst #=> true + * Time.local(2000, 1, 1\).isdst #=> false + * Time.local(2000, 7, 1\).dst? #=> true + * Time.local(2000, 1, 1\).dst? #=> false + */) + +directive(static) ident(VALUE) +ident(time_isdst)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(tobj)operator(->)ident(tm)operator(.)ident(tm_isdst)operator(?)label(Qtrue)operator(:)ident(Qfalse)operator(;) +operator(}) + +comment(/* + * call-seq: + * time.zone => string + * + * Returns the name of the time zone used for <i>time</i>. As of Ruby + * 1.8, returns ``UTC'' rather than ``GMT'' for UTC times. + * + * t = Time.gm(2000, "jan", 1, 20, 15, 1\) + * t.zone #=> "UTC" + * t = Time.local(2000, "jan", 1, 20, 15, 1\) + * t.zone #=> "CST" + */) + +directive(static) ident(VALUE) +ident(time_zone)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) +preprocessor(#if) operator(!)ident(defined)operator(()ident(HAVE_TM_ZONE)operator(\)) operator(&&) operator((!)ident(defined)operator(()ident(HAVE_TZNAME)operator(\)) operator(||) operator(!)ident(defined)operator(()ident(HAVE_DAYLIGHT)operator(\)\)) + pre_type(char) ident(buf)operator([)integer(64)operator(];) + pre_type(int) ident(len)operator(;) +preprocessor(#endif) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + + reserved(if) operator(()ident(tobj)operator(->)ident(gmt) operator(==) integer(1)operator(\)) operator({) + reserved(return) ident(rb_str_new2)operator(()string<delimiter(")content(UTC)delimiter(")>operator(\);) + operator(}) +preprocessor(#if) ident(defined)operator(()ident(HAVE_TM_ZONE)operator(\)) + reserved(return) ident(rb_str_new2)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_zone)operator(\);) +preprocessor(#elif) ident(defined)operator(()ident(HAVE_TZNAME)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_DAYLIGHT)operator(\)) + reserved(return) ident(rb_str_new2)operator(()ident(tzname)operator([)ident(daylight) operator(&&) ident(tobj)operator(->)ident(tm)operator(.)ident(tm_isdst)operator(]\);) +preprocessor(#else) + ident(len) operator(=) ident(strftime)operator(()ident(buf)operator(,) integer(64)operator(,) string<delimiter(")content(%Z)delimiter(")>operator(,) operator(&)ident(tobj)operator(->)ident(tm)operator(\);) + reserved(return) ident(rb_str_new)operator(()ident(buf)operator(,) ident(len)operator(\);) +preprocessor(#endif) +operator(}) + +comment(/* + * call-seq: + * time.gmt_offset => fixnum + * time.gmtoff => fixnum + * time.utc_offset => fixnum + * + * Returns the offset in seconds between the timezone of <i>time</i> + * and UTC. + * + * t = Time.gm(2000,1,1,20,15,1\) #=> Sat Jan 01 20:15:01 UTC 2000 + * t.gmt_offset #=> 0 + * l = t.getlocal #=> Sat Jan 01 14:15:01 CST 2000 + * l.gmt_offset #=> -21600 + */) + +directive(static) ident(VALUE) +ident(time_utc_offset)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + + reserved(if) operator(()ident(tobj)operator(->)ident(gmt) operator(==) integer(1)operator(\)) operator({) + reserved(return) ident(INT2FIX)operator(()integer(0)operator(\);) + operator(}) + reserved(else) operator({) +preprocessor(#if) ident(defined)operator(()ident(HAVE_STRUCT_TM_TM_GMTOFF)operator(\)) + reserved(return) ident(INT2NUM)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_gmtoff)operator(\);) +preprocessor(#else) + reserved(struct) ident(tm) operator(*)ident(u)operator(,) operator(*)ident(l)operator(;) + ident(time_t) ident(t)operator(;) + pre_type(long) ident(off)operator(;) + ident(l) operator(=) operator(&)ident(tobj)operator(->)ident(tm)operator(;) + ident(t) operator(=) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec)operator(;) + ident(u) operator(=) ident(gmtime)operator((&)ident(t)operator(\);) + reserved(if) operator((!)ident(u)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(gmtime error)delimiter(")>operator(\);) + reserved(if) operator(()ident(l)operator(->)ident(tm_year) operator(!=) ident(u)operator(->)ident(tm_year)operator(\)) + ident(off) operator(=) ident(l)operator(->)ident(tm_year) operator(<) ident(u)operator(->)ident(tm_year) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(l)operator(->)ident(tm_mon) operator(!=) ident(u)operator(->)ident(tm_mon)operator(\)) + ident(off) operator(=) ident(l)operator(->)ident(tm_mon) operator(<) ident(u)operator(->)ident(tm_mon) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(else) reserved(if) operator(()ident(l)operator(->)ident(tm_mday) operator(!=) ident(u)operator(->)ident(tm_mday)operator(\)) + ident(off) operator(=) ident(l)operator(->)ident(tm_mday) operator(<) ident(u)operator(->)ident(tm_mday) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(else) + ident(off) operator(=) integer(0)operator(;) + ident(off) operator(=) ident(off) operator(*) integer(24) operator(+) ident(l)operator(->)ident(tm_hour) operator(-) ident(u)operator(->)ident(tm_hour)operator(;) + ident(off) operator(=) ident(off) operator(*) integer(60) operator(+) ident(l)operator(->)ident(tm_min) operator(-) ident(u)operator(->)ident(tm_min)operator(;) + ident(off) operator(=) ident(off) operator(*) integer(60) operator(+) ident(l)operator(->)ident(tm_sec) operator(-) ident(u)operator(->)ident(tm_sec)operator(;) + reserved(return) ident(LONG2FIX)operator(()ident(off)operator(\);) +preprocessor(#endif) + operator(}) +operator(}) + +comment(/* + * call-seq: + * time.to_a => array + * + * Returns a ten-element <i>array</i> of values for <i>time</i>: + * {<code>[ sec, min, hour, day, month, year, wday, yday, isdst, zone + * ]</code>}. See the individual methods for an explanation of the + * valid ranges of each value. The ten elements can be passed directly + * to <code>Time::utc</code> or <code>Time::local</code> to create a + * new <code>Time</code>. + * + * now = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t = now.to_a #=> [4, 56, 8, 9, 4, 2003, 3, 99, true, "CDT"] + */) + +directive(static) ident(VALUE) +ident(time_to_a)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + reserved(return) ident(rb_ary_new3)operator(()integer(10)operator(,) + ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_sec)operator(\),) + ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_min)operator(\),) + ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_hour)operator(\),) + ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_mday)operator(\),) + ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_mon)operator(+)integer(1)operator(\),) + ident(LONG2NUM)operator((()pre_type(long)operator(\))ident(tobj)operator(->)ident(tm)operator(.)ident(tm_year)operator(+)integer(1900)operator(\),) + ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_wday)operator(\),) + ident(INT2FIX)operator(()ident(tobj)operator(->)ident(tm)operator(.)ident(tm_yday)operator(+)integer(1)operator(\),) + ident(tobj)operator(->)ident(tm)operator(.)ident(tm_isdst)operator(?)label(Qtrue)operator(:)ident(Qfalse)operator(,) + ident(time_zone)operator(()ident(time)operator(\)\);) +operator(}) + +preprocessor(#define) ident(SMALLBUF) integer(100) +directive(static) pre_type(int) +ident(rb_strftime)operator(()ident(buf)operator(,) ident(format)operator(,) ident(time)operator(\)) + pre_type(char) operator(**)ident(buf)operator(;) + directive(const) pre_type(char) operator(*)ident(format)operator(;) + reserved(struct) ident(tm) operator(*)ident(time)operator(;) +operator({) + pre_type(int) ident(size)operator(,) ident(len)operator(,) ident(flen)operator(;) + + operator((*)ident(buf)operator(\)[)integer(0)operator(]) operator(=) char('\\0')operator(;) + ident(flen) operator(=) ident(strlen)operator(()ident(format)operator(\);) + reserved(if) operator(()ident(flen) operator(==) integer(0)operator(\)) operator({) + reserved(return) integer(0)operator(;) + operator(}) + ident(errno) operator(=) integer(0)operator(;) + ident(len) operator(=) ident(strftime)operator((*)ident(buf)operator(,) ident(SMALLBUF)operator(,) ident(format)operator(,) ident(time)operator(\);) + reserved(if) operator(()ident(len) operator(!=) integer(0) operator(||) operator((**)ident(buf) operator(==) char('\\0') operator(&&) ident(errno) operator(!=) ident(ERANGE)operator(\)\)) reserved(return) ident(len)operator(;) + reserved(for) operator(()ident(size)operator(=)integer(1024)operator(;) operator(;) ident(size)operator(*=)integer(2)operator(\)) operator({) + operator(*)ident(buf) operator(=) ident(xmalloc)operator(()ident(size)operator(\);) + operator((*)ident(buf)operator(\)[)integer(0)operator(]) operator(=) char('\\0')operator(;) + ident(len) operator(=) ident(strftime)operator((*)ident(buf)operator(,) ident(size)operator(,) ident(format)operator(,) ident(time)operator(\);) + comment(/* + * buflen can be zero EITHER because there's not enough + * room in the string, or because the control command + * goes to the empty string. Make a reasonable guess that + * if the buffer is 1024 times bigger than the length of the + * format string, it's not failing for lack of room. + */) + reserved(if) operator(()ident(len) operator(>) integer(0) operator(||) ident(size) operator(>=) integer(1024) operator(*) ident(flen)operator(\)) reserved(return) ident(len)operator(;) + ident(free)operator((*)ident(buf)operator(\);) + operator(}) + comment(/* not reached */) +operator(}) + +comment(/* + * call-seq: + * time.strftime( string \) => string + * + * Formats <i>time</i> according to the directives in the given format + * string. Any text not listed as a directive will be passed through + * to the output string. + * + * Format meaning: + * %a - The abbreviated weekday name (``Sun''\) + * %A - The full weekday name (``Sunday''\) + * %b - The abbreviated month name (``Jan''\) + * %B - The full month name (``January''\) + * %c - The preferred local date and time representation + * %d - Day of the month (01..31\) + * %H - Hour of the day, 24-hour clock (00..23\) + * %I - Hour of the day, 12-hour clock (01..12\) + * %j - Day of the year (001..366\) + * %m - Month of the year (01..12\) + * %M - Minute of the hour (00..59\) + * %p - Meridian indicator (``AM'' or ``PM''\) + * %S - Second of the minute (00..60\) + * %U - Week number of the current year, + * starting with the first Sunday as the first + * day of the first week (00..53\) + * %W - Week number of the current year, + * starting with the first Monday as the first + * day of the first week (00..53\) + * %w - Day of the week (Sunday is 0, 0..6\) + * %x - Preferred representation for the date alone, no time + * %X - Preferred representation for the time alone, no date + * %y - Year without a century (00..99\) + * %Y - Year with century + * %Z - Time zone name + * %% - Literal ``%'' character + * + * t = Time.now + * t.strftime("Printed on %m/%d/%Y"\) #=> "Printed on 04/09/2003" + * t.strftime("at %I:%M%p"\) #=> "at 08:56AM" + */) + +directive(static) ident(VALUE) +ident(time_strftime)operator(()ident(time)operator(,) ident(format)operator(\)) + ident(VALUE) ident(time)operator(,) ident(format)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + pre_type(char) ident(buffer)operator([)ident(SMALLBUF)operator(],) operator(*)ident(buf) operator(=) ident(buffer)operator(;) + directive(const) pre_type(char) operator(*)ident(fmt)operator(;) + pre_type(long) ident(len)operator(;) + ident(VALUE) ident(str)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + reserved(if) operator(()ident(tobj)operator(->)ident(tm_got) operator(==) integer(0)operator(\)) operator({) + ident(time_get_tm)operator(()ident(time)operator(,) ident(tobj)operator(->)ident(gmt)operator(\);) + operator(}) + ident(StringValue)operator(()ident(format)operator(\);) + ident(format) operator(=) ident(rb_str_new4)operator(()ident(format)operator(\);) + ident(fmt) operator(=) ident(RSTRING)operator(()ident(format)operator(\)->)ident(ptr)operator(;) + ident(len) operator(=) ident(RSTRING)operator(()ident(format)operator(\)->)ident(len)operator(;) + reserved(if) operator(()ident(len) operator(==) integer(0)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(strftime called with empty format string)delimiter(")>operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(strlen)operator(()ident(fmt)operator(\)) operator(<) ident(len)operator(\)) operator({) + comment(/* Ruby string may contain \\0's. */) + directive(const) pre_type(char) operator(*)ident(p) operator(=) ident(fmt)operator(,) operator(*)ident(pe) operator(=) ident(fmt) operator(+) ident(len)operator(;) + + ident(str) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) integer(0)operator(\);) + reserved(while) operator(()ident(p) operator(<) ident(pe)operator(\)) operator({) + ident(len) operator(=) ident(rb_strftime)operator((&)ident(buf)operator(,) ident(p)operator(,) operator(&)ident(tobj)operator(->)ident(tm)operator(\);) + ident(rb_str_cat)operator(()ident(str)operator(,) ident(buf)operator(,) ident(len)operator(\);) + ident(p) operator(+=) ident(strlen)operator(()ident(p)operator(\);) + reserved(if) operator(()ident(buf) operator(!=) ident(buffer)operator(\)) operator({) + ident(free)operator(()ident(buf)operator(\);) + ident(buf) operator(=) ident(buffer)operator(;) + operator(}) + reserved(for) operator(()ident(fmt) operator(=) ident(p)operator(;) ident(p) operator(<) ident(pe) operator(&&) operator(!*)ident(p)operator(;) operator(++)ident(p)operator(\);) + reserved(if) operator(()ident(p) operator(>) ident(fmt)operator(\)) ident(rb_str_cat)operator(()ident(str)operator(,) ident(fmt)operator(,) ident(p) operator(-) ident(fmt)operator(\);) + operator(}) + reserved(return) ident(str)operator(;) + operator(}) + reserved(else) operator({) + ident(len) operator(=) ident(rb_strftime)operator((&)ident(buf)operator(,) ident(RSTRING)operator(()ident(format)operator(\)->)ident(ptr)operator(,) operator(&)ident(tobj)operator(->)ident(tm)operator(\);) + operator(}) + ident(str) operator(=) ident(rb_str_new)operator(()ident(buf)operator(,) ident(len)operator(\);) + reserved(if) operator(()ident(buf) operator(!=) ident(buffer)operator(\)) ident(free)operator(()ident(buf)operator(\);) + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * call-seq: + * Time.times => struct_tms + * + * Deprecated in favor of <code>Process::times</code> + */) + +directive(static) ident(VALUE) +ident(time_s_times)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(rb_warn)operator(()string<delimiter(")content(obsolete method Time::times; use Process::times)delimiter(")>operator(\);) + reserved(return) ident(rb_proc_times)operator(()ident(obj)operator(\);) +operator(}) + +comment(/* + * undocumented + */) + +directive(static) ident(VALUE) +ident(time_mdump)operator(()ident(time)operator(\)) + ident(VALUE) ident(time)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + reserved(struct) ident(tm) operator(*)ident(tm)operator(;) + pre_type(unsigned) pre_type(long) ident(p)operator(,) ident(s)operator(;) + pre_type(char) ident(buf)operator([)integer(8)operator(];) + ident(time_t) ident(t)operator(;) + pre_type(int) ident(i)operator(;) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + + ident(t) operator(=) ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec)operator(;) + ident(tm) operator(=) ident(gmtime)operator((&)ident(t)operator(\);) + + reserved(if) operator((()ident(tm)operator(->)ident(tm_year) operator(&) hex(0xffff)operator(\)) operator(!=) ident(tm)operator(->)ident(tm_year)operator(\)) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(year too big to marshal)delimiter(")>operator(\);) + + ident(p) operator(=) hex(0x1)ident(UL) operator(<<) integer(31) operator(|) comment(/* 1 */) + ident(tobj)operator(->)ident(gmt) operator(<<) integer(30) operator(|) comment(/* 1 */) + ident(tm)operator(->)ident(tm_year) operator(<<) integer(14) operator(|) comment(/* 16 */) + ident(tm)operator(->)ident(tm_mon) operator(<<) integer(10) operator(|) comment(/* 4 */) + ident(tm)operator(->)ident(tm_mday) operator(<<) integer(5) operator(|) comment(/* 5 */) + ident(tm)operator(->)ident(tm_hour)operator(;) comment(/* 5 */) + ident(s) operator(=) ident(tm)operator(->)ident(tm_min) operator(<<) integer(26) operator(|) comment(/* 6 */) + ident(tm)operator(->)ident(tm_sec) operator(<<) integer(20) operator(|) comment(/* 6 */) + ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec)operator(;) comment(/* 20 */) + + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(4)operator(;) ident(i)operator(++\)) operator({) + ident(buf)operator([)ident(i)operator(]) operator(=) ident(p) operator(&) hex(0xff)operator(;) + ident(p) operator(=) ident(RSHIFT)operator(()ident(p)operator(,) integer(8)operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(4)operator(;) ident(i)operator(<)integer(8)operator(;) ident(i)operator(++\)) operator({) + ident(buf)operator([)ident(i)operator(]) operator(=) ident(s) operator(&) hex(0xff)operator(;) + ident(s) operator(=) ident(RSHIFT)operator(()ident(s)operator(,) integer(8)operator(\);) + operator(}) + + reserved(return) ident(rb_str_new)operator(()ident(buf)operator(,) integer(8)operator(\);) +operator(}) + +comment(/* + * call-seq: + * time._dump => string + * + * Dump _time_ for marshaling. + */) + +directive(static) ident(VALUE) +ident(time_dump)operator(()ident(argc)operator(,) ident(argv)operator(,) ident(time)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) + ident(VALUE) ident(time)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(01)delimiter(")>operator(,) integer(0)operator(\);) + ident(str) operator(=) ident(time_mdump)operator(()ident(time)operator(\);) + reserved(if) operator(()ident(FL_TEST)operator(()ident(time)operator(,) ident(FL_EXIVAR)operator(\)\)) operator({) + ident(rb_copy_generic_ivar)operator(()ident(str)operator(,) ident(time)operator(\);) + ident(FL_SET)operator(()ident(str)operator(,) ident(FL_EXIVAR)operator(\);) + operator(}) + + reserved(return) ident(str)operator(;) +operator(}) + +comment(/* + * undocumented + */) + +directive(static) ident(VALUE) +ident(time_mload)operator(()ident(time)operator(,) ident(str)operator(\)) + ident(VALUE) ident(time)operator(,) ident(str)operator(;) +operator({) + reserved(struct) ident(time_object) operator(*)ident(tobj)operator(;) + pre_type(unsigned) pre_type(long) ident(p)operator(,) ident(s)operator(;) + ident(time_t) ident(sec)operator(,) ident(usec)operator(;) + pre_type(unsigned) pre_type(char) operator(*)ident(buf)operator(;) + reserved(struct) ident(tm) ident(tm)operator(;) + pre_type(int) ident(i)operator(,) ident(gmt)operator(;) + + ident(time_modify)operator(()ident(time)operator(\);) + ident(StringValue)operator(()ident(str)operator(\);) + ident(buf) operator(=) operator(()pre_type(unsigned) pre_type(char) operator(*\))ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(!=) integer(8)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(marshaled time format differ)delimiter(")>operator(\);) + operator(}) + + ident(p) operator(=) ident(s) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)integer(4)operator(;) ident(i)operator(++\)) operator({) + ident(p) operator(|=) ident(buf)operator([)ident(i)operator(]<<()integer(8)operator(*)ident(i)operator(\);) + operator(}) + reserved(for) operator(()ident(i)operator(=)integer(4)operator(;) ident(i)operator(<)integer(8)operator(;) ident(i)operator(++\)) operator({) + ident(s) operator(|=) ident(buf)operator([)ident(i)operator(]<<()integer(8)operator(*()ident(i)operator(-)integer(4)operator(\)\);) + operator(}) + + reserved(if) operator((()ident(p) operator(&) operator(()integer(1)ident(UL)operator(<<)integer(31)operator(\)\)) operator(==) integer(0)operator(\)) operator({) + ident(sec) operator(=) ident(p)operator(;) + ident(usec) operator(=) ident(s)operator(;) + operator(}) + reserved(else) operator({) + ident(p) operator(&=) operator(~()integer(1)ident(UL)operator(<<)integer(31)operator(\);) + ident(gmt) operator(=) operator(()ident(p) operator(>>) integer(30)operator(\)) operator(&) hex(0x1)operator(;) + ident(tm)operator(.)ident(tm_year) operator(=) operator(()ident(p) operator(>>) integer(14)operator(\)) operator(&) hex(0xffff)operator(;) + ident(tm)operator(.)ident(tm_mon) operator(=) operator(()ident(p) operator(>>) integer(10)operator(\)) operator(&) hex(0xf)operator(;) + ident(tm)operator(.)ident(tm_mday) operator(=) operator(()ident(p) operator(>>) integer(5)operator(\)) operator(&) hex(0x1f)operator(;) + ident(tm)operator(.)ident(tm_hour) operator(=) ident(p) operator(&) hex(0x1f)operator(;) + ident(tm)operator(.)ident(tm_min) operator(=) operator(()ident(s) operator(>>) integer(26)operator(\)) operator(&) hex(0x3f)operator(;) + ident(tm)operator(.)ident(tm_sec) operator(=) operator(()ident(s) operator(>>) integer(20)operator(\)) operator(&) hex(0x3f)operator(;) + ident(tm)operator(.)ident(tm_isdst) operator(=) integer(0)operator(;) + + ident(sec) operator(=) ident(make_time_t)operator((&)ident(tm)operator(,) ident(Qtrue)operator(\);) + ident(usec) operator(=) operator(()ident(time_t)operator(\)()ident(s) operator(&) hex(0xfffff)operator(\);) + operator(}) + ident(time_overflow_p)operator((&)ident(sec)operator(,) operator(&)ident(usec)operator(\);) + + ident(GetTimeval)operator(()ident(time)operator(,) ident(tobj)operator(\);) + ident(tobj)operator(->)ident(tm_got) operator(=) integer(0)operator(;) + ident(tobj)operator(->)ident(gmt) operator(=) ident(gmt)operator(;) + ident(tobj)operator(->)ident(tv)operator(.)ident(tv_sec) operator(=) ident(sec)operator(;) + ident(tobj)operator(->)ident(tv)operator(.)ident(tv_usec) operator(=) ident(usec)operator(;) + reserved(return) ident(time)operator(;) +operator(}) + +comment(/* + * call-seq: + * Time._load(string\) => time + * + * Unmarshal a dumped +Time+ object. + */) + +directive(static) ident(VALUE) +ident(time_load)operator(()ident(klass)operator(,) ident(str)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(str)operator(;) +operator({) + ident(VALUE) ident(time) operator(=) ident(time_s_alloc)operator(()ident(klass)operator(\);) + + reserved(if) operator(()ident(FL_TEST)operator(()ident(str)operator(,) ident(FL_EXIVAR)operator(\)\)) operator({) + ident(rb_copy_generic_ivar)operator(()ident(time)operator(,) ident(str)operator(\);) + ident(FL_SET)operator(()ident(time)operator(,) ident(FL_EXIVAR)operator(\);) + operator(}) + ident(time_mload)operator(()ident(time)operator(,) ident(str)operator(\);) + reserved(return) ident(time)operator(;) +operator(}) + +comment(/* + * <code>Time</code> is an abstraction of dates and times. Time is + * stored internally as the number of seconds and microseconds since + * the <em>epoch</em>, January 1, 1970 00:00 UTC. On some operating + * systems, this offset is allowed to be negative. Also see the + * library modules <code>Date</code> and <code>ParseDate</code>. The + * <code>Time</code> class treats GMT (Greenwich Mean Time\) and UTC + * (Coordinated Universal Time\)<em>[Yes, UTC really does stand for + * Coordinated Universal Time. There was a committee involved.]</em> + * as equivalent. GMT is the older way of referring to these + * baseline times but persists in the names of calls on Posix + * systems. + * + * All times are stored with some number of microseconds. Be aware of + * this fact when comparing times with each other---times that are + * apparently equal when displayed may be different when compared. + */) + +directive(void) +ident(Init_Time)operator((\)) +operator({) + ident(rb_cTime) operator(=) ident(rb_define_class)operator(()string<delimiter(")content(Time)delimiter(")>operator(,) ident(rb_cObject)operator(\);) + ident(rb_include_module)operator(()ident(rb_cTime)operator(,) ident(rb_mComparable)operator(\);) + + ident(rb_define_alloc_func)operator(()ident(rb_cTime)operator(,) ident(time_s_alloc)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(now)delimiter(")>operator(,) ident(rb_class_new_instance)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(at)delimiter(")>operator(,) ident(time_s_at)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(utc)delimiter(")>operator(,) ident(time_s_mkutc)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(gm)delimiter(")>operator(,) ident(time_s_mkutc)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(local)delimiter(")>operator(,) ident(time_s_mktime)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(mktime)delimiter(")>operator(,) ident(time_s_mktime)operator(,) operator(-)integer(1)operator(\);) + + ident(rb_define_singleton_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(times)delimiter(")>operator(,) ident(time_s_times)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) ident(time_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(to_f)delimiter(")>operator(,) ident(time_to_f)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(time_cmp)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(time_eql)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(hash)delimiter(")>operator(,) ident(time_hash)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(time_init)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(time_init_copy)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(localtime)delimiter(")>operator(,) ident(time_localtime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(gmtime)delimiter(")>operator(,) ident(time_gmtime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(utc)delimiter(")>operator(,) ident(time_gmtime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(getlocal)delimiter(")>operator(,) ident(time_getlocaltime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(getgm)delimiter(")>operator(,) ident(time_getgmtime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(getutc)delimiter(")>operator(,) ident(time_getgmtime)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(ctime)delimiter(")>operator(,) ident(time_asctime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(asctime)delimiter(")>operator(,) ident(time_asctime)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(time_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(,) ident(time_to_s)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(to_a)delimiter(")>operator(,) ident(time_to_a)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(time_plus)operator(,) integer(1)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(time_minus)operator(,) integer(1)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(succ)delimiter(")>operator(,) ident(time_succ)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(sec)delimiter(")>operator(,) ident(time_sec)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(min)delimiter(")>operator(,) ident(time_min)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(hour)delimiter(")>operator(,) ident(time_hour)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(mday)delimiter(")>operator(,) ident(time_mday)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(day)delimiter(")>operator(,) ident(time_mday)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(mon)delimiter(")>operator(,) ident(time_mon)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(month)delimiter(")>operator(,) ident(time_mon)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(year)delimiter(")>operator(,) ident(time_year)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(wday)delimiter(")>operator(,) ident(time_wday)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(yday)delimiter(")>operator(,) ident(time_yday)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(isdst)delimiter(")>operator(,) ident(time_isdst)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(dst?)delimiter(")>operator(,) ident(time_isdst)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(zone)delimiter(")>operator(,) ident(time_zone)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(gmtoff)delimiter(")>operator(,) ident(time_utc_offset)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(gmt_offset)delimiter(")>operator(,) ident(time_utc_offset)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(utc_offset)delimiter(")>operator(,) ident(time_utc_offset)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(utc?)delimiter(")>operator(,) ident(time_utc_p)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(gmt?)delimiter(")>operator(,) ident(time_utc_p)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(tv_sec)delimiter(")>operator(,) ident(time_to_i)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(tv_usec)delimiter(")>operator(,) ident(time_usec)operator(,) integer(0)operator(\);) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(usec)delimiter(")>operator(,) ident(time_usec)operator(,) integer(0)operator(\);) + + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(strftime)delimiter(")>operator(,) ident(time_strftime)operator(,) integer(1)operator(\);) + + comment(/* methods for marshaling */) + ident(rb_define_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(_dump)delimiter(")>operator(,) ident(time_dump)operator(,) operator(-)integer(1)operator(\);) + ident(rb_define_singleton_method)operator(()ident(rb_cTime)operator(,) string<delimiter(")content(_load)delimiter(")>operator(,) ident(time_load)operator(,) integer(1)operator(\);) +comment(#if 0 + /* Time will support marshal_dump and marshal_load in the future (1.9 maybe\) */ + rb_define_method(rb_cTime, "marshal_dump", time_mdump, 0\); + rb_define_method(rb_cTime, "marshal_load", time_mload, 1\); +#endif) +operator(}) +comment(/********************************************************************** + + util.c - + + $Author: wyhaines $ + $Date: 2009-08-19 15:53:23 +0200 (Wed, 19 Aug 2009\) $ + created at: Fri Mar 10 17:22:34 JST 1995 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") + +preprocessor(#include) include(<ctype.h>) +preprocessor(#include) include(<stdio.h>) +preprocessor(#include) include(<errno.h>) +preprocessor(#include) include(<math.h>) +preprocessor(#include) include(<float.h>) + +preprocessor(#ifdef) ident(_WIN32) +preprocessor(#include) include("missing/file.h") +preprocessor(#endif) + +preprocessor(#include) include("util.h") +preprocessor(#ifndef) ident(HAVE_STRING_H) +pre_type(char) operator(*)ident(strchr) ident(_)operator((()pre_type(char)operator(*,)pre_type(char)operator(\)\);) +preprocessor(#endif) + +pre_type(unsigned) pre_type(long) +ident(scan_oct)operator(()ident(start)operator(,) ident(len)operator(,) ident(retlen)operator(\)) + directive(const) pre_type(char) operator(*)ident(start)operator(;) + pre_type(int) ident(len)operator(;) + pre_type(int) operator(*)ident(retlen)operator(;) +operator({) + directive(register) directive(const) pre_type(char) operator(*)ident(s) operator(=) ident(start)operator(;) + directive(register) pre_type(unsigned) pre_type(long) ident(retval) operator(=) integer(0)operator(;) + + reserved(while) operator(()ident(len)operator(--) operator(&&) operator(*)ident(s) operator(>=) char('0') operator(&&) operator(*)ident(s) operator(<=) char('7')operator(\)) operator({) + ident(retval) operator(<<=) integer(3)operator(;) + ident(retval) operator(|=) operator(*)ident(s)operator(++) operator(-) char('0')operator(;) + operator(}) + operator(*)ident(retlen) operator(=) ident(s) operator(-) ident(start)operator(;) + reserved(return) ident(retval)operator(;) +operator(}) + +pre_type(unsigned) pre_type(long) +ident(scan_hex)operator(()ident(start)operator(,) ident(len)operator(,) ident(retlen)operator(\)) + directive(const) pre_type(char) operator(*)ident(start)operator(;) + pre_type(int) ident(len)operator(;) + pre_type(int) operator(*)ident(retlen)operator(;) +operator({) + directive(static) pre_type(char) ident(hexdigit)operator([]) operator(=) string<delimiter(")content(0123456789abcdef0123456789ABCDEF)delimiter(")>operator(;) + directive(register) directive(const) pre_type(char) operator(*)ident(s) operator(=) ident(start)operator(;) + directive(register) pre_type(unsigned) pre_type(long) ident(retval) operator(=) integer(0)operator(;) + pre_type(char) operator(*)ident(tmp)operator(;) + + reserved(while) operator(()ident(len)operator(--) operator(&&) operator(*)ident(s) operator(&&) operator(()ident(tmp) operator(=) ident(strchr)operator(()ident(hexdigit)operator(,) operator(*)ident(s)operator(\)\)\)) operator({) + ident(retval) operator(<<=) integer(4)operator(;) + ident(retval) operator(|=) operator(()ident(tmp) operator(-) ident(hexdigit)operator(\)) operator(&) integer(15)operator(;) + ident(s)operator(++;) + operator(}) + operator(*)ident(retlen) operator(=) ident(s) operator(-) ident(start)operator(;) + reserved(return) ident(retval)operator(;) +operator(}) + +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<sys/stat.h>) +preprocessor(#ifdef) ident(HAVE_UNISTD_H) +preprocessor(#include) include(<unistd.h>) +preprocessor(#endif) +preprocessor(#if) ident(defined)operator(()ident(HAVE_FCNTL_H)operator(\)) +preprocessor(#include) include(<fcntl.h>) +preprocessor(#endif) + +preprocessor(#ifndef) ident(S_ISDIR) +preprocessor(# define) ident(S_ISDIR)operator(()ident(m)operator(\)) operator((()ident(m) operator(&) ident(S_IFMT)operator(\)) operator(==) ident(S_IFDIR)operator(\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(MSDOS)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN32__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) +comment(/* + * Copyright (c\) 1993, Intergraph Corporation + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the perl README file. + * + * Various Unix compatibility functions and NT specific functions. + * + * Some of this code was derived from the MSDOS port(s\) and the OS/2 port. + * + */) + + +comment(/* + * Suffix appending for in-place editing under MS-DOS and OS/2 (and now NT!\). + * + * Here are the rules: + * + * Style 0: Append the suffix exactly as standard perl would do it. + * If the filesystem groks it, use it. (HPFS will always + * grok it. So will NTFS. FAT will rarely accept it.\) + * + * Style 1: The suffix begins with a '.'. The extension is replaced. + * If the name matches the original name, use the fallback method. + * + * Style 2: The suffix is a single character, not a '.'. Try to add the + * suffix to the following places, using the first one that works. + * [1] Append to extension. + * [2] Append to filename, + * [3] Replace end of extension, + * [4] Replace end of filename. + * If the name matches the original name, use the fallback method. + * + * Style 3: Any other case: Ignore the suffix completely and use the + * fallback method. + * + * Fallback method: Change the extension to ".$$$". If that matches the + * original name, then change the extension to ".~~~". + * + * If filename is more than 1000 characters long, we die a horrible + * death. Sorry. + * + * The filename restriction is a cheat so that we can use buf[] to store + * assorted temporary goo. + * + * Examples, assuming style 0 failed. + * + * suffix = ".bak" (style 1\) + * foo.bar => foo.bak + * foo.bak => foo.$$$ (fallback\) + * foo.$$$ => foo.~~~ (fallback\) + * makefile => makefile.bak + * + * suffix = "~" (style 2\) + * foo.c => foo.c~ + * foo.c~ => foo.c~~ + * foo.c~~ => foo~.c~~ + * foo~.c~~ => foo~~.c~~ + * foo~~~~~.c~~ => foo~~~~~.$$$ (fallback\) + * + * foo.pas => foo~.pas + * makefile => makefile.~ + * longname.fil => longname.fi~ + * longname.fi~ => longnam~.fi~ + * longnam~.fi~ => longnam~.$$$ + * + */) + + +directive(static) pre_type(int) ident(valid_filename)operator(()pre_type(char) operator(*)ident(s)operator(\);) + +directive(static) pre_type(char) ident(suffix1)operator([]) operator(=) string<delimiter(")content(.$$$)delimiter(")>operator(;) +directive(static) pre_type(char) ident(suffix2)operator([]) operator(=) string<delimiter(")content(.~~~)delimiter(")>operator(;) + +preprocessor(#define) ident(ext) operator((&)ident(buf)operator([)integer(1000)operator(]\)) + +preprocessor(#define) ident(strEQ)operator(()ident(s1)operator(,)ident(s2)operator(\)) operator(()ident(strcmp)operator(()ident(s1)operator(,)ident(s2)operator(\)) operator(==) integer(0)operator(\)) + +directive(void) +ident(ruby_add_suffix)operator(()ident(str)operator(,) ident(suffix)operator(\)) + ident(VALUE) ident(str)operator(;) + pre_type(char) operator(*)ident(suffix)operator(;) +operator({) + pre_type(int) ident(baselen)operator(;) + pre_type(int) ident(extlen) operator(=) ident(strlen)operator(()ident(suffix)operator(\);) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(t)operator(,) operator(*)ident(p)operator(;) + pre_type(long) ident(slen)operator(;) + pre_type(char) ident(buf)operator([)integer(1024)operator(];) + + reserved(if) operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(>) integer(1000)operator(\)) + ident(rb_fatal)operator(()string<delimiter(")content(Cannot do inplace edit on long filename (%ld characters\))delimiter(")>operator(,) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) + +preprocessor(#if) ident(defined)operator(()ident(DJGPP)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN32__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) + comment(/* Style 0 */) + ident(slen) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(;) + ident(rb_str_cat)operator(()ident(str)operator(,) ident(suffix)operator(,) ident(extlen)operator(\);) +preprocessor(#if) ident(defined)operator(()ident(DJGPP)operator(\)) + reserved(if) operator(()ident(_USE_LFN)operator(\)) reserved(return)operator(;) +preprocessor(#else) + reserved(if) operator(()ident(valid_filename)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\)\)) reserved(return)operator(;) +preprocessor(#endif) + + comment(/* Fooey, style 0 failed. Fix str before continuing. */) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator([)ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) ident(slen)operator(]) operator(=) char('\\0')operator(;) +preprocessor(#endif) + + ident(slen) operator(=) ident(extlen)operator(;) + ident(t) operator(=) ident(buf)operator(;) ident(baselen) operator(=) integer(0)operator(;) ident(s) operator(=) ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(;) + reserved(while) operator(((*)ident(t) operator(=) operator(*)ident(s)operator(\)) operator(&&) operator(*)ident(s) operator(!=) char('.')operator(\)) operator({) + ident(baselen)operator(++;) + reserved(if) operator((*)ident(s) operator(==) char('\\\\') operator(||) operator(*)ident(s) operator(==) char('/')operator(\)) ident(baselen) operator(=) integer(0)operator(;) + ident(s)operator(++;) ident(t)operator(++;) + operator(}) + ident(p) operator(=) ident(t)operator(;) + + ident(t) operator(=) ident(ext)operator(;) ident(extlen) operator(=) integer(0)operator(;) + reserved(while) operator((*)ident(t)operator(++) operator(=) operator(*)ident(s)operator(++\)) ident(extlen)operator(++;) + reserved(if) operator(()ident(extlen) operator(==) integer(0)operator(\)) operator({) ident(ext)operator([)integer(0)operator(]) operator(=) char('.')operator(;) ident(ext)operator([)integer(1)operator(]) operator(=) integer(0)operator(;) ident(extlen)operator(++;) operator(}) + + reserved(if) operator((*)ident(suffix) operator(==) char('.')operator(\)) operator({) comment(/* Style 1 */) + reserved(if) operator(()ident(strEQ)operator(()ident(ext)operator(,) ident(suffix)operator(\)\)) reserved(goto) ident(fallback)operator(;) + ident(strcpy)operator(()ident(p)operator(,) ident(suffix)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(suffix)operator([)integer(1)operator(]) operator(==) char('\\0')operator(\)) operator({) comment(/* Style 2 */) + reserved(if) operator(()ident(extlen) operator(<) integer(4)operator(\)) operator({) + ident(ext)operator([)ident(extlen)operator(]) operator(=) operator(*)ident(suffix)operator(;) + ident(ext)operator([++)ident(extlen)operator(]) operator(=) char('\\0')operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(baselen) operator(<) integer(8)operator(\)) operator({) + operator(*)ident(p)operator(++) operator(=) operator(*)ident(suffix)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(ext)operator([)integer(3)operator(]) operator(!=) operator(*)ident(suffix)operator(\)) operator({) + ident(ext)operator([)integer(3)operator(]) operator(=) operator(*)ident(suffix)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(buf)operator([)integer(7)operator(]) operator(!=) operator(*)ident(suffix)operator(\)) operator({) + ident(buf)operator([)integer(7)operator(]) operator(=) operator(*)ident(suffix)operator(;) + operator(}) + reserved(else) reserved(goto) ident(fallback)operator(;) + ident(strcpy)operator(()ident(p)operator(,) ident(ext)operator(\);) + operator(}) + reserved(else) operator({) comment(/* Style 3: Panic */) +label(fallback)operator(:) + operator(()directive(void)operator(\))ident(memcpy)operator(()ident(p)operator(,) ident(strEQ)operator(()ident(ext)operator(,) ident(suffix1)operator(\)) operator(?) ident(suffix2) operator(:) ident(suffix1)operator(,) integer(5)operator(\);) + operator(}) + ident(rb_str_resize)operator(()ident(str)operator(,) ident(strlen)operator(()ident(buf)operator(\)\);) + ident(memcpy)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(,) ident(buf)operator(,) ident(RSTRING)operator(()ident(str)operator(\)->)ident(len)operator(\);) +operator(}) + +preprocessor(#if) ident(defined)operator(()ident(__CYGWIN32__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) +directive(static) pre_type(int) +ident(valid_filename)operator(()pre_type(char) operator(*)ident(s)operator(\)) +operator({) + pre_type(int) ident(fd)operator(;) + + comment(/* + // if the file exists, then it's a valid filename! + */) + + reserved(if) operator(()ident(_access)operator(()ident(s)operator(,) integer(0)operator(\)) operator(==) integer(0)operator(\)) operator({) + reserved(return) integer(1)operator(;) + operator(}) + + comment(/* + // It doesn't exist, so see if we can open it. + */) + + reserved(if) operator((()ident(fd) operator(=) ident(_open)operator(()ident(s)operator(,) ident(O_CREAT)operator(,) oct(0666)operator(\)\)) operator(>=) integer(0)operator(\)) operator({) + ident(_close)operator(()ident(fd)operator(\);) + ident(_unlink)operator(()ident(s)operator(\);) comment(/* don't leave it laying around */) + reserved(return) integer(1)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#if) ident(defined) ident(__DJGPP__) + +preprocessor(#include) include(<dpmi.h>) + +directive(static) pre_type(char) ident(dbcs_table)operator([)integer(256)operator(];) + +pre_type(int) +ident(make_dbcs_table)operator((\)) +operator({) + ident(__dpmi_regs) ident(r)operator(;) + reserved(struct) operator({) + pre_type(unsigned) pre_type(char) ident(start)operator(;) + pre_type(unsigned) pre_type(char) ident(end)operator(;) + operator(}) ident(vec)operator(;) + pre_type(int) ident(offset)operator(;) + + ident(memset)operator((&)ident(r)operator(,) integer(0)operator(,) reserved(sizeof)operator(()ident(r)operator(\)\);) + ident(r)operator(.)ident(x)operator(.)ident(ax) operator(=) hex(0x6300)operator(;) + ident(__dpmi_int)operator(()hex(0x21)operator(,) operator(&)ident(r)operator(\);) + ident(offset) operator(=) ident(r)operator(.)ident(x)operator(.)ident(ds) operator(*) integer(16) operator(+) ident(r)operator(.)ident(x)operator(.)ident(si)operator(;) + + reserved(for) operator((;;\)) operator({) + pre_type(int) ident(i)operator(;) + ident(dosmemget)operator(()ident(offset)operator(,) reserved(sizeof) ident(vec)operator(,) operator(&)ident(vec)operator(\);) + reserved(if) operator((!)ident(vec)operator(.)ident(start) operator(&&) operator(!)ident(vec)operator(.)ident(end)operator(\)) + reserved(break)operator(;) + reserved(for) operator(()ident(i) operator(=) ident(vec)operator(.)ident(start)operator(;) ident(i) operator(<=) ident(vec)operator(.)ident(end)operator(;) ident(i)operator(++\)) + ident(dbcs_table)operator([)ident(i)operator(]) operator(=) integer(1)operator(;) + ident(offset) operator(+=) integer(2)operator(;) + operator(}) +operator(}) + +pre_type(int) +ident(mblen)operator(()directive(const) pre_type(char) operator(*)ident(s)operator(,) ident(size_t) ident(n)operator(\)) +operator({) + directive(static) pre_type(int) ident(need_init) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(need_init)operator(\)) operator({) + ident(make_dbcs_table)operator((\);) + ident(need_init) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(s)operator(\)) operator({) + reserved(if) operator(()ident(n) operator(==) integer(0) operator(||) operator(*)ident(s) operator(==) integer(0)operator(\)) + reserved(return) integer(0)operator(;) + reserved(else) reserved(if) operator((!)ident(s)operator([)integer(1)operator(]\)) + reserved(return) integer(1)operator(;) + reserved(return) ident(dbcs_table)operator([()pre_type(unsigned) pre_type(char)operator(\)*)ident(s)operator(]) operator(+) integer(1)operator(;) + operator(}) + reserved(else) + reserved(return) integer(1)operator(;) +operator(}) + +reserved(struct) ident(PathList) operator({) + reserved(struct) ident(PathList) operator(*)ident(next)operator(;) + pre_type(char) operator(*)ident(path)operator(;) +operator(};) + +reserved(struct) ident(PathInfo) operator({) + reserved(struct) ident(PathList) operator(*)ident(head)operator(;) + pre_type(int) ident(count)operator(;) +operator(};) + +directive(static) pre_type(int) +ident(push_element)operator(()directive(const) pre_type(char) operator(*)ident(path)operator(,) ident(VALUE) ident(vinfo)operator(\)) +operator({) + reserved(struct) ident(PathList) operator(*)ident(p)operator(;) + reserved(struct) ident(PathInfo) operator(*)ident(info) operator(=) operator(()reserved(struct) ident(PathInfo) operator(*\))ident(vinfo)operator(;) + + ident(p) operator(=) ident(ALLOC)operator(()reserved(struct) ident(PathList)operator(\);) + ident(MEMZERO)operator(()ident(p)operator(,) reserved(struct) ident(PathList)operator(,) integer(1)operator(\);) + ident(p)operator(->)ident(path) operator(=) ident(ruby_strdup)operator(()ident(path)operator(\);) + ident(p)operator(->)ident(next) operator(=) ident(info)operator(->)ident(head)operator(;) + ident(info)operator(->)ident(head) operator(=) ident(p)operator(;) + ident(info)operator(->)ident(count)operator(++;) + + reserved(return) integer(0)operator(;) +operator(}) + +preprocessor(#include) include(<dirent.h>) +pre_type(int) ident(__opendir_flags) operator(=) ident(__OPENDIR_PRESERVE_CASE)operator(;) + +pre_type(char) operator(**) +ident(__crt0_glob_function)operator(()pre_type(char) operator(*)ident(path)operator(\)) +operator({) + pre_type(int) ident(len) operator(=) ident(strlen)operator(()ident(path)operator(\);) + pre_type(int) ident(i)operator(;) + pre_type(char) operator(**)ident(rv)operator(;) + pre_type(char) ident(path_buffer)operator([)ident(PATH_MAX)operator(];) + pre_type(char) operator(*)ident(buf) operator(=) ident(path_buffer)operator(;) + pre_type(char) operator(*)ident(p)operator(;) + reserved(struct) ident(PathInfo) ident(info)operator(;) + reserved(struct) ident(PathList) operator(*)ident(plist)operator(;) + + reserved(if) operator(()ident(PATH_MAX) operator(<=) ident(len)operator(\)) + ident(buf) operator(=) ident(ruby_xmalloc)operator(()ident(len) operator(+) integer(1)operator(\);) + + ident(strncpy)operator(()ident(buf)operator(,) ident(path)operator(,) ident(len)operator(\);) + ident(buf)operator([)ident(len)operator(]) operator(=) char('\\0')operator(;) + + reserved(for) operator(()ident(p) operator(=) ident(buf)operator(;) operator(*)ident(p)operator(;) ident(p) operator(+=) ident(mblen)operator(()ident(p)operator(,) ident(MB_CUR_MAX)operator(\)\)) + reserved(if) operator((*)ident(p) operator(==) char('\\\\')operator(\)) + operator(*)ident(p) operator(=) char('/')operator(;) + + ident(info)operator(.)ident(count) operator(=) integer(0)operator(;) + ident(info)operator(.)ident(head) operator(=) integer(0)operator(;) + + ident(ruby_glob)operator(()ident(buf)operator(,) integer(0)operator(,) ident(push_element)operator(,) operator(()ident(VALUE)operator(\)&)ident(info)operator(\);) + + reserved(if) operator(()ident(buf) operator(!=) ident(path_buffer)operator(\)) + ident(ruby_xfree)operator(()ident(buf)operator(\);) + + reserved(if) operator(()ident(info)operator(.)ident(count) operator(==) integer(0)operator(\)) + reserved(return) integer(0)operator(;) + + ident(rv) operator(=) ident(ruby_xmalloc)operator((()ident(info)operator(.)ident(count) operator(+) integer(1)operator(\)) operator(*) reserved(sizeof) operator(()pre_type(char) operator(*\)\);) + + ident(plist) operator(=) ident(info)operator(.)ident(head)operator(;) + ident(i) operator(=) integer(0)operator(;) + reserved(while) operator(()ident(plist)operator(\)) operator({) + reserved(struct) ident(PathList) operator(*)ident(cur)operator(;) + ident(rv)operator([)ident(i)operator(]) operator(=) ident(plist)operator(->)ident(path)operator(;) + ident(cur) operator(=) ident(plist)operator(;) + ident(plist) operator(=) ident(plist)operator(->)ident(next)operator(;) + ident(ruby_xfree)operator(()ident(cur)operator(\);) + ident(i)operator(++;) + operator(}) + ident(rv)operator([)ident(i)operator(]) operator(=) integer(0)operator(;) + reserved(return) ident(rv)operator(;) +operator(}) + +preprocessor(#endif) + +comment(/* mm.c */) + +preprocessor(#define) ident(A) operator((()pre_type(int)operator(*\))ident(a)operator(\)) +preprocessor(#define) ident(B) operator((()pre_type(int)operator(*\))ident(b)operator(\)) +preprocessor(#define) ident(C) operator((()pre_type(int)operator(*\))ident(c)operator(\)) +preprocessor(#define) ident(D) operator((()pre_type(int)operator(*\))ident(d)operator(\)) + +preprocessor(#define) ident(mmprepare)operator(()ident(base)operator(,) ident(size)operator(\)) reserved(do) operator({)\ + reserved(if) operator(((()pre_type(long)operator(\))ident(base) operator(&) operator(()hex(0x3)operator(\)\)) operator(==) integer(0)operator(\))\ + reserved(if) operator(()ident(size) operator(>=) integer(16)operator(\)) ident(mmkind) operator(=) integer(1)operator(;)\ + reserved(else) ident(mmkind) operator(=) integer(0)operator(;)\ + reserved(else) ident(mmkind) operator(=) operator(-)integer(1)operator(;)\ + ident(high) operator(=) operator(()ident(size) operator(&) operator((~)hex(0xf)operator(\)\);)\ + ident(low) operator(=) operator(()ident(size) operator(&) hex(0x0c)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\))\ + +preprocessor(#define) ident(mmarg) ident(mmkind)operator(,) ident(size)operator(,) ident(high)operator(,) ident(low) + +directive(static) directive(void) ident(mmswap_)operator(()ident(a)operator(,) ident(b)operator(,) ident(mmarg)operator(\)) + directive(register) pre_type(char) operator(*)ident(a)operator(,) operator(*)ident(b)operator(;) + pre_type(int) ident(mmarg)operator(;) +operator({) + directive(register) pre_type(int) ident(s)operator(;) + reserved(if) operator(()ident(a) operator(==) ident(b)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(mmkind) operator(>=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(mmkind) operator(>) integer(0)operator(\)) operator({) + directive(register) pre_type(char) operator(*)ident(t) operator(=) ident(a) operator(+) ident(high)operator(;) + reserved(do) operator({) + ident(s) operator(=) ident(A)operator([)integer(0)operator(];) ident(A)operator([)integer(0)operator(]) operator(=) ident(B)operator([)integer(0)operator(];) ident(B)operator([)integer(0)operator(]) operator(=) ident(s)operator(;) + ident(s) operator(=) ident(A)operator([)integer(1)operator(];) ident(A)operator([)integer(1)operator(]) operator(=) ident(B)operator([)integer(1)operator(];) ident(B)operator([)integer(1)operator(]) operator(=) ident(s)operator(;) + ident(s) operator(=) ident(A)operator([)integer(2)operator(];) ident(A)operator([)integer(2)operator(]) operator(=) ident(B)operator([)integer(2)operator(];) ident(B)operator([)integer(2)operator(]) operator(=) ident(s)operator(;) + ident(s) operator(=) ident(A)operator([)integer(3)operator(];) ident(A)operator([)integer(3)operator(]) operator(=) ident(B)operator([)integer(3)operator(];) ident(B)operator([)integer(3)operator(]) operator(=) ident(s)operator(;) ident(a) operator(+=) integer(16)operator(;) ident(b) operator(+=) integer(16)operator(;) + operator(}) reserved(while) operator(()ident(a) operator(<) ident(t)operator(\);) + operator(}) + reserved(if) operator(()ident(low) operator(!=) integer(0)operator(\)) operator({) ident(s) operator(=) ident(A)operator([)integer(0)operator(];) ident(A)operator([)integer(0)operator(]) operator(=) ident(B)operator([)integer(0)operator(];) ident(B)operator([)integer(0)operator(]) operator(=) ident(s)operator(;) + reserved(if) operator(()ident(low) operator(>=) integer(8)operator(\)) operator({) ident(s) operator(=) ident(A)operator([)integer(1)operator(];) ident(A)operator([)integer(1)operator(]) operator(=) ident(B)operator([)integer(1)operator(];) ident(B)operator([)integer(1)operator(]) operator(=) ident(s)operator(;) + reserved(if) operator(()ident(low) operator(==) integer(12)operator(\)) operator({)ident(s) operator(=) ident(A)operator([)integer(2)operator(];) ident(A)operator([)integer(2)operator(]) operator(=) ident(B)operator([)integer(2)operator(];) ident(B)operator([)integer(2)operator(]) operator(=) ident(s)operator(;}}}) + operator(}) + reserved(else) operator({) + directive(register) pre_type(char) operator(*)ident(t) operator(=) ident(a) operator(+) ident(size)operator(;) + reserved(do) operator({)ident(s) operator(=) operator(*)ident(a)operator(;) operator(*)ident(a)operator(++) operator(=) operator(*)ident(b)operator(;) operator(*)ident(b)operator(++) operator(=) ident(s)operator(;}) reserved(while) operator(()ident(a) operator(<) ident(t)operator(\);) + operator(}) +operator(}) +preprocessor(#define) ident(mmswap)operator(()ident(a)operator(,)ident(b)operator(\)) ident(mmswap_)operator((()ident(a)operator(\),()ident(b)operator(\),)ident(mmarg)operator(\)) + +directive(static) directive(void) ident(mmrot3_)operator(()ident(a)operator(,) ident(b)operator(,) ident(c)operator(,) ident(mmarg)operator(\)) + directive(register) pre_type(char) operator(*)ident(a)operator(,) operator(*)ident(b)operator(,) operator(*)ident(c)operator(;) + pre_type(int) ident(mmarg)operator(;) +operator({) + directive(register) pre_type(int) ident(s)operator(;) + reserved(if) operator(()ident(mmkind) operator(>=) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(mmkind) operator(>) integer(0)operator(\)) operator({) + directive(register) pre_type(char) operator(*)ident(t) operator(=) ident(a) operator(+) ident(high)operator(;) + reserved(do) operator({) + ident(s) operator(=) ident(A)operator([)integer(0)operator(];) ident(A)operator([)integer(0)operator(]) operator(=) ident(B)operator([)integer(0)operator(];) ident(B)operator([)integer(0)operator(]) operator(=) ident(C)operator([)integer(0)operator(];) ident(C)operator([)integer(0)operator(]) operator(=) ident(s)operator(;) + ident(s) operator(=) ident(A)operator([)integer(1)operator(];) ident(A)operator([)integer(1)operator(]) operator(=) ident(B)operator([)integer(1)operator(];) ident(B)operator([)integer(1)operator(]) operator(=) ident(C)operator([)integer(1)operator(];) ident(C)operator([)integer(1)operator(]) operator(=) ident(s)operator(;) + ident(s) operator(=) ident(A)operator([)integer(2)operator(];) ident(A)operator([)integer(2)operator(]) operator(=) ident(B)operator([)integer(2)operator(];) ident(B)operator([)integer(2)operator(]) operator(=) ident(C)operator([)integer(2)operator(];) ident(C)operator([)integer(2)operator(]) operator(=) ident(s)operator(;) + ident(s) operator(=) ident(A)operator([)integer(3)operator(];) ident(A)operator([)integer(3)operator(]) operator(=) ident(B)operator([)integer(3)operator(];) ident(B)operator([)integer(3)operator(]) operator(=) ident(C)operator([)integer(3)operator(];) ident(C)operator([)integer(3)operator(]) operator(=) ident(s)operator(;) ident(a) operator(+=) integer(16)operator(;) ident(b) operator(+=) integer(16)operator(;) ident(c) operator(+=) integer(16)operator(;) + operator(}) reserved(while) operator(()ident(a) operator(<) ident(t)operator(\);) + operator(}) + reserved(if) operator(()ident(low) operator(!=) integer(0)operator(\)) operator({) ident(s) operator(=) ident(A)operator([)integer(0)operator(];) ident(A)operator([)integer(0)operator(]) operator(=) ident(B)operator([)integer(0)operator(];) ident(B)operator([)integer(0)operator(]) operator(=) ident(C)operator([)integer(0)operator(];) ident(C)operator([)integer(0)operator(]) operator(=) ident(s)operator(;) + reserved(if) operator(()ident(low) operator(>=) integer(8)operator(\)) operator({) ident(s) operator(=) ident(A)operator([)integer(1)operator(];) ident(A)operator([)integer(1)operator(]) operator(=) ident(B)operator([)integer(1)operator(];) ident(B)operator([)integer(1)operator(]) operator(=) ident(C)operator([)integer(1)operator(];) ident(C)operator([)integer(1)operator(]) operator(=) ident(s)operator(;) + reserved(if) operator(()ident(low) operator(==) integer(12)operator(\)) operator({)ident(s) operator(=) ident(A)operator([)integer(2)operator(];) ident(A)operator([)integer(2)operator(]) operator(=) ident(B)operator([)integer(2)operator(];) ident(B)operator([)integer(2)operator(]) operator(=) ident(C)operator([)integer(2)operator(];) ident(C)operator([)integer(2)operator(]) operator(=) ident(s)operator(;}}}) + operator(}) + reserved(else) operator({) + directive(register) pre_type(char) operator(*)ident(t) operator(=) ident(a) operator(+) ident(size)operator(;) + reserved(do) operator({)ident(s) operator(=) operator(*)ident(a)operator(;) operator(*)ident(a)operator(++) operator(=) operator(*)ident(b)operator(;) operator(*)ident(b)operator(++) operator(=) operator(*)ident(c)operator(;) operator(*)ident(c)operator(++) operator(=) ident(s)operator(;}) reserved(while) operator(()ident(a) operator(<) ident(t)operator(\);) + operator(}) +operator(}) +preprocessor(#define) ident(mmrot3)operator(()ident(a)operator(,)ident(b)operator(,)ident(c)operator(\)) ident(mmrot3_)operator((()ident(a)operator(\),()ident(b)operator(\),()ident(c)operator(\),)ident(mmarg)operator(\)) + +comment(/* qs6.c */) +comment(/*****************************************************/) +comment(/* */) +comment(/* qs6 (Quick sort function\) */) +comment(/* */) +comment(/* by Tomoyuki Kawamura 1995.4.21 */) +comment(/* kawamura@tokuyama.ac.jp */) +comment(/*****************************************************/) + +reserved(typedef) reserved(struct) operator({) pre_type(char) operator(*)ident(LL)operator(,) operator(*)ident(RR)operator(;) operator(}) ident(stack_node)operator(;) comment(/* Stack structure for L,l,R,r */) +preprocessor(#define) ident(PUSH)operator(()ident(ll)operator(,)ident(rr)operator(\)) reserved(do) operator({) ident(top)operator(->)ident(LL) operator(=) operator(()ident(ll)operator(\);) ident(top)operator(->)ident(RR) operator(=) operator(()ident(rr)operator(\);) operator(++)ident(top)operator(;) operator(}) reserved(while) operator(()integer(0)operator(\)) comment(/* Push L,l,R,r */) +preprocessor(#define) ident(POP)operator(()ident(ll)operator(,)ident(rr)operator(\)) reserved(do) operator({) operator(--)ident(top)operator(;) ident(ll) operator(=) ident(top)operator(->)ident(LL)operator(;) ident(rr) operator(=) ident(top)operator(->)ident(RR)operator(;) operator(}) reserved(while) operator(()integer(0)operator(\)) comment(/* Pop L,l,R,r */) + +preprocessor(#define) ident(med3)operator(()ident(a)operator(,)ident(b)operator(,)ident(c)operator(\)) operator(((*)ident(cmp)operator(\)()ident(a)operator(,)ident(b)operator(,)ident(d)operator(\)<)integer(0) operator(?) \ + operator(((*)ident(cmp)operator(\)()ident(b)operator(,)ident(c)operator(,)ident(d)operator(\)<)integer(0) operator(?) ident(b) operator(:) operator(((*)ident(cmp)operator(\)()ident(a)operator(,)ident(c)operator(,)ident(d)operator(\)<)integer(0) operator(?) ident(c) operator(:) ident(a)operator(\)\)) operator(:) \ + operator(((*)ident(cmp)operator(\)()ident(b)operator(,)ident(c)operator(,)ident(d)operator(\)>)integer(0) operator(?) ident(b) operator(:) operator(((*)ident(cmp)operator(\)()ident(a)operator(,)ident(c)operator(,)ident(d)operator(\)<)integer(0) operator(?) ident(a) operator(:) ident(c)operator(\)\)\)) + +directive(void) ident(ruby_qsort) operator(()ident(base)operator(,) ident(nel)operator(,) ident(size)operator(,) ident(cmp)operator(,) ident(d)operator(\)) + directive(void)operator(*) ident(base)operator(;) + directive(const) pre_type(int) ident(nel)operator(;) + directive(const) pre_type(int) ident(size)operator(;) + pre_type(int) operator((*)ident(cmp)operator(\)(\);) + directive(void) operator(*)ident(d)operator(;) +operator({) + directive(register) pre_type(char) operator(*)ident(l)operator(,) operator(*)ident(r)operator(,) operator(*)ident(m)operator(;) comment(/* l,r:left,right group m:median point */) + directive(register) pre_type(int) ident(t)operator(,) ident(eq_l)operator(,) ident(eq_r)operator(;) comment(/* eq_l: all items in left group are equal to S */) + pre_type(char) operator(*)ident(L) operator(=) ident(base)operator(;) comment(/* left end of curren region */) + pre_type(char) operator(*)ident(R) operator(=) operator(()pre_type(char)operator(*\))ident(base) operator(+) ident(size)operator(*()ident(nel)operator(-)integer(1)operator(\);) comment(/* right end of current region */) + pre_type(int) ident(chklim) operator(=) integer(63)operator(;) comment(/* threshold of ordering element check */) + ident(stack_node) ident(stack)operator([)integer(32)operator(],) operator(*)ident(top) operator(=) ident(stack)operator(;) comment(/* 32 is enough for 32bit CPU */) + pre_type(int) ident(mmkind)operator(,) ident(high)operator(,) ident(low)operator(;) + + reserved(if) operator(()ident(nel) operator(<=) integer(1)operator(\)) reserved(return)operator(;) comment(/* need not to sort */) + ident(mmprepare)operator(()ident(base)operator(,) ident(size)operator(\);) + reserved(goto) ident(start)operator(;) + + label(nxt)operator(:) + reserved(if) operator(()ident(stack) operator(==) ident(top)operator(\)) reserved(return)operator(;) comment(/* return if stack is empty */) + ident(POP)operator(()ident(L)operator(,)ident(R)operator(\);) + + reserved(for) operator((;;\)) operator({) + label(start)operator(:) + reserved(if) operator(()ident(L) operator(+) ident(size) operator(==) ident(R)operator(\)) operator({) comment(/* 2 elements */) + reserved(if) operator(((*)ident(cmp)operator(\)()ident(L)operator(,)ident(R)operator(,)ident(d)operator(\)) operator(>) integer(0)operator(\)) ident(mmswap)operator(()ident(L)operator(,)ident(R)operator(\);) reserved(goto) ident(nxt)operator(;) + operator(}) + + ident(l) operator(=) ident(L)operator(;) ident(r) operator(=) ident(R)operator(;) + ident(t) operator(=) operator(()ident(r) operator(-) ident(l) operator(+) ident(size)operator(\)) operator(/) ident(size)operator(;) comment(/* number of elements */) + ident(m) operator(=) ident(l) operator(+) ident(size) operator(*) operator(()ident(t) operator(>>) integer(1)operator(\);) comment(/* calculate median value */) + + reserved(if) operator(()ident(t) operator(>=) integer(60)operator(\)) operator({) + directive(register) pre_type(char) operator(*)ident(m1)operator(;) + directive(register) pre_type(char) operator(*)ident(m3)operator(;) + reserved(if) operator(()ident(t) operator(>=) integer(200)operator(\)) operator({) + ident(t) operator(=) ident(size)operator(*()ident(t)operator(>>)integer(3)operator(\);) comment(/* number of bytes in splitting 8 */) + operator({) + directive(register) pre_type(char) operator(*)ident(p1) operator(=) ident(l) operator(+) ident(t)operator(;) + directive(register) pre_type(char) operator(*)ident(p2) operator(=) ident(p1) operator(+) ident(t)operator(;) + directive(register) pre_type(char) operator(*)ident(p3) operator(=) ident(p2) operator(+) ident(t)operator(;) + ident(m1) operator(=) ident(med3)operator(()ident(p1)operator(,) ident(p2)operator(,) ident(p3)operator(\);) + ident(p1) operator(=) ident(m) operator(+) ident(t)operator(;) + ident(p2) operator(=) ident(p1) operator(+) ident(t)operator(;) + ident(p3) operator(=) ident(p2) operator(+) ident(t)operator(;) + ident(m3) operator(=) ident(med3)operator(()ident(p1)operator(,) ident(p2)operator(,) ident(p3)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + ident(t) operator(=) ident(size)operator(*()ident(t)operator(>>)integer(2)operator(\);) comment(/* number of bytes in splitting 4 */) + ident(m1) operator(=) ident(l) operator(+) ident(t)operator(;) + ident(m3) operator(=) ident(m) operator(+) ident(t)operator(;) + operator(}) + ident(m) operator(=) ident(med3)operator(()ident(m1)operator(,) ident(m)operator(,) ident(m3)operator(\);) + operator(}) + + reserved(if) operator((()ident(t) operator(=) operator((*)ident(cmp)operator(\)()ident(l)operator(,)ident(m)operator(,)ident(d)operator(\)\)) operator(<) integer(0)operator(\)) operator({) comment(/*3-5-?*/) + reserved(if) operator((()ident(t) operator(=) operator((*)ident(cmp)operator(\)()ident(m)operator(,)ident(r)operator(,)ident(d)operator(\)\)) operator(<) integer(0)operator(\)) operator({) comment(/*3-5-7*/) + reserved(if) operator(()ident(chklim) operator(&&) ident(nel) operator(>=) ident(chklim)operator(\)) operator({) comment(/* check if already ascending order */) + pre_type(char) operator(*)ident(p)operator(;) + ident(chklim) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(p)operator(=)ident(l)operator(;) ident(p)operator(<)ident(r)operator(;) ident(p)operator(+=)ident(size)operator(\)) reserved(if) operator(((*)ident(cmp)operator(\)()ident(p)operator(,)ident(p)operator(+)ident(size)operator(,)ident(d)operator(\)) operator(>) integer(0)operator(\)) reserved(goto) ident(fail)operator(;) + reserved(goto) ident(nxt)operator(;) + operator(}) + label(fail)operator(:) reserved(goto) ident(loopA)operator(;) comment(/*3-5-7*/) + operator(}) + reserved(if) operator(()ident(t) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(((*)ident(cmp)operator(\)()ident(l)operator(,)ident(r)operator(,)ident(d)operator(\)) operator(<=) integer(0)operator(\)) operator({)ident(mmswap)operator(()ident(m)operator(,)ident(r)operator(\);) reserved(goto) ident(loopA)operator(;}) comment(/*3-5-4*/) + ident(mmrot3)operator(()ident(r)operator(,)ident(m)operator(,)ident(l)operator(\);) reserved(goto) ident(loopA)operator(;) comment(/*3-5-2*/) + operator(}) + reserved(goto) ident(loopB)operator(;) comment(/*3-5-5*/) + operator(}) + + reserved(if) operator(()ident(t) operator(>) integer(0)operator(\)) operator({) comment(/*7-5-?*/) + reserved(if) operator((()ident(t) operator(=) operator((*)ident(cmp)operator(\)()ident(m)operator(,)ident(r)operator(,)ident(d)operator(\)\)) operator(>) integer(0)operator(\)) operator({) comment(/*7-5-3*/) + reserved(if) operator(()ident(chklim) operator(&&) ident(nel) operator(>=) ident(chklim)operator(\)) operator({) comment(/* check if already ascending order */) + pre_type(char) operator(*)ident(p)operator(;) + ident(chklim) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(p)operator(=)ident(l)operator(;) ident(p)operator(<)ident(r)operator(;) ident(p)operator(+=)ident(size)operator(\)) reserved(if) operator(((*)ident(cmp)operator(\)()ident(p)operator(,)ident(p)operator(+)ident(size)operator(,)ident(d)operator(\)) operator(<) integer(0)operator(\)) reserved(goto) ident(fail2)operator(;) + reserved(while) operator(()ident(l)operator(<)ident(r)operator(\)) operator({)ident(mmswap)operator(()ident(l)operator(,)ident(r)operator(\);) ident(l)operator(+=)ident(size)operator(;) ident(r)operator(-=)ident(size)operator(;}) comment(/* reverse region */) + reserved(goto) ident(nxt)operator(;) + operator(}) + label(fail2)operator(:) ident(mmswap)operator(()ident(l)operator(,)ident(r)operator(\);) reserved(goto) ident(loopA)operator(;) comment(/*7-5-3*/) + operator(}) + reserved(if) operator(()ident(t) operator(<) integer(0)operator(\)) operator({) + reserved(if) operator(((*)ident(cmp)operator(\)()ident(l)operator(,)ident(r)operator(,)ident(d)operator(\)) operator(<=) integer(0)operator(\)) operator({)ident(mmswap)operator(()ident(l)operator(,)ident(m)operator(\);) reserved(goto) ident(loopB)operator(;}) comment(/*7-5-8*/) + ident(mmrot3)operator(()ident(l)operator(,)ident(m)operator(,)ident(r)operator(\);) reserved(goto) ident(loopA)operator(;) comment(/*7-5-6*/) + operator(}) + ident(mmswap)operator(()ident(l)operator(,)ident(r)operator(\);) reserved(goto) ident(loopA)operator(;) comment(/*7-5-5*/) + operator(}) + + reserved(if) operator((()ident(t) operator(=) operator((*)ident(cmp)operator(\)()ident(m)operator(,)ident(r)operator(,)ident(d)operator(\)\)) operator(<) integer(0)operator(\)) operator({)reserved(goto) ident(loopA)operator(;}) comment(/*5-5-7*/) + reserved(if) operator(()ident(t) operator(>) integer(0)operator(\)) operator({)ident(mmswap)operator(()ident(l)operator(,)ident(r)operator(\);) reserved(goto) ident(loopB)operator(;}) comment(/*5-5-3*/) + + comment(/* determining splitting type in case 5-5-5 */) comment(/*5-5-5*/) + reserved(for) operator((;;\)) operator({) + reserved(if) operator((()ident(l) operator(+=) ident(size)operator(\)) operator(==) ident(r)operator(\)) reserved(goto) ident(nxt)operator(;) comment(/*5-5-5*/) + reserved(if) operator(()ident(l) operator(==) ident(m)operator(\)) reserved(continue)operator(;) + reserved(if) operator((()ident(t) operator(=) operator((*)ident(cmp)operator(\)()ident(l)operator(,)ident(m)operator(,)ident(d)operator(\)\)) operator(>) integer(0)operator(\)) operator({)ident(mmswap)operator(()ident(l)operator(,)ident(r)operator(\);) ident(l) operator(=) ident(L)operator(;) reserved(goto) ident(loopA)operator(;})comment(/*575-5*/) + reserved(if) operator(()ident(t) operator(<) integer(0)operator(\)) operator({)ident(mmswap)operator(()ident(L)operator(,)ident(l)operator(\);) ident(l) operator(=) ident(L)operator(;) reserved(goto) ident(loopB)operator(;}) comment(/*535-5*/) + operator(}) + + label(loopA)operator(:) ident(eq_l) operator(=) integer(1)operator(;) ident(eq_r) operator(=) integer(1)operator(;) comment(/* splitting type A */) comment(/* left <= median < right */) + reserved(for) operator((;;\)) operator({) + reserved(for) operator((;;\)) operator({) + reserved(if) operator((()ident(l) operator(+=) ident(size)operator(\)) operator(==) ident(r)operator(\)) + operator({)ident(l) operator(-=) ident(size)operator(;) reserved(if) operator(()ident(l) operator(!=) ident(m)operator(\)) ident(mmswap)operator(()ident(m)operator(,)ident(l)operator(\);) ident(l) operator(-=) ident(size)operator(;) reserved(goto) ident(fin)operator(;}) + reserved(if) operator(()ident(l) operator(==) ident(m)operator(\)) reserved(continue)operator(;) + reserved(if) operator((()ident(t) operator(=) operator((*)ident(cmp)operator(\)()ident(l)operator(,)ident(m)operator(,)ident(d)operator(\)\)) operator(>) integer(0)operator(\)) operator({)ident(eq_r) operator(=) integer(0)operator(;) reserved(break)operator(;}) + reserved(if) operator(()ident(t) operator(<) integer(0)operator(\)) ident(eq_l) operator(=) integer(0)operator(;) + operator(}) + reserved(for) operator((;;\)) operator({) + reserved(if) operator(()ident(l) operator(==) operator(()ident(r) operator(-=) ident(size)operator(\)\)) + operator({)ident(l) operator(-=) ident(size)operator(;) reserved(if) operator(()ident(l) operator(!=) ident(m)operator(\)) ident(mmswap)operator(()ident(m)operator(,)ident(l)operator(\);) ident(l) operator(-=) ident(size)operator(;) reserved(goto) ident(fin)operator(;}) + reserved(if) operator(()ident(r) operator(==) ident(m)operator(\)) operator({)ident(m) operator(=) ident(l)operator(;) reserved(break)operator(;}) + reserved(if) operator((()ident(t) operator(=) operator((*)ident(cmp)operator(\)()ident(r)operator(,)ident(m)operator(,)ident(d)operator(\)\)) operator(<) integer(0)operator(\)) operator({)ident(eq_l) operator(=) integer(0)operator(;) reserved(break)operator(;}) + reserved(if) operator(()ident(t) operator(==) integer(0)operator(\)) reserved(break)operator(;) + operator(}) + ident(mmswap)operator(()ident(l)operator(,)ident(r)operator(\);) comment(/* swap left and right */) + operator(}) + + label(loopB)operator(:) ident(eq_l) operator(=) integer(1)operator(;) ident(eq_r) operator(=) integer(1)operator(;) comment(/* splitting type B */) comment(/* left < median <= right */) + reserved(for) operator((;;\)) operator({) + reserved(for) operator((;;\)) operator({) + reserved(if) operator(()ident(l) operator(==) operator(()ident(r) operator(-=) ident(size)operator(\)\)) + operator({)ident(r) operator(+=) ident(size)operator(;) reserved(if) operator(()ident(r) operator(!=) ident(m)operator(\)) ident(mmswap)operator(()ident(r)operator(,)ident(m)operator(\);) ident(r) operator(+=) ident(size)operator(;) reserved(goto) ident(fin)operator(;}) + reserved(if) operator(()ident(r) operator(==) ident(m)operator(\)) reserved(continue)operator(;) + reserved(if) operator((()ident(t) operator(=) operator((*)ident(cmp)operator(\)()ident(r)operator(,)ident(m)operator(,)ident(d)operator(\)\)) operator(<) integer(0)operator(\)) operator({)ident(eq_l) operator(=) integer(0)operator(;) reserved(break)operator(;}) + reserved(if) operator(()ident(t) operator(>) integer(0)operator(\)) ident(eq_r) operator(=) integer(0)operator(;) + operator(}) + reserved(for) operator((;;\)) operator({) + reserved(if) operator((()ident(l) operator(+=) ident(size)operator(\)) operator(==) ident(r)operator(\)) + operator({)ident(r) operator(+=) ident(size)operator(;) reserved(if) operator(()ident(r) operator(!=) ident(m)operator(\)) ident(mmswap)operator(()ident(r)operator(,)ident(m)operator(\);) ident(r) operator(+=) ident(size)operator(;) reserved(goto) ident(fin)operator(;}) + reserved(if) operator(()ident(l) operator(==) ident(m)operator(\)) operator({)ident(m) operator(=) ident(r)operator(;) reserved(break)operator(;}) + reserved(if) operator((()ident(t) operator(=) operator((*)ident(cmp)operator(\)()ident(l)operator(,)ident(m)operator(,)ident(d)operator(\)\)) operator(>) integer(0)operator(\)) operator({)ident(eq_r) operator(=) integer(0)operator(;) reserved(break)operator(;}) + reserved(if) operator(()ident(t) operator(==) integer(0)operator(\)) reserved(break)operator(;) + operator(}) + ident(mmswap)operator(()ident(l)operator(,)ident(r)operator(\);) comment(/* swap left and right */) + operator(}) + + label(fin)operator(:) + reserved(if) operator(()ident(eq_l) operator(==) integer(0)operator(\)) comment(/* need to sort left side */) + reserved(if) operator(()ident(eq_r) operator(==) integer(0)operator(\)) comment(/* need to sort right side */) + reserved(if) operator(()ident(l)operator(-)ident(L) operator(<) ident(R)operator(-)ident(r)operator(\)) operator({)ident(PUSH)operator(()ident(r)operator(,)ident(R)operator(\);) ident(R) operator(=) ident(l)operator(;}) comment(/* sort left side first */) + reserved(else) operator({)ident(PUSH)operator(()ident(L)operator(,)ident(l)operator(\);) ident(L) operator(=) ident(r)operator(;}) comment(/* sort right side first */) + reserved(else) ident(R) operator(=) ident(l)operator(;) comment(/* need to sort left side only */) + reserved(else) reserved(if) operator(()ident(eq_r) operator(==) integer(0)operator(\)) ident(L) operator(=) ident(r)operator(;) comment(/* need to sort right side only */) + reserved(else) reserved(goto) ident(nxt)operator(;) comment(/* need not to sort both sides */) + operator(}) +operator(}) + +pre_type(char) operator(*) +ident(ruby_strdup)operator(()ident(str)operator(\)) + directive(const) pre_type(char) operator(*)ident(str)operator(;) +operator({) + pre_type(char) operator(*)ident(tmp)operator(;) + pre_type(int) ident(len) operator(=) ident(strlen)operator(()ident(str)operator(\)) operator(+) integer(1)operator(;) + + ident(tmp) operator(=) ident(xmalloc)operator(()ident(len)operator(\);) + ident(memcpy)operator(()ident(tmp)operator(,) ident(str)operator(,) ident(len)operator(\);) + + reserved(return) ident(tmp)operator(;) +operator(}) + +pre_type(char) operator(*) +ident(ruby_getcwd)operator((\)) +operator({) +preprocessor(#ifdef) ident(HAVE_GETCWD) + pre_type(int) ident(size) operator(=) integer(200)operator(;) + pre_type(char) operator(*)ident(buf) operator(=) ident(xmalloc)operator(()ident(size)operator(\);) + + reserved(while) operator((!)ident(getcwd)operator(()ident(buf)operator(,) ident(size)operator(\)\)) operator({) + reserved(if) operator(()ident(errno) operator(!=) ident(ERANGE)operator(\)) operator({) + ident(free)operator(()ident(buf)operator(\);) + ident(rb_sys_fail)operator(()string<delimiter(")content(getcwd)delimiter(")>operator(\);) + operator(}) + ident(size) operator(*=) integer(2)operator(;) + ident(buf) operator(=) ident(xrealloc)operator(()ident(buf)operator(,) ident(size)operator(\);) + operator(}) +preprocessor(#else) +preprocessor(# ifndef) ident(PATH_MAX) +preprocessor(# define) ident(PATH_MAX) integer(8192) +preprocessor(# endif) + pre_type(char) operator(*)ident(buf) operator(=) ident(xmalloc)operator(()ident(PATH_MAX)operator(+)integer(1)operator(\);) + + reserved(if) operator((!)ident(getwd)operator(()ident(buf)operator(\)\)) operator({) + ident(free)operator(()ident(buf)operator(\);) + ident(rb_sys_fail)operator(()string<delimiter(")content(getwd)delimiter(")>operator(\);) + operator(}) +preprocessor(#endif) + reserved(return) ident(buf)operator(;) +operator(}) + + +comment(/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c\) 1991, 2000, 2001 by Lucent Technologies. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/) + +comment(/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."\). */) + +comment(/* On a machine with IEEE extended-precision registers, it is + * necessary to specify double-precision (53-bit\) rounding precision + * before invoking strtod or dtoa. If the machine uses (the equivalent + * of\) Intel 80x87 arithmetic, the call + * _control87(PC_53, MCW_PC\); + * does this with many compilers. Whether this or another call is + * appropriate depends on the compiler; for this to work, it may be + * necessary to #include "float.h" or another system-dependent header + * file. + */) + +comment(/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. + * + * This strtod returns a nearest machine number to the input decimal + * string (or sets errno to ERANGE\). With IEEE arithmetic, ties are + * broken by the IEEE round-even rule. Otherwise ties are broken by + * biased rounding (add half and chop\). + * + * Inspired loosely by William D. Clinger's paper "How to Read Floating + * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. + * + * Modifications: + * + * 1. We only require IEEE, IBM, or VAX double-precision + * arithmetic (not IEEE double-extended\). + * 2. We get by with floating-point arithmetic in a case that + * Clinger missed -- when we're computing d * 10^n + * for a small integer d and the integer n is not too + * much larger than 22 (the maximum integer k for which + * we can represent 10^k exactly\), we may be able to + * compute (d*10^k\) * 10^(e-k\) with just one roundoff. + * 3. Rather than a bit-at-a-time adjustment of the binary + * result in the hard case, we use floating-point + * arithmetic to determine the adjustment to within + * one bit; only in really hard cases do we need to + * compute a second residual. + * 4. Because of 3., we don't need a large table of powers of 10 + * for ten-to-e (just some small tables, e.g. of 10^k + * for 0 <= k <= 22\). + */) + +comment(/* + * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least + * significant byte has the lowest address. + * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most + * significant byte has the lowest address. + * #define Long int on machines with 32-bit ints and 64-bit longs. + * #define IBM for IBM mainframe-style floating-point arithmetic. + * #define VAX for VAX-style floating-point arithmetic (D_floating\). + * #define No_leftright to omit left-right logic in fast floating-point + * computation of dtoa. + * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 + * and strtod and dtoa should round accordingly. + * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 + * and Honor_FLT_ROUNDS is not #defined. + * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines + * that use extended-precision instructions to compute rounded + * products and quotients\) with IBM. + * #define ROUND_BIASED for IEEE-format with biased rounding. + * #define Inaccurate_Divide for IEEE-format with correctly rounded + * products but inaccurate quotients, e.g., for Intel i860. + * #define NO_LONG_LONG on machines that do not have a "long long" + * integer type (of >= 64 bits\). On such machines, you can + * #define Just_16 to store 16 bits per 32-bit Long when doing + * high-precision integer arithmetic. Whether this speeds things + * up or slows things down depends on the machine and the number + * being converted. If long long is available and the name is + * something other than "long long", #define Llong to be the name, + * and if "unsigned Llong" does not work as an unsigned version of + * Llong, #define #ULLong to be the corresponding unsigned type. + * #define KR_headers for old-style C function headers. + * #define Bad_float_h if your system lacks a float.h or if it does not + * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, + * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. + * #define MALLOC your_malloc, where your_malloc(n\) acts like malloc(n\) + * if memory is available and otherwise does something you deem + * appropriate. If MALLOC is undefined, malloc will be invoked + * directly -- and assumed always to succeed. + * #define Omit_Private_Memory to omit logic (added Jan. 1998\) for making + * memory allocations from a private pool of memory when possible. + * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, + * unless #defined to be a different length. This default length + * suffices to get rid of MALLOC calls except for unusual cases, + * such as decimal-to-binary conversion of a very long string of + * digits. The longest string dtoa can return is about 751 bytes + * long. For conversions by strtod of strings of 800 digits and + * all dtoa conversions in single-threaded executions with 8-byte + * pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte + * pointers, PRIVATE_MEM >= 7112 appears adequate. + * #define INFNAN_CHECK on IEEE systems to cause strtod to check for + * Infinity and NaN (case insensitively\). On some systems (e.g., + * some HP systems\), it may be necessary to #define NAN_WORD0 + * appropriately -- to the most significant word of a quiet NaN. + * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.\) + * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, + * strtod also accepts (case insensitively\) strings of the form + * NaN(x\), where x is a string of hexadecimal digits and spaces; + * if there is only one string of hexadecimal digits, it is taken + * for the 52 fraction bits of the resulting NaN; if there are two + * or more strings of hex digits, the first is for the high 20 bits, + * the second and subsequent for the low 32 bits, with intervening + * white space ignored; but if this results in none of the 52 + * fraction bits being on (an IEEE Infinity symbol\), then NAN_WORD0 + * and NAN_WORD1 are used instead. + * #define MULTIPLE_THREADS if the system offers preemptively scheduled + * multiple threads. In this case, you must provide (or suitably + * #define\) two locks, acquired by ACQUIRE_DTOA_LOCK(n\) and freed + * by FREE_DTOA_LOCK(n\) for n = 0 or 1. (The second lock, accessed + * in pow5mult, ensures lazy evaluation of only one copy of high + * powers of 5; omitting this lock would introduce a small + * probability of wasting memory, but would otherwise be harmless.\) + * You must also invoke freedtoa(s\) to free the value s returned by + * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. + * #define NO_IEEE_Scale to disable new (Feb. 1997\) logic in strtod that + * avoids underflows on inputs whose result does not underflow. + * If you #define NO_IEEE_Scale on a machine that uses IEEE-format + * floating-point numbers and flushes underflows to zero rather + * than implementing gradual underflow, then you must also #define + * Sudden_Underflow. + * #define YES_ALIAS to permit aliasing certain double values with + * arrays of ULongs. This leads to slightly better code with + * some compilers and was always used prior to 19990916, but it + * is not strictly legal and can cause trouble with aggressively + * optimizing compilers (e.g., gcc 2.95.1 under -O2\). + * #define USE_LOCALE to use the current locale's decimal_point value. + * #define SET_INEXACT if IEEE arithmetic is being used and extra + * computation should be done to set the inexact flag when the + * result is inexact and avoid setting inexact when the result + * is exact. In this case, dtoa.c must be compiled in + * an environment, perhaps provided by #include "dtoa.c" in a + * suitable wrapper, that defines two functions, + * int get_inexact(void\); + * void clear_inexact(void\); + * such that get_inexact(\) returns a nonzero value if the + * inexact bit is already set, and clear_inexact(\) sets the + * inexact bit to 0. When SET_INEXACT is #defined, strtod + * also does extra computations to set the underflow and overflow + * flags when appropriate (i.e., when the result is tiny and + * inexact or when it is a numeric value rounded to +-infinity\). + * #define NO_ERRNO if strtod should not assign errno = ERANGE when + * the result overflows to +-Infinity or underflows to 0. + */) + +preprocessor(#ifdef) ident(WORDS_BIGENDIAN) +preprocessor(#define) ident(IEEE_BIG_ENDIAN) +preprocessor(#else) +preprocessor(#define) ident(IEEE_LITTLE_ENDIAN) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__vax__) +preprocessor(#define) ident(VAX) +preprocessor(#undef) ident(IEEE_BIG_ENDIAN) +preprocessor(#undef) ident(IEEE_LITTLE_ENDIAN) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__arm__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__VFP_FP__)operator(\)) +preprocessor(#define) ident(IEEE_BIG_ENDIAN) +preprocessor(#undef) ident(IEEE_LITTLE_ENDIAN) +preprocessor(#endif) + +preprocessor(#undef) ident(Long) +preprocessor(#undef) ident(ULong) + +preprocessor(#if) ident(SIZEOF_INT) operator(==) integer(4) +preprocessor(#define) ident(Long) pre_type(int) +preprocessor(#define) ident(ULong) pre_type(unsigned) pre_type(int) +preprocessor(#elif) ident(SIZEOF_LONG) operator(==) integer(4) +preprocessor(#define) ident(Long) pre_type(long) pre_type(int) +preprocessor(#define) ident(ULong) pre_type(unsigned) pre_type(long) pre_type(int) +preprocessor(#endif) + +preprocessor(#if) ident(HAVE_LONG_LONG) +preprocessor(#define) ident(Llong) ident(LONG_LONG) +preprocessor(#endif) + +preprocessor(#ifdef) ident(DEBUG) +preprocessor(#include) include("stdio.h") +preprocessor(#define) ident(Bug)operator(()ident(x)operator(\)) operator({)ident(fprintf)operator(()ident(stderr)operator(,) string<delimiter(")content(%s)char(\\n)delimiter(")>operator(,) ident(x)operator(\);) ident(exit)operator(()integer(1)operator(\);}) +preprocessor(#endif) + +preprocessor(#include) include("stdlib.h") +preprocessor(#include) include("string.h") + +preprocessor(#ifdef) ident(USE_LOCALE) +preprocessor(#include) include("locale.h") +preprocessor(#endif) + +preprocessor(#ifdef) ident(MALLOC) +directive(extern) directive(void) operator(*)ident(MALLOC)operator(()ident(size_t)operator(\);) +preprocessor(#else) +preprocessor(#define) ident(MALLOC) ident(malloc) +preprocessor(#endif) + +preprocessor(#ifndef) ident(Omit_Private_Memory) +preprocessor(#ifndef) ident(PRIVATE_MEM) +preprocessor(#define) ident(PRIVATE_MEM) integer(2304) +preprocessor(#endif) +preprocessor(#define) ident(PRIVATE_mem) operator((()ident(PRIVATE_MEM)operator(+)reserved(sizeof)operator(()pre_type(double)operator(\)-)integer(1)operator(\))operator(/)reserved(sizeof)operator(()pre_type(double)operator(\)\)) +directive(static) pre_type(double) ident(private_mem)operator([)ident(PRIVATE_mem)operator(],) operator(*)ident(pmem_next) operator(=) ident(private_mem)operator(;) +preprocessor(#endif) + +preprocessor(#undef) ident(IEEE_Arith) +preprocessor(#undef) ident(Avoid_Underflow) +preprocessor(#ifdef) ident(IEEE_BIG_ENDIAN) +preprocessor(#define) ident(IEEE_Arith) +preprocessor(#endif) +preprocessor(#ifdef) ident(IEEE_LITTLE_ENDIAN) +preprocessor(#define) ident(IEEE_Arith) +preprocessor(#endif) + +preprocessor(#include) include("errno.h") + +preprocessor(#ifdef) ident(Bad_float_h) + +preprocessor(#ifdef) ident(IEEE_Arith) +preprocessor(#define) ident(DBL_DIG) integer(15) +preprocessor(#define) ident(DBL_MAX_10_EXP) integer(308) +preprocessor(#define) ident(DBL_MAX_EXP) integer(1024) +preprocessor(#define) ident(FLT_RADIX) integer(2) +preprocessor(#endif) comment(/*IEEE_Arith*/) + +preprocessor(#ifdef) ident(IBM) +preprocessor(#define) ident(DBL_DIG) integer(16) +preprocessor(#define) ident(DBL_MAX_10_EXP) integer(75) +preprocessor(#define) ident(DBL_MAX_EXP) integer(63) +preprocessor(#define) ident(FLT_RADIX) integer(16) +preprocessor(#define) ident(DBL_MAX) float(7)float(.2370055773322621e+75) +preprocessor(#endif) + +preprocessor(#ifdef) ident(VAX) +preprocessor(#define) ident(DBL_DIG) integer(16) +preprocessor(#define) ident(DBL_MAX_10_EXP) integer(38) +preprocessor(#define) ident(DBL_MAX_EXP) integer(127) +preprocessor(#define) ident(FLT_RADIX) integer(2) +preprocessor(#define) ident(DBL_MAX) float(1)float(.7014118346046923e+38) +preprocessor(#endif) + +preprocessor(#ifndef) ident(LONG_MAX) +preprocessor(#define) ident(LONG_MAX) integer(2147483647) +preprocessor(#endif) + +preprocessor(#else) comment(/* ifndef Bad_float_h */) +preprocessor(#include) include("float.h") +preprocessor(#endif) comment(/* Bad_float_h */) + +preprocessor(#ifndef) ident(__MATH_H__) +preprocessor(#include) include("math.h") +preprocessor(#endif) + +preprocessor(#ifdef) ident(__cplusplus) +directive(extern) string<delimiter(")content(C)delimiter(")> operator({) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(IEEE_LITTLE_ENDIAN)operator(\)) operator(+) ident(defined)operator(()ident(IEEE_BIG_ENDIAN)operator(\)) operator(+) ident(defined)operator(()ident(VAX)operator(\)) operator(+) ident(defined)operator(()ident(IBM)operator(\)) operator(!=) integer(1) +ident(Exactly) ident(one) ident(of) ident(IEEE_LITTLE_ENDIAN)operator(,) ident(IEEE_BIG_ENDIAN)operator(,) ident(VAX)operator(,) ident(or) ident(IBM) ident(should) ident(be) ident(defined)operator(.) +preprocessor(#endif) + +reserved(typedef) reserved(union) operator({) pre_type(double) ident(d)operator(;) ident(ULong) ident(L)operator([)integer(2)operator(];) operator(}) ident(U)operator(;) + +preprocessor(#ifdef) ident(YES_ALIAS) +preprocessor(#define) ident(dval)operator(()ident(x)operator(\)) ident(x) +preprocessor(#ifdef) ident(IEEE_LITTLE_ENDIAN) +preprocessor(#define) ident(word0)operator(()ident(x)operator(\)) operator((()ident(ULong) operator(*\)&)ident(x)operator(\)[)integer(1)operator(]) +preprocessor(#define) ident(word1)operator(()ident(x)operator(\)) operator((()ident(ULong) operator(*\)&)ident(x)operator(\)[)integer(0)operator(]) +preprocessor(#else) +preprocessor(#define) ident(word0)operator(()ident(x)operator(\)) operator((()ident(ULong) operator(*\)&)ident(x)operator(\)[)integer(0)operator(]) +preprocessor(#define) ident(word1)operator(()ident(x)operator(\)) operator((()ident(ULong) operator(*\)&)ident(x)operator(\)[)integer(1)operator(]) +preprocessor(#endif) +preprocessor(#else) +preprocessor(#ifdef) ident(IEEE_LITTLE_ENDIAN) +preprocessor(#define) ident(word0)operator(()ident(x)operator(\)) operator((()ident(U)operator(*\)&)ident(x)operator(\)->)ident(L)operator([)integer(1)operator(]) +preprocessor(#define) ident(word1)operator(()ident(x)operator(\)) operator((()ident(U)operator(*\)&)ident(x)operator(\)->)ident(L)operator([)integer(0)operator(]) +preprocessor(#else) +preprocessor(#define) ident(word0)operator(()ident(x)operator(\)) operator((()ident(U)operator(*\)&)ident(x)operator(\)->)ident(L)operator([)integer(0)operator(]) +preprocessor(#define) ident(word1)operator(()ident(x)operator(\)) operator((()ident(U)operator(*\)&)ident(x)operator(\)->)ident(L)operator([)integer(1)operator(]) +preprocessor(#endif) +preprocessor(#define) ident(dval)operator(()ident(x)operator(\)) operator((()ident(U)operator(*\)&)ident(x)operator(\)->)ident(d) +preprocessor(#endif) + +comment(/* The following definition of Storeinc is appropriate for MIPS processors. + * An alternative that might be better on some machines is + * #define Storeinc(a,b,c\) (*a++ = b << 16 | c & 0xffff\) + */) +preprocessor(#if) ident(defined)operator(()ident(IEEE_LITTLE_ENDIAN)operator(\)) operator(+) ident(defined)operator(()ident(VAX)operator(\)) operator(+) ident(defined)operator(()ident(__arm__)operator(\)) +preprocessor(#define) ident(Storeinc)operator(()ident(a)operator(,)ident(b)operator(,)ident(c)operator(\)) operator(((()pre_type(unsigned) pre_type(short) operator(*\))ident(a)operator(\)[)integer(1)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(short)operator(\))ident(b)operator(,) \ +operator((()pre_type(unsigned) pre_type(short) operator(*\))ident(a)operator(\)[)integer(0)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(short)operator(\))ident(c)operator(,) ident(a)operator(++\)) +preprocessor(#else) +preprocessor(#define) ident(Storeinc)operator(()ident(a)operator(,)ident(b)operator(,)ident(c)operator(\)) operator(((()pre_type(unsigned) pre_type(short) operator(*\))ident(a)operator(\)[)integer(0)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(short)operator(\))ident(b)operator(,) \ +operator((()pre_type(unsigned) pre_type(short) operator(*\))ident(a)operator(\)[)integer(1)operator(]) operator(=) operator(()pre_type(unsigned) pre_type(short)operator(\))ident(c)operator(,) ident(a)operator(++\)) +preprocessor(#endif) + +comment(/* #define P DBL_MANT_DIG */) +comment(/* Ten_pmax = floor(P*log(2\)/log(5\)\) */) +comment(/* Bletch = (highest power of 2 < DBL_MAX_10_EXP\) / 16 */) +comment(/* Quick_max = floor((P-1\)*log(FLT_RADIX\)/log(10\) - 1\) */) +comment(/* Int_max = floor(P*log(FLT_RADIX\)/log(10\) - 1\) */) + +preprocessor(#ifdef) ident(IEEE_Arith) +preprocessor(#define) ident(Exp_shift) integer(20) +preprocessor(#define) ident(Exp_shift1) integer(20) +preprocessor(#define) ident(Exp_msk1) hex(0x100000) +preprocessor(#define) ident(Exp_msk11) hex(0x100000) +preprocessor(#define) ident(Exp_mask) hex(0x7ff00000) +preprocessor(#define) ident(P) integer(53) +preprocessor(#define) ident(Bias) integer(1023) +preprocessor(#define) ident(Emin) operator((-)integer(1022)operator(\)) +preprocessor(#define) ident(Exp_1) hex(0x3ff00000) +preprocessor(#define) ident(Exp_11) hex(0x3ff00000) +preprocessor(#define) ident(Ebits) integer(11) +preprocessor(#define) ident(Frac_mask) hex(0xfffff) +preprocessor(#define) ident(Frac_mask1) hex(0xfffff) +preprocessor(#define) ident(Ten_pmax) integer(22) +preprocessor(#define) ident(Bletch) hex(0x10) +preprocessor(#define) ident(Bndry_mask) hex(0xfffff) +preprocessor(#define) ident(Bndry_mask1) hex(0xfffff) +preprocessor(#define) ident(LSB) integer(1) +preprocessor(#define) ident(Sign_bit) hex(0x80000000) +preprocessor(#define) ident(Log2P) integer(1) +preprocessor(#define) ident(Tiny0) integer(0) +preprocessor(#define) ident(Tiny1) integer(1) +preprocessor(#define) ident(Quick_max) integer(14) +preprocessor(#define) ident(Int_max) integer(14) +preprocessor(#ifndef) ident(NO_IEEE_Scale) +preprocessor(#define) ident(Avoid_Underflow) +preprocessor(#ifdef) ident(Flush_Denorm) comment(/* debugging option */) +preprocessor(#undef) ident(Sudden_Underflow) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#ifndef) ident(Flt_Rounds) +preprocessor(#ifdef) ident(FLT_ROUNDS) +preprocessor(#define) ident(Flt_Rounds) ident(FLT_ROUNDS) +preprocessor(#else) +preprocessor(#define) ident(Flt_Rounds) integer(1) +preprocessor(#endif) +preprocessor(#endif) comment(/*Flt_Rounds*/) + +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) +preprocessor(#define) ident(Rounding) ident(rounding) +preprocessor(#undef) ident(Check_FLT_ROUNDS) +preprocessor(#define) ident(Check_FLT_ROUNDS) +preprocessor(#else) +preprocessor(#define) ident(Rounding) ident(Flt_Rounds) +preprocessor(#endif) + +preprocessor(#else) comment(/* ifndef IEEE_Arith */) +preprocessor(#undef) ident(Check_FLT_ROUNDS) +preprocessor(#undef) ident(Honor_FLT_ROUNDS) +preprocessor(#undef) ident(SET_INEXACT) +preprocessor(#undef) ident(Sudden_Underflow) +preprocessor(#define) ident(Sudden_Underflow) +preprocessor(#ifdef) ident(IBM) +preprocessor(#undef) ident(Flt_Rounds) +preprocessor(#define) ident(Flt_Rounds) integer(0) +preprocessor(#define) ident(Exp_shift) integer(24) +preprocessor(#define) ident(Exp_shift1) integer(24) +preprocessor(#define) ident(Exp_msk1) hex(0x1000000) +preprocessor(#define) ident(Exp_msk11) hex(0x1000000) +preprocessor(#define) ident(Exp_mask) hex(0x7f000000) +preprocessor(#define) ident(P) integer(14) +preprocessor(#define) ident(Bias) integer(65) +preprocessor(#define) ident(Exp_1) hex(0x41000000) +preprocessor(#define) ident(Exp_11) hex(0x41000000) +preprocessor(#define) ident(Ebits) integer(8) comment(/* exponent has 7 bits, but 8 is the right value in b2d */) +preprocessor(#define) ident(Frac_mask) hex(0xffffff) +preprocessor(#define) ident(Frac_mask1) hex(0xffffff) +preprocessor(#define) ident(Bletch) integer(4) +preprocessor(#define) ident(Ten_pmax) integer(22) +preprocessor(#define) ident(Bndry_mask) hex(0xefffff) +preprocessor(#define) ident(Bndry_mask1) hex(0xffffff) +preprocessor(#define) ident(LSB) integer(1) +preprocessor(#define) ident(Sign_bit) hex(0x80000000) +preprocessor(#define) ident(Log2P) integer(4) +preprocessor(#define) ident(Tiny0) hex(0x100000) +preprocessor(#define) ident(Tiny1) integer(0) +preprocessor(#define) ident(Quick_max) integer(14) +preprocessor(#define) ident(Int_max) integer(15) +preprocessor(#else) comment(/* VAX */) +preprocessor(#undef) ident(Flt_Rounds) +preprocessor(#define) ident(Flt_Rounds) integer(1) +preprocessor(#define) ident(Exp_shift) integer(23) +preprocessor(#define) ident(Exp_shift1) integer(7) +preprocessor(#define) ident(Exp_msk1) hex(0x80) +preprocessor(#define) ident(Exp_msk11) hex(0x800000) +preprocessor(#define) ident(Exp_mask) hex(0x7f80) +preprocessor(#define) ident(P) integer(56) +preprocessor(#define) ident(Bias) integer(129) +preprocessor(#define) ident(Exp_1) hex(0x40800000) +preprocessor(#define) ident(Exp_11) hex(0x4080) +preprocessor(#define) ident(Ebits) integer(8) +preprocessor(#define) ident(Frac_mask) hex(0x7fffff) +preprocessor(#define) ident(Frac_mask1) hex(0xffff007f) +preprocessor(#define) ident(Ten_pmax) integer(24) +preprocessor(#define) ident(Bletch) integer(2) +preprocessor(#define) ident(Bndry_mask) hex(0xffff007f) +preprocessor(#define) ident(Bndry_mask1) hex(0xffff007f) +preprocessor(#define) ident(LSB) hex(0x10000) +preprocessor(#define) ident(Sign_bit) hex(0x8000) +preprocessor(#define) ident(Log2P) integer(1) +preprocessor(#define) ident(Tiny0) hex(0x80) +preprocessor(#define) ident(Tiny1) integer(0) +preprocessor(#define) ident(Quick_max) integer(15) +preprocessor(#define) ident(Int_max) integer(15) +preprocessor(#endif) comment(/* IBM, VAX */) +preprocessor(#endif) comment(/* IEEE_Arith */) + +preprocessor(#ifndef) ident(IEEE_Arith) +preprocessor(#define) ident(ROUND_BIASED) +preprocessor(#endif) + +preprocessor(#ifdef) ident(RND_PRODQUOT) +preprocessor(#define) ident(rounded_product)operator(()ident(a)operator(,)ident(b)operator(\)) ident(a) operator(=) ident(rnd_prod)operator(()ident(a)operator(,) ident(b)operator(\)) +preprocessor(#define) ident(rounded_quotient)operator(()ident(a)operator(,)ident(b)operator(\)) ident(a) operator(=) ident(rnd_quot)operator(()ident(a)operator(,) ident(b)operator(\)) +directive(extern) pre_type(double) ident(rnd_prod)operator(()pre_type(double)operator(,) pre_type(double)operator(\),) ident(rnd_quot)operator(()pre_type(double)operator(,) pre_type(double)operator(\);) +preprocessor(#else) +preprocessor(#define) ident(rounded_product)operator(()ident(a)operator(,)ident(b)operator(\)) ident(a) operator(*=) ident(b) +preprocessor(#define) ident(rounded_quotient)operator(()ident(a)operator(,)ident(b)operator(\)) ident(a) operator(/=) ident(b) +preprocessor(#endif) + +preprocessor(#define) ident(Big0) operator(()ident(Frac_mask1) operator(|) ident(Exp_msk1)operator(*()ident(DBL_MAX_EXP)operator(+)ident(Bias)operator(-)integer(1)operator(\)\)) +preprocessor(#define) ident(Big1) hex(0xffffffff) + +preprocessor(#ifndef) ident(Pack_32) +preprocessor(#define) ident(Pack_32) +preprocessor(#endif) + +preprocessor(#define) ident(FFFFFFFF) hex(0xffffffff)ident(UL) + +preprocessor(#ifdef) ident(NO_LONG_LONG) +preprocessor(#undef) ident(ULLong) +preprocessor(#ifdef) ident(Just_16) +preprocessor(#undef) ident(Pack_32) +comment(/* When Pack_32 is not defined, we store 16 bits per 32-bit Long. + * This makes some inner loops simpler and sometimes saves work + * during multiplications, but it often seems to make things slightly + * slower. Hence the default is now to store 32 bits per Long. + */) +preprocessor(#endif) +preprocessor(#else) comment(/* long long available */) +preprocessor(#ifndef) ident(Llong) +preprocessor(#define) ident(Llong) pre_type(long) pre_type(long) +preprocessor(#endif) +preprocessor(#ifndef) ident(ULLong) +preprocessor(#define) ident(ULLong) pre_type(unsigned) ident(Llong) +preprocessor(#endif) +preprocessor(#endif) comment(/* NO_LONG_LONG */) + +preprocessor(#ifndef) ident(MULTIPLE_THREADS) +preprocessor(#define) ident(ACQUIRE_DTOA_LOCK)operator(()ident(n)operator(\)) comment(/*nothing*/) +preprocessor(#define) ident(FREE_DTOA_LOCK)operator(()ident(n)operator(\)) comment(/*nothing*/) +preprocessor(#endif) + +preprocessor(#define) ident(Kmax) integer(15) + +reserved(struct) ident(Bigint) operator({) + reserved(struct) ident(Bigint) operator(*)ident(next)operator(;) + pre_type(int) ident(k)operator(,) ident(maxwds)operator(,) ident(sign)operator(,) ident(wds)operator(;) + ident(ULong) ident(x)operator([)integer(1)operator(];) +operator(};) + +reserved(typedef) reserved(struct) ident(Bigint) ident(Bigint)operator(;) + +directive(static) ident(Bigint) operator(*)ident(freelist)operator([)ident(Kmax)operator(+)integer(1)operator(];) + +directive(static) ident(Bigint) operator(*) +ident(Balloc)operator(()pre_type(int) ident(k)operator(\)) +operator({) + pre_type(int) ident(x)operator(;) + ident(Bigint) operator(*)ident(rv)operator(;) +preprocessor(#ifndef) ident(Omit_Private_Memory) + pre_type(unsigned) pre_type(int) ident(len)operator(;) +preprocessor(#endif) + + ident(ACQUIRE_DTOA_LOCK)operator(()integer(0)operator(\);) + reserved(if) operator((()ident(rv) operator(=) ident(freelist)operator([)ident(k)operator(]\)) operator(!=) integer(0)operator(\)) operator({) + ident(freelist)operator([)ident(k)operator(]) operator(=) ident(rv)operator(->)ident(next)operator(;) + operator(}) + reserved(else) operator({) + ident(x) operator(=) integer(1) operator(<<) ident(k)operator(;) +preprocessor(#ifdef) ident(Omit_Private_Memory) + ident(rv) operator(=) operator(()ident(Bigint) operator(*\))ident(MALLOC)operator(()reserved(sizeof)operator(()ident(Bigint)operator(\)) operator(+) operator(()ident(x)operator(-)integer(1)operator(\)*)reserved(sizeof)operator(()ident(ULong)operator(\)\);) +preprocessor(#else) + ident(len) operator(=) operator(()reserved(sizeof)operator(()ident(Bigint)operator(\)) operator(+) operator(()ident(x)operator(-)integer(1)operator(\)*)reserved(sizeof)operator(()ident(ULong)operator(\)) operator(+) reserved(sizeof)operator(()pre_type(double)operator(\)) operator(-) integer(1)operator(\)) + operator(/)reserved(sizeof)operator(()pre_type(double)operator(\);) + reserved(if) operator(()ident(pmem_next) operator(-) ident(private_mem) operator(+) ident(len) operator(<=) ident(PRIVATE_mem)operator(\)) operator({) + ident(rv) operator(=) operator(()ident(Bigint)operator(*\))ident(pmem_next)operator(;) + ident(pmem_next) operator(+=) ident(len)operator(;) + operator(}) + reserved(else) + ident(rv) operator(=) operator(()ident(Bigint)operator(*\))ident(MALLOC)operator(()ident(len)operator(*)reserved(sizeof)operator(()pre_type(double)operator(\)\);) +preprocessor(#endif) + ident(rv)operator(->)ident(k) operator(=) ident(k)operator(;) + ident(rv)operator(->)ident(maxwds) operator(=) ident(x)operator(;) + operator(}) + ident(FREE_DTOA_LOCK)operator(()integer(0)operator(\);) + ident(rv)operator(->)ident(sign) operator(=) ident(rv)operator(->)ident(wds) operator(=) integer(0)operator(;) + reserved(return) ident(rv)operator(;) +operator(}) + +directive(static) directive(void) +ident(Bfree)operator(()ident(Bigint) operator(*)ident(v)operator(\)) +operator({) + reserved(if) operator(()ident(v)operator(\)) operator({) + ident(ACQUIRE_DTOA_LOCK)operator(()integer(0)operator(\);) + ident(v)operator(->)ident(next) operator(=) ident(freelist)operator([)ident(v)operator(->)ident(k)operator(];) + ident(freelist)operator([)ident(v)operator(->)ident(k)operator(]) operator(=) ident(v)operator(;) + ident(FREE_DTOA_LOCK)operator(()integer(0)operator(\);) + operator(}) +operator(}) + +preprocessor(#define) ident(Bcopy)operator(()ident(x)operator(,)ident(y)operator(\)) ident(memcpy)operator((()pre_type(char) operator(*\)&)ident(x)operator(->)ident(sign)operator(,) operator(()pre_type(char) operator(*\)&)ident(y)operator(->)ident(sign)operator(,) \ +ident(y)operator(->)ident(wds)operator(*)reserved(sizeof)operator(()ident(Long)operator(\)) operator(+) integer(2)operator(*)reserved(sizeof)operator(()pre_type(int)operator(\)\)) + +directive(static) ident(Bigint) operator(*) +ident(multadd)operator(()ident(Bigint) operator(*)ident(b)operator(,) pre_type(int) ident(m)operator(,) pre_type(int) ident(a)operator(\)) comment(/* multiply by m and add a */) +operator({) + pre_type(int) ident(i)operator(,) ident(wds)operator(;) +preprocessor(#ifdef) ident(ULLong) + ident(ULong) operator(*)ident(x)operator(;) + ident(ULLong) ident(carry)operator(,) ident(y)operator(;) +preprocessor(#else) + ident(ULong) ident(carry)operator(,) operator(*)ident(x)operator(,) ident(y)operator(;) +preprocessor(#ifdef) ident(Pack_32) + ident(ULong) ident(xi)operator(,) ident(z)operator(;) +preprocessor(#endif) +preprocessor(#endif) + ident(Bigint) operator(*)ident(b1)operator(;) + + ident(wds) operator(=) ident(b)operator(->)ident(wds)operator(;) + ident(x) operator(=) ident(b)operator(->)ident(x)operator(;) + ident(i) operator(=) integer(0)operator(;) + ident(carry) operator(=) ident(a)operator(;) + reserved(do) operator({) +preprocessor(#ifdef) ident(ULLong) + ident(y) operator(=) operator(*)ident(x) operator(*) operator(()ident(ULLong)operator(\))ident(m) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(y) operator(>>) integer(32)operator(;) + operator(*)ident(x)operator(++) operator(=) ident(y) operator(&) ident(FFFFFFFF)operator(;) +preprocessor(#else) +preprocessor(#ifdef) ident(Pack_32) + ident(xi) operator(=) operator(*)ident(x)operator(;) + ident(y) operator(=) operator(()ident(xi) operator(&) hex(0xffff)operator(\)) operator(*) ident(m) operator(+) ident(carry)operator(;) + ident(z) operator(=) operator(()ident(xi) operator(>>) integer(16)operator(\)) operator(*) ident(m) operator(+) operator(()ident(y) operator(>>) integer(16)operator(\);) + ident(carry) operator(=) ident(z) operator(>>) integer(16)operator(;) + operator(*)ident(x)operator(++) operator(=) operator(()ident(z) operator(<<) integer(16)operator(\)) operator(+) operator(()ident(y) operator(&) hex(0xffff)operator(\);) +preprocessor(#else) + ident(y) operator(=) operator(*)ident(x) operator(*) ident(m) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(y) operator(>>) integer(16)operator(;) + operator(*)ident(x)operator(++) operator(=) ident(y) operator(&) hex(0xffff)operator(;) +preprocessor(#endif) +preprocessor(#endif) + operator(}) reserved(while) operator((++)ident(i) operator(<) ident(wds)operator(\);) + reserved(if) operator(()ident(carry)operator(\)) operator({) + reserved(if) operator(()ident(wds) operator(>=) ident(b)operator(->)ident(maxwds)operator(\)) operator({) + ident(b1) operator(=) ident(Balloc)operator(()ident(b)operator(->)ident(k)operator(+)integer(1)operator(\);) + ident(Bcopy)operator(()ident(b1)operator(,) ident(b)operator(\);) + ident(Bfree)operator(()ident(b)operator(\);) + ident(b) operator(=) ident(b1)operator(;) + operator(}) + ident(b)operator(->)ident(x)operator([)ident(wds)operator(++]) operator(=) ident(carry)operator(;) + ident(b)operator(->)ident(wds) operator(=) ident(wds)operator(;) + operator(}) + reserved(return) ident(b)operator(;) +operator(}) + +directive(static) ident(Bigint) operator(*) +ident(s2b)operator(()directive(const) pre_type(char) operator(*)ident(s)operator(,) pre_type(int) ident(nd0)operator(,) pre_type(int) ident(nd)operator(,) ident(ULong) ident(y9)operator(\)) +operator({) + ident(Bigint) operator(*)ident(b)operator(;) + pre_type(int) ident(i)operator(,) ident(k)operator(;) + ident(Long) ident(x)operator(,) ident(y)operator(;) + + ident(x) operator(=) operator(()ident(nd) operator(+) integer(8)operator(\)) operator(/) integer(9)operator(;) + reserved(for) operator(()ident(k) operator(=) integer(0)operator(,) ident(y) operator(=) integer(1)operator(;) ident(x) operator(>) ident(y)operator(;) ident(y) operator(<<=) integer(1)operator(,) ident(k)operator(++\)) operator(;) +preprocessor(#ifdef) ident(Pack_32) + ident(b) operator(=) ident(Balloc)operator(()ident(k)operator(\);) + ident(b)operator(->)ident(x)operator([)integer(0)operator(]) operator(=) ident(y9)operator(;) + ident(b)operator(->)ident(wds) operator(=) integer(1)operator(;) +preprocessor(#else) + ident(b) operator(=) ident(Balloc)operator(()ident(k)operator(+)integer(1)operator(\);) + ident(b)operator(->)ident(x)operator([)integer(0)operator(]) operator(=) ident(y9) operator(&) hex(0xffff)operator(;) + ident(b)operator(->)ident(wds) operator(=) operator(()ident(b)operator(->)ident(x)operator([)integer(1)operator(]) operator(=) ident(y9) operator(>>) integer(16)operator(\)) operator(?) integer(2) operator(:) integer(1)operator(;) +preprocessor(#endif) + + ident(i) operator(=) integer(9)operator(;) + reserved(if) operator(()integer(9) operator(<) ident(nd0)operator(\)) operator({) + ident(s) operator(+=) integer(9)operator(;) + reserved(do) operator({) + ident(b) operator(=) ident(multadd)operator(()ident(b)operator(,) integer(10)operator(,) operator(*)ident(s)operator(++) operator(-) char('0')operator(\);) + operator(}) reserved(while) operator((++)ident(i) operator(<) ident(nd0)operator(\);) + ident(s)operator(++;) + operator(}) + reserved(else) + ident(s) operator(+=) integer(10)operator(;) + reserved(for) operator((;) ident(i) operator(<) ident(nd)operator(;) ident(i)operator(++\)) + ident(b) operator(=) ident(multadd)operator(()ident(b)operator(,) integer(10)operator(,) operator(*)ident(s)operator(++) operator(-) char('0')operator(\);) + reserved(return) ident(b)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(hi0bits)operator(()directive(register) ident(ULong) ident(x)operator(\)) +operator({) + directive(register) pre_type(int) ident(k) operator(=) integer(0)operator(;) + + reserved(if) operator((!()ident(x) operator(&) hex(0xffff0000)operator(\)\)) operator({) + ident(k) operator(=) integer(16)operator(;) + ident(x) operator(<<=) integer(16)operator(;) + operator(}) + reserved(if) operator((!()ident(x) operator(&) hex(0xff000000)operator(\)\)) operator({) + ident(k) operator(+=) integer(8)operator(;) + ident(x) operator(<<=) integer(8)operator(;) + operator(}) + reserved(if) operator((!()ident(x) operator(&) hex(0xf0000000)operator(\)\)) operator({) + ident(k) operator(+=) integer(4)operator(;) + ident(x) operator(<<=) integer(4)operator(;) + operator(}) + reserved(if) operator((!()ident(x) operator(&) hex(0xc0000000)operator(\)\)) operator({) + ident(k) operator(+=) integer(2)operator(;) + ident(x) operator(<<=) integer(2)operator(;) + operator(}) + reserved(if) operator((!()ident(x) operator(&) hex(0x80000000)operator(\)\)) operator({) + ident(k)operator(++;) + reserved(if) operator((!()ident(x) operator(&) hex(0x40000000)operator(\)\)) + reserved(return) integer(32)operator(;) + operator(}) + reserved(return) ident(k)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(lo0bits)operator(()ident(ULong) operator(*)ident(y)operator(\)) +operator({) + directive(register) pre_type(int) ident(k)operator(;) + directive(register) ident(ULong) ident(x) operator(=) operator(*)ident(y)operator(;) + + reserved(if) operator(()ident(x) operator(&) integer(7)operator(\)) operator({) + reserved(if) operator(()ident(x) operator(&) integer(1)operator(\)) + reserved(return) integer(0)operator(;) + reserved(if) operator(()ident(x) operator(&) integer(2)operator(\)) operator({) + operator(*)ident(y) operator(=) ident(x) operator(>>) integer(1)operator(;) + reserved(return) integer(1)operator(;) + operator(}) + operator(*)ident(y) operator(=) ident(x) operator(>>) integer(2)operator(;) + reserved(return) integer(2)operator(;) + operator(}) + ident(k) operator(=) integer(0)operator(;) + reserved(if) operator((!()ident(x) operator(&) hex(0xffff)operator(\)\)) operator({) + ident(k) operator(=) integer(16)operator(;) + ident(x) operator(>>=) integer(16)operator(;) + operator(}) + reserved(if) operator((!()ident(x) operator(&) hex(0xff)operator(\)\)) operator({) + ident(k) operator(+=) integer(8)operator(;) + ident(x) operator(>>=) integer(8)operator(;) + operator(}) + reserved(if) operator((!()ident(x) operator(&) hex(0xf)operator(\)\)) operator({) + ident(k) operator(+=) integer(4)operator(;) + ident(x) operator(>>=) integer(4)operator(;) + operator(}) + reserved(if) operator((!()ident(x) operator(&) hex(0x3)operator(\)\)) operator({) + ident(k) operator(+=) integer(2)operator(;) + ident(x) operator(>>=) integer(2)operator(;) + operator(}) + reserved(if) operator((!()ident(x) operator(&) integer(1)operator(\)\)) operator({) + ident(k)operator(++;) + ident(x) operator(>>=) integer(1)operator(;) + reserved(if) operator((!)ident(x)operator(\)) + reserved(return) integer(32)operator(;) + operator(}) + operator(*)ident(y) operator(=) ident(x)operator(;) + reserved(return) ident(k)operator(;) +operator(}) + +directive(static) ident(Bigint) operator(*) +ident(i2b)operator(()pre_type(int) ident(i)operator(\)) +operator({) + ident(Bigint) operator(*)ident(b)operator(;) + + ident(b) operator(=) ident(Balloc)operator(()integer(1)operator(\);) + ident(b)operator(->)ident(x)operator([)integer(0)operator(]) operator(=) ident(i)operator(;) + ident(b)operator(->)ident(wds) operator(=) integer(1)operator(;) + reserved(return) ident(b)operator(;) +operator(}) + +directive(static) ident(Bigint) operator(*) +ident(mult)operator(()ident(Bigint) operator(*)ident(a)operator(,) ident(Bigint) operator(*)ident(b)operator(\)) +operator({) + ident(Bigint) operator(*)ident(c)operator(;) + pre_type(int) ident(k)operator(,) ident(wa)operator(,) ident(wb)operator(,) ident(wc)operator(;) + ident(ULong) operator(*)ident(x)operator(,) operator(*)ident(xa)operator(,) operator(*)ident(xae)operator(,) operator(*)ident(xb)operator(,) operator(*)ident(xbe)operator(,) operator(*)ident(xc)operator(,) operator(*)ident(xc0)operator(;) + ident(ULong) ident(y)operator(;) +preprocessor(#ifdef) ident(ULLong) + ident(ULLong) ident(carry)operator(,) ident(z)operator(;) +preprocessor(#else) + ident(ULong) ident(carry)operator(,) ident(z)operator(;) +preprocessor(#ifdef) ident(Pack_32) + ident(ULong) ident(z2)operator(;) +preprocessor(#endif) +preprocessor(#endif) + + reserved(if) operator(()ident(a)operator(->)ident(wds) operator(<) ident(b)operator(->)ident(wds)operator(\)) operator({) + ident(c) operator(=) ident(a)operator(;) + ident(a) operator(=) ident(b)operator(;) + ident(b) operator(=) ident(c)operator(;) + operator(}) + ident(k) operator(=) ident(a)operator(->)ident(k)operator(;) + ident(wa) operator(=) ident(a)operator(->)ident(wds)operator(;) + ident(wb) operator(=) ident(b)operator(->)ident(wds)operator(;) + ident(wc) operator(=) ident(wa) operator(+) ident(wb)operator(;) + reserved(if) operator(()ident(wc) operator(>) ident(a)operator(->)ident(maxwds)operator(\)) + ident(k)operator(++;) + ident(c) operator(=) ident(Balloc)operator(()ident(k)operator(\);) + reserved(for) operator(()ident(x) operator(=) ident(c)operator(->)ident(x)operator(,) ident(xa) operator(=) ident(x) operator(+) ident(wc)operator(;) ident(x) operator(<) ident(xa)operator(;) ident(x)operator(++\)) + operator(*)ident(x) operator(=) integer(0)operator(;) + ident(xa) operator(=) ident(a)operator(->)ident(x)operator(;) + ident(xae) operator(=) ident(xa) operator(+) ident(wa)operator(;) + ident(xb) operator(=) ident(b)operator(->)ident(x)operator(;) + ident(xbe) operator(=) ident(xb) operator(+) ident(wb)operator(;) + ident(xc0) operator(=) ident(c)operator(->)ident(x)operator(;) +preprocessor(#ifdef) ident(ULLong) + reserved(for) operator((;) ident(xb) operator(<) ident(xbe)operator(;) ident(xc0)operator(++\)) operator({) + reserved(if) operator((()ident(y) operator(=) operator(*)ident(xb)operator(++\)) operator(!=) integer(0)operator(\)) operator({) + ident(x) operator(=) ident(xa)operator(;) + ident(xc) operator(=) ident(xc0)operator(;) + ident(carry) operator(=) integer(0)operator(;) + reserved(do) operator({) + ident(z) operator(=) operator(*)ident(x)operator(++) operator(*) operator(()ident(ULLong)operator(\))ident(y) operator(+) operator(*)ident(xc) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(z) operator(>>) integer(32)operator(;) + operator(*)ident(xc)operator(++) operator(=) ident(z) operator(&) ident(FFFFFFFF)operator(;) + operator(}) reserved(while) operator(()ident(x) operator(<) ident(xae)operator(\);) + operator(*)ident(xc) operator(=) ident(carry)operator(;) + operator(}) + operator(}) +preprocessor(#else) +preprocessor(#ifdef) ident(Pack_32) + reserved(for) operator((;) ident(xb) operator(<) ident(xbe)operator(;) ident(xb)operator(++,) ident(xc0)operator(++\)) operator({) + reserved(if) operator(()ident(y) operator(=) operator(*)ident(xb) operator(&) hex(0xffff)operator(\)) operator({) + ident(x) operator(=) ident(xa)operator(;) + ident(xc) operator(=) ident(xc0)operator(;) + ident(carry) operator(=) integer(0)operator(;) + reserved(do) operator({) + ident(z) operator(=) operator((*)ident(x) operator(&) hex(0xffff)operator(\)) operator(*) ident(y) operator(+) operator((*)ident(xc) operator(&) hex(0xffff)operator(\)) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(z) operator(>>) integer(16)operator(;) + ident(z2) operator(=) operator((*)ident(x)operator(++) operator(>>) integer(16)operator(\)) operator(*) ident(y) operator(+) operator((*)ident(xc) operator(>>) integer(16)operator(\)) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(z2) operator(>>) integer(16)operator(;) + ident(Storeinc)operator(()ident(xc)operator(,) ident(z2)operator(,) ident(z)operator(\);) + operator(}) reserved(while) operator(()ident(x) operator(<) ident(xae)operator(\);) + operator(*)ident(xc) operator(=) ident(carry)operator(;) + operator(}) + reserved(if) operator(()ident(y) operator(=) operator(*)ident(xb) operator(>>) integer(16)operator(\)) operator({) + ident(x) operator(=) ident(xa)operator(;) + ident(xc) operator(=) ident(xc0)operator(;) + ident(carry) operator(=) integer(0)operator(;) + ident(z2) operator(=) operator(*)ident(xc)operator(;) + reserved(do) operator({) + ident(z) operator(=) operator((*)ident(x) operator(&) hex(0xffff)operator(\)) operator(*) ident(y) operator(+) operator((*)ident(xc) operator(>>) integer(16)operator(\)) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(z) operator(>>) integer(16)operator(;) + ident(Storeinc)operator(()ident(xc)operator(,) ident(z)operator(,) ident(z2)operator(\);) + ident(z2) operator(=) operator((*)ident(x)operator(++) operator(>>) integer(16)operator(\)) operator(*) ident(y) operator(+) operator((*)ident(xc) operator(&) hex(0xffff)operator(\)) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(z2) operator(>>) integer(16)operator(;) + operator(}) reserved(while) operator(()ident(x) operator(<) ident(xae)operator(\);) + operator(*)ident(xc) operator(=) ident(z2)operator(;) + operator(}) + operator(}) +preprocessor(#else) + reserved(for) operator((;) ident(xb) operator(<) ident(xbe)operator(;) ident(xc0)operator(++\)) operator({) + reserved(if) operator(()ident(y) operator(=) operator(*)ident(xb)operator(++\)) operator({) + ident(x) operator(=) ident(xa)operator(;) + ident(xc) operator(=) ident(xc0)operator(;) + ident(carry) operator(=) integer(0)operator(;) + reserved(do) operator({) + ident(z) operator(=) operator(*)ident(x)operator(++) operator(*) ident(y) operator(+) operator(*)ident(xc) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(z) operator(>>) integer(16)operator(;) + operator(*)ident(xc)operator(++) operator(=) ident(z) operator(&) hex(0xffff)operator(;) + operator(}) reserved(while) operator(()ident(x) operator(<) ident(xae)operator(\);) + operator(*)ident(xc) operator(=) ident(carry)operator(;) + operator(}) + operator(}) +preprocessor(#endif) +preprocessor(#endif) + reserved(for) operator(()ident(xc0) operator(=) ident(c)operator(->)ident(x)operator(,) ident(xc) operator(=) ident(xc0) operator(+) ident(wc)operator(;) ident(wc) operator(>) integer(0) operator(&&) operator(!*--)ident(xc)operator(;) operator(--)ident(wc)operator(\)) operator(;) + ident(c)operator(->)ident(wds) operator(=) ident(wc)operator(;) + reserved(return) ident(c)operator(;) +operator(}) + +directive(static) ident(Bigint) operator(*)ident(p5s)operator(;) + +directive(static) ident(Bigint) operator(*) +ident(pow5mult)operator(()ident(Bigint) operator(*)ident(b)operator(,) pre_type(int) ident(k)operator(\)) +operator({) + ident(Bigint) operator(*)ident(b1)operator(,) operator(*)ident(p5)operator(,) operator(*)ident(p51)operator(;) + pre_type(int) ident(i)operator(;) + directive(static) pre_type(int) ident(p05)operator([)integer(3)operator(]) operator(=) operator({) integer(5)operator(,) integer(25)operator(,) integer(125) operator(};) + + reserved(if) operator((()ident(i) operator(=) ident(k) operator(&) integer(3)operator(\)) operator(!=) integer(0)operator(\)) + ident(b) operator(=) ident(multadd)operator(()ident(b)operator(,) ident(p05)operator([)ident(i)operator(-)integer(1)operator(],) integer(0)operator(\);) + + reserved(if) operator((!()ident(k) operator(>>=) integer(2)operator(\)\)) + reserved(return) ident(b)operator(;) + reserved(if) operator((!()ident(p5) operator(=) ident(p5s)operator(\)\)) operator({) + comment(/* first time */) +preprocessor(#ifdef) ident(MULTIPLE_THREADS) + ident(ACQUIRE_DTOA_LOCK)operator(()integer(1)operator(\);) + reserved(if) operator((!()ident(p5) operator(=) ident(p5s)operator(\)\)) operator({) + ident(p5) operator(=) ident(p5s) operator(=) ident(i2b)operator(()integer(625)operator(\);) + ident(p5)operator(->)ident(next) operator(=) integer(0)operator(;) + operator(}) + ident(FREE_DTOA_LOCK)operator(()integer(1)operator(\);) +preprocessor(#else) + ident(p5) operator(=) ident(p5s) operator(=) ident(i2b)operator(()integer(625)operator(\);) + ident(p5)operator(->)ident(next) operator(=) integer(0)operator(;) +preprocessor(#endif) + operator(}) + reserved(for) operator((;;\)) operator({) + reserved(if) operator(()ident(k) operator(&) integer(1)operator(\)) operator({) + ident(b1) operator(=) ident(mult)operator(()ident(b)operator(,) ident(p5)operator(\);) + ident(Bfree)operator(()ident(b)operator(\);) + ident(b) operator(=) ident(b1)operator(;) + operator(}) + reserved(if) operator((!()ident(k) operator(>>=) integer(1)operator(\)\)) + reserved(break)operator(;) + reserved(if) operator((!()ident(p51) operator(=) ident(p5)operator(->)ident(next)operator(\)\)) operator({) +preprocessor(#ifdef) ident(MULTIPLE_THREADS) + ident(ACQUIRE_DTOA_LOCK)operator(()integer(1)operator(\);) + reserved(if) operator((!()ident(p51) operator(=) ident(p5)operator(->)ident(next)operator(\)\)) operator({) + ident(p51) operator(=) ident(p5)operator(->)ident(next) operator(=) ident(mult)operator(()ident(p5)operator(,)ident(p5)operator(\);) + ident(p51)operator(->)ident(next) operator(=) integer(0)operator(;) + operator(}) + ident(FREE_DTOA_LOCK)operator(()integer(1)operator(\);) +preprocessor(#else) + ident(p51) operator(=) ident(p5)operator(->)ident(next) operator(=) ident(mult)operator(()ident(p5)operator(,)ident(p5)operator(\);) + ident(p51)operator(->)ident(next) operator(=) integer(0)operator(;) +preprocessor(#endif) + operator(}) + ident(p5) operator(=) ident(p51)operator(;) + operator(}) + reserved(return) ident(b)operator(;) +operator(}) + +directive(static) ident(Bigint) operator(*) +ident(lshift)operator(()ident(Bigint) operator(*)ident(b)operator(,) pre_type(int) ident(k)operator(\)) +operator({) + pre_type(int) ident(i)operator(,) ident(k1)operator(,) ident(n)operator(,) ident(n1)operator(;) + ident(Bigint) operator(*)ident(b1)operator(;) + ident(ULong) operator(*)ident(x)operator(,) operator(*)ident(x1)operator(,) operator(*)ident(xe)operator(,) ident(z)operator(;) + +preprocessor(#ifdef) ident(Pack_32) + ident(n) operator(=) ident(k) operator(>>) integer(5)operator(;) +preprocessor(#else) + ident(n) operator(=) ident(k) operator(>>) integer(4)operator(;) +preprocessor(#endif) + ident(k1) operator(=) ident(b)operator(->)ident(k)operator(;) + ident(n1) operator(=) ident(n) operator(+) ident(b)operator(->)ident(wds) operator(+) integer(1)operator(;) + reserved(for) operator(()ident(i) operator(=) ident(b)operator(->)ident(maxwds)operator(;) ident(n1) operator(>) ident(i)operator(;) ident(i) operator(<<=) integer(1)operator(\)) + ident(k1)operator(++;) + ident(b1) operator(=) ident(Balloc)operator(()ident(k1)operator(\);) + ident(x1) operator(=) ident(b1)operator(->)ident(x)operator(;) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(n)operator(;) ident(i)operator(++\)) + operator(*)ident(x1)operator(++) operator(=) integer(0)operator(;) + ident(x) operator(=) ident(b)operator(->)ident(x)operator(;) + ident(xe) operator(=) ident(x) operator(+) ident(b)operator(->)ident(wds)operator(;) +preprocessor(#ifdef) ident(Pack_32) + reserved(if) operator(()ident(k) operator(&=) hex(0x1f)operator(\)) operator({) + ident(k1) operator(=) integer(32) operator(-) ident(k)operator(;) + ident(z) operator(=) integer(0)operator(;) + reserved(do) operator({) + operator(*)ident(x1)operator(++) operator(=) operator(*)ident(x) operator(<<) ident(k) operator(|) ident(z)operator(;) + ident(z) operator(=) operator(*)ident(x)operator(++) operator(>>) ident(k1)operator(;) + operator(}) reserved(while) operator(()ident(x) operator(<) ident(xe)operator(\);) + reserved(if) operator(((*)ident(x1) operator(=) ident(z)operator(\)) operator(!=) integer(0)operator(\)) + operator(++)ident(n1)operator(;) + operator(}) +preprocessor(#else) + reserved(if) operator(()ident(k) operator(&=) hex(0xf)operator(\)) operator({) + ident(k1) operator(=) integer(16) operator(-) ident(k)operator(;) + ident(z) operator(=) integer(0)operator(;) + reserved(do) operator({) + operator(*)ident(x1)operator(++) operator(=) operator(*)ident(x) operator(<<) ident(k) operator(&) hex(0xffff) operator(|) ident(z)operator(;) + ident(z) operator(=) operator(*)ident(x)operator(++) operator(>>) ident(k1)operator(;) + operator(}) reserved(while) operator(()ident(x) operator(<) ident(xe)operator(\);) + reserved(if) operator((*)ident(x1) operator(=) ident(z)operator(\)) + operator(++)ident(n1)operator(;) + operator(}) +preprocessor(#endif) + reserved(else) + reserved(do) operator({) + operator(*)ident(x1)operator(++) operator(=) operator(*)ident(x)operator(++;) + operator(}) reserved(while) operator(()ident(x) operator(<) ident(xe)operator(\);) + ident(b1)operator(->)ident(wds) operator(=) ident(n1) operator(-) integer(1)operator(;) + ident(Bfree)operator(()ident(b)operator(\);) + reserved(return) ident(b1)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(cmp)operator(()ident(Bigint) operator(*)ident(a)operator(,) ident(Bigint) operator(*)ident(b)operator(\)) +operator({) + ident(ULong) operator(*)ident(xa)operator(,) operator(*)ident(xa0)operator(,) operator(*)ident(xb)operator(,) operator(*)ident(xb0)operator(;) + pre_type(int) ident(i)operator(,) ident(j)operator(;) + + ident(i) operator(=) ident(a)operator(->)ident(wds)operator(;) + ident(j) operator(=) ident(b)operator(->)ident(wds)operator(;) +preprocessor(#ifdef) ident(DEBUG) + reserved(if) operator(()ident(i) operator(>) integer(1) operator(&&) operator(!)ident(a)operator(->)ident(x)operator([)ident(i)operator(-)integer(1)operator(]\)) + ident(Bug)operator(()string<delimiter(")content(cmp called with a->x[a->wds-1] == 0)delimiter(")>operator(\);) + reserved(if) operator(()ident(j) operator(>) integer(1) operator(&&) operator(!)ident(b)operator(->)ident(x)operator([)ident(j)operator(-)integer(1)operator(]\)) + ident(Bug)operator(()string<delimiter(")content(cmp called with b->x[b->wds-1] == 0)delimiter(")>operator(\);) +preprocessor(#endif) + reserved(if) operator(()ident(i) operator(-=) ident(j)operator(\)) + reserved(return) ident(i)operator(;) + ident(xa0) operator(=) ident(a)operator(->)ident(x)operator(;) + ident(xa) operator(=) ident(xa0) operator(+) ident(j)operator(;) + ident(xb0) operator(=) ident(b)operator(->)ident(x)operator(;) + ident(xb) operator(=) ident(xb0) operator(+) ident(j)operator(;) + reserved(for) operator((;;\)) operator({) + reserved(if) operator((*--)ident(xa) operator(!=) operator(*--)ident(xb)operator(\)) + reserved(return) operator(*)ident(xa) operator(<) operator(*)ident(xb) operator(?) operator(-)integer(1) operator(:) integer(1)operator(;) + reserved(if) operator(()ident(xa) operator(<=) ident(xa0)operator(\)) + reserved(break)operator(;) + operator(}) + reserved(return) integer(0)operator(;) +operator(}) + +directive(static) ident(Bigint) operator(*) +ident(diff)operator(()ident(Bigint) operator(*)ident(a)operator(,) ident(Bigint) operator(*)ident(b)operator(\)) +operator({) + ident(Bigint) operator(*)ident(c)operator(;) + pre_type(int) ident(i)operator(,) ident(wa)operator(,) ident(wb)operator(;) + ident(ULong) operator(*)ident(xa)operator(,) operator(*)ident(xae)operator(,) operator(*)ident(xb)operator(,) operator(*)ident(xbe)operator(,) operator(*)ident(xc)operator(;) +preprocessor(#ifdef) ident(ULLong) + ident(ULLong) ident(borrow)operator(,) ident(y)operator(;) +preprocessor(#else) + ident(ULong) ident(borrow)operator(,) ident(y)operator(;) +preprocessor(#ifdef) ident(Pack_32) + ident(ULong) ident(z)operator(;) +preprocessor(#endif) +preprocessor(#endif) + + ident(i) operator(=) ident(cmp)operator(()ident(a)operator(,)ident(b)operator(\);) + reserved(if) operator((!)ident(i)operator(\)) operator({) + ident(c) operator(=) ident(Balloc)operator(()integer(0)operator(\);) + ident(c)operator(->)ident(wds) operator(=) integer(1)operator(;) + ident(c)operator(->)ident(x)operator([)integer(0)operator(]) operator(=) integer(0)operator(;) + reserved(return) ident(c)operator(;) + operator(}) + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) operator({) + ident(c) operator(=) ident(a)operator(;) + ident(a) operator(=) ident(b)operator(;) + ident(b) operator(=) ident(c)operator(;) + ident(i) operator(=) integer(1)operator(;) + operator(}) + reserved(else) + ident(i) operator(=) integer(0)operator(;) + ident(c) operator(=) ident(Balloc)operator(()ident(a)operator(->)ident(k)operator(\);) + ident(c)operator(->)ident(sign) operator(=) ident(i)operator(;) + ident(wa) operator(=) ident(a)operator(->)ident(wds)operator(;) + ident(xa) operator(=) ident(a)operator(->)ident(x)operator(;) + ident(xae) operator(=) ident(xa) operator(+) ident(wa)operator(;) + ident(wb) operator(=) ident(b)operator(->)ident(wds)operator(;) + ident(xb) operator(=) ident(b)operator(->)ident(x)operator(;) + ident(xbe) operator(=) ident(xb) operator(+) ident(wb)operator(;) + ident(xc) operator(=) ident(c)operator(->)ident(x)operator(;) + ident(borrow) operator(=) integer(0)operator(;) +preprocessor(#ifdef) ident(ULLong) + reserved(do) operator({) + ident(y) operator(=) operator(()ident(ULLong)operator(\)*)ident(xa)operator(++) operator(-) operator(*)ident(xb)operator(++) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) ident(y) operator(>>) integer(32) operator(&) operator(()ident(ULong)operator(\))integer(1)operator(;) + operator(*)ident(xc)operator(++) operator(=) ident(y) operator(&) ident(FFFFFFFF)operator(;) + operator(}) reserved(while) operator(()ident(xb) operator(<) ident(xbe)operator(\);) + reserved(while) operator(()ident(xa) operator(<) ident(xae)operator(\)) operator({) + ident(y) operator(=) operator(*)ident(xa)operator(++) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) ident(y) operator(>>) integer(32) operator(&) operator(()ident(ULong)operator(\))integer(1)operator(;) + operator(*)ident(xc)operator(++) operator(=) ident(y) operator(&) ident(FFFFFFFF)operator(;) + operator(}) +preprocessor(#else) +preprocessor(#ifdef) ident(Pack_32) + reserved(do) operator({) + ident(y) operator(=) operator((*)ident(xa) operator(&) hex(0xffff)operator(\)) operator(-) operator((*)ident(xb) operator(&) hex(0xffff)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(y) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + ident(z) operator(=) operator((*)ident(xa)operator(++) operator(>>) integer(16)operator(\)) operator(-) operator((*)ident(xb)operator(++) operator(>>) integer(16)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(z) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + ident(Storeinc)operator(()ident(xc)operator(,) ident(z)operator(,) ident(y)operator(\);) + operator(}) reserved(while) operator(()ident(xb) operator(<) ident(xbe)operator(\);) + reserved(while) operator(()ident(xa) operator(<) ident(xae)operator(\)) operator({) + ident(y) operator(=) operator((*)ident(xa) operator(&) hex(0xffff)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(y) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + ident(z) operator(=) operator((*)ident(xa)operator(++) operator(>>) integer(16)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(z) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + ident(Storeinc)operator(()ident(xc)operator(,) ident(z)operator(,) ident(y)operator(\);) + operator(}) +preprocessor(#else) + reserved(do) operator({) + ident(y) operator(=) operator(*)ident(xa)operator(++) operator(-) operator(*)ident(xb)operator(++) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(y) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + operator(*)ident(xc)operator(++) operator(=) ident(y) operator(&) hex(0xffff)operator(;) + operator(}) reserved(while) operator(()ident(xb) operator(<) ident(xbe)operator(\);) + reserved(while) operator(()ident(xa) operator(<) ident(xae)operator(\)) operator({) + ident(y) operator(=) operator(*)ident(xa)operator(++) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(y) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + operator(*)ident(xc)operator(++) operator(=) ident(y) operator(&) hex(0xffff)operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#endif) + reserved(while) operator((!*--)ident(xc)operator(\)) + ident(wa)operator(--;) + ident(c)operator(->)ident(wds) operator(=) ident(wa)operator(;) + reserved(return) ident(c)operator(;) +operator(}) + +directive(static) pre_type(double) +ident(ulp)operator(()pre_type(double) ident(x)operator(\)) +operator({) + directive(register) ident(Long) ident(L)operator(;) + pre_type(double) ident(a)operator(;) + + ident(L) operator(=) operator(()ident(word0)operator(()ident(x)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(-) operator(()ident(P)operator(-)integer(1)operator(\)*)ident(Exp_msk1)operator(;) +preprocessor(#ifndef) ident(Avoid_Underflow) +preprocessor(#ifndef) ident(Sudden_Underflow) + reserved(if) operator(()ident(L) operator(>) integer(0)operator(\)) operator({) +preprocessor(#endif) +preprocessor(#endif) +preprocessor(#ifdef) ident(IBM) + ident(L) operator(|=) ident(Exp_msk1) operator(>>) integer(4)operator(;) +preprocessor(#endif) + ident(word0)operator(()ident(a)operator(\)) operator(=) ident(L)operator(;) + ident(word1)operator(()ident(a)operator(\)) operator(=) integer(0)operator(;) +preprocessor(#ifndef) ident(Avoid_Underflow) +preprocessor(#ifndef) ident(Sudden_Underflow) + operator(}) + reserved(else) operator({) + ident(L) operator(=) operator(-)ident(L) operator(>>) ident(Exp_shift)operator(;) + reserved(if) operator(()ident(L) operator(<) ident(Exp_shift)operator(\)) operator({) + ident(word0)operator(()ident(a)operator(\)) operator(=) hex(0x80000) operator(>>) ident(L)operator(;) + ident(word1)operator(()ident(a)operator(\)) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(word0)operator(()ident(a)operator(\)) operator(=) integer(0)operator(;) + ident(L) operator(-=) ident(Exp_shift)operator(;) + ident(word1)operator(()ident(a)operator(\)) operator(=) ident(L) operator(>=) integer(31) operator(?) integer(1) operator(:) integer(1) operator(<<) integer(31) operator(-) ident(L)operator(;) + operator(}) + operator(}) +preprocessor(#endif) +preprocessor(#endif) + reserved(return) ident(dval)operator(()ident(a)operator(\);) +operator(}) + +directive(static) pre_type(double) +ident(b2d)operator(()ident(Bigint) operator(*)ident(a)operator(,) pre_type(int) operator(*)ident(e)operator(\)) +operator({) + ident(ULong) operator(*)ident(xa)operator(,) operator(*)ident(xa0)operator(,) ident(w)operator(,) ident(y)operator(,) ident(z)operator(;) + pre_type(int) ident(k)operator(;) + pre_type(double) ident(d)operator(;) +preprocessor(#ifdef) ident(VAX) + ident(ULong) ident(d0)operator(,) ident(d1)operator(;) +preprocessor(#else) +preprocessor(#define) ident(d0) ident(word0)operator(()ident(d)operator(\)) +preprocessor(#define) ident(d1) ident(word1)operator(()ident(d)operator(\)) +preprocessor(#endif) + + ident(xa0) operator(=) ident(a)operator(->)ident(x)operator(;) + ident(xa) operator(=) ident(xa0) operator(+) ident(a)operator(->)ident(wds)operator(;) + ident(y) operator(=) operator(*--)ident(xa)operator(;) +preprocessor(#ifdef) ident(DEBUG) + reserved(if) operator((!)ident(y)operator(\)) ident(Bug)operator(()string<delimiter(")content(zero y in b2d)delimiter(")>operator(\);) +preprocessor(#endif) + ident(k) operator(=) ident(hi0bits)operator(()ident(y)operator(\);) + operator(*)ident(e) operator(=) integer(32) operator(-) ident(k)operator(;) +preprocessor(#ifdef) ident(Pack_32) + reserved(if) operator(()ident(k) operator(<) ident(Ebits)operator(\)) operator({) + ident(d0) operator(=) ident(Exp_1) operator(|) ident(y) operator(>>) operator(()ident(Ebits) operator(-) ident(k)operator(\);) + ident(w) operator(=) ident(xa) operator(>) ident(xa0) operator(?) operator(*--)ident(xa) operator(:) integer(0)operator(;) + ident(d1) operator(=) ident(y) operator(<<) operator((()integer(32)operator(-)ident(Ebits)operator(\)) operator(+) ident(k)operator(\)) operator(|) ident(w) operator(>>) operator(()ident(Ebits) operator(-) ident(k)operator(\);) + reserved(goto) ident(ret_d)operator(;) + operator(}) + ident(z) operator(=) ident(xa) operator(>) ident(xa0) operator(?) operator(*--)ident(xa) operator(:) integer(0)operator(;) + reserved(if) operator(()ident(k) operator(-=) ident(Ebits)operator(\)) operator({) + ident(d0) operator(=) ident(Exp_1) operator(|) ident(y) operator(<<) ident(k) operator(|) ident(z) operator(>>) operator(()integer(32) operator(-) ident(k)operator(\);) + ident(y) operator(=) ident(xa) operator(>) ident(xa0) operator(?) operator(*--)ident(xa) operator(:) integer(0)operator(;) + ident(d1) operator(=) ident(z) operator(<<) ident(k) operator(|) ident(y) operator(>>) operator(()integer(32) operator(-) ident(k)operator(\);) + operator(}) + reserved(else) operator({) + ident(d0) operator(=) ident(Exp_1) operator(|) ident(y)operator(;) + ident(d1) operator(=) ident(z)operator(;) + operator(}) +preprocessor(#else) + reserved(if) operator(()ident(k) operator(<) ident(Ebits) operator(+) integer(16)operator(\)) operator({) + ident(z) operator(=) ident(xa) operator(>) ident(xa0) operator(?) operator(*--)ident(xa) operator(:) integer(0)operator(;) + ident(d0) operator(=) ident(Exp_1) operator(|) ident(y) operator(<<) ident(k) operator(-) ident(Ebits) operator(|) ident(z) operator(>>) ident(Ebits) operator(+) integer(16) operator(-) ident(k)operator(;) + ident(w) operator(=) ident(xa) operator(>) ident(xa0) operator(?) operator(*--)ident(xa) operator(:) integer(0)operator(;) + ident(y) operator(=) ident(xa) operator(>) ident(xa0) operator(?) operator(*--)ident(xa) operator(:) integer(0)operator(;) + ident(d1) operator(=) ident(z) operator(<<) ident(k) operator(+) integer(16) operator(-) ident(Ebits) operator(|) ident(w) operator(<<) ident(k) operator(-) ident(Ebits) operator(|) ident(y) operator(>>) integer(16) operator(+) ident(Ebits) operator(-) ident(k)operator(;) + reserved(goto) ident(ret_d)operator(;) + operator(}) + ident(z) operator(=) ident(xa) operator(>) ident(xa0) operator(?) operator(*--)ident(xa) operator(:) integer(0)operator(;) + ident(w) operator(=) ident(xa) operator(>) ident(xa0) operator(?) operator(*--)ident(xa) operator(:) integer(0)operator(;) + ident(k) operator(-=) ident(Ebits) operator(+) integer(16)operator(;) + ident(d0) operator(=) ident(Exp_1) operator(|) ident(y) operator(<<) ident(k) operator(+) integer(16) operator(|) ident(z) operator(<<) ident(k) operator(|) ident(w) operator(>>) integer(16) operator(-) ident(k)operator(;) + ident(y) operator(=) ident(xa) operator(>) ident(xa0) operator(?) operator(*--)ident(xa) operator(:) integer(0)operator(;) + ident(d1) operator(=) ident(w) operator(<<) ident(k) operator(+) integer(16) operator(|) ident(y) operator(<<) ident(k)operator(;) +preprocessor(#endif) +label(ret_d)operator(:) +preprocessor(#ifdef) ident(VAX) + ident(word0)operator(()ident(d)operator(\)) operator(=) ident(d0) operator(>>) integer(16) operator(|) ident(d0) operator(<<) integer(16)operator(;) + ident(word1)operator(()ident(d)operator(\)) operator(=) ident(d1) operator(>>) integer(16) operator(|) ident(d1) operator(<<) integer(16)operator(;) +preprocessor(#else) +preprocessor(#undef) ident(d0) +preprocessor(#undef) ident(d1) +preprocessor(#endif) + reserved(return) ident(dval)operator(()ident(d)operator(\);) +operator(}) + +directive(static) ident(Bigint) operator(*) +ident(d2b)operator(()pre_type(double) ident(d)operator(,) pre_type(int) operator(*)ident(e)operator(,) pre_type(int) operator(*)ident(bits)operator(\)) +operator({) + ident(Bigint) operator(*)ident(b)operator(;) + pre_type(int) ident(de)operator(,) ident(k)operator(;) + ident(ULong) operator(*)ident(x)operator(,) ident(y)operator(,) ident(z)operator(;) +preprocessor(#ifndef) ident(Sudden_Underflow) + pre_type(int) ident(i)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(VAX) + ident(ULong) ident(d0)operator(,) ident(d1)operator(;) + ident(d0) operator(=) ident(word0)operator(()ident(d)operator(\)) operator(>>) integer(16) operator(|) ident(word0)operator(()ident(d)operator(\)) operator(<<) integer(16)operator(;) + ident(d1) operator(=) ident(word1)operator(()ident(d)operator(\)) operator(>>) integer(16) operator(|) ident(word1)operator(()ident(d)operator(\)) operator(<<) integer(16)operator(;) +preprocessor(#else) +preprocessor(#define) ident(d0) ident(word0)operator(()ident(d)operator(\)) +preprocessor(#define) ident(d1) ident(word1)operator(()ident(d)operator(\)) +preprocessor(#endif) + +preprocessor(#ifdef) ident(Pack_32) + ident(b) operator(=) ident(Balloc)operator(()integer(1)operator(\);) +preprocessor(#else) + ident(b) operator(=) ident(Balloc)operator(()integer(2)operator(\);) +preprocessor(#endif) + ident(x) operator(=) ident(b)operator(->)ident(x)operator(;) + + ident(z) operator(=) ident(d0) operator(&) ident(Frac_mask)operator(;) + ident(d0) operator(&=) hex(0x7fffffff)operator(;) comment(/* clear sign bit, which we ignore */) +preprocessor(#ifdef) ident(Sudden_Underflow) + ident(de) operator(=) operator(()pre_type(int)operator(\)()ident(d0) operator(>>) ident(Exp_shift)operator(\);) +preprocessor(#ifndef) ident(IBM) + ident(z) operator(|=) ident(Exp_msk11)operator(;) +preprocessor(#endif) +preprocessor(#else) + reserved(if) operator((()ident(de) operator(=) operator(()pre_type(int)operator(\)()ident(d0) operator(>>) ident(Exp_shift)operator(\)\)) operator(!=) integer(0)operator(\)) + ident(z) operator(|=) ident(Exp_msk1)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(Pack_32) + reserved(if) operator((()ident(y) operator(=) ident(d1)operator(\)) operator(!=) integer(0)operator(\)) operator({) + reserved(if) operator((()ident(k) operator(=) ident(lo0bits)operator((&)ident(y)operator(\)\)) operator(!=) integer(0)operator(\)) operator({) + ident(x)operator([)integer(0)operator(]) operator(=) ident(y) operator(|) ident(z) operator(<<) operator(()integer(32) operator(-) ident(k)operator(\);) + ident(z) operator(>>=) ident(k)operator(;) + operator(}) + reserved(else) + ident(x)operator([)integer(0)operator(]) operator(=) ident(y)operator(;) +preprocessor(#ifndef) ident(Sudden_Underflow) + ident(i) operator(=) +preprocessor(#endif) + ident(b)operator(->)ident(wds) operator(=) operator(()ident(x)operator([)integer(1)operator(]) operator(=) ident(z)operator(\)) operator(?) integer(2) operator(:) integer(1)operator(;) + operator(}) + reserved(else) operator({) +preprocessor(#ifdef) ident(DEBUG) + reserved(if) operator((!)ident(z)operator(\)) + ident(Bug)operator(()string<delimiter(")content(Zero passed to d2b)delimiter(")>operator(\);) +preprocessor(#endif) + ident(k) operator(=) ident(lo0bits)operator((&)ident(z)operator(\);) + ident(x)operator([)integer(0)operator(]) operator(=) ident(z)operator(;) +preprocessor(#ifndef) ident(Sudden_Underflow) + ident(i) operator(=) +preprocessor(#endif) + ident(b)operator(->)ident(wds) operator(=) integer(1)operator(;) + ident(k) operator(+=) integer(32)operator(;) + operator(}) +preprocessor(#else) + reserved(if) operator(()ident(y) operator(=) ident(d1)operator(\)) operator({) + reserved(if) operator(()ident(k) operator(=) ident(lo0bits)operator((&)ident(y)operator(\)\)) + reserved(if) operator(()ident(k) operator(>=) integer(16)operator(\)) operator({) + ident(x)operator([)integer(0)operator(]) operator(=) ident(y) operator(|) ident(z) operator(<<) integer(32) operator(-) ident(k) operator(&) hex(0xffff)operator(;) + ident(x)operator([)integer(1)operator(]) operator(=) ident(z) operator(>>) ident(k) operator(-) integer(16) operator(&) hex(0xffff)operator(;) + ident(x)operator([)integer(2)operator(]) operator(=) ident(z) operator(>>) ident(k)operator(;) + ident(i) operator(=) integer(2)operator(;) + operator(}) + reserved(else) operator({) + ident(x)operator([)integer(0)operator(]) operator(=) ident(y) operator(&) hex(0xffff)operator(;) + ident(x)operator([)integer(1)operator(]) operator(=) ident(y) operator(>>) integer(16) operator(|) ident(z) operator(<<) integer(16) operator(-) ident(k) operator(&) hex(0xffff)operator(;) + ident(x)operator([)integer(2)operator(]) operator(=) ident(z) operator(>>) ident(k) operator(&) hex(0xffff)operator(;) + ident(x)operator([)integer(3)operator(]) operator(=) ident(z) operator(>>) ident(k)operator(+)integer(16)operator(;) + ident(i) operator(=) integer(3)operator(;) + operator(}) + reserved(else) operator({) + ident(x)operator([)integer(0)operator(]) operator(=) ident(y) operator(&) hex(0xffff)operator(;) + ident(x)operator([)integer(1)operator(]) operator(=) ident(y) operator(>>) integer(16)operator(;) + ident(x)operator([)integer(2)operator(]) operator(=) ident(z) operator(&) hex(0xffff)operator(;) + ident(x)operator([)integer(3)operator(]) operator(=) ident(z) operator(>>) integer(16)operator(;) + ident(i) operator(=) integer(3)operator(;) + operator(}) + operator(}) + reserved(else) operator({) +preprocessor(#ifdef) ident(DEBUG) + reserved(if) operator((!)ident(z)operator(\)) + ident(Bug)operator(()string<delimiter(")content(Zero passed to d2b)delimiter(")>operator(\);) +preprocessor(#endif) + ident(k) operator(=) ident(lo0bits)operator((&)ident(z)operator(\);) + reserved(if) operator(()ident(k) operator(>=) integer(16)operator(\)) operator({) + ident(x)operator([)integer(0)operator(]) operator(=) ident(z)operator(;) + ident(i) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + ident(x)operator([)integer(0)operator(]) operator(=) ident(z) operator(&) hex(0xffff)operator(;) + ident(x)operator([)integer(1)operator(]) operator(=) ident(z) operator(>>) integer(16)operator(;) + ident(i) operator(=) integer(1)operator(;) + operator(}) + ident(k) operator(+=) integer(32)operator(;) + operator(}) + reserved(while) operator((!)ident(x)operator([)ident(i)operator(]\)) + operator(--)ident(i)operator(;) + ident(b)operator(->)ident(wds) operator(=) ident(i) operator(+) integer(1)operator(;) +preprocessor(#endif) +preprocessor(#ifndef) ident(Sudden_Underflow) + reserved(if) operator(()ident(de)operator(\)) operator({) +preprocessor(#endif) +preprocessor(#ifdef) ident(IBM) + operator(*)ident(e) operator(=) operator(()ident(de) operator(-) ident(Bias) operator(-) operator(()ident(P)operator(-)integer(1)operator(\)) operator(<<) integer(2)operator(\)) operator(+) ident(k)operator(;) + operator(*)ident(bits) operator(=) integer(4)operator(*)ident(P) operator(+) integer(8) operator(-) ident(k) operator(-) ident(hi0bits)operator(()ident(word0)operator(()ident(d)operator(\)) operator(&) ident(Frac_mask)operator(\);) +preprocessor(#else) + operator(*)ident(e) operator(=) ident(de) operator(-) ident(Bias) operator(-) operator(()ident(P)operator(-)integer(1)operator(\)) operator(+) ident(k)operator(;) + operator(*)ident(bits) operator(=) ident(P) operator(-) ident(k)operator(;) +preprocessor(#endif) +preprocessor(#ifndef) ident(Sudden_Underflow) + operator(}) + reserved(else) operator({) + operator(*)ident(e) operator(=) ident(de) operator(-) ident(Bias) operator(-) operator(()ident(P)operator(-)integer(1)operator(\)) operator(+) integer(1) operator(+) ident(k)operator(;) +preprocessor(#ifdef) ident(Pack_32) + operator(*)ident(bits) operator(=) integer(32)operator(*)ident(i) operator(-) ident(hi0bits)operator(()ident(x)operator([)ident(i)operator(-)integer(1)operator(]\);) +preprocessor(#else) + operator(*)ident(bits) operator(=) operator(()ident(i)operator(+)integer(2)operator(\)*)integer(16) operator(-) ident(hi0bits)operator(()ident(x)operator([)ident(i)operator(]\);) +preprocessor(#endif) + operator(}) +preprocessor(#endif) + reserved(return) ident(b)operator(;) +operator(}) +preprocessor(#undef) ident(d0) +preprocessor(#undef) ident(d1) + +directive(static) pre_type(double) +ident(ratio)operator(()ident(Bigint) operator(*)ident(a)operator(,) ident(Bigint) operator(*)ident(b)operator(\)) +operator({) + pre_type(double) ident(da)operator(,) ident(db)operator(;) + pre_type(int) ident(k)operator(,) ident(ka)operator(,) ident(kb)operator(;) + + ident(dval)operator(()ident(da)operator(\)) operator(=) ident(b2d)operator(()ident(a)operator(,) operator(&)ident(ka)operator(\);) + ident(dval)operator(()ident(db)operator(\)) operator(=) ident(b2d)operator(()ident(b)operator(,) operator(&)ident(kb)operator(\);) +preprocessor(#ifdef) ident(Pack_32) + ident(k) operator(=) ident(ka) operator(-) ident(kb) operator(+) integer(32)operator(*()ident(a)operator(->)ident(wds) operator(-) ident(b)operator(->)ident(wds)operator(\);) +preprocessor(#else) + ident(k) operator(=) ident(ka) operator(-) ident(kb) operator(+) integer(16)operator(*()ident(a)operator(->)ident(wds) operator(-) ident(b)operator(->)ident(wds)operator(\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(IBM) + reserved(if) operator(()ident(k) operator(>) integer(0)operator(\)) operator({) + ident(word0)operator(()ident(da)operator(\)) operator(+=) operator(()ident(k) operator(>>) integer(2)operator(\)*)ident(Exp_msk1)operator(;) + reserved(if) operator(()ident(k) operator(&=) integer(3)operator(\)) + ident(dval)operator(()ident(da)operator(\)) operator(*=) integer(1) operator(<<) ident(k)operator(;) + operator(}) + reserved(else) operator({) + ident(k) operator(=) operator(-)ident(k)operator(;) + ident(word0)operator(()ident(db)operator(\)) operator(+=) operator(()ident(k) operator(>>) integer(2)operator(\)*)ident(Exp_msk1)operator(;) + reserved(if) operator(()ident(k) operator(&=) integer(3)operator(\)) + ident(dval)operator(()ident(db)operator(\)) operator(*=) integer(1) operator(<<) ident(k)operator(;) + operator(}) +preprocessor(#else) + reserved(if) operator(()ident(k) operator(>) integer(0)operator(\)) + ident(word0)operator(()ident(da)operator(\)) operator(+=) ident(k)operator(*)ident(Exp_msk1)operator(;) + reserved(else) operator({) + ident(k) operator(=) operator(-)ident(k)operator(;) + ident(word0)operator(()ident(db)operator(\)) operator(+=) ident(k)operator(*)ident(Exp_msk1)operator(;) + operator(}) +preprocessor(#endif) + reserved(return) ident(dval)operator(()ident(da)operator(\)) operator(/) ident(dval)operator(()ident(db)operator(\);) +operator(}) + +directive(static) directive(const) pre_type(double) +ident(tens)operator([]) operator(=) operator({) + float(1)ident(e0)operator(,) float(1)ident(e1)operator(,) float(1)ident(e2)operator(,) float(1)ident(e3)operator(,) float(1)ident(e4)operator(,) float(1)ident(e5)operator(,) float(1)ident(e6)operator(,) float(1)ident(e7)operator(,) float(1)ident(e8)operator(,) float(1)ident(e9)operator(,) + float(1)ident(e10)operator(,) float(1)ident(e11)operator(,) float(1)ident(e12)operator(,) float(1)ident(e13)operator(,) float(1)ident(e14)operator(,) float(1)ident(e15)operator(,) float(1)ident(e16)operator(,) float(1)ident(e17)operator(,) float(1)ident(e18)operator(,) float(1)ident(e19)operator(,) + float(1)ident(e20)operator(,) float(1)ident(e21)operator(,) float(1)ident(e22) +preprocessor(#ifdef) ident(VAX) + operator(,) float(1)ident(e23)operator(,) float(1)ident(e24) +preprocessor(#endif) +operator(};) + +directive(static) directive(const) pre_type(double) +preprocessor(#ifdef) ident(IEEE_Arith) +ident(bigtens)operator([]) operator(=) operator({) float(1)ident(e16)operator(,) float(1)ident(e32)operator(,) float(1)ident(e64)operator(,) float(1)ident(e128)operator(,) float(1)ident(e256) operator(};) +directive(static) directive(const) pre_type(double) ident(tinytens)operator([]) operator(=) operator({) float(1)ident(e)operator(-)integer(16)operator(,) float(1)ident(e)operator(-)integer(32)operator(,) float(1)ident(e)operator(-)integer(64)operator(,) float(1)ident(e)operator(-)integer(128)operator(,) +preprocessor(#ifdef) ident(Avoid_Underflow) + integer(900719925474099)float(2)operator(.)operator(*)integer(900719925474099)float(2)operator(.)ident(e)operator(-)integer(256) + comment(/* = 2^106 * 1e-53 */) +preprocessor(#else) + float(1)ident(e)operator(-)integer(256) +preprocessor(#endif) +operator(};) +comment(/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */) +comment(/* flag unnecessarily. It leads to a song and dance at the end of strtod. */) +preprocessor(#define) ident(Scale_Bit) hex(0x10) +preprocessor(#define) ident(n_bigtens) integer(5) +preprocessor(#else) +preprocessor(#ifdef) ident(IBM) +ident(bigtens)operator([]) operator(=) operator({) float(1)ident(e16)operator(,) float(1)ident(e32)operator(,) float(1)ident(e64) operator(};) +directive(static) directive(const) pre_type(double) ident(tinytens)operator([]) operator(=) operator({) float(1)ident(e)operator(-)integer(16)operator(,) float(1)ident(e)operator(-)integer(32)operator(,) float(1)ident(e)operator(-)integer(64) operator(};) +preprocessor(#define) ident(n_bigtens) integer(3) +preprocessor(#else) +ident(bigtens)operator([]) operator(=) operator({) float(1)ident(e16)operator(,) float(1)ident(e32) operator(};) +directive(static) directive(const) pre_type(double) ident(tinytens)operator([]) operator(=) operator({) float(1)ident(e)operator(-)integer(16)operator(,) float(1)ident(e)operator(-)integer(32) operator(};) +preprocessor(#define) ident(n_bigtens) integer(2) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#ifndef) ident(IEEE_Arith) +preprocessor(#undef) ident(INFNAN_CHECK) +preprocessor(#endif) + +preprocessor(#ifdef) ident(INFNAN_CHECK) + +preprocessor(#ifndef) ident(NAN_WORD0) +preprocessor(#define) ident(NAN_WORD0) hex(0x7ff80000) +preprocessor(#endif) + +preprocessor(#ifndef) ident(NAN_WORD1) +preprocessor(#define) ident(NAN_WORD1) integer(0) +preprocessor(#endif) + +directive(static) pre_type(int) +ident(match)operator(()directive(const) pre_type(char) operator(**)ident(sp)operator(,) pre_type(char) operator(*)ident(t)operator(\)) +operator({) + pre_type(int) ident(c)operator(,) ident(d)operator(;) + directive(const) pre_type(char) operator(*)ident(s) operator(=) operator(*)ident(sp)operator(;) + + reserved(while) operator(()ident(d) operator(=) operator(*)ident(t)operator(++\)) operator({) + reserved(if) operator((()ident(c) operator(=) operator(*++)ident(s)operator(\)) operator(>=) char('A') operator(&&) ident(c) operator(<=) char('Z')operator(\)) + ident(c) operator(+=) char('a') operator(-) char('A')operator(;) + reserved(if) operator(()ident(c) operator(!=) ident(d)operator(\)) + reserved(return) integer(0)operator(;) + operator(}) + operator(*)ident(sp) operator(=) ident(s) operator(+) integer(1)operator(;) + reserved(return) integer(1)operator(;) +operator(}) + +preprocessor(#ifndef) ident(No_Hex_NaN) +directive(static) directive(void) +ident(hexnan)operator(()pre_type(double) operator(*)ident(rvp)operator(,) directive(const) pre_type(char) operator(**)ident(sp)operator(\)) +operator({) + ident(ULong) ident(c)operator(,) ident(x)operator([)integer(2)operator(];) + directive(const) pre_type(char) operator(*)ident(s)operator(;) + pre_type(int) ident(havedig)operator(,) ident(udx0)operator(,) ident(xshift)operator(;) + + ident(x)operator([)integer(0)operator(]) operator(=) ident(x)operator([)integer(1)operator(]) operator(=) integer(0)operator(;) + ident(havedig) operator(=) ident(xshift) operator(=) integer(0)operator(;) + ident(udx0) operator(=) integer(1)operator(;) + ident(s) operator(=) operator(*)ident(sp)operator(;) + reserved(while) operator(()ident(c) operator(=) operator(*()directive(const) pre_type(unsigned) pre_type(char)operator(*\)++)ident(s)operator(\)) operator({) + reserved(if) operator(()ident(c) operator(>=) char('0') operator(&&) ident(c) operator(<=) char('9')operator(\)) + ident(c) operator(-=) char('0')operator(;) + reserved(else) reserved(if) operator(()ident(c) operator(>=) char('a') operator(&&) ident(c) operator(<=) char('f')operator(\)) + ident(c) operator(+=) integer(10) operator(-) char('a')operator(;) + reserved(else) reserved(if) operator(()ident(c) operator(>=) char('A') operator(&&) ident(c) operator(<=) char('F')operator(\)) + ident(c) operator(+=) integer(10) operator(-) char('A')operator(;) + reserved(else) reserved(if) operator(()ident(c) operator(<=) char(' ')operator(\)) operator({) + reserved(if) operator(()ident(udx0) operator(&&) ident(havedig)operator(\)) operator({) + ident(udx0) operator(=) integer(0)operator(;) + ident(xshift) operator(=) integer(1)operator(;) + operator(}) + reserved(continue)operator(;) + operator(}) + reserved(else) reserved(if) operator(()comment(/*(*/) ident(c) operator(==) char('\)') operator(&&) ident(havedig)operator(\)) operator({) + operator(*)ident(sp) operator(=) ident(s) operator(+) integer(1)operator(;) + reserved(break)operator(;) + operator(}) + reserved(else) + reserved(return)operator(;) comment(/* invalid form: don't change *sp */) + ident(havedig) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(xshift)operator(\)) operator({) + ident(xshift) operator(=) integer(0)operator(;) + ident(x)operator([)integer(0)operator(]) operator(=) ident(x)operator([)integer(1)operator(];) + ident(x)operator([)integer(1)operator(]) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(udx0)operator(\)) + ident(x)operator([)integer(0)operator(]) operator(=) operator(()ident(x)operator([)integer(0)operator(]) operator(<<) integer(4)operator(\)) operator(|) operator(()ident(x)operator([)integer(1)operator(]) operator(>>) integer(28)operator(\);) + ident(x)operator([)integer(1)operator(]) operator(=) operator(()ident(x)operator([)integer(1)operator(]) operator(<<) integer(4)operator(\)) operator(|) ident(c)operator(;) + operator(}) + reserved(if) operator((()ident(x)operator([)integer(0)operator(]) operator(&=) hex(0xfffff)operator(\)) operator(||) ident(x)operator([)integer(1)operator(]\)) operator({) + ident(word0)operator((*)ident(rvp)operator(\)) operator(=) ident(Exp_mask) operator(|) ident(x)operator([)integer(0)operator(];) + ident(word1)operator((*)ident(rvp)operator(\)) operator(=) ident(x)operator([)integer(1)operator(];) + operator(}) +operator(}) +preprocessor(#endif) comment(/*No_Hex_NaN*/) +preprocessor(#endif) comment(/* INFNAN_CHECK */) + +pre_type(double) +ident(ruby_strtod)operator(()directive(const) pre_type(char) operator(*)ident(s00)operator(,) pre_type(char) operator(**)ident(se)operator(\)) +operator({) +preprocessor(#ifdef) ident(Avoid_Underflow) + pre_type(int) ident(scale)operator(;) +preprocessor(#endif) + pre_type(int) ident(bb2)operator(,) ident(bb5)operator(,) ident(bbe)operator(,) ident(bd2)operator(,) ident(bd5)operator(,) ident(bbbits)operator(,) ident(bs2)operator(,) ident(c)operator(,) ident(dsign)operator(,) + ident(e)operator(,) ident(e1)operator(,) ident(esign)operator(,) ident(i)operator(,) ident(j)operator(,) ident(k)operator(,) ident(nd)operator(,) ident(nd0)operator(,) ident(nf)operator(,) ident(nz)operator(,) ident(nz0)operator(,) ident(sign)operator(;) + directive(const) pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(s0)operator(,) operator(*)ident(s1)operator(;) + pre_type(double) ident(aadj)operator(,) ident(aadj1)operator(,) ident(adj)operator(,) ident(rv)operator(,) ident(rv0)operator(;) + ident(Long) ident(L)operator(;) + ident(ULong) ident(y)operator(,) ident(z)operator(;) + ident(Bigint) operator(*)ident(bb)operator(,) operator(*)ident(bb1)operator(,) operator(*)ident(bd)operator(,) operator(*)ident(bd0)operator(,) operator(*)ident(bs)operator(,) operator(*)ident(delta)operator(;) +preprocessor(#ifdef) ident(SET_INEXACT) + pre_type(int) ident(inexact)operator(,) ident(oldinexact)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + pre_type(int) ident(rounding)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(USE_LOCALE) + directive(const) pre_type(char) operator(*)ident(s2)operator(;) +preprocessor(#endif) + + ident(sign) operator(=) ident(nz0) operator(=) ident(nz) operator(=) integer(0)operator(;) + ident(dval)operator(()ident(rv)operator(\)) operator(=) float(0)operator(.)operator(;) + reserved(for) operator(()ident(s) operator(=) ident(s00)operator(;;)ident(s)operator(++\)) + reserved(switch) operator((*)ident(s)operator(\)) operator({) + reserved(case) char('-')operator(:) + ident(sign) operator(=) integer(1)operator(;) + comment(/* no break */) + reserved(case) char('+')operator(:) + reserved(if) operator((*++)ident(s)operator(\)) + reserved(goto) ident(break2)operator(;) + comment(/* no break */) + reserved(case) integer(0)operator(:) + reserved(goto) ident(ret0)operator(;) + reserved(case) char('\\t')operator(:) + reserved(case) char('\\n')operator(:) + reserved(case) char('\\v')operator(:) + reserved(case) char('\\f')operator(:) + reserved(case) char('\\r')operator(:) + reserved(case) char(' ')operator(:) + reserved(continue)operator(;) + reserved(default)operator(:) + reserved(goto) ident(break2)operator(;) + operator(}) +label(break2)operator(:) + reserved(if) operator((*)ident(s) operator(==) char('0')operator(\)) operator({) + ident(nz0) operator(=) integer(1)operator(;) + reserved(while) operator((*++)ident(s) operator(==) char('0')operator(\)) operator(;) + reserved(if) operator((!*)ident(s)operator(\)) + reserved(goto) ident(ret)operator(;) + operator(}) + ident(s0) operator(=) ident(s)operator(;) + ident(y) operator(=) ident(z) operator(=) integer(0)operator(;) + reserved(for) operator(()ident(nd) operator(=) ident(nf) operator(=) integer(0)operator(;) operator(()ident(c) operator(=) operator(*)ident(s)operator(\)) operator(>=) char('0') operator(&&) ident(c) operator(<=) char('9')operator(;) ident(nd)operator(++,) ident(s)operator(++\)) + reserved(if) operator(()ident(nd) operator(<) integer(9)operator(\)) + ident(y) operator(=) integer(10)operator(*)ident(y) operator(+) ident(c) operator(-) char('0')operator(;) + reserved(else) reserved(if) operator(()ident(nd) operator(<) integer(16)operator(\)) + ident(z) operator(=) integer(10)operator(*)ident(z) operator(+) ident(c) operator(-) char('0')operator(;) + ident(nd0) operator(=) ident(nd)operator(;) +preprocessor(#ifdef) ident(USE_LOCALE) + ident(s1) operator(=) ident(localeconv)operator((\)->)ident(decimal_point)operator(;) + reserved(if) operator(()ident(c) operator(==) operator(*)ident(s1)operator(\)) operator({) + ident(c) operator(=) char('.')operator(;) + reserved(if) operator((*++)ident(s1)operator(\)) operator({) + ident(s2) operator(=) ident(s)operator(;) + reserved(for) operator((;;\)) operator({) + reserved(if) operator((*++)ident(s2) operator(!=) operator(*)ident(s1)operator(\)) operator({) + ident(c) operator(=) integer(0)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator((!*++)ident(s1)operator(\)) operator({) + ident(s) operator(=) ident(s2)operator(;) + reserved(break)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) +preprocessor(#endif) + reserved(if) operator(()ident(c) operator(==) char('.')operator(\)) operator({) + reserved(if) operator((!)ident(ISDIGIT)operator(()ident(s)operator([)integer(1)operator(]\)\)) + reserved(goto) ident(dig_done)operator(;) + ident(c) operator(=) operator(*++)ident(s)operator(;) + reserved(if) operator((!)ident(nd)operator(\)) operator({) + reserved(for) operator((;) ident(c) operator(==) char('0')operator(;) ident(c) operator(=) operator(*++)ident(s)operator(\)) + ident(nz)operator(++;) + reserved(if) operator(()ident(c) operator(>) char('0') operator(&&) ident(c) operator(<=) char('9')operator(\)) operator({) + ident(s0) operator(=) ident(s)operator(;) + ident(nf) operator(+=) ident(nz)operator(;) + ident(nz) operator(=) integer(0)operator(;) + reserved(goto) ident(have_dig)operator(;) + operator(}) + reserved(goto) ident(dig_done)operator(;) + operator(}) + reserved(for) operator((;) ident(c) operator(>=) char('0') operator(&&) ident(c) operator(<=) char('9')operator(;) ident(c) operator(=) operator(*++)ident(s)operator(\)) operator({) +label(have_dig)operator(:) + ident(nz)operator(++;) + reserved(if) operator(()ident(c) operator(-=) char('0')operator(\)) operator({) + ident(nf) operator(+=) ident(nz)operator(;) + reserved(for) operator(()ident(i) operator(=) integer(1)operator(;) ident(i) operator(<) ident(nz)operator(;) ident(i)operator(++\)) + reserved(if) operator(()ident(nd)operator(++) operator(<) integer(9)operator(\)) + ident(y) operator(*=) integer(10)operator(;) + reserved(else) reserved(if) operator(()ident(nd) operator(<=) ident(DBL_DIG) operator(+) integer(1)operator(\)) + ident(z) operator(*=) integer(10)operator(;) + reserved(if) operator(()ident(nd)operator(++) operator(<) integer(9)operator(\)) + ident(y) operator(=) integer(10)operator(*)ident(y) operator(+) ident(c)operator(;) + reserved(else) reserved(if) operator(()ident(nd) operator(<=) ident(DBL_DIG) operator(+) integer(1)operator(\)) + ident(z) operator(=) integer(10)operator(*)ident(z) operator(+) ident(c)operator(;) + ident(nz) operator(=) integer(0)operator(;) + operator(}) + operator(}) + operator(}) +label(dig_done)operator(:) + ident(e) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(c) operator(==) char('e') operator(||) ident(c) operator(==) char('E')operator(\)) operator({) + reserved(if) operator((!)ident(nd) operator(&&) operator(!)ident(nz) operator(&&) operator(!)ident(nz0)operator(\)) operator({) + reserved(goto) ident(ret0)operator(;) + operator(}) + ident(s00) operator(=) ident(s)operator(;) + ident(esign) operator(=) integer(0)operator(;) + reserved(switch) operator(()ident(c) operator(=) operator(*++)ident(s)operator(\)) operator({) + reserved(case) char('-')operator(:) + ident(esign) operator(=) integer(1)operator(;) + reserved(case) char('+')operator(:) + ident(c) operator(=) operator(*++)ident(s)operator(;) + operator(}) + reserved(if) operator(()ident(c) operator(>=) char('0') operator(&&) ident(c) operator(<=) char('9')operator(\)) operator({) + reserved(while) operator(()ident(c) operator(==) char('0')operator(\)) + ident(c) operator(=) operator(*++)ident(s)operator(;) + reserved(if) operator(()ident(c) operator(>) char('0') operator(&&) ident(c) operator(<=) char('9')operator(\)) operator({) + ident(L) operator(=) ident(c) operator(-) char('0')operator(;) + ident(s1) operator(=) ident(s)operator(;) + reserved(while) operator((()ident(c) operator(=) operator(*++)ident(s)operator(\)) operator(>=) char('0') operator(&&) ident(c) operator(<=) char('9')operator(\)) + ident(L) operator(=) integer(10)operator(*)ident(L) operator(+) ident(c) operator(-) char('0')operator(;) + reserved(if) operator(()ident(s) operator(-) ident(s1) operator(>) integer(8) operator(||) ident(L) operator(>) integer(19999)operator(\)) + comment(/* Avoid confusion from exponents + * so large that e might overflow. + */) + ident(e) operator(=) integer(19999)operator(;) comment(/* safe for 16 bit ints */) + reserved(else) + ident(e) operator(=) operator(()pre_type(int)operator(\))ident(L)operator(;) + reserved(if) operator(()ident(esign)operator(\)) + ident(e) operator(=) operator(-)ident(e)operator(;) + operator(}) + reserved(else) + ident(e) operator(=) integer(0)operator(;) + operator(}) + reserved(else) + ident(s) operator(=) ident(s00)operator(;) + operator(}) + reserved(if) operator((!)ident(nd)operator(\)) operator({) + reserved(if) operator((!)ident(nz) operator(&&) operator(!)ident(nz0)operator(\)) operator({) +preprocessor(#ifdef) ident(INFNAN_CHECK) + comment(/* Check for Nan and Infinity */) + reserved(switch) operator(()ident(c)operator(\)) operator({) + reserved(case) char('i')operator(:) + reserved(case) char('I')operator(:) + reserved(if) operator(()ident(match)operator((&)ident(s)operator(,)string<delimiter(")content(nf)delimiter(")>operator(\)\)) operator({) + operator(--)ident(s)operator(;) + reserved(if) operator((!)ident(match)operator((&)ident(s)operator(,)string<delimiter(")content(inity)delimiter(")>operator(\)\)) + operator(++)ident(s)operator(;) + ident(word0)operator(()ident(rv)operator(\)) operator(=) hex(0x7ff00000)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) integer(0)operator(;) + reserved(goto) ident(ret)operator(;) + operator(}) + reserved(break)operator(;) + reserved(case) char('n')operator(:) + reserved(case) char('N')operator(:) + reserved(if) operator(()ident(match)operator((&)ident(s)operator(,) string<delimiter(")content(an)delimiter(")>operator(\)\)) operator({) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(NAN_WORD0)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) ident(NAN_WORD1)operator(;) +preprocessor(#ifndef) ident(No_Hex_NaN) + reserved(if) operator((*)ident(s) operator(==) char('(')operator(\)) comment(/*\)*/) + ident(hexnan)operator((&)ident(rv)operator(,) operator(&)ident(s)operator(\);) +preprocessor(#endif) + reserved(goto) ident(ret)operator(;) + operator(}) + operator(}) +preprocessor(#endif) comment(/* INFNAN_CHECK */) +label(ret0)operator(:) + ident(s) operator(=) ident(s00)operator(;) + ident(sign) operator(=) integer(0)operator(;) + operator(}) + reserved(goto) ident(ret)operator(;) + operator(}) + ident(e1) operator(=) ident(e) operator(-=) ident(nf)operator(;) + + comment(/* Now we have nd0 digits, starting at s0, followed by a + * decimal point, followed by nd-nd0 digits. The number we're + * after is the integer represented by those digits times + * 10**e */) + + reserved(if) operator((!)ident(nd0)operator(\)) + ident(nd0) operator(=) ident(nd)operator(;) + ident(k) operator(=) ident(nd) operator(<) ident(DBL_DIG) operator(+) integer(1) operator(?) ident(nd) operator(:) ident(DBL_DIG) operator(+) integer(1)operator(;) + ident(dval)operator(()ident(rv)operator(\)) operator(=) ident(y)operator(;) + reserved(if) operator(()ident(k) operator(>) integer(9)operator(\)) operator({) +preprocessor(#ifdef) ident(SET_INEXACT) + reserved(if) operator(()ident(k) operator(>) ident(DBL_DIG)operator(\)) + ident(oldinexact) operator(=) ident(get_inexact)operator((\);) +preprocessor(#endif) + ident(dval)operator(()ident(rv)operator(\)) operator(=) ident(tens)operator([)ident(k) operator(-) integer(9)operator(]) operator(*) ident(dval)operator(()ident(rv)operator(\)) operator(+) ident(z)operator(;) + operator(}) + ident(bd0) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(nd) operator(<=) ident(DBL_DIG) +preprocessor(#ifndef) ident(RND_PRODQUOT) +preprocessor(#ifndef) ident(Honor_FLT_ROUNDS) + operator(&&) ident(Flt_Rounds) operator(==) integer(1) +preprocessor(#endif) +preprocessor(#endif) + operator(\)) operator({) + reserved(if) operator((!)ident(e)operator(\)) + reserved(goto) ident(ret)operator(;) + reserved(if) operator(()ident(e) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(e) operator(<=) ident(Ten_pmax)operator(\)) operator({) +preprocessor(#ifdef) ident(VAX) + reserved(goto) ident(vax_ovfl_check)operator(;) +preprocessor(#else) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + comment(/* round correctly FLT_ROUNDS = 2 or 3 */) + reserved(if) operator(()ident(sign)operator(\)) operator({) + ident(rv) operator(=) operator(-)ident(rv)operator(;) + ident(sign) operator(=) integer(0)operator(;) + operator(}) +preprocessor(#endif) + comment(/* rv = */) ident(rounded_product)operator(()ident(dval)operator(()ident(rv)operator(\),) ident(tens)operator([)ident(e)operator(]\);) + reserved(goto) ident(ret)operator(;) +preprocessor(#endif) + operator(}) + ident(i) operator(=) ident(DBL_DIG) operator(-) ident(nd)operator(;) + reserved(if) operator(()ident(e) operator(<=) ident(Ten_pmax) operator(+) ident(i)operator(\)) operator({) + comment(/* A fancier test would sometimes let us do + * this for larger i values. + */) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + comment(/* round correctly FLT_ROUNDS = 2 or 3 */) + reserved(if) operator(()ident(sign)operator(\)) operator({) + ident(rv) operator(=) operator(-)ident(rv)operator(;) + ident(sign) operator(=) integer(0)operator(;) + operator(}) +preprocessor(#endif) + ident(e) operator(-=) ident(i)operator(;) + ident(dval)operator(()ident(rv)operator(\)) operator(*=) ident(tens)operator([)ident(i)operator(];) +preprocessor(#ifdef) ident(VAX) + comment(/* VAX exponent range is so narrow we must + * worry about overflow here... + */) +label(vax_ovfl_check)operator(:) + ident(word0)operator(()ident(rv)operator(\)) operator(-=) ident(P)operator(*)ident(Exp_msk1)operator(;) + comment(/* rv = */) ident(rounded_product)operator(()ident(dval)operator(()ident(rv)operator(\),) ident(tens)operator([)ident(e)operator(]\);) + reserved(if) operator((()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) + operator(>) ident(Exp_msk1)operator(*()ident(DBL_MAX_EXP)operator(+)ident(Bias)operator(-)integer(1)operator(-)ident(P)operator(\)\)) + reserved(goto) ident(ovfl)operator(;) + ident(word0)operator(()ident(rv)operator(\)) operator(+=) ident(P)operator(*)ident(Exp_msk1)operator(;) +preprocessor(#else) + comment(/* rv = */) ident(rounded_product)operator(()ident(dval)operator(()ident(rv)operator(\),) ident(tens)operator([)ident(e)operator(]\);) +preprocessor(#endif) + reserved(goto) ident(ret)operator(;) + operator(}) + operator(}) +preprocessor(#ifndef) ident(Inaccurate_Divide) + reserved(else) reserved(if) operator(()ident(e) operator(>=) operator(-)ident(Ten_pmax)operator(\)) operator({) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + comment(/* round correctly FLT_ROUNDS = 2 or 3 */) + reserved(if) operator(()ident(sign)operator(\)) operator({) + ident(rv) operator(=) operator(-)ident(rv)operator(;) + ident(sign) operator(=) integer(0)operator(;) + operator(}) +preprocessor(#endif) + comment(/* rv = */) ident(rounded_quotient)operator(()ident(dval)operator(()ident(rv)operator(\),) ident(tens)operator([-)ident(e)operator(]\);) + reserved(goto) ident(ret)operator(;) + operator(}) +preprocessor(#endif) + operator(}) + ident(e1) operator(+=) ident(nd) operator(-) ident(k)operator(;) + +preprocessor(#ifdef) ident(IEEE_Arith) +preprocessor(#ifdef) ident(SET_INEXACT) + ident(inexact) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(k) operator(<=) ident(DBL_DIG)operator(\)) + ident(oldinexact) operator(=) ident(get_inexact)operator((\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(Avoid_Underflow) + ident(scale) operator(=) integer(0)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(if) operator((()ident(rounding) operator(=) ident(Flt_Rounds)operator(\)) operator(>=) integer(2)operator(\)) operator({) + reserved(if) operator(()ident(sign)operator(\)) + ident(rounding) operator(=) ident(rounding) operator(==) integer(2) operator(?) integer(0) operator(:) integer(2)operator(;) + reserved(else) + reserved(if) operator(()ident(rounding) operator(!=) integer(2)operator(\)) + ident(rounding) operator(=) integer(0)operator(;) + operator(}) +preprocessor(#endif) +preprocessor(#endif) comment(/*IEEE_Arith*/) + + comment(/* Get starting approximation = rv * 10**e1 */) + + reserved(if) operator(()ident(e1) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator((()ident(i) operator(=) ident(e1) operator(&) integer(15)operator(\)) operator(!=) integer(0)operator(\)) + ident(dval)operator(()ident(rv)operator(\)) operator(*=) ident(tens)operator([)ident(i)operator(];) + reserved(if) operator(()ident(e1) operator(&=) operator(~)integer(15)operator(\)) operator({) + reserved(if) operator(()ident(e1) operator(>) ident(DBL_MAX_10_EXP)operator(\)) operator({) +label(ovfl)operator(:) +preprocessor(#ifndef) ident(NO_ERRNO) + ident(errno) operator(=) ident(ERANGE)operator(;) +preprocessor(#endif) + comment(/* Can't trust HUGE_VAL */) +preprocessor(#ifdef) ident(IEEE_Arith) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(switch) operator(()ident(rounding)operator(\)) operator({) + reserved(case) integer(0)operator(:) comment(/* toward 0 */) + reserved(case) integer(3)operator(:) comment(/* toward -infinity */) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(Big0)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) ident(Big1)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(Exp_mask)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) integer(0)operator(;) + operator(}) +preprocessor(#else) comment(/*Honor_FLT_ROUNDS*/) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(Exp_mask)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) integer(0)operator(;) +preprocessor(#endif) comment(/*Honor_FLT_ROUNDS*/) +preprocessor(#ifdef) ident(SET_INEXACT) + comment(/* set overflow bit */) + ident(dval)operator(()ident(rv0)operator(\)) operator(=) float(1)ident(e300)operator(;) + ident(dval)operator(()ident(rv0)operator(\)) operator(*=) ident(dval)operator(()ident(rv0)operator(\);) +preprocessor(#endif) +preprocessor(#else) comment(/*IEEE_Arith*/) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(Big0)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) ident(Big1)operator(;) +preprocessor(#endif) comment(/*IEEE_Arith*/) + reserved(if) operator(()ident(bd0)operator(\)) + reserved(goto) ident(retfree)operator(;) + reserved(goto) ident(ret)operator(;) + operator(}) + ident(e1) operator(>>=) integer(4)operator(;) + reserved(for) operator(()ident(j) operator(=) integer(0)operator(;) ident(e1) operator(>) integer(1)operator(;) ident(j)operator(++,) ident(e1) operator(>>=) integer(1)operator(\)) + reserved(if) operator(()ident(e1) operator(&) integer(1)operator(\)) + ident(dval)operator(()ident(rv)operator(\)) operator(*=) ident(bigtens)operator([)ident(j)operator(];) + comment(/* The last multiplication could overflow. */) + ident(word0)operator(()ident(rv)operator(\)) operator(-=) ident(P)operator(*)ident(Exp_msk1)operator(;) + ident(dval)operator(()ident(rv)operator(\)) operator(*=) ident(bigtens)operator([)ident(j)operator(];) + reserved(if) operator((()ident(z) operator(=) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) + operator(>) ident(Exp_msk1)operator(*()ident(DBL_MAX_EXP)operator(+)ident(Bias)operator(-)ident(P)operator(\)\)) + reserved(goto) ident(ovfl)operator(;) + reserved(if) operator(()ident(z) operator(>) ident(Exp_msk1)operator(*()ident(DBL_MAX_EXP)operator(+)ident(Bias)operator(-)integer(1)operator(-)ident(P)operator(\)\)) operator({) + comment(/* set to largest number */) + comment(/* (Can't trust DBL_MAX\) */) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(Big0)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) ident(Big1)operator(;) + operator(}) + reserved(else) + ident(word0)operator(()ident(rv)operator(\)) operator(+=) ident(P)operator(*)ident(Exp_msk1)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator(()ident(e1) operator(<) integer(0)operator(\)) operator({) + ident(e1) operator(=) operator(-)ident(e1)operator(;) + reserved(if) operator((()ident(i) operator(=) ident(e1) operator(&) integer(15)operator(\)) operator(!=) integer(0)operator(\)) + ident(dval)operator(()ident(rv)operator(\)) operator(/=) ident(tens)operator([)ident(i)operator(];) + reserved(if) operator(()ident(e1) operator(>>=) integer(4)operator(\)) operator({) + reserved(if) operator(()ident(e1) operator(>=) integer(1) operator(<<) ident(n_bigtens)operator(\)) + reserved(goto) ident(undfl)operator(;) +preprocessor(#ifdef) ident(Avoid_Underflow) + reserved(if) operator(()ident(e1) operator(&) ident(Scale_Bit)operator(\)) + ident(scale) operator(=) integer(2)operator(*)ident(P)operator(;) + reserved(for) operator(()ident(j) operator(=) integer(0)operator(;) ident(e1) operator(>) integer(0)operator(;) ident(j)operator(++,) ident(e1) operator(>>=) integer(1)operator(\)) + reserved(if) operator(()ident(e1) operator(&) integer(1)operator(\)) + ident(dval)operator(()ident(rv)operator(\)) operator(*=) ident(tinytens)operator([)ident(j)operator(];) + reserved(if) operator(()ident(scale) operator(&&) operator(()ident(j) operator(=) integer(2)operator(*)ident(P) operator(+) integer(1) operator(-) operator((()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) + operator(>>) ident(Exp_shift)operator(\)\)) operator(>) integer(0)operator(\)) operator({) + comment(/* scaled rv is denormal; zap j low bits */) + reserved(if) operator(()ident(j) operator(>=) integer(32)operator(\)) operator({) + ident(word1)operator(()ident(rv)operator(\)) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(j) operator(>=) integer(53)operator(\)) + ident(word0)operator(()ident(rv)operator(\)) operator(=) operator(()ident(P)operator(+)integer(2)operator(\)*)ident(Exp_msk1)operator(;) + reserved(else) + ident(word0)operator(()ident(rv)operator(\)) operator(&=) hex(0xffffffff) operator(<<) operator(()ident(j)operator(-)integer(32)operator(\);) + operator(}) + reserved(else) + ident(word1)operator(()ident(rv)operator(\)) operator(&=) hex(0xffffffff) operator(<<) ident(j)operator(;) + operator(}) +preprocessor(#else) + reserved(for) operator(()ident(j) operator(=) integer(0)operator(;) ident(e1) operator(>) integer(1)operator(;) ident(j)operator(++,) ident(e1) operator(>>=) integer(1)operator(\)) + reserved(if) operator(()ident(e1) operator(&) integer(1)operator(\)) + ident(dval)operator(()ident(rv)operator(\)) operator(*=) ident(tinytens)operator([)ident(j)operator(];) + comment(/* The last multiplication could underflow. */) + ident(dval)operator(()ident(rv0)operator(\)) operator(=) ident(dval)operator(()ident(rv)operator(\);) + ident(dval)operator(()ident(rv)operator(\)) operator(*=) ident(tinytens)operator([)ident(j)operator(];) + reserved(if) operator((!)ident(dval)operator(()ident(rv)operator(\)\)) operator({) + ident(dval)operator(()ident(rv)operator(\)) operator(=) float(2)operator(.)operator(*)ident(dval)operator(()ident(rv0)operator(\);) + ident(dval)operator(()ident(rv)operator(\)) operator(*=) ident(tinytens)operator([)ident(j)operator(];) +preprocessor(#endif) + reserved(if) operator((!)ident(dval)operator(()ident(rv)operator(\)\)) operator({) +label(undfl)operator(:) + ident(dval)operator(()ident(rv)operator(\)) operator(=) float(0)operator(.)operator(;) +preprocessor(#ifndef) ident(NO_ERRNO) + ident(errno) operator(=) ident(ERANGE)operator(;) +preprocessor(#endif) + reserved(if) operator(()ident(bd0)operator(\)) + reserved(goto) ident(retfree)operator(;) + reserved(goto) ident(ret)operator(;) + operator(}) +preprocessor(#ifndef) ident(Avoid_Underflow) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(Tiny0)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) ident(Tiny1)operator(;) + comment(/* The refinement below will clean + * this approximation up. + */) + operator(}) +preprocessor(#endif) + operator(}) + operator(}) + + comment(/* Now the hard part -- adjusting rv to the correct value.*/) + + comment(/* Put digits into bd: true value = bd * 10^e */) + + ident(bd0) operator(=) ident(s2b)operator(()ident(s0)operator(,) ident(nd0)operator(,) ident(nd)operator(,) ident(y)operator(\);) + + reserved(for) operator((;;\)) operator({) + ident(bd) operator(=) ident(Balloc)operator(()ident(bd0)operator(->)ident(k)operator(\);) + ident(Bcopy)operator(()ident(bd)operator(,) ident(bd0)operator(\);) + ident(bb) operator(=) ident(d2b)operator(()ident(dval)operator(()ident(rv)operator(\),) operator(&)ident(bbe)operator(,) operator(&)ident(bbbits)operator(\);) comment(/* rv = bb * 2^bbe */) + ident(bs) operator(=) ident(i2b)operator(()integer(1)operator(\);) + + reserved(if) operator(()ident(e) operator(>=) integer(0)operator(\)) operator({) + ident(bb2) operator(=) ident(bb5) operator(=) integer(0)operator(;) + ident(bd2) operator(=) ident(bd5) operator(=) ident(e)operator(;) + operator(}) + reserved(else) operator({) + ident(bb2) operator(=) ident(bb5) operator(=) operator(-)ident(e)operator(;) + ident(bd2) operator(=) ident(bd5) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(bbe) operator(>=) integer(0)operator(\)) + ident(bb2) operator(+=) ident(bbe)operator(;) + reserved(else) + ident(bd2) operator(-=) ident(bbe)operator(;) + ident(bs2) operator(=) ident(bb2)operator(;) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(if) operator(()ident(rounding) operator(!=) integer(1)operator(\)) + ident(bs2)operator(++;) +preprocessor(#endif) +preprocessor(#ifdef) ident(Avoid_Underflow) + ident(j) operator(=) ident(bbe) operator(-) ident(scale)operator(;) + ident(i) operator(=) ident(j) operator(+) ident(bbbits) operator(-) integer(1)operator(;) comment(/* logb(rv\) */) + reserved(if) operator(()ident(i) operator(<) ident(Emin)operator(\)) comment(/* denormal */) + ident(j) operator(+=) ident(P) operator(-) ident(Emin)operator(;) + reserved(else) + ident(j) operator(=) ident(P) operator(+) integer(1) operator(-) ident(bbbits)operator(;) +preprocessor(#else) comment(/*Avoid_Underflow*/) +preprocessor(#ifdef) ident(Sudden_Underflow) +preprocessor(#ifdef) ident(IBM) + ident(j) operator(=) integer(1) operator(+) integer(4)operator(*)ident(P) operator(-) integer(3) operator(-) ident(bbbits) operator(+) operator((()ident(bbe) operator(+) ident(bbbits) operator(-) integer(1)operator(\)) operator(&) integer(3)operator(\);) +preprocessor(#else) + ident(j) operator(=) ident(P) operator(+) integer(1) operator(-) ident(bbbits)operator(;) +preprocessor(#endif) +preprocessor(#else) comment(/*Sudden_Underflow*/) + ident(j) operator(=) ident(bbe)operator(;) + ident(i) operator(=) ident(j) operator(+) ident(bbbits) operator(-) integer(1)operator(;) comment(/* logb(rv\) */) + reserved(if) operator(()ident(i) operator(<) ident(Emin)operator(\)) comment(/* denormal */) + ident(j) operator(+=) ident(P) operator(-) ident(Emin)operator(;) + reserved(else) + ident(j) operator(=) ident(P) operator(+) integer(1) operator(-) ident(bbbits)operator(;) +preprocessor(#endif) comment(/*Sudden_Underflow*/) +preprocessor(#endif) comment(/*Avoid_Underflow*/) + ident(bb2) operator(+=) ident(j)operator(;) + ident(bd2) operator(+=) ident(j)operator(;) +preprocessor(#ifdef) ident(Avoid_Underflow) + ident(bd2) operator(+=) ident(scale)operator(;) +preprocessor(#endif) + ident(i) operator(=) ident(bb2) operator(<) ident(bd2) operator(?) ident(bb2) operator(:) ident(bd2)operator(;) + reserved(if) operator(()ident(i) operator(>) ident(bs2)operator(\)) + ident(i) operator(=) ident(bs2)operator(;) + reserved(if) operator(()ident(i) operator(>) integer(0)operator(\)) operator({) + ident(bb2) operator(-=) ident(i)operator(;) + ident(bd2) operator(-=) ident(i)operator(;) + ident(bs2) operator(-=) ident(i)operator(;) + operator(}) + reserved(if) operator(()ident(bb5) operator(>) integer(0)operator(\)) operator({) + ident(bs) operator(=) ident(pow5mult)operator(()ident(bs)operator(,) ident(bb5)operator(\);) + ident(bb1) operator(=) ident(mult)operator(()ident(bs)operator(,) ident(bb)operator(\);) + ident(Bfree)operator(()ident(bb)operator(\);) + ident(bb) operator(=) ident(bb1)operator(;) + operator(}) + reserved(if) operator(()ident(bb2) operator(>) integer(0)operator(\)) + ident(bb) operator(=) ident(lshift)operator(()ident(bb)operator(,) ident(bb2)operator(\);) + reserved(if) operator(()ident(bd5) operator(>) integer(0)operator(\)) + ident(bd) operator(=) ident(pow5mult)operator(()ident(bd)operator(,) ident(bd5)operator(\);) + reserved(if) operator(()ident(bd2) operator(>) integer(0)operator(\)) + ident(bd) operator(=) ident(lshift)operator(()ident(bd)operator(,) ident(bd2)operator(\);) + reserved(if) operator(()ident(bs2) operator(>) integer(0)operator(\)) + ident(bs) operator(=) ident(lshift)operator(()ident(bs)operator(,) ident(bs2)operator(\);) + ident(delta) operator(=) ident(diff)operator(()ident(bb)operator(,) ident(bd)operator(\);) + ident(dsign) operator(=) ident(delta)operator(->)ident(sign)operator(;) + ident(delta)operator(->)ident(sign) operator(=) integer(0)operator(;) + ident(i) operator(=) ident(cmp)operator(()ident(delta)operator(,) ident(bs)operator(\);) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(if) operator(()ident(rounding) operator(!=) integer(1)operator(\)) operator({) + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) operator({) + comment(/* Error is less than an ulp */) + reserved(if) operator((!)ident(delta)operator(->)ident(x)operator([)integer(0)operator(]) operator(&&) ident(delta)operator(->)ident(wds) operator(<=) integer(1)operator(\)) operator({) + comment(/* exact */) +preprocessor(#ifdef) ident(SET_INEXACT) + ident(inexact) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(rounding)operator(\)) operator({) + reserved(if) operator(()ident(dsign)operator(\)) operator({) + ident(adj) operator(=) float(1)operator(.)operator(;) + reserved(goto) ident(apply_adj)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator((!)ident(dsign)operator(\)) operator({) + ident(adj) operator(=) operator(-)float(1)operator(.)operator(;) + reserved(if) operator((!)ident(word1)operator(()ident(rv)operator(\)) + operator(&&) operator(!()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Frac_mask)operator(\)\)) operator({) + ident(y) operator(=) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(;) +preprocessor(#ifdef) ident(Avoid_Underflow) + reserved(if) operator((!)ident(scale) operator(||) ident(y) operator(>) integer(2)operator(*)ident(P)operator(*)ident(Exp_msk1)operator(\)) +preprocessor(#else) + reserved(if) operator(()ident(y)operator(\)) +preprocessor(#endif) + operator({) + ident(delta) operator(=) ident(lshift)operator(()ident(delta)operator(,)ident(Log2P)operator(\);) + reserved(if) operator(()ident(cmp)operator(()ident(delta)operator(,) ident(bs)operator(\)) operator(<=) integer(0)operator(\)) + ident(adj) operator(=) operator(-)float(0)float(.5)operator(;) + operator(}) + operator(}) +label(apply_adj)operator(:) +preprocessor(#ifdef) ident(Avoid_Underflow) + reserved(if) operator(()ident(scale) operator(&&) operator(()ident(y) operator(=) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) + operator(<=) integer(2)operator(*)ident(P)operator(*)ident(Exp_msk1)operator(\)) + ident(word0)operator(()ident(adj)operator(\)) operator(+=) operator(()integer(2)operator(*)ident(P)operator(+)integer(1)operator(\)*)ident(Exp_msk1) operator(-) ident(y)operator(;) +preprocessor(#else) +preprocessor(#ifdef) ident(Sudden_Underflow) + reserved(if) operator((()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(<=) + ident(P)operator(*)ident(Exp_msk1)operator(\)) operator({) + ident(word0)operator(()ident(rv)operator(\)) operator(+=) ident(P)operator(*)ident(Exp_msk1)operator(;) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(adj)operator(*)ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) + ident(word0)operator(()ident(rv)operator(\)) operator(-=) ident(P)operator(*)ident(Exp_msk1)operator(;) + operator(}) + reserved(else) +preprocessor(#endif) comment(/*Sudden_Underflow*/) +preprocessor(#endif) comment(/*Avoid_Underflow*/) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(adj)operator(*)ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) + operator(}) + reserved(break)operator(;) + operator(}) + ident(adj) operator(=) ident(ratio)operator(()ident(delta)operator(,) ident(bs)operator(\);) + reserved(if) operator(()ident(adj) operator(<) float(1)operator(.)operator(\)) + ident(adj) operator(=) float(1)operator(.)operator(;) + reserved(if) operator(()ident(adj) operator(<=) hex(0x7ffffffe)operator(\)) operator({) + comment(/* adj = rounding ? ceil(adj\) : floor(adj\); */) + ident(y) operator(=) ident(adj)operator(;) + reserved(if) operator(()ident(y) operator(!=) ident(adj)operator(\)) operator({) + reserved(if) operator((!(()ident(rounding)operator(>>)integer(1)operator(\)) operator(^) ident(dsign)operator(\)\)) + ident(y)operator(++;) + ident(adj) operator(=) ident(y)operator(;) + operator(}) + operator(}) +preprocessor(#ifdef) ident(Avoid_Underflow) + reserved(if) operator(()ident(scale) operator(&&) operator(()ident(y) operator(=) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(<=) integer(2)operator(*)ident(P)operator(*)ident(Exp_msk1)operator(\)) + ident(word0)operator(()ident(adj)operator(\)) operator(+=) operator(()integer(2)operator(*)ident(P)operator(+)integer(1)operator(\)*)ident(Exp_msk1) operator(-) ident(y)operator(;) +preprocessor(#else) +preprocessor(#ifdef) ident(Sudden_Underflow) + reserved(if) operator((()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(<=) ident(P)operator(*)ident(Exp_msk1)operator(\)) operator({) + ident(word0)operator(()ident(rv)operator(\)) operator(+=) ident(P)operator(*)ident(Exp_msk1)operator(;) + ident(adj) operator(*=) ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) + reserved(if) operator(()ident(dsign)operator(\)) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(adj)operator(;) + reserved(else) + ident(dval)operator(()ident(rv)operator(\)) operator(-=) ident(adj)operator(;) + ident(word0)operator(()ident(rv)operator(\)) operator(-=) ident(P)operator(*)ident(Exp_msk1)operator(;) + reserved(goto) ident(cont)operator(;) + operator(}) +preprocessor(#endif) comment(/*Sudden_Underflow*/) +preprocessor(#endif) comment(/*Avoid_Underflow*/) + ident(adj) operator(*=) ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) + reserved(if) operator(()ident(dsign)operator(\)) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(adj)operator(;) + reserved(else) + ident(dval)operator(()ident(rv)operator(\)) operator(-=) ident(adj)operator(;) + reserved(goto) ident(cont)operator(;) + operator(}) +preprocessor(#endif) comment(/*Honor_FLT_ROUNDS*/) + + reserved(if) operator(()ident(i) operator(<) integer(0)operator(\)) operator({) + comment(/* Error is less than half an ulp -- check for + * special case of mantissa a power of two. + */) + reserved(if) operator(()ident(dsign) operator(||) ident(word1)operator(()ident(rv)operator(\)) operator(||) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Bndry_mask) +preprocessor(#ifdef) ident(IEEE_Arith) +preprocessor(#ifdef) ident(Avoid_Underflow) + operator(||) operator(()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(<=) operator(()integer(2)operator(*)ident(P)operator(+)integer(1)operator(\)*)ident(Exp_msk1) +preprocessor(#else) + operator(||) operator(()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(<=) ident(Exp_msk1) +preprocessor(#endif) +preprocessor(#endif) + operator(\)) operator({) +preprocessor(#ifdef) ident(SET_INEXACT) + reserved(if) operator((!)ident(delta)operator(->)ident(x)operator([)integer(0)operator(]) operator(&&) ident(delta)operator(->)ident(wds) operator(<=) integer(1)operator(\)) + ident(inexact) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(break)operator(;) + operator(}) + reserved(if) operator((!)ident(delta)operator(->)ident(x)operator([)integer(0)operator(]) operator(&&) ident(delta)operator(->)ident(wds) operator(<=) integer(1)operator(\)) operator({) + comment(/* exact result */) +preprocessor(#ifdef) ident(SET_INEXACT) + ident(inexact) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(break)operator(;) + operator(}) + ident(delta) operator(=) ident(lshift)operator(()ident(delta)operator(,)ident(Log2P)operator(\);) + reserved(if) operator(()ident(cmp)operator(()ident(delta)operator(,) ident(bs)operator(\)) operator(>) integer(0)operator(\)) + reserved(goto) ident(drop_down)operator(;) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(i) operator(==) integer(0)operator(\)) operator({) + comment(/* exactly half-way between */) + reserved(if) operator(()ident(dsign)operator(\)) operator({) + reserved(if) operator((()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Bndry_mask1)operator(\)) operator(==) ident(Bndry_mask1) + operator(&&) ident(word1)operator(()ident(rv)operator(\)) operator(==) operator(() +preprocessor(#ifdef) ident(Avoid_Underflow) + operator(()ident(scale) operator(&&) operator(()ident(y) operator(=) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(<=) integer(2)operator(*)ident(P)operator(*)ident(Exp_msk1)operator(\)) + operator(?) operator(()hex(0xffffffff) operator(&) operator(()hex(0xffffffff) operator(<<) operator(()integer(2)operator(*)ident(P)operator(+)integer(1)operator(-()ident(y)operator(>>)ident(Exp_shift)operator(\)\)\)\)) operator(:) +preprocessor(#endif) + hex(0xffffffff)operator(\)\)) operator({) + comment(/*boundary case -- increment exponent*/) + ident(word0)operator(()ident(rv)operator(\)) operator(=) operator(()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) + operator(+) ident(Exp_msk1) +preprocessor(#ifdef) ident(IBM) + operator(|) ident(Exp_msk1) operator(>>) integer(4) +preprocessor(#endif) + operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) integer(0)operator(;) +preprocessor(#ifdef) ident(Avoid_Underflow) + ident(dsign) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator((!()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Bndry_mask)operator(\)) operator(&&) operator(!)ident(word1)operator(()ident(rv)operator(\)\)) operator({) +label(drop_down)operator(:) + comment(/* boundary case -- decrement exponent */) +preprocessor(#ifdef) ident(Sudden_Underflow) comment(/*{{*/) + ident(L) operator(=) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(;) +preprocessor(#ifdef) ident(IBM) + reserved(if) operator(()ident(L) operator(<) ident(Exp_msk1)operator(\)) +preprocessor(#else) +preprocessor(#ifdef) ident(Avoid_Underflow) + reserved(if) operator(()ident(L) operator(<=) operator(()ident(scale) operator(?) operator(()integer(2)operator(*)ident(P)operator(+)integer(1)operator(\)*)ident(Exp_msk1) operator(:) ident(Exp_msk1)operator(\)\)) +preprocessor(#else) + reserved(if) operator(()ident(L) operator(<=) ident(Exp_msk1)operator(\)) +preprocessor(#endif) comment(/*Avoid_Underflow*/) +preprocessor(#endif) comment(/*IBM*/) + reserved(goto) ident(undfl)operator(;) + ident(L) operator(-=) ident(Exp_msk1)operator(;) +preprocessor(#else) comment(/*Sudden_Underflow}{*/) +preprocessor(#ifdef) ident(Avoid_Underflow) + reserved(if) operator(()ident(scale)operator(\)) operator({) + ident(L) operator(=) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(;) + reserved(if) operator(()ident(L) operator(<=) operator(()integer(2)operator(*)ident(P)operator(+)integer(1)operator(\)*)ident(Exp_msk1)operator(\)) operator({) + reserved(if) operator(()ident(L) operator(>) operator(()ident(P)operator(+)integer(2)operator(\)*)ident(Exp_msk1)operator(\)) + comment(/* round even ==> */) + comment(/* accept rv */) + reserved(break)operator(;) + comment(/* rv = smallest denormal */) + reserved(goto) ident(undfl)operator(;) + operator(}) + operator(}) +preprocessor(#endif) comment(/*Avoid_Underflow*/) + ident(L) operator(=) operator(()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(-) ident(Exp_msk1)operator(;) +preprocessor(#endif) comment(/*Sudden_Underflow}}*/) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(L) operator(|) ident(Bndry_mask1)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) hex(0xffffffff)operator(;) +preprocessor(#ifdef) ident(IBM) + reserved(goto) ident(cont)operator(;) +preprocessor(#else) + reserved(break)operator(;) +preprocessor(#endif) + operator(}) +preprocessor(#ifndef) ident(ROUND_BIASED) + reserved(if) operator((!()ident(word1)operator(()ident(rv)operator(\)) operator(&) ident(LSB)operator(\)\)) + reserved(break)operator(;) +preprocessor(#endif) + reserved(if) operator(()ident(dsign)operator(\)) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) +preprocessor(#ifndef) ident(ROUND_BIASED) + reserved(else) operator({) + ident(dval)operator(()ident(rv)operator(\)) operator(-=) ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) +preprocessor(#ifndef) ident(Sudden_Underflow) + reserved(if) operator((!)ident(dval)operator(()ident(rv)operator(\)\)) + reserved(goto) ident(undfl)operator(;) +preprocessor(#endif) + operator(}) +preprocessor(#ifdef) ident(Avoid_Underflow) + ident(dsign) operator(=) integer(1) operator(-) ident(dsign)operator(;) +preprocessor(#endif) +preprocessor(#endif) + reserved(break)operator(;) + operator(}) + reserved(if) operator((()ident(aadj) operator(=) ident(ratio)operator(()ident(delta)operator(,) ident(bs)operator(\)\)) operator(<=) float(2)operator(.)operator(\)) operator({) + reserved(if) operator(()ident(dsign)operator(\)) + ident(aadj) operator(=) ident(aadj1) operator(=) float(1)operator(.)operator(;) + reserved(else) reserved(if) operator(()ident(word1)operator(()ident(rv)operator(\)) operator(||) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Bndry_mask)operator(\)) operator({) +preprocessor(#ifndef) ident(Sudden_Underflow) + reserved(if) operator(()ident(word1)operator(()ident(rv)operator(\)) operator(==) ident(Tiny1) operator(&&) operator(!)ident(word0)operator(()ident(rv)operator(\)\)) + reserved(goto) ident(undfl)operator(;) +preprocessor(#endif) + ident(aadj) operator(=) float(1)operator(.)operator(;) + ident(aadj1) operator(=) operator(-)float(1)operator(.)operator(;) + operator(}) + reserved(else) operator({) + comment(/* special case -- power of FLT_RADIX to be */) + comment(/* rounded down... */) + + reserved(if) operator(()ident(aadj) operator(<) float(2)operator(.)operator(/)ident(FLT_RADIX)operator(\)) + ident(aadj) operator(=) float(1)operator(.)operator(/)ident(FLT_RADIX)operator(;) + reserved(else) + ident(aadj) operator(*=) float(0)float(.5)operator(;) + ident(aadj1) operator(=) operator(-)ident(aadj)operator(;) + operator(}) + operator(}) + reserved(else) operator({) + ident(aadj) operator(*=) float(0)float(.5)operator(;) + ident(aadj1) operator(=) ident(dsign) operator(?) ident(aadj) operator(:) operator(-)ident(aadj)operator(;) +preprocessor(#ifdef) ident(Check_FLT_ROUNDS) + reserved(switch) operator(()ident(Rounding)operator(\)) operator({) + reserved(case) integer(2)operator(:) comment(/* towards +infinity */) + ident(aadj1) operator(-=) float(0)float(.5)operator(;) + reserved(break)operator(;) + reserved(case) integer(0)operator(:) comment(/* towards 0 */) + reserved(case) integer(3)operator(:) comment(/* towards -infinity */) + ident(aadj1) operator(+=) float(0)float(.5)operator(;) + operator(}) +preprocessor(#else) + reserved(if) operator(()ident(Flt_Rounds) operator(==) integer(0)operator(\)) + ident(aadj1) operator(+=) float(0)float(.5)operator(;) +preprocessor(#endif) comment(/*Check_FLT_ROUNDS*/) + operator(}) + ident(y) operator(=) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(;) + + comment(/* Check for overflow */) + + reserved(if) operator(()ident(y) operator(==) ident(Exp_msk1)operator(*()ident(DBL_MAX_EXP)operator(+)ident(Bias)operator(-)integer(1)operator(\)\)) operator({) + ident(dval)operator(()ident(rv0)operator(\)) operator(=) ident(dval)operator(()ident(rv)operator(\);) + ident(word0)operator(()ident(rv)operator(\)) operator(-=) ident(P)operator(*)ident(Exp_msk1)operator(;) + ident(adj) operator(=) ident(aadj1) operator(*) ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(adj)operator(;) + reserved(if) operator((()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(>=) + ident(Exp_msk1)operator(*()ident(DBL_MAX_EXP)operator(+)ident(Bias)operator(-)ident(P)operator(\)\)) operator({) + reserved(if) operator(()ident(word0)operator(()ident(rv0)operator(\)) operator(==) ident(Big0) operator(&&) ident(word1)operator(()ident(rv0)operator(\)) operator(==) ident(Big1)operator(\)) + reserved(goto) ident(ovfl)operator(;) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(Big0)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) ident(Big1)operator(;) + reserved(goto) ident(cont)operator(;) + operator(}) + reserved(else) + ident(word0)operator(()ident(rv)operator(\)) operator(+=) ident(P)operator(*)ident(Exp_msk1)operator(;) + operator(}) + reserved(else) operator({) +preprocessor(#ifdef) ident(Avoid_Underflow) + reserved(if) operator(()ident(scale) operator(&&) ident(y) operator(<=) integer(2)operator(*)ident(P)operator(*)ident(Exp_msk1)operator(\)) operator({) + reserved(if) operator(()ident(aadj) operator(<=) hex(0x7fffffff)operator(\)) operator({) + reserved(if) operator((()ident(z) operator(=) ident(aadj)operator(\)) operator(<=) integer(0)operator(\)) + ident(z) operator(=) integer(1)operator(;) + ident(aadj) operator(=) ident(z)operator(;) + ident(aadj1) operator(=) ident(dsign) operator(?) ident(aadj) operator(:) operator(-)ident(aadj)operator(;) + operator(}) + ident(word0)operator(()ident(aadj1)operator(\)) operator(+=) operator(()integer(2)operator(*)ident(P)operator(+)integer(1)operator(\)*)ident(Exp_msk1) operator(-) ident(y)operator(;) + operator(}) + ident(adj) operator(=) ident(aadj1) operator(*) ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(adj)operator(;) +preprocessor(#else) +preprocessor(#ifdef) ident(Sudden_Underflow) + reserved(if) operator((()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(<=) ident(P)operator(*)ident(Exp_msk1)operator(\)) operator({) + ident(dval)operator(()ident(rv0)operator(\)) operator(=) ident(dval)operator(()ident(rv)operator(\);) + ident(word0)operator(()ident(rv)operator(\)) operator(+=) ident(P)operator(*)ident(Exp_msk1)operator(;) + ident(adj) operator(=) ident(aadj1) operator(*) ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(adj)operator(;) +preprocessor(#ifdef) ident(IBM) + reserved(if) operator((()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(<) ident(P)operator(*)ident(Exp_msk1)operator(\)) +preprocessor(#else) + reserved(if) operator((()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(<=) ident(P)operator(*)ident(Exp_msk1)operator(\)) +preprocessor(#endif) + operator({) + reserved(if) operator(()ident(word0)operator(()ident(rv0)operator(\)) operator(==) ident(Tiny0) operator(&&) ident(word1)operator(()ident(rv0)operator(\)) operator(==) ident(Tiny1)operator(\)) + reserved(goto) ident(undfl)operator(;) + ident(word0)operator(()ident(rv)operator(\)) operator(=) ident(Tiny0)operator(;) + ident(word1)operator(()ident(rv)operator(\)) operator(=) ident(Tiny1)operator(;) + reserved(goto) ident(cont)operator(;) + operator(}) + reserved(else) + ident(word0)operator(()ident(rv)operator(\)) operator(-=) ident(P)operator(*)ident(Exp_msk1)operator(;) + operator(}) + reserved(else) operator({) + ident(adj) operator(=) ident(aadj1) operator(*) ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(adj)operator(;) + operator(}) +preprocessor(#else) comment(/*Sudden_Underflow*/) + comment(/* Compute adj so that the IEEE rounding rules will + * correctly round rv + adj in some half-way cases. + * If rv * ulp(rv\) is denormalized (i.e., + * y <= (P-1\)*Exp_msk1\), we must adjust aadj to avoid + * trouble from bits lost to denormalization; + * example: 1.2e-307 . + */) + reserved(if) operator(()ident(y) operator(<=) operator(()ident(P)operator(-)integer(1)operator(\)*)ident(Exp_msk1) operator(&&) ident(aadj) operator(>) float(1)operator(.)operator(\)) operator({) + ident(aadj1) operator(=) operator(()pre_type(double)operator(\)()pre_type(int)operator(\)()ident(aadj) operator(+) float(0)float(.5)operator(\);) + reserved(if) operator((!)ident(dsign)operator(\)) + ident(aadj1) operator(=) operator(-)ident(aadj1)operator(;) + operator(}) + ident(adj) operator(=) ident(aadj1) operator(*) ident(ulp)operator(()ident(dval)operator(()ident(rv)operator(\)\);) + ident(dval)operator(()ident(rv)operator(\)) operator(+=) ident(adj)operator(;) +preprocessor(#endif) comment(/*Sudden_Underflow*/) +preprocessor(#endif) comment(/*Avoid_Underflow*/) + operator(}) + ident(z) operator(=) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(;) +preprocessor(#ifndef) ident(SET_INEXACT) +preprocessor(#ifdef) ident(Avoid_Underflow) + reserved(if) operator((!)ident(scale)operator(\)) +preprocessor(#endif) + reserved(if) operator(()ident(y) operator(==) ident(z)operator(\)) operator({) + comment(/* Can we stop now? */) + ident(L) operator(=) operator(()ident(Long)operator(\))ident(aadj)operator(;) + ident(aadj) operator(-=) ident(L)operator(;) + comment(/* The tolerances below are conservative. */) + reserved(if) operator(()ident(dsign) operator(||) ident(word1)operator(()ident(rv)operator(\)) operator(||) ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Bndry_mask)operator(\)) operator({) + reserved(if) operator(()ident(aadj) operator(<) float(.4999999) operator(||) ident(aadj) operator(>) float(.5000001)operator(\)) + reserved(break)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(aadj) operator(<) float(.4999999)operator(/)ident(FLT_RADIX)operator(\)) + reserved(break)operator(;) + operator(}) +preprocessor(#endif) +label(cont)operator(:) + ident(Bfree)operator(()ident(bb)operator(\);) + ident(Bfree)operator(()ident(bd)operator(\);) + ident(Bfree)operator(()ident(bs)operator(\);) + ident(Bfree)operator(()ident(delta)operator(\);) + operator(}) +preprocessor(#ifdef) ident(SET_INEXACT) + reserved(if) operator(()ident(inexact)operator(\)) operator({) + reserved(if) operator((!)ident(oldinexact)operator(\)) operator({) + ident(word0)operator(()ident(rv0)operator(\)) operator(=) ident(Exp_1) operator(+) operator(()integer(70) operator(<<) ident(Exp_shift)operator(\);) + ident(word1)operator(()ident(rv0)operator(\)) operator(=) integer(0)operator(;) + ident(dval)operator(()ident(rv0)operator(\)) operator(+=) float(1)operator(.)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator((!)ident(oldinexact)operator(\)) + ident(clear_inexact)operator((\);) +preprocessor(#endif) +preprocessor(#ifdef) ident(Avoid_Underflow) + reserved(if) operator(()ident(scale)operator(\)) operator({) + ident(word0)operator(()ident(rv0)operator(\)) operator(=) ident(Exp_1) operator(-) integer(2)operator(*)ident(P)operator(*)ident(Exp_msk1)operator(;) + ident(word1)operator(()ident(rv0)operator(\)) operator(=) integer(0)operator(;) + ident(dval)operator(()ident(rv)operator(\)) operator(*=) ident(dval)operator(()ident(rv0)operator(\);) +preprocessor(#ifndef) ident(NO_ERRNO) + comment(/* try to avoid the bug of testing an 8087 register value */) + reserved(if) operator(()ident(word0)operator(()ident(rv)operator(\)) operator(==) integer(0) operator(&&) ident(word1)operator(()ident(rv)operator(\)) operator(==) integer(0)operator(\)) + ident(errno) operator(=) ident(ERANGE)operator(;) +preprocessor(#endif) + operator(}) +preprocessor(#endif) comment(/* Avoid_Underflow */) +preprocessor(#ifdef) ident(SET_INEXACT) + reserved(if) operator(()ident(inexact) operator(&&) operator(!()ident(word0)operator(()ident(rv)operator(\)) operator(&) ident(Exp_mask)operator(\)\)) operator({) + comment(/* set underflow bit */) + ident(dval)operator(()ident(rv0)operator(\)) operator(=) float(1)ident(e)operator(-)integer(300)operator(;) + ident(dval)operator(()ident(rv0)operator(\)) operator(*=) ident(dval)operator(()ident(rv0)operator(\);) + operator(}) +preprocessor(#endif) +label(retfree)operator(:) + ident(Bfree)operator(()ident(bb)operator(\);) + ident(Bfree)operator(()ident(bd)operator(\);) + ident(Bfree)operator(()ident(bs)operator(\);) + ident(Bfree)operator(()ident(bd0)operator(\);) + ident(Bfree)operator(()ident(delta)operator(\);) +label(ret)operator(:) + reserved(if) operator(()ident(se)operator(\)) + operator(*)ident(se) operator(=) operator(()pre_type(char) operator(*\))ident(s)operator(;) + reserved(return) ident(sign) operator(?) operator(-)ident(dval)operator(()ident(rv)operator(\)) operator(:) ident(dval)operator(()ident(rv)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(quorem)operator(()ident(Bigint) operator(*)ident(b)operator(,) ident(Bigint) operator(*)ident(S)operator(\)) +operator({) + pre_type(int) ident(n)operator(;) + ident(ULong) operator(*)ident(bx)operator(,) operator(*)ident(bxe)operator(,) ident(q)operator(,) operator(*)ident(sx)operator(,) operator(*)ident(sxe)operator(;) +preprocessor(#ifdef) ident(ULLong) + ident(ULLong) ident(borrow)operator(,) ident(carry)operator(,) ident(y)operator(,) ident(ys)operator(;) +preprocessor(#else) + ident(ULong) ident(borrow)operator(,) ident(carry)operator(,) ident(y)operator(,) ident(ys)operator(;) +preprocessor(#ifdef) ident(Pack_32) + ident(ULong) ident(si)operator(,) ident(z)operator(,) ident(zs)operator(;) +preprocessor(#endif) +preprocessor(#endif) + + ident(n) operator(=) ident(S)operator(->)ident(wds)operator(;) +preprocessor(#ifdef) ident(DEBUG) + comment(/*debug*/) reserved(if) operator(()ident(b)operator(->)ident(wds) operator(>) ident(n)operator(\)) + comment(/*debug*/) ident(Bug)operator(()string<delimiter(")content(oversize b in quorem)delimiter(")>operator(\);) +preprocessor(#endif) + reserved(if) operator(()ident(b)operator(->)ident(wds) operator(<) ident(n)operator(\)) + reserved(return) integer(0)operator(;) + ident(sx) operator(=) ident(S)operator(->)ident(x)operator(;) + ident(sxe) operator(=) ident(sx) operator(+) operator(--)ident(n)operator(;) + ident(bx) operator(=) ident(b)operator(->)ident(x)operator(;) + ident(bxe) operator(=) ident(bx) operator(+) ident(n)operator(;) + ident(q) operator(=) operator(*)ident(bxe) operator(/) operator((*)ident(sxe) operator(+) integer(1)operator(\);) comment(/* ensure q <= true quotient */) +preprocessor(#ifdef) ident(DEBUG) + comment(/*debug*/) reserved(if) operator(()ident(q) operator(>) integer(9)operator(\)) + comment(/*debug*/) ident(Bug)operator(()string<delimiter(")content(oversized quotient in quorem)delimiter(")>operator(\);) +preprocessor(#endif) + reserved(if) operator(()ident(q)operator(\)) operator({) + ident(borrow) operator(=) integer(0)operator(;) + ident(carry) operator(=) integer(0)operator(;) + reserved(do) operator({) +preprocessor(#ifdef) ident(ULLong) + ident(ys) operator(=) operator(*)ident(sx)operator(++) operator(*) operator(()ident(ULLong)operator(\))ident(q) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(ys) operator(>>) integer(32)operator(;) + ident(y) operator(=) operator(*)ident(bx) operator(-) operator(()ident(ys) operator(&) ident(FFFFFFFF)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) ident(y) operator(>>) integer(32) operator(&) operator(()ident(ULong)operator(\))integer(1)operator(;) + operator(*)ident(bx)operator(++) operator(=) ident(y) operator(&) ident(FFFFFFFF)operator(;) +preprocessor(#else) +preprocessor(#ifdef) ident(Pack_32) + ident(si) operator(=) operator(*)ident(sx)operator(++;) + ident(ys) operator(=) operator(()ident(si) operator(&) hex(0xffff)operator(\)) operator(*) ident(q) operator(+) ident(carry)operator(;) + ident(zs) operator(=) operator(()ident(si) operator(>>) integer(16)operator(\)) operator(*) ident(q) operator(+) operator(()ident(ys) operator(>>) integer(16)operator(\);) + ident(carry) operator(=) ident(zs) operator(>>) integer(16)operator(;) + ident(y) operator(=) operator((*)ident(bx) operator(&) hex(0xffff)operator(\)) operator(-) operator(()ident(ys) operator(&) hex(0xffff)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(y) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + ident(z) operator(=) operator((*)ident(bx) operator(>>) integer(16)operator(\)) operator(-) operator(()ident(zs) operator(&) hex(0xffff)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(z) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + ident(Storeinc)operator(()ident(bx)operator(,) ident(z)operator(,) ident(y)operator(\);) +preprocessor(#else) + ident(ys) operator(=) operator(*)ident(sx)operator(++) operator(*) ident(q) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(ys) operator(>>) integer(16)operator(;) + ident(y) operator(=) operator(*)ident(bx) operator(-) operator(()ident(ys) operator(&) hex(0xffff)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(y) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + operator(*)ident(bx)operator(++) operator(=) ident(y) operator(&) hex(0xffff)operator(;) +preprocessor(#endif) +preprocessor(#endif) + operator(}) reserved(while) operator(()ident(sx) operator(<=) ident(sxe)operator(\);) + reserved(if) operator((!*)ident(bxe)operator(\)) operator({) + ident(bx) operator(=) ident(b)operator(->)ident(x)operator(;) + reserved(while) operator((--)ident(bxe) operator(>) ident(bx) operator(&&) operator(!*)ident(bxe)operator(\)) + operator(--)ident(n)operator(;) + ident(b)operator(->)ident(wds) operator(=) ident(n)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(cmp)operator(()ident(b)operator(,) ident(S)operator(\)) operator(>=) integer(0)operator(\)) operator({) + ident(q)operator(++;) + ident(borrow) operator(=) integer(0)operator(;) + ident(carry) operator(=) integer(0)operator(;) + ident(bx) operator(=) ident(b)operator(->)ident(x)operator(;) + ident(sx) operator(=) ident(S)operator(->)ident(x)operator(;) + reserved(do) operator({) +preprocessor(#ifdef) ident(ULLong) + ident(ys) operator(=) operator(*)ident(sx)operator(++) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(ys) operator(>>) integer(32)operator(;) + ident(y) operator(=) operator(*)ident(bx) operator(-) operator(()ident(ys) operator(&) ident(FFFFFFFF)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) ident(y) operator(>>) integer(32) operator(&) operator(()ident(ULong)operator(\))integer(1)operator(;) + operator(*)ident(bx)operator(++) operator(=) ident(y) operator(&) ident(FFFFFFFF)operator(;) +preprocessor(#else) +preprocessor(#ifdef) ident(Pack_32) + ident(si) operator(=) operator(*)ident(sx)operator(++;) + ident(ys) operator(=) operator(()ident(si) operator(&) hex(0xffff)operator(\)) operator(+) ident(carry)operator(;) + ident(zs) operator(=) operator(()ident(si) operator(>>) integer(16)operator(\)) operator(+) operator(()ident(ys) operator(>>) integer(16)operator(\);) + ident(carry) operator(=) ident(zs) operator(>>) integer(16)operator(;) + ident(y) operator(=) operator((*)ident(bx) operator(&) hex(0xffff)operator(\)) operator(-) operator(()ident(ys) operator(&) hex(0xffff)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(y) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + ident(z) operator(=) operator((*)ident(bx) operator(>>) integer(16)operator(\)) operator(-) operator(()ident(zs) operator(&) hex(0xffff)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(z) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + ident(Storeinc)operator(()ident(bx)operator(,) ident(z)operator(,) ident(y)operator(\);) +preprocessor(#else) + ident(ys) operator(=) operator(*)ident(sx)operator(++) operator(+) ident(carry)operator(;) + ident(carry) operator(=) ident(ys) operator(>>) integer(16)operator(;) + ident(y) operator(=) operator(*)ident(bx) operator(-) operator(()ident(ys) operator(&) hex(0xffff)operator(\)) operator(-) ident(borrow)operator(;) + ident(borrow) operator(=) operator(()ident(y) operator(&) hex(0x10000)operator(\)) operator(>>) integer(16)operator(;) + operator(*)ident(bx)operator(++) operator(=) ident(y) operator(&) hex(0xffff)operator(;) +preprocessor(#endif) +preprocessor(#endif) + operator(}) reserved(while) operator(()ident(sx) operator(<=) ident(sxe)operator(\);) + ident(bx) operator(=) ident(b)operator(->)ident(x)operator(;) + ident(bxe) operator(=) ident(bx) operator(+) ident(n)operator(;) + reserved(if) operator((!*)ident(bxe)operator(\)) operator({) + reserved(while) operator((--)ident(bxe) operator(>) ident(bx) operator(&&) operator(!*)ident(bxe)operator(\)) + operator(--)ident(n)operator(;) + ident(b)operator(->)ident(wds) operator(=) ident(n)operator(;) + operator(}) + operator(}) + reserved(return) ident(q)operator(;) +operator(}) + +preprocessor(#ifndef) ident(MULTIPLE_THREADS) +directive(static) pre_type(char) operator(*)ident(dtoa_result)operator(;) +preprocessor(#endif) + +directive(static) pre_type(char) operator(*) +ident(rv_alloc)operator(()pre_type(int) ident(i)operator(\)) +operator({) + pre_type(int) ident(j)operator(,) ident(k)operator(,) operator(*)ident(r)operator(;) + + ident(j) operator(=) reserved(sizeof)operator(()ident(ULong)operator(\);) + reserved(for) operator(()ident(k) operator(=) integer(0)operator(;) + reserved(sizeof)operator(()ident(Bigint)operator(\)) operator(-) reserved(sizeof)operator(()ident(ULong)operator(\)) operator(-) reserved(sizeof)operator(()pre_type(int)operator(\)) operator(+) ident(j) operator(<=) ident(i)operator(;) + ident(j) operator(<<=) integer(1)operator(\)) + ident(k)operator(++;) + ident(r) operator(=) operator(()pre_type(int)operator(*\))ident(Balloc)operator(()ident(k)operator(\);) + operator(*)ident(r) operator(=) ident(k)operator(;) + reserved(return) +preprocessor(#ifndef) ident(MULTIPLE_THREADS) + ident(dtoa_result) operator(=) +preprocessor(#endif) + operator(()pre_type(char) operator(*\)()ident(r)operator(+)integer(1)operator(\);) +operator(}) + +directive(static) pre_type(char) operator(*) +ident(nrv_alloc)operator(()pre_type(char) operator(*)ident(s)operator(,) pre_type(char) operator(**)ident(rve)operator(,) pre_type(int) ident(n)operator(\)) +operator({) + pre_type(char) operator(*)ident(rv)operator(,) operator(*)ident(t)operator(;) + + ident(t) operator(=) ident(rv) operator(=) ident(rv_alloc)operator(()ident(n)operator(\);) + reserved(while) operator(((*)ident(t) operator(=) operator(*)ident(s)operator(++\)) operator(!=) integer(0)operator(\)) ident(t)operator(++;) + reserved(if) operator(()ident(rve)operator(\)) + operator(*)ident(rve) operator(=) ident(t)operator(;) + reserved(return) ident(rv)operator(;) +operator(}) + +comment(/* freedtoa(s\) must be used to free values s returned by dtoa + * when MULTIPLE_THREADS is #defined. It should be used in all cases, + * but for consistency with earlier versions of dtoa, it is optional + * when MULTIPLE_THREADS is not defined. + */) + +directive(void) +ident(freedtoa)operator(()pre_type(char) operator(*)ident(s)operator(\)) +operator({) + ident(Bigint) operator(*)ident(b) operator(=) operator(()ident(Bigint) operator(*\)(()pre_type(int) operator(*\))ident(s) operator(-) integer(1)operator(\);) + ident(b)operator(->)ident(maxwds) operator(=) integer(1) operator(<<) operator(()ident(b)operator(->)ident(k) operator(=) operator(*()pre_type(int)operator(*\))ident(b)operator(\);) + ident(Bfree)operator(()ident(b)operator(\);) +preprocessor(#ifndef) ident(MULTIPLE_THREADS) + reserved(if) operator(()ident(s) operator(==) ident(dtoa_result)operator(\)) + ident(dtoa_result) operator(=) integer(0)operator(;) +preprocessor(#endif) +operator(}) + +comment(/* dtoa for IEEE arithmetic (dmg\): convert double to ASCII string. + * + * Inspired by "How to Print Floating-Point Numbers Accurately" by + * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * 1. Rather than iterating, we use a simple numeric overestimate + * to determine k = floor(log10(d\)\). We scale relevant + * quantities using O(log2(k\)\) rather than O(k\) multiplications. + * 2. For some modes > 2 (corresponding to ecvt and fcvt\), we don't + * try to generate digits strictly left to right. Instead, we + * compute with fewer bits and propagate the carry if necessary + * when rounding the final digit up. This is often faster. + * 3. Under the assumption that input will be rounded nearest, + * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. + * That is, we allow equality in stopping tests when the + * round-nearest rule will give the same floating-point value + * as would satisfaction of the stopping test with strict + * inequality. + * 4. We remove common factors of powers of 2 from relevant + * quantities. + * 5. When converting floating-point integers less than 1e16, + * we use floating-point arithmetic rather than resorting + * to multiple-precision integers. + * 6. When asked to produce fewer than 15 digits, we first try + * to get by with floating-point arithmetic; we resort to + * multiple-precision integer arithmetic only if we cannot + * guarantee that the floating-point calculation has given + * the correctly rounded result. For k requested digits and + * "uniformly" distributed input, the probability is + * something like 10^(k-15\) that we must resort to the Long + * calculation. + */) + +pre_type(char) operator(*) +ident(dtoa)operator(()pre_type(double) ident(d)operator(,) pre_type(int) ident(mode)operator(,) pre_type(int) ident(ndigits)operator(,) pre_type(int) operator(*)ident(decpt)operator(,) pre_type(int) operator(*)ident(sign)operator(,) pre_type(char) operator(**)ident(rve)operator(\)) +operator({) + comment(/* Arguments ndigits, decpt, sign are similar to those + of ecvt and fcvt; trailing zeros are suppressed from + the returned string. If not null, *rve is set to point + to the end of the return value. If d is +-Infinity or NaN, + then *decpt is set to 9999. + + mode: + 0 ==> shortest string that yields d when read in + and rounded to nearest. + 1 ==> like 0, but with Steele & White stopping rule; + e.g. with IEEE P754 arithmetic , mode 0 gives + 1e23 whereas mode 1 gives 9.999999999999999e22. + 2 ==> max(1,ndigits\) significant digits. This gives a + return value similar to that of ecvt, except + that trailing zeros are suppressed. + 3 ==> through ndigits past the decimal point. This + gives a return value similar to that from fcvt, + except that trailing zeros are suppressed, and + ndigits can be negative. + 4,5 ==> similar to 2 and 3, respectively, but (in + round-nearest mode\) with the tests of mode 0 to + possibly return a shorter string that rounds to d. + With IEEE arithmetic and compilation with + -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same + as modes 2 and 3 when FLT_ROUNDS != 1. + 6-9 ==> Debugging modes similar to mode - 4: don't try + fast floating-point estimate (if applicable\). + + Values of mode other than 0-9 are treated as mode 0. + + Sufficient space is allocated to the return value + to hold the suppressed trailing zeros. + */) + + pre_type(int) ident(bbits)operator(,) ident(b2)operator(,) ident(b5)operator(,) ident(be)operator(,) ident(dig)operator(,) ident(i)operator(,) ident(ieps)operator(,) ident(ilim)operator(,) ident(ilim0)operator(,) ident(ilim1)operator(,) + ident(j)operator(,) ident(j1)operator(,) ident(k)operator(,) ident(k0)operator(,) ident(k_check)operator(,) ident(leftright)operator(,) ident(m2)operator(,) ident(m5)operator(,) ident(s2)operator(,) ident(s5)operator(,) + ident(spec_case)operator(,) ident(try_quick)operator(;) + ident(Long) ident(L)operator(;) +preprocessor(#ifndef) ident(Sudden_Underflow) + pre_type(int) ident(denorm)operator(;) + ident(ULong) ident(x)operator(;) +preprocessor(#endif) + ident(Bigint) operator(*)ident(b)operator(,) operator(*)ident(b1)operator(,) operator(*)ident(delta)operator(,) operator(*)ident(mlo)operator(,) operator(*)ident(mhi)operator(,) operator(*)ident(S)operator(;) + pre_type(double) ident(d2)operator(,) ident(ds)operator(,) ident(eps)operator(;) + pre_type(char) operator(*)ident(s)operator(,) operator(*)ident(s0)operator(;) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + pre_type(int) ident(rounding)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(SET_INEXACT) + pre_type(int) ident(inexact)operator(,) ident(oldinexact)operator(;) +preprocessor(#endif) + +preprocessor(#ifndef) ident(MULTIPLE_THREADS) + reserved(if) operator(()ident(dtoa_result)operator(\)) operator({) + ident(freedtoa)operator(()ident(dtoa_result)operator(\);) + ident(dtoa_result) operator(=) integer(0)operator(;) + operator(}) +preprocessor(#endif) + + reserved(if) operator(()ident(word0)operator(()ident(d)operator(\)) operator(&) ident(Sign_bit)operator(\)) operator({) + comment(/* set sign for everything, including 0's and NaNs */) + operator(*)ident(sign) operator(=) integer(1)operator(;) + ident(word0)operator(()ident(d)operator(\)) operator(&=) operator(~)ident(Sign_bit)operator(;) comment(/* clear sign bit */) + operator(}) + reserved(else) + operator(*)ident(sign) operator(=) integer(0)operator(;) + +preprocessor(#if) ident(defined)operator(()ident(IEEE_Arith)operator(\)) operator(+) ident(defined)operator(()ident(VAX)operator(\)) +preprocessor(#ifdef) ident(IEEE_Arith) + reserved(if) operator((()ident(word0)operator(()ident(d)operator(\)) operator(&) ident(Exp_mask)operator(\)) operator(==) ident(Exp_mask)operator(\)) +preprocessor(#else) + reserved(if) operator(()ident(word0)operator(()ident(d)operator(\)) operator(==) hex(0x8000)operator(\)) +preprocessor(#endif) + operator({) + comment(/* Infinity or NaN */) + operator(*)ident(decpt) operator(=) integer(9999)operator(;) +preprocessor(#ifdef) ident(IEEE_Arith) + reserved(if) operator((!)ident(word1)operator(()ident(d)operator(\)) operator(&&) operator(!()ident(word0)operator(()ident(d)operator(\)) operator(&) hex(0xfffff)operator(\)\)) + reserved(return) ident(nrv_alloc)operator(()string<delimiter(")content(Infinity)delimiter(")>operator(,) ident(rve)operator(,) integer(8)operator(\);) +preprocessor(#endif) + reserved(return) ident(nrv_alloc)operator(()string<delimiter(")content(NaN)delimiter(")>operator(,) ident(rve)operator(,) integer(3)operator(\);) + operator(}) +preprocessor(#endif) +preprocessor(#ifdef) ident(IBM) + ident(dval)operator(()ident(d)operator(\)) operator(+=) integer(0)operator(;) comment(/* normalize */) +preprocessor(#endif) + reserved(if) operator((!)ident(dval)operator(()ident(d)operator(\)\)) operator({) + operator(*)ident(decpt) operator(=) integer(1)operator(;) + reserved(return) ident(nrv_alloc)operator(()string<delimiter(")content(0)delimiter(")>operator(,) ident(rve)operator(,) integer(1)operator(\);) + operator(}) + +preprocessor(#ifdef) ident(SET_INEXACT) + ident(try_quick) operator(=) ident(oldinexact) operator(=) ident(get_inexact)operator((\);) + ident(inexact) operator(=) integer(1)operator(;) +preprocessor(#endif) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(if) operator((()ident(rounding) operator(=) ident(Flt_Rounds)operator(\)) operator(>=) integer(2)operator(\)) operator({) + reserved(if) operator((*)ident(sign)operator(\)) + ident(rounding) operator(=) ident(rounding) operator(==) integer(2) operator(?) integer(0) operator(:) integer(2)operator(;) + reserved(else) + reserved(if) operator(()ident(rounding) operator(!=) integer(2)operator(\)) + ident(rounding) operator(=) integer(0)operator(;) + operator(}) +preprocessor(#endif) + + ident(b) operator(=) ident(d2b)operator(()ident(dval)operator(()ident(d)operator(\),) operator(&)ident(be)operator(,) operator(&)ident(bbits)operator(\);) +preprocessor(#ifdef) ident(Sudden_Underflow) + ident(i) operator(=) operator(()pre_type(int)operator(\)()ident(word0)operator(()ident(d)operator(\)) operator(>>) ident(Exp_shift1) operator(&) operator(()ident(Exp_mask)operator(>>)ident(Exp_shift1)operator(\)\);) +preprocessor(#else) + reserved(if) operator((()ident(i) operator(=) operator(()pre_type(int)operator(\)()ident(word0)operator(()ident(d)operator(\)) operator(>>) ident(Exp_shift1) operator(&) operator(()ident(Exp_mask)operator(>>)ident(Exp_shift1)operator(\)\)\)) operator(!=) integer(0)operator(\)) operator({) +preprocessor(#endif) + ident(dval)operator(()ident(d2)operator(\)) operator(=) ident(dval)operator(()ident(d)operator(\);) + ident(word0)operator(()ident(d2)operator(\)) operator(&=) ident(Frac_mask1)operator(;) + ident(word0)operator(()ident(d2)operator(\)) operator(|=) ident(Exp_11)operator(;) +preprocessor(#ifdef) ident(IBM) + reserved(if) operator(()ident(j) operator(=) integer(11) operator(-) ident(hi0bits)operator(()ident(word0)operator(()ident(d2)operator(\)) operator(&) ident(Frac_mask)operator(\)\)) + ident(dval)operator(()ident(d2)operator(\)) operator(/=) integer(1) operator(<<) ident(j)operator(;) +preprocessor(#endif) + + comment(/* log(x\) ~=~ log(1.5\) + (x-1.5\)/1.5 + * log10(x\) = log(x\) / log(10\) + * ~=~ log(1.5\)/log(10\) + (x-1.5\)/(1.5*log(10\)\) + * log10(d\) = (i-Bias\)*log(2\)/log(10\) + log10(d2\) + * + * This suggests computing an approximation k to log10(d\) by + * + * k = (i - Bias\)*0.301029995663981 + * + ( (d2-1.5\)*0.289529654602168 + 0.176091259055681 \); + * + * We want k to be too large rather than too small. + * The error in the first-order Taylor series approximation + * is in our favor, so we just round up the constant enough + * to compensate for any error in the multiplication of + * (i - Bias\) by 0.301029995663981; since |i - Bias| <= 1077, + * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, + * adding 1e-13 to the constant term more than suffices. + * Hence we adjust the constant term to 0.1760912590558. + * (We could get a more accurate k by invoking log10, + * but this is probably not worthwhile.\) + */) + + ident(i) operator(-=) ident(Bias)operator(;) +preprocessor(#ifdef) ident(IBM) + ident(i) operator(<<=) integer(2)operator(;) + ident(i) operator(+=) ident(j)operator(;) +preprocessor(#endif) +preprocessor(#ifndef) ident(Sudden_Underflow) + ident(denorm) operator(=) integer(0)operator(;) + operator(}) + reserved(else) operator({) + comment(/* d is denormalized */) + + ident(i) operator(=) ident(bbits) operator(+) ident(be) operator(+) operator(()ident(Bias) operator(+) operator(()ident(P)operator(-)integer(1)operator(\)) operator(-) integer(1)operator(\);) + ident(x) operator(=) ident(i) operator(>) integer(32) operator(?) ident(word0)operator(()ident(d)operator(\)) operator(<<) operator(()integer(64) operator(-) ident(i)operator(\)) operator(|) ident(word1)operator(()ident(d)operator(\)) operator(>>) operator(()ident(i) operator(-) integer(32)operator(\)) + operator(:) ident(word1)operator(()ident(d)operator(\)) operator(<<) operator(()integer(32) operator(-) ident(i)operator(\);) + ident(dval)operator(()ident(d2)operator(\)) operator(=) ident(x)operator(;) + ident(word0)operator(()ident(d2)operator(\)) operator(-=) integer(31)operator(*)ident(Exp_msk1)operator(;) comment(/* adjust exponent */) + ident(i) operator(-=) operator(()ident(Bias) operator(+) operator(()ident(P)operator(-)integer(1)operator(\)) operator(-) integer(1)operator(\)) operator(+) integer(1)operator(;) + ident(denorm) operator(=) integer(1)operator(;) + operator(}) +preprocessor(#endif) + ident(ds) operator(=) operator(()ident(dval)operator(()ident(d2)operator(\)-)float(1)float(.5)operator(\)*)float(0)float(.289529654602168) operator(+) float(0)float(.1760912590558) operator(+) ident(i)operator(*)float(0)float(.301029995663981)operator(;) + ident(k) operator(=) operator(()pre_type(int)operator(\))ident(ds)operator(;) + reserved(if) operator(()ident(ds) operator(<) float(0)operator(.) operator(&&) ident(ds) operator(!=) ident(k)operator(\)) + ident(k)operator(--;) comment(/* want k = floor(ds\) */) + ident(k_check) operator(=) integer(1)operator(;) + reserved(if) operator(()ident(k) operator(>=) integer(0) operator(&&) ident(k) operator(<=) ident(Ten_pmax)operator(\)) operator({) + reserved(if) operator(()ident(dval)operator(()ident(d)operator(\)) operator(<) ident(tens)operator([)ident(k)operator(]\)) + ident(k)operator(--;) + ident(k_check) operator(=) integer(0)operator(;) + operator(}) + ident(j) operator(=) ident(bbits) operator(-) ident(i) operator(-) integer(1)operator(;) + reserved(if) operator(()ident(j) operator(>=) integer(0)operator(\)) operator({) + ident(b2) operator(=) integer(0)operator(;) + ident(s2) operator(=) ident(j)operator(;) + operator(}) + reserved(else) operator({) + ident(b2) operator(=) operator(-)ident(j)operator(;) + ident(s2) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(k) operator(>=) integer(0)operator(\)) operator({) + ident(b5) operator(=) integer(0)operator(;) + ident(s5) operator(=) ident(k)operator(;) + ident(s2) operator(+=) ident(k)operator(;) + operator(}) + reserved(else) operator({) + ident(b2) operator(-=) ident(k)operator(;) + ident(b5) operator(=) operator(-)ident(k)operator(;) + ident(s5) operator(=) integer(0)operator(;) + operator(}) + reserved(if) operator(()ident(mode) operator(<) integer(0) operator(||) ident(mode) operator(>) integer(9)operator(\)) + ident(mode) operator(=) integer(0)operator(;) + +preprocessor(#ifndef) ident(SET_INEXACT) +preprocessor(#ifdef) ident(Check_FLT_ROUNDS) + ident(try_quick) operator(=) ident(Rounding) operator(==) integer(1)operator(;) +preprocessor(#else) + ident(try_quick) operator(=) integer(1)operator(;) +preprocessor(#endif) +preprocessor(#endif) comment(/*SET_INEXACT*/) + + reserved(if) operator(()ident(mode) operator(>) integer(5)operator(\)) operator({) + ident(mode) operator(-=) integer(4)operator(;) + ident(try_quick) operator(=) integer(0)operator(;) + operator(}) + ident(leftright) operator(=) integer(1)operator(;) + ident(ilim) operator(=) ident(ilim1) operator(=) operator(-)integer(1)operator(;) + reserved(switch) operator(()ident(mode)operator(\)) operator({) + reserved(case) integer(0)operator(:) + reserved(case) integer(1)operator(:) + ident(i) operator(=) integer(18)operator(;) + ident(ndigits) operator(=) integer(0)operator(;) + reserved(break)operator(;) + reserved(case) integer(2)operator(:) + ident(leftright) operator(=) integer(0)operator(;) + comment(/* no break */) + reserved(case) integer(4)operator(:) + reserved(if) operator(()ident(ndigits) operator(<=) integer(0)operator(\)) + ident(ndigits) operator(=) integer(1)operator(;) + ident(ilim) operator(=) ident(ilim1) operator(=) ident(i) operator(=) ident(ndigits)operator(;) + reserved(break)operator(;) + reserved(case) integer(3)operator(:) + ident(leftright) operator(=) integer(0)operator(;) + comment(/* no break */) + reserved(case) integer(5)operator(:) + ident(i) operator(=) ident(ndigits) operator(+) ident(k) operator(+) integer(1)operator(;) + ident(ilim) operator(=) ident(i)operator(;) + ident(ilim1) operator(=) ident(i) operator(-) integer(1)operator(;) + reserved(if) operator(()ident(i) operator(<=) integer(0)operator(\)) + ident(i) operator(=) integer(1)operator(;) + operator(}) + ident(s) operator(=) ident(s0) operator(=) ident(rv_alloc)operator(()ident(i)operator(+)integer(1)operator(\);) + +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(if) operator(()ident(mode) operator(>) integer(1) operator(&&) ident(rounding) operator(!=) integer(1)operator(\)) + ident(leftright) operator(=) integer(0)operator(;) +preprocessor(#endif) + + reserved(if) operator(()ident(ilim) operator(>=) integer(0) operator(&&) ident(ilim) operator(<=) ident(Quick_max) operator(&&) ident(try_quick)operator(\)) operator({) + + comment(/* Try to get by with floating-point arithmetic. */) + + ident(i) operator(=) integer(0)operator(;) + ident(dval)operator(()ident(d2)operator(\)) operator(=) ident(dval)operator(()ident(d)operator(\);) + ident(k0) operator(=) ident(k)operator(;) + ident(ilim0) operator(=) ident(ilim)operator(;) + ident(ieps) operator(=) integer(2)operator(;) comment(/* conservative */) + reserved(if) operator(()ident(k) operator(>) integer(0)operator(\)) operator({) + ident(ds) operator(=) ident(tens)operator([)ident(k)operator(&)hex(0xf)operator(];) + ident(j) operator(=) ident(k) operator(>>) integer(4)operator(;) + reserved(if) operator(()ident(j) operator(&) ident(Bletch)operator(\)) operator({) + comment(/* prevent overflows */) + ident(j) operator(&=) ident(Bletch) operator(-) integer(1)operator(;) + ident(dval)operator(()ident(d)operator(\)) operator(/=) ident(bigtens)operator([)ident(n_bigtens)operator(-)integer(1)operator(];) + ident(ieps)operator(++;) + operator(}) + reserved(for) operator((;) ident(j)operator(;) ident(j) operator(>>=) integer(1)operator(,) ident(i)operator(++\)) + reserved(if) operator(()ident(j) operator(&) integer(1)operator(\)) operator({) + ident(ieps)operator(++;) + ident(ds) operator(*=) ident(bigtens)operator([)ident(i)operator(];) + operator(}) + ident(dval)operator(()ident(d)operator(\)) operator(/=) ident(ds)operator(;) + operator(}) + reserved(else) reserved(if) operator((()ident(j1) operator(=) operator(-)ident(k)operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(dval)operator(()ident(d)operator(\)) operator(*=) ident(tens)operator([)ident(j1) operator(&) hex(0xf)operator(];) + reserved(for) operator(()ident(j) operator(=) ident(j1) operator(>>) integer(4)operator(;) ident(j)operator(;) ident(j) operator(>>=) integer(1)operator(,) ident(i)operator(++\)) + reserved(if) operator(()ident(j) operator(&) integer(1)operator(\)) operator({) + ident(ieps)operator(++;) + ident(dval)operator(()ident(d)operator(\)) operator(*=) ident(bigtens)operator([)ident(i)operator(];) + operator(}) + operator(}) + reserved(if) operator(()ident(k_check) operator(&&) ident(dval)operator(()ident(d)operator(\)) operator(<) float(1)operator(.) operator(&&) ident(ilim) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(ilim1) operator(<=) integer(0)operator(\)) + reserved(goto) ident(fast_failed)operator(;) + ident(ilim) operator(=) ident(ilim1)operator(;) + ident(k)operator(--;) + ident(dval)operator(()ident(d)operator(\)) operator(*=) integer(1)float(0)operator(.)operator(;) + ident(ieps)operator(++;) + operator(}) + ident(dval)operator(()ident(eps)operator(\)) operator(=) ident(ieps)operator(*)ident(dval)operator(()ident(d)operator(\)) operator(+) float(7)operator(.)operator(;) + ident(word0)operator(()ident(eps)operator(\)) operator(-=) operator(()ident(P)operator(-)integer(1)operator(\)*)ident(Exp_msk1)operator(;) + reserved(if) operator(()ident(ilim) operator(==) integer(0)operator(\)) operator({) + ident(S) operator(=) ident(mhi) operator(=) integer(0)operator(;) + ident(dval)operator(()ident(d)operator(\)) operator(-=) float(5)operator(.)operator(;) + reserved(if) operator(()ident(dval)operator(()ident(d)operator(\)) operator(>) ident(dval)operator(()ident(eps)operator(\)\)) + reserved(goto) ident(one_digit)operator(;) + reserved(if) operator(()ident(dval)operator(()ident(d)operator(\)) operator(<) operator(-)ident(dval)operator(()ident(eps)operator(\)\)) + reserved(goto) ident(no_digits)operator(;) + reserved(goto) ident(fast_failed)operator(;) + operator(}) +preprocessor(#ifndef) ident(No_leftright) + reserved(if) operator(()ident(leftright)operator(\)) operator({) + comment(/* Use Steele & White method of only + * generating digits needed. + */) + ident(dval)operator(()ident(eps)operator(\)) operator(=) float(0)float(.5)operator(/)ident(tens)operator([)ident(ilim)operator(-)integer(1)operator(]) operator(-) ident(dval)operator(()ident(eps)operator(\);) + reserved(for) operator(()ident(i) operator(=) integer(0)operator(;;\)) operator({) + ident(L) operator(=) ident(dval)operator(()ident(d)operator(\);) + ident(dval)operator(()ident(d)operator(\)) operator(-=) ident(L)operator(;) + operator(*)ident(s)operator(++) operator(=) char('0') operator(+) operator(()pre_type(int)operator(\))ident(L)operator(;) + reserved(if) operator(()ident(dval)operator(()ident(d)operator(\)) operator(<) ident(dval)operator(()ident(eps)operator(\)\)) + reserved(goto) ident(ret1)operator(;) + reserved(if) operator(()float(1)operator(.) operator(-) ident(dval)operator(()ident(d)operator(\)) operator(<) ident(dval)operator(()ident(eps)operator(\)\)) + reserved(goto) ident(bump_up)operator(;) + reserved(if) operator((++)ident(i) operator(>=) ident(ilim)operator(\)) + reserved(break)operator(;) + ident(dval)operator(()ident(eps)operator(\)) operator(*=) integer(1)float(0)operator(.)operator(;) + ident(dval)operator(()ident(d)operator(\)) operator(*=) integer(1)float(0)operator(.)operator(;) + operator(}) + operator(}) + reserved(else) operator({) +preprocessor(#endif) + comment(/* Generate ilim digits, then fix them up. */) + ident(dval)operator(()ident(eps)operator(\)) operator(*=) ident(tens)operator([)ident(ilim)operator(-)integer(1)operator(];) + reserved(for) operator(()ident(i) operator(=) integer(1)operator(;;) ident(i)operator(++,) ident(dval)operator(()ident(d)operator(\)) operator(*=) integer(1)float(0)operator(.)operator(\)) operator({) + ident(L) operator(=) operator(()ident(Long)operator(\)()ident(dval)operator(()ident(d)operator(\)\);) + reserved(if) operator((!()ident(dval)operator(()ident(d)operator(\)) operator(-=) ident(L)operator(\)\)) + ident(ilim) operator(=) ident(i)operator(;) + operator(*)ident(s)operator(++) operator(=) char('0') operator(+) operator(()pre_type(int)operator(\))ident(L)operator(;) + reserved(if) operator(()ident(i) operator(==) ident(ilim)operator(\)) operator({) + reserved(if) operator(()ident(dval)operator(()ident(d)operator(\)) operator(>) float(0)float(.5) operator(+) ident(dval)operator(()ident(eps)operator(\)\)) + reserved(goto) ident(bump_up)operator(;) + reserved(else) reserved(if) operator(()ident(dval)operator(()ident(d)operator(\)) operator(<) float(0)float(.5) operator(-) ident(dval)operator(()ident(eps)operator(\)\)) operator({) + reserved(while) operator((*--)ident(s) operator(==) char('0')operator(\)) operator(;) + ident(s)operator(++;) + reserved(goto) ident(ret1)operator(;) + operator(}) + reserved(break)operator(;) + operator(}) + operator(}) +preprocessor(#ifndef) ident(No_leftright) + operator(}) +preprocessor(#endif) +label(fast_failed)operator(:) + ident(s) operator(=) ident(s0)operator(;) + ident(dval)operator(()ident(d)operator(\)) operator(=) ident(dval)operator(()ident(d2)operator(\);) + ident(k) operator(=) ident(k0)operator(;) + ident(ilim) operator(=) ident(ilim0)operator(;) + operator(}) + + comment(/* Do we have a "small" integer? */) + + reserved(if) operator(()ident(be) operator(>=) integer(0) operator(&&) ident(k) operator(<=) ident(Int_max)operator(\)) operator({) + comment(/* Yes. */) + ident(ds) operator(=) ident(tens)operator([)ident(k)operator(];) + reserved(if) operator(()ident(ndigits) operator(<) integer(0) operator(&&) ident(ilim) operator(<=) integer(0)operator(\)) operator({) + ident(S) operator(=) ident(mhi) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(ilim) operator(<) integer(0) operator(||) ident(dval)operator(()ident(d)operator(\)) operator(<=) integer(5)operator(*)ident(ds)operator(\)) + reserved(goto) ident(no_digits)operator(;) + reserved(goto) ident(one_digit)operator(;) + operator(}) + reserved(for) operator(()ident(i) operator(=) integer(1)operator(;;) ident(i)operator(++,) ident(dval)operator(()ident(d)operator(\)) operator(*=) integer(1)float(0)operator(.)operator(\)) operator({) + ident(L) operator(=) operator(()ident(Long)operator(\)()ident(dval)operator(()ident(d)operator(\)) operator(/) ident(ds)operator(\);) + ident(dval)operator(()ident(d)operator(\)) operator(-=) ident(L)operator(*)ident(ds)operator(;) +preprocessor(#ifdef) ident(Check_FLT_ROUNDS) + comment(/* If FLT_ROUNDS == 2, L will usually be high by 1 */) + reserved(if) operator(()ident(dval)operator(()ident(d)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(L)operator(--;) + ident(dval)operator(()ident(d)operator(\)) operator(+=) ident(ds)operator(;) + operator(}) +preprocessor(#endif) + operator(*)ident(s)operator(++) operator(=) char('0') operator(+) operator(()pre_type(int)operator(\))ident(L)operator(;) + reserved(if) operator((!)ident(dval)operator(()ident(d)operator(\)\)) operator({) +preprocessor(#ifdef) ident(SET_INEXACT) + ident(inexact) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(i) operator(==) ident(ilim)operator(\)) operator({) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(if) operator(()ident(mode) operator(>) integer(1)operator(\)) + reserved(switch) operator(()ident(rounding)operator(\)) operator({) + reserved(case) integer(0)operator(:) reserved(goto) ident(ret1)operator(;) + reserved(case) integer(2)operator(:) reserved(goto) ident(bump_up)operator(;) + operator(}) +preprocessor(#endif) + ident(dval)operator(()ident(d)operator(\)) operator(+=) ident(dval)operator(()ident(d)operator(\);) + reserved(if) operator(()ident(dval)operator(()ident(d)operator(\)) operator(>) ident(ds) operator(||) operator(()ident(dval)operator(()ident(d)operator(\)) operator(==) ident(ds) operator(&&) operator(()ident(L) operator(&) integer(1)operator(\)\)\)) operator({) +label(bump_up)operator(:) + reserved(while) operator((*--)ident(s) operator(==) char('9')operator(\)) + reserved(if) operator(()ident(s) operator(==) ident(s0)operator(\)) operator({) + ident(k)operator(++;) + operator(*)ident(s) operator(=) char('0')operator(;) + reserved(break)operator(;) + operator(}) + operator(++*)ident(s)operator(++;) + operator(}) + reserved(break)operator(;) + operator(}) + operator(}) + reserved(goto) ident(ret1)operator(;) + operator(}) + + ident(m2) operator(=) ident(b2)operator(;) + ident(m5) operator(=) ident(b5)operator(;) + ident(mhi) operator(=) ident(mlo) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(leftright)operator(\)) operator({) + ident(i) operator(=) +preprocessor(#ifndef) ident(Sudden_Underflow) + ident(denorm) operator(?) ident(be) operator(+) operator(()ident(Bias) operator(+) operator(()ident(P)operator(-)integer(1)operator(\)) operator(-) integer(1) operator(+) integer(1)operator(\)) operator(:) +preprocessor(#endif) +preprocessor(#ifdef) ident(IBM) + integer(1) operator(+) integer(4)operator(*)ident(P) operator(-) integer(3) operator(-) ident(bbits) operator(+) operator((()ident(bbits) operator(+) ident(be) operator(-) integer(1)operator(\)) operator(&) integer(3)operator(\);) +preprocessor(#else) + integer(1) operator(+) ident(P) operator(-) ident(bbits)operator(;) +preprocessor(#endif) + ident(b2) operator(+=) ident(i)operator(;) + ident(s2) operator(+=) ident(i)operator(;) + ident(mhi) operator(=) ident(i2b)operator(()integer(1)operator(\);) + operator(}) + reserved(if) operator(()ident(m2) operator(>) integer(0) operator(&&) ident(s2) operator(>) integer(0)operator(\)) operator({) + ident(i) operator(=) ident(m2) operator(<) ident(s2) operator(?) ident(m2) operator(:) ident(s2)operator(;) + ident(b2) operator(-=) ident(i)operator(;) + ident(m2) operator(-=) ident(i)operator(;) + ident(s2) operator(-=) ident(i)operator(;) + operator(}) + reserved(if) operator(()ident(b5) operator(>) integer(0)operator(\)) operator({) + reserved(if) operator(()ident(leftright)operator(\)) operator({) + reserved(if) operator(()ident(m5) operator(>) integer(0)operator(\)) operator({) + ident(mhi) operator(=) ident(pow5mult)operator(()ident(mhi)operator(,) ident(m5)operator(\);) + ident(b1) operator(=) ident(mult)operator(()ident(mhi)operator(,) ident(b)operator(\);) + ident(Bfree)operator(()ident(b)operator(\);) + ident(b) operator(=) ident(b1)operator(;) + operator(}) + reserved(if) operator((()ident(j) operator(=) ident(b5) operator(-) ident(m5)operator(\)) operator(!=) integer(0)operator(\)) + ident(b) operator(=) ident(pow5mult)operator(()ident(b)operator(,) ident(j)operator(\);) + operator(}) + reserved(else) + ident(b) operator(=) ident(pow5mult)operator(()ident(b)operator(,) ident(b5)operator(\);) + operator(}) + ident(S) operator(=) ident(i2b)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(s5) operator(>) integer(0)operator(\)) + ident(S) operator(=) ident(pow5mult)operator(()ident(S)operator(,) ident(s5)operator(\);) + + comment(/* Check for special case that d is a normalized power of 2. */) + + ident(spec_case) operator(=) integer(0)operator(;) + reserved(if) operator((()ident(mode) operator(<) integer(2) operator(||) ident(leftright)operator(\)) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + operator(&&) ident(rounding) operator(==) integer(1) +preprocessor(#endif) + operator(\)) operator({) + reserved(if) operator((!)ident(word1)operator(()ident(d)operator(\)) operator(&&) operator(!()ident(word0)operator(()ident(d)operator(\)) operator(&) ident(Bndry_mask)operator(\)) +preprocessor(#ifndef) ident(Sudden_Underflow) + operator(&&) ident(word0)operator(()ident(d)operator(\)) operator(&) operator(()ident(Exp_mask) operator(&) operator(~)ident(Exp_msk1)operator(\)) +preprocessor(#endif) + operator(\)) operator({) + comment(/* The special case */) + ident(b2) operator(+=) ident(Log2P)operator(;) + ident(s2) operator(+=) ident(Log2P)operator(;) + ident(spec_case) operator(=) integer(1)operator(;) + operator(}) + operator(}) + + comment(/* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + * + * Perhaps we should just compute leading 28 bits of S once + * and for all and pass them and a shift to quorem, so it + * can do shifts and ors to compute the numerator for q. + */) +preprocessor(#ifdef) ident(Pack_32) + reserved(if) operator((()ident(i) operator(=) operator((()ident(s5) operator(?) integer(32) operator(-) ident(hi0bits)operator(()ident(S)operator(->)ident(x)operator([)ident(S)operator(->)ident(wds)operator(-)integer(1)operator(]\)) operator(:) integer(1)operator(\)) operator(+) ident(s2)operator(\)) operator(&) hex(0x1f)operator(\)) operator(!=) integer(0)operator(\)) + ident(i) operator(=) integer(32) operator(-) ident(i)operator(;) +preprocessor(#else) + reserved(if) operator((()ident(i) operator(=) operator((()ident(s5) operator(?) integer(32) operator(-) ident(hi0bits)operator(()ident(S)operator(->)ident(x)operator([)ident(S)operator(->)ident(wds)operator(-)integer(1)operator(]\)) operator(:) integer(1)operator(\)) operator(+) ident(s2)operator(\)) operator(&) hex(0xf)operator(\)) operator(!=) integer(0)operator(\)) + ident(i) operator(=) integer(16) operator(-) ident(i)operator(;) +preprocessor(#endif) + reserved(if) operator(()ident(i) operator(>) integer(4)operator(\)) operator({) + ident(i) operator(-=) integer(4)operator(;) + ident(b2) operator(+=) ident(i)operator(;) + ident(m2) operator(+=) ident(i)operator(;) + ident(s2) operator(+=) ident(i)operator(;) + operator(}) + reserved(else) reserved(if) operator(()ident(i) operator(<) integer(4)operator(\)) operator({) + ident(i) operator(+=) integer(28)operator(;) + ident(b2) operator(+=) ident(i)operator(;) + ident(m2) operator(+=) ident(i)operator(;) + ident(s2) operator(+=) ident(i)operator(;) + operator(}) + reserved(if) operator(()ident(b2) operator(>) integer(0)operator(\)) + ident(b) operator(=) ident(lshift)operator(()ident(b)operator(,) ident(b2)operator(\);) + reserved(if) operator(()ident(s2) operator(>) integer(0)operator(\)) + ident(S) operator(=) ident(lshift)operator(()ident(S)operator(,) ident(s2)operator(\);) + reserved(if) operator(()ident(k_check)operator(\)) operator({) + reserved(if) operator(()ident(cmp)operator(()ident(b)operator(,)ident(S)operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(k)operator(--;) + ident(b) operator(=) ident(multadd)operator(()ident(b)operator(,) integer(10)operator(,) integer(0)operator(\);) comment(/* we botched the k estimate */) + reserved(if) operator(()ident(leftright)operator(\)) + ident(mhi) operator(=) ident(multadd)operator(()ident(mhi)operator(,) integer(10)operator(,) integer(0)operator(\);) + ident(ilim) operator(=) ident(ilim1)operator(;) + operator(}) + operator(}) + reserved(if) operator(()ident(ilim) operator(<=) integer(0) operator(&&) operator(()ident(mode) operator(==) integer(3) operator(||) ident(mode) operator(==) integer(5)operator(\)\)) operator({) + reserved(if) operator(()ident(ilim) operator(<) integer(0) operator(||) ident(cmp)operator(()ident(b)operator(,)ident(S) operator(=) ident(multadd)operator(()ident(S)operator(,)integer(5)operator(,)integer(0)operator(\)\)) operator(<=) integer(0)operator(\)) operator({) + comment(/* no digits, fcvt style */) +label(no_digits)operator(:) + ident(k) operator(=) operator(-)integer(1) operator(-) ident(ndigits)operator(;) + reserved(goto) ident(ret)operator(;) + operator(}) +label(one_digit)operator(:) + operator(*)ident(s)operator(++) operator(=) char('1')operator(;) + ident(k)operator(++;) + reserved(goto) ident(ret)operator(;) + operator(}) + reserved(if) operator(()ident(leftright)operator(\)) operator({) + reserved(if) operator(()ident(m2) operator(>) integer(0)operator(\)) + ident(mhi) operator(=) ident(lshift)operator(()ident(mhi)operator(,) ident(m2)operator(\);) + + comment(/* Compute mlo -- check for special case + * that d is a normalized power of 2. + */) + + ident(mlo) operator(=) ident(mhi)operator(;) + reserved(if) operator(()ident(spec_case)operator(\)) operator({) + ident(mhi) operator(=) ident(Balloc)operator(()ident(mhi)operator(->)ident(k)operator(\);) + ident(Bcopy)operator(()ident(mhi)operator(,) ident(mlo)operator(\);) + ident(mhi) operator(=) ident(lshift)operator(()ident(mhi)operator(,) ident(Log2P)operator(\);) + operator(}) + + reserved(for) operator(()ident(i) operator(=) integer(1)operator(;;)ident(i)operator(++\)) operator({) + ident(dig) operator(=) ident(quorem)operator(()ident(b)operator(,)ident(S)operator(\)) operator(+) char('0')operator(;) + comment(/* Do we yet have the shortest decimal string + * that will round to d? + */) + ident(j) operator(=) ident(cmp)operator(()ident(b)operator(,) ident(mlo)operator(\);) + ident(delta) operator(=) ident(diff)operator(()ident(S)operator(,) ident(mhi)operator(\);) + ident(j1) operator(=) ident(delta)operator(->)ident(sign) operator(?) integer(1) operator(:) ident(cmp)operator(()ident(b)operator(,) ident(delta)operator(\);) + ident(Bfree)operator(()ident(delta)operator(\);) +preprocessor(#ifndef) ident(ROUND_BIASED) + reserved(if) operator(()ident(j1) operator(==) integer(0) operator(&&) ident(mode) operator(!=) integer(1) operator(&&) operator(!()ident(word1)operator(()ident(d)operator(\)) operator(&) integer(1)operator(\)) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + operator(&&) ident(rounding) operator(>=) integer(1) +preprocessor(#endif) + operator(\)) operator({) + reserved(if) operator(()ident(dig) operator(==) char('9')operator(\)) + reserved(goto) ident(round_9_up)operator(;) + reserved(if) operator(()ident(j) operator(>) integer(0)operator(\)) + ident(dig)operator(++;) +preprocessor(#ifdef) ident(SET_INEXACT) + reserved(else) reserved(if) operator((!)ident(b)operator(->)ident(x)operator([)integer(0)operator(]) operator(&&) ident(b)operator(->)ident(wds) operator(<=) integer(1)operator(\)) + ident(inexact) operator(=) integer(0)operator(;) +preprocessor(#endif) + operator(*)ident(s)operator(++) operator(=) ident(dig)operator(;) + reserved(goto) ident(ret)operator(;) + operator(}) +preprocessor(#endif) + reserved(if) operator(()ident(j) operator(<) integer(0) operator(||) operator(()ident(j) operator(==) integer(0) operator(&&) ident(mode) operator(!=) integer(1) +preprocessor(#ifndef) ident(ROUND_BIASED) + operator(&&) operator(!()ident(word1)operator(()ident(d)operator(\)) operator(&) integer(1)operator(\)) +preprocessor(#endif) + operator(\)\)) operator({) + reserved(if) operator((!)ident(b)operator(->)ident(x)operator([)integer(0)operator(]) operator(&&) ident(b)operator(->)ident(wds) operator(<=) integer(1)operator(\)) operator({) +preprocessor(#ifdef) ident(SET_INEXACT) + ident(inexact) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(goto) ident(accept_dig)operator(;) + operator(}) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(if) operator(()ident(mode) operator(>) integer(1)operator(\)) + reserved(switch) operator(()ident(rounding)operator(\)) operator({) + reserved(case) integer(0)operator(:) reserved(goto) ident(accept_dig)operator(;) + reserved(case) integer(2)operator(:) reserved(goto) ident(keep_dig)operator(;) + operator(}) +preprocessor(#endif) comment(/*Honor_FLT_ROUNDS*/) + reserved(if) operator(()ident(j1) operator(>) integer(0)operator(\)) operator({) + ident(b) operator(=) ident(lshift)operator(()ident(b)operator(,) integer(1)operator(\);) + ident(j1) operator(=) ident(cmp)operator(()ident(b)operator(,) ident(S)operator(\);) + reserved(if) operator((()ident(j1) operator(>) integer(0) operator(||) operator(()ident(j1) operator(==) integer(0) operator(&&) operator(()ident(dig) operator(&) integer(1)operator(\)\)\)) operator(&&) ident(dig)operator(++) operator(==) char('9')operator(\)) + reserved(goto) ident(round_9_up)operator(;) + operator(}) +label(accept_dig)operator(:) + operator(*)ident(s)operator(++) operator(=) ident(dig)operator(;) + reserved(goto) ident(ret)operator(;) + operator(}) + reserved(if) operator(()ident(j1) operator(>) integer(0)operator(\)) operator({) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(if) operator((!)ident(rounding)operator(\)) + reserved(goto) ident(accept_dig)operator(;) +preprocessor(#endif) + reserved(if) operator(()ident(dig) operator(==) char('9')operator(\)) operator({) comment(/* possible if i == 1 */) +label(round_9_up)operator(:) + operator(*)ident(s)operator(++) operator(=) char('9')operator(;) + reserved(goto) ident(roundoff)operator(;) + operator(}) + operator(*)ident(s)operator(++) operator(=) ident(dig) operator(+) integer(1)operator(;) + reserved(goto) ident(ret)operator(;) + operator(}) +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) +label(keep_dig)operator(:) +preprocessor(#endif) + operator(*)ident(s)operator(++) operator(=) ident(dig)operator(;) + reserved(if) operator(()ident(i) operator(==) ident(ilim)operator(\)) + reserved(break)operator(;) + ident(b) operator(=) ident(multadd)operator(()ident(b)operator(,) integer(10)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(mlo) operator(==) ident(mhi)operator(\)) + ident(mlo) operator(=) ident(mhi) operator(=) ident(multadd)operator(()ident(mhi)operator(,) integer(10)operator(,) integer(0)operator(\);) + reserved(else) operator({) + ident(mlo) operator(=) ident(multadd)operator(()ident(mlo)operator(,) integer(10)operator(,) integer(0)operator(\);) + ident(mhi) operator(=) ident(multadd)operator(()ident(mhi)operator(,) integer(10)operator(,) integer(0)operator(\);) + operator(}) + operator(}) + operator(}) + reserved(else) + reserved(for) operator(()ident(i) operator(=) integer(1)operator(;;) ident(i)operator(++\)) operator({) + operator(*)ident(s)operator(++) operator(=) ident(dig) operator(=) ident(quorem)operator(()ident(b)operator(,)ident(S)operator(\)) operator(+) char('0')operator(;) + reserved(if) operator((!)ident(b)operator(->)ident(x)operator([)integer(0)operator(]) operator(&&) ident(b)operator(->)ident(wds) operator(<=) integer(1)operator(\)) operator({) +preprocessor(#ifdef) ident(SET_INEXACT) + ident(inexact) operator(=) integer(0)operator(;) +preprocessor(#endif) + reserved(goto) ident(ret)operator(;) + operator(}) + reserved(if) operator(()ident(i) operator(>=) ident(ilim)operator(\)) + reserved(break)operator(;) + ident(b) operator(=) ident(multadd)operator(()ident(b)operator(,) integer(10)operator(,) integer(0)operator(\);) + operator(}) + + comment(/* Round off last digit */) + +preprocessor(#ifdef) ident(Honor_FLT_ROUNDS) + reserved(switch) operator(()ident(rounding)operator(\)) operator({) + reserved(case) integer(0)operator(:) reserved(goto) ident(trimzeros)operator(;) + reserved(case) integer(2)operator(:) reserved(goto) ident(roundoff)operator(;) + operator(}) +preprocessor(#endif) + ident(b) operator(=) ident(lshift)operator(()ident(b)operator(,) integer(1)operator(\);) + ident(j) operator(=) ident(cmp)operator(()ident(b)operator(,) ident(S)operator(\);) + reserved(if) operator(()ident(j) operator(>) integer(0) operator(||) operator(()ident(j) operator(==) integer(0) operator(&&) operator(()ident(dig) operator(&) integer(1)operator(\)\)\)) operator({) + label(roundoff)operator(:) + reserved(while) operator((*--)ident(s) operator(==) char('9')operator(\)) + reserved(if) operator(()ident(s) operator(==) ident(s0)operator(\)) operator({) + ident(k)operator(++;) + operator(*)ident(s)operator(++) operator(=) char('1')operator(;) + reserved(goto) ident(ret)operator(;) + operator(}) + operator(++*)ident(s)operator(++;) + operator(}) + reserved(else) operator({) + reserved(while) operator((*--)ident(s) operator(==) char('0')operator(\)) operator(;) + ident(s)operator(++;) + operator(}) +label(ret)operator(:) + ident(Bfree)operator(()ident(S)operator(\);) + reserved(if) operator(()ident(mhi)operator(\)) operator({) + reserved(if) operator(()ident(mlo) operator(&&) ident(mlo) operator(!=) ident(mhi)operator(\)) + ident(Bfree)operator(()ident(mlo)operator(\);) + ident(Bfree)operator(()ident(mhi)operator(\);) + operator(}) +label(ret1)operator(:) +preprocessor(#ifdef) ident(SET_INEXACT) + reserved(if) operator(()ident(inexact)operator(\)) operator({) + reserved(if) operator((!)ident(oldinexact)operator(\)) operator({) + ident(word0)operator(()ident(d)operator(\)) operator(=) ident(Exp_1) operator(+) operator(()integer(70) operator(<<) ident(Exp_shift)operator(\);) + ident(word1)operator(()ident(d)operator(\)) operator(=) integer(0)operator(;) + ident(dval)operator(()ident(d)operator(\)) operator(+=) float(1)operator(.)operator(;) + operator(}) + operator(}) + reserved(else) reserved(if) operator((!)ident(oldinexact)operator(\)) + ident(clear_inexact)operator((\);) +preprocessor(#endif) + ident(Bfree)operator(()ident(b)operator(\);) + operator(*)ident(s) operator(=) integer(0)operator(;) + operator(*)ident(decpt) operator(=) ident(k) operator(+) integer(1)operator(;) + reserved(if) operator(()ident(rve)operator(\)) + operator(*)ident(rve) operator(=) ident(s)operator(;) + reserved(return) ident(s0)operator(;) +operator(}) + +directive(void) +ident(ruby_each_words)operator(()directive(const) pre_type(char) operator(*)ident(str)operator(,) directive(void) operator((*)ident(func)operator(\)()directive(const) pre_type(char)operator(*,) pre_type(int)operator(,) directive(void)operator(*\),) directive(void) operator(*)ident(arg)operator(\)) +operator({) + directive(const) pre_type(char) operator(*)ident(end)operator(;) + pre_type(int) ident(len)operator(;) + + reserved(if) operator((!)ident(str)operator(\)) reserved(return)operator(;) + reserved(for) operator((;) operator(*)ident(str)operator(;) ident(str) operator(=) ident(end)operator(\)) operator({) + reserved(while) operator(()ident(ISSPACE)operator((*)ident(str)operator(\)) operator(||) operator(*)ident(str) operator(==) char(',')operator(\)) ident(str)operator(++;) + reserved(if) operator((!*)ident(str)operator(\)) reserved(break)operator(;) + ident(end) operator(=) ident(str)operator(;) + reserved(while) operator((*)ident(end) operator(&&) operator(!)ident(ISSPACE)operator((*)ident(end)operator(\)) operator(&&) operator(*)ident(end) operator(!=) char(',')operator(\)) ident(end)operator(++;) + ident(len) operator(=) ident(end) operator(-) ident(str)operator(;) + operator((*)ident(func)operator(\)()ident(str)operator(,) ident(len)operator(,) ident(arg)operator(\);) + operator(}) +operator(}) + +preprocessor(#ifdef) ident(__cplusplus) +operator(}) +preprocessor(#endif) +comment(/********************************************************************** + + variable.c - + + $Author: shyouhei $ + $Date: 2009-02-02 03:34:12 +0100 (Mon, 02 Feb 2009\) $ + created at: Tue Apr 19 23:55:15 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("env.h") +preprocessor(#include) include("node.h") +preprocessor(#include) include("st.h") +preprocessor(#include) include("util.h") + +ident(st_table) operator(*)ident(rb_global_tbl)operator(;) +ident(st_table) operator(*)ident(rb_class_tbl)operator(;) +directive(static) ident(ID) ident(autoload)operator(,) ident(classpath)operator(,) ident(tmp_classpath)operator(;) + +directive(void) +ident(Init_var_tables)operator((\)) +operator({) + ident(rb_global_tbl) operator(=) ident(st_init_numtable)operator((\);) + ident(rb_class_tbl) operator(=) ident(st_init_numtable)operator((\);) + ident(autoload) operator(=) ident(rb_intern)operator(()string<delimiter(")content(__autoload__)delimiter(")>operator(\);) + ident(classpath) operator(=) ident(rb_intern)operator(()string<delimiter(")content(__classpath__)delimiter(")>operator(\);) + ident(tmp_classpath) operator(=) ident(rb_intern)operator(()string<delimiter(")content(__tmp_classpath__)delimiter(")>operator(\);) +operator(}) + +reserved(struct) ident(fc_result) operator({) + ident(ID) ident(name)operator(;) + ident(VALUE) ident(klass)operator(;) + ident(VALUE) ident(path)operator(;) + ident(VALUE) ident(track)operator(;) + reserved(struct) ident(fc_result) operator(*)ident(prev)operator(;) +operator(};) + +directive(static) ident(VALUE) +ident(fc_path)operator(()ident(fc)operator(,) ident(name)operator(\)) + reserved(struct) ident(fc_result) operator(*)ident(fc)operator(;) + ident(ID) ident(name)operator(;) +operator({) + ident(VALUE) ident(path)operator(,) ident(tmp)operator(;) + + ident(path) operator(=) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(name)operator(\)\);) + reserved(while) operator(()ident(fc)operator(\)) operator({) + reserved(if) operator(()ident(fc)operator(->)ident(track) operator(==) ident(rb_cObject)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(ROBJECT)operator(()ident(fc)operator(->)ident(track)operator(\)->)ident(iv_tbl) operator(&&) + ident(st_lookup)operator(()ident(ROBJECT)operator(()ident(fc)operator(->)ident(track)operator(\)->)ident(iv_tbl)operator(,) ident(classpath)operator(,) operator(&)ident(tmp)operator(\)\)) operator({) + ident(tmp) operator(=) ident(rb_str_dup)operator(()ident(tmp)operator(\);) + ident(rb_str_cat2)operator(()ident(tmp)operator(,) string<delimiter(")content(::)delimiter(")>operator(\);) + ident(rb_str_append)operator(()ident(tmp)operator(,) ident(path)operator(\);) + + reserved(return) ident(tmp)operator(;) + operator(}) + ident(tmp) operator(=) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(fc)operator(->)ident(name)operator(\)\);) + ident(rb_str_cat2)operator(()ident(tmp)operator(,) string<delimiter(")content(::)delimiter(")>operator(\);) + ident(rb_str_append)operator(()ident(tmp)operator(,) ident(path)operator(\);) + ident(path) operator(=) ident(tmp)operator(;) + ident(fc) operator(=) ident(fc)operator(->)ident(prev)operator(;) + operator(}) + reserved(return) ident(path)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(fc_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(res)operator(\)) + ident(ID) ident(key)operator(;) + ident(VALUE) ident(value)operator(;) + reserved(struct) ident(fc_result) operator(*)ident(res)operator(;) +operator({) + reserved(if) operator((!)ident(rb_is_const_id)operator(()ident(key)operator(\)\)) reserved(return) ident(ST_CONTINUE)operator(;) + + reserved(if) operator(()ident(value) operator(==) ident(res)operator(->)ident(klass)operator(\)) operator({) + ident(res)operator(->)ident(path) operator(=) ident(fc_path)operator(()ident(res)operator(,) ident(key)operator(\);) + reserved(return) ident(ST_STOP)operator(;) + operator(}) + reserved(switch) operator(()ident(TYPE)operator(()ident(value)operator(\)\)) operator({) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(if) operator((!)ident(RCLASS)operator(()ident(value)operator(\)->)ident(iv_tbl)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + reserved(else) operator({) + reserved(struct) ident(fc_result) ident(arg)operator(;) + reserved(struct) ident(fc_result) operator(*)ident(list)operator(;) + + ident(list) operator(=) ident(res)operator(;) + reserved(while) operator(()ident(list)operator(\)) operator({) + reserved(if) operator(()ident(list)operator(->)ident(track) operator(==) ident(value)operator(\)) reserved(return) ident(ST_CONTINUE)operator(;) + ident(list) operator(=) ident(list)operator(->)ident(prev)operator(;) + operator(}) + + ident(arg)operator(.)ident(name) operator(=) ident(key)operator(;) + ident(arg)operator(.)ident(path) operator(=) integer(0)operator(;) + ident(arg)operator(.)ident(klass) operator(=) ident(res)operator(->)ident(klass)operator(;) + ident(arg)operator(.)ident(track) operator(=) ident(value)operator(;) + ident(arg)operator(.)ident(prev) operator(=) ident(res)operator(;) + ident(st_foreach_safe)operator(()ident(RCLASS)operator(()ident(value)operator(\)->)ident(iv_tbl)operator(,) ident(fc_i)operator(,) operator(()ident(st_data_t)operator(\)&)ident(arg)operator(\);) + reserved(if) operator(()ident(arg)operator(.)ident(path)operator(\)) operator({) + ident(res)operator(->)ident(path) operator(=) ident(arg)operator(.)ident(path)operator(;) + reserved(return) ident(ST_STOP)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + + reserved(default)operator(:) + reserved(break)operator(;) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(find_class_path)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(struct) ident(fc_result) ident(arg)operator(;) + + ident(arg)operator(.)ident(name) operator(=) integer(0)operator(;) + ident(arg)operator(.)ident(path) operator(=) integer(0)operator(;) + ident(arg)operator(.)ident(klass) operator(=) ident(klass)operator(;) + ident(arg)operator(.)ident(track) operator(=) ident(rb_cObject)operator(;) + ident(arg)operator(.)ident(prev) operator(=) integer(0)operator(;) + reserved(if) operator(()ident(RCLASS)operator(()ident(rb_cObject)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(st_foreach_safe)operator(()ident(RCLASS)operator(()ident(rb_cObject)operator(\)->)ident(iv_tbl)operator(,) ident(fc_i)operator(,) operator(()ident(st_data_t)operator(\)&)ident(arg)operator(\);) + operator(}) + reserved(if) operator(()ident(arg)operator(.)ident(path) operator(==) integer(0)operator(\)) operator({) + ident(st_foreach)operator(()ident(rb_class_tbl)operator(,) ident(fc_i)operator(,) operator(()ident(st_data_t)operator(\)&)ident(arg)operator(\);) + operator(}) + reserved(if) operator(()ident(arg)operator(.)ident(path)operator(\)) operator({) + reserved(if) operator((!)ident(ROBJECT)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(ROBJECT)operator(()ident(klass)operator(\)->)ident(iv_tbl) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + ident(st_insert)operator(()ident(ROBJECT)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) ident(classpath)operator(,) ident(arg)operator(.)ident(path)operator(\);) + ident(st_delete)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) operator(&)ident(tmp_classpath)operator(,) integer(0)operator(\);) + reserved(return) ident(arg)operator(.)ident(path)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(classname)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(path) operator(=) ident(Qnil)operator(;) + + reserved(if) operator((!)ident(klass)operator(\)) ident(klass) operator(=) ident(rb_cObject)operator(;) + reserved(if) operator(()ident(ROBJECT)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(\)) operator({) + reserved(if) operator((!)ident(st_lookup)operator(()ident(ROBJECT)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) ident(classpath)operator(,) operator(&)ident(path)operator(\)\)) operator({) + ident(ID) ident(classid) operator(=) ident(rb_intern)operator(()string<delimiter(")content(__classid__)delimiter(")>operator(\);) + + reserved(if) operator((!)ident(st_lookup)operator(()ident(ROBJECT)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) ident(classid)operator(,) operator(&)ident(path)operator(\)\)) operator({) + reserved(return) ident(find_class_path)operator(()ident(klass)operator(\);) + operator(}) + ident(path) operator(=) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(SYM2ID)operator(()ident(path)operator(\)\)\);) + ident(st_insert)operator(()ident(ROBJECT)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) ident(classpath)operator(,) ident(path)operator(\);) + ident(st_delete)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(classid)operator(,) integer(0)operator(\);) + operator(}) + reserved(if) operator(()ident(TYPE)operator(()ident(path)operator(\)) operator(!=) ident(T_STRING)operator(\)) operator({) + ident(rb_bug)operator(()string<delimiter(")content(class path is not set properly)delimiter(")>operator(\);) + operator(}) + reserved(return) ident(path)operator(;) + operator(}) + reserved(return) ident(find_class_path)operator(()ident(klass)operator(\);) +operator(}) + +comment(/* + * call-seq: + * mod.name => string + * + * Returns the name of the module <i>mod</i>. + */) + +ident(VALUE) +ident(rb_mod_name)operator(()ident(mod)operator(\)) + ident(VALUE) ident(mod)operator(;) +operator({) + ident(VALUE) ident(path) operator(=) ident(classname)operator(()ident(mod)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(path)operator(\)\)) reserved(return) ident(rb_str_dup)operator(()ident(path)operator(\);) + reserved(return) ident(rb_str_new)operator(()integer(0)operator(,)integer(0)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_class_path)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + ident(VALUE) ident(path) operator(=) ident(classname)operator(()ident(klass)operator(\);) + + reserved(if) operator((!)ident(NIL_P)operator(()ident(path)operator(\)\)) reserved(return) ident(path)operator(;) + reserved(if) operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl) operator(&&) ident(st_lookup)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) + ident(tmp_classpath)operator(,) operator(&)ident(path)operator(\)\)) operator({) + reserved(return) ident(path)operator(;) + operator(}) + reserved(else) operator({) + pre_type(char) operator(*)ident(s) operator(=) string<delimiter(")content(Class)delimiter(")>operator(;) + ident(size_t) ident(len)operator(;) + + reserved(if) operator(()ident(TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_MODULE)operator(\)) operator({) + reserved(if) operator(()ident(rb_obj_class)operator(()ident(klass)operator(\)) operator(==) ident(rb_cModule)operator(\)) operator({) + ident(s) operator(=) string<delimiter(")content(Module)delimiter(")>operator(;) + operator(}) + reserved(else) operator({) + ident(s) operator(=) ident(rb_class2name)operator(()ident(RBASIC)operator(()ident(klass)operator(\)->)ident(klass)operator(\);) + operator(}) + operator(}) + ident(len) operator(=) integer(2) operator(+) ident(strlen)operator(()ident(s)operator(\)) operator(+) integer(3) operator(+) integer(2) operator(*) ident(SIZEOF_LONG) operator(+) integer(1)operator(;) + ident(path) operator(=) ident(rb_str_new)operator(()integer(0)operator(,) ident(len)operator(\);) + ident(snprintf)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(,) ident(len)operator(+)integer(1)operator(,) string<delimiter(")content(#<%s:0x%lx>)delimiter(")>operator(,) ident(s)operator(,) ident(klass)operator(\);) + ident(RSTRING)operator(()ident(path)operator(\)->)ident(len) operator(=) ident(strlen)operator(()ident(RSTRING)operator(()ident(path)operator(\)->)ident(ptr)operator(\);) + ident(rb_ivar_set)operator(()ident(klass)operator(,) ident(tmp_classpath)operator(,) ident(path)operator(\);) + + reserved(return) ident(path)operator(;) + operator(}) +operator(}) + +directive(void) +ident(rb_set_class_path)operator(()ident(klass)operator(,) ident(under)operator(,) ident(name)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(under)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(VALUE) ident(str)operator(;) + + reserved(if) operator(()ident(under) operator(==) ident(rb_cObject)operator(\)) operator({) + ident(str) operator(=) ident(rb_str_new2)operator(()ident(name)operator(\);) + operator(}) + reserved(else) operator({) + ident(str) operator(=) ident(rb_str_dup)operator(()ident(rb_class_path)operator(()ident(under)operator(\)\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) string<delimiter(")content(::)delimiter(")>operator(\);) + ident(rb_str_cat2)operator(()ident(str)operator(,) ident(name)operator(\);) + operator(}) + ident(rb_ivar_set)operator(()ident(klass)operator(,) ident(classpath)operator(,) ident(str)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_path2class)operator(()ident(path)operator(\)) + directive(const) pre_type(char) operator(*)ident(path)operator(;) +operator({) + directive(const) pre_type(char) operator(*)ident(pbeg)operator(,) operator(*)ident(p)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(c) operator(=) ident(rb_cObject)operator(;) + ident(VALUE) ident(str) operator(=) integer(0)operator(;) + + reserved(if) operator(()ident(path)operator([)integer(0)operator(]) operator(==) char('#')operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(can't retrieve anonymous class %s)delimiter(")>operator(,) ident(path)operator(\);) + operator(}) + ident(pbeg) operator(=) ident(p) operator(=) ident(path)operator(;) + reserved(while) operator((*)ident(p)operator(\)) operator({) + reserved(while) operator((*)ident(p) operator(&&) operator(*)ident(p) operator(!=) char(':')operator(\)) ident(p)operator(++;) + reserved(if) operator(()ident(str)operator(\)) operator({) + ident(RSTRING)operator(()ident(str)operator(\)->)ident(len) operator(=) integer(0)operator(;) + ident(rb_str_cat)operator(()ident(str)operator(,) ident(pbeg)operator(,) ident(p)operator(-)ident(pbeg)operator(\);) + operator(}) + reserved(else) operator({) + ident(str) operator(=) ident(rb_str_new)operator(()ident(pbeg)operator(,) ident(p)operator(-)ident(pbeg)operator(\);) + operator(}) + ident(id) operator(=) ident(rb_intern)operator(()ident(RSTRING)operator(()ident(str)operator(\)->)ident(ptr)operator(\);) + reserved(if) operator(()ident(p)operator([)integer(0)operator(]) operator(==) char(':')operator(\)) operator({) + reserved(if) operator(()ident(p)operator([)integer(1)operator(]) operator(!=) char(':')operator(\)) reserved(goto) ident(undefined_class)operator(;) + ident(p) operator(+=) integer(2)operator(;) + ident(pbeg) operator(=) ident(p)operator(;) + operator(}) + reserved(if) operator((!)ident(rb_const_defined)operator(()ident(c)operator(,) ident(id)operator(\)\)) operator({) + label(undefined_class)operator(:) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(undefined class/module %.*s)delimiter(")>operator(,) ident(p)operator(-)ident(path)operator(,) ident(path)operator(\);) + operator(}) + ident(c) operator(=) ident(rb_const_get_at)operator(()ident(c)operator(,) ident(id)operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(c)operator(\)\)) operator({) + reserved(case) label(T_MODULE)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(break)operator(;) + reserved(default)operator(:) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(%s does not refer class/module)delimiter(")>operator(,) ident(path)operator(\);) + operator(}) + operator(}) + + reserved(return) ident(c)operator(;) +operator(}) + +directive(void) +ident(rb_name_class)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(rb_iv_set)operator(()ident(klass)operator(,) string<delimiter(")content(__classid__)delimiter(")>operator(,) ident(ID2SYM)operator(()ident(id)operator(\)\);) +operator(}) + +ident(VALUE) +ident(rb_class_name)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(return) ident(rb_class_path)operator(()ident(rb_class_real)operator(()ident(klass)operator(\)\);) +operator(}) + +pre_type(char) operator(*) +ident(rb_class2name)operator(()ident(klass)operator(\)) + ident(VALUE) ident(klass)operator(;) +operator({) + reserved(return) ident(RSTRING)operator(()ident(rb_class_name)operator(()ident(klass)operator(\)\)->)ident(ptr)operator(;) +operator(}) + +pre_type(char) operator(*) +ident(rb_obj_classname)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + reserved(return) ident(rb_class2name)operator(()ident(CLASS_OF)operator(()ident(obj)operator(\)\);) +operator(}) + +reserved(struct) ident(trace_var) operator({) + pre_type(int) ident(removed)operator(;) + directive(void) operator((*)ident(func)operator(\)(\);) + ident(VALUE) ident(data)operator(;) + reserved(struct) ident(trace_var) operator(*)ident(next)operator(;) +operator(};) + +reserved(struct) ident(global_variable) operator({) + pre_type(int) ident(counter)operator(;) + directive(void) operator(*)ident(data)operator(;) + ident(VALUE) operator((*)ident(getter)operator(\)(\);) + directive(void) operator((*)ident(setter)operator(\)(\);) + directive(void) operator((*)ident(marker)operator(\)(\);) + pre_type(int) ident(block_trace)operator(;) + reserved(struct) ident(trace_var) operator(*)ident(trace)operator(;) +operator(};) + +reserved(struct) ident(global_entry) operator({) + reserved(struct) ident(global_variable) operator(*)ident(var)operator(;) + ident(ID) ident(id)operator(;) +operator(};) + +directive(static) ident(VALUE) ident(undef_getter)operator((\);) +directive(static) directive(void) ident(undef_setter)operator((\);) +directive(static) directive(void) ident(undef_marker)operator((\);) + +directive(static) ident(VALUE) ident(val_getter)operator((\);) +directive(static) directive(void) ident(val_setter)operator((\);) +directive(static) directive(void) ident(val_marker)operator((\);) + +directive(static) ident(VALUE) ident(var_getter)operator((\);) +directive(static) directive(void) ident(var_setter)operator((\);) +directive(static) directive(void) ident(var_marker)operator((\);) + +reserved(struct) ident(global_entry)operator(*) +ident(rb_global_entry)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) + + reserved(if) operator((!)ident(st_lookup)operator(()ident(rb_global_tbl)operator(,) ident(id)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(entry)operator(\)\)) operator({) + reserved(struct) ident(global_variable) operator(*)ident(var)operator(;) + ident(entry) operator(=) ident(ALLOC)operator(()reserved(struct) ident(global_entry)operator(\);) + ident(var) operator(=) ident(ALLOC)operator(()reserved(struct) ident(global_variable)operator(\);) + ident(entry)operator(->)ident(id) operator(=) ident(id)operator(;) + ident(entry)operator(->)ident(var) operator(=) ident(var)operator(;) + ident(var)operator(->)ident(counter) operator(=) integer(1)operator(;) + ident(var)operator(->)ident(data) operator(=) integer(0)operator(;) + ident(var)operator(->)ident(getter) operator(=) ident(undef_getter)operator(;) + ident(var)operator(->)ident(setter) operator(=) ident(undef_setter)operator(;) + ident(var)operator(->)ident(marker) operator(=) ident(undef_marker)operator(;) + + ident(var)operator(->)ident(block_trace) operator(=) integer(0)operator(;) + ident(var)operator(->)ident(trace) operator(=) integer(0)operator(;) + ident(st_add_direct)operator(()ident(rb_global_tbl)operator(,) ident(id)operator(,) operator(()ident(st_data_t)operator(\))ident(entry)operator(\);) + operator(}) + reserved(return) ident(entry)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(undef_getter)operator(()ident(id)operator(\)) + ident(ID) ident(id)operator(;) +operator({) + ident(rb_warning)operator(()string<delimiter(")content(global variable `%s' not initialized)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) directive(void) +ident(undef_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(data)operator(,) ident(var)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + directive(void) operator(*)ident(data)operator(;) + reserved(struct) ident(global_variable) operator(*)ident(var)operator(;) +operator({) + ident(var)operator(->)ident(getter) operator(=) ident(val_getter)operator(;) + ident(var)operator(->)ident(setter) operator(=) ident(val_setter)operator(;) + ident(var)operator(->)ident(marker) operator(=) ident(val_marker)operator(;) + + ident(var)operator(->)ident(data) operator(=) operator(()directive(void)operator(*\))ident(val)operator(;) +operator(}) + +directive(static) directive(void) +ident(undef_marker)operator((\)) +operator({) +operator(}) + +directive(static) ident(VALUE) +ident(val_getter)operator(()ident(id)operator(,) ident(val)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(return) ident(val)operator(;) +operator(}) + +directive(static) directive(void) +ident(val_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(data)operator(,) ident(var)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + directive(void) operator(*)ident(data)operator(;) + reserved(struct) ident(global_variable) operator(*)ident(var)operator(;) +operator({) + ident(var)operator(->)ident(data) operator(=) operator(()directive(void)operator(*\))ident(val)operator(;) +operator(}) + +directive(static) directive(void) +ident(val_marker)operator(()ident(data)operator(\)) + ident(VALUE) ident(data)operator(;) +operator({) + reserved(if) operator(()ident(data)operator(\)) ident(rb_gc_mark_maybe)operator(()ident(data)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(var_getter)operator(()ident(id)operator(,) ident(var)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + reserved(if) operator((!)ident(var)operator(\)) reserved(return) ident(Qnil)operator(;) + reserved(return) operator(*)ident(var)operator(;) +operator(}) + +directive(static) directive(void) +ident(var_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(var)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + operator(*)ident(var) operator(=) ident(val)operator(;) +operator(}) + +directive(static) directive(void) +ident(var_marker)operator(()ident(var)operator(\)) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + reserved(if) operator(()ident(var)operator(\)) ident(rb_gc_mark_maybe)operator((*)ident(var)operator(\);) +operator(}) + +directive(static) directive(void) +ident(readonly_setter)operator(()ident(val)operator(,) ident(id)operator(,) ident(var)operator(\)) + ident(VALUE) ident(val)operator(;) + ident(ID) ident(id)operator(;) + directive(void) operator(*)ident(var)operator(;) +operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(%s is a read-only variable)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) +operator(}) + +directive(static) pre_type(int) +ident(mark_global_entry)operator(()ident(key)operator(,) ident(entry)operator(\)) + ident(ID) ident(key)operator(;) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) +operator({) + reserved(struct) ident(trace_var) operator(*)ident(trace)operator(;) + reserved(struct) ident(global_variable) operator(*)ident(var) operator(=) ident(entry)operator(->)ident(var)operator(;) + + operator((*)ident(var)operator(->)ident(marker)operator(\)()ident(var)operator(->)ident(data)operator(\);) + ident(trace) operator(=) ident(var)operator(->)ident(trace)operator(;) + reserved(while) operator(()ident(trace)operator(\)) operator({) + reserved(if) operator(()ident(trace)operator(->)ident(data)operator(\)) ident(rb_gc_mark_maybe)operator(()ident(trace)operator(->)ident(data)operator(\);) + ident(trace) operator(=) ident(trace)operator(->)ident(next)operator(;) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(void) +ident(rb_gc_mark_global_tbl)operator((\)) +operator({) + reserved(if) operator(()ident(rb_global_tbl)operator(\)) operator({) + ident(st_foreach)operator(()ident(rb_global_tbl)operator(,) ident(mark_global_entry)operator(,) integer(0)operator(\);) + operator(}) +operator(}) + +directive(static) ident(ID) +ident(global_id)operator(()ident(name)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(ID) ident(id)operator(;) + + reserved(if) operator(()ident(name)operator([)integer(0)operator(]) operator(==) char('$')operator(\)) ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + reserved(else) operator({) + pre_type(char) operator(*)ident(buf) operator(=) ident(ALLOCA_N)operator(()pre_type(char)operator(,) ident(strlen)operator(()ident(name)operator(\)+)integer(2)operator(\);) + ident(buf)operator([)integer(0)operator(]) operator(=) char('$')operator(;) + ident(strcpy)operator(()ident(buf)operator(+)integer(1)operator(,) ident(name)operator(\);) + ident(id) operator(=) ident(rb_intern)operator(()ident(buf)operator(\);) + operator(}) + reserved(return) ident(id)operator(;) +operator(}) + +directive(void) +ident(rb_define_hooked_variable)operator(()ident(name)operator(,) ident(var)operator(,) ident(getter)operator(,) ident(setter)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) + ident(VALUE) operator((*)ident(getter)operator(\)(\);) + directive(void) operator((*)ident(setter)operator(\)(\);) +operator({) + reserved(struct) ident(global_variable) operator(*)ident(gvar)operator(;) + ident(ID) ident(id) operator(=) ident(global_id)operator(()ident(name)operator(\);) + + ident(gvar) operator(=) ident(rb_global_entry)operator(()ident(id)operator(\)->)ident(var)operator(;) + ident(gvar)operator(->)ident(data) operator(=) operator(()directive(void)operator(*\))ident(var)operator(;) + ident(gvar)operator(->)ident(getter) operator(=) ident(getter)operator(?)label(getter)operator(:)ident(var_getter)operator(;) + ident(gvar)operator(->)ident(setter) operator(=) ident(setter)operator(?)label(setter)operator(:)ident(var_setter)operator(;) + ident(gvar)operator(->)ident(marker) operator(=) ident(var_marker)operator(;) +operator(}) + +directive(void) +ident(rb_define_variable)operator(()ident(name)operator(,) ident(var)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + ident(rb_define_hooked_variable)operator(()ident(name)operator(,) ident(var)operator(,) integer(0)operator(,) integer(0)operator(\);) +operator(}) + +directive(void) +ident(rb_define_readonly_variable)operator(()ident(name)operator(,) ident(var)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator(*)ident(var)operator(;) +operator({) + ident(rb_define_hooked_variable)operator(()ident(name)operator(,) ident(var)operator(,) integer(0)operator(,) ident(readonly_setter)operator(\);) +operator(}) + +directive(void) +ident(rb_define_virtual_variable)operator(()ident(name)operator(,) ident(getter)operator(,) ident(setter)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) operator((*)ident(getter)operator(\)(\);) + directive(void) operator((*)ident(setter)operator(\)(\);) +operator({) + reserved(if) operator((!)ident(getter)operator(\)) ident(getter) operator(=) ident(val_getter)operator(;) + reserved(if) operator((!)ident(setter)operator(\)) ident(setter) operator(=) ident(readonly_setter)operator(;) + ident(rb_define_hooked_variable)operator(()ident(name)operator(,) integer(0)operator(,) ident(getter)operator(,) ident(setter)operator(\);) +operator(}) + +directive(static) directive(void) +ident(rb_trace_eval)operator(()ident(cmd)operator(,) ident(val)operator(\)) + ident(VALUE) ident(cmd)operator(,) ident(val)operator(;) +operator({) + ident(rb_eval_cmd)operator(()ident(cmd)operator(,) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(val)operator(\),) integer(0)operator(\);) +operator(}) + +comment(/* + * call-seq: + * trace_var(symbol, cmd \) => nil + * trace_var(symbol\) {|val| block } => nil + * + * Controls tracing of assignments to global variables. The parameter + * +symbol_ identifies the variable (as either a string name or a + * symbol identifier\). _cmd_ (which may be a string or a + * +Proc+ object\) or block is executed whenever the variable + * is assigned. The block or +Proc+ object receives the + * variable's new value as a parameter. Also see + * <code>Kernel::untrace_var</code>. + * + * trace_var :$_, proc {|v| puts "$_ is now '#{v}'" } + * $_ = "hello" + * $_ = ' there' + * + * <em>produces:</em> + * + * $_ is now 'hello' + * $_ is now ' there' + */) + +ident(VALUE) +ident(rb_f_trace_var)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(var)operator(,) ident(cmd)operator(;) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) + reserved(struct) ident(trace_var) operator(*)ident(trace)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + reserved(if) operator(()ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(var)operator(,) operator(&)ident(cmd)operator(\)) operator(==) integer(1)operator(\)) operator({) + ident(cmd) operator(=) ident(rb_block_proc)operator((\);) + operator(}) + reserved(if) operator(()ident(NIL_P)operator(()ident(cmd)operator(\)\)) operator({) + reserved(return) ident(rb_f_untrace_var)operator(()ident(argc)operator(,) ident(argv)operator(\);) + operator(}) + ident(entry) operator(=) ident(rb_global_entry)operator(()ident(rb_to_id)operator(()ident(var)operator(\)\);) + reserved(if) operator(()ident(OBJ_TAINTED)operator(()ident(cmd)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: tainted variable trace)delimiter(")>operator(\);) + operator(}) + ident(trace) operator(=) ident(ALLOC)operator(()reserved(struct) ident(trace_var)operator(\);) + ident(trace)operator(->)ident(next) operator(=) ident(entry)operator(->)ident(var)operator(->)ident(trace)operator(;) + ident(trace)operator(->)ident(func) operator(=) ident(rb_trace_eval)operator(;) + ident(trace)operator(->)ident(data) operator(=) ident(cmd)operator(;) + ident(trace)operator(->)ident(removed) operator(=) integer(0)operator(;) + ident(entry)operator(->)ident(var)operator(->)ident(trace) operator(=) ident(trace)operator(;) + + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) directive(void) +ident(remove_trace)operator(()ident(var)operator(\)) + reserved(struct) ident(global_variable) operator(*)ident(var)operator(;) +operator({) + reserved(struct) ident(trace_var) operator(*)ident(trace) operator(=) ident(var)operator(->)ident(trace)operator(;) + reserved(struct) ident(trace_var) ident(t)operator(;) + reserved(struct) ident(trace_var) operator(*)ident(next)operator(;) + + ident(t)operator(.)ident(next) operator(=) ident(trace)operator(;) + ident(trace) operator(=) operator(&)ident(t)operator(;) + reserved(while) operator(()ident(trace)operator(->)ident(next)operator(\)) operator({) + ident(next) operator(=) ident(trace)operator(->)ident(next)operator(;) + reserved(if) operator(()ident(next)operator(->)ident(removed)operator(\)) operator({) + ident(trace)operator(->)ident(next) operator(=) ident(next)operator(->)ident(next)operator(;) + ident(free)operator(()ident(next)operator(\);) + operator(}) + reserved(else) operator({) + ident(trace) operator(=) ident(next)operator(;) + operator(}) + operator(}) + ident(var)operator(->)ident(trace) operator(=) ident(t)operator(.)ident(next)operator(;) +operator(}) + +comment(/* + * call-seq: + * untrace_var(symbol [, cmd] \) => array or nil + * + * Removes tracing for the specified command on the given global + * variable and returns +nil+. If no command is specified, + * removes all tracing for that variable and returns an array + * containing the commands actually removed. + */) + +ident(VALUE) +ident(rb_f_untrace_var)operator(()ident(argc)operator(,) ident(argv)operator(\)) + pre_type(int) ident(argc)operator(;) + ident(VALUE) operator(*)ident(argv)operator(;) +operator({) + ident(VALUE) ident(var)operator(,) ident(cmd)operator(;) + ident(ID) ident(id)operator(;) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) + reserved(struct) ident(trace_var) operator(*)ident(trace)operator(;) + + ident(rb_secure)operator(()integer(4)operator(\);) + ident(rb_scan_args)operator(()ident(argc)operator(,) ident(argv)operator(,) string<delimiter(")content(11)delimiter(")>operator(,) operator(&)ident(var)operator(,) operator(&)ident(cmd)operator(\);) + ident(id) operator(=) ident(rb_to_id)operator(()ident(var)operator(\);) + reserved(if) operator((!)ident(st_lookup)operator(()ident(rb_global_tbl)operator(,) ident(id)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(entry)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(undefined global variable %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + + ident(trace) operator(=) ident(entry)operator(->)ident(var)operator(->)ident(trace)operator(;) + reserved(if) operator(()ident(NIL_P)operator(()ident(cmd)operator(\)\)) operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + reserved(while) operator(()ident(trace)operator(\)) operator({) + reserved(struct) ident(trace_var) operator(*)ident(next) operator(=) ident(trace)operator(->)ident(next)operator(;) + ident(rb_ary_push)operator(()ident(ary)operator(,) operator(()ident(VALUE)operator(\))ident(trace)operator(->)ident(data)operator(\);) + ident(trace)operator(->)ident(removed) operator(=) integer(1)operator(;) + ident(trace) operator(=) ident(next)operator(;) + operator(}) + + reserved(if) operator((!)ident(entry)operator(->)ident(var)operator(->)ident(block_trace)operator(\)) ident(remove_trace)operator(()ident(entry)operator(->)ident(var)operator(\);) + reserved(return) ident(ary)operator(;) + operator(}) + reserved(else) operator({) + reserved(while) operator(()ident(trace)operator(\)) operator({) + reserved(if) operator(()ident(trace)operator(->)ident(data) operator(==) ident(cmd)operator(\)) operator({) + ident(trace)operator(->)ident(removed) operator(=) integer(1)operator(;) + reserved(if) operator((!)ident(entry)operator(->)ident(var)operator(->)ident(block_trace)operator(\)) ident(remove_trace)operator(()ident(entry)operator(->)ident(var)operator(\);) + reserved(return) ident(rb_ary_new3)operator(()integer(1)operator(,) ident(cmd)operator(\);) + operator(}) + ident(trace) operator(=) ident(trace)operator(->)ident(next)operator(;) + operator(}) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +ident(VALUE) +ident(rb_gvar_get)operator(()ident(entry)operator(\)) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) +operator({) + reserved(struct) ident(global_variable) operator(*)ident(var) operator(=) ident(entry)operator(->)ident(var)operator(;) + reserved(return) operator((*)ident(var)operator(->)ident(getter)operator(\)()ident(entry)operator(->)ident(id)operator(,) ident(var)operator(->)ident(data)operator(,) ident(var)operator(\);) +operator(}) + +reserved(struct) ident(trace_data) operator({) + reserved(struct) ident(trace_var) operator(*)ident(trace)operator(;) + ident(VALUE) ident(val)operator(;) +operator(};) + +directive(static) ident(VALUE) +ident(trace_ev)operator(()ident(data)operator(\)) + reserved(struct) ident(trace_data) operator(*)ident(data)operator(;) +operator({) + reserved(struct) ident(trace_var) operator(*)ident(trace) operator(=) ident(data)operator(->)ident(trace)operator(;) + + reserved(while) operator(()ident(trace)operator(\)) operator({) + operator((*)ident(trace)operator(->)ident(func)operator(\)()ident(trace)operator(->)ident(data)operator(,) ident(data)operator(->)ident(val)operator(\);) + ident(trace) operator(=) ident(trace)operator(->)ident(next)operator(;) + operator(}) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +directive(static) ident(VALUE) +ident(trace_en)operator(()ident(var)operator(\)) + reserved(struct) ident(global_variable) operator(*)ident(var)operator(;) +operator({) + ident(var)operator(->)ident(block_trace) operator(=) integer(0)operator(;) + ident(remove_trace)operator(()ident(var)operator(\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +ident(VALUE) +ident(rb_gvar_set)operator(()ident(entry)operator(,) ident(val)operator(\)) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(struct) ident(trace_data) ident(trace)operator(;) + reserved(struct) ident(global_variable) operator(*)ident(var) operator(=) ident(entry)operator(->)ident(var)operator(;) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't change global variable value)delimiter(")>operator(\);) + operator((*)ident(var)operator(->)ident(setter)operator(\)()ident(val)operator(,) ident(entry)operator(->)ident(id)operator(,) ident(var)operator(->)ident(data)operator(,) ident(var)operator(\);) + + reserved(if) operator(()ident(var)operator(->)ident(trace) operator(&&) operator(!)ident(var)operator(->)ident(block_trace)operator(\)) operator({) + ident(var)operator(->)ident(block_trace) operator(=) integer(1)operator(;) + ident(trace)operator(.)ident(trace) operator(=) ident(var)operator(->)ident(trace)operator(;) + ident(trace)operator(.)ident(val) operator(=) ident(val)operator(;) + ident(rb_ensure)operator(()ident(trace_ev)operator(,) operator(()ident(VALUE)operator(\)&)ident(trace)operator(,) ident(trace_en)operator(,) operator(()ident(VALUE)operator(\))ident(var)operator(\);) + operator(}) + reserved(return) ident(val)operator(;) +operator(}) + +ident(VALUE) +ident(rb_gv_set)operator(()ident(name)operator(,) ident(val)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) + + ident(entry) operator(=) ident(rb_global_entry)operator(()ident(global_id)operator(()ident(name)operator(\)\);) + reserved(return) ident(rb_gvar_set)operator(()ident(entry)operator(,) ident(val)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_gv_get)operator(()ident(name)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) + + ident(entry) operator(=) ident(rb_global_entry)operator(()ident(global_id)operator(()ident(name)operator(\)\);) + reserved(return) ident(rb_gvar_get)operator(()ident(entry)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_gvar_defined)operator(()ident(entry)operator(\)) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) +operator({) + reserved(if) operator(()ident(entry)operator(->)ident(var)operator(->)ident(getter) operator(==) ident(undef_getter)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(gvar_i)operator(()ident(key)operator(,) ident(entry)operator(,) ident(ary)operator(\)) + ident(ID) ident(key)operator(;) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(key)operator(\)\)\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * global_variables => array + * + * Returns an array of the names of global variables. + * + * global_variables.grep /std/ #=> ["$stderr", "$stdout", "$stdin"] + */) + +ident(VALUE) +ident(rb_f_global_variables)operator((\)) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + pre_type(char) ident(buf)operator([)integer(4)operator(];) + pre_type(char) operator(*)ident(s) operator(=) string<delimiter(")content(&`'+123456789)delimiter(")>operator(;) + + ident(st_foreach)operator(()ident(rb_global_tbl)operator(,) ident(gvar_i)operator(,) ident(ary)operator(\);) + reserved(if) operator((!)ident(NIL_P)operator(()ident(rb_backref_get)operator((\)\)\)) operator({) + reserved(while) operator((*)ident(s)operator(\)) operator({) + ident(sprintf)operator(()ident(buf)operator(,) string<delimiter(")content($%c)delimiter(")>operator(,) operator(*)ident(s)operator(++\);) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(buf)operator(\)\);) + operator(}) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +directive(void) +ident(rb_alias_variable)operator(()ident(name1)operator(,) ident(name2)operator(\)) + ident(ID) ident(name1)operator(;) + ident(ID) ident(name2)operator(;) +operator({) + reserved(struct) ident(global_entry) operator(*)ident(entry1)operator(,) operator(*)ident(entry2)operator(;) + + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't alias global variable)delimiter(")>operator(\);) + + ident(entry2) operator(=) ident(rb_global_entry)operator(()ident(name2)operator(\);) + reserved(if) operator((!)ident(st_lookup)operator(()ident(rb_global_tbl)operator(,) ident(name1)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(entry1)operator(\)\)) operator({) + ident(entry1) operator(=) ident(ALLOC)operator(()reserved(struct) ident(global_entry)operator(\);) + ident(entry1)operator(->)ident(id) operator(=) ident(name1)operator(;) + ident(st_add_direct)operator(()ident(rb_global_tbl)operator(,) ident(name1)operator(,) operator(()ident(st_data_t)operator(\))ident(entry1)operator(\);) + operator(}) + reserved(else) reserved(if) operator(()ident(entry1)operator(->)ident(var) operator(!=) ident(entry2)operator(->)ident(var)operator(\)) operator({) + reserved(struct) ident(global_variable) operator(*)ident(var) operator(=) ident(entry1)operator(->)ident(var)operator(;) + reserved(if) operator(()ident(var)operator(->)ident(block_trace)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eRuntimeError)operator(,) string<delimiter(")content(can't alias in tracer)delimiter(")>operator(\);) + operator(}) + ident(var)operator(->)ident(counter)operator(--;) + reserved(if) operator(()ident(var)operator(->)ident(counter) operator(==) integer(0)operator(\)) operator({) + reserved(struct) ident(trace_var) operator(*)ident(trace) operator(=) ident(var)operator(->)ident(trace)operator(;) + reserved(while) operator(()ident(trace)operator(\)) operator({) + reserved(struct) ident(trace_var) operator(*)ident(next) operator(=) ident(trace)operator(->)ident(next)operator(;) + ident(free)operator(()ident(trace)operator(\);) + ident(trace) operator(=) ident(next)operator(;) + operator(}) + ident(free)operator(()ident(var)operator(\);) + operator(}) + operator(}) + reserved(else) operator({) + reserved(return)operator(;) + operator(}) + ident(entry2)operator(->)ident(var)operator(->)ident(counter)operator(++;) + ident(entry1)operator(->)ident(var) operator(=) ident(entry2)operator(->)ident(var)operator(;) +operator(}) + +directive(static) pre_type(int) ident(special_generic_ivar) operator(=) integer(0)operator(;) +directive(static) ident(st_table) operator(*)ident(generic_iv_tbl)operator(;) + +ident(st_table)operator(*) +ident(rb_generic_ivar_table)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + + reserved(if) operator((!)ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)\)) reserved(return) integer(0)operator(;) + reserved(if) operator((!)ident(generic_iv_tbl)operator(\)) reserved(return) integer(0)operator(;) + reserved(if) operator((!)ident(st_lookup)operator(()ident(generic_iv_tbl)operator(,) ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\)\)) reserved(return) integer(0)operator(;) + reserved(return) ident(tbl)operator(;) +operator(}) + +directive(static) ident(VALUE) +ident(generic_ivar_get)operator(()ident(obj)operator(,) ident(id)operator(,) ident(warn)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(warn)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + ident(VALUE) ident(val)operator(;) + + reserved(if) operator(()ident(generic_iv_tbl)operator(\)) operator({) + reserved(if) operator(()ident(st_lookup)operator(()ident(generic_iv_tbl)operator(,) ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\)\)) operator({) + reserved(if) operator(()ident(st_lookup)operator(()ident(tbl)operator(,) ident(id)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(return) ident(val)operator(;) + operator(}) + operator(}) + operator(}) + reserved(if) operator(()ident(warn)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(instance variable %s not initialized)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +directive(static) directive(void) +ident(generic_ivar_set)operator(()ident(obj)operator(,) ident(id)operator(,) ident(val)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + + reserved(if) operator(()ident(rb_special_const_p)operator(()ident(obj)operator(\)\)) operator({) + ident(special_generic_ivar) operator(=) integer(1)operator(;) + operator(}) + reserved(if) operator((!)ident(generic_iv_tbl)operator(\)) operator({) + ident(generic_iv_tbl) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + + reserved(if) operator((!)ident(st_lookup)operator(()ident(generic_iv_tbl)operator(,) ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\)\)) operator({) + ident(FL_SET)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\);) + ident(tbl) operator(=) ident(st_init_numtable)operator((\);) + ident(st_add_direct)operator(()ident(generic_iv_tbl)operator(,) ident(obj)operator(,) operator(()ident(st_data_t)operator(\))ident(tbl)operator(\);) + ident(st_add_direct)operator(()ident(tbl)operator(,) ident(id)operator(,) ident(val)operator(\);) + reserved(return)operator(;) + operator(}) + ident(st_insert)operator(()ident(tbl)operator(,) ident(id)operator(,) ident(val)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(generic_ivar_defined)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + ident(VALUE) ident(val)operator(;) + + reserved(if) operator((!)ident(generic_iv_tbl)operator(\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator((!)ident(st_lookup)operator(()ident(generic_iv_tbl)operator(,) ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\)\)) reserved(return) ident(Qfalse)operator(;) + reserved(if) operator(()ident(st_lookup)operator(()ident(tbl)operator(,) ident(id)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(generic_ivar_remove)operator(()ident(obj)operator(,) ident(id)operator(,) ident(valp)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) operator(*)ident(valp)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + pre_type(int) ident(status)operator(;) + + reserved(if) operator((!)ident(generic_iv_tbl)operator(\)) reserved(return) integer(0)operator(;) + reserved(if) operator((!)ident(st_lookup)operator(()ident(generic_iv_tbl)operator(,) ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\)\)) reserved(return) integer(0)operator(;) + ident(status) operator(=) ident(st_delete)operator(()ident(tbl)operator(,) operator(&)ident(id)operator(,) ident(valp)operator(\);) + reserved(if) operator(()ident(tbl)operator(->)ident(num_entries) operator(==) integer(0)operator(\)) operator({) + ident(st_delete)operator(()ident(generic_iv_tbl)operator(,) operator(&)ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\);) + ident(st_free_table)operator(()ident(tbl)operator(\);) + operator(}) + reserved(return) ident(status)operator(;) +operator(}) + +directive(void) +ident(rb_mark_generic_ivar)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + + reserved(if) operator((!)ident(generic_iv_tbl)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(st_lookup)operator(()ident(generic_iv_tbl)operator(,) ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\)\)) operator({) + ident(rb_mark_tbl)operator(()ident(tbl)operator(\);) + operator(}) +operator(}) + +directive(static) pre_type(int) +ident(givar_mark_i)operator(()ident(key)operator(,) ident(value)operator(\)) + ident(ID) ident(key)operator(;) + ident(VALUE) ident(value)operator(;) +operator({) + ident(rb_gc_mark)operator(()ident(value)operator(\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(givar_i)operator(()ident(obj)operator(,) ident(tbl)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(st_table) operator(*)ident(tbl)operator(;) +operator({) + reserved(if) operator(()ident(rb_special_const_p)operator(()ident(obj)operator(\)\)) operator({) + ident(st_foreach)operator(()ident(tbl)operator(,) ident(givar_mark_i)operator(,) integer(0)operator(\);) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(void) +ident(rb_mark_generic_ivar_tbl)operator((\)) +operator({) + reserved(if) operator((!)ident(generic_iv_tbl)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(special_generic_ivar) operator(==) integer(0)operator(\)) reserved(return)operator(;) + ident(st_foreach_safe)operator(()ident(generic_iv_tbl)operator(,) ident(givar_i)operator(,) integer(0)operator(\);) +operator(}) + +directive(void) +ident(rb_free_generic_ivar)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + + reserved(if) operator(()ident(st_delete)operator(()ident(generic_iv_tbl)operator(,) operator(&)ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\)\)) + ident(st_free_table)operator(()ident(tbl)operator(\);) +operator(}) + +directive(void) +ident(rb_copy_generic_ivar)operator(()ident(clone)operator(,) ident(obj)operator(\)) + ident(VALUE) ident(clone)operator(,) ident(obj)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + + reserved(if) operator((!)ident(generic_iv_tbl)operator(\)) reserved(return)operator(;) + reserved(if) operator(()ident(st_lookup)operator(()ident(generic_iv_tbl)operator(,) ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\)\)) operator({) + ident(st_table) operator(*)ident(old)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(generic_iv_tbl)operator(,) ident(clone)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(old)operator(\)\)) operator({) + ident(st_free_table)operator(()ident(old)operator(\);) + ident(st_insert)operator(()ident(generic_iv_tbl)operator(,) ident(clone)operator(,) operator(()ident(st_data_t)operator(\))ident(st_copy)operator(()ident(tbl)operator(\)\);) + operator(}) + reserved(else) operator({) + ident(st_add_direct)operator(()ident(generic_iv_tbl)operator(,) ident(clone)operator(,) operator(()ident(st_data_t)operator(\))ident(st_copy)operator(()ident(tbl)operator(\)\);) + operator(}) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(ivar_get)operator(()ident(obj)operator(,) ident(id)operator(,) ident(warn)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(warn)operator(;) +operator({) + ident(VALUE) ident(val)operator(;) + + reserved(switch) operator(()ident(TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_OBJECT)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(if) operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl) operator(&&) ident(st_lookup)operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(,) ident(id)operator(,) operator(&)ident(val)operator(\)\)) + reserved(return) ident(val)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)) operator(||) ident(rb_special_const_p)operator(()ident(obj)operator(\)\)) + reserved(return) ident(generic_ivar_get)operator(()ident(obj)operator(,) ident(id)operator(,) ident(warn)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(if) operator(()ident(warn)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(instance variable %s not initialized)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ivar_get)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(ivar_get)operator(()ident(obj)operator(,) ident(id)operator(,) ident(Qtrue)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_attr_get)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(ivar_get)operator(()ident(obj)operator(,) ident(id)operator(,) ident(Qfalse)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_ivar_set)operator(()ident(obj)operator(,) ident(id)operator(,) ident(val)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(obj)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify instance variable)delimiter(")>operator(\);) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(obj)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(object)delimiter(")>operator(\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_OBJECT)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(if) operator((!)ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(\)) ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl) operator(=) ident(st_init_numtable)operator((\);) + ident(st_insert)operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(,) ident(id)operator(,) ident(val)operator(\);) + reserved(break)operator(;) + reserved(default)operator(:) + ident(generic_ivar_set)operator(()ident(obj)operator(,) ident(id)operator(,) ident(val)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(return) ident(val)operator(;) +operator(}) + +ident(VALUE) +ident(rb_ivar_defined)operator(()ident(obj)operator(,) ident(id)operator(\)) + ident(VALUE) ident(obj)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(switch) operator(()ident(TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_OBJECT)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(if) operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl) operator(&&) ident(st_lookup)operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(,) ident(id)operator(,) integer(0)operator(\)\)) + reserved(return) ident(Qtrue)operator(;) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)) operator(||) ident(rb_special_const_p)operator(()ident(obj)operator(\)\)) + reserved(return) ident(generic_ivar_defined)operator(()ident(obj)operator(,) ident(id)operator(\);) + reserved(break)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(ivar_i)operator(()ident(key)operator(,) ident(entry)operator(,) ident(ary)operator(\)) + ident(ID) ident(key)operator(;) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(rb_is_instance_id)operator(()ident(key)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(key)operator(\)\)\);) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.instance_variables => array + * + * Returns an array of instance variable names for the receiver. Note + * that simply defining an accessor does not create the corresponding + * instance variable. + * + * class Fred + * attr_accessor :a1 + * def initialize + * @iv = 3 + * end + * end + * Fred.new.instance_variables #=> ["@iv"] + */) + +ident(VALUE) +ident(rb_obj_instance_variables)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(ary)operator(;) + + ident(ary) operator(=) ident(rb_ary_new)operator((\);) + reserved(switch) operator(()ident(TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_OBJECT)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(if) operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(st_foreach_safe)operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(,) ident(ivar_i)operator(,) ident(ary)operator(\);) + operator(}) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(if) operator((!)ident(generic_iv_tbl)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)) operator(||) ident(rb_special_const_p)operator(()ident(obj)operator(\)\)) operator({) + ident(st_table) operator(*)ident(tbl)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(generic_iv_tbl)operator(,) ident(obj)operator(,) operator(()ident(st_data_t) operator(*\)&)ident(tbl)operator(\)\)) operator({) + ident(st_foreach_safe)operator(()ident(tbl)operator(,) ident(ivar_i)operator(,) ident(ary)operator(\);) + operator(}) + operator(}) + reserved(break)operator(;) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * obj.remove_instance_variable(symbol\) => obj + * + * Removes the named instance variable from <i>obj</i>, returning that + * variable's value. + * + * class Dummy + * attr_reader :var + * def initialize + * @var = 99 + * end + * def remove + * remove_instance_variable(:@var\) + * end + * end + * d = Dummy.new + * d.var #=> 99 + * d.remove #=> 99 + * d.var #=> nil + */) + +ident(VALUE) +ident(rb_obj_remove_instance_variable)operator(()ident(obj)operator(,) ident(name)operator(\)) + ident(VALUE) ident(obj)operator(,) ident(name)operator(;) +operator({) + ident(VALUE) ident(val) operator(=) ident(Qnil)operator(;) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(name)operator(\);) + + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(obj)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify instance variable)delimiter(")>operator(\);) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(obj)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(object)delimiter(")>operator(\);) + reserved(if) operator((!)ident(rb_is_instance_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(`%s' is not allowed as an instance variable name)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + + reserved(switch) operator(()ident(TYPE)operator(()ident(obj)operator(\)\)) operator({) + reserved(case) label(T_OBJECT)operator(:) + reserved(case) label(T_CLASS)operator(:) + reserved(case) label(T_MODULE)operator(:) + reserved(if) operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl) operator(&&) ident(st_delete)operator(()ident(ROBJECT)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(return) ident(val)operator(;) + operator(}) + reserved(break)operator(;) + reserved(default)operator(:) + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)) operator(||) ident(rb_special_const_p)operator(()ident(obj)operator(\)\)) operator({) + reserved(if) operator(()ident(generic_ivar_remove)operator(()ident(obj)operator(,) ident(id)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(return) ident(val)operator(;) + operator(}) + operator(}) + reserved(break)operator(;) + operator(}) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(instance variable %s not defined)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +ident(NORETURN)operator(()directive(static) directive(void) ident(uninitialized_constant) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\)\);) +directive(static) directive(void) +ident(uninitialized_constant)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(if) operator(()ident(klass) operator(&&) ident(klass) operator(!=) ident(rb_cObject)operator(\)) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(uninitialized constant %s::%s)delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(klass)operator(\),) + ident(rb_id2name)operator(()ident(id)operator(\)\);) + reserved(else) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(uninitialized constant %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) +operator(}) + +directive(static) ident(VALUE) +ident(const_missing)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(rb_funcall)operator(()ident(klass)operator(,) ident(rb_intern)operator(()string<delimiter(")content(const_missing)delimiter(")>operator(\),) integer(1)operator(,) ident(ID2SYM)operator(()ident(id)operator(\)\);) +operator(}) + + +comment(/* + * call-seq: + * mod.const_missing(sym\) => obj + * + * Invoked when a reference is made to an undefined constant in + * <i>mod</i>. It is passed a symbol for the undefined constant, and + * returns a value to be used for that constant. The + * following code is a (very bad\) example: if reference is made to + * an undefined constant, it attempts to load a file whose name is + * the lowercase version of the constant (thus class <code>Fred</code> is + * assumed to be in file <code>fred.rb</code>\). If found, it returns the + * value of the loaded class. It therefore implements a perverse + * kind of autoload facility. + * + * def Object.const_missing(name\) + * @looked_for ||= {} + * str_name = name.to_s + * raise "Class not found: #{name}" if @looked_for[str_name] + * @looked_for[str_name] = 1 + * file = str_name.downcase + * require file + * klass = const_get(name\) + * return klass if klass + * raise "Class not found: #{name}" + * end + * + */) + +ident(VALUE) +ident(rb_mod_const_missing)operator(()ident(klass)operator(,) ident(name)operator(\)) + ident(VALUE) ident(klass)operator(,) ident(name)operator(;) +operator({) + ident(ruby_frame) operator(=) ident(ruby_frame)operator(->)ident(prev)operator(;) comment(/* pop frame for "const_missing" */) + ident(uninitialized_constant)operator(()ident(klass)operator(,) ident(rb_to_id)operator(()ident(name)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +directive(static) reserved(struct) ident(st_table) operator(*) +ident(check_autoload_table)operator(()ident(av)operator(\)) + ident(VALUE) ident(av)operator(;) +operator({) + ident(Check_Type)operator(()ident(av)operator(,) ident(T_DATA)operator(\);) + reserved(if) operator(()ident(RDATA)operator(()ident(av)operator(\)->)ident(dmark) operator(!=) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(rb_mark_tbl) operator(||) + ident(RDATA)operator(()ident(av)operator(\)->)ident(dfree) operator(!=) operator(()ident(RUBY_DATA_FUNC)operator(\))ident(st_free_table)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(wrong autoload table: %s)delimiter(")>operator(,) ident(RSTRING)operator(()ident(rb_inspect)operator(()ident(av)operator(\)\)->)ident(ptr)operator(\);) + operator(}) + reserved(return) operator(()reserved(struct) ident(st_table) operator(*\))ident(DATA_PTR)operator(()ident(av)operator(\);) +operator(}) + +directive(void) +ident(rb_autoload)operator(()ident(mod)operator(,) ident(id)operator(,) ident(file)operator(\)) + ident(VALUE) ident(mod)operator(;) + ident(ID) ident(id)operator(;) + directive(const) pre_type(char) operator(*)ident(file)operator(;) +operator({) + ident(VALUE) ident(av)operator(,) ident(fn)operator(;) + reserved(struct) ident(st_table) operator(*)ident(tbl)operator(;) + + reserved(if) operator((!)ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eNameError)operator(,) string<delimiter(")content(autoload must be constant name)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(if) operator((!)ident(file) operator(||) operator(!*)ident(file)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(empty file name)delimiter(")>operator(\);) + operator(}) + + reserved(if) operator((()ident(tbl) operator(=) ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(\)) operator(&&) ident(st_lookup)operator(()ident(tbl)operator(,) ident(id)operator(,) operator(&)ident(av)operator(\)) operator(&&) ident(av) operator(!=) ident(Qundef)operator(\)) + reserved(return)operator(;) + + ident(rb_const_set)operator(()ident(mod)operator(,) ident(id)operator(,) ident(Qundef)operator(\);) + ident(tbl) operator(=) ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(;) + reserved(if) operator(()ident(st_lookup)operator(()ident(tbl)operator(,) ident(autoload)operator(,) operator(&)ident(av)operator(\)\)) operator({) + ident(tbl) operator(=) ident(check_autoload_table)operator(()ident(av)operator(\);) + operator(}) + reserved(else) operator({) + ident(av) operator(=) ident(Data_Wrap_Struct)operator(()integer(0) operator(,) ident(rb_mark_tbl)operator(,) ident(st_free_table)operator(,) integer(0)operator(\);) + ident(st_add_direct)operator(()ident(tbl)operator(,) ident(autoload)operator(,) ident(av)operator(\);) + ident(DATA_PTR)operator(()ident(av)operator(\)) operator(=) ident(tbl) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + ident(fn) operator(=) ident(rb_str_new2)operator(()ident(file)operator(\);) + ident(FL_UNSET)operator(()ident(fn)operator(,) ident(FL_TAINT)operator(\);) + ident(OBJ_FREEZE)operator(()ident(fn)operator(\);) + ident(st_insert)operator(()ident(tbl)operator(,) ident(id)operator(,) operator(()ident(st_data_t)operator(\))ident(rb_node_newnode)operator(()ident(NODE_MEMO)operator(,) ident(fn)operator(,) ident(ruby_safe_level)operator(,) integer(0)operator(\)\);) +operator(}) + +directive(static) ident(NODE)operator(*) +ident(autoload_delete)operator(()ident(mod)operator(,) ident(id)operator(\)) + ident(VALUE) ident(mod)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(val)operator(;) + ident(st_data_t) ident(load) operator(=) integer(0)operator(;) + + ident(st_delete)operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) integer(0)operator(\);) + reserved(if) operator(()ident(st_lookup)operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(,) ident(autoload)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(struct) ident(st_table) operator(*)ident(tbl) operator(=) ident(check_autoload_table)operator(()ident(val)operator(\);) + + ident(st_delete)operator(()ident(tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) operator(&)ident(load)operator(\);) + + reserved(if) operator(()ident(tbl)operator(->)ident(num_entries) operator(==) integer(0)operator(\)) operator({) + ident(id) operator(=) ident(autoload)operator(;) + ident(st_delete)operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) operator(&)ident(val)operator(\);) + operator(}) + operator(}) + + reserved(return) operator(()ident(NODE) operator(*\))ident(load)operator(;) +operator(}) + +ident(VALUE) +ident(rb_autoload_load)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(file)operator(;) + ident(NODE) operator(*)ident(load) operator(=) ident(autoload_delete)operator(()ident(klass)operator(,) ident(id)operator(\);) + + reserved(if) operator((!)ident(load) operator(||) operator(!()ident(file) operator(=) ident(load)operator(->)ident(nd_lit)operator(\)) operator(||) ident(rb_provided)operator(()ident(RSTRING)operator(()ident(file)operator(\)->)ident(ptr)operator(\)\)) operator({) + reserved(return) ident(Qfalse)operator(;) + operator(}) + reserved(return) ident(rb_require_safe)operator(()ident(file)operator(,) ident(load)operator(->)ident(nd_nth)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(autoload_file)operator(()ident(mod)operator(,) ident(id)operator(\)) + ident(VALUE) ident(mod)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(val)operator(,) ident(file)operator(;) + reserved(struct) ident(st_table) operator(*)ident(tbl)operator(;) + ident(st_data_t) ident(load)operator(;) + + reserved(if) operator((!)ident(st_lookup)operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(,) ident(autoload)operator(,) operator(&)ident(val)operator(\)) operator(||) + operator(!()ident(tbl) operator(=) ident(check_autoload_table)operator(()ident(val)operator(\)\)) operator(||) operator(!)ident(st_lookup)operator(()ident(tbl)operator(,) ident(id)operator(,) operator(&)ident(load)operator(\)\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + ident(file) operator(=) operator((()ident(NODE) operator(*\))ident(load)operator(\)->)ident(nd_lit)operator(;) + ident(Check_Type)operator(()ident(file)operator(,) ident(T_STRING)operator(\);) + reserved(if) operator((!)ident(RSTRING)operator(()ident(file)operator(\)->)ident(ptr) operator(||) operator(!*)ident(RSTRING)operator(()ident(file)operator(\)->)ident(ptr)operator(\)) operator({) + ident(rb_raise)operator(()ident(rb_eArgError)operator(,) string<delimiter(")content(empty file name)delimiter(")>operator(\);) + operator(}) + reserved(if) operator((!)ident(rb_provided)operator(()ident(RSTRING)operator(()ident(file)operator(\)->)ident(ptr)operator(\)\)) operator({) + reserved(return) ident(file)operator(;) + operator(}) + + comment(/* already loaded but not defined */) + ident(st_delete)operator(()ident(tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) integer(0)operator(\);) + reserved(if) operator((!)ident(tbl)operator(->)ident(num_entries)operator(\)) operator({) + ident(id) operator(=) ident(autoload)operator(;) + ident(st_delete)operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) operator(&)ident(val)operator(\);) + operator(}) + reserved(return) ident(Qnil)operator(;) +operator(}) + +ident(VALUE) +ident(rb_autoload_p)operator(()ident(mod)operator(,) ident(id)operator(\)) + ident(VALUE) ident(mod)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(struct) ident(st_table) operator(*)ident(tbl) operator(=) ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(;) + ident(VALUE) ident(val)operator(;) + + reserved(if) operator((!)ident(tbl) operator(||) operator(!)ident(st_lookup)operator(()ident(tbl)operator(,) ident(id)operator(,) operator(&)ident(val)operator(\)) operator(||) ident(val) operator(!=) ident(Qundef)operator(\)) operator({) + reserved(return) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(autoload_file)operator(()ident(mod)operator(,) ident(id)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(rb_const_get_0)operator(()ident(klass)operator(,) ident(id)operator(,) ident(exclude)operator(,) ident(recurse)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(exclude)operator(,) ident(recurse)operator(;) +operator({) + ident(VALUE) ident(value)operator(,) ident(tmp)operator(;) + pre_type(int) ident(mod_retry) operator(=) integer(0)operator(;) + + ident(tmp) operator(=) ident(klass)operator(;) + label(retry)operator(:) + reserved(while) operator(()ident(tmp)operator(\)) operator({) + reserved(while) operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl) operator(&&) ident(st_lookup)operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl)operator(,)ident(id)operator(,&)ident(value)operator(\)\)) operator({) + reserved(if) operator(()ident(value) operator(==) ident(Qundef)operator(\)) operator({) + reserved(if) operator((!)ident(RTEST)operator(()ident(rb_autoload_load)operator(()ident(tmp)operator(,) ident(id)operator(\)\)\)) reserved(break)operator(;) + reserved(continue)operator(;) + operator(}) + reserved(if) operator(()ident(exclude) operator(&&) ident(tmp) operator(==) ident(rb_cObject) operator(&&) ident(klass) operator(!=) ident(rb_cObject)operator(\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(toplevel constant %s referenced by %s::%s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\),) ident(rb_class2name)operator(()ident(klass)operator(\),) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(return) ident(value)operator(;) + operator(}) + reserved(if) operator((!)ident(recurse) operator(&&) ident(klass) operator(!=) ident(rb_cObject)operator(\)) reserved(break)operator(;) + ident(tmp) operator(=) ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(super)operator(;) + operator(}) + reserved(if) operator((!)ident(exclude) operator(&&) operator(!)ident(mod_retry) operator(&&) ident(BUILTIN_TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_MODULE)operator(\)) operator({) + ident(mod_retry) operator(=) integer(1)operator(;) + ident(tmp) operator(=) ident(rb_cObject)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) + + reserved(return) ident(const_missing)operator(()ident(klass)operator(,) ident(id)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_const_get_from)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(rb_const_get_0)operator(()ident(klass)operator(,) ident(id)operator(,) ident(Qtrue)operator(,) ident(Qtrue)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_const_get)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(rb_const_get_0)operator(()ident(klass)operator(,) ident(id)operator(,) ident(Qfalse)operator(,) ident(Qtrue)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_const_get_at)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(rb_const_get_0)operator(()ident(klass)operator(,) ident(id)operator(,) ident(Qtrue)operator(,) ident(Qfalse)operator(\);) +operator(}) + +comment(/* + * call-seq: + * remove_const(sym\) => obj + * + * Removes the definition of the given constant, returning that + * constant's value. Predefined classes and singleton objects (such as + * <i>true</i>\) cannot be removed. + */) + +ident(VALUE) +ident(rb_mod_remove_const)operator(()ident(mod)operator(,) ident(name)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(name)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(name)operator(\);) + ident(VALUE) ident(val)operator(;) + + reserved(if) operator((!)ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(`%s' is not allowed as a constant name)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(mod)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't remove constant)delimiter(")>operator(\);) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(mod)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(class/module)delimiter(")>operator(\);) + + reserved(if) operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl) operator(&&) ident(st_delete)operator(()ident(ROBJECT)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(if) operator(()ident(val) operator(==) ident(Qundef)operator(\)) operator({) + ident(autoload_delete)operator(()ident(mod)operator(,) ident(id)operator(\);) + ident(val) operator(=) ident(Qnil)operator(;) + operator(}) + reserved(return) ident(val)operator(;) + operator(}) + reserved(if) operator(()ident(rb_const_defined_at)operator(()ident(mod)operator(,) ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(cannot remove %s::%s)delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(mod)operator(\),) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(constant %s::%s not defined)delimiter(")>operator(,) + ident(rb_class2name)operator(()ident(mod)operator(\),) ident(rb_id2name)operator(()ident(id)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +directive(static) pre_type(int) +ident(sv_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(tbl)operator(\)) + ident(ID) ident(key)operator(;) + ident(VALUE) ident(value)operator(;) + ident(st_table) operator(*)ident(tbl)operator(;) +operator({) + reserved(if) operator(()ident(rb_is_const_id)operator(()ident(key)operator(\)\)) operator({) + reserved(if) operator((!)ident(st_lookup)operator(()ident(tbl)operator(,) ident(key)operator(,) integer(0)operator(\)\)) operator({) + ident(st_insert)operator(()ident(tbl)operator(,) ident(key)operator(,) ident(key)operator(\);) + operator(}) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +directive(void)operator(*) +ident(rb_mod_const_at)operator(()ident(mod)operator(,) ident(data)operator(\)) + ident(VALUE) ident(mod)operator(;) + directive(void) operator(*)ident(data)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl) operator(=) ident(data)operator(;) + reserved(if) operator((!)ident(tbl)operator(\)) operator({) + ident(tbl) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + reserved(if) operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(st_foreach_safe)operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(,) ident(sv_i)operator(,) operator(()ident(st_data_t)operator(\))ident(tbl)operator(\);) + operator(}) + reserved(return) ident(tbl)operator(;) +operator(}) + +directive(void)operator(*) +ident(rb_mod_const_of)operator(()ident(mod)operator(,) ident(data)operator(\)) + ident(VALUE) ident(mod)operator(;) + directive(void) operator(*)ident(data)operator(;) +operator({) + ident(VALUE) ident(tmp) operator(=) ident(mod)operator(;) + reserved(for) operator((;;\)) operator({) + ident(data) operator(=) ident(rb_mod_const_at)operator(()ident(tmp)operator(,) ident(data)operator(\);) + ident(tmp) operator(=) ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(super)operator(;) + reserved(if) operator((!)ident(tmp)operator(\)) reserved(break)operator(;) + reserved(if) operator(()ident(tmp) operator(==) ident(rb_cObject) operator(&&) ident(mod) operator(!=) ident(rb_cObject)operator(\)) reserved(break)operator(;) + operator(}) + reserved(return) ident(data)operator(;) +operator(}) + +directive(static) pre_type(int) +ident(list_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(ary)operator(\)) + ident(ID) ident(key)operator(,) ident(value)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(key)operator(\)\)\);) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +ident(VALUE) +ident(rb_const_list)operator(()ident(data)operator(\)) + directive(void) operator(*)ident(data)operator(;) +operator({) + ident(st_table) operator(*)ident(tbl) operator(=) ident(data)operator(;) + ident(VALUE) ident(ary)operator(;) + + reserved(if) operator((!)ident(tbl)operator(\)) reserved(return) ident(rb_ary_new2)operator(()integer(0)operator(\);) + ident(ary) operator(=) ident(rb_ary_new2)operator(()ident(tbl)operator(->)ident(num_entries)operator(\);) + ident(st_foreach)operator(()ident(tbl)operator(,) ident(list_i)operator(,) ident(ary)operator(\);) + ident(st_free_table)operator(()ident(tbl)operator(\);) + + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.constants => array + * + * Returns an array of the names of the constants accessible in + * <i>mod</i>. This includes the names of constants in any included + * modules (example at start of section\). + */) + +ident(VALUE) +ident(rb_mod_constants)operator(()ident(mod)operator(\)) + ident(VALUE) ident(mod)operator(;) +operator({) + reserved(return) ident(rb_const_list)operator(()ident(rb_mod_const_of)operator(()ident(mod)operator(,) integer(0)operator(\)\);) +operator(}) + +directive(static) pre_type(int) +ident(rb_const_defined_0)operator(()ident(klass)operator(,) ident(id)operator(,) ident(exclude)operator(,) ident(recurse)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) + pre_type(int) ident(exclude)operator(,) ident(recurse)operator(;) +operator({) + ident(VALUE) ident(value)operator(,) ident(tmp)operator(;) + pre_type(int) ident(mod_retry) operator(=) integer(0)operator(;) + + ident(tmp) operator(=) ident(klass)operator(;) + label(retry)operator(:) + reserved(while) operator(()ident(tmp)operator(\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl) operator(&&) ident(st_lookup)operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl)operator(,) ident(id)operator(,) operator(&)ident(value)operator(\)\)) operator({) + reserved(if) operator(()ident(value) operator(==) ident(Qundef) operator(&&) ident(NIL_P)operator(()ident(autoload_file)operator(()ident(klass)operator(,) ident(id)operator(\)\)\)) + reserved(return) ident(Qfalse)operator(;) + reserved(return) ident(Qtrue)operator(;) + operator(}) + reserved(if) operator((!)ident(recurse) operator(&&) ident(klass) operator(!=) ident(rb_cObject)operator(\)) reserved(break)operator(;) + ident(tmp) operator(=) ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(super)operator(;) + operator(}) + reserved(if) operator((!)ident(exclude) operator(&&) operator(!)ident(mod_retry) operator(&&) ident(BUILTIN_TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_MODULE)operator(\)) operator({) + ident(mod_retry) operator(=) integer(1)operator(;) + ident(tmp) operator(=) ident(rb_cObject)operator(;) + reserved(goto) ident(retry)operator(;) + operator(}) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +pre_type(int) +ident(rb_const_defined_from)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(rb_const_defined_0)operator(()ident(klass)operator(,) ident(id)operator(,) ident(Qtrue)operator(,) ident(Qtrue)operator(\);) +operator(}) + +pre_type(int) +ident(rb_const_defined)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(rb_const_defined_0)operator(()ident(klass)operator(,) ident(id)operator(,) ident(Qfalse)operator(,) ident(Qtrue)operator(\);) +operator(}) + +pre_type(int) +ident(rb_const_defined_at)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + reserved(return) ident(rb_const_defined_0)operator(()ident(klass)operator(,) ident(id)operator(,) ident(Qtrue)operator(,) ident(Qfalse)operator(\);) +operator(}) + +directive(static) directive(void) +ident(mod_av_set)operator(()ident(klass)operator(,) ident(id)operator(,) ident(val)operator(,) ident(isconst)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(val)operator(;) + pre_type(int) ident(isconst)operator(;) +operator({) + pre_type(char) operator(*)ident(dest) operator(=) ident(isconst) operator(?) string<delimiter(")content(constant)delimiter(")> operator(:) string<delimiter(")content(class variable)delimiter(")>operator(;) + + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(klass)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't set %s)delimiter(")>operator(,) ident(dest)operator(\);) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(klass)operator(\)\)) operator({) + reserved(if) operator(()ident(BUILTIN_TYPE)operator(()ident(klass)operator(\)) operator(==) ident(T_MODULE)operator(\)) operator({) + ident(rb_error_frozen)operator(()string<delimiter(")content(module)delimiter(")>operator(\);) + operator(}) + reserved(else) operator({) + ident(rb_error_frozen)operator(()string<delimiter(")content(class)delimiter(")>operator(\);) + operator(}) + operator(}) + reserved(if) operator((!)ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl) operator(=) ident(st_init_numtable)operator((\);) + operator(}) + reserved(else) reserved(if) operator(()ident(isconst)operator(\)) operator({) + ident(VALUE) ident(value) operator(=) ident(Qfalse)operator(;) + + reserved(if) operator(()ident(st_lookup)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) ident(id)operator(,) operator(&)ident(value)operator(\)\)) operator({) + reserved(if) operator(()ident(value) operator(==) ident(Qundef)operator(\)) + ident(autoload_delete)operator(()ident(klass)operator(,) ident(id)operator(\);) + reserved(else) + ident(rb_warn)operator(()string<delimiter(")content(already initialized %s %s)delimiter(")>operator(,) ident(dest)operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + operator(}) + + ident(st_insert)operator(()ident(RCLASS)operator(()ident(klass)operator(\)->)ident(iv_tbl)operator(,) ident(id)operator(,) ident(val)operator(\);) +operator(}) + +directive(void) +ident(rb_const_set)operator(()ident(klass)operator(,) ident(id)operator(,) ident(val)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + reserved(if) operator(()ident(NIL_P)operator(()ident(klass)operator(\)\)) operator({) + ident(rb_raise)operator(()ident(rb_eTypeError)operator(,) string<delimiter(")content(no class/module to define constant %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + ident(mod_av_set)operator(()ident(klass)operator(,) ident(id)operator(,) ident(val)operator(,) ident(Qtrue)operator(\);) +operator(}) + +directive(void) +ident(rb_define_const)operator(()ident(klass)operator(,) ident(name)operator(,) ident(val)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + + reserved(if) operator((!)ident(rb_is_const_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_warn)operator(()string<delimiter(")content(rb_define_const: invalid name `%s' for constant)delimiter(")>operator(,) ident(name)operator(\);) + operator(}) + reserved(if) operator(()ident(klass) operator(==) ident(rb_cObject)operator(\)) operator({) + ident(rb_secure)operator(()integer(4)operator(\);) + operator(}) + ident(rb_const_set)operator(()ident(klass)operator(,) ident(id)operator(,) ident(val)operator(\);) +operator(}) + +directive(void) +ident(rb_define_global_const)operator(()ident(name)operator(,) ident(val)operator(\)) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(rb_define_const)operator(()ident(rb_cObject)operator(,) ident(name)operator(,) ident(val)operator(\);) +operator(}) + +directive(static) ident(VALUE) +ident(original_module)operator(()ident(c)operator(\)) + ident(VALUE) ident(c)operator(;) +operator({) + reserved(if) operator(()ident(TYPE)operator(()ident(c)operator(\)) operator(==) ident(T_ICLASS)operator(\)) + reserved(return) ident(RBASIC)operator(()ident(c)operator(\)->)ident(klass)operator(;) + reserved(return) ident(c)operator(;) +operator(}) + +directive(static) directive(void) +ident(cvar_override_check)operator(()ident(id)operator(,) ident(a)operator(\)) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(a)operator(;) +operator({) + ident(VALUE) ident(base) operator(=) ident(original_module)operator(()ident(a)operator(\);) + + ident(a) operator(=) ident(RCLASS)operator(()ident(a)operator(\)->)ident(super)operator(;) + reserved(while) operator(()ident(a)operator(\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(a)operator(\)->)ident(iv_tbl)operator(\)) operator({) + reserved(if) operator(()ident(st_lookup)operator(()ident(RCLASS)operator(()ident(a)operator(\)->)ident(iv_tbl)operator(,)ident(id)operator(,)integer(0)operator(\)\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(class variable %s of %s is overridden by %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\),) ident(rb_class2name)operator(()ident(original_module)operator(()ident(a)operator(\)\),) + ident(rb_class2name)operator(()ident(base)operator(\)\);) + operator(}) + operator(}) + ident(a) operator(=) ident(RCLASS)operator(()ident(a)operator(\)->)ident(super)operator(;) + operator(}) +operator(}) + +directive(void) +ident(rb_cvar_set)operator(()ident(klass)operator(,) ident(id)operator(,) ident(val)operator(,) ident(warn)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(val)operator(;) + pre_type(int) ident(warn)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + + ident(tmp) operator(=) ident(klass)operator(;) + reserved(while) operator(()ident(tmp)operator(\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl) operator(&&) ident(st_lookup)operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl)operator(,)ident(id)operator(,)integer(0)operator(\)\)) operator({) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(tmp)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(class/module)delimiter(")>operator(\);) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(tmp)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't modify class variable)delimiter(")>operator(\);) + reserved(if) operator(()ident(warn) operator(&&) ident(RTEST)operator(()ident(ruby_verbose)operator(\)) operator(&&) ident(klass) operator(!=) ident(tmp)operator(\)) operator({) + ident(rb_warning)operator(()string<delimiter(")content(already initialized class variable %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + ident(st_insert)operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl)operator(,)ident(id)operator(,)ident(val)operator(\);) + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)) operator({) + ident(cvar_override_check)operator(()ident(id)operator(,) ident(tmp)operator(\);) + operator(}) + reserved(return)operator(;) + operator(}) + ident(tmp) operator(=) ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(super)operator(;) + operator(}) + + ident(mod_av_set)operator(()ident(klass)operator(,) ident(id)operator(,) ident(val)operator(,) ident(Qfalse)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_cvar_get)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(value)operator(;) + ident(VALUE) ident(tmp)operator(;) + + ident(tmp) operator(=) ident(klass)operator(;) + reserved(while) operator(()ident(tmp)operator(\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl)operator(\)) operator({) + reserved(if) operator(()ident(st_lookup)operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl)operator(,)ident(id)operator(,&)ident(value)operator(\)\)) operator({) + reserved(if) operator(()ident(RTEST)operator(()ident(ruby_verbose)operator(\)\)) operator({) + ident(cvar_override_check)operator(()ident(id)operator(,) ident(tmp)operator(\);) + operator(}) + reserved(return) ident(value)operator(;) + operator(}) + operator(}) + ident(tmp) operator(=) ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(super)operator(;) + operator(}) + + ident(rb_name_error)operator(()ident(id)operator(,)string<delimiter(")content(uninitialized class variable %s in %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\),) ident(rb_class2name)operator(()ident(klass)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +ident(VALUE) +ident(rb_cvar_defined)operator(()ident(klass)operator(,) ident(id)operator(\)) + ident(VALUE) ident(klass)operator(;) + ident(ID) ident(id)operator(;) +operator({) + ident(VALUE) ident(tmp)operator(;) + + ident(tmp) operator(=) ident(klass)operator(;) + reserved(while) operator(()ident(tmp)operator(\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl) operator(&&) ident(st_lookup)operator(()ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(iv_tbl)operator(,)ident(id)operator(,)integer(0)operator(\)\)) operator({) + reserved(return) ident(Qtrue)operator(;) + operator(}) + ident(tmp) operator(=) ident(RCLASS)operator(()ident(tmp)operator(\)->)ident(super)operator(;) + operator(}) + + reserved(return) ident(Qfalse)operator(;) +operator(}) + +directive(void) +ident(rb_cv_set)operator(()ident(klass)operator(,) ident(name)operator(,) ident(val)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + reserved(if) operator((!)ident(rb_is_class_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(wrong class variable name %s)delimiter(")>operator(,) ident(name)operator(\);) + operator(}) + ident(rb_cvar_set)operator(()ident(klass)operator(,) ident(id)operator(,) ident(val)operator(,) ident(Qfalse)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_cv_get)operator(()ident(klass)operator(,) ident(name)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + reserved(if) operator((!)ident(rb_is_class_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(wrong class variable name %s)delimiter(")>operator(,) ident(name)operator(\);) + operator(}) + reserved(return) ident(rb_cvar_get)operator(()ident(klass)operator(,) ident(id)operator(\);) +operator(}) + +directive(void) +ident(rb_define_class_variable)operator(()ident(klass)operator(,) ident(name)operator(,) ident(val)operator(\)) + ident(VALUE) ident(klass)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + + reserved(if) operator((!)ident(rb_is_class_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(wrong class variable name %s)delimiter(")>operator(,) ident(name)operator(\);) + operator(}) + ident(rb_cvar_set)operator(()ident(klass)operator(,) ident(id)operator(,) ident(val)operator(,) ident(Qtrue)operator(\);) +operator(}) + +directive(static) pre_type(int) +ident(cv_i)operator(()ident(key)operator(,) ident(value)operator(,) ident(ary)operator(\)) + ident(ID) ident(key)operator(;) + ident(VALUE) ident(value)operator(;) + ident(VALUE) ident(ary)operator(;) +operator({) + reserved(if) operator(()ident(rb_is_class_id)operator(()ident(key)operator(\)\)) operator({) + ident(VALUE) ident(kval) operator(=) ident(rb_str_new2)operator(()ident(rb_id2name)operator(()ident(key)operator(\)\);) + reserved(if) operator((!)ident(rb_ary_includes)operator(()ident(ary)operator(,) ident(kval)operator(\)\)) operator({) + ident(rb_ary_push)operator(()ident(ary)operator(,) ident(kval)operator(\);) + operator(}) + operator(}) + reserved(return) ident(ST_CONTINUE)operator(;) +operator(}) + +comment(/* + * call-seq: + * mod.class_variables => array + * + * Returns an array of the names of class variables in <i>mod</i> and + * the ancestors of <i>mod</i>. + * + * class One + * @@var1 = 1 + * end + * class Two < One + * @@var2 = 2 + * end + * One.class_variables #=> ["@@var1"] + * Two.class_variables #=> ["@@var2", "@@var1"] + */) + +ident(VALUE) +ident(rb_mod_class_variables)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +operator({) + ident(VALUE) ident(ary) operator(=) ident(rb_ary_new)operator((\);) + + reserved(for) operator((;;\)) operator({) + reserved(if) operator(()ident(RCLASS)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(\)) operator({) + ident(st_foreach_safe)operator(()ident(RCLASS)operator(()ident(obj)operator(\)->)ident(iv_tbl)operator(,) ident(cv_i)operator(,) ident(ary)operator(\);) + operator(}) + ident(obj) operator(=) ident(RCLASS)operator(()ident(obj)operator(\)->)ident(super)operator(;) + reserved(if) operator((!)ident(obj)operator(\)) reserved(break)operator(;) + operator(}) + reserved(return) ident(ary)operator(;) +operator(}) + +comment(/* + * call-seq: + * remove_class_variable(sym\) => obj + * + * Removes the definition of the <i>sym</i>, returning that + * constant's value. + * + * class Dummy + * @@var = 99 + * puts @@var + * remove_class_variable(:@@var\) + * puts(defined? @@var\) + * end + * + * <em>produces:</em> + * + * 99 + * nil + */) + +ident(VALUE) +ident(rb_mod_remove_cvar)operator(()ident(mod)operator(,) ident(name)operator(\)) + ident(VALUE) ident(mod)operator(,) ident(name)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_to_id)operator(()ident(name)operator(\);) + ident(VALUE) ident(val)operator(;) + + reserved(if) operator((!)ident(rb_is_class_id)operator(()ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(wrong class variable name %s)delimiter(")>operator(,) ident(rb_id2name)operator(()ident(id)operator(\)\);) + operator(}) + reserved(if) operator((!)ident(OBJ_TAINTED)operator(()ident(mod)operator(\)) operator(&&) ident(rb_safe_level)operator((\)) operator(>=) integer(4)operator(\)) + ident(rb_raise)operator(()ident(rb_eSecurityError)operator(,) string<delimiter(")content(Insecure: can't remove class variable)delimiter(")>operator(\);) + reserved(if) operator(()ident(OBJ_FROZEN)operator(()ident(mod)operator(\)\)) ident(rb_error_frozen)operator(()string<delimiter(")content(class/module)delimiter(")>operator(\);) + + reserved(if) operator(()ident(RCLASS)operator(()ident(mod)operator(\)->)ident(iv_tbl) operator(&&) ident(st_delete)operator(()ident(ROBJECT)operator(()ident(mod)operator(\)->)ident(iv_tbl)operator(,) operator(()ident(st_data_t)operator(*\)&)ident(id)operator(,) operator(&)ident(val)operator(\)\)) operator({) + reserved(return) ident(val)operator(;) + operator(}) + reserved(if) operator(()ident(rb_cvar_defined)operator(()ident(mod)operator(,) ident(id)operator(\)\)) operator({) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(cannot remove %s for %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\),) ident(rb_class2name)operator(()ident(mod)operator(\)\);) + operator(}) + ident(rb_name_error)operator(()ident(id)operator(,) string<delimiter(")content(class variable %s not defined for %s)delimiter(")>operator(,) + ident(rb_id2name)operator(()ident(id)operator(\),) ident(rb_class2name)operator(()ident(mod)operator(\)\);) + reserved(return) ident(Qnil)operator(;) comment(/* not reached */) +operator(}) + +ident(VALUE) +ident(rb_iv_get)operator(()ident(obj)operator(,) ident(name)operator(\)) + ident(VALUE) ident(obj)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + + reserved(return) ident(rb_ivar_get)operator(()ident(obj)operator(,) ident(id)operator(\);) +operator(}) + +ident(VALUE) +ident(rb_iv_set)operator(()ident(obj)operator(,) ident(name)operator(,) ident(val)operator(\)) + ident(VALUE) ident(obj)operator(;) + directive(const) pre_type(char) operator(*)ident(name)operator(;) + ident(VALUE) ident(val)operator(;) +operator({) + ident(ID) ident(id) operator(=) ident(rb_intern)operator(()ident(name)operator(\);) + + reserved(return) ident(rb_ivar_set)operator(()ident(obj)operator(,) ident(id)operator(,) ident(val)operator(\);) +operator(}) +comment(/********************************************************************** + + version.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Thu Sep 30 20:08:01 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#include) include("ruby.h") +preprocessor(#include) include("version.h") +preprocessor(#include) include(<stdio.h>) + +directive(const) pre_type(char) ident(ruby_version)operator([]) operator(=) ident(RUBY_VERSION)operator(;) +directive(const) pre_type(char) ident(ruby_release_date)operator([]) operator(=) ident(RUBY_RELEASE_DATE)operator(;) +directive(const) pre_type(char) ident(ruby_platform)operator([]) operator(=) ident(RUBY_PLATFORM)operator(;) +directive(const) pre_type(int) ident(ruby_patchlevel) operator(=) ident(RUBY_PATCHLEVEL)operator(;) + +directive(void) +ident(Init_version)operator((\)) +operator({) + ident(VALUE) ident(v) operator(=) ident(rb_obj_freeze)operator(()ident(rb_str_new2)operator(()ident(ruby_version)operator(\)\);) + ident(VALUE) ident(d) operator(=) ident(rb_obj_freeze)operator(()ident(rb_str_new2)operator(()ident(ruby_release_date)operator(\)\);) + ident(VALUE) ident(p) operator(=) ident(rb_obj_freeze)operator(()ident(rb_str_new2)operator(()ident(ruby_platform)operator(\)\);) + + ident(rb_define_global_const)operator(()string<delimiter(")content(RUBY_VERSION)delimiter(")>operator(,) ident(v)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(RUBY_RELEASE_DATE)delimiter(")>operator(,) ident(d)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(RUBY_PLATFORM)delimiter(")>operator(,) ident(p)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(RUBY_PATCHLEVEL)delimiter(")>operator(,) ident(INT2FIX)operator(()ident(RUBY_PATCHLEVEL)operator(\)\);) + + comment(/* obsolete constants */) + ident(rb_define_global_const)operator(()string<delimiter(")content(VERSION)delimiter(")>operator(,) ident(v)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(RELEASE_DATE)delimiter(")>operator(,) ident(d)operator(\);) + ident(rb_define_global_const)operator(()string<delimiter(")content(PLATFORM)delimiter(")>operator(,) ident(p)operator(\);) +operator(}) + +directive(void) +ident(ruby_show_version)operator((\)) +operator({) + ident(printf)operator(()string<delimiter(")content(ruby %s (%s patchlevel %d\) [%s])char(\\n)delimiter(")>operator(,) ident(RUBY_VERSION)operator(,) ident(RUBY_RELEASE_DATE)operator(,) ident(RUBY_PATCHLEVEL)operator(,) ident(RUBY_PLATFORM)operator(\);) + ident(fflush)operator(()ident(stdout)operator(\);) +operator(}) + +directive(void) +ident(ruby_show_copyright)operator((\)) +operator({) + ident(printf)operator(()string<delimiter(")content(ruby - Copyright (C\) 1993-%d Yukihiro Matsumoto)char(\\n)delimiter(")>operator(,) ident(RUBY_RELEASE_YEAR)operator(\);) + ident(exit)operator(()integer(0)operator(\);) +operator(}) +preprocessor(#define) ident(PACKAGE_NAME) string<delimiter(")delimiter(")> +preprocessor(#define) ident(PACKAGE_TARNAME) string<delimiter(")delimiter(")> +preprocessor(#define) ident(PACKAGE_VERSION) string<delimiter(")delimiter(")> +preprocessor(#define) ident(PACKAGE_STRING) string<delimiter(")delimiter(")> +preprocessor(#define) ident(PACKAGE_BUGREPORT) string<delimiter(")delimiter(")> +preprocessor(#define) ident(USE_BUILTIN_FRAME_ADDRESS) integer(1) +preprocessor(#define) ident(STDC_HEADERS) integer(1) +preprocessor(#define) ident(HAVE_SYS_TYPES_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_STAT_H) integer(1) +preprocessor(#define) ident(HAVE_STDLIB_H) integer(1) +preprocessor(#define) ident(HAVE_STRING_H) integer(1) +preprocessor(#define) ident(HAVE_MEMORY_H) integer(1) +preprocessor(#define) ident(HAVE_STRINGS_H) integer(1) +preprocessor(#define) ident(HAVE_INTTYPES_H) integer(1) +preprocessor(#define) ident(HAVE_STDINT_H) integer(1) +preprocessor(#define) ident(HAVE_UNISTD_H) integer(1) +preprocessor(#define) ident(HAVE_LONG_LONG) integer(1) +preprocessor(#define) ident(HAVE_OFF_T) integer(1) +preprocessor(#define) ident(SIZEOF_INT) integer(4) +preprocessor(#define) ident(SIZEOF_SHORT) integer(2) +preprocessor(#define) ident(SIZEOF_LONG) integer(4) +preprocessor(#define) ident(SIZEOF_LONG_LONG) integer(8) +preprocessor(#define) ident(SIZEOF___INT64) integer(0) +preprocessor(#define) ident(SIZEOF_OFF_T) integer(8) +preprocessor(#define) ident(SIZEOF_VOIDP) integer(4) +preprocessor(#define) ident(SIZEOF_FLOAT) integer(4) +preprocessor(#define) ident(SIZEOF_DOUBLE) integer(8) +preprocessor(#define) ident(SIZEOF_TIME_T) integer(4) +preprocessor(#define) ident(rb_pid_t) ident(pid_t) +preprocessor(#define) ident(rb_gid_t) ident(gid_t) +preprocessor(#define) ident(rb_uid_t) ident(uid_t) +preprocessor(#define) ident(HAVE_PROTOTYPES) integer(1) +preprocessor(#define) ident(TOKEN_PASTE)operator(()ident(x)operator(,)ident(y)operator(\)) ident(x)preprocessor(#)preprocessor(#y) +preprocessor(#define) ident(HAVE_STDARG_PROTOTYPES) integer(1) +preprocessor(#define) ident(NORETURN)operator(()ident(x)operator(\)) ident(__attribute__) operator((()ident(noreturn)operator(\)\)) ident(x) +preprocessor(#define) ident(NOINLINE)operator(()ident(x)operator(\)) ident(__attribute__) operator((()ident(noinline)operator(\)\)) ident(x) +preprocessor(#define) ident(HAVE_DECL_SYS_NERR) integer(1) +preprocessor(#define) ident(HAVE_LIBDL) integer(1) +preprocessor(#define) ident(HAVE_DIRENT_H) integer(1) +preprocessor(#define) ident(STDC_HEADERS) integer(1) +preprocessor(#define) ident(HAVE_SYS_WAIT_H) integer(1) +preprocessor(#define) ident(HAVE_STDLIB_H) integer(1) +preprocessor(#define) ident(HAVE_STRING_H) integer(1) +preprocessor(#define) ident(HAVE_UNISTD_H) integer(1) +preprocessor(#define) ident(HAVE_LIMITS_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_FILE_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_IOCTL_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_SYSCALL_H) integer(1) +preprocessor(#define) ident(HAVE_FCNTL_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_FCNTL_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_SELECT_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_TIME_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_TIMES_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_PARAM_H) integer(1) +preprocessor(#define) ident(HAVE_PWD_H) integer(1) +preprocessor(#define) ident(HAVE_GRP_H) integer(1) +preprocessor(#define) ident(HAVE_UTIME_H) integer(1) +preprocessor(#define) ident(HAVE_MEMORY_H) integer(1) +preprocessor(#define) ident(HAVE_SYS_RESOURCE_H) integer(1) +preprocessor(#define) ident(HAVE_NETINET_IN_SYSTM_H) integer(1) +preprocessor(#define) ident(HAVE_FLOAT_H) integer(1) +preprocessor(#define) ident(HAVE_PTHREAD_H) integer(1) +preprocessor(#define) ident(HAVE_UCONTEXT_H) integer(1) +preprocessor(#define) ident(SIZEOF_RLIM_T) integer(8) +preprocessor(#define) ident(HAVE_STRUCT_STAT_ST_BLKSIZE) integer(1) +preprocessor(#define) ident(HAVE_ST_BLKSIZE) integer(1) +preprocessor(#define) ident(HAVE_STRUCT_STAT_ST_BLOCKS) integer(1) +preprocessor(#define) ident(HAVE_ST_BLOCKS) integer(1) +preprocessor(#define) ident(HAVE_STRUCT_STAT_ST_RDEV) integer(1) +preprocessor(#define) ident(HAVE_ST_RDEV) integer(1) +preprocessor(#define) ident(GETGROUPS_T) ident(gid_t) +preprocessor(#define) ident(RETSIGTYPE) directive(void) +preprocessor(#define) ident(HAVE_ALLOCA_H) integer(1) +preprocessor(#define) ident(HAVE_ALLOCA) integer(1) +preprocessor(#define) ident(HAVE_FSEEKO) integer(1) +preprocessor(#define) ident(HAVE_FTELLO) integer(1) +preprocessor(#define) ident(HAVE_DUP2) integer(1) +preprocessor(#define) ident(HAVE_MEMMOVE) integer(1) +preprocessor(#define) ident(HAVE_STRCASECMP) integer(1) +preprocessor(#define) ident(HAVE_STRNCASECMP) integer(1) +preprocessor(#define) ident(HAVE_STRERROR) integer(1) +preprocessor(#define) ident(HAVE_STRFTIME) integer(1) +preprocessor(#define) ident(HAVE_STRCHR) integer(1) +preprocessor(#define) ident(HAVE_STRSTR) integer(1) +preprocessor(#define) ident(HAVE_STRTOUL) integer(1) +preprocessor(#define) ident(HAVE_CRYPT) integer(1) +preprocessor(#define) ident(HAVE_FLOCK) integer(1) +preprocessor(#define) ident(HAVE_VSNPRINTF) integer(1) +preprocessor(#define) ident(HAVE_ISNAN) integer(1) +preprocessor(#define) ident(HAVE_FINITE) integer(1) +preprocessor(#define) ident(HAVE_ISINF) integer(1) +preprocessor(#define) ident(HAVE_HYPOT) integer(1) +preprocessor(#define) ident(HAVE_ACOSH) integer(1) +preprocessor(#define) ident(HAVE_ERF) integer(1) +preprocessor(#define) ident(HAVE_FMOD) integer(1) +preprocessor(#define) ident(HAVE_KILLPG) integer(1) +preprocessor(#define) ident(HAVE_WAIT4) integer(1) +preprocessor(#define) ident(HAVE_WAITPID) integer(1) +preprocessor(#define) ident(HAVE_SYSCALL) integer(1) +preprocessor(#define) ident(HAVE_CHROOT) integer(1) +preprocessor(#define) ident(HAVE_FSYNC) integer(1) +preprocessor(#define) ident(HAVE_GETCWD) integer(1) +preprocessor(#define) ident(HAVE_TRUNCATE) integer(1) +preprocessor(#define) ident(HAVE_FTRUNCATE) integer(1) +preprocessor(#define) ident(HAVE_TIMES) integer(1) +preprocessor(#define) ident(HAVE_UTIMES) integer(1) +preprocessor(#define) ident(HAVE_FCNTL) integer(1) +preprocessor(#define) ident(HAVE_LOCKF) integer(1) +preprocessor(#define) ident(HAVE_LSTAT) integer(1) +preprocessor(#define) ident(HAVE_SYMLINK) integer(1) +preprocessor(#define) ident(HAVE_LINK) integer(1) +preprocessor(#define) ident(HAVE_READLINK) integer(1) +preprocessor(#define) ident(HAVE_SETITIMER) integer(1) +preprocessor(#define) ident(HAVE_SETRUID) integer(1) +preprocessor(#define) ident(HAVE_SETEUID) integer(1) +preprocessor(#define) ident(HAVE_SETREUID) integer(1) +preprocessor(#define) ident(HAVE_SETRGID) integer(1) +preprocessor(#define) ident(HAVE_SETEGID) integer(1) +preprocessor(#define) ident(HAVE_SETREGID) integer(1) +preprocessor(#define) ident(HAVE_ISSETUGID) integer(1) +preprocessor(#define) ident(HAVE_PAUSE) integer(1) +preprocessor(#define) ident(HAVE_LCHOWN) integer(1) +preprocessor(#define) ident(HAVE_LCHMOD) integer(1) +preprocessor(#define) ident(HAVE_GETPGRP) integer(1) +preprocessor(#define) ident(HAVE_SETPGRP) integer(1) +preprocessor(#define) ident(HAVE_GETPGID) integer(1) +preprocessor(#define) ident(HAVE_SETPGID) integer(1) +preprocessor(#define) ident(HAVE_INITGROUPS) integer(1) +preprocessor(#define) ident(HAVE_GETGROUPS) integer(1) +preprocessor(#define) ident(HAVE_SETGROUPS) integer(1) +preprocessor(#define) ident(HAVE_GETPRIORITY) integer(1) +preprocessor(#define) ident(HAVE_GETRLIMIT) integer(1) +preprocessor(#define) ident(HAVE_SETRLIMIT) integer(1) +preprocessor(#define) ident(HAVE_SYSCONF) integer(1) +preprocessor(#define) ident(HAVE_DLOPEN) integer(1) +preprocessor(#define) ident(HAVE_SIGPROCMASK) integer(1) +preprocessor(#define) ident(HAVE_SIGACTION) integer(1) +preprocessor(#define) ident(HAVE__SETJMP) integer(1) +preprocessor(#define) ident(HAVE_SETSID) integer(1) +preprocessor(#define) ident(HAVE_TELLDIR) integer(1) +preprocessor(#define) ident(HAVE_SEEKDIR) integer(1) +preprocessor(#define) ident(HAVE_FCHMOD) integer(1) +preprocessor(#define) ident(HAVE_MKTIME) integer(1) +preprocessor(#define) ident(HAVE_TIMEGM) integer(1) +preprocessor(#define) ident(HAVE_GETTIMEOFDAY) integer(1) +preprocessor(#define) ident(HAVE_COSH) integer(1) +preprocessor(#define) ident(HAVE_SINH) integer(1) +preprocessor(#define) ident(HAVE_TANH) integer(1) +preprocessor(#define) ident(HAVE_ROUND) integer(1) +preprocessor(#define) ident(HAVE_SETUID) integer(1) +preprocessor(#define) ident(HAVE_SETGID) integer(1) +preprocessor(#define) ident(HAVE_SETENV) integer(1) +preprocessor(#define) ident(HAVE_UNSETENV) integer(1) +preprocessor(#define) ident(HAVE_STRUCT_TM_TM_ZONE) integer(1) +preprocessor(#define) ident(HAVE_TM_ZONE) integer(1) +preprocessor(#define) ident(HAVE_STRUCT_TM_TM_GMTOFF) integer(1) +preprocessor(#define) ident(HAVE_DAYLIGHT) integer(1) +preprocessor(#define) ident(HAVE_VAR_TIMEZONE) integer(1) +preprocessor(#define) ident(TYPEOF_VAR_TIMEZONE) pre_type(long) +preprocessor(#define) ident(NEGATIVE_TIME_T) integer(1) +preprocessor(#define) ident(POSIX_SIGNAL) integer(1) +preprocessor(#define) ident(GETPGRP_VOID) integer(1) +preprocessor(#define) ident(SETPGRP_VOID) integer(1) +preprocessor(#define) ident(RSHIFT)operator(()ident(x)operator(,)ident(y)operator(\)) operator((()ident(x)operator(\)>>()pre_type(int)operator(\))ident(y)operator(\)) +preprocessor(#define) ident(FILE_COUNT) ident(_r) +preprocessor(#define) ident(FILE_READPTR) ident(_p) +preprocessor(#define) ident(NEED_IO_SEEK_BETWEEN_RW) integer(1) +preprocessor(#define) ident(HAVE__SC_CLK_TCK) integer(1) +preprocessor(#define) ident(STACK_GROW_DIRECTION) operator(-)integer(1) +preprocessor(#define) ident(DEFAULT_KCODE) ident(KCODE_NONE) +preprocessor(#define) ident(DLEXT_MAXLEN) integer(7) +preprocessor(#define) ident(DLEXT) string<delimiter(")content(.bundle)delimiter(")> +preprocessor(#define) ident(RUBY_LIB) string<delimiter(")content(/usr/local/lib/ruby/1.8)delimiter(")> +preprocessor(#define) ident(RUBY_SITE_LIB) string<delimiter(")content(/usr/local/lib/ruby/site_ruby)delimiter(")> +preprocessor(#define) ident(RUBY_SITE_LIB2) string<delimiter(")content(/usr/local/lib/ruby/site_ruby/1.8)delimiter(")> +preprocessor(#define) ident(RUBY_PLATFORM) string<delimiter(")content(i686-darwin9.8.0)delimiter(")> +preprocessor(#define) ident(RUBY_ARCHLIB) string<delimiter(")content(/usr/local/lib/ruby/1.8/i686-darwin9.8.0)delimiter(")> +preprocessor(#define) ident(RUBY_SITE_ARCHLIB) string<delimiter(")content(/usr/local/lib/ruby/site_ruby/1.8/i686-darwin9.8.0)delimiter(")> +comment(/************************************************ + + defines.h - + + $Author: shyouhei $ + $Date: 2008-06-15 16:06:16 +0200 (Sun, 15 Jun 2008\) $ + created at: Wed May 18 00:21:44 JST 1994 + +************************************************/) +preprocessor(#ifndef) ident(DEFINES_H) +preprocessor(#define) ident(DEFINES_H) + +preprocessor(#define) ident(RUBY) + +preprocessor(#ifdef) ident(__cplusplus) +preprocessor(# ifndef) ident(HAVE_PROTOTYPES) +preprocessor(# define) ident(HAVE_PROTOTYPES) integer(1) +preprocessor(# endif) +preprocessor(# ifndef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(# define) ident(HAVE_STDARG_PROTOTYPES) integer(1) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#undef) ident(_) +preprocessor(#ifdef) ident(HAVE_PROTOTYPES) +preprocessor(# define) ident(_)operator(()ident(args)operator(\)) ident(args) +preprocessor(#else) +preprocessor(# define) ident(_)operator(()ident(args)operator(\)) operator((\)) +preprocessor(#endif) + +preprocessor(#undef) ident(__) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(# define) ident(__)operator(()ident(args)operator(\)) ident(args) +preprocessor(#else) +preprocessor(# define) ident(__)operator(()ident(args)operator(\)) operator((\)) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__cplusplus) +preprocessor(#define) ident(ANYARGS) operator(.)operator(.)operator(.) +preprocessor(#else) +preprocessor(#define) ident(ANYARGS) +preprocessor(#endif) + +preprocessor(#define) ident(xmalloc) ident(ruby_xmalloc) +preprocessor(#define) ident(xcalloc) ident(ruby_xcalloc) +preprocessor(#define) ident(xrealloc) ident(ruby_xrealloc) +preprocessor(#define) ident(xfree) ident(ruby_xfree) + +directive(void) operator(*)ident(xmalloc) ident(_)operator((()pre_type(long)operator(\)\);) +directive(void) operator(*)ident(xcalloc) ident(_)operator((()pre_type(long)operator(,)pre_type(long)operator(\)\);) +directive(void) operator(*)ident(xrealloc) ident(_)operator((()directive(void)operator(*,)pre_type(long)operator(\)\);) +directive(void) ident(xfree) ident(_)operator((()directive(void)operator(*\)\);) + +preprocessor(#if) ident(SIZEOF_LONG_LONG) operator(>) integer(0) +preprocessor(# define) ident(LONG_LONG) pre_type(long) pre_type(long) +preprocessor(#elif) ident(SIZEOF___INT64) operator(>) integer(0) +preprocessor(# define) ident(HAVE_LONG_LONG) integer(1) +preprocessor(# define) ident(LONG_LONG) ident(__int64) +preprocessor(# undef) ident(SIZEOF_LONG_LONG) +preprocessor(# define) ident(SIZEOF_LONG_LONG) ident(SIZEOF___INT64) +preprocessor(#endif) + +preprocessor(#if) ident(SIZEOF_INT)operator(*)integer(2) operator(<=) ident(SIZEOF_LONG_LONG) +preprocessor(# define) ident(BDIGIT) pre_type(unsigned) pre_type(int) +preprocessor(# define) ident(SIZEOF_BDIGITS) ident(SIZEOF_INT) +preprocessor(# define) ident(BDIGIT_DBL) pre_type(unsigned) ident(LONG_LONG) +preprocessor(# define) ident(BDIGIT_DBL_SIGNED) ident(LONG_LONG) +preprocessor(#elif) ident(SIZEOF_INT)operator(*)integer(2) operator(<=) ident(SIZEOF_LONG) +preprocessor(# define) ident(BDIGIT) pre_type(unsigned) pre_type(int) +preprocessor(# define) ident(SIZEOF_BDIGITS) ident(SIZEOF_INT) +preprocessor(# define) ident(BDIGIT_DBL) pre_type(unsigned) pre_type(long) +preprocessor(# define) ident(BDIGIT_DBL_SIGNED) pre_type(long) +preprocessor(#elif) ident(SIZEOF_SHORT)operator(*)integer(2) operator(<=) ident(SIZEOF_LONG) +preprocessor(# define) ident(BDIGIT) pre_type(unsigned) pre_type(short) +preprocessor(# define) ident(SIZEOF_BDIGITS) ident(SIZEOF_SHORT) +preprocessor(# define) ident(BDIGIT_DBL) pre_type(unsigned) pre_type(long) +preprocessor(# define) ident(BDIGIT_DBL_SIGNED) pre_type(long) +preprocessor(#else) +preprocessor(# define) ident(BDIGIT) pre_type(unsigned) pre_type(short) +preprocessor(# define) ident(SIZEOF_BDIGITS) operator(()ident(SIZEOF_LONG)operator(/)integer(2)operator(\)) +preprocessor(# define) ident(BDIGIT_DBL) pre_type(unsigned) pre_type(long) +preprocessor(# define) ident(BDIGIT_DBL_SIGNED) pre_type(long) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__CYGWIN__) +preprocessor(#undef) ident(_WIN32) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(MSDOS)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(__human68k__)operator(\)) operator(||) ident(defined)operator(()ident(__EMX__)operator(\)) +preprocessor(#define) ident(DOSISH) integer(1) +preprocessor(#ifndef) ident(_WIN32_WCE) +preprocessor(# define) ident(DOSISH_DRIVE_LETTER) +preprocessor(#endif) +preprocessor(#endif) + +comment(/* define RUBY_USE_EUC/SJIS for default kanji-code */) +preprocessor(#ifndef) ident(DEFAULT_KCODE) +preprocessor(#if) ident(defined)operator(()ident(DOSISH)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN__)operator(\)) operator(||) ident(defined)operator(()ident(__MACOS__)operator(\)) operator(||) ident(defined)operator(()ident(OS2)operator(\)) +preprocessor(#define) ident(DEFAULT_KCODE) ident(KCODE_SJIS) +preprocessor(#else) +preprocessor(#define) ident(DEFAULT_KCODE) ident(KCODE_EUC) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__NeXT__) +comment(/* NextStep, OpenStep, Rhapsody */) +preprocessor(#ifndef) ident(S_IRUSR) +preprocessor(#define) ident(S_IRUSR) oct(0000400) comment(/* read permission, owner */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IRGRP) +preprocessor(#define) ident(S_IRGRP) oct(0000040) comment(/* read permission, group */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IROTH) +preprocessor(#define) ident(S_IROTH) oct(0000004) comment(/* read permission, other */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IWUSR) +preprocessor(#define) ident(S_IWUSR) oct(0000200) comment(/* write permission, owner */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IWGRP) +preprocessor(#define) ident(S_IWGRP) oct(0000020) comment(/* write permission, group */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IWOTH) +preprocessor(#define) ident(S_IWOTH) oct(0000002) comment(/* write permission, other */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IXUSR) +preprocessor(#define) ident(S_IXUSR) oct(0000100) comment(/* execute/search permission, owner */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IXGRP) +preprocessor(#define) ident(S_IXGRP) oct(0000010) comment(/* execute/search permission, group */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IXOTH) +preprocessor(#define) ident(S_IXOTH) oct(0000001) comment(/* execute/search permission, other */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IRWXU) +preprocessor(#define) ident(S_IRWXU) oct(0000700) comment(/* read, write, execute permissions, owner */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IRWXG) +preprocessor(#define) ident(S_IRWXG) oct(0000070) comment(/* read, write, execute permissions, group */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_IRWXO) +preprocessor(#define) ident(S_IRWXO) oct(0000007) comment(/* read, write, execute permissions, other */) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_ISBLK) +preprocessor(#define) ident(S_ISBLK)operator(()ident(mode)operator(\)) operator(((()ident(mode)operator(\)) operator(&) operator(()oct(0170000)operator(\)\)) operator(==) operator(()oct(0060000)operator(\)\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_ISCHR) +preprocessor(#define) ident(S_ISCHR)operator(()ident(mode)operator(\)) operator(((()ident(mode)operator(\)) operator(&) operator(()oct(0170000)operator(\)\)) operator(==) operator(()oct(0020000)operator(\)\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_ISDIR) +preprocessor(#define) ident(S_ISDIR)operator(()ident(mode)operator(\)) operator(((()ident(mode)operator(\)) operator(&) operator(()oct(0170000)operator(\)\)) operator(==) operator(()oct(0040000)operator(\)\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_ISFIFO) +preprocessor(#define) ident(S_ISFIFO)operator(()ident(mode)operator(\)) operator(((()ident(mode)operator(\)) operator(&) operator(()oct(0170000)operator(\)\)) operator(==) operator(()oct(0010000)operator(\)\)) +preprocessor(#endif) +preprocessor(#ifndef) ident(S_ISREG) +preprocessor(#define) ident(S_ISREG)operator(()ident(mode)operator(\)) operator(((()ident(mode)operator(\)) operator(&) operator(()oct(0170000)operator(\)\)) operator(==) operator(()oct(0100000)operator(\)\)) +preprocessor(#endif) +comment(/* Do not trust WORDS_BIGENDIAN from configure since -arch compiler flag may + result in a different endian. Instead trust __BIG_ENDIAN__ and + __LITTLE_ENDIAN__ which are set correctly by -arch. */) +preprocessor(#undef) ident(WORDS_BIGENDIAN) +preprocessor(#ifdef) ident(__BIG_ENDIAN__) +preprocessor(#define) ident(WORDS_BIGENDIAN) +preprocessor(#endif) +preprocessor(#ifndef) ident(__APPLE__) +comment(/* NextStep, OpenStep (but not Rhapsody\) */) +preprocessor(#ifndef) ident(GETPGRP_VOID) +preprocessor(#define) ident(GETPGRP_VOID) integer(1) +preprocessor(#endif) +preprocessor(#ifndef) ident(WNOHANG) +preprocessor(#define) ident(WNOHANG) oct(01) +preprocessor(#endif) +preprocessor(#ifndef) ident(WUNTRACED) +preprocessor(#define) ident(WUNTRACED) oct(02) +preprocessor(#endif) +preprocessor(#ifndef) ident(X_OK) +preprocessor(#define) ident(X_OK) integer(1) +preprocessor(#endif) +preprocessor(#endif) comment(/* __APPLE__ */) +preprocessor(#endif) comment(/* NeXT */) + +preprocessor(#ifdef) ident(_WIN32) +preprocessor(#include) include("win32/win32.h") +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__VMS)operator(\)) +preprocessor(#include) include("vms.h") +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__BEOS__)operator(\)) +preprocessor(#include) include(<net/socket.h>) comment(/* intern.h needs fd_set definition */) +preprocessor(#endif) + +preprocessor(#ifdef) ident(RUBY_EXPORT) +preprocessor(#undef) ident(RUBY_EXTERN) +preprocessor(#endif) + +preprocessor(#ifndef) ident(RUBY_EXTERN) +preprocessor(#define) ident(RUBY_EXTERN) directive(extern) +preprocessor(#endif) + +preprocessor(#ifndef) ident(EXTERN) +preprocessor(#define) ident(EXTERN) ident(RUBY_EXTERN) comment(/* deprecated */) +preprocessor(#endif) + +preprocessor(#ifndef) ident(RUBY_MBCHAR_MAXSIZE) +preprocessor(#define) ident(RUBY_MBCHAR_MAXSIZE) ident(INT_MAX) + comment(/* MB_CUR_MAX will not work well in C locale */) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(sparc)operator(\)) operator(||) ident(defined)operator(()ident(__sparc__)operator(\)) +directive(static) directive(inline) directive(void) +ident(flush_register_windows)operator(()directive(void)operator(\)) +operator({) + reserved(asm) +preprocessor(#ifdef) ident(__GNUC__) + directive(volatile) +preprocessor(#endif) +preprocessor(# if) ident(defined)operator(()ident(__sparc_v9__)operator(\)) operator(||) ident(defined)operator(()ident(__sparcv9)operator(\)) operator(||) ident(defined)operator(()ident(__arch64__)operator(\)) + operator(()string<delimiter(")content(flushw)delimiter(")>operator(\)) +preprocessor(# else) + operator(()string<delimiter(")content(ta 0x03)delimiter(")>operator(\)) +preprocessor(# endif) comment(/* trap always to flush register windows if we are on a Sparc system */) + operator(;) +operator(}) +preprocessor(# define) ident(FLUSH_REGISTER_WINDOWS) ident(flush_register_windows)operator((\)) +preprocessor(#elif) ident(defined)operator(()ident(__ia64)operator(\)) +directive(void) operator(*)ident(rb_ia64_bsp)operator(()directive(void)operator(\);) +directive(void) ident(rb_ia64_flushrs)operator(()directive(void)operator(\);) +preprocessor(# define) ident(FLUSH_REGISTER_WINDOWS) ident(rb_ia64_flushrs)operator((\)) +preprocessor(#else) +preprocessor(# define) ident(FLUSH_REGISTER_WINDOWS) operator((()directive(void)operator(\))integer(0)operator(\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(DOSISH)operator(\)) +preprocessor(#define) ident(PATH_SEP) string<delimiter(")content(;)delimiter(")> +preprocessor(#elif) ident(defined)operator(()ident(riscos)operator(\)) +preprocessor(#define) ident(PATH_SEP) string<delimiter(")content(,)delimiter(")> +preprocessor(#else) +preprocessor(#define) ident(PATH_SEP) string<delimiter(")content(:)delimiter(")> +preprocessor(#endif) +preprocessor(#define) ident(PATH_SEP_CHAR) ident(PATH_SEP)operator([)integer(0)operator(]) + +preprocessor(#if) ident(defined)operator(()ident(__human68k__)operator(\)) +preprocessor(#define) ident(PATH_ENV) string<delimiter(")content(path)delimiter(")> +preprocessor(#else) +preprocessor(#define) ident(PATH_ENV) string<delimiter(")content(PATH)delimiter(")> +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(DOSISH)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__human68k__)operator(\)) operator(&&) operator(!)ident(defined)operator(()ident(__EMX__)operator(\)) +preprocessor(#define) ident(ENV_IGNORECASE) +preprocessor(#endif) + +preprocessor(#ifndef) ident(CASEFOLD_FILESYSTEM) +preprocessor(# if) ident(defined) ident(DOSISH) operator(||) ident(defined) ident(__VMS) +preprocessor(# define) ident(CASEFOLD_FILESYSTEM) integer(1) +preprocessor(# else) +preprocessor(# define) ident(CASEFOLD_FILESYSTEM) integer(0) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#ifndef) ident(DLEXT_MAXLEN) +preprocessor(#define) ident(DLEXT_MAXLEN) integer(4) +preprocessor(#endif) + +preprocessor(#ifndef) ident(RUBY_PLATFORM) +preprocessor(#define) ident(RUBY_PLATFORM) string<delimiter(")content(unknown-unknown)delimiter(")> +preprocessor(#endif) + +preprocessor(#endif) +comment(/********************************************************************** + + dln.h - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Wed Jan 19 16:53:09 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#ifndef) ident(DLN_H) +preprocessor(#define) ident(DLN_H) + +preprocessor(#ifdef) ident(__cplusplus) +preprocessor(# ifndef) ident(HAVE_PROTOTYPES) +preprocessor(# define) ident(HAVE_PROTOTYPES) integer(1) +preprocessor(# endif) +preprocessor(# ifndef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(# define) ident(HAVE_STDARG_PROTOTYPES) integer(1) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#undef) ident(_) +preprocessor(#ifdef) ident(HAVE_PROTOTYPES) +preprocessor(# define) ident(_)operator(()ident(args)operator(\)) ident(args) +preprocessor(#else) +preprocessor(# define) ident(_)operator(()ident(args)operator(\)) operator((\)) +preprocessor(#endif) + +pre_type(char) operator(*)ident(dln_find_exe) ident(_)operator((()directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(*\)\);) +pre_type(char) operator(*)ident(dln_find_file) ident(_)operator((()directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(*\)\);) + +preprocessor(#ifdef) ident(USE_DLN_A_OUT) +directive(extern) pre_type(char) operator(*)ident(dln_argv0)operator(;) +preprocessor(#endif) + +directive(void) operator(*)ident(dln_load) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +preprocessor(#endif) +comment(/********************************************************************** + + env.h - + + $Author: knu $ + $Date: 2007-03-03 08:30:46 +0100 (Sat, 03 Mar 2007\) $ + created at: Mon Jul 11 11:53:03 JST 1994 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#ifndef) ident(ENV_H) +preprocessor(#define) ident(ENV_H) + +directive(extern) reserved(struct) ident(FRAME) operator({) + ident(VALUE) ident(self)operator(;) + pre_type(int) ident(argc)operator(;) + ident(ID) ident(last_func)operator(;) + ident(ID) ident(orig_func)operator(;) + ident(VALUE) ident(last_class)operator(;) + reserved(struct) ident(FRAME) operator(*)ident(prev)operator(;) + reserved(struct) ident(FRAME) operator(*)ident(tmp)operator(;) + reserved(struct) ident(RNode) operator(*)ident(node)operator(;) + pre_type(int) ident(iter)operator(;) + pre_type(int) ident(flags)operator(;) + pre_type(unsigned) pre_type(long) ident(uniq)operator(;) +operator(}) operator(*)ident(ruby_frame)operator(;) + +directive(void) ident(rb_gc_mark_frame) ident(_)operator((()reserved(struct) ident(FRAME) operator(*\)\);) + +preprocessor(#define) ident(FRAME_DMETH) integer(1) +preprocessor(#define) ident(FRAME_FUNC) integer(2) + +directive(extern) reserved(struct) ident(SCOPE) operator({) + reserved(struct) ident(RBasic) ident(super)operator(;) + ident(ID) operator(*)ident(local_tbl)operator(;) + ident(VALUE) operator(*)ident(local_vars)operator(;) + pre_type(int) ident(flags)operator(;) +operator(}) operator(*)ident(ruby_scope)operator(;) + +preprocessor(#define) ident(SCOPE_ALLOCA) integer(0) +preprocessor(#define) ident(SCOPE_MALLOC) integer(1) +preprocessor(#define) ident(SCOPE_NOSTACK) integer(2) +preprocessor(#define) ident(SCOPE_DONT_RECYCLE) integer(4) +preprocessor(#define) ident(SCOPE_CLONE) integer(8) + +directive(extern) pre_type(int) ident(ruby_in_eval)operator(;) + +directive(extern) ident(VALUE) ident(ruby_class)operator(;) + +reserved(struct) ident(RVarmap) operator({) + reserved(struct) ident(RBasic) ident(super)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(val)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(next)operator(;) +operator(};) +directive(extern) reserved(struct) ident(RVarmap) operator(*)ident(ruby_dyna_vars)operator(;) + +preprocessor(#endif) comment(/* ENV_H */) +comment(/********************************************************************** + + intern.h - + + $Author: shyouhei $ + $Date: 2009-01-22 07:18:48 +0100 (Thu, 22 Jan 2009\) $ + created at: Thu Jun 10 14:22:17 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +comment(/* + * Functions and variables that are used by more than one source file of + * the kernel. + */) + +preprocessor(#define) ident(ID_ALLOCATOR) integer(1) + +comment(/* array.c */) +directive(void) ident(rb_mem_clear) ident(_)operator((()directive(register) ident(VALUE)operator(*,) directive(register) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_assoc_new) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_check_array_type) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_new) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_ary_new2) ident(_)operator((()pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_ary_new3) ident(__)operator((()pre_type(long)operator(,)operator(.)operator(.)operator(.)operator(\)\);) +ident(VALUE) ident(rb_ary_new4) ident(_)operator((()pre_type(long)operator(,) directive(const) ident(VALUE) operator(*\)\);) +ident(VALUE) ident(rb_ary_freeze) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_aref) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +directive(void) ident(rb_ary_store) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_dup) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_to_ary) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_to_s) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_push) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_pop) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_shift) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_unshift) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_entry) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_ary_each) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_join) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_print_on) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_reverse) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_sort) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_sort_bang) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_delete) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_delete_at) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_ary_clear) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_plus) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_concat) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_assoc) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_rassoc) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_includes) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ary_cmp) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_protect_inspect) ident(_)operator((()ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_inspecting_p) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_check_array_value) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_values_at) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(,) pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator((*\)) ident(_)operator((()ident(VALUE)operator(,)pre_type(long)operator(\)\)\)\);) +comment(/* bignum.c */) +ident(VALUE) ident(rb_big_clone) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_big_2comp) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_norm) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_uint2big) ident(_)operator((()pre_type(unsigned) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_int2big) ident(_)operator((()pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_uint2inum) ident(_)operator((()pre_type(unsigned) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_int2inum) ident(_)operator((()pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_cstr_to_inum) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(int)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_str_to_inum) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_cstr2inum) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_str2inum) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_big2str) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_big2str0) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(,) pre_type(int)operator(\)\);) +pre_type(long) ident(rb_big2long) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#define) ident(rb_big2int)operator(()ident(x)operator(\)) ident(rb_big2long)operator(()ident(x)operator(\)) +pre_type(unsigned) pre_type(long) ident(rb_big2ulong) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#define) ident(rb_big2uint)operator(()ident(x)operator(\)) ident(rb_big2ulong)operator(()ident(x)operator(\)) +preprocessor(#if) ident(HAVE_LONG_LONG) +ident(VALUE) ident(rb_ll2inum) ident(_)operator((()ident(LONG_LONG)operator(\)\);) +ident(VALUE) ident(rb_ull2inum) ident(_)operator((()pre_type(unsigned) ident(LONG_LONG)operator(\)\);) +ident(LONG_LONG) ident(rb_big2ll) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(unsigned) ident(LONG_LONG) ident(rb_big2ull) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#endif) comment(/* HAVE_LONG_LONG */) +directive(void) ident(rb_quad_pack) ident(_)operator((()pre_type(char)operator(*,)ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_quad_unpack) ident(_)operator((()directive(const) pre_type(char)operator(*,)pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_dbl2big) ident(_)operator((()pre_type(double)operator(\)\);) +pre_type(double) ident(rb_big2dbl) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_plus) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_minus) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_mul) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_divmod) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_pow) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_and) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_or) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_xor) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_lshift) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_rand) ident(_)operator((()ident(VALUE)operator(,) pre_type(double)operator(*\)\);) +comment(/* class.c */) +ident(VALUE) ident(rb_class_boot) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_class_new) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_mod_init_copy) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_class_init_copy) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_singleton_class_clone) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_singleton_class_attached) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_make_metaclass) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +directive(void) ident(rb_check_inheritable) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_class_inherited) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_define_class_id) ident(_)operator((()ident(ID)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_module_new) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_define_module_id) ident(_)operator((()ident(ID)operator(\)\);) +ident(VALUE) ident(rb_mod_included_modules) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_mod_include_p) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_mod_ancestors) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_class_instance_methods) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_class_public_instance_methods) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_class_protected_instance_methods) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_big_rshift)operator(()ident(VALUE)operator(,) ident(VALUE)operator(\);) +ident(VALUE) ident(rb_class_private_instance_methods) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_singleton_methods) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +directive(void) ident(rb_define_method_id) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) ident(VALUE) operator((*\)()ident(ANYARGS)operator(\),) pre_type(int)operator(\)\);) +directive(void) ident(rb_frozen_class_p) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_undef) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +directive(void) ident(rb_define_protected_method) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) ident(VALUE) operator((*\)()ident(ANYARGS)operator(\),) pre_type(int)operator(\)\);) +directive(void) ident(rb_define_private_method) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) ident(VALUE) operator((*\)()ident(ANYARGS)operator(\),) pre_type(int)operator(\)\);) +directive(void) ident(rb_define_singleton_method) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_singleton_class) ident(_)operator((()ident(VALUE)operator(\)\);) +comment(/* compar.c */) +pre_type(int) ident(rb_cmpint) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_cmperr) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\)\);) +comment(/* enum.c */) +comment(/* error.c */) +ident(RUBY_EXTERN) pre_type(int) ident(ruby_nerrs)operator(;) +ident(VALUE) ident(rb_exc_new) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_exc_new2) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_exc_new3) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_loaderror) ident(__)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_name_error) ident(__)operator((()ident(ID)operator(,) directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_invalid_str) ident(_)operator((()directive(const) pre_type(char)operator(*,) directive(const) pre_type(char)operator(*\)\)\);) +directive(void) ident(rb_compile_error) ident(__)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\);) +directive(void) ident(rb_compile_error_append) ident(__)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_load_fail) ident(_)operator((()directive(const) pre_type(char)operator(*\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_error_frozen) ident(_)operator((()directive(const) pre_type(char)operator(*\)\)\);) +directive(void) ident(rb_check_frozen) ident(_)operator((()ident(VALUE)operator(\)\);) +comment(/* eval.c */) +ident(RUBY_EXTERN) reserved(struct) ident(RNode) operator(*)ident(ruby_current_node)operator(;) +directive(void) ident(ruby_set_current_source) ident(_)operator((()directive(void)operator(\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_exc_raise) ident(_)operator((()ident(VALUE)operator(\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_exc_fatal) ident(_)operator((()ident(VALUE)operator(\)\)\);) +ident(VALUE) ident(rb_f_exit) ident(_)operator((()pre_type(int)operator(,)ident(VALUE)operator(*\)\);) +ident(VALUE) ident(rb_f_abort) ident(_)operator((()pre_type(int)operator(,)ident(VALUE)operator(*\)\);) +directive(void) ident(rb_remove_method) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) +preprocessor(#define) ident(rb_disable_super)operator(()ident(klass)operator(,) ident(name)operator(\)) operator((()directive(void)operator(\))integer(0)operator(\)) +preprocessor(#define) ident(rb_enable_super)operator(()ident(klass)operator(,) ident(name)operator(\)) operator((()directive(void)operator(\))integer(0)operator(\)) +preprocessor(#define) ident(HAVE_RB_DEFINE_ALLOC_FUNC) integer(1) +directive(void) ident(rb_define_alloc_func) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE) operator((*\)()ident(VALUE)operator(\)\)\);) +directive(void) ident(rb_undef_alloc_func) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_clear_cache) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_clear_cache_by_class) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_alias) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) ident(ID)operator(\)\);) +directive(void) ident(rb_attr) ident(_)operator((()ident(VALUE)operator(,)ident(ID)operator(,)pre_type(int)operator(,)pre_type(int)operator(,)pre_type(int)operator(\)\);) +pre_type(int) ident(rb_method_boundp) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_dvar_defined) ident(_)operator((()ident(ID)operator(\)\);) +ident(VALUE) ident(rb_dvar_curr) ident(_)operator((()ident(ID)operator(\)\);) +ident(VALUE) ident(rb_dvar_ref) ident(_)operator((()ident(ID)operator(\)\);) +directive(void) ident(rb_dvar_asgn) ident(_)operator((()ident(ID)operator(,) ident(VALUE)operator(\)\);) +directive(void) ident(rb_dvar_push) ident(_)operator((()ident(ID)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) operator(*)ident(rb_svar) ident(_)operator((()pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_eval_cmd) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) pre_type(int)operator(\)\);) +pre_type(int) ident(rb_obj_respond_to) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) pre_type(int)operator(\)\);) +pre_type(int) ident(rb_respond_to) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +directive(void) ident(rb_interrupt) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_apply) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) ident(VALUE)operator(\)\);) +directive(void) ident(rb_backtrace) ident(_)operator((()directive(void)operator(\)\);) +ident(ID) ident(rb_frame_last_func) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_obj_instance_eval) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_mod_module_eval) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +directive(void) ident(rb_load) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(\)\);) +directive(void) ident(rb_load_protect) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(,) pre_type(int)operator(*\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_jump_tag) ident(_)operator((()pre_type(int)operator(\)\)\);) +pre_type(int) ident(rb_provided) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(rb_provide) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_f_require) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_require_safe) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(\)\);) +directive(void) ident(rb_obj_call_init) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(,) ident(VALUE)operator(*\)\);) +ident(VALUE) ident(rb_class_new_instance) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_block_proc) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_f_lambda) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_proc_new) ident(_)operator((()ident(VALUE) operator((*\)()ident(ANYARGS)comment(/* VALUE yieldarg[, VALUE procarg] */)operator(\),) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_protect) ident(_)operator((()ident(VALUE) operator((*\)()ident(VALUE)operator(\),) ident(VALUE)operator(,) pre_type(int)operator(*\)\);) +directive(void) ident(rb_set_end_proc) ident(_)operator((()directive(void) operator((*\)()ident(VALUE)operator(\),) ident(VALUE)operator(\)\);) +directive(void) ident(rb_mark_end_proc) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_exec_end_proc) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(ruby_finalize) ident(_)operator((()directive(void)operator(\)\);) +ident(NORETURN)operator(()directive(void) ident(ruby_stop) ident(_)operator((()pre_type(int)operator(\)\)\);) +pre_type(int) ident(ruby_cleanup) ident(_)operator((()pre_type(int)operator(\)\);) +pre_type(int) ident(ruby_exec) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_gc_mark_threads) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_thread_start_timer) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_thread_stop_timer) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_thread_schedule) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_thread_wait_fd) ident(_)operator((()pre_type(int)operator(\)\);) +pre_type(int) ident(rb_thread_fd_writable) ident(_)operator((()pre_type(int)operator(\)\);) +directive(void) ident(rb_thread_fd_close) ident(_)operator((()pre_type(int)operator(\)\);) +pre_type(int) ident(rb_thread_alone) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_thread_polling) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_thread_sleep) ident(_)operator((()pre_type(int)operator(\)\);) +directive(void) ident(rb_thread_sleep_forever) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_thread_stop) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_thread_wakeup) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_thread_wakeup_alive) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_thread_run) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_thread_kill) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_thread_alive_p) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_thread_create) ident(_)operator((()ident(VALUE) operator((*\)()ident(ANYARGS)operator(\),) directive(void)operator(*\)\);) +directive(void) ident(rb_thread_interrupt) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_thread_trap_eval) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(,) pre_type(int)operator(\)\);) +directive(void) ident(rb_thread_signal_raise) ident(_)operator((()pre_type(int)operator(\)\);) +directive(void) ident(rb_thread_signal_exit) ident(_)operator((()directive(void)operator(\)\);) +pre_type(int) ident(rb_thread_select) ident(_)operator((()pre_type(int)operator(,) ident(fd_set) operator(*,) ident(fd_set) operator(*,) ident(fd_set) operator(*,) reserved(struct) ident(timeval) operator(*\)\);) +directive(void) ident(rb_thread_wait_for) ident(_)operator((()reserved(struct) ident(timeval)operator(\)\);) +ident(VALUE) ident(rb_thread_current) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_thread_main) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_thread_local_aref) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_thread_local_aset) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) ident(VALUE)operator(\)\);) +directive(void) ident(rb_thread_atfork) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_funcall_rescue) ident(__)operator((()ident(VALUE)operator(,) ident(ID)operator(,) pre_type(int)operator(,) operator(.)operator(.)operator(.)operator(\)\);) +comment(/* file.c */) +ident(VALUE) ident(rb_file_s_expand_path) ident(_)operator((()pre_type(int)operator(,) ident(VALUE) operator(*\)\);) +ident(VALUE) ident(rb_file_expand_path) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +directive(void) ident(rb_file_const) ident(_)operator((()directive(const) pre_type(char)operator(*,) ident(VALUE)operator(\)\);) +pre_type(int) ident(rb_find_file_ext) ident(_)operator((()ident(VALUE)operator(*,) directive(const) pre_type(char)operator(*) directive(const)operator(*\)\);) +ident(VALUE) ident(rb_find_file) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(char) operator(*)ident(rb_path_next) ident(_)operator((()directive(const) pre_type(char) operator(*\)\);) +pre_type(char) operator(*)ident(rb_path_skip_prefix) ident(_)operator((()directive(const) pre_type(char) operator(*\)\);) +pre_type(char) operator(*)ident(rb_path_last_separator) ident(_)operator((()directive(const) pre_type(char) operator(*\)\);) +pre_type(char) operator(*)ident(rb_path_end) ident(_)operator((()directive(const) pre_type(char) operator(*\)\);) +ident(VALUE) ident(rb_file_directory_p) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +comment(/* gc.c */) +ident(NORETURN)operator(()directive(void) ident(rb_memerror) ident(__)operator((()directive(void)operator(\)\)\);) +pre_type(int) ident(ruby_stack_check) ident(_)operator((()directive(void)operator(\)\);) +ident(size_t) ident(ruby_stack_length) ident(_)operator((()ident(VALUE)operator(**\)\);) +pre_type(int) ident(rb_during_gc) ident(_)operator((()directive(void)operator(\)\);) +pre_type(char) operator(*)ident(rb_source_filename) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(rb_gc_mark_locations) ident(_)operator((()ident(VALUE)operator(*,) ident(VALUE)operator(*\)\);) +directive(void) ident(rb_mark_tbl) ident(_)operator((()reserved(struct) ident(st_table)operator(*\)\);) +directive(void) ident(rb_mark_set) ident(_)operator((()reserved(struct) ident(st_table)operator(*\)\);) +directive(void) ident(rb_mark_hash) ident(_)operator((()reserved(struct) ident(st_table)operator(*\)\);) +directive(void) ident(rb_gc_mark_maybe) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_gc_mark) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_gc_force_recycle) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_gc) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_gc_copy_finalizer) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +directive(void) ident(rb_gc_finalize_deferred) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_gc_call_finalizer_at_exit) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_gc_enable) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_gc_disable) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_gc_start) ident(_)operator((()directive(void)operator(\)\);) +comment(/* hash.c */) +directive(void) ident(st_foreach_safe) ident(_)operator((()reserved(struct) ident(st_table) operator(*,) pre_type(int) operator((*\)()ident(ANYARGS)operator(\),) pre_type(unsigned) pre_type(long)operator(\)\);) +directive(void) ident(rb_hash_foreach) ident(_)operator((()ident(VALUE)operator(,) pre_type(int) operator((*\)()ident(ANYARGS)operator(\),) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_hash) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_hash_new) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_hash_freeze) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_hash_aref) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_hash_aset) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_hash_delete_if) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_hash_delete) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +pre_type(int) ident(rb_path_check) ident(_)operator((()pre_type(char)operator(*\)\);) +pre_type(int) ident(rb_env_path_tainted) ident(_)operator((()directive(void)operator(\)\);) +comment(/* io.c */) +preprocessor(#define) ident(rb_defout) ident(rb_stdout) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_fs)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_output_fs)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_rs)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_default_rs)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_output_rs)operator(;) +ident(VALUE) ident(rb_io_write) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_gets) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_getc) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_ungetc) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_close) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_eof) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_binmode) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_addstr) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_printf) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_print) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_io_puts) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_file_open) ident(_)operator((()directive(const) pre_type(char)operator(*,) directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_gets) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_write_error) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(rb_write_error2) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(long)operator(\)\);) +comment(/* marshal.c */) +ident(VALUE) ident(rb_marshal_dump) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_marshal_load) ident(_)operator((()ident(VALUE)operator(\)\);) +comment(/* numeric.c */) +directive(void) ident(rb_num_zerodiv) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_num_coerce_bin) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_num_coerce_cmp) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_num_coerce_relop) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_float_new) ident(_)operator((()pre_type(double)operator(\)\);) +ident(VALUE) ident(rb_num2fix) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_fix2str) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_dbl_cmp) ident(_)operator((()pre_type(double)operator(,) pre_type(double)operator(\)\);) +comment(/* object.c */) +pre_type(int) ident(rb_eql) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_any_to_s) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_inspect) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_is_instance_of) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_is_kind_of) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_alloc) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_clone) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_dup) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_init_copy) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_taint) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_tainted) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_untaint) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_freeze) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_id) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_class) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_class_real) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_class_inherited_p) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_convert_type) ident(_)operator((()ident(VALUE)operator(,)pre_type(int)operator(,)directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_check_convert_type) ident(_)operator((()ident(VALUE)operator(,)pre_type(int)operator(,)directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_to_int) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_Integer) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_Float) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_String) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_Array) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(double) ident(rb_cstr_to_dbl) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(int)operator(\)\);) +pre_type(double) ident(rb_str_to_dbl) ident(_)operator((()ident(VALUE)operator(,) pre_type(int)operator(\)\);) +comment(/* parse.y */) +ident(RUBY_EXTERN) pre_type(int) ident(ruby_sourceline)operator(;) +ident(RUBY_EXTERN) pre_type(char) operator(*)ident(ruby_sourcefile)operator(;) +pre_type(int) ident(ruby_yyparse) ident(_)operator((()directive(void)operator(\)\);) +ident(ID) ident(rb_id_attrset) ident(_)operator((()ident(ID)operator(\)\);) +directive(void) ident(rb_parser_append_print) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_parser_while_loop) ident(_)operator((()pre_type(int)operator(,) pre_type(int)operator(\)\);) +pre_type(int) ident(ruby_parser_stack_on_heap) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_gc_mark_parser) ident(_)operator((()directive(void)operator(\)\);) +pre_type(int) ident(rb_is_const_id) ident(_)operator((()ident(ID)operator(\)\);) +pre_type(int) ident(rb_is_instance_id) ident(_)operator((()ident(ID)operator(\)\);) +pre_type(int) ident(rb_is_class_id) ident(_)operator((()ident(ID)operator(\)\);) +pre_type(int) ident(rb_is_local_id) ident(_)operator((()ident(ID)operator(\)\);) +pre_type(int) ident(rb_is_junk_id) ident(_)operator((()ident(ID)operator(\)\);) +pre_type(int) ident(rb_symname_p) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +pre_type(int) ident(rb_sym_interned_p) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_backref_get) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_backref_set) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_lastline_get) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_lastline_set) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_sym_all_symbols) ident(_)operator((()directive(void)operator(\)\);) +comment(/* process.c */) +pre_type(int) ident(rb_proc_exec) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_f_exec) ident(_)operator((()pre_type(int)operator(,)ident(VALUE)operator(*\)\);) +pre_type(int) ident(rb_waitpid) ident(_)operator((()pre_type(int)operator(,)pre_type(int)operator(*,)pre_type(int)operator(\)\);) +directive(void) ident(rb_syswait) ident(_)operator((()pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_proc_times) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_detach_process) ident(_)operator((()pre_type(int)operator(\)\);) +comment(/* range.c */) +ident(VALUE) ident(rb_range_new) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_range_beg_len) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(*,) pre_type(long)operator(*,) pre_type(long)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_length_by_each) ident(_)operator((()ident(VALUE)operator(\)\);) +comment(/* re.c */) +pre_type(int) ident(rb_memcmp) ident(_)operator((()directive(const) directive(void)operator(*,)directive(const) directive(void)operator(*,)pre_type(long)operator(\)\);) +pre_type(int) ident(rb_memcicmp) ident(_)operator((()directive(const) directive(void)operator(*,)directive(const) directive(void)operator(*,)pre_type(long)operator(\)\);) +pre_type(long) ident(rb_memsearch) ident(_)operator((()directive(const) directive(void)operator(*,)pre_type(long)operator(,)directive(const) directive(void)operator(*,)pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_reg_nth_defined) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_reg_nth_match) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_reg_last_match) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_reg_match_pre) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_reg_match_post) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_reg_match_last) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_reg_new) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(long)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_reg_match) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_reg_match2) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(int) ident(rb_reg_options) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_set_kcode) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +directive(const) pre_type(char)operator(*) ident(rb_get_kcode) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_kcode_set_option) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_kcode_reset_option) ident(_)operator((()directive(void)operator(\)\);) +comment(/* ruby.c */) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_argv)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_argv0)operator(;) +directive(void) ident(rb_load_file) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(ruby_script) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(ruby_prog_init) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(ruby_set_argv) ident(_)operator((()pre_type(int)operator(,) pre_type(char)operator(**\)\);) +directive(void) ident(ruby_process_options) ident(_)operator((()pre_type(int)operator(,) pre_type(char)operator(**\)\);) +directive(void) ident(ruby_load_script) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(ruby_init_loadpath) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(ruby_incpush) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +comment(/* signal.c */) +ident(VALUE) ident(rb_f_kill) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*\)\);) +directive(void) ident(rb_gc_mark_trap_list) ident(_)operator((()directive(void)operator(\)\);) +preprocessor(#ifdef) ident(POSIX_SIGNAL) +preprocessor(#define) ident(posix_signal) ident(ruby_posix_signal) +directive(void) ident(posix_signal) ident(_)operator((()pre_type(int)operator(,) ident(RETSIGTYPE) operator((*\)()pre_type(int)operator(\)\)\);) +preprocessor(#endif) +directive(void) ident(rb_trap_exit) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_trap_exec) ident(_)operator((()directive(void)operator(\)\);) +directive(const) pre_type(char) operator(*)ident(ruby_signal_name) ident(_)operator((()pre_type(int)operator(\)\);) +directive(void) ident(ruby_default_signal) ident(_)operator((()pre_type(int)operator(\)\);) +comment(/* sprintf.c */) +ident(VALUE) ident(rb_f_sprintf) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*\)\);) +ident(VALUE) ident(rb_str_format) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*,) ident(VALUE)operator(\)\);) +comment(/* string.c */) +ident(VALUE) ident(rb_str_new) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_str_new2) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_str_new3) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_new4) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_new5) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_tainted_str_new) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_tainted_str_new2) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_str_buf_new) ident(_)operator((()pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_str_buf_new2) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_str_buf_append) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_buf_cat) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_str_buf_cat2) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_obj_as_string) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_check_string_type) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_dup) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_locktmp) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_unlocktmp) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_dup_frozen) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_plus) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_times) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_substr) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(,) pre_type(long)operator(\)\);) +directive(void) ident(rb_str_modify) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_freeze) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_resize) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_str_cat) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_str_cat2) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_str_append) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_concat) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +pre_type(int) ident(rb_str_hash) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(int) ident(rb_str_cmp) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_upto) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) pre_type(int)operator(\)\);) +directive(void) ident(rb_str_update) ident(_)operator((()ident(VALUE)operator(,) pre_type(long)operator(,) pre_type(long)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_inspect) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_dump) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_split) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(rb_str_associate) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_str_associated) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_str_setter) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) ident(VALUE)operator(*\)\);) +ident(VALUE) ident(rb_str_intern) ident(_)operator((()ident(VALUE)operator(\)\);) +comment(/* struct.c */) +ident(VALUE) ident(rb_struct_new) ident(__)operator((()ident(VALUE)operator(,) operator(.)operator(.)operator(.)operator(\)\);) +ident(VALUE) ident(rb_struct_define) ident(__)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\);) +ident(VALUE) ident(rb_struct_alloc) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_struct_aref) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_struct_aset) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_struct_getmember) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_struct_iv_get) ident(_)operator((()ident(VALUE)operator(,) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_struct_s_members) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_struct_members) ident(_)operator((()ident(VALUE)operator(\)\);) +comment(/* time.c */) +ident(VALUE) ident(rb_time_new) ident(_)operator((()ident(time_t)operator(,) ident(time_t)operator(\)\);) +comment(/* variable.c */) +ident(VALUE) ident(rb_mod_name) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_class_path) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_set_class_path) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_path2class) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(rb_name_class) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_class_name) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_autoload) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_autoload_load) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_autoload_p) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +directive(void) ident(rb_gc_mark_global_tbl) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_f_trace_var) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*\)\);) +ident(VALUE) ident(rb_f_untrace_var) ident(_)operator((()pre_type(int)operator(,) ident(VALUE)operator(*\)\);) +ident(VALUE) ident(rb_f_global_variables) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_alias_variable) ident(_)operator((()ident(ID)operator(,) ident(ID)operator(\)\);) +reserved(struct) ident(st_table)operator(*) ident(rb_generic_ivar_table) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_copy_generic_ivar) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +directive(void) ident(rb_mark_generic_ivar) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_mark_generic_ivar_tbl) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_free_generic_ivar) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ivar_get) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_ivar_set) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_ivar_defined) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_iv_set) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_iv_get) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_attr_get) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_obj_instance_variables) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_obj_remove_instance_variable) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +directive(void) operator(*)ident(rb_mod_const_at) ident(_)operator((()ident(VALUE)operator(,) directive(void)operator(*\)\);) +directive(void) operator(*)ident(rb_mod_const_of) ident(_)operator((()ident(VALUE)operator(,) directive(void)operator(*\)\);) +ident(VALUE) ident(rb_const_list) ident(_)operator((()directive(void)operator(*\)\);) +ident(VALUE) ident(rb_mod_constants) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_mod_remove_const) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +pre_type(int) ident(rb_const_defined) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +pre_type(int) ident(rb_const_defined_at) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +pre_type(int) ident(rb_const_defined_from) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_const_get) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_const_get_at) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +ident(VALUE) ident(rb_const_get_from) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +directive(void) ident(rb_const_set) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_mod_constants) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_mod_const_missing) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_cvar_defined) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +preprocessor(#define) ident(RB_CVAR_SET_4ARGS) integer(1) +directive(void) ident(rb_cvar_set) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) ident(VALUE)operator(,) pre_type(int)operator(\)\);) +ident(VALUE) ident(rb_cvar_get) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(\)\);) +directive(void) ident(rb_cv_set) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_cv_get) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(rb_define_class_variable) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_mod_class_variables) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_mod_remove_cvar) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(\)\);) +comment(/* version.c */) +directive(void) ident(ruby_show_version) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(ruby_show_copyright) ident(_)operator((()directive(void)operator(\)\);) +comment(/************************************************ + + missing.h - prototype for *.c in ./missing, and + for missing timeval struct + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Sat May 11 23:46:03 JST 2002 + +************************************************/) + +preprocessor(#ifndef) ident(MISSING_H) +preprocessor(#define) ident(MISSING_H) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_SYS_TIME_H)operator(\)) +preprocessor(# include) include(<sys/time.h>) +preprocessor(#elif) operator(!)ident(defined)operator(()ident(_WIN32)operator(\)) +preprocessor(# define) ident(time_t) pre_type(long) +reserved(struct) ident(timeval) operator({) + ident(time_t) ident(tv_sec)operator(;) comment(/* seconds */) + ident(time_t) ident(tv_usec)operator(;) comment(/* microseconds */) +operator(};) +preprocessor(#endif) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SYS_TYPES_H)operator(\)) +preprocessor(# include) include(<sys/types.h>) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_ACOSH) +directive(extern) pre_type(double) ident(acosh) ident(_)operator((()pre_type(double)operator(\)\);) +directive(extern) pre_type(double) ident(asinh) ident(_)operator((()pre_type(double)operator(\)\);) +directive(extern) pre_type(double) ident(atanh) ident(_)operator((()pre_type(double)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_CRYPT) +directive(extern) pre_type(char) operator(*)ident(crypt) ident(_)operator((()pre_type(char) operator(*,) pre_type(char) operator(*\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_DUP2) +directive(extern) pre_type(int) ident(dup2) ident(_)operator((()pre_type(int)operator(,) pre_type(int)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_EACCESS) +directive(extern) pre_type(int) ident(eaccess) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(int)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_FINITE) +directive(extern) pre_type(int) ident(finite) ident(_)operator((()pre_type(double)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_FLOCK) +directive(extern) pre_type(int) ident(flock) ident(_)operator((()pre_type(int)operator(,) pre_type(int)operator(\)\);) +preprocessor(#endif) + +comment(/* +#ifndef HAVE_FREXP +extern double frexp _((double, int *\)\); +#endif +*/) + +preprocessor(#ifndef) ident(HAVE_HYPOT) +directive(extern) pre_type(double) ident(hypot) ident(_)operator((()pre_type(double)operator(,) pre_type(double)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_ERF) +directive(extern) pre_type(double) ident(erf) ident(_)operator((()pre_type(double)operator(\)\);) +directive(extern) pre_type(double) ident(erfc) ident(_)operator((()pre_type(double)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_ISINF) +preprocessor(# if) ident(defined)operator(()ident(HAVE_FINITE)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_ISNAN)operator(\)) +preprocessor(# define) ident(isinf)operator(()ident(x)operator(\)) operator((!)ident(finite)operator(()ident(x)operator(\)) operator(&&) operator(!)ident(isnan)operator(()ident(x)operator(\)\)) +preprocessor(# else) +directive(extern) pre_type(int) ident(isinf) ident(_)operator((()pre_type(double)operator(\)\);) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_ISNAN) +directive(extern) pre_type(int) ident(isnan) ident(_)operator((()pre_type(double)operator(\)\);) +preprocessor(#endif) + +comment(/* +#ifndef HAVE_MEMCMP +extern int memcmp _((char *, char *, int\)\); +#endif +*/) + +preprocessor(#ifndef) ident(HAVE_MEMMOVE) +directive(extern) directive(void) operator(*)ident(memmove) ident(_)operator((()directive(void) operator(*,) directive(void) operator(*,) pre_type(int)operator(\)\);) +preprocessor(#endif) + +comment(/* +#ifndef HAVE_MODF +extern double modf _((double, double *\)\); +#endif +*/) + +preprocessor(#ifndef) ident(HAVE_STRCASECMP) +directive(extern) pre_type(int) ident(strcasecmp) ident(_)operator((()pre_type(char) operator(*,) pre_type(char) operator(*\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_STRNCASECMP) +directive(extern) pre_type(int) ident(strncasecmp) ident(_)operator((()pre_type(char) operator(*,) pre_type(char) operator(*,) pre_type(int)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_STRCHR) +directive(extern) pre_type(char) operator(*)ident(strchr) ident(_)operator((()pre_type(char) operator(*,) pre_type(int)operator(\)\);) +directive(extern) pre_type(char) operator(*)ident(strrchr) ident(_)operator((()pre_type(char) operator(*,) pre_type(int)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_STRERROR) +directive(extern) pre_type(char) operator(*)ident(strerror) ident(_)operator((()pre_type(int)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_STRFTIME) +directive(extern) ident(size_t) ident(strftime) ident(_)operator((()pre_type(char) operator(*,) ident(size_t)operator(,) directive(const) pre_type(char) operator(*,) directive(const) reserved(struct) ident(tm) operator(*\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_STRSTR) +directive(extern) pre_type(char) operator(*)ident(strstr) ident(_)operator((()pre_type(char) operator(*,) pre_type(char) operator(*\)\);) +preprocessor(#endif) + +comment(/* +#ifndef HAVE_STRTOL +extern long strtol _((char *, char **, int\)\); +#endif +*/) + +preprocessor(#ifndef) ident(HAVE_STRTOUL) +directive(extern) pre_type(unsigned) pre_type(long) ident(strtoul) ident(_)operator((()pre_type(char) operator(*,) pre_type(char) operator(**,) pre_type(int)operator(\)\);) +preprocessor(#endif) + +preprocessor(#ifndef) ident(HAVE_VSNPRINTF) +preprocessor(# ifdef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(# include) include(<stdarg.h>) +preprocessor(# else) +preprocessor(# include) include(<varargs.h>) +preprocessor(# endif) +directive(extern) pre_type(int) ident(snprintf) ident(__)operator((()pre_type(char) operator(*,) ident(size_t) ident(n)operator(,) pre_type(char) directive(const) operator(*,) operator(.)operator(.)operator(.)operator(\)\);) +directive(extern) pre_type(int) ident(vsnprintf) ident(_)operator((()pre_type(char) operator(*,) ident(size_t) ident(n)operator(,) pre_type(char) directive(const) operator(*,) ident(va_list)operator(\)\);) +preprocessor(#endif) + +preprocessor(#endif) comment(/* MISSING_H */) +comment(/********************************************************************** + + node.h - + + $Author: wyhaines $ + $Date: 2009-07-09 20:16:38 +0200 (Thu, 09 Jul 2009\) $ + created at: Fri May 28 15:14:02 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#ifndef) ident(NODE_H) +preprocessor(#define) ident(NODE_H) + +preprocessor(#if) ident(defined)operator(()ident(__cplusplus)operator(\)) +directive(extern) string<delimiter(")content(C)delimiter(")> operator({) +preprocessor(#endif) + +reserved(enum) ident(node_type) operator({) + ident(NODE_METHOD)operator(,) + ident(NODE_FBODY)operator(,) + ident(NODE_CFUNC)operator(,) + ident(NODE_SCOPE)operator(,) + ident(NODE_BLOCK)operator(,) + ident(NODE_IF)operator(,) + ident(NODE_CASE)operator(,) + ident(NODE_WHEN)operator(,) + ident(NODE_OPT_N)operator(,) + ident(NODE_WHILE)operator(,) + ident(NODE_UNTIL)operator(,) + ident(NODE_ITER)operator(,) + ident(NODE_FOR)operator(,) + ident(NODE_BREAK)operator(,) + ident(NODE_NEXT)operator(,) + ident(NODE_REDO)operator(,) + ident(NODE_RETRY)operator(,) + ident(NODE_BEGIN)operator(,) + ident(NODE_RESCUE)operator(,) + ident(NODE_RESBODY)operator(,) + ident(NODE_ENSURE)operator(,) + ident(NODE_AND)operator(,) + ident(NODE_OR)operator(,) + ident(NODE_NOT)operator(,) + ident(NODE_MASGN)operator(,) + ident(NODE_LASGN)operator(,) + ident(NODE_DASGN)operator(,) + ident(NODE_DASGN_CURR)operator(,) + ident(NODE_GASGN)operator(,) + ident(NODE_IASGN)operator(,) + ident(NODE_CDECL)operator(,) + ident(NODE_CVASGN)operator(,) + ident(NODE_CVDECL)operator(,) + ident(NODE_OP_ASGN1)operator(,) + ident(NODE_OP_ASGN2)operator(,) + ident(NODE_OP_ASGN_AND)operator(,) + ident(NODE_OP_ASGN_OR)operator(,) + ident(NODE_CALL)operator(,) + ident(NODE_FCALL)operator(,) + ident(NODE_VCALL)operator(,) + ident(NODE_SUPER)operator(,) + ident(NODE_ZSUPER)operator(,) + ident(NODE_ARRAY)operator(,) + ident(NODE_ZARRAY)operator(,) + ident(NODE_HASH)operator(,) + ident(NODE_RETURN)operator(,) + ident(NODE_YIELD)operator(,) + ident(NODE_LVAR)operator(,) + ident(NODE_DVAR)operator(,) + ident(NODE_GVAR)operator(,) + ident(NODE_IVAR)operator(,) + ident(NODE_CONST)operator(,) + ident(NODE_CVAR)operator(,) + ident(NODE_NTH_REF)operator(,) + ident(NODE_BACK_REF)operator(,) + ident(NODE_MATCH)operator(,) + ident(NODE_MATCH2)operator(,) + ident(NODE_MATCH3)operator(,) + ident(NODE_LIT)operator(,) + ident(NODE_STR)operator(,) + ident(NODE_DSTR)operator(,) + ident(NODE_XSTR)operator(,) + ident(NODE_DXSTR)operator(,) + ident(NODE_EVSTR)operator(,) + ident(NODE_DREGX)operator(,) + ident(NODE_DREGX_ONCE)operator(,) + ident(NODE_ARGS)operator(,) + ident(NODE_ARGSCAT)operator(,) + ident(NODE_ARGSPUSH)operator(,) + ident(NODE_SPLAT)operator(,) + ident(NODE_TO_ARY)operator(,) + ident(NODE_SVALUE)operator(,) + ident(NODE_BLOCK_ARG)operator(,) + ident(NODE_BLOCK_PASS)operator(,) + ident(NODE_DEFN)operator(,) + ident(NODE_DEFS)operator(,) + ident(NODE_ALIAS)operator(,) + ident(NODE_VALIAS)operator(,) + ident(NODE_UNDEF)operator(,) + ident(NODE_CLASS)operator(,) + ident(NODE_MODULE)operator(,) + ident(NODE_SCLASS)operator(,) + ident(NODE_COLON2)operator(,) + ident(NODE_COLON3)operator(,) + ident(NODE_CREF)operator(,) + ident(NODE_DOT2)operator(,) + ident(NODE_DOT3)operator(,) + ident(NODE_FLIP2)operator(,) + ident(NODE_FLIP3)operator(,) + ident(NODE_ATTRSET)operator(,) + ident(NODE_SELF)operator(,) + ident(NODE_NIL)operator(,) + ident(NODE_TRUE)operator(,) + ident(NODE_FALSE)operator(,) + ident(NODE_DEFINED)operator(,) + ident(NODE_NEWLINE)operator(,) + ident(NODE_POSTEXE)operator(,) + ident(NODE_ALLOCA)operator(,) + ident(NODE_DMETHOD)operator(,) + ident(NODE_BMETHOD)operator(,) + ident(NODE_MEMO)operator(,) + ident(NODE_IFUNC)operator(,) + ident(NODE_DSYM)operator(,) + ident(NODE_ATTRASGN)operator(,) + ident(NODE_LAST) +operator(};) + +reserved(typedef) reserved(struct) ident(RNode) operator({) + pre_type(unsigned) pre_type(long) ident(flags)operator(;) + pre_type(char) operator(*)ident(nd_file)operator(;) + reserved(union) operator({) + reserved(struct) ident(RNode) operator(*)ident(node)operator(;) + ident(ID) ident(id)operator(;) + ident(VALUE) ident(value)operator(;) + ident(VALUE) operator((*)ident(cfunc)operator(\)()ident(ANYARGS)operator(\);) + ident(ID) operator(*)ident(tbl)operator(;) + operator(}) ident(u1)operator(;) + reserved(union) operator({) + reserved(struct) ident(RNode) operator(*)ident(node)operator(;) + ident(ID) ident(id)operator(;) + pre_type(long) ident(argc)operator(;) + ident(VALUE) ident(value)operator(;) + operator(}) ident(u2)operator(;) + reserved(union) operator({) + reserved(struct) ident(RNode) operator(*)ident(node)operator(;) + ident(ID) ident(id)operator(;) + pre_type(long) ident(state)operator(;) + reserved(struct) ident(global_entry) operator(*)ident(entry)operator(;) + pre_type(long) ident(cnt)operator(;) + ident(VALUE) ident(value)operator(;) + operator(}) ident(u3)operator(;) +operator(}) ident(NODE)operator(;) + +directive(extern) ident(NODE) operator(*)ident(ruby_cref)operator(;) +directive(extern) ident(NODE) operator(*)ident(ruby_top_cref)operator(;) + +preprocessor(#define) ident(RNODE)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RNode)operator(\)()ident(obj)operator(\)\)) + +preprocessor(#define) ident(nd_type)operator(()ident(n)operator(\)) operator((()pre_type(int)operator(\)((()ident(RNODE)operator(()ident(n)operator(\)\)->)ident(flags)operator(>>)ident(FL_USHIFT)operator(\)&)hex(0xff)operator(\)\)) +preprocessor(#define) ident(nd_set_type)operator(()ident(n)operator(,)ident(t)operator(\)) \ + ident(RNODE)operator(()ident(n)operator(\)->)ident(flags)operator(=(()ident(RNODE)operator(()ident(n)operator(\)->)ident(flags)operator(&~)ident(FL_UMASK)operator(\)|((()ident(t)operator(\)<<)ident(FL_USHIFT)operator(\)&)ident(FL_UMASK)operator(\)\)) + +preprocessor(#define) ident(NODE_LSHIFT) operator(()ident(FL_USHIFT)operator(+)integer(8)operator(\)) +preprocessor(#define) ident(NODE_LMASK) operator(((()pre_type(long)operator(\))integer(1)operator(<<()reserved(sizeof)operator(()ident(NODE)operator(*\)*)ident(CHAR_BIT)operator(-)ident(NODE_LSHIFT)operator(\)\)-)integer(1)operator(\)) +preprocessor(#define) ident(nd_line)operator(()ident(n)operator(\)) operator((()pre_type(unsigned) pre_type(int)operator(\)((()ident(RNODE)operator(()ident(n)operator(\)\)->)ident(flags)operator(>>)ident(NODE_LSHIFT)operator(\)&)ident(NODE_LMASK)operator(\)\)) +preprocessor(#define) ident(nd_set_line)operator(()ident(n)operator(,)ident(l)operator(\)) \ + ident(RNODE)operator(()ident(n)operator(\)->)ident(flags)operator(=(()ident(RNODE)operator(()ident(n)operator(\)->)ident(flags)operator(&~(-)integer(1)operator(<<)ident(NODE_LSHIFT)operator(\)\)|((()ident(l)operator(\)&)ident(NODE_LMASK)operator(\)<<)ident(NODE_LSHIFT)operator(\)\)) + +preprocessor(#define) ident(nd_head) ident(u1)operator(.)ident(node) +preprocessor(#define) ident(nd_alen) ident(u2)operator(.)ident(argc) +preprocessor(#define) ident(nd_next) ident(u3)operator(.)ident(node) + +preprocessor(#define) ident(nd_cond) ident(u1)operator(.)ident(node) +preprocessor(#define) ident(nd_body) ident(u2)operator(.)ident(node) +preprocessor(#define) ident(nd_else) ident(u3)operator(.)ident(node) + +preprocessor(#define) ident(nd_orig) ident(u3)operator(.)ident(value) + +preprocessor(#define) ident(nd_resq) ident(u2)operator(.)ident(node) +preprocessor(#define) ident(nd_ensr) ident(u3)operator(.)ident(node) + +preprocessor(#define) ident(nd_1st) ident(u1)operator(.)ident(node) +preprocessor(#define) ident(nd_2nd) ident(u2)operator(.)ident(node) + +preprocessor(#define) ident(nd_stts) ident(u1)operator(.)ident(node) + +preprocessor(#define) ident(nd_entry) ident(u3)operator(.)ident(entry) +preprocessor(#define) ident(nd_vid) ident(u1)operator(.)ident(id) +preprocessor(#define) ident(nd_cflag) ident(u2)operator(.)ident(id) +preprocessor(#define) ident(nd_cval) ident(u3)operator(.)ident(value) + +preprocessor(#define) ident(nd_cnt) ident(u3)operator(.)ident(cnt) +preprocessor(#define) ident(nd_tbl) ident(u1)operator(.)ident(tbl) + +preprocessor(#define) ident(nd_var) ident(u1)operator(.)ident(node) +preprocessor(#define) ident(nd_ibdy) ident(u2)operator(.)ident(node) +preprocessor(#define) ident(nd_iter) ident(u3)operator(.)ident(node) + +preprocessor(#define) ident(nd_value) ident(u2)operator(.)ident(node) +preprocessor(#define) ident(nd_aid) ident(u3)operator(.)ident(id) + +preprocessor(#define) ident(nd_lit) ident(u1)operator(.)ident(value) + +preprocessor(#define) ident(nd_frml) ident(u1)operator(.)ident(node) +preprocessor(#define) ident(nd_rest) ident(u2)operator(.)ident(node) +preprocessor(#define) ident(nd_opt) ident(u1)operator(.)ident(node) + +preprocessor(#define) ident(nd_recv) ident(u1)operator(.)ident(node) +preprocessor(#define) ident(nd_mid) ident(u2)operator(.)ident(id) +preprocessor(#define) ident(nd_args) ident(u3)operator(.)ident(node) + +preprocessor(#define) ident(nd_noex) ident(u1)operator(.)ident(id) +preprocessor(#define) ident(nd_defn) ident(u3)operator(.)ident(node) + +preprocessor(#define) ident(nd_cfnc) ident(u1)operator(.)ident(cfunc) +preprocessor(#define) ident(nd_argc) ident(u2)operator(.)ident(argc) + +preprocessor(#define) ident(nd_cpath) ident(u1)operator(.)ident(node) +preprocessor(#define) ident(nd_super) ident(u3)operator(.)ident(node) + +preprocessor(#define) ident(nd_modl) ident(u1)operator(.)ident(id) +preprocessor(#define) ident(nd_clss) ident(u1)operator(.)ident(value) + +preprocessor(#define) ident(nd_beg) ident(u1)operator(.)ident(node) +preprocessor(#define) ident(nd_end) ident(u2)operator(.)ident(node) +preprocessor(#define) ident(nd_state) ident(u3)operator(.)ident(state) +preprocessor(#define) ident(nd_rval) ident(u2)operator(.)ident(value) + +preprocessor(#define) ident(nd_nth) ident(u2)operator(.)ident(argc) + +preprocessor(#define) ident(nd_tag) ident(u1)operator(.)ident(id) +preprocessor(#define) ident(nd_tval) ident(u2)operator(.)ident(value) + +preprocessor(#define) ident(NEW_NODE)operator(()ident(t)operator(,)ident(a0)operator(,)ident(a1)operator(,)ident(a2)operator(\)) ident(rb_node_newnode)operator((()ident(t)operator(\),()ident(VALUE)operator(\)()ident(a0)operator(\),()ident(VALUE)operator(\)()ident(a1)operator(\),()ident(VALUE)operator(\)()ident(a2)operator(\)\)) + +preprocessor(#define) ident(NEW_METHOD)operator(()ident(n)operator(,)ident(x)operator(\)) ident(NEW_NODE)operator(()ident(NODE_METHOD)operator(,)ident(x)operator(,)ident(n)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_FBODY)operator(()ident(n)operator(,)ident(i)operator(,)ident(o)operator(\)) ident(NEW_NODE)operator(()ident(NODE_FBODY)operator(,)ident(n)operator(,)ident(i)operator(,)ident(o)operator(\)) +preprocessor(#define) ident(NEW_DEFN)operator(()ident(i)operator(,)ident(a)operator(,)ident(d)operator(,)ident(p)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DEFN)operator(,)ident(p)operator(,)ident(i)operator(,)ident(NEW_RFUNC)operator(()ident(a)operator(,)ident(d)operator(\)\)) +preprocessor(#define) ident(NEW_DEFS)operator(()ident(r)operator(,)ident(i)operator(,)ident(a)operator(,)ident(d)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DEFS)operator(,)ident(r)operator(,)ident(i)operator(,)ident(NEW_RFUNC)operator(()ident(a)operator(,)ident(d)operator(\)\)) +preprocessor(#define) ident(NEW_CFUNC)operator(()ident(f)operator(,)ident(c)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CFUNC)operator(,)ident(f)operator(,)ident(c)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_IFUNC)operator(()ident(f)operator(,)ident(c)operator(\)) ident(NEW_NODE)operator(()ident(NODE_IFUNC)operator(,)ident(f)operator(,)ident(c)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_RFUNC)operator(()ident(b1)operator(,)ident(b2)operator(\)) ident(NEW_SCOPE)operator(()ident(block_append)operator(()ident(b1)operator(,)ident(b2)operator(\)\)) +preprocessor(#define) ident(NEW_SCOPE)operator(()ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_SCOPE)operator(,)ident(local_tbl)operator((\),)integer(0)operator(,()ident(b)operator(\)\)) +preprocessor(#define) ident(NEW_BLOCK)operator(()ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_BLOCK)operator(,)ident(a)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_IF)operator(()ident(c)operator(,)ident(t)operator(,)ident(e)operator(\)) ident(NEW_NODE)operator(()ident(NODE_IF)operator(,)ident(c)operator(,)ident(t)operator(,)ident(e)operator(\)) +preprocessor(#define) ident(NEW_UNLESS)operator(()ident(c)operator(,)ident(t)operator(,)ident(e)operator(\)) ident(NEW_IF)operator(()ident(c)operator(,)ident(e)operator(,)ident(t)operator(\)) +preprocessor(#define) ident(NEW_CASE)operator(()ident(h)operator(,)ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CASE)operator(,)ident(h)operator(,)ident(b)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_WHEN)operator(()ident(c)operator(,)ident(t)operator(,)ident(e)operator(\)) ident(NEW_NODE)operator(()ident(NODE_WHEN)operator(,)ident(c)operator(,)ident(t)operator(,)ident(e)operator(\)) +preprocessor(#define) ident(NEW_OPT_N)operator(()ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_OPT_N)operator(,)integer(0)operator(,)ident(b)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_WHILE)operator(()ident(c)operator(,)ident(b)operator(,)ident(n)operator(\)) ident(NEW_NODE)operator(()ident(NODE_WHILE)operator(,)ident(c)operator(,)ident(b)operator(,)ident(n)operator(\)) +preprocessor(#define) ident(NEW_UNTIL)operator(()ident(c)operator(,)ident(b)operator(,)ident(n)operator(\)) ident(NEW_NODE)operator(()ident(NODE_UNTIL)operator(,)ident(c)operator(,)ident(b)operator(,)ident(n)operator(\)) +preprocessor(#define) ident(NEW_FOR)operator(()ident(v)operator(,)ident(i)operator(,)ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_FOR)operator(,)ident(v)operator(,)ident(b)operator(,)ident(i)operator(\)) +preprocessor(#define) ident(NEW_ITER)operator(()ident(v)operator(,)ident(i)operator(,)ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_ITER)operator(,)ident(v)operator(,)ident(b)operator(,)ident(i)operator(\)) +preprocessor(#define) ident(NEW_BREAK)operator(()ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_BREAK)operator(,)ident(s)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_NEXT)operator(()ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_NEXT)operator(,)ident(s)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_REDO)operator((\)) ident(NEW_NODE)operator(()ident(NODE_REDO)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_RETRY)operator((\)) ident(NEW_NODE)operator(()ident(NODE_RETRY)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_BEGIN)operator(()ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_BEGIN)operator(,)integer(0)operator(,)ident(b)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_RESCUE)operator(()ident(b)operator(,)ident(res)operator(,)ident(e)operator(\)) ident(NEW_NODE)operator(()ident(NODE_RESCUE)operator(,)ident(b)operator(,)ident(res)operator(,)ident(e)operator(\)) +preprocessor(#define) ident(NEW_RESBODY)operator(()ident(a)operator(,)ident(ex)operator(,)ident(n)operator(\)) ident(NEW_NODE)operator(()ident(NODE_RESBODY)operator(,)ident(n)operator(,)ident(ex)operator(,)ident(a)operator(\)) +preprocessor(#define) ident(NEW_ENSURE)operator(()ident(b)operator(,)ident(en)operator(\)) ident(NEW_NODE)operator(()ident(NODE_ENSURE)operator(,)ident(b)operator(,)integer(0)operator(,)ident(en)operator(\)) +preprocessor(#define) ident(NEW_RETURN)operator(()ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_RETURN)operator(,)ident(s)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_YIELD)operator(()ident(a)operator(,)ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_YIELD)operator(,)ident(a)operator(,)integer(0)operator(,)ident(s)operator(\)) +preprocessor(#define) ident(NEW_LIST)operator(()ident(a)operator(\)) ident(NEW_ARRAY)operator(()ident(a)operator(\)) +preprocessor(#define) ident(NEW_ARRAY)operator(()ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_ARRAY)operator(,)ident(a)operator(,)integer(1)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_ZARRAY)operator((\)) ident(NEW_NODE)operator(()ident(NODE_ZARRAY)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_HASH)operator(()ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_HASH)operator(,)ident(a)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_NOT)operator(()ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_NOT)operator(,)integer(0)operator(,)ident(a)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_MASGN)operator(()ident(l)operator(,)ident(r)operator(\)) ident(NEW_NODE)operator(()ident(NODE_MASGN)operator(,)ident(l)operator(,)integer(0)operator(,)ident(r)operator(\)) +preprocessor(#define) ident(NEW_GASGN)operator(()ident(v)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_GASGN)operator(,)ident(v)operator(,)ident(val)operator(,)ident(rb_global_entry)operator(()ident(v)operator(\)\)) +preprocessor(#define) ident(NEW_LASGN)operator(()ident(v)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_LASGN)operator(,)ident(v)operator(,)ident(val)operator(,)ident(local_cnt)operator(()ident(v)operator(\)\)) +preprocessor(#define) ident(NEW_DASGN)operator(()ident(v)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DASGN)operator(,)ident(v)operator(,)ident(val)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_DASGN_CURR)operator(()ident(v)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DASGN_CURR)operator(,)ident(v)operator(,)ident(val)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_IASGN)operator(()ident(v)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_IASGN)operator(,)ident(v)operator(,)ident(val)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_CDECL)operator(()ident(v)operator(,)ident(val)operator(,)ident(path)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CDECL)operator(,)ident(v)operator(,)ident(val)operator(,)ident(path)operator(\)) +preprocessor(#define) ident(NEW_CVASGN)operator(()ident(v)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CVASGN)operator(,)ident(v)operator(,)ident(val)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_CVDECL)operator(()ident(v)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CVDECL)operator(,)ident(v)operator(,)ident(val)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_OP_ASGN1)operator(()ident(p)operator(,)ident(id)operator(,)ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_OP_ASGN1)operator(,)ident(p)operator(,)ident(id)operator(,)ident(a)operator(\)) +preprocessor(#define) ident(NEW_OP_ASGN2)operator(()ident(r)operator(,)ident(i)operator(,)ident(o)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_OP_ASGN2)operator(,)ident(r)operator(,)ident(val)operator(,)ident(NEW_OP_ASGN22)operator(()ident(i)operator(,)ident(o)operator(\)\)) +preprocessor(#define) ident(NEW_OP_ASGN22)operator(()ident(i)operator(,)ident(o)operator(\)) ident(NEW_NODE)operator(()ident(NODE_OP_ASGN2)operator(,)ident(i)operator(,)ident(o)operator(,)ident(rb_id_attrset)operator(()ident(i)operator(\)\)) +preprocessor(#define) ident(NEW_OP_ASGN_OR)operator(()ident(i)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_OP_ASGN_OR)operator(,)ident(i)operator(,)ident(val)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_OP_ASGN_AND)operator(()ident(i)operator(,)ident(val)operator(\)) ident(NEW_NODE)operator(()ident(NODE_OP_ASGN_AND)operator(,)ident(i)operator(,)ident(val)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_GVAR)operator(()ident(v)operator(\)) ident(NEW_NODE)operator(()ident(NODE_GVAR)operator(,)ident(v)operator(,)integer(0)operator(,)ident(rb_global_entry)operator(()ident(v)operator(\)\)) +preprocessor(#define) ident(NEW_LVAR)operator(()ident(v)operator(\)) ident(NEW_NODE)operator(()ident(NODE_LVAR)operator(,)ident(v)operator(,)integer(0)operator(,)ident(local_cnt)operator(()ident(v)operator(\)\)) +preprocessor(#define) ident(NEW_DVAR)operator(()ident(v)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DVAR)operator(,)ident(v)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_IVAR)operator(()ident(v)operator(\)) ident(NEW_NODE)operator(()ident(NODE_IVAR)operator(,)ident(v)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_CONST)operator(()ident(v)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CONST)operator(,)ident(v)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_CVAR)operator(()ident(v)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CVAR)operator(,)ident(v)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_NTH_REF)operator(()ident(n)operator(\)) ident(NEW_NODE)operator(()ident(NODE_NTH_REF)operator(,)integer(0)operator(,)ident(n)operator(,)ident(local_cnt)operator(()char('~')operator(\)\)) +preprocessor(#define) ident(NEW_BACK_REF)operator(()ident(n)operator(\)) ident(NEW_NODE)operator(()ident(NODE_BACK_REF)operator(,)integer(0)operator(,)ident(n)operator(,)ident(local_cnt)operator(()char('~')operator(\)\)) +preprocessor(#define) ident(NEW_MATCH)operator(()ident(c)operator(\)) ident(NEW_NODE)operator(()ident(NODE_MATCH)operator(,)ident(c)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_MATCH2)operator(()ident(n1)operator(,)ident(n2)operator(\)) ident(NEW_NODE)operator(()ident(NODE_MATCH2)operator(,)ident(n1)operator(,)ident(n2)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_MATCH3)operator(()ident(r)operator(,)ident(n2)operator(\)) ident(NEW_NODE)operator(()ident(NODE_MATCH3)operator(,)ident(r)operator(,)ident(n2)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_LIT)operator(()ident(l)operator(\)) ident(NEW_NODE)operator(()ident(NODE_LIT)operator(,)ident(l)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_STR)operator(()ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_STR)operator(,)ident(s)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_DSTR)operator(()ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DSTR)operator(,)ident(s)operator(,)integer(1)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_XSTR)operator(()ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_XSTR)operator(,)ident(s)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_DXSTR)operator(()ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DXSTR)operator(,)ident(s)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_DSYM)operator(()ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DSYM)operator(,)ident(s)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_EVSTR)operator(()ident(n)operator(\)) ident(NEW_NODE)operator(()ident(NODE_EVSTR)operator(,)integer(0)operator(,()ident(n)operator(\),)integer(0)operator(\)) +preprocessor(#define) ident(NEW_CALL)operator(()ident(r)operator(,)ident(m)operator(,)ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CALL)operator(,)ident(r)operator(,)ident(m)operator(,)ident(a)operator(\)) +preprocessor(#define) ident(NEW_FCALL)operator(()ident(m)operator(,)ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_FCALL)operator(,)integer(0)operator(,)ident(m)operator(,)ident(a)operator(\)) +preprocessor(#define) ident(NEW_VCALL)operator(()ident(m)operator(\)) ident(NEW_NODE)operator(()ident(NODE_VCALL)operator(,)integer(0)operator(,)ident(m)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_SUPER)operator(()ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_SUPER)operator(,)integer(0)operator(,)integer(0)operator(,)ident(a)operator(\)) +preprocessor(#define) ident(NEW_ZSUPER)operator((\)) ident(NEW_NODE)operator(()ident(NODE_ZSUPER)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_ARGS)operator(()ident(f)operator(,)ident(o)operator(,)ident(r)operator(\)) ident(NEW_NODE)operator(()ident(NODE_ARGS)operator(,)ident(o)operator(,)ident(r)operator(,)ident(f)operator(\)) +preprocessor(#define) ident(NEW_ARGSCAT)operator(()ident(a)operator(,)ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_ARGSCAT)operator(,)ident(a)operator(,)ident(b)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_ARGSPUSH)operator(()ident(a)operator(,)ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_ARGSPUSH)operator(,)ident(a)operator(,)ident(b)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_SPLAT)operator(()ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_SPLAT)operator(,)ident(a)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_TO_ARY)operator(()ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_TO_ARY)operator(,)ident(a)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_SVALUE)operator(()ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_SVALUE)operator(,)ident(a)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_BLOCK_ARG)operator(()ident(v)operator(\)) ident(NEW_NODE)operator(()ident(NODE_BLOCK_ARG)operator(,)ident(v)operator(,)integer(0)operator(,)ident(local_cnt)operator(()ident(v)operator(\)\)) +preprocessor(#define) ident(NEW_BLOCK_PASS)operator(()ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_BLOCK_PASS)operator(,)integer(0)operator(,)ident(b)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_ALIAS)operator(()ident(n)operator(,)ident(o)operator(\)) ident(NEW_NODE)operator(()ident(NODE_ALIAS)operator(,)ident(n)operator(,)ident(o)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_VALIAS)operator(()ident(n)operator(,)ident(o)operator(\)) ident(NEW_NODE)operator(()ident(NODE_VALIAS)operator(,)ident(n)operator(,)ident(o)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_UNDEF)operator(()ident(i)operator(\)) ident(NEW_NODE)operator(()ident(NODE_UNDEF)operator(,)integer(0)operator(,)ident(i)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_CLASS)operator(()ident(n)operator(,)ident(b)operator(,)ident(s)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CLASS)operator(,)ident(n)operator(,)ident(NEW_SCOPE)operator(()ident(b)operator(\),()ident(s)operator(\)\)) +preprocessor(#define) ident(NEW_SCLASS)operator(()ident(r)operator(,)ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_SCLASS)operator(,)ident(r)operator(,)ident(NEW_SCOPE)operator(()ident(b)operator(\),)integer(0)operator(\)) +preprocessor(#define) ident(NEW_MODULE)operator(()ident(n)operator(,)ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_MODULE)operator(,)ident(n)operator(,)ident(NEW_SCOPE)operator(()ident(b)operator(\),)integer(0)operator(\)) +preprocessor(#define) ident(NEW_COLON2)operator(()ident(c)operator(,)ident(i)operator(\)) ident(NEW_NODE)operator(()ident(NODE_COLON2)operator(,)ident(c)operator(,)ident(i)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_COLON3)operator(()ident(i)operator(\)) ident(NEW_NODE)operator(()ident(NODE_COLON3)operator(,)integer(0)operator(,)ident(i)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_CREF)operator(()ident(c)operator(,)ident(n)operator(\)) ident(NEW_NODE)operator(()ident(NODE_CREF)operator(,)ident(c)operator(,)integer(0)operator(,)ident(n)operator(\)) +preprocessor(#define) ident(NEW_DOT2)operator(()ident(b)operator(,)ident(e)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DOT2)operator(,)ident(b)operator(,)ident(e)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_DOT3)operator(()ident(b)operator(,)ident(e)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DOT3)operator(,)ident(b)operator(,)ident(e)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_ATTRSET)operator(()ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_ATTRSET)operator(,)ident(a)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_SELF)operator((\)) ident(NEW_NODE)operator(()ident(NODE_SELF)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_NIL)operator((\)) ident(NEW_NODE)operator(()ident(NODE_NIL)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_TRUE)operator((\)) ident(NEW_NODE)operator(()ident(NODE_TRUE)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_FALSE)operator((\)) ident(NEW_NODE)operator(()ident(NODE_FALSE)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_DEFINED)operator(()ident(e)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DEFINED)operator(,)ident(e)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_NEWLINE)operator(()ident(n)operator(\)) ident(NEW_NODE)operator(()ident(NODE_NEWLINE)operator(,)integer(0)operator(,)integer(0)operator(,)ident(n)operator(\)) +preprocessor(#define) ident(NEW_PREEXE)operator(()ident(b)operator(\)) ident(NEW_SCOPE)operator(()ident(b)operator(\)) +preprocessor(#define) ident(NEW_POSTEXE)operator((\)) ident(NEW_NODE)operator(()ident(NODE_POSTEXE)operator(,)integer(0)operator(,)integer(0)operator(,)integer(0)operator(\)) +preprocessor(#define) ident(NEW_DMETHOD)operator(()ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_DMETHOD)operator(,)integer(0)operator(,)integer(0)operator(,)ident(b)operator(\)) +preprocessor(#define) ident(NEW_BMETHOD)operator(()ident(b)operator(\)) ident(NEW_NODE)operator(()ident(NODE_BMETHOD)operator(,)integer(0)operator(,)integer(0)operator(,)ident(b)operator(\)) +preprocessor(#define) ident(NEW_ATTRASGN)operator(()ident(r)operator(,)ident(m)operator(,)ident(a)operator(\)) ident(NEW_NODE)operator(()ident(NODE_ATTRASGN)operator(,)ident(r)operator(,)ident(m)operator(,)ident(a)operator(\)) + +preprocessor(#define) ident(NOEX_PUBLIC) integer(0) +preprocessor(#define) ident(NOEX_NOSUPER) integer(1) +preprocessor(#define) ident(NOEX_PRIVATE) integer(2) +preprocessor(#define) ident(NOEX_PROTECTED) integer(4) +preprocessor(#define) ident(NOEX_MASK) integer(6) + +preprocessor(#define) ident(NOEX_UNDEF) ident(NOEX_NOSUPER) + +ident(NODE) operator(*)ident(rb_compile_cstr) ident(_)operator((()directive(const) pre_type(char)operator(*,) directive(const) pre_type(char)operator(*,) pre_type(int)operator(,) pre_type(int)operator(\)\);) +ident(NODE) operator(*)ident(rb_compile_string) ident(_)operator((()directive(const) pre_type(char)operator(*,) ident(VALUE)operator(,) pre_type(int)operator(\)\);) +ident(NODE) operator(*)ident(rb_compile_file) ident(_)operator((()directive(const) pre_type(char)operator(*,) ident(VALUE)operator(,) pre_type(int)operator(\)\);) + +directive(void) ident(rb_add_method) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) ident(NODE) operator(*,) pre_type(int)operator(\)\);) +ident(NODE) operator(*)ident(rb_node_newnode) ident(_)operator((()reserved(enum) ident(node_type)operator(,)ident(VALUE)operator(,)ident(VALUE)operator(,)ident(VALUE)operator(\)\);) + +ident(NODE)operator(*) ident(rb_method_node) ident(_)operator((()ident(VALUE) ident(klass)operator(,) ident(ID) ident(id)operator(\)\);) + +reserved(struct) ident(global_entry) operator(*)ident(rb_global_entry) ident(_)operator((()ident(ID)operator(\)\);) +ident(VALUE) ident(rb_gvar_get) ident(_)operator((()reserved(struct) ident(global_entry) operator(*\)\);) +ident(VALUE) ident(rb_gvar_set) ident(_)operator((()reserved(struct) ident(global_entry) operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_gvar_defined) ident(_)operator((()reserved(struct) ident(global_entry) operator(*\)\);) + +reserved(typedef) pre_type(unsigned) pre_type(int) ident(rb_event_t)operator(;) + +preprocessor(#define) ident(RUBY_EVENT_NONE) hex(0x00) +preprocessor(#define) ident(RUBY_EVENT_LINE) hex(0x01) +preprocessor(#define) ident(RUBY_EVENT_CLASS) hex(0x02) +preprocessor(#define) ident(RUBY_EVENT_END) hex(0x04) +preprocessor(#define) ident(RUBY_EVENT_CALL) hex(0x08) +preprocessor(#define) ident(RUBY_EVENT_RETURN) hex(0x10) +preprocessor(#define) ident(RUBY_EVENT_C_CALL) hex(0x20) +preprocessor(#define) ident(RUBY_EVENT_C_RETURN) hex(0x40) +preprocessor(#define) ident(RUBY_EVENT_RAISE) hex(0x80) +preprocessor(#define) ident(RUBY_EVENT_ALL) hex(0xff) + +reserved(typedef) directive(void) operator((*)ident(rb_event_hook_func_t)operator(\)) ident(_)operator((()ident(rb_event_t)operator(,)ident(NODE)operator(*,)ident(VALUE)operator(,)ident(ID)operator(,)ident(VALUE)operator(\)\);) +ident(NODE) operator(*)ident(rb_copy_node_scope) ident(_)operator((()ident(NODE) operator(*,) ident(NODE) operator(*\)\);) +directive(void) ident(rb_add_event_hook) ident(_)operator((()ident(rb_event_hook_func_t)operator(,)ident(rb_event_t)operator(\)\);) +pre_type(int) ident(rb_remove_event_hook) ident(_)operator((()ident(rb_event_hook_func_t)operator(\)\);) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_GETCONTEXT)operator(\)) operator(&&) ident(defined)operator(()ident(HAVE_SETCONTEXT)operator(\)) +preprocessor(#include) include(<ucontext.h>) +preprocessor(#define) ident(USE_CONTEXT) +preprocessor(#endif) +preprocessor(#include) include(<setjmp.h>) +preprocessor(#include) include("st.h") + +preprocessor(#ifdef) ident(USE_CONTEXT) +reserved(typedef) reserved(struct) operator({) + ident(ucontext_t) ident(context)operator(;) + directive(volatile) pre_type(int) ident(status)operator(;) +operator(}) ident(rb_jmpbuf_t)operator([)integer(1)operator(];) +preprocessor(#else) +reserved(typedef) ident(jmp_buf) ident(rb_jmpbuf_t)operator(;) +preprocessor(#endif) + +reserved(enum) ident(rb_thread_status) operator({) + ident(THREAD_TO_KILL)operator(,) + ident(THREAD_RUNNABLE)operator(,) + ident(THREAD_STOPPED)operator(,) + ident(THREAD_KILLED) +operator(};) + +reserved(typedef) reserved(struct) ident(rb_thread) operator(*)ident(rb_thread_t)operator(;) + +reserved(struct) ident(rb_thread) operator({) + ident(rb_thread_t) ident(next)operator(,) ident(prev)operator(;) + ident(rb_jmpbuf_t) ident(context)operator(;) +preprocessor(#if) operator(()ident(defined) ident(_WIN32) operator(&&) operator(!)ident(defined) ident(_WIN32_WCE)operator(\)) operator(||) ident(defined) ident(__CYGWIN__) + pre_type(unsigned) pre_type(long) ident(win32_exception_list)operator(;) +preprocessor(#endif) + + ident(VALUE) ident(result)operator(;) + + ident(size_t) ident(stk_len)operator(;) + ident(size_t) ident(stk_max)operator(;) + ident(VALUE) operator(*)ident(stk_ptr)operator(;) + ident(VALUE) operator(*)ident(stk_pos)operator(;) +preprocessor(#ifdef) ident(__ia64) + ident(size_t) ident(bstr_len)operator(;) + ident(size_t) ident(bstr_max)operator(;) + ident(VALUE) operator(*)ident(bstr_ptr)operator(;) + ident(VALUE) operator(*)ident(bstr_pos)operator(;) +preprocessor(#endif) + + reserved(struct) ident(FRAME) operator(*)ident(frame)operator(;) + reserved(struct) ident(SCOPE) operator(*)ident(scope)operator(;) + reserved(struct) ident(RVarmap) operator(*)ident(dyna_vars)operator(;) + reserved(struct) ident(BLOCK) operator(*)ident(block)operator(;) + reserved(struct) ident(iter) operator(*)ident(iter)operator(;) + reserved(struct) ident(tag) operator(*)ident(tag)operator(;) + ident(VALUE) ident(klass)operator(;) + ident(VALUE) ident(wrapper)operator(;) + ident(NODE) operator(*)ident(cref)operator(;) + + pre_type(int) ident(flags)operator(;) comment(/* misc. states (vmode/rb_trap_immediate/raised\) */) + + ident(NODE) operator(*)ident(node)operator(;) + + pre_type(int) ident(tracing)operator(;) + ident(VALUE) ident(errinfo)operator(;) + ident(VALUE) ident(last_status)operator(;) + ident(VALUE) ident(last_line)operator(;) + ident(VALUE) ident(last_match)operator(;) + + pre_type(int) ident(safe)operator(;) + + reserved(enum) ident(rb_thread_status) ident(status)operator(;) + pre_type(int) ident(wait_for)operator(;) + pre_type(int) ident(fd)operator(;) + ident(fd_set) ident(readfds)operator(;) + ident(fd_set) ident(writefds)operator(;) + ident(fd_set) ident(exceptfds)operator(;) + pre_type(int) ident(select_value)operator(;) + pre_type(double) ident(delay)operator(;) + ident(rb_thread_t) ident(join)operator(;) + + pre_type(int) ident(abort)operator(;) + pre_type(int) ident(priority)operator(;) + ident(VALUE) ident(thgroup)operator(;) + + reserved(struct) ident(st_table) operator(*)ident(locals)operator(;) + + ident(VALUE) ident(thread)operator(;) + + ident(VALUE) ident(sandbox)operator(;) +operator(};) + +directive(extern) ident(VALUE) operator((*)ident(ruby_sandbox_save)operator(\))ident(_)operator((()ident(rb_thread_t)operator(\)\);) +directive(extern) ident(VALUE) operator((*)ident(ruby_sandbox_restore)operator(\))ident(_)operator((()ident(rb_thread_t)operator(\)\);) +directive(extern) ident(rb_thread_t) ident(rb_curr_thread)operator(;) +directive(extern) ident(rb_thread_t) ident(rb_main_thread)operator(;) + +reserved(enum) operator({) + ident(RAISED_EXCEPTION) operator(=) hex(0x1000)operator(,) + ident(RAISED_STACKOVERFLOW) operator(=) hex(0x2000)operator(,) + ident(RAISED_NOMEMORY) operator(=) hex(0x4000)operator(,) + ident(RAISED_MASK) operator(=) hex(0xf000) +operator(};) +pre_type(int) ident(rb_thread_set_raised)operator(()ident(rb_thread_t) ident(th)operator(\);) +pre_type(int) ident(rb_thread_reset_raised)operator(()ident(rb_thread_t) ident(th)operator(\);) +preprocessor(#define) ident(rb_thread_raised_set)operator(()ident(th)operator(,) ident(f)operator(\)) operator((()ident(th)operator(\)->)ident(flags) operator(|=) operator(()ident(f)operator(\)\)) +preprocessor(#define) ident(rb_thread_raised_reset)operator(()ident(th)operator(,) ident(f)operator(\)) operator((()ident(th)operator(\)->)ident(flags) operator(&=) operator(~()ident(f)operator(\)\)) +preprocessor(#define) ident(rb_thread_raised_p)operator(()ident(th)operator(,) ident(f)operator(\)) operator(((()ident(th)operator(\)->)ident(flags) operator(&) operator(()ident(f)operator(\)\)) operator(!=) integer(0)operator(\)) +preprocessor(#define) ident(rb_thread_raised_clear)operator(()ident(th)operator(\)) operator(()ident(rb_thread_raised_reset)operator(()ident(th)operator(,) ident(RAISED_MASK)operator(\)\)) + +preprocessor(#if) ident(defined)operator(()ident(__cplusplus)operator(\)) +operator(}) comment(/* extern "C" { */) +preprocessor(#endif) + +preprocessor(#endif) +comment(/********************************************************************** + + re.h - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Thu Sep 30 14:18:32 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#ifndef) ident(RE_H) +preprocessor(#define) ident(RE_H) + +preprocessor(#include) include(<sys/types.h>) +preprocessor(#include) include(<stdio.h>) + +preprocessor(#include) include("regex.h") + +reserved(typedef) reserved(struct) ident(re_pattern_buffer) ident(Regexp)operator(;) + +reserved(struct) ident(RMatch) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + ident(VALUE) ident(str)operator(;) + reserved(struct) ident(re_registers) operator(*)ident(regs)operator(;) +operator(};) + +preprocessor(#define) ident(RMATCH)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RMatch)operator(\)()ident(obj)operator(\)\)) + +ident(VALUE) ident(rb_reg_regcomp) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(long) ident(rb_reg_search) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) pre_type(long)operator(,) pre_type(long)operator(\)\);) +ident(VALUE) ident(rb_reg_regsub) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) reserved(struct) ident(re_registers) operator(*\)\);) +pre_type(long) ident(rb_reg_adjust_startpos) ident(_)operator((()ident(VALUE)operator(,) ident(VALUE)operator(,) pre_type(long)operator(,) pre_type(long)operator(\)\);) +directive(void) ident(rb_match_busy) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_reg_quote) ident(_)operator((()ident(VALUE)operator(\)\);) + +ident(RUBY_EXTERN) pre_type(int) ident(ruby_ignorecase)operator(;) + +pre_type(int) ident(rb_reg_mbclen2) ident(_)operator((()pre_type(unsigned) pre_type(int)operator(,) ident(VALUE)operator(\)\);) +preprocessor(#define) ident(mbclen2)operator(()ident(c)operator(,)ident(re)operator(\)) ident(rb_reg_mbclen2)operator((()ident(c)operator(\),()ident(re)operator(\)\)) +preprocessor(#endif) +comment(/* Definitions for data structures and routines for the regular + expression library, version 0.12. + Copyright (C\) 1985,89,90,91,92,93,95,96,97,98 Free Software Foundation, Inc. + + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option\) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file LGPL. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */) +comment(/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto\) + Last change: May 21, 1993 by t^2 */) +comment(/* modified for Ruby by matz@netlab.co.jp */) + +preprocessor(#ifndef) ident(REGEX_H) +preprocessor(#define) ident(REGEX_H) + +comment(/* symbol mangling for ruby */) +preprocessor(#ifdef) ident(RUBY) +preprocessor(# define) ident(re_adjust_startpos) ident(ruby_re_adjust_startpos) +preprocessor(# define) ident(re_compile_fastmap) ident(ruby_re_compile_fastmap) +preprocessor(# define) ident(re_compile_pattern) ident(ruby_re_compile_pattern) +preprocessor(# define) ident(re_copy_registers) ident(ruby_re_copy_registers) +preprocessor(# define) ident(re_free_pattern) ident(ruby_re_free_pattern) +preprocessor(# define) ident(re_free_registers) ident(ruby_re_free_registers) +preprocessor(# define) ident(re_match) ident(ruby_re_match) +preprocessor(# define) ident(re_mbcinit) ident(ruby_re_mbcinit) +preprocessor(# define) ident(re_search) ident(ruby_re_search) +preprocessor(# define) ident(re_set_casetable) ident(ruby_re_set_casetable) +preprocessor(# define) ident(register_info_type) ident(ruby_register_info_type) +preprocessor(#endif) + +preprocessor(#include) include(<stddef.h>) + +comment(/* Define number of parens for which we record the beginnings and ends. + This affects how much space the `struct re_registers' type takes up. */) +preprocessor(#ifndef) ident(RE_NREGS) +preprocessor(#define) ident(RE_NREGS) integer(10) +preprocessor(#endif) + +preprocessor(#define) ident(BYTEWIDTH) integer(8) + +preprocessor(#define) ident(RE_REG_MAX) operator((()integer(1)operator(<<)ident(BYTEWIDTH)operator(\)-)integer(1)operator(\)) + +comment(/* Maximum number of duplicates an interval can allow. */) +preprocessor(#ifndef) ident(RE_DUP_MAX) +preprocessor(#define) ident(RE_DUP_MAX) operator((()integer(1) operator(<<) integer(15)operator(\)) operator(-) integer(1)operator(\)) +preprocessor(#endif) + + +comment(/* If this bit is set, then character classes are supported; they are: + [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], + [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. + If not set, then character classes are not supported. */) +preprocessor(#define) ident(RE_CHAR_CLASSES) operator(()integer(1L) operator(<<) integer(9)operator(\)) + +comment(/* match will be done case insensetively */) +preprocessor(#define) ident(RE_OPTION_IGNORECASE) operator(()integer(1L)operator(\)) +comment(/* perl-style extended pattern available */) +preprocessor(#define) ident(RE_OPTION_EXTENDED) operator(()ident(RE_OPTION_IGNORECASE)operator(<<)integer(1)operator(\)) +comment(/* newline will be included for . */) +preprocessor(#define) ident(RE_OPTION_MULTILINE) operator(()ident(RE_OPTION_EXTENDED)operator(<<)integer(1)operator(\)) +comment(/* ^ and $ ignore newline */) +preprocessor(#define) ident(RE_OPTION_SINGLELINE) operator(()ident(RE_OPTION_MULTILINE)operator(<<)integer(1)operator(\)) +comment(/* search for longest match, in accord with POSIX regexp */) +preprocessor(#define) ident(RE_OPTION_LONGEST) operator(()ident(RE_OPTION_SINGLELINE)operator(<<)integer(1)operator(\)) + +preprocessor(#define) ident(RE_MAY_IGNORECASE) operator(()ident(RE_OPTION_LONGEST)operator(<<)integer(1)operator(\)) +preprocessor(#define) ident(RE_OPTIMIZE_ANCHOR) operator(()ident(RE_MAY_IGNORECASE)operator(<<)integer(1)operator(\)) +preprocessor(#define) ident(RE_OPTIMIZE_EXACTN) operator(()ident(RE_OPTIMIZE_ANCHOR)operator(<<)integer(1)operator(\)) +preprocessor(#define) ident(RE_OPTIMIZE_NO_BM) operator(()ident(RE_OPTIMIZE_EXACTN)operator(<<)integer(1)operator(\)) +preprocessor(#define) ident(RE_OPTIMIZE_BMATCH) operator(()ident(RE_OPTIMIZE_NO_BM)operator(<<)integer(1)operator(\)) + +comment(/* For multi-byte char support */) +preprocessor(#define) ident(MBCTYPE_ASCII) integer(0) +preprocessor(#define) ident(MBCTYPE_EUC) integer(1) +preprocessor(#define) ident(MBCTYPE_SJIS) integer(2) +preprocessor(#define) ident(MBCTYPE_UTF8) integer(3) + +directive(extern) +preprocessor(#if) ident(defined) ident(_WIN32) operator(&&) operator(!)ident(defined) ident(__GNUC__) operator(&&) operator(!)ident(defined) ident(RUBY_EXPORT) +ident(__declspec)operator(()ident(dllimport)operator(\)) +preprocessor(# endif) +directive(const) pre_type(unsigned) pre_type(char) operator(*)ident(re_mbctab)operator(;) +preprocessor(#if) ident(defined)operator(()ident(__STDC__)operator(\)) +directive(void) ident(re_mbcinit) operator(()pre_type(int)operator(\);) +preprocessor(#else) +directive(void) ident(re_mbcinit) operator((\);) +preprocessor(#endif) + +preprocessor(#undef) ident(ismbchar) +preprocessor(#define) ident(ismbchar)operator(()ident(c)operator(\)) ident(re_mbctab)operator([()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)]) +preprocessor(#define) ident(mbclen)operator(()ident(c)operator(\)) operator(()ident(re_mbctab)operator([()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)]+)integer(1)operator(\)) + +comment(/* Structure used in re_match(\) */) + +reserved(typedef) reserved(union) +operator({) + pre_type(unsigned) pre_type(char) operator(*)ident(word)operator(;) + reserved(struct) operator({) + pre_type(unsigned) ident(is_active) operator(:) integer(1)operator(;) + pre_type(unsigned) ident(matched_something) operator(:) integer(1)operator(;) + operator(}) ident(bits)operator(;) +operator(}) ident(register_info_type)operator(;) + +comment(/* This data structure is used to represent a compiled pattern. */) + +reserved(struct) ident(re_pattern_buffer) + operator({) + pre_type(char) operator(*)ident(buffer)operator(;) comment(/* Space holding the compiled pattern commands. */) + pre_type(int) ident(allocated)operator(;) comment(/* Size of space that `buffer' points to. */) + pre_type(int) ident(used)operator(;) comment(/* Length of portion of buffer actually occupied */) + pre_type(char) operator(*)ident(fastmap)operator(;) comment(/* Pointer to fastmap, if any, or zero if none. */) + comment(/* re_search uses the fastmap, if there is one, + to skip over totally implausible characters. */) + pre_type(char) operator(*)ident(must)operator(;) comment(/* Pointer to exact pattern which strings should have + to be matched. */) + pre_type(int) operator(*)ident(must_skip)operator(;) comment(/* Pointer to exact pattern skip table for bm_search */) + pre_type(long) ident(options)operator(;) comment(/* Flags for options such as extended_pattern. */) + pre_type(long) ident(re_nsub)operator(;) comment(/* Number of subexpressions found by the compiler. */) + pre_type(char) ident(fastmap_accurate)operator(;) + comment(/* Set to zero when a new pattern is stored, + set to one when the fastmap is updated from it. */) + pre_type(char) ident(can_be_null)operator(;) comment(/* Set to one by compiling fastmap + if this pattern might match the null string. + It does not necessarily match the null string + in that case, but if this is zero, it cannot. + 2 as value means can match null string + but at end of range or before a character + listed in the fastmap. */) + + comment(/* stack & working area for re_match(\) */) + pre_type(unsigned) pre_type(char) operator(**)ident(regstart)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(regend)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(old_regstart)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(old_regend)operator(;) + ident(register_info_type) operator(*)ident(reg_info)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(best_regstart)operator(;) + pre_type(unsigned) pre_type(char) operator(**)ident(best_regend)operator(;) + operator(};) + +reserved(typedef) reserved(struct) ident(re_pattern_buffer) ident(regex_t)operator(;) + +comment(/* Structure to store register contents data in. + + Pass the address of such a structure as an argument to re_match, etc., + if you want this information back. + + For i from 1 to RE_NREGS - 1, start[i] records the starting index in + the string of where the ith subexpression matched, and end[i] records + one after the ending index. start[0] and end[0] are analogous, for + the entire pattern. */) + +reserved(struct) ident(re_registers) + operator({) + pre_type(int) ident(allocated)operator(;) + pre_type(int) ident(num_regs)operator(;) + pre_type(int) operator(*)ident(beg)operator(;) + pre_type(int) operator(*)ident(end)operator(;) + operator(};) + +comment(/* Type for byte offsets within the string. POSIX mandates this. */) +reserved(typedef) ident(size_t) ident(regoff_t)operator(;) + +comment(/* POSIX specification for registers. Aside from the different names than + `re_registers', POSIX uses an array of structures, instead of a + structure of arrays. */) +reserved(typedef) reserved(struct) +operator({) + ident(regoff_t) ident(rm_so)operator(;) comment(/* Byte offset from string's start to substring's start. */) + ident(regoff_t) ident(rm_eo)operator(;) comment(/* Byte offset from string's start to substring's end. */) +operator(}) ident(regmatch_t)operator(;) + +preprocessor(#ifdef) ident(__STDC__) + +directive(extern) pre_type(char) operator(*)ident(re_compile_pattern) operator(()directive(const) pre_type(char) operator(*,) pre_type(int)operator(,) reserved(struct) ident(re_pattern_buffer) operator(*\);) +directive(void) ident(re_free_pattern) operator(()reserved(struct) ident(re_pattern_buffer) operator(*\);) +comment(/* Is this really advertised? */) +directive(extern) pre_type(int) ident(re_adjust_startpos) operator(()reserved(struct) ident(re_pattern_buffer) operator(*,) directive(const) pre_type(char)operator(*,) pre_type(int)operator(,) pre_type(int)operator(,) pre_type(int)operator(\);) +directive(extern) directive(void) ident(re_compile_fastmap) operator(()reserved(struct) ident(re_pattern_buffer) operator(*\);) +directive(extern) pre_type(int) ident(re_search) operator(()reserved(struct) ident(re_pattern_buffer) operator(*,) directive(const) pre_type(char)operator(*,) pre_type(int)operator(,) pre_type(int)operator(,) pre_type(int)operator(,) + reserved(struct) ident(re_registers) operator(*\);) +directive(extern) pre_type(int) ident(re_match) operator(()reserved(struct) ident(re_pattern_buffer) operator(*,) directive(const) pre_type(char) operator(*,) pre_type(int)operator(,) pre_type(int)operator(,) + reserved(struct) ident(re_registers) operator(*\);) +directive(extern) directive(void) ident(re_set_casetable) operator(()directive(const) pre_type(char) operator(*)ident(table)operator(\);) +directive(extern) directive(void) ident(re_copy_registers) operator(()reserved(struct) ident(re_registers)operator(*,) reserved(struct) ident(re_registers)operator(*\);) +directive(extern) directive(void) ident(re_free_registers) operator(()reserved(struct) ident(re_registers)operator(*\);) + +preprocessor(#ifndef) ident(RUBY) +comment(/* 4.2 bsd compatibility. */) +directive(extern) pre_type(char) operator(*)ident(re_comp) operator(()directive(const) pre_type(char) operator(*\);) +directive(extern) pre_type(int) ident(re_exec) operator(()directive(const) pre_type(char) operator(*\);) +preprocessor(#endif) + +preprocessor(#else) comment(/* !__STDC__ */) + +directive(extern) pre_type(char) operator(*)ident(re_compile_pattern) operator((\);) +directive(void) ident(re_free_regexp) operator((\);) +comment(/* Is this really advertised? */) +directive(extern) pre_type(int) ident(re_adjust_startpos) operator((\);) +directive(extern) directive(void) ident(re_compile_fastmap) operator((\);) +directive(extern) pre_type(int) ident(re_search) operator((\);) +directive(extern) pre_type(int) ident(re_match) operator((\);) +directive(extern) directive(void) ident(re_set_casetable) operator((\);) +directive(extern) directive(void) ident(re_copy_registers) operator((\);) +directive(extern) directive(void) ident(re_free_registers) operator((\);) + +preprocessor(#endif) comment(/* __STDC__ */) + +preprocessor(#endif) comment(/* !REGEX_H */) +comment(/********************************************************************** + + ruby.h - + + $Author: shyouhei $ + created at: Thu Jun 10 14:26:32 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + Copyright (C\) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C\) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/) + +preprocessor(#ifndef) ident(RUBY_H) +preprocessor(#define) ident(RUBY_H) + +preprocessor(#if) ident(defined)operator(()ident(__cplusplus)operator(\)) +directive(extern) string<delimiter(")content(C)delimiter(")> operator({) +comment(#if 0 +} /* satisfy cc-mode */ +#endif) +preprocessor(#endif) + +preprocessor(#include) include("config.h") +preprocessor(#ifdef) ident(RUBY_EXTCONF_H) +preprocessor(#include) ident(RUBY_EXTCONF_H) +preprocessor(#endif) + +preprocessor(#define) ident(NORETURN_STYLE_NEW) integer(1) +preprocessor(#ifndef) ident(NORETURN) +preprocessor(# define) ident(NORETURN)operator(()ident(x)operator(\)) ident(x) +preprocessor(#endif) +preprocessor(#ifndef) ident(NOINLINE) +preprocessor(# define) ident(NOINLINE)operator(()ident(x)operator(\)) ident(x) +preprocessor(#endif) + +preprocessor(#include) include("defines.h") + +preprocessor(#ifdef) ident(HAVE_STDLIB_H) +preprocessor(# include) include(<stdlib.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_STRING_H) +preprocessor(# include) include(<string.h>) +preprocessor(#else) +preprocessor(# include) include(<strings.h>) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_INTRINSICS_H) +preprocessor(# include) include(<intrinsics.h>) +preprocessor(#endif) + +preprocessor(#include) include(<stddef.h>) +preprocessor(#include) include(<stdio.h>) + +comment(/* need to include <ctype.h> to use these macros */) +preprocessor(#ifndef) ident(ISPRINT) +preprocessor(#define) ident(ISASCII)operator(()ident(c)operator(\)) ident(isascii)operator((()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)) +preprocessor(#undef) ident(ISPRINT) +preprocessor(#define) ident(ISPRINT)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isprint)operator((()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)\)) +preprocessor(#define) ident(ISSPACE)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isspace)operator((()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)\)) +preprocessor(#define) ident(ISUPPER)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isupper)operator((()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)\)) +preprocessor(#define) ident(ISLOWER)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(islower)operator((()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)\)) +preprocessor(#define) ident(ISALNUM)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isalnum)operator((()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)\)) +preprocessor(#define) ident(ISALPHA)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isalpha)operator((()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)\)) +preprocessor(#define) ident(ISDIGIT)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isdigit)operator((()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)\)) +preprocessor(#define) ident(ISXDIGIT)operator(()ident(c)operator(\)) operator(()ident(ISASCII)operator(()ident(c)operator(\)) operator(&&) ident(isxdigit)operator((()pre_type(int)operator(\)()pre_type(unsigned) pre_type(char)operator(\)()ident(c)operator(\)\)\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_ALLOCA_H)operator(\)) +preprocessor(#include) include(<alloca.h>) +preprocessor(#else) +preprocessor(# ifdef) ident(_AIX) +preprocessor(#pragma) ident(alloca) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__VMS)operator(\)) +preprocessor(# pragma) ident(builtins) +preprocessor(# define) ident(alloca) ident(__alloca) +preprocessor(#endif) + +preprocessor(#if) ident(SIZEOF_LONG) operator(!=) ident(SIZEOF_VOIDP) +preprocessor(# error) operator(---->>) ident(ruby) ident(requires) reserved(sizeof)operator(()directive(void)operator(*\)) operator(==) reserved(sizeof)operator(()pre_type(long)operator(\)) ident(to) ident(be) ident(compiled)operator(.) operator(<<----) +preprocessor(#else) +reserved(typedef) pre_type(unsigned) pre_type(long) ident(VALUE)operator(;) +reserved(typedef) pre_type(unsigned) pre_type(long) ident(ID)operator(;) +preprocessor(#endif) + +preprocessor(#ifdef) ident(__STDC__) +preprocessor(# include) include(<limits.h>) +preprocessor(#else) +preprocessor(# ifndef) ident(LONG_MAX) +preprocessor(# ifdef) ident(HAVE_LIMITS_H) +preprocessor(# include) include(<limits.h>) +preprocessor(# else) + comment(/* assuming 32bit(2's compliment\) long */) +preprocessor(# define) ident(LONG_MAX) integer(2147483647) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# ifndef) ident(LONG_MIN) +preprocessor(# define) ident(LONG_MIN) operator((-)ident(LONG_MAX)operator(-)integer(1)operator(\)) +preprocessor(# endif) +preprocessor(# ifndef) ident(CHAR_BIT) +preprocessor(# define) ident(CHAR_BIT) integer(8) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_LONG_LONG) +preprocessor(# ifndef) ident(LLONG_MAX) +preprocessor(# ifdef) ident(LONG_LONG_MAX) +preprocessor(# define) ident(LLONG_MAX) ident(LONG_LONG_MAX) +preprocessor(# else) +preprocessor(# ifdef) ident(_I64_MAX) +preprocessor(# define) ident(LLONG_MAX) ident(_I64_MAX) +preprocessor(# else) + comment(/* assuming 64bit(2's complement\) long long */) +preprocessor(# define) ident(LLONG_MAX) integer(9223372036854775807LL) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# ifndef) ident(LLONG_MIN) +preprocessor(# ifdef) ident(LONG_LONG_MIN) +preprocessor(# define) ident(LLONG_MIN) ident(LONG_LONG_MIN) +preprocessor(# else) +preprocessor(# ifdef) ident(_I64_MIN) +preprocessor(# define) ident(LLONG_MIN) ident(_I64_MIN) +preprocessor(# else) +preprocessor(# define) ident(LLONG_MIN) operator((-)ident(LLONG_MAX)operator(-)integer(1)operator(\)) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(# endif) +preprocessor(#endif) + +preprocessor(#define) ident(FIXNUM_MAX) operator(()ident(LONG_MAX)operator(>>)integer(1)operator(\)) +preprocessor(#define) ident(FIXNUM_MIN) ident(RSHIFT)operator((()pre_type(long)operator(\))ident(LONG_MIN)operator(,)integer(1)operator(\)) + +preprocessor(#define) ident(FIXNUM_FLAG) hex(0x01) +preprocessor(#define) ident(INT2FIX)operator(()ident(i)operator(\)) operator((()ident(VALUE)operator(\)((()pre_type(long)operator(\)()ident(i)operator(\)\)<<)integer(1) operator(|) ident(FIXNUM_FLAG)operator(\)\)) +preprocessor(#define) ident(LONG2FIX)operator(()ident(i)operator(\)) ident(INT2FIX)operator(()ident(i)operator(\)) +preprocessor(#define) ident(rb_fix_new)operator(()ident(v)operator(\)) ident(INT2FIX)operator(()ident(v)operator(\)) +ident(VALUE) ident(rb_int2inum) ident(_)operator((()pre_type(long)operator(\)\);) +preprocessor(#define) ident(INT2NUM)operator(()ident(v)operator(\)) ident(rb_int2inum)operator(()ident(v)operator(\)) +preprocessor(#define) ident(LONG2NUM)operator(()ident(v)operator(\)) ident(INT2NUM)operator(()ident(v)operator(\)) +preprocessor(#define) ident(rb_int_new)operator(()ident(v)operator(\)) ident(rb_int2inum)operator(()ident(v)operator(\)) +ident(VALUE) ident(rb_uint2inum) ident(_)operator((()pre_type(unsigned) pre_type(long)operator(\)\);) +preprocessor(#define) ident(UINT2NUM)operator(()ident(v)operator(\)) ident(rb_uint2inum)operator(()ident(v)operator(\)) +preprocessor(#define) ident(ULONG2NUM)operator(()ident(v)operator(\)) ident(UINT2NUM)operator(()ident(v)operator(\)) +preprocessor(#define) ident(rb_uint_new)operator(()ident(v)operator(\)) ident(rb_uint2inum)operator(()ident(v)operator(\)) + +preprocessor(#ifdef) ident(HAVE_LONG_LONG) +ident(VALUE) ident(rb_ll2inum) ident(_)operator((()ident(LONG_LONG)operator(\)\);) +preprocessor(#define) ident(LL2NUM)operator(()ident(v)operator(\)) ident(rb_ll2inum)operator(()ident(v)operator(\)) +ident(VALUE) ident(rb_ull2inum) ident(_)operator((()pre_type(unsigned) ident(LONG_LONG)operator(\)\);) +preprocessor(#define) ident(ULL2NUM)operator(()ident(v)operator(\)) ident(rb_ull2inum)operator(()ident(v)operator(\)) +preprocessor(#endif) + +preprocessor(#if) ident(SIZEOF_OFF_T) operator(>) ident(SIZEOF_LONG) operator(&&) ident(defined)operator(()ident(HAVE_LONG_LONG)operator(\)) +preprocessor(# define) ident(OFFT2NUM)operator(()ident(v)operator(\)) ident(LL2NUM)operator(()ident(v)operator(\)) +preprocessor(#elif) ident(SIZEOF_OFF_T) operator(==) ident(SIZEOF_LONG) +preprocessor(# define) ident(OFFT2NUM)operator(()ident(v)operator(\)) ident(LONG2NUM)operator(()ident(v)operator(\)) +preprocessor(#else) +preprocessor(# define) ident(OFFT2NUM)operator(()ident(v)operator(\)) ident(INT2NUM)operator(()ident(v)operator(\)) +preprocessor(#endif) + +preprocessor(#define) ident(FIX2LONG)operator(()ident(x)operator(\)) ident(RSHIFT)operator((()pre_type(long)operator(\))ident(x)operator(,)integer(1)operator(\)) +preprocessor(#define) ident(FIX2ULONG)operator(()ident(x)operator(\)) operator(((()pre_type(unsigned) pre_type(long)operator(\)()ident(x)operator(\)\)>>)integer(1)operator(\)) +preprocessor(#define) ident(FIXNUM_P)operator(()ident(f)operator(\)) operator(((()pre_type(long)operator(\)()ident(f)operator(\)\)&)ident(FIXNUM_FLAG)operator(\)) +preprocessor(#define) ident(POSFIXABLE)operator(()ident(f)operator(\)) operator((()ident(f)operator(\)) operator(<) ident(FIXNUM_MAX)operator(+)integer(1)operator(\)) +preprocessor(#define) ident(NEGFIXABLE)operator(()ident(f)operator(\)) operator((()ident(f)operator(\)) operator(>=) ident(FIXNUM_MIN)operator(\)) +preprocessor(#define) ident(FIXABLE)operator(()ident(f)operator(\)) operator(()ident(POSFIXABLE)operator(()ident(f)operator(\)) operator(&&) ident(NEGFIXABLE)operator(()ident(f)operator(\)\)) + +preprocessor(#define) ident(IMMEDIATE_MASK) hex(0x03) +preprocessor(#define) ident(IMMEDIATE_P)operator(()ident(x)operator(\)) operator((()ident(VALUE)operator(\)()ident(x)operator(\)) operator(&) ident(IMMEDIATE_MASK)operator(\)) + +preprocessor(#define) ident(SYMBOL_FLAG) hex(0x0e) +preprocessor(#define) ident(SYMBOL_P)operator(()ident(x)operator(\)) operator(((()ident(VALUE)operator(\)()ident(x)operator(\)&)hex(0xff)operator(\)==)ident(SYMBOL_FLAG)operator(\)) +preprocessor(#define) ident(ID2SYM)operator(()ident(x)operator(\)) operator((()ident(VALUE)operator(\)((()pre_type(long)operator(\)()ident(x)operator(\)\)<<)integer(8)operator(|)ident(SYMBOL_FLAG)operator(\)\)) +preprocessor(#define) ident(SYM2ID)operator(()ident(x)operator(\)) ident(RSHIFT)operator((()pre_type(unsigned) pre_type(long)operator(\))ident(x)operator(,)integer(8)operator(\)) + +comment(/* special contants - i.e. non-zero and non-fixnum constants */) +preprocessor(#define) ident(Qfalse) operator((()ident(VALUE)operator(\))integer(0)operator(\)) +preprocessor(#define) ident(Qtrue) operator((()ident(VALUE)operator(\))integer(2)operator(\)) +preprocessor(#define) ident(Qnil) operator((()ident(VALUE)operator(\))integer(4)operator(\)) +preprocessor(#define) ident(Qundef) operator((()ident(VALUE)operator(\))integer(6)operator(\)) comment(/* undefined value for placeholder */) + +preprocessor(#define) ident(RTEST)operator(()ident(v)operator(\)) operator(((()ident(VALUE)operator(\)()ident(v)operator(\)) operator(&) operator(~)ident(Qnil)operator(\)) operator(!=) integer(0)operator(\)) +preprocessor(#define) ident(NIL_P)operator(()ident(v)operator(\)) operator((()ident(VALUE)operator(\)()ident(v)operator(\)) operator(==) ident(Qnil)operator(\)) + +preprocessor(#define) ident(CLASS_OF)operator(()ident(v)operator(\)) ident(rb_class_of)operator((()ident(VALUE)operator(\)()ident(v)operator(\)\)) + +preprocessor(#define) ident(T_NONE) hex(0x00) + +preprocessor(#define) ident(T_NIL) hex(0x01) +preprocessor(#define) ident(T_OBJECT) hex(0x02) +preprocessor(#define) ident(T_CLASS) hex(0x03) +preprocessor(#define) ident(T_ICLASS) hex(0x04) +preprocessor(#define) ident(T_MODULE) hex(0x05) +preprocessor(#define) ident(T_FLOAT) hex(0x06) +preprocessor(#define) ident(T_STRING) hex(0x07) +preprocessor(#define) ident(T_REGEXP) hex(0x08) +preprocessor(#define) ident(T_ARRAY) hex(0x09) +preprocessor(#define) ident(T_FIXNUM) hex(0x0a) +preprocessor(#define) ident(T_HASH) hex(0x0b) +preprocessor(#define) ident(T_STRUCT) hex(0x0c) +preprocessor(#define) ident(T_BIGNUM) hex(0x0d) +preprocessor(#define) ident(T_FILE) hex(0x0e) + +preprocessor(#define) ident(T_TRUE) hex(0x20) +preprocessor(#define) ident(T_FALSE) hex(0x21) +preprocessor(#define) ident(T_DATA) hex(0x22) +preprocessor(#define) ident(T_MATCH) hex(0x23) +preprocessor(#define) ident(T_SYMBOL) hex(0x24) + +preprocessor(#define) ident(T_BLKTAG) hex(0x3b) +preprocessor(#define) ident(T_UNDEF) hex(0x3c) +preprocessor(#define) ident(T_VARMAP) hex(0x3d) +preprocessor(#define) ident(T_SCOPE) hex(0x3e) +preprocessor(#define) ident(T_NODE) hex(0x3f) + +preprocessor(#define) ident(T_MASK) hex(0x3f) + +preprocessor(#define) ident(BUILTIN_TYPE)operator(()ident(x)operator(\)) operator(((()reserved(struct) ident(RBasic)operator(*\)()ident(x)operator(\)\)->)ident(flags) operator(&) ident(T_MASK)operator(\)) + +preprocessor(#define) ident(TYPE)operator(()ident(x)operator(\)) ident(rb_type)operator((()ident(VALUE)operator(\)()ident(x)operator(\)\)) + +directive(void) ident(rb_check_type) ident(_)operator((()ident(VALUE)operator(,)pre_type(int)operator(\)\);) +preprocessor(#define) ident(Check_Type)operator(()ident(v)operator(,)ident(t)operator(\)) ident(rb_check_type)operator((()ident(VALUE)operator(\)()ident(v)operator(\),)ident(t)operator(\)) + +ident(VALUE) ident(rb_str_to_str) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_string_value) ident(_)operator((()directive(volatile) ident(VALUE)operator(*\)\);) +pre_type(char) operator(*)ident(rb_string_value_ptr) ident(_)operator((()directive(volatile) ident(VALUE)operator(*\)\);) +pre_type(char) operator(*)ident(rb_string_value_cstr) ident(_)operator((()directive(volatile) ident(VALUE)operator(*\)\);) + +preprocessor(#define) ident(StringValue)operator(()ident(v)operator(\)) ident(rb_string_value)operator((&()ident(v)operator(\)\)) +preprocessor(#define) ident(StringValuePtr)operator(()ident(v)operator(\)) ident(rb_string_value_ptr)operator((&()ident(v)operator(\)\)) +preprocessor(#define) ident(StringValueCStr)operator(()ident(v)operator(\)) ident(rb_string_value_cstr)operator((&()ident(v)operator(\)\)) + +directive(void) ident(rb_check_safe_obj) ident(_)operator((()ident(VALUE)operator(\)\);) +directive(void) ident(rb_check_safe_str) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#define) ident(SafeStringValue)operator(()ident(v)operator(\)) reserved(do) operator({)\ + ident(StringValue)operator(()ident(v)operator(\);)\ + ident(rb_check_safe_obj)operator(()ident(v)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +comment(/* obsolete macro - use SafeStringValue(v\) */) +preprocessor(#define) ident(Check_SafeStr)operator(()ident(v)operator(\)) ident(rb_check_safe_str)operator((()ident(VALUE)operator(\)()ident(v)operator(\)\)) + +directive(void) ident(rb_secure) ident(_)operator((()pre_type(int)operator(\)\);) +ident(RUBY_EXTERN) pre_type(int) ident(ruby_safe_level)operator(;) +preprocessor(#define) ident(rb_safe_level)operator((\)) operator(()ident(ruby_safe_level)operator(\)) +directive(void) ident(rb_set_safe_level) ident(_)operator((()pre_type(int)operator(\)\);) +directive(void) ident(rb_secure_update) ident(_)operator((()ident(VALUE)operator(\)\);) + +pre_type(long) ident(rb_num2long) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(unsigned) pre_type(long) ident(rb_num2ulong) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#define) ident(NUM2LONG)operator(()ident(x)operator(\)) operator(()ident(FIXNUM_P)operator(()ident(x)operator(\)?)ident(FIX2LONG)operator(()ident(x)operator(\):)ident(rb_num2long)operator((()ident(VALUE)operator(\))ident(x)operator(\)\)) +preprocessor(#define) ident(NUM2ULONG)operator(()ident(x)operator(\)) ident(rb_num2ulong)operator((()ident(VALUE)operator(\))ident(x)operator(\)) +preprocessor(#if) ident(SIZEOF_INT) operator(<) ident(SIZEOF_LONG) +pre_type(long) ident(rb_num2int) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#define) ident(NUM2INT)operator(()ident(x)operator(\)) operator(()ident(FIXNUM_P)operator(()ident(x)operator(\)?)ident(FIX2INT)operator(()ident(x)operator(\):)ident(rb_num2int)operator((()ident(VALUE)operator(\))ident(x)operator(\)\)) +pre_type(long) ident(rb_fix2int) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#define) ident(FIX2INT)operator(()ident(x)operator(\)) ident(rb_fix2int)operator((()ident(VALUE)operator(\))ident(x)operator(\)) +pre_type(unsigned) pre_type(long) ident(rb_num2uint) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#define) ident(NUM2UINT)operator(()ident(x)operator(\)) ident(rb_num2uint)operator(()ident(x)operator(\)) +pre_type(unsigned) pre_type(long) ident(rb_fix2uint) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#define) ident(FIX2UINT)operator(()ident(x)operator(\)) ident(rb_fix2uint)operator(()ident(x)operator(\)) +preprocessor(#else) +preprocessor(#define) ident(NUM2INT)operator(()ident(x)operator(\)) operator((()pre_type(int)operator(\))ident(NUM2LONG)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(NUM2UINT)operator(()ident(x)operator(\)) operator((()pre_type(unsigned) pre_type(int)operator(\))ident(NUM2ULONG)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(FIX2INT)operator(()ident(x)operator(\)) operator((()pre_type(int)operator(\))ident(FIX2LONG)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(FIX2UINT)operator(()ident(x)operator(\)) operator((()pre_type(unsigned) pre_type(int)operator(\))ident(FIX2ULONG)operator(()ident(x)operator(\)\)) +preprocessor(#endif) + +preprocessor(#ifdef) ident(HAVE_LONG_LONG) +ident(LONG_LONG) ident(rb_num2ll) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(unsigned) ident(LONG_LONG) ident(rb_num2ull) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(# define) ident(NUM2LL)operator(()ident(x)operator(\)) operator(()ident(FIXNUM_P)operator(()ident(x)operator(\)?)ident(FIX2LONG)operator(()ident(x)operator(\):)ident(rb_num2ll)operator((()ident(VALUE)operator(\))ident(x)operator(\)\)) +preprocessor(# define) ident(NUM2ULL)operator(()ident(x)operator(\)) ident(rb_num2ull)operator((()ident(VALUE)operator(\))ident(x)operator(\)) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_LONG_LONG)operator(\)) operator(&&) ident(SIZEOF_OFF_T) operator(>) ident(SIZEOF_LONG) +preprocessor(# define) ident(NUM2OFFT)operator(()ident(x)operator(\)) operator((()ident(off_t)operator(\))ident(NUM2LL)operator(()ident(x)operator(\)\)) +preprocessor(#else) +preprocessor(# define) ident(NUM2OFFT)operator(()ident(x)operator(\)) ident(NUM2LONG)operator(()ident(x)operator(\)) +preprocessor(#endif) + +pre_type(double) ident(rb_num2dbl) ident(_)operator((()ident(VALUE)operator(\)\);) +preprocessor(#define) ident(NUM2DBL)operator(()ident(x)operator(\)) ident(rb_num2dbl)operator((()ident(VALUE)operator(\)()ident(x)operator(\)\)) + +comment(/* obsolete API - use StringValue(\) */) +pre_type(char) operator(*)ident(rb_str2cstr) ident(_)operator((()ident(VALUE)operator(,)pre_type(long)operator(*\)\);) +comment(/* obsolete API - use StringValuePtr(\) */) +preprocessor(#define) ident(STR2CSTR)operator(()ident(x)operator(\)) ident(rb_str2cstr)operator((()ident(VALUE)operator(\)()ident(x)operator(\),)integer(0)operator(\)) + +preprocessor(#define) ident(NUM2CHR)operator(()ident(x)operator(\)) operator(((()ident(TYPE)operator(()ident(x)operator(\)) operator(==) ident(T_STRING)operator(\)&&()ident(RSTRING)operator(()ident(x)operator(\)->)ident(len)operator(>=)integer(1)operator(\)\)?)\ + ident(RSTRING)operator(()ident(x)operator(\)->)ident(ptr)operator([)integer(0)operator(]:()pre_type(char)operator(\)()ident(NUM2INT)operator(()ident(x)operator(\)&)hex(0xff)operator(\)\)) +preprocessor(#define) ident(CHR2FIX)operator(()ident(x)operator(\)) ident(INT2FIX)operator((()pre_type(long)operator(\)(()ident(x)operator(\)&)hex(0xff)operator(\)\)) + +ident(VALUE) ident(rb_newobj) ident(_)operator((()directive(void)operator(\)\);) +preprocessor(#define) ident(NEWOBJ)operator(()ident(obj)operator(,)ident(type)operator(\)) ident(type) operator(*)ident(obj) operator(=) operator(()ident(type)operator(*\))ident(rb_newobj)operator((\)) +preprocessor(#define) ident(OBJSETUP)operator(()ident(obj)operator(,)ident(c)operator(,)ident(t)operator(\)) reserved(do) operator({)\ + ident(RBASIC)operator(()ident(obj)operator(\)->)ident(flags) operator(=) operator(()ident(t)operator(\);)\ + ident(RBASIC)operator(()ident(obj)operator(\)->)ident(klass) operator(=) operator(()ident(c)operator(\);)\ + reserved(if) operator(()ident(rb_safe_level)operator((\)) operator(>=) integer(3)operator(\)) ident(FL_SET)operator(()ident(obj)operator(,) ident(FL_TAINT)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#define) ident(CLONESETUP)operator(()ident(clone)operator(,)ident(obj)operator(\)) reserved(do) operator({)\ + ident(OBJSETUP)operator(()ident(clone)operator(,)ident(rb_singleton_class_clone)operator((()ident(VALUE)operator(\))ident(obj)operator(\),)ident(RBASIC)operator(()ident(obj)operator(\)->)ident(flags)operator(\);)\ + ident(rb_singleton_class_attached)operator(()ident(RBASIC)operator(()ident(clone)operator(\)->)ident(klass)operator(,) operator(()ident(VALUE)operator(\))ident(clone)operator(\);)\ + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)\)) ident(rb_copy_generic_ivar)operator((()ident(VALUE)operator(\))ident(clone)operator(,()ident(VALUE)operator(\))ident(obj)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#define) ident(DUPSETUP)operator(()ident(dup)operator(,)ident(obj)operator(\)) reserved(do) operator({)\ + ident(OBJSETUP)operator(()ident(dup)operator(,)ident(rb_obj_class)operator(()ident(obj)operator(\),()ident(RBASIC)operator(()ident(obj)operator(\)->)ident(flags)operator(\)&()ident(T_MASK)operator(|)ident(FL_EXIVAR)operator(|)ident(FL_TAINT)operator(\)\);)\ + reserved(if) operator(()ident(FL_TEST)operator(()ident(obj)operator(,) ident(FL_EXIVAR)operator(\)\)) ident(rb_copy_generic_ivar)operator((()ident(VALUE)operator(\))ident(dup)operator(,()ident(VALUE)operator(\))ident(obj)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +reserved(struct) ident(RBasic) operator({) + pre_type(unsigned) pre_type(long) ident(flags)operator(;) + ident(VALUE) ident(klass)operator(;) +operator(};) + +reserved(struct) ident(RObject) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + reserved(struct) ident(st_table) operator(*)ident(iv_tbl)operator(;) +operator(};) + +reserved(struct) ident(RClass) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + reserved(struct) ident(st_table) operator(*)ident(iv_tbl)operator(;) + reserved(struct) ident(st_table) operator(*)ident(m_tbl)operator(;) + ident(VALUE) ident(super)operator(;) +operator(};) + +reserved(struct) ident(RFloat) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + pre_type(double) ident(value)operator(;) +operator(};) + +preprocessor(#define) ident(ELTS_SHARED) ident(FL_USER2) + +reserved(struct) ident(RString) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(char) operator(*)ident(ptr)operator(;) + reserved(union) operator({) + pre_type(long) ident(capa)operator(;) + ident(VALUE) ident(shared)operator(;) + operator(}) ident(aux)operator(;) +operator(};) +preprocessor(#define) ident(RSTRING_PTR)operator(()ident(s)operator(\)) operator(()ident(RSTRING)operator(()ident(s)operator(\)->)ident(ptr)operator(\)) +preprocessor(#define) ident(RSTRING_LEN)operator(()ident(s)operator(\)) operator(()ident(RSTRING)operator(()ident(s)operator(\)->)ident(len)operator(\)) + +reserved(struct) ident(RArray) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + pre_type(long) ident(len)operator(;) + reserved(union) operator({) + pre_type(long) ident(capa)operator(;) + ident(VALUE) ident(shared)operator(;) + operator(}) ident(aux)operator(;) + ident(VALUE) operator(*)ident(ptr)operator(;) +operator(};) +preprocessor(#define) ident(RARRAY_PTR)operator(()ident(s)operator(\)) operator(()ident(RARRAY)operator(()ident(s)operator(\)->)ident(ptr)operator(\)) +preprocessor(#define) ident(RARRAY_LEN)operator(()ident(s)operator(\)) operator(()ident(RARRAY)operator(()ident(s)operator(\)->)ident(len)operator(\)) + +reserved(struct) ident(RRegexp) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + reserved(struct) ident(re_pattern_buffer) operator(*)ident(ptr)operator(;) + pre_type(long) ident(len)operator(;) + pre_type(char) operator(*)ident(str)operator(;) +operator(};) + +reserved(struct) ident(RHash) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + reserved(struct) ident(st_table) operator(*)ident(tbl)operator(;) + pre_type(int) ident(iter_lev)operator(;) + ident(VALUE) ident(ifnone)operator(;) +operator(};) + +reserved(struct) ident(RFile) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + reserved(struct) ident(OpenFile) operator(*)ident(fptr)operator(;) +operator(};) + +reserved(struct) ident(RData) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + directive(void) operator((*)ident(dmark)operator(\)) ident(_)operator((()directive(void)operator(*\)\);) + directive(void) operator((*)ident(dfree)operator(\)) ident(_)operator((()directive(void)operator(*\)\);) + directive(void) operator(*)ident(data)operator(;) +operator(};) + +preprocessor(#define) ident(DATA_PTR)operator(()ident(dta)operator(\)) operator(()ident(RDATA)operator(()ident(dta)operator(\)->)ident(data)operator(\)) + +comment(/* +#define RUBY_DATA_FUNC(func\) ((void (*\)_((void*\)\)\)func\) +*/) +reserved(typedef) directive(void) operator((*)ident(RUBY_DATA_FUNC)operator(\)) ident(_)operator((()directive(void)operator(*\)\);) + +ident(VALUE) ident(rb_data_object_alloc) ident(_)operator((()ident(VALUE)operator(,)directive(void)operator(*,)ident(RUBY_DATA_FUNC)operator(,)ident(RUBY_DATA_FUNC)operator(\)\);) + +preprocessor(#define) ident(Data_Wrap_Struct)operator(()ident(klass)operator(,)ident(mark)operator(,)ident(free)operator(,)ident(sval)operator(\))\ + ident(rb_data_object_alloc)operator(()ident(klass)operator(,)ident(sval)operator(,()ident(RUBY_DATA_FUNC)operator(\))ident(mark)operator(,()ident(RUBY_DATA_FUNC)operator(\))ident(free)operator(\)) + +preprocessor(#define) ident(Data_Make_Struct)operator(()ident(klass)operator(,)ident(type)operator(,)ident(mark)operator(,)ident(free)operator(,)ident(sval)operator(\)) operator(()\ + ident(sval) operator(=) ident(ALLOC)operator(()ident(type)operator(\),)\ + ident(memset)operator(()ident(sval)operator(,) integer(0)operator(,) reserved(sizeof)operator(()ident(type)operator(\)\),)\ + ident(Data_Wrap_Struct)operator(()ident(klass)operator(,)ident(mark)operator(,)ident(free)operator(,)ident(sval)operator(\))\ +operator(\)) + +preprocessor(#define) ident(Data_Get_Struct)operator(()ident(obj)operator(,)ident(type)operator(,)ident(sval)operator(\)) reserved(do) operator({)\ + ident(Check_Type)operator(()ident(obj)operator(,) ident(T_DATA)operator(\);) \ + ident(sval) operator(=) operator(()ident(type)operator(*\))ident(DATA_PTR)operator(()ident(obj)operator(\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +reserved(struct) ident(RStruct) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + pre_type(long) ident(len)operator(;) + ident(VALUE) operator(*)ident(ptr)operator(;) +operator(};) +preprocessor(#define) ident(RSTRUCT_LEN)operator(()ident(st)operator(\)) operator(()ident(RSTRUCT)operator(()ident(st)operator(\)->)ident(len)operator(\)) +preprocessor(#define) ident(RSTRUCT_PTR)operator(()ident(st)operator(\)) operator(()ident(RSTRUCT)operator(()ident(st)operator(\)->)ident(ptr)operator(\)) + +reserved(struct) ident(RBignum) operator({) + reserved(struct) ident(RBasic) ident(basic)operator(;) + pre_type(char) ident(sign)operator(;) + pre_type(long) ident(len)operator(;) + directive(void) operator(*)ident(digits)operator(;) +operator(};) + +preprocessor(#define) ident(R_CAST)operator(()ident(st)operator(\)) operator(()reserved(struct) ident(st)operator(*\)) +preprocessor(#define) ident(RBASIC)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RBasic)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(ROBJECT)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RObject)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RCLASS)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RClass)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RMODULE)operator(()ident(obj)operator(\)) ident(RCLASS)operator(()ident(obj)operator(\)) +preprocessor(#define) ident(RFLOAT)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RFloat)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RSTRING)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RString)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RREGEXP)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RRegexp)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RARRAY)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RArray)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RHASH)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RHash)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RDATA)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RData)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RSTRUCT)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RStruct)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RBIGNUM)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RBignum)operator(\)()ident(obj)operator(\)\)) +preprocessor(#define) ident(RFILE)operator(()ident(obj)operator(\)) operator(()ident(R_CAST)operator(()ident(RFile)operator(\)()ident(obj)operator(\)\)) + +preprocessor(#define) ident(FL_SINGLETON) ident(FL_USER0) +preprocessor(#define) ident(FL_MARK) operator(()integer(1)operator(<<)integer(6)operator(\)) +preprocessor(#define) ident(FL_FINALIZE) operator(()integer(1)operator(<<)integer(7)operator(\)) +preprocessor(#define) ident(FL_TAINT) operator(()integer(1)operator(<<)integer(8)operator(\)) +preprocessor(#define) ident(FL_EXIVAR) operator(()integer(1)operator(<<)integer(9)operator(\)) +preprocessor(#define) ident(FL_FREEZE) operator(()integer(1)operator(<<)integer(10)operator(\)) + +preprocessor(#define) ident(FL_USHIFT) integer(11) + +preprocessor(#define) ident(FL_USER0) operator(()integer(1)operator(<<()ident(FL_USHIFT)operator(+)integer(0)operator(\)\)) +preprocessor(#define) ident(FL_USER1) operator(()integer(1)operator(<<()ident(FL_USHIFT)operator(+)integer(1)operator(\)\)) +preprocessor(#define) ident(FL_USER2) operator(()integer(1)operator(<<()ident(FL_USHIFT)operator(+)integer(2)operator(\)\)) +preprocessor(#define) ident(FL_USER3) operator(()integer(1)operator(<<()ident(FL_USHIFT)operator(+)integer(3)operator(\)\)) +preprocessor(#define) ident(FL_USER4) operator(()integer(1)operator(<<()ident(FL_USHIFT)operator(+)integer(4)operator(\)\)) +preprocessor(#define) ident(FL_USER5) operator(()integer(1)operator(<<()ident(FL_USHIFT)operator(+)integer(5)operator(\)\)) +preprocessor(#define) ident(FL_USER6) operator(()integer(1)operator(<<()ident(FL_USHIFT)operator(+)integer(6)operator(\)\)) +preprocessor(#define) ident(FL_USER7) operator(()integer(1)operator(<<()ident(FL_USHIFT)operator(+)integer(7)operator(\)\)) + +preprocessor(#define) ident(FL_UMASK) operator(()hex(0xff)operator(<<)ident(FL_USHIFT)operator(\)) + +preprocessor(#define) ident(SPECIAL_CONST_P)operator(()ident(x)operator(\)) operator(()ident(IMMEDIATE_P)operator(()ident(x)operator(\)) operator(||) operator(!)ident(RTEST)operator(()ident(x)operator(\)\)) + +preprocessor(#define) ident(FL_ABLE)operator(()ident(x)operator(\)) operator((!)ident(SPECIAL_CONST_P)operator(()ident(x)operator(\)\)) +preprocessor(#define) ident(FL_TEST)operator(()ident(x)operator(,)ident(f)operator(\)) operator(()ident(FL_ABLE)operator(()ident(x)operator(\)?()ident(RBASIC)operator(()ident(x)operator(\)->)ident(flags)operator(&()ident(f)operator(\)\):)integer(0)operator(\)) +preprocessor(#define) ident(FL_SET)operator(()ident(x)operator(,)ident(f)operator(\)) reserved(do) operator({)reserved(if) operator(()ident(FL_ABLE)operator(()ident(x)operator(\)\)) ident(RBASIC)operator(()ident(x)operator(\)->)ident(flags) operator(|=) operator(()ident(f)operator(\);}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#define) ident(FL_UNSET)operator(()ident(x)operator(,)ident(f)operator(\)) reserved(do) operator({)reserved(if) operator(()ident(FL_ABLE)operator(()ident(x)operator(\)\)) ident(RBASIC)operator(()ident(x)operator(\)->)ident(flags) operator(&=) operator(~()ident(f)operator(\);}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#define) ident(FL_REVERSE)operator(()ident(x)operator(,)ident(f)operator(\)) reserved(do) operator({)reserved(if) operator(()ident(FL_ABLE)operator(()ident(x)operator(\)\)) ident(RBASIC)operator(()ident(x)operator(\)->)ident(flags) operator(^=) operator(()ident(f)operator(\);}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(OBJ_TAINTED)operator(()ident(x)operator(\)) ident(FL_TEST)operator((()ident(x)operator(\),) ident(FL_TAINT)operator(\)) +preprocessor(#define) ident(OBJ_TAINT)operator(()ident(x)operator(\)) ident(FL_SET)operator((()ident(x)operator(\),) ident(FL_TAINT)operator(\)) +preprocessor(#define) ident(OBJ_INFECT)operator(()ident(x)operator(,)ident(s)operator(\)) reserved(do) operator({)reserved(if) operator(()ident(FL_ABLE)operator(()ident(x)operator(\)) operator(&&) ident(FL_ABLE)operator(()ident(s)operator(\)\)) ident(RBASIC)operator(()ident(x)operator(\)->)ident(flags) operator(|=) ident(RBASIC)operator(()ident(s)operator(\)->)ident(flags) operator(&) ident(FL_TAINT)operator(;}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(OBJ_FROZEN)operator(()ident(x)operator(\)) ident(FL_TEST)operator((()ident(x)operator(\),) ident(FL_FREEZE)operator(\)) +preprocessor(#define) ident(OBJ_FREEZE)operator(()ident(x)operator(\)) ident(FL_SET)operator((()ident(x)operator(\),) ident(FL_FREEZE)operator(\)) + +preprocessor(#define) ident(ALLOC_N)operator(()ident(type)operator(,)ident(n)operator(\)) operator(()ident(type)operator(*\))ident(xmalloc)operator(()reserved(sizeof)operator(()ident(type)operator(\)*()ident(n)operator(\)\)) +preprocessor(#define) ident(ALLOC)operator(()ident(type)operator(\)) operator(()ident(type)operator(*\))ident(xmalloc)operator(()reserved(sizeof)operator(()ident(type)operator(\)\)) +preprocessor(#define) ident(REALLOC_N)operator(()ident(var)operator(,)ident(type)operator(,)ident(n)operator(\)) operator(()ident(var)operator(\)=()ident(type)operator(*\))ident(xrealloc)operator((()pre_type(char)operator(*\)()ident(var)operator(\),)reserved(sizeof)operator(()ident(type)operator(\)*()ident(n)operator(\)\)) + +preprocessor(#define) ident(ALLOCA_N)operator(()ident(type)operator(,)ident(n)operator(\)) operator(()ident(type)operator(*\))ident(alloca)operator(()reserved(sizeof)operator(()ident(type)operator(\)*()ident(n)operator(\)\)) + +preprocessor(#define) ident(MEMZERO)operator(()ident(p)operator(,)ident(type)operator(,)ident(n)operator(\)) ident(memset)operator((()ident(p)operator(\),) integer(0)operator(,) reserved(sizeof)operator(()ident(type)operator(\)*()ident(n)operator(\)\)) +preprocessor(#define) ident(MEMCPY)operator(()ident(p1)operator(,)ident(p2)operator(,)ident(type)operator(,)ident(n)operator(\)) ident(memcpy)operator((()ident(p1)operator(\),) operator(()ident(p2)operator(\),) reserved(sizeof)operator(()ident(type)operator(\)*()ident(n)operator(\)\)) +preprocessor(#define) ident(MEMMOVE)operator(()ident(p1)operator(,)ident(p2)operator(,)ident(type)operator(,)ident(n)operator(\)) ident(memmove)operator((()ident(p1)operator(\),) operator(()ident(p2)operator(\),) reserved(sizeof)operator(()ident(type)operator(\)*()ident(n)operator(\)\)) +preprocessor(#define) ident(MEMCMP)operator(()ident(p1)operator(,)ident(p2)operator(,)ident(type)operator(,)ident(n)operator(\)) ident(memcmp)operator((()ident(p1)operator(\),) operator(()ident(p2)operator(\),) reserved(sizeof)operator(()ident(type)operator(\)*()ident(n)operator(\)\)) + +directive(void) ident(rb_obj_infect) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) + +reserved(typedef) pre_type(int) ident(ruby_glob_func)operator(()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(\);) +directive(void) ident(rb_glob) ident(_)operator((()directive(const) pre_type(char)operator(*,)directive(void)operator((*\)()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(\),)ident(VALUE)operator(\)\);) +directive(void) ident(rb_globi) ident(_)operator((()directive(const) pre_type(char)operator(*,)directive(void)operator((*\)()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(\),)ident(VALUE)operator(\)\);) +pre_type(int) ident(ruby_brace_expand) ident(_)operator((()directive(const) pre_type(char)operator(*,)pre_type(int)operator(,)ident(ruby_glob_func)operator(*,)ident(VALUE)operator(\)\);) +pre_type(int) ident(ruby_brace_glob) ident(_)operator((()directive(const) pre_type(char)operator(*,)pre_type(int)operator(,)ident(ruby_glob_func)operator(*,)ident(VALUE)operator(\)\);) + +ident(VALUE) ident(rb_define_class) ident(_)operator((()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_define_module) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_define_class_under) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_define_module_under) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) + +directive(void) ident(rb_include_module) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) +directive(void) ident(rb_extend_object) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) + +directive(void) ident(rb_define_variable) ident(_)operator((()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(*\)\);) +directive(void) ident(rb_define_virtual_variable) ident(_)operator((()directive(const) pre_type(char)operator(*,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)directive(void)operator((*\)()ident(ANYARGS)operator(\)\)\);) +directive(void) ident(rb_define_hooked_variable) ident(_)operator((()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(*,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)directive(void)operator((*\)()ident(ANYARGS)operator(\)\)\);) +pre_type(int) ident(ruby_glob) ident(_)operator((()directive(const) pre_type(char)operator(*,)pre_type(int)operator(,)pre_type(int)operator((*\)()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(\),)ident(VALUE)operator(\)\);) +pre_type(int) ident(ruby_globi) ident(_)operator((()directive(const) pre_type(char)operator(*,)pre_type(int)operator(,)pre_type(int)operator((*\)()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(\),)ident(VALUE)operator(\)\);) +directive(void) ident(rb_define_readonly_variable) ident(_)operator((()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(*\)\);) +directive(void) ident(rb_define_const) ident(_)operator((()ident(VALUE)operator(,)directive(const) pre_type(char)operator(*,)ident(VALUE)operator(\)\);) +directive(void) ident(rb_define_global_const) ident(_)operator((()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(\)\);) + +preprocessor(#define) ident(RUBY_METHOD_FUNC)operator(()ident(func)operator(\)) operator((()ident(VALUE) operator((*\)()ident(ANYARGS)operator(\)\))ident(func)operator(\)) +directive(void) ident(rb_define_method) ident(_)operator((()ident(VALUE)operator(,)directive(const) pre_type(char)operator(*,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)pre_type(int)operator(\)\);) +directive(void) ident(rb_define_module_function) ident(_)operator((()ident(VALUE)operator(,)directive(const) pre_type(char)operator(*,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)pre_type(int)operator(\)\);) +directive(void) ident(rb_define_global_function) ident(_)operator((()directive(const) pre_type(char)operator(*,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)pre_type(int)operator(\)\);) + +directive(void) ident(rb_undef_method) ident(_)operator((()ident(VALUE)operator(,)directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(rb_define_alias) ident(_)operator((()ident(VALUE)operator(,)directive(const) pre_type(char)operator(*,)directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(rb_define_attr) ident(_)operator((()ident(VALUE)operator(,)directive(const) pre_type(char)operator(*,)pre_type(int)operator(,)pre_type(int)operator(\)\);) + +directive(void) ident(rb_global_variable) ident(_)operator((()ident(VALUE)operator(*\)\);) +directive(void) ident(rb_gc_register_address) ident(_)operator((()ident(VALUE)operator(*\)\);) +directive(void) ident(rb_gc_unregister_address) ident(_)operator((()ident(VALUE)operator(*\)\);) + +ident(ID) ident(rb_intern) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +pre_type(char) operator(*)ident(rb_id2name) ident(_)operator((()ident(ID)operator(\)\);) +ident(ID) ident(rb_to_id) ident(_)operator((()ident(VALUE)operator(\)\);) + +pre_type(char) operator(*)ident(rb_class2name) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(char) operator(*)ident(rb_obj_classname) ident(_)operator((()ident(VALUE)operator(\)\);) + +directive(void) ident(rb_p) ident(_)operator((()ident(VALUE)operator(\)\);) + +ident(VALUE) ident(rb_eval_string) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_eval_string_protect) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(int)operator(*\)\);) +ident(VALUE) ident(rb_eval_string_wrap) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(int)operator(*\)\);) +ident(VALUE) ident(rb_funcall) ident(__)operator((()ident(VALUE)operator(,) ident(ID)operator(,) pre_type(int)operator(,) operator(.)operator(.)operator(.)operator(\)\);) +ident(VALUE) ident(rb_funcall2) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) pre_type(int)operator(,) directive(const) ident(VALUE)operator(*\)\);) +ident(VALUE) ident(rb_funcall3) ident(_)operator((()ident(VALUE)operator(,) ident(ID)operator(,) pre_type(int)operator(,) directive(const) ident(VALUE)operator(*\)\);) +pre_type(int) ident(rb_scan_args) ident(__)operator((()pre_type(int)operator(,) directive(const) ident(VALUE)operator(*,) directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\);) +ident(VALUE) ident(rb_call_super) ident(_)operator((()pre_type(int)operator(,) directive(const) ident(VALUE)operator(*\)\);) + +ident(VALUE) ident(rb_gv_set) ident(_)operator((()directive(const) pre_type(char)operator(*,) ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_gv_get) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_iv_get) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*\)\);) +ident(VALUE) ident(rb_iv_set) ident(_)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) ident(VALUE)operator(\)\);) + +ident(VALUE) ident(rb_equal) ident(_)operator((()ident(VALUE)operator(,)ident(VALUE)operator(\)\);) + +ident(RUBY_EXTERN) ident(VALUE) ident(ruby_verbose)operator(,) ident(ruby_debug)operator(;) + +ident(NORETURN)operator(()directive(void) ident(rb_raise) ident(__)operator((()ident(VALUE)operator(,) directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_fatal) ident(__)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_bug) ident(__)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_sys_fail) ident(_)operator((()directive(const) pre_type(char)operator(*\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_iter_break) ident(_)operator((()directive(void)operator(\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_exit) ident(_)operator((()pre_type(int)operator(\)\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_notimplement) ident(_)operator((()directive(void)operator(\)\)\);) + +directive(void) ident(rb_warning) ident(__)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\);) comment(/* reports if `-w' specified */) +directive(void) ident(rb_sys_warning) ident(__)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\);) comment(/* reports if `-w' specified */) +directive(void) ident(rb_warn) ident(__)operator((()directive(const) pre_type(char)operator(*,) operator(.)operator(.)operator(.)operator(\)\);) comment(/* reports always */) + +ident(VALUE) ident(rb_each) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_yield) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_yield_values) ident(__)operator((()pre_type(int) ident(n)operator(,) operator(.)operator(.)operator(.)operator(\)\);) +ident(VALUE) ident(rb_yield_splat) ident(_)operator((()ident(VALUE)operator(\)\);) +pre_type(int) ident(rb_block_given_p) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(rb_need_block) ident(_)operator((()directive(void)operator(\)\);) +ident(VALUE) ident(rb_iterate) ident(_)operator((()ident(VALUE)operator((*\)()ident(VALUE)operator(\),)ident(VALUE)operator(,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_rescue) ident(_)operator((()ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_rescue2) ident(__)operator((()ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(,)operator(.)operator(.)operator(.)operator(\)\);) +ident(VALUE) ident(rb_ensure) ident(_)operator((()ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(\)\);) +ident(VALUE) ident(rb_catch) ident(_)operator((()directive(const) pre_type(char)operator(*,)ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_throw) ident(_)operator((()directive(const) pre_type(char)operator(*,)ident(VALUE)operator(\)\)\);) + +ident(VALUE) ident(rb_require) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) + +preprocessor(#ifdef) ident(__ia64) +directive(void) ident(ruby_init_stack)operator(()ident(VALUE)operator(*,) directive(void)operator(*\);) +preprocessor(#define) ident(RUBY_INIT_STACK) \ + ident(VALUE) ident(variable_in_this_stack_frame)operator(;) \ + ident(ruby_init_stack)operator((&)ident(variable_in_this_stack_frame)operator(,) ident(rb_ia64_bsp)operator((\)\);) +preprocessor(#else) +directive(void) ident(ruby_init_stack)operator(()ident(VALUE)operator(*\);) +preprocessor(#define) ident(RUBY_INIT_STACK) \ + ident(VALUE) ident(variable_in_this_stack_frame)operator(;) \ + ident(ruby_init_stack)operator((&)ident(variable_in_this_stack_frame)operator(\);) +preprocessor(#endif) +directive(void) ident(ruby_init) ident(_)operator((()directive(void)operator(\)\);) +directive(void) ident(ruby_options) ident(_)operator((()pre_type(int)operator(,) pre_type(char)operator(**\)\);) +ident(NORETURN)operator(()directive(void) ident(ruby_run) ident(_)operator((()directive(void)operator(\)\)\);) + +ident(RUBY_EXTERN) ident(VALUE) ident(rb_mKernel)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_mComparable)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_mEnumerable)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_mPrecision)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_mErrno)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_mFileTest)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_mGC)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_mMath)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_mProcess)operator(;) + +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cObject)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cArray)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cBignum)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cBinding)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cClass)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cCont)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cDir)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cData)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cFalseClass)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cFile)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cFixnum)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cFloat)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cHash)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cInteger)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cIO)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cMatch)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cMethod)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cModule)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cNameErrorMesg)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cNilClass)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cNumeric)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cProc)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cRange)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cRegexp)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cStat)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cString)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cStruct)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cSymbol)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cThread)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cTime)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cTrueClass)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_cUnboundMethod)operator(;) + +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eException)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eStandardError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eSystemExit)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eInterrupt)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eSignal)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eFatal)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eArgError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eEOFError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eIndexError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eRangeError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eIOError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eRuntimeError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eSecurityError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eSystemCallError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eThreadError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eTypeError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eZeroDivError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eNotImpError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eNoMemError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eNoMethodError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eFloatDomainError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eLocalJumpError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eSysStackError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eRegexpError)operator(;) + +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eScriptError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eNameError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eSyntaxError)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(rb_eLoadError)operator(;) + +ident(RUBY_EXTERN) ident(VALUE) ident(rb_stdin)operator(,) ident(rb_stdout)operator(,) ident(rb_stderr)operator(;) +ident(RUBY_EXTERN) ident(VALUE) ident(ruby_errinfo)operator(;) + +directive(static) directive(inline) ident(VALUE) +preprocessor(#if) ident(defined)operator(()ident(HAVE_PROTOTYPES)operator(\)) +ident(rb_class_of)operator(()ident(VALUE) ident(obj)operator(\)) +preprocessor(#else) +ident(rb_class_of)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +preprocessor(#endif) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(obj)operator(\)\)) reserved(return) ident(rb_cFixnum)operator(;) + reserved(if) operator(()ident(obj) operator(==) ident(Qnil)operator(\)) reserved(return) ident(rb_cNilClass)operator(;) + reserved(if) operator(()ident(obj) operator(==) ident(Qfalse)operator(\)) reserved(return) ident(rb_cFalseClass)operator(;) + reserved(if) operator(()ident(obj) operator(==) ident(Qtrue)operator(\)) reserved(return) ident(rb_cTrueClass)operator(;) + reserved(if) operator(()ident(SYMBOL_P)operator(()ident(obj)operator(\)\)) reserved(return) ident(rb_cSymbol)operator(;) + + reserved(return) ident(RBASIC)operator(()ident(obj)operator(\)->)ident(klass)operator(;) +operator(}) + +directive(static) directive(inline) pre_type(int) +preprocessor(#if) ident(defined)operator(()ident(HAVE_PROTOTYPES)operator(\)) +ident(rb_type)operator(()ident(VALUE) ident(obj)operator(\)) +preprocessor(#else) +ident(rb_type)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +preprocessor(#endif) +operator({) + reserved(if) operator(()ident(FIXNUM_P)operator(()ident(obj)operator(\)\)) reserved(return) ident(T_FIXNUM)operator(;) + reserved(if) operator(()ident(obj) operator(==) ident(Qnil)operator(\)) reserved(return) ident(T_NIL)operator(;) + reserved(if) operator(()ident(obj) operator(==) ident(Qfalse)operator(\)) reserved(return) ident(T_FALSE)operator(;) + reserved(if) operator(()ident(obj) operator(==) ident(Qtrue)operator(\)) reserved(return) ident(T_TRUE)operator(;) + reserved(if) operator(()ident(obj) operator(==) ident(Qundef)operator(\)) reserved(return) ident(T_UNDEF)operator(;) + reserved(if) operator(()ident(SYMBOL_P)operator(()ident(obj)operator(\)\)) reserved(return) ident(T_SYMBOL)operator(;) + reserved(return) ident(BUILTIN_TYPE)operator(()ident(obj)operator(\);) +operator(}) + +directive(static) directive(inline) pre_type(int) +preprocessor(#if) ident(defined)operator(()ident(HAVE_PROTOTYPES)operator(\)) +ident(rb_special_const_p)operator(()ident(VALUE) ident(obj)operator(\)) +preprocessor(#else) +ident(rb_special_const_p)operator(()ident(obj)operator(\)) + ident(VALUE) ident(obj)operator(;) +preprocessor(#endif) +operator({) + reserved(if) operator(()ident(SPECIAL_CONST_P)operator(()ident(obj)operator(\)\)) reserved(return) ident(Qtrue)operator(;) + reserved(return) ident(Qfalse)operator(;) +operator(}) + +preprocessor(#include) include("missing.h") +preprocessor(#include) include("intern.h") + +preprocessor(#if) ident(defined)operator(()ident(EXTLIB)operator(\)) operator(&&) ident(defined)operator(()ident(USE_DLN_A_OUT)operator(\)) +comment(/* hook for external modules */) +directive(static) pre_type(char) operator(*)ident(dln_libs_to_be_linked)operator([]) operator(=) operator({) ident(EXTLIB)operator(,) integer(0) operator(};) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_LIBPTHREAD)operator(\)) +preprocessor(#ifdef) ident(HAVE_PTHREAD_H) +preprocessor(#include) include(<pthread.h>) +preprocessor(#endif) +reserved(typedef) ident(pthread_t) ident(rb_nativethread_t)operator(;) +preprocessor(# define) ident(NATIVETHREAD_CURRENT)operator((\)) ident(pthread_self)operator((\)) +preprocessor(# define) ident(NATIVETHREAD_EQUAL)operator(()ident(t1)operator(,)ident(t2)operator(\)) ident(pthread_equal)operator((()ident(t1)operator(\),()ident(t2)operator(\)\)) +preprocessor(# define) ident(HAVE_NATIVETHREAD) + +preprocessor(# define) ident(NATIVETHREAD_KILL)operator(()ident(th)operator(,)ident(sig)operator(\)) ident(pthread_kill)operator((()ident(th)operator(\),()ident(sig)operator(\)\)) +preprocessor(# define) ident(HAVE_NATIVETHREAD_KILL) +preprocessor(#elif) ident(defined)operator(()ident(_WIN32)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32_WCE)operator(\)) +reserved(typedef) ident(DWORD) ident(rb_nativethread_t)operator(;) +preprocessor(# define) ident(NATIVETHREAD_CURRENT)operator((\)) ident(GetCurrentThreadId)operator((\)) +preprocessor(# define) ident(NATIVETHREAD_EQUAL)operator(()ident(t1)operator(,)ident(t2)operator(\)) operator((()ident(t1)operator(\)) operator(==) operator(()ident(t2)operator(\)\)) +preprocessor(# define) ident(HAVE_NATIVETHREAD) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_NATIVETHREAD) +pre_type(int) ident(is_ruby_native_thread) ident(_)operator((()directive(void)operator(\)\);) +preprocessor(#else) +preprocessor(#define) ident(is_ruby_native_thread)operator((\)) operator(()integer(1)operator(\)) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_NATIVETHREAD_KILL) +directive(void) ident(ruby_native_thread_kill) ident(_)operator((()pre_type(int)operator(\)\);) +preprocessor(#endif) + +preprocessor(#if) ident(defined)operator(()ident(__cplusplus)operator(\)) +comment(#if 0 +{ /* satisfy cc-mode */ +#endif) +operator(}) comment(/* extern "C" { */) +preprocessor(#endif) + +preprocessor(#endif) comment(/* ifndef RUBY_H */) +comment(/********************************************************************** + + rubyio.h - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Fri Nov 12 16:47:09 JST 1993 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#ifndef) ident(RUBYIO_H) +preprocessor(#define) ident(RUBYIO_H) + +preprocessor(#include) include(<stdio.h>) +preprocessor(#include) include(<errno.h>) + +preprocessor(#if) ident(defined)operator(()ident(HAVE_STDIO_EXT_H)operator(\)) +preprocessor(#include) include(<stdio_ext.h>) +preprocessor(#endif) + +reserved(typedef) reserved(struct) ident(OpenFile) operator({) + ident(FILE) operator(*)ident(f)operator(;) comment(/* stdio ptr for read/write */) + ident(FILE) operator(*)ident(f2)operator(;) comment(/* additional ptr for rw pipes */) + pre_type(int) ident(mode)operator(;) comment(/* mode flags */) + pre_type(int) ident(pid)operator(;) comment(/* child's pid (for pipes\) */) + pre_type(int) ident(lineno)operator(;) comment(/* number of lines read */) + pre_type(char) operator(*)ident(path)operator(;) comment(/* pathname for file */) + directive(void) operator((*)ident(finalize)operator(\)) ident(_)operator((()reserved(struct) ident(OpenFile)operator(*,)pre_type(int)operator(\)\);) comment(/* finalize proc */) +operator(}) ident(OpenFile)operator(;) + +preprocessor(#define) ident(FMODE_READABLE) integer(1) +preprocessor(#define) ident(FMODE_WRITABLE) integer(2) +preprocessor(#define) ident(FMODE_READWRITE) integer(3) +preprocessor(#define) ident(FMODE_APPEND) integer(64) +preprocessor(#define) ident(FMODE_CREATE) integer(128) +preprocessor(#define) ident(FMODE_BINMODE) integer(4) +preprocessor(#define) ident(FMODE_SYNC) integer(8) +preprocessor(#define) ident(FMODE_WBUF) integer(16) +preprocessor(#define) ident(FMODE_RBUF) integer(32) +preprocessor(#define) ident(FMODE_WSPLIT) hex(0x200) +preprocessor(#define) ident(FMODE_WSPLIT_INITIALIZED) hex(0x400) + +preprocessor(#define) ident(GetOpenFile)operator(()ident(obj)operator(,)ident(fp)operator(\)) ident(rb_io_check_closed)operator((()ident(fp)operator(\)) operator(=) ident(RFILE)operator(()ident(rb_io_taint_check)operator(()ident(obj)operator(\)\)->)ident(fptr)operator(\)) + +preprocessor(#define) ident(MakeOpenFile)operator(()ident(obj)operator(,) ident(fp)operator(\)) reserved(do) operator({)\ + reserved(if) operator(()ident(RFILE)operator(()ident(obj)operator(\)->)ident(fptr)operator(\)) operator({)\ + ident(rb_io_close)operator(()ident(obj)operator(\);)\ + ident(free)operator(()ident(RFILE)operator(()ident(obj)operator(\)->)ident(fptr)operator(\);)\ + ident(RFILE)operator(()ident(obj)operator(\)->)ident(fptr) operator(=) integer(0)operator(;)\ + operator(})\ + ident(fp) operator(=) integer(0)operator(;)\ + ident(fp) operator(=) ident(RFILE)operator(()ident(obj)operator(\)->)ident(fptr) operator(=) ident(ALLOC)operator(()ident(OpenFile)operator(\);)\ + ident(fp)operator(->)ident(f) operator(=) ident(fp)operator(->)ident(f2) operator(=) pre_constant(NULL)operator(;)\ + ident(fp)operator(->)ident(mode) operator(=) integer(0)operator(;)\ + ident(fp)operator(->)ident(pid) operator(=) integer(0)operator(;)\ + ident(fp)operator(->)ident(lineno) operator(=) integer(0)operator(;)\ + ident(fp)operator(->)ident(path) operator(=) pre_constant(NULL)operator(;)\ + ident(fp)operator(->)ident(finalize) operator(=) integer(0)operator(;)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(#define) ident(GetReadFile)operator(()ident(fptr)operator(\)) operator((()ident(fptr)operator(\)->)ident(f)operator(\)) +preprocessor(#define) ident(GetWriteFile)operator(()ident(fptr)operator(\)) operator(((()ident(fptr)operator(\)->)ident(f2)operator(\)) operator(?) operator(()ident(fptr)operator(\)->)ident(f2) operator(:) operator(()ident(fptr)operator(\)->)ident(f)operator(\)) + +ident(FILE) operator(*)ident(rb_fopen) ident(_)operator((()directive(const) pre_type(char)operator(*,) directive(const) pre_type(char)operator(*\)\);) +ident(FILE) operator(*)ident(rb_fdopen) ident(_)operator((()pre_type(int)operator(,) directive(const) pre_type(char)operator(*\)\);) +pre_type(int) ident(rb_getc) ident(_)operator((()ident(FILE)operator(*\)\);) +pre_type(long) ident(rb_io_fread) ident(_)operator((()pre_type(char) operator(*,) pre_type(long)operator(,) ident(FILE) operator(*\)\);) +pre_type(long) ident(rb_io_fwrite) ident(_)operator((()directive(const) pre_type(char) operator(*,) pre_type(long)operator(,) ident(FILE) operator(*\)\);) +pre_type(int) ident(rb_io_mode_flags) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +pre_type(int) ident(rb_io_modenum_flags) ident(_)operator((()pre_type(int)operator(\)\);) +directive(void) ident(rb_io_check_writable) ident(_)operator((()ident(OpenFile)operator(*\)\);) +directive(void) ident(rb_io_check_readable) ident(_)operator((()ident(OpenFile)operator(*\)\);) +directive(void) ident(rb_io_fptr_finalize) ident(_)operator((()ident(OpenFile)operator(*\)\);) +directive(void) ident(rb_io_synchronized) ident(_)operator((()ident(OpenFile)operator(*\)\);) +directive(void) ident(rb_io_check_initialized) ident(_)operator((()ident(OpenFile)operator(*\)\);) +directive(void) ident(rb_io_check_closed) ident(_)operator((()ident(OpenFile)operator(*\)\);) +pre_type(int) ident(rb_io_wait_readable) ident(_)operator((()pre_type(int)operator(\)\);) +pre_type(int) ident(rb_io_wait_writable) ident(_)operator((()pre_type(int)operator(\)\);) +directive(void) ident(rb_io_set_nonblock)operator(()ident(OpenFile) operator(*)ident(fptr)operator(\);) + +ident(VALUE) ident(rb_io_taint_check) ident(_)operator((()ident(VALUE)operator(\)\);) +ident(NORETURN)operator(()directive(void) ident(rb_eof_error) ident(_)operator((()directive(void)operator(\)\)\);) + +directive(void) ident(rb_read_check) ident(_)operator((()ident(FILE)operator(*\)\);) +pre_type(int) ident(rb_read_pending) ident(_)operator((()ident(FILE)operator(*\)\);) +preprocessor(#endif) +comment(/********************************************************************** + + rubysig.h - + + $Author: shyouhei $ + $Date: 2009-01-05 03:13:40 +0100 (Mon, 05 Jan 2009\) $ + created at: Wed Aug 16 01:15:38 JST 1995 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#ifndef) ident(SIG_H) +preprocessor(#define) ident(SIG_H) +preprocessor(#include) include(<errno.h>) + +preprocessor(#ifdef) ident(_WIN32) +reserved(typedef) ident(LONG) ident(rb_atomic_t)operator(;) + +preprocessor(# define) ident(ATOMIC_TEST)operator(()ident(var)operator(\)) ident(InterlockedExchange)operator((&()ident(var)operator(\),) integer(0)operator(\)) +preprocessor(# define) ident(ATOMIC_SET)operator(()ident(var)operator(,) ident(val)operator(\)) ident(InterlockedExchange)operator((&()ident(var)operator(\),) operator(()ident(val)operator(\)\)) +preprocessor(# define) ident(ATOMIC_INC)operator(()ident(var)operator(\)) ident(InterlockedIncrement)operator((&()ident(var)operator(\)\)) +preprocessor(# define) ident(ATOMIC_DEC)operator(()ident(var)operator(\)) ident(InterlockedDecrement)operator((&()ident(var)operator(\)\)) + +comment(/* Windows doesn't allow interrupt while system calls */) +preprocessor(# define) ident(TRAP_BEG) reserved(do) operator({)\ + pre_type(int) ident(saved_errno) operator(=) integer(0)operator(;)\ + ident(rb_atomic_t) ident(trap_immediate) operator(=) ident(ATOMIC_SET)operator(()ident(rb_trap_immediate)operator(,) integer(1)operator(\)) +preprocessor(# define) ident(TRAP_END)\ + ident(ATOMIC_SET)operator(()ident(rb_trap_immediate)operator(,) ident(trap_immediate)operator(\);)\ + ident(saved_errno) operator(=) ident(errno)operator(;)\ + ident(CHECK_INTS)operator(;)\ + ident(errno) operator(=) ident(saved_errno)operator(;)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(# define) ident(RUBY_CRITICAL)operator(()ident(statements)operator(\)) reserved(do) operator({)\ + ident(rb_w32_enter_critical)operator((\);)\ + ident(statements)operator(;)\ + ident(rb_w32_leave_critical)operator((\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#else) +reserved(typedef) pre_type(int) ident(rb_atomic_t)operator(;) + +preprocessor(# define) ident(ATOMIC_TEST)operator(()ident(var)operator(\)) operator((()ident(var)operator(\)) operator(?) operator((()ident(var)operator(\)) operator(=) integer(0)operator(,) integer(1)operator(\)) operator(:) integer(0)operator(\)) +preprocessor(# define) ident(ATOMIC_SET)operator(()ident(var)operator(,) ident(val)operator(\)) operator((()ident(var)operator(\)) operator(=) operator(()ident(val)operator(\)\)) +preprocessor(# define) ident(ATOMIC_INC)operator(()ident(var)operator(\)) operator((++()ident(var)operator(\)\)) +preprocessor(# define) ident(ATOMIC_DEC)operator(()ident(var)operator(\)) operator((--()ident(var)operator(\)\)) + +preprocessor(# define) ident(TRAP_BEG) reserved(do) operator({)\ + pre_type(int) ident(saved_errno) operator(=) integer(0)operator(;)\ + pre_type(int) ident(trap_immediate) operator(=) ident(rb_trap_immediate)operator(;)\ + ident(rb_trap_immediate) operator(=) integer(1) +preprocessor(# define) ident(TRAP_END) ident(rb_trap_immediate) operator(=) ident(trap_immediate)operator(;)\ + ident(saved_errno) operator(=) ident(errno)operator(;)\ + ident(CHECK_INTS)operator(;)\ + ident(errno) operator(=) ident(saved_errno)operator(;)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) + +preprocessor(# define) ident(RUBY_CRITICAL)operator(()ident(statements)operator(\)) reserved(do) operator({)\ + pre_type(int) ident(trap_immediate) operator(=) ident(rb_trap_immediate)operator(;)\ + ident(rb_trap_immediate) operator(=) integer(0)operator(;)\ + ident(statements)operator(;)\ + ident(rb_trap_immediate) operator(=) ident(trap_immediate)operator(;)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#endif) +ident(RUBY_EXTERN) ident(rb_atomic_t) ident(rb_trap_immediate)operator(;) + +ident(RUBY_EXTERN) pre_type(int) ident(rb_prohibit_interrupt)operator(;) +preprocessor(#define) ident(DEFER_INTS) operator(()ident(rb_prohibit_interrupt)operator(++\)) +preprocessor(#define) ident(ALLOW_INTS) reserved(do) operator({)\ + ident(rb_prohibit_interrupt)operator(--;)\ + ident(CHECK_INTS)operator(;)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#define) ident(ENABLE_INTS) operator(()ident(rb_prohibit_interrupt)operator(--\)) + +ident(VALUE) ident(rb_with_disable_interrupt) ident(_)operator((()ident(VALUE)operator((*\)()ident(ANYARGS)operator(\),)ident(VALUE)operator(\)\);) + +ident(RUBY_EXTERN) ident(rb_atomic_t) ident(rb_trap_pending)operator(;) +directive(void) ident(rb_trap_restore_mask) ident(_)operator((()directive(void)operator(\)\);) + +ident(RUBY_EXTERN) pre_type(int) ident(rb_thread_critical)operator(;) +ident(RUBY_EXTERN) pre_type(int) ident(rb_thread_pending)operator(;) +directive(void) ident(rb_thread_schedule) ident(_)operator((()directive(void)operator(\)\);) +preprocessor(#if) ident(defined)operator(()ident(HAVE_SETITIMER)operator(\)) operator(||) ident(defined)operator(()ident(_THREAD_SAFE)operator(\)) +preprocessor(# define) ident(CHECK_INTS) reserved(do) operator({)\ + reserved(if) operator((!()ident(rb_prohibit_interrupt) operator(||) ident(rb_thread_critical)operator(\)\)) operator({)\ + reserved(if) operator(()ident(rb_thread_pending)operator(\)) ident(rb_thread_schedule)operator((\);)\ + reserved(if) operator(()ident(rb_trap_pending)operator(\)) ident(rb_trap_exec)operator((\);)\ + operator(})\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#else) +comment(/* pseudo preemptive thread switching */) +ident(RUBY_EXTERN) pre_type(int) ident(rb_thread_tick)operator(;) +preprocessor(#define) ident(THREAD_TICK) integer(500) +preprocessor(#define) ident(CHECK_INTS) reserved(do) operator({)\ + reserved(if) operator((!()ident(rb_prohibit_interrupt) operator(||) ident(rb_thread_critical)operator(\)\)) operator({)\ + reserved(if) operator(()ident(rb_thread_pending) operator(||) ident(rb_thread_tick)operator(--) operator(<=) integer(0)operator(\)) operator({)\ + ident(rb_thread_tick) operator(=) ident(THREAD_TICK)operator(;)\ + ident(rb_thread_schedule)operator((\);)\ + operator(})\ + operator(})\ + reserved(if) operator(()ident(rb_trap_pending)operator(\)) ident(rb_trap_exec)operator((\);)\ +operator(}) reserved(while) operator(()integer(0)operator(\)) +preprocessor(#endif) + +preprocessor(#endif) +comment(/* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */) + +comment(/* @(#\) st.h 5.1 89/12/14 */) + +preprocessor(#ifndef) ident(ST_INCLUDED) + +preprocessor(#define) ident(ST_INCLUDED) + +preprocessor(#if) ident(SIZEOF_LONG) operator(==) ident(SIZEOF_VOIDP) +reserved(typedef) pre_type(unsigned) pre_type(long) ident(st_data_t)operator(;) +preprocessor(#elif) ident(SIZEOF_LONG_LONG) operator(==) ident(SIZEOF_VOIDP) +reserved(typedef) pre_type(unsigned) ident(LONG_LONG) ident(st_data_t)operator(;) +preprocessor(#else) +preprocessor(# error) operator(---->>) ident(st)operator(.)ident(c) ident(requires) reserved(sizeof)operator(()directive(void)operator(*\)) operator(==) reserved(sizeof)operator(()pre_type(long)operator(\)) ident(to) ident(be) ident(compiled)operator(.) operator(<<---) +operator(-) +preprocessor(#endif) +preprocessor(#define) ident(ST_DATA_T_DEFINED) + +reserved(typedef) reserved(struct) ident(st_table) ident(st_table)operator(;) + +reserved(struct) ident(st_hash_type) operator({) + pre_type(int) operator((*)ident(compare)operator(\)(\);) + pre_type(int) operator((*)ident(hash)operator(\)(\);) +operator(};) + +reserved(struct) ident(st_table) operator({) + reserved(struct) ident(st_hash_type) operator(*)ident(type)operator(;) + pre_type(int) ident(num_bins)operator(;) + pre_type(int) ident(num_entries)operator(;) + reserved(struct) ident(st_table_entry) operator(**)ident(bins)operator(;) +operator(};) + +preprocessor(#define) ident(st_is_member)operator(()ident(table)operator(,)ident(key)operator(\)) ident(st_lookup)operator(()ident(table)operator(,)ident(key)operator(,()ident(st_data_t) operator(*\))integer(0)operator(\)) + +reserved(enum) ident(st_retval) operator({)ident(ST_CONTINUE)operator(,) ident(ST_STOP)operator(,) ident(ST_DELETE)operator(,) ident(ST_CHECK)operator(};) + +preprocessor(#ifndef) ident(_) +preprocessor(# define) ident(_)operator(()ident(args)operator(\)) ident(args) +preprocessor(#endif) +preprocessor(#ifndef) ident(ANYARGS) +preprocessor(# ifdef) ident(__cplusplus) +preprocessor(# define) ident(ANYARGS) operator(.)operator(.)operator(.) +preprocessor(# else) +preprocessor(# define) ident(ANYARGS) +preprocessor(# endif) +preprocessor(#endif) + +ident(st_table) operator(*)ident(st_init_table) ident(_)operator((()reserved(struct) ident(st_hash_type) operator(*\)\);) +ident(st_table) operator(*)ident(st_init_table_with_size) ident(_)operator((()reserved(struct) ident(st_hash_type) operator(*,) pre_type(int)operator(\)\);) +ident(st_table) operator(*)ident(st_init_numtable) ident(_)operator((()directive(void)operator(\)\);) +ident(st_table) operator(*)ident(st_init_numtable_with_size) ident(_)operator((()pre_type(int)operator(\)\);) +ident(st_table) operator(*)ident(st_init_strtable) ident(_)operator((()directive(void)operator(\)\);) +ident(st_table) operator(*)ident(st_init_strtable_with_size) ident(_)operator((()pre_type(int)operator(\)\);) +pre_type(int) ident(st_delete) ident(_)operator((()ident(st_table) operator(*,) ident(st_data_t) operator(*,) ident(st_data_t) operator(*\)\);) +pre_type(int) ident(st_delete_safe) ident(_)operator((()ident(st_table) operator(*,) ident(st_data_t) operator(*,) ident(st_data_t) operator(*,) ident(st_data_t)operator(\)\);) +pre_type(int) ident(st_insert) ident(_)operator((()ident(st_table) operator(*,) ident(st_data_t)operator(,) ident(st_data_t)operator(\)\);) +pre_type(int) ident(st_lookup) ident(_)operator((()ident(st_table) operator(*,) ident(st_data_t)operator(,) ident(st_data_t) operator(*\)\);) +pre_type(int) ident(st_foreach) ident(_)operator((()ident(st_table) operator(*,) pre_type(int) operator((*\)()ident(ANYARGS)operator(\),) ident(st_data_t)operator(\)\);) +directive(void) ident(st_add_direct) ident(_)operator((()ident(st_table) operator(*,) ident(st_data_t)operator(,) ident(st_data_t)operator(\)\);) +directive(void) ident(st_free_table) ident(_)operator((()ident(st_table) operator(*\)\);) +directive(void) ident(st_cleanup_safe) ident(_)operator((()ident(st_table) operator(*,) ident(st_data_t)operator(\)\);) +ident(st_table) operator(*)ident(st_copy) ident(_)operator((()ident(st_table) operator(*\)\);) + +preprocessor(#define) ident(ST_NUMCMP) operator((()pre_type(int) operator((*\)(\)\)) integer(0)operator(\)) +preprocessor(#define) ident(ST_NUMHASH) operator((()pre_type(int) operator((*\)(\)\)) operator(-)integer(2)operator(\)) + +preprocessor(#define) ident(st_numcmp) ident(ST_NUMCMP) +preprocessor(#define) ident(st_numhash) ident(ST_NUMHASH) + +pre_type(int) ident(st_strhash)operator((\);) + +preprocessor(#endif) comment(/* ST_INCLUDED */) +comment(/********************************************************************** + + util.h - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007\) $ + created at: Thu Mar 9 11:55:53 JST 1995 + + Copyright (C\) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/) + +preprocessor(#ifndef) ident(UTIL_H) +preprocessor(#define) ident(UTIL_H) + +preprocessor(#ifndef) ident(_) +preprocessor(#ifdef) ident(__cplusplus) +preprocessor(# ifndef) ident(HAVE_PROTOTYPES) +preprocessor(# define) ident(HAVE_PROTOTYPES) integer(1) +preprocessor(# endif) +preprocessor(# ifndef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(# define) ident(HAVE_STDARG_PROTOTYPES) integer(1) +preprocessor(# endif) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_PROTOTYPES) +preprocessor(# define) ident(_)operator(()ident(args)operator(\)) ident(args) +preprocessor(#else) +preprocessor(# define) ident(_)operator(()ident(args)operator(\)) operator((\)) +preprocessor(#endif) +preprocessor(#ifdef) ident(HAVE_STDARG_PROTOTYPES) +preprocessor(# define) ident(__)operator(()ident(args)operator(\)) ident(args) +preprocessor(#else) +preprocessor(# define) ident(__)operator(()ident(args)operator(\)) operator((\)) +preprocessor(#endif) +preprocessor(#endif) + +preprocessor(#define) ident(scan_oct) ident(ruby_scan_oct) +pre_type(unsigned) pre_type(long) ident(scan_oct) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(int)operator(,) pre_type(int)operator(*\)\);) +preprocessor(#define) ident(scan_hex) ident(ruby_scan_hex) +pre_type(unsigned) pre_type(long) ident(scan_hex) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(int)operator(,) pre_type(int)operator(*\)\);) + +preprocessor(#if) ident(defined)operator(()ident(MSDOS)operator(\)) operator(||) ident(defined)operator(()ident(__CYGWIN32__)operator(\)) operator(||) ident(defined)operator(()ident(_WIN32)operator(\)) +directive(void) ident(ruby_add_suffix)operator((\);) +preprocessor(#endif) + +directive(void) ident(ruby_qsort) ident(_)operator((()directive(void)operator(*,) directive(const) pre_type(int)operator(,) directive(const) pre_type(int)operator(,) pre_type(int) operator((*\)(\),) directive(void)operator(*\)\);) +preprocessor(#define) ident(qsort)operator(()ident(b)operator(,)ident(n)operator(,)ident(s)operator(,)ident(c)operator(,)ident(d)operator(\)) ident(ruby_qsort)operator(()ident(b)operator(,)ident(n)operator(,)ident(s)operator(,)ident(c)operator(,)ident(d)operator(\)) + +directive(void) ident(ruby_setenv) ident(_)operator((()directive(const) pre_type(char)operator(*,) directive(const) pre_type(char)operator(*\)\);) +directive(void) ident(ruby_unsetenv) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +preprocessor(#undef) ident(setenv) +preprocessor(#undef) ident(unsetenv) +preprocessor(#define) ident(setenv)operator(()ident(name)operator(,)ident(val)operator(\)) ident(ruby_setenv)operator(()ident(name)operator(,)ident(val)operator(\)) +preprocessor(#define) ident(unsetenv)operator(()ident(name)operator(,)ident(val)operator(\)) ident(ruby_unsetenv)operator(()ident(name)operator(\);) + +pre_type(char) operator(*)ident(ruby_strdup) ident(_)operator((()directive(const) pre_type(char)operator(*\)\);) +preprocessor(#undef) ident(strdup) +preprocessor(#define) ident(strdup)operator(()ident(s)operator(\)) ident(ruby_strdup)operator(()ident(s)operator(\)) + +pre_type(char) operator(*)ident(ruby_getcwd) ident(_)operator((()directive(void)operator(\)\);) +preprocessor(#define) ident(my_getcwd)operator((\)) ident(ruby_getcwd)operator((\)) + +pre_type(double) ident(ruby_strtod) ident(_)operator((()directive(const) pre_type(char)operator(*,) pre_type(char) operator(**\)\);) +preprocessor(#undef) ident(strtod) +preprocessor(#define) ident(strtod)operator(()ident(s)operator(,)ident(e)operator(\)) ident(ruby_strtod)operator(()ident(s)operator(,)ident(e)operator(\)) + +preprocessor(#endif) comment(/* UTIL_H */) +preprocessor(#define) ident(RUBY_VERSION) string<delimiter(")content(1.8.6)delimiter(")> +preprocessor(#define) ident(RUBY_RELEASE_DATE) string<delimiter(")content(2009-09-09)delimiter(")> +preprocessor(#define) ident(RUBY_VERSION_CODE) integer(186) +preprocessor(#define) ident(RUBY_RELEASE_CODE) integer(20090909) +preprocessor(#define) ident(RUBY_PATCHLEVEL) integer(388) + +preprocessor(#define) ident(RUBY_VERSION_MAJOR) integer(1) +preprocessor(#define) ident(RUBY_VERSION_MINOR) integer(8) +preprocessor(#define) ident(RUBY_VERSION_TEENY) integer(6) +preprocessor(#define) ident(RUBY_RELEASE_YEAR) integer(2009) +preprocessor(#define) ident(RUBY_RELEASE_MONTH) integer(9) +preprocessor(#define) ident(RUBY_RELEASE_DAY) integer(9) + +preprocessor(#ifdef) ident(RUBY_EXTERN) +ident(RUBY_EXTERN) directive(const) pre_type(char) ident(ruby_version)operator([];) +ident(RUBY_EXTERN) directive(const) pre_type(char) ident(ruby_release_date)operator([];) +ident(RUBY_EXTERN) directive(const) pre_type(char) ident(ruby_platform)operator([];) +ident(RUBY_EXTERN) directive(const) pre_type(int) ident(ruby_patchlevel)operator(;) +preprocessor(#endif) + diff --git a/test/scanners/c/ruby.in.c b/test/scanners/c/ruby.in.c new file mode 100644 index 0000000..868ea59 --- /dev/null +++ b/test/scanners/c/ruby.in.c @@ -0,0 +1,96308 @@ +/********************************************************************** + + array.c - + + $Author: shyouhei $ + $Date: 2009-02-05 00:55:01 +0100 (Thu, 05 Feb 2009) $ + created at: Fri Aug 6 09:46:12 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "util.h" +#include "st.h" + +VALUE rb_cArray; +static ID id_cmp; + +#define ARY_DEFAULT_SIZE 16 +#define ARY_MAX_SIZE (LONG_MAX / sizeof(VALUE)) + +void +rb_mem_clear(mem, size) + register VALUE *mem; + register long size; +{ + while (size--) { + *mem++ = Qnil; + } +} + +static inline void +memfill(mem, size, val) + register VALUE *mem; + register long size; + register VALUE val; +{ + while (size--) { + *mem++ = val; + } +} + +#define ARY_TMPLOCK FL_USER1 + +static inline void +rb_ary_modify_check(ary) + VALUE ary; +{ + if (OBJ_FROZEN(ary)) rb_error_frozen("array"); + if (FL_TEST(ary, ARY_TMPLOCK)) + rb_raise(rb_eRuntimeError, "can't modify array during iteration"); + if (!OBJ_TAINTED(ary) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify array"); +} + +static void +rb_ary_modify(ary) + VALUE ary; +{ + VALUE *ptr; + + rb_ary_modify_check(ary); + if (FL_TEST(ary, ELTS_SHARED)) { + ptr = ALLOC_N(VALUE, RARRAY(ary)->len); + FL_UNSET(ary, ELTS_SHARED); + RARRAY(ary)->aux.capa = RARRAY(ary)->len; + MEMCPY(ptr, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len); + RARRAY(ary)->ptr = ptr; + } +} + +VALUE +rb_ary_freeze(ary) + VALUE ary; +{ + return rb_obj_freeze(ary); +} + +/* + * call-seq: + * array.frozen? -> true or false + * + * Return <code>true</code> if this array is frozen (or temporarily frozen + * while being sorted). + */ + +static VALUE +rb_ary_frozen_p(ary) + VALUE ary; +{ + if (OBJ_FROZEN(ary)) return Qtrue; + if (FL_TEST(ary, ARY_TMPLOCK)) return Qtrue; + return Qfalse; +} + +static VALUE ary_alloc _((VALUE)); +static VALUE +ary_alloc(klass) + VALUE klass; +{ + NEWOBJ(ary, struct RArray); + OBJSETUP(ary, klass, T_ARRAY); + + ary->len = 0; + ary->ptr = 0; + ary->aux.capa = 0; + + return (VALUE)ary; +} + +static VALUE +ary_new(klass, len) + VALUE klass; + long len; +{ + VALUE ary = ary_alloc(klass); + + if (len < 0) { + rb_raise(rb_eArgError, "negative array size (or size too big)"); + } + if (len > ARY_MAX_SIZE) { + rb_raise(rb_eArgError, "array size too big"); + } + if (len == 0) len++; + RARRAY(ary)->ptr = ALLOC_N(VALUE, len); + RARRAY(ary)->aux.capa = len; + + return ary; +} + +VALUE +rb_ary_new2(len) + long len; +{ + return ary_new(rb_cArray, len); +} + + +VALUE +rb_ary_new() +{ + return rb_ary_new2(ARY_DEFAULT_SIZE); +} + +#ifdef HAVE_STDARG_PROTOTYPES +#include <stdarg.h> +#define va_init_list(a,b) va_start(a,b) +#else +#include <varargs.h> +#define va_init_list(a,b) va_start(a) +#endif + +VALUE +#ifdef HAVE_STDARG_PROTOTYPES +rb_ary_new3(long n, ...) +#else +rb_ary_new3(n, va_alist) + long n; + va_dcl +#endif +{ + va_list ar; + VALUE ary; + long i; + + ary = rb_ary_new2(n); + + va_init_list(ar, n); + for (i=0; i<n; i++) { + RARRAY(ary)->ptr[i] = va_arg(ar, VALUE); + } + va_end(ar); + + RARRAY(ary)->len = n; + return ary; +} + +VALUE +rb_ary_new4(n, elts) + long n; + const VALUE *elts; +{ + VALUE ary; + + ary = rb_ary_new2(n); + if (n > 0 && elts) { + MEMCPY(RARRAY(ary)->ptr, elts, VALUE, n); + } + + /* This assignment to len will be moved to the above "if" block in Ruby 1.9 */ + RARRAY(ary)->len = n; + + return ary; +} + +VALUE +rb_assoc_new(car, cdr) + VALUE car, cdr; +{ + VALUE ary; + + ary = rb_ary_new2(2); + RARRAY(ary)->ptr[0] = car; + RARRAY(ary)->ptr[1] = cdr; + RARRAY(ary)->len = 2; + + return ary; +} + +static VALUE +to_ary(ary) + VALUE ary; +{ + return rb_convert_type(ary, T_ARRAY, "Array", "to_ary"); +} + +VALUE +rb_check_array_type(ary) + VALUE ary; +{ + return rb_check_convert_type(ary, T_ARRAY, "Array", "to_ary"); +} + +static VALUE rb_ary_replace _((VALUE, VALUE)); + +/* + * call-seq: + * Array.new(size=0, obj=nil) + * Array.new(array) + * Array.new(size) {|index| block } + * + * Returns a new array. In the first form, the new array is + * empty. In the second it is created with _size_ copies of _obj_ + * (that is, _size_ references to the same + * _obj_). The third form creates a copy of the array + * passed as a parameter (the array is generated by calling + * to_ary on the parameter). In the last form, an array + * of the given size is created. Each element in this array is + * calculated by passing the element's index to the given block and + * storing the return value. + * + * Array.new + * Array.new(2) + * Array.new(5, "A") + * + * # only one copy of the object is created + * a = Array.new(2, Hash.new) + * a[0]['cat'] = 'feline' + * a + * a[1]['cat'] = 'Felix' + * a + * + * # here multiple copies are created + * a = Array.new(2) { Hash.new } + * a[0]['cat'] = 'feline' + * a + * + * squares = Array.new(5) {|i| i*i} + * squares + * + * copy = Array.new(squares) + */ + +static VALUE +rb_ary_initialize(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + long len; + VALUE size, val; + + rb_ary_modify(ary); + if (rb_scan_args(argc, argv, "02", &size, &val) == 0) { + RARRAY(ary)->len = 0; + if (rb_block_given_p()) { + rb_warning("given block not used"); + } + return ary; + } + + if (argc == 1 && !FIXNUM_P(size)) { + val = rb_check_array_type(size); + if (!NIL_P(val)) { + rb_ary_replace(ary, val); + return ary; + } + } + + len = NUM2LONG(size); + if (len < 0) { + rb_raise(rb_eArgError, "negative array size"); + } + if (len > ARY_MAX_SIZE) { + rb_raise(rb_eArgError, "array size too big"); + } + if (len > RARRAY(ary)->aux.capa) { + REALLOC_N(RARRAY(ary)->ptr, VALUE, len); + RARRAY(ary)->aux.capa = len; + } + if (rb_block_given_p()) { + long i; + + if (argc == 2) { + rb_warn("block supersedes default value argument"); + } + for (i=0; i<len; i++) { + rb_ary_store(ary, i, rb_yield(LONG2NUM(i))); + RARRAY(ary)->len = i + 1; + } + } + else { + memfill(RARRAY(ary)->ptr, len, val); + RARRAY(ary)->len = len; + } + + return ary; +} + + +/* +* Returns a new array populated with the given objects. +* +* Array.[]( 1, 'a', /^A/ ) +* Array[ 1, 'a', /^A/ ] +* [ 1, 'a', /^A/ ] +*/ + +static VALUE +rb_ary_s_create(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + VALUE ary = ary_alloc(klass); + + if (argc > 0) { + RARRAY(ary)->ptr = ALLOC_N(VALUE, argc); + MEMCPY(RARRAY(ary)->ptr, argv, VALUE, argc); + } + RARRAY(ary)->len = RARRAY(ary)->aux.capa = argc; + + return ary; +} + +void +rb_ary_store(ary, idx, val) + VALUE ary; + long idx; + VALUE val; +{ + if (idx < 0) { + idx += RARRAY(ary)->len; + if (idx < 0) { + rb_raise(rb_eIndexError, "index %ld out of array", + idx - RARRAY(ary)->len); + } + } + else if (idx >= ARY_MAX_SIZE) { + rb_raise(rb_eIndexError, "index %ld too big", idx); + } + + rb_ary_modify(ary); + if (idx >= RARRAY(ary)->aux.capa) { + long new_capa = RARRAY(ary)->aux.capa / 2; + + if (new_capa < ARY_DEFAULT_SIZE) { + new_capa = ARY_DEFAULT_SIZE; + } + if (new_capa >= ARY_MAX_SIZE - idx) { + new_capa = (ARY_MAX_SIZE - idx) / 2; + } + new_capa += idx; + REALLOC_N(RARRAY(ary)->ptr, VALUE, new_capa); + RARRAY(ary)->aux.capa = new_capa; + } + if (idx > RARRAY(ary)->len) { + rb_mem_clear(RARRAY(ary)->ptr + RARRAY(ary)->len, + idx-RARRAY(ary)->len + 1); + } + + if (idx >= RARRAY(ary)->len) { + RARRAY(ary)->len = idx + 1; + } + RARRAY(ary)->ptr[idx] = val; +} + +/* + * call-seq: + * array << obj -> array + * + * Append---Pushes the given object on to the end of this array. This + * expression returns the array itself, so several appends + * may be chained together. + * + * [ 1, 2 ] << "c" << "d" << [ 3, 4 ] + * #=> [ 1, 2, "c", "d", [ 3, 4 ] ] + * + */ + +VALUE +rb_ary_push(ary, item) + VALUE ary; + VALUE item; +{ + rb_ary_store(ary, RARRAY(ary)->len, item); + return ary; +} + +/* + * call-seq: + * array.push(obj, ... ) -> array + * + * Append---Pushes the given object(s) on to the end of this array. This + * expression returns the array itself, so several appends + * may be chained together. + * + * a = [ "a", "b", "c" ] + * a.push("d", "e", "f") + * #=> ["a", "b", "c", "d", "e", "f"] + */ + +static VALUE +rb_ary_push_m(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + while (argc--) { + rb_ary_push(ary, *argv++); + } + return ary; +} + +/* + * call-seq: + * array.pop -> obj or nil + * + * Removes the last element from <i>self</i> and returns it, or + * <code>nil</code> if the array is empty. + * + * a = [ "a", "m", "z" ] + * a.pop #=> "z" + * a #=> ["a", "m"] + */ + +VALUE +rb_ary_pop(ary) + VALUE ary; +{ + rb_ary_modify_check(ary); + if (RARRAY(ary)->len == 0) return Qnil; + if (!FL_TEST(ary, ELTS_SHARED) && + RARRAY(ary)->len * 2 < RARRAY(ary)->aux.capa && + RARRAY(ary)->aux.capa > ARY_DEFAULT_SIZE) { + RARRAY(ary)->aux.capa = RARRAY(ary)->len * 2; + REALLOC_N(RARRAY(ary)->ptr, VALUE, RARRAY(ary)->aux.capa); + } + return RARRAY(ary)->ptr[--RARRAY(ary)->len]; +} + +static VALUE +ary_make_shared(ary) + VALUE ary; +{ + if (!FL_TEST(ary, ELTS_SHARED)) { + NEWOBJ(shared, struct RArray); + OBJSETUP(shared, rb_cArray, T_ARRAY); + + shared->len = RARRAY(ary)->len; + shared->ptr = RARRAY(ary)->ptr; + shared->aux.capa = RARRAY(ary)->aux.capa; + RARRAY(ary)->aux.shared = (VALUE)shared; + FL_SET(ary, ELTS_SHARED); + OBJ_FREEZE(shared); + return (VALUE)shared; + } + else { + return RARRAY(ary)->aux.shared; + } +} + +/* + * call-seq: + * array.shift -> obj or nil + * + * Returns the first element of <i>self</i> and removes it (shifting all + * other elements down by one). Returns <code>nil</code> if the array + * is empty. + * + * args = [ "-m", "-q", "filename" ] + * args.shift #=> "-m" + * args #=> ["-q", "filename"] + */ + +VALUE +rb_ary_shift(ary) + VALUE ary; +{ + VALUE top; + + rb_ary_modify_check(ary); + if (RARRAY(ary)->len == 0) return Qnil; + top = RARRAY(ary)->ptr[0]; + if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE && !FL_TEST(ary, ELTS_SHARED)) { + MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+1, VALUE, RARRAY_LEN(ary)-1); + } + else { + if (!FL_TEST(ary, ELTS_SHARED)) { + RARRAY(ary)->ptr[0] = Qnil; + } + ary_make_shared(ary); + RARRAY(ary)->ptr++; /* shift ptr */ + } + RARRAY(ary)->len--; + + return top; +} + +VALUE +rb_ary_unshift(ary, item) + VALUE ary, item; +{ + rb_ary_modify(ary); + if (RARRAY(ary)->len == RARRAY(ary)->aux.capa) { + long capa_inc = RARRAY(ary)->aux.capa / 2; + if (capa_inc < ARY_DEFAULT_SIZE) { + capa_inc = ARY_DEFAULT_SIZE; + } + RARRAY(ary)->aux.capa += capa_inc; + REALLOC_N(RARRAY(ary)->ptr, VALUE, RARRAY(ary)->aux.capa); + } + + /* sliding items */ + MEMMOVE(RARRAY(ary)->ptr + 1, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len); + + RARRAY(ary)->len++; + RARRAY(ary)->ptr[0] = item; + + return ary; +} + +/* + * call-seq: + * array.unshift(obj, ...) -> array + * + * Prepends objects to the front of <i>array</i>. + * other elements up one. + * + * a = [ "b", "c", "d" ] + * a.unshift("a") #=> ["a", "b", "c", "d"] + * a.unshift(1, 2) #=> [ 1, 2, "a", "b", "c", "d"] + */ + +static VALUE +rb_ary_unshift_m(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + long len = RARRAY(ary)->len; + + if (argc == 0) return ary; + + /* make rooms by setting the last item */ + rb_ary_store(ary, len + argc - 1, Qnil); + + /* sliding items */ + MEMMOVE(RARRAY(ary)->ptr + argc, RARRAY(ary)->ptr, VALUE, len); + MEMCPY(RARRAY(ary)->ptr, argv, VALUE, argc); + + return ary; +} + +/* faster version - use this if you don't need to treat negative offset */ +static inline VALUE +rb_ary_elt(ary, offset) + VALUE ary; + long offset; +{ + if (RARRAY(ary)->len == 0) return Qnil; + if (offset < 0 || RARRAY(ary)->len <= offset) { + return Qnil; + } + return RARRAY(ary)->ptr[offset]; +} + +VALUE +rb_ary_entry(ary, offset) + VALUE ary; + long offset; +{ + if (offset < 0) { + offset += RARRAY(ary)->len; + } + return rb_ary_elt(ary, offset); +} + +static VALUE +rb_ary_subseq(ary, beg, len) + VALUE ary; + long beg, len; +{ + VALUE klass, ary2, shared; + VALUE *ptr; + + if (beg > RARRAY(ary)->len) return Qnil; + if (beg < 0 || len < 0) return Qnil; + + if (RARRAY(ary)->len < len || RARRAY(ary)->len < beg + len) { + len = RARRAY(ary)->len - beg; + if (len < 0) + len = 0; + } + klass = rb_obj_class(ary); + if (len == 0) return ary_new(klass, 0); + + shared = ary_make_shared(ary); + ptr = RARRAY(ary)->ptr; + ary2 = ary_alloc(klass); + RARRAY(ary2)->ptr = ptr + beg; + RARRAY(ary2)->len = len; + RARRAY(ary2)->aux.shared = shared; + FL_SET(ary2, ELTS_SHARED); + + return ary2; +} + +/* + * call-seq: + * array[index] -> obj or nil + * array[start, length] -> an_array or nil + * array[range] -> an_array or nil + * array.slice(index) -> obj or nil + * array.slice(start, length) -> an_array or nil + * array.slice(range) -> an_array or nil + * + * Element Reference---Returns the element at _index_, + * or returns a subarray starting at _start_ and + * continuing for _length_ elements, or returns a subarray + * specified by _range_. + * Negative indices count backward from the end of the + * array (-1 is the last element). Returns nil if the index + * (or starting index) are out of range. + * + * a = [ "a", "b", "c", "d", "e" ] + * a[2] + a[0] + a[1] #=> "cab" + * a[6] #=> nil + * a[1, 2] #=> [ "b", "c" ] + * a[1..3] #=> [ "b", "c", "d" ] + * a[4..7] #=> [ "e" ] + * a[6..10] #=> nil + * a[-3, 3] #=> [ "c", "d", "e" ] + * # special cases + * a[5] #=> nil + * a[5, 1] #=> [] + * a[5..10] #=> [] + * + */ + +VALUE +rb_ary_aref(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + VALUE arg; + long beg, len; + + if (argc == 2) { + if (SYMBOL_P(argv[0])) { + rb_raise(rb_eTypeError, "Symbol as array index"); + } + beg = NUM2LONG(argv[0]); + len = NUM2LONG(argv[1]); + if (beg < 0) { + beg += RARRAY(ary)->len; + } + return rb_ary_subseq(ary, beg, len); + } + if (argc != 1) { + rb_scan_args(argc, argv, "11", 0, 0); + } + arg = argv[0]; + /* special case - speeding up */ + if (FIXNUM_P(arg)) { + return rb_ary_entry(ary, FIX2LONG(arg)); + } + if (SYMBOL_P(arg)) { + rb_raise(rb_eTypeError, "Symbol as array index"); + } + /* check if idx is Range */ + switch (rb_range_beg_len(arg, &beg, &len, RARRAY(ary)->len, 0)) { + case Qfalse: + break; + case Qnil: + return Qnil; + default: + return rb_ary_subseq(ary, beg, len); + } + return rb_ary_entry(ary, NUM2LONG(arg)); +} + +/* + * call-seq: + * array.at(index) -> obj or nil + * + * Returns the element at _index_. A + * negative index counts from the end of _self_. Returns +nil+ + * if the index is out of range. See also <code>Array#[]</code>. + * (<code>Array#at</code> is slightly faster than <code>Array#[]</code>, + * as it does not accept ranges and so on.) + * + * a = [ "a", "b", "c", "d", "e" ] + * a.at(0) #=> "a" + * a.at(-1) #=> "e" + */ + +static VALUE +rb_ary_at(ary, pos) + VALUE ary, pos; +{ + return rb_ary_entry(ary, NUM2LONG(pos)); +} + +/* + * call-seq: + * array.first -> obj or nil + * array.first(n) -> an_array + * + * Returns the first element, or the first +n+ elements, of the array. + * If the array is empty, the first form returns <code>nil</code>, and the + * second form returns an empty array. + * + * a = [ "q", "r", "s", "t" ] + * a.first #=> "q" + * a.first(1) #=> ["q"] + * a.first(3) #=> ["q", "r", "s"] + */ + +static VALUE +rb_ary_first(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + if (argc == 0) { + if (RARRAY(ary)->len == 0) return Qnil; + return RARRAY(ary)->ptr[0]; + } + else { + VALUE nv, result; + long n, i; + + rb_scan_args(argc, argv, "01", &nv); + n = NUM2LONG(nv); + if (n > RARRAY(ary)->len) n = RARRAY(ary)->len; + result = rb_ary_new2(n); + for (i=0; i<n; i++) { + rb_ary_push(result, RARRAY(ary)->ptr[i]); + } + return result; + } +} + +/* + * call-seq: + * array.last -> obj or nil + * array.last(n) -> an_array + * + * Returns the last element(s) of <i>self</i>. If the array is empty, + * the first form returns <code>nil</code>. + * + * [ "w", "x", "y", "z" ].last #=> "z" + */ + +static VALUE +rb_ary_last(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + if (argc == 0) { + if (RARRAY(ary)->len == 0) return Qnil; + return RARRAY(ary)->ptr[RARRAY(ary)->len-1]; + } + else { + VALUE nv, result; + long n, i; + + rb_scan_args(argc, argv, "01", &nv); + n = NUM2LONG(nv); + if (n > RARRAY(ary)->len) n = RARRAY(ary)->len; + result = rb_ary_new2(n); + for (i=RARRAY(ary)->len-n; n--; i++) { + rb_ary_push(result, RARRAY(ary)->ptr[i]); + } + return result; + } +} + +/* + * call-seq: + * array.fetch(index) -> obj + * array.fetch(index, default ) -> obj + * array.fetch(index) {|index| block } -> obj + * + * Tries to return the element at position <i>index</i>. If the index + * lies outside the array, the first form throws an + * <code>IndexError</code> exception, the second form returns + * <i>default</i>, and the third form returns the value of invoking + * the block, passing in the index. Negative values of <i>index</i> + * count from the end of the array. + * + * a = [ 11, 22, 33, 44 ] + * a.fetch(1) #=> 22 + * a.fetch(-1) #=> 44 + * a.fetch(4, 'cat') #=> "cat" + * a.fetch(4) { |i| i*i } #=> 16 + */ + +static VALUE +rb_ary_fetch(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + VALUE pos, ifnone; + long block_given; + long idx; + + rb_scan_args(argc, argv, "11", &pos, &ifnone); + block_given = rb_block_given_p(); + if (block_given && argc == 2) { + rb_warn("block supersedes default value argument"); + } + idx = NUM2LONG(pos); + + if (idx < 0) { + idx += RARRAY(ary)->len; + } + if (idx < 0 || RARRAY(ary)->len <= idx) { + if (block_given) return rb_yield(pos); + if (argc == 1) { + rb_raise(rb_eIndexError, "index %ld out of array", idx); + } + return ifnone; + } + return RARRAY(ary)->ptr[idx]; +} + +/* + * call-seq: + * array.index(obj) -> int or nil + * + * Returns the index of the first object in <i>self</i> such that is + * <code>==</code> to <i>obj</i>. Returns <code>nil</code> if + * no match is found. + * + * a = [ "a", "b", "c" ] + * a.index("b") #=> 1 + * a.index("z") #=> nil + */ + +static VALUE +rb_ary_index(ary, val) + VALUE ary; + VALUE val; +{ + long i; + + for (i=0; i<RARRAY(ary)->len; i++) { + if (rb_equal(RARRAY(ary)->ptr[i], val)) + return LONG2NUM(i); + } + return Qnil; +} + +/* + * call-seq: + * array.rindex(obj) -> int or nil + * + * Returns the index of the last object in <i>array</i> + * <code>==</code> to <i>obj</i>. Returns <code>nil</code> if + * no match is found. + * + * a = [ "a", "b", "b", "b", "c" ] + * a.rindex("b") #=> 3 + * a.rindex("z") #=> nil + */ + +static VALUE +rb_ary_rindex(ary, val) + VALUE ary; + VALUE val; +{ + long i = RARRAY(ary)->len; + + while (i--) { + if (i > RARRAY(ary)->len) { + i = RARRAY(ary)->len; + continue; + } + if (rb_equal(RARRAY(ary)->ptr[i], val)) + return LONG2NUM(i); + } + return Qnil; +} + +/* + * call-seq: + * array.indexes( i1, i2, ... iN ) -> an_array + * array.indices( i1, i2, ... iN ) -> an_array + * + * Deprecated; use <code>Array#values_at</code>. + */ + +static VALUE +rb_ary_indexes(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + VALUE new_ary; + long i; + + rb_warn("Array#%s is deprecated; use Array#values_at", rb_id2name(rb_frame_last_func())); + new_ary = rb_ary_new2(argc); + for (i=0; i<argc; i++) { + rb_ary_push(new_ary, rb_ary_aref(1, argv+i, ary)); + } + + return new_ary; +} + +VALUE +rb_ary_to_ary(obj) + VALUE obj; +{ + if (TYPE(obj) == T_ARRAY) { + return obj; + } + if (rb_respond_to(obj, rb_intern("to_ary"))) { + return rb_convert_type(obj, T_ARRAY, "Array", "to_ary"); + } + return rb_ary_new3(1, obj); +} + +static void +rb_ary_splice(ary, beg, len, rpl) + VALUE ary; + long beg, len; + VALUE rpl; +{ + long rlen; + + if (len < 0) rb_raise(rb_eIndexError, "negative length (%ld)", len); + if (beg < 0) { + beg += RARRAY(ary)->len; + if (beg < 0) { + beg -= RARRAY(ary)->len; + rb_raise(rb_eIndexError, "index %ld out of array", beg); + } + } + if (RARRAY(ary)->len < len || RARRAY(ary)->len < beg + len) { + len = RARRAY(ary)->len - beg; + } + + if (NIL_P(rpl)) { + rlen = 0; + } + else { + rpl = rb_ary_to_ary(rpl); + rlen = RARRAY(rpl)->len; + } + rb_ary_modify(ary); + + if (beg >= RARRAY(ary)->len) { + if (beg > ARY_MAX_SIZE - rlen) { + rb_raise(rb_eIndexError, "index %ld too big", beg); + } + len = beg + rlen; + if (len >= RARRAY(ary)->aux.capa) { + REALLOC_N(RARRAY(ary)->ptr, VALUE, len); + RARRAY(ary)->aux.capa = len; + } + rb_mem_clear(RARRAY(ary)->ptr + RARRAY(ary)->len, beg - RARRAY(ary)->len); + if (rlen > 0) { + MEMCPY(RARRAY(ary)->ptr + beg, RARRAY(rpl)->ptr, VALUE, rlen); + } + RARRAY(ary)->len = len; + } + else { + long alen; + + if (beg + len > RARRAY(ary)->len) { + len = RARRAY(ary)->len - beg; + } + + alen = RARRAY(ary)->len + rlen - len; + if (alen >= RARRAY(ary)->aux.capa) { + REALLOC_N(RARRAY(ary)->ptr, VALUE, alen); + RARRAY(ary)->aux.capa = alen; + } + + if (len != rlen) { + MEMMOVE(RARRAY(ary)->ptr + beg + rlen, RARRAY(ary)->ptr + beg + len, + VALUE, RARRAY(ary)->len - (beg + len)); + RARRAY(ary)->len = alen; + } + if (rlen > 0) { + MEMMOVE(RARRAY(ary)->ptr + beg, RARRAY(rpl)->ptr, VALUE, rlen); + } + } +} + +/* + * call-seq: + * array[index] = obj -> obj + * array[start, length] = obj or an_array or nil -> obj or an_array or nil + * array[range] = obj or an_array or nil -> obj or an_array or nil + * + * Element Assignment---Sets the element at _index_, + * or replaces a subarray starting at _start_ and + * continuing for _length_ elements, or replaces a subarray + * specified by _range_. If indices are greater than + * the current capacity of the array, the array grows + * automatically. A negative indices will count backward + * from the end of the array. Inserts elements if _length_ is + * zero. If +nil+ is used in the second and third form, + * deletes elements from _self_. An +IndexError+ is raised if a + * negative index points past the beginning of the array. See also + * <code>Array#push</code>, and <code>Array#unshift</code>. + * + * a = Array.new + * a[4] = "4"; #=> [nil, nil, nil, nil, "4"] + * a[0, 3] = [ 'a', 'b', 'c' ] #=> ["a", "b", "c", nil, "4"] + * a[1..2] = [ 1, 2 ] #=> ["a", 1, 2, nil, "4"] + * a[0, 2] = "?" #=> ["?", 2, nil, "4"] + * a[0..2] = "A" #=> ["A", "4"] + * a[-1] = "Z" #=> ["A", "Z"] + * a[1..-1] = nil #=> ["A"] + */ + +static VALUE +rb_ary_aset(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + long offset, beg, len; + + if (argc == 3) { + if (SYMBOL_P(argv[0])) { + rb_raise(rb_eTypeError, "Symbol as array index"); + } + if (SYMBOL_P(argv[1])) { + rb_raise(rb_eTypeError, "Symbol as subarray length"); + } + rb_ary_splice(ary, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]); + return argv[2]; + } + if (argc != 2) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc); + } + if (FIXNUM_P(argv[0])) { + offset = FIX2LONG(argv[0]); + goto fixnum; + } + if (SYMBOL_P(argv[0])) { + rb_raise(rb_eTypeError, "Symbol as array index"); + } + if (rb_range_beg_len(argv[0], &beg, &len, RARRAY(ary)->len, 1)) { + /* check if idx is Range */ + rb_ary_splice(ary, beg, len, argv[1]); + return argv[1]; + } + + offset = NUM2LONG(argv[0]); +fixnum: + rb_ary_store(ary, offset, argv[1]); + return argv[1]; +} + +/* + * call-seq: + * array.insert(index, obj...) -> array + * + * Inserts the given values before the element with the given index + * (which may be negative). + * + * a = %w{ a b c d } + * a.insert(2, 99) #=> ["a", "b", 99, "c", "d"] + * a.insert(-2, 1, 2, 3) #=> ["a", "b", 99, "c", 1, 2, 3, "d"] + */ + +static VALUE +rb_ary_insert(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + long pos; + + if (argc == 1) return ary; + if (argc < 1) { + rb_raise(rb_eArgError, "wrong number of arguments (at least 1)"); + } + pos = NUM2LONG(argv[0]); + if (pos == -1) { + pos = RARRAY(ary)->len; + } + if (pos < 0) { + pos++; + } + rb_ary_splice(ary, pos, 0, rb_ary_new4(argc - 1, argv + 1)); + return ary; +} + +/* + * call-seq: + * array.each {|item| block } -> array + * + * Calls <i>block</i> once for each element in <i>self</i>, passing that + * element as a parameter. + * + * a = [ "a", "b", "c" ] + * a.each {|x| print x, " -- " } + * + * produces: + * + * a -- b -- c -- + */ + +VALUE +rb_ary_each(ary) + VALUE ary; +{ + long i; + + for (i=0; i<RARRAY(ary)->len; i++) { + rb_yield(RARRAY(ary)->ptr[i]); + } + return ary; +} + +/* + * call-seq: + * array.each_index {|index| block } -> array + * + * Same as <code>Array#each</code>, but passes the index of the element + * instead of the element itself. + * + * a = [ "a", "b", "c" ] + * a.each_index {|x| print x, " -- " } + * + * produces: + * + * 0 -- 1 -- 2 -- + */ + +static VALUE +rb_ary_each_index(ary) + VALUE ary; +{ + long i; + + for (i=0; i<RARRAY(ary)->len; i++) { + rb_yield(LONG2NUM(i)); + } + return ary; +} + +/* + * call-seq: + * array.reverse_each {|item| block } + * + * Same as <code>Array#each</code>, but traverses <i>self</i> in reverse + * order. + * + * a = [ "a", "b", "c" ] + * a.reverse_each {|x| print x, " " } + * + * produces: + * + * c b a + */ + +static VALUE +rb_ary_reverse_each(ary) + VALUE ary; +{ + long len = RARRAY(ary)->len; + + while (len--) { + rb_yield(RARRAY(ary)->ptr[len]); + if (RARRAY(ary)->len < len) { + len = RARRAY(ary)->len; + } + } + return ary; +} + +/* + * call-seq: + * array.length -> int + * + * Returns the number of elements in <i>self</i>. May be zero. + * + * [ 1, 2, 3, 4, 5 ].length #=> 5 + */ + +static VALUE +rb_ary_length(ary) + VALUE ary; +{ + return LONG2NUM(RARRAY(ary)->len); +} + +/* + * call-seq: + * array.empty? -> true or false + * + * Returns <code>true</code> if <i>self</i> array contains no elements. + * + * [].empty? #=> true + */ + +static VALUE +rb_ary_empty_p(ary) + VALUE ary; +{ + if (RARRAY(ary)->len == 0) + return Qtrue; + return Qfalse; +} + +VALUE +rb_ary_dup(ary) + VALUE ary; +{ + VALUE dup = rb_ary_new2(RARRAY(ary)->len); + + DUPSETUP(dup, ary); + MEMCPY(RARRAY(dup)->ptr, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len); + RARRAY(dup)->len = RARRAY(ary)->len; + return dup; +} + +extern VALUE rb_output_fs; + +static VALUE +inspect_join(ary, arg) + VALUE ary; + VALUE *arg; +{ + return rb_ary_join(arg[0], arg[1]); +} + +VALUE +rb_ary_join(ary, sep) + VALUE ary, sep; +{ + long len = 1, i; + int taint = Qfalse; + VALUE result, tmp; + + if (RARRAY(ary)->len == 0) return rb_str_new(0, 0); + if (OBJ_TAINTED(ary) || OBJ_TAINTED(sep)) taint = Qtrue; + + for (i=0; i<RARRAY(ary)->len; i++) { + tmp = rb_check_string_type(RARRAY(ary)->ptr[i]); + len += NIL_P(tmp) ? 10 : RSTRING(tmp)->len; + } + if (!NIL_P(sep)) { + StringValue(sep); + len += RSTRING(sep)->len * (RARRAY(ary)->len - 1); + } + result = rb_str_buf_new(len); + for (i=0; i<RARRAY(ary)->len; i++) { + tmp = RARRAY(ary)->ptr[i]; + switch (TYPE(tmp)) { + case T_STRING: + break; + case T_ARRAY: + if (tmp == ary || rb_inspecting_p(tmp)) { + tmp = rb_str_new2("[...]"); + } + else { + VALUE args[2]; + + args[0] = tmp; + args[1] = sep; + tmp = rb_protect_inspect(inspect_join, ary, (VALUE)args); + } + break; + default: + tmp = rb_obj_as_string(tmp); + } + if (i > 0 && !NIL_P(sep)) + rb_str_buf_append(result, sep); + rb_str_buf_append(result, tmp); + if (OBJ_TAINTED(tmp)) taint = Qtrue; + } + + if (taint) OBJ_TAINT(result); + return result; +} + +/* + * call-seq: + * array.join(sep=$,) -> str + * + * Returns a string created by converting each element of the array to + * a string, separated by <i>sep</i>. + * + * [ "a", "b", "c" ].join #=> "abc" + * [ "a", "b", "c" ].join("-") #=> "a-b-c" + */ + +static VALUE +rb_ary_join_m(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + VALUE sep; + + rb_scan_args(argc, argv, "01", &sep); + if (NIL_P(sep)) sep = rb_output_fs; + + return rb_ary_join(ary, sep); +} + +/* + * call-seq: + * array.to_s -> string + * + * Returns _self_<code>.join</code>. + * + * [ "a", "e", "i", "o" ].to_s #=> "aeio" + * + */ + +VALUE +rb_ary_to_s(ary) + VALUE ary; +{ + if (RARRAY(ary)->len == 0) return rb_str_new(0, 0); + + return rb_ary_join(ary, rb_output_fs); +} + +static ID inspect_key; + +struct inspect_arg { + VALUE (*func)(); + VALUE arg1, arg2; +}; + +static VALUE +inspect_call(arg) + struct inspect_arg *arg; +{ + return (*arg->func)(arg->arg1, arg->arg2); +} + +static VALUE +get_inspect_tbl(create) + int create; +{ + VALUE inspect_tbl = rb_thread_local_aref(rb_thread_current(), inspect_key); + + if (NIL_P(inspect_tbl)) { + if (create) { + tbl_init: + inspect_tbl = rb_ary_new(); + rb_thread_local_aset(rb_thread_current(), inspect_key, inspect_tbl); + } + } + else if (TYPE(inspect_tbl) != T_ARRAY) { + rb_warn("invalid inspect_tbl value"); + if (create) goto tbl_init; + rb_thread_local_aset(rb_thread_current(), inspect_key, Qnil); + return Qnil; + } + return inspect_tbl; +} + +static VALUE +inspect_ensure(obj) + VALUE obj; +{ + VALUE inspect_tbl; + + inspect_tbl = get_inspect_tbl(Qfalse); + if (!NIL_P(inspect_tbl)) { + rb_ary_pop(inspect_tbl); + } + return 0; +} + +VALUE +rb_protect_inspect(func, obj, arg) + VALUE (*func)(ANYARGS); + VALUE obj, arg; +{ + struct inspect_arg iarg; + VALUE inspect_tbl; + VALUE id; + + inspect_tbl = get_inspect_tbl(Qtrue); + id = rb_obj_id(obj); + if (rb_ary_includes(inspect_tbl, id)) { + return (*func)(obj, arg); + } + rb_ary_push(inspect_tbl, id); + iarg.func = func; + iarg.arg1 = obj; + iarg.arg2 = arg; + + return rb_ensure(inspect_call, (VALUE)&iarg, inspect_ensure, obj); +} + +VALUE +rb_inspecting_p(obj) + VALUE obj; +{ + VALUE inspect_tbl; + + inspect_tbl = get_inspect_tbl(Qfalse); + if (NIL_P(inspect_tbl)) return Qfalse; + return rb_ary_includes(inspect_tbl, rb_obj_id(obj)); +} + +static VALUE +inspect_ary(ary) + VALUE ary; +{ + int tainted = OBJ_TAINTED(ary); + long i; + VALUE s, str; + + str = rb_str_buf_new2("["); + for (i=0; i<RARRAY(ary)->len; i++) { + s = rb_inspect(RARRAY(ary)->ptr[i]); + if (OBJ_TAINTED(s)) tainted = Qtrue; + if (i > 0) rb_str_buf_cat2(str, ", "); + rb_str_buf_append(str, s); + } + rb_str_buf_cat2(str, "]"); + if (tainted) OBJ_TAINT(str); + return str; +} + +/* + * call-seq: + * array.inspect -> string + * + * Create a printable version of <i>array</i>. + */ + +static VALUE +rb_ary_inspect(ary) + VALUE ary; +{ + if (RARRAY(ary)->len == 0) return rb_str_new2("[]"); + if (rb_inspecting_p(ary)) return rb_str_new2("[...]"); + return rb_protect_inspect(inspect_ary, ary, 0); +} + +/* + * call-seq: + * array.to_a -> array + * + * Returns _self_. If called on a subclass of Array, converts + * the receiver to an Array object. + */ + +static VALUE +rb_ary_to_a(ary) + VALUE ary; +{ + if (rb_obj_class(ary) != rb_cArray) { + VALUE dup = rb_ary_new2(RARRAY(ary)->len); + rb_ary_replace(dup, ary); + return dup; + } + return ary; +} + +/* + * call-seq: + * array.to_ary -> array + * + * Returns _self_. + */ + +static VALUE +rb_ary_to_ary_m(ary) + VALUE ary; +{ + return ary; +} + +VALUE +rb_ary_reverse(ary) + VALUE ary; +{ + VALUE *p1, *p2; + VALUE tmp; + + rb_ary_modify(ary); + if (RARRAY(ary)->len > 1) { + p1 = RARRAY(ary)->ptr; + p2 = p1 + RARRAY(ary)->len - 1; /* points last item */ + + while (p1 < p2) { + tmp = *p1; + *p1++ = *p2; + *p2-- = tmp; + } + } + return ary; +} + +/* + * call-seq: + * array.reverse! -> array + * + * Reverses _self_ in place. + * + * a = [ "a", "b", "c" ] + * a.reverse! #=> ["c", "b", "a"] + * a #=> ["c", "b", "a"] + */ + +static VALUE +rb_ary_reverse_bang(ary) + VALUE ary; +{ + return rb_ary_reverse(ary); +} + +/* + * call-seq: + * array.reverse -> an_array + * + * Returns a new array containing <i>self</i>'s elements in reverse order. + * + * [ "a", "b", "c" ].reverse #=> ["c", "b", "a"] + * [ 1 ].reverse #=> [1] + */ + +static VALUE +rb_ary_reverse_m(ary) + VALUE ary; +{ + return rb_ary_reverse(rb_ary_dup(ary)); +} + +struct ary_sort_data { + VALUE ary; + VALUE *ptr; + long len; +}; + +static void +ary_sort_check(data) + struct ary_sort_data *data; +{ + if (RARRAY(data->ary)->ptr != data->ptr || RARRAY(data->ary)->len != data->len) { + rb_raise(rb_eArgError, "array modified during sort"); + } +} + +static int +sort_1(a, b, data) + VALUE *a, *b; + struct ary_sort_data *data; +{ + VALUE retval = rb_yield_values(2, *a, *b); + int n; + + n = rb_cmpint(retval, *a, *b); + ary_sort_check(data); + return n; +} + +static int +sort_2(ap, bp, data) + VALUE *ap, *bp; + struct ary_sort_data *data; +{ + VALUE retval; + VALUE a = *ap, b = *bp; + int n; + + if (FIXNUM_P(a) && FIXNUM_P(b)) { + if ((long)a > (long)b) return 1; + if ((long)a < (long)b) return -1; + return 0; + } + if (TYPE(a) == T_STRING) { + if (TYPE(b) == T_STRING) return rb_str_cmp(a, b); + } + + retval = rb_funcall(a, id_cmp, 1, b); + n = rb_cmpint(retval, a, b); + ary_sort_check(data); + + return n; +} + +static VALUE +sort_internal(ary) + VALUE ary; +{ + struct ary_sort_data data; + + data.ary = ary; + data.ptr = RARRAY(ary)->ptr; data.len = RARRAY(ary)->len; + qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE), + rb_block_given_p()?sort_1:sort_2, &data); + return ary; +} + +static VALUE +sort_unlock(ary) + VALUE ary; +{ + FL_UNSET(ary, ARY_TMPLOCK); + return ary; +} + +/* + * call-seq: + * array.sort! -> array + * array.sort! {| a,b | block } -> array + * + * Sorts _self_. Comparisons for + * the sort will be done using the <code><=></code> operator or using + * an optional code block. The block implements a comparison between + * <i>a</i> and <i>b</i>, returning -1, 0, or +1. See also + * <code>Enumerable#sort_by</code>. + * + * a = [ "d", "a", "e", "c", "b" ] + * a.sort #=> ["a", "b", "c", "d", "e"] + * a.sort {|x,y| y <=> x } #=> ["e", "d", "c", "b", "a"] + */ + +VALUE +rb_ary_sort_bang(ary) + VALUE ary; +{ + rb_ary_modify(ary); + if (RARRAY(ary)->len > 1) { + FL_SET(ary, ARY_TMPLOCK); /* prohibit modification during sort */ + rb_ensure(sort_internal, ary, sort_unlock, ary); + } + return ary; +} + +/* + * call-seq: + * array.sort -> an_array + * array.sort {| a,b | block } -> an_array + * + * Returns a new array created by sorting <i>self</i>. Comparisons for + * the sort will be done using the <code><=></code> operator or using + * an optional code block. The block implements a comparison between + * <i>a</i> and <i>b</i>, returning -1, 0, or +1. See also + * <code>Enumerable#sort_by</code>. + * + * a = [ "d", "a", "e", "c", "b" ] + * a.sort #=> ["a", "b", "c", "d", "e"] + * a.sort {|x,y| y <=> x } #=> ["e", "d", "c", "b", "a"] + */ + +VALUE +rb_ary_sort(ary) + VALUE ary; +{ + ary = rb_ary_dup(ary); + rb_ary_sort_bang(ary); + return ary; +} + +/* + * call-seq: + * array.collect {|item| block } -> an_array + * array.map {|item| block } -> an_array + * + * Invokes <i>block</i> once for each element of <i>self</i>. Creates a + * new array containing the values returned by the block. + * See also <code>Enumerable#collect</code>. + * + * a = [ "a", "b", "c", "d" ] + * a.collect {|x| x + "!" } #=> ["a!", "b!", "c!", "d!"] + * a #=> ["a", "b", "c", "d"] + */ + +static VALUE +rb_ary_collect(ary) + VALUE ary; +{ + long i; + VALUE collect; + + if (!rb_block_given_p()) { + return rb_ary_new4(RARRAY(ary)->len, RARRAY(ary)->ptr); + } + + collect = rb_ary_new2(RARRAY(ary)->len); + for (i = 0; i < RARRAY(ary)->len; i++) { + rb_ary_push(collect, rb_yield(RARRAY(ary)->ptr[i])); + } + return collect; +} + +/* + * call-seq: + * array.collect! {|item| block } -> array + * array.map! {|item| block } -> array + * + * Invokes the block once for each element of _self_, replacing the + * element with the value returned by _block_. + * See also <code>Enumerable#collect</code>. + * + * a = [ "a", "b", "c", "d" ] + * a.collect! {|x| x + "!" } + * a #=> [ "a!", "b!", "c!", "d!" ] + */ + +static VALUE +rb_ary_collect_bang(ary) + VALUE ary; +{ + long i; + + rb_ary_modify(ary); + for (i = 0; i < RARRAY(ary)->len; i++) { + rb_ary_store(ary, i, rb_yield(RARRAY(ary)->ptr[i])); + } + return ary; +} + +VALUE +rb_values_at(obj, olen, argc, argv, func) + VALUE obj; + long olen; + int argc; + VALUE *argv; + VALUE (*func) _((VALUE,long)); +{ + VALUE result = rb_ary_new2(argc); + long beg, len, i, j; + + for (i=0; i<argc; i++) { + if (FIXNUM_P(argv[i])) { + rb_ary_push(result, (*func)(obj, FIX2LONG(argv[i]))); + continue; + } + /* check if idx is Range */ + switch (rb_range_beg_len(argv[i], &beg, &len, olen, 0)) { + case Qfalse: + break; + case Qnil: + continue; + default: + for (j=0; j<len; j++) { + rb_ary_push(result, (*func)(obj, j+beg)); + } + continue; + } + rb_ary_push(result, (*func)(obj, NUM2LONG(argv[i]))); + } + return result; +} + +/* + * call-seq: + * array.values_at(selector,... ) -> an_array + * + * Returns an array containing the elements in + * _self_ corresponding to the given selector(s). The selectors + * may be either integer indices or ranges. + * See also <code>Array#select</code>. + * + * a = %w{ a b c d e f } + * a.values_at(1, 3, 5) + * a.values_at(1, 3, 5, 7) + * a.values_at(-1, -3, -5, -7) + * a.values_at(1..3, 2...5) + */ + +static VALUE +rb_ary_values_at(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + return rb_values_at(ary, RARRAY(ary)->len, argc, argv, rb_ary_entry); +} + +/* + * call-seq: + * array.select {|item| block } -> an_array + * + * Invokes the block passing in successive elements from <i>array</i>, + * returning an array containing those elements for which the block + * returns a true value (equivalent to <code>Enumerable#select</code>). + * + * a = %w{ a b c d e f } + * a.select {|v| v =~ /[aeiou]/} #=> ["a", "e"] + */ + +static VALUE +rb_ary_select(ary) + VALUE ary; +{ + VALUE result; + long i; + + result = rb_ary_new2(RARRAY(ary)->len); + for (i = 0; i < RARRAY(ary)->len; i++) { + if (RTEST(rb_yield(RARRAY(ary)->ptr[i]))) { + rb_ary_push(result, rb_ary_elt(ary, i)); + } + } + return result; +} + +/* + * call-seq: + * array.delete(obj) -> obj or nil + * array.delete(obj) { block } -> obj or nil + * + * Deletes items from <i>self</i> that are equal to <i>obj</i>. If + * the item is not found, returns <code>nil</code>. If the optional + * code block is given, returns the result of <i>block</i> if the item + * is not found. + * + * a = [ "a", "b", "b", "b", "c" ] + * a.delete("b") #=> "b" + * a #=> ["a", "c"] + * a.delete("z") #=> nil + * a.delete("z") { "not found" } #=> "not found" + */ + +VALUE +rb_ary_delete(ary, item) + VALUE ary; + VALUE item; +{ + long i1, i2; + + for (i1 = i2 = 0; i1 < RARRAY(ary)->len; i1++) { + VALUE e = RARRAY(ary)->ptr[i1]; + + if (rb_equal(e, item)) continue; + if (i1 != i2) { + rb_ary_store(ary, i2, e); + } + i2++; + } + if (RARRAY(ary)->len == i2) { + if (rb_block_given_p()) { + return rb_yield(item); + } + return Qnil; + } + + rb_ary_modify(ary); + if (RARRAY(ary)->len > i2) { + RARRAY(ary)->len = i2; + if (i2 * 2 < RARRAY(ary)->aux.capa && + RARRAY(ary)->aux.capa > ARY_DEFAULT_SIZE) { + REALLOC_N(RARRAY(ary)->ptr, VALUE, i2 * 2); + RARRAY(ary)->aux.capa = i2 * 2; + } + } + + return item; +} + +VALUE +rb_ary_delete_at(ary, pos) + VALUE ary; + long pos; +{ + long i, len = RARRAY(ary)->len; + VALUE del; + + if (pos >= len) return Qnil; + if (pos < 0) { + pos += len; + if (pos < 0) return Qnil; + } + + rb_ary_modify(ary); + del = RARRAY(ary)->ptr[pos]; + for (i = pos + 1; i < len; i++, pos++) { + RARRAY(ary)->ptr[pos] = RARRAY(ary)->ptr[i]; + } + RARRAY(ary)->len = pos; + + return del; +} + +/* + * call-seq: + * array.delete_at(index) -> obj or nil + * + * Deletes the element at the specified index, returning that element, + * or <code>nil</code> if the index is out of range. See also + * <code>Array#slice!</code>. + * + * a = %w( ant bat cat dog ) + * a.delete_at(2) #=> "cat" + * a #=> ["ant", "bat", "dog"] + * a.delete_at(99) #=> nil + */ + +static VALUE +rb_ary_delete_at_m(ary, pos) + VALUE ary, pos; +{ + return rb_ary_delete_at(ary, NUM2LONG(pos)); +} + +/* + * call-seq: + * array.slice!(index) -> obj or nil + * array.slice!(start, length) -> sub_array or nil + * array.slice!(range) -> sub_array or nil + * + * Deletes the element(s) given by an index (optionally with a length) + * or by a range. Returns the deleted object, subarray, or + * <code>nil</code> if the index is out of range. Equivalent to: + * + * def slice!(*args) + * result = self[*args] + * self[*args] = nil + * result + * end + * + * a = [ "a", "b", "c" ] + * a.slice!(1) #=> "b" + * a #=> ["a", "c"] + * a.slice!(-1) #=> "c" + * a #=> ["a"] + * a.slice!(100) #=> nil + * a #=> ["a"] + */ + +static VALUE +rb_ary_slice_bang(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + VALUE arg1, arg2; + long pos, len; + + if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) { + pos = NUM2LONG(arg1); + len = NUM2LONG(arg2); + delete_pos_len: + if (pos < 0) { + pos = RARRAY(ary)->len + pos; + } + arg2 = rb_ary_subseq(ary, pos, len); + rb_ary_splice(ary, pos, len, Qnil); /* Qnil/rb_ary_new2(0) */ + return arg2; + } + + if (!FIXNUM_P(arg1) && rb_range_beg_len(arg1, &pos, &len, RARRAY(ary)->len, 1)) { + goto delete_pos_len; + } + + return rb_ary_delete_at(ary, NUM2LONG(arg1)); +} + +/* + * call-seq: + * array.reject! {|item| block } -> array or nil + * + * Equivalent to <code>Array#delete_if</code>, deleting elements from + * _self_ for which the block evaluates to true, but returns + * <code>nil</code> if no changes were made. Also see + * <code>Enumerable#reject</code>. + */ + +static VALUE +rb_ary_reject_bang(ary) + VALUE ary; +{ + long i1, i2; + + rb_ary_modify(ary); + for (i1 = i2 = 0; i1 < RARRAY(ary)->len; i1++) { + VALUE v = RARRAY(ary)->ptr[i1]; + if (RTEST(rb_yield(v))) continue; + if (i1 != i2) { + rb_ary_store(ary, i2, v); + } + i2++; + } + if (RARRAY(ary)->len == i2) return Qnil; + if (i2 < RARRAY(ary)->len) + RARRAY(ary)->len = i2; + + return ary; +} + +/* + * call-seq: + * array.reject {|item| block } -> an_array + * + * Returns a new array containing the items in _self_ + * for which the block is not true. + */ + +static VALUE +rb_ary_reject(ary) + VALUE ary; +{ + ary = rb_ary_dup(ary); + rb_ary_reject_bang(ary); + return ary; +} + +/* + * call-seq: + * array.delete_if {|item| block } -> array + * + * Deletes every element of <i>self</i> for which <i>block</i> evaluates + * to <code>true</code>. + * + * a = [ "a", "b", "c" ] + * a.delete_if {|x| x >= "b" } #=> ["a"] + */ + +static VALUE +rb_ary_delete_if(ary) + VALUE ary; +{ + rb_ary_reject_bang(ary); + return ary; +} + +/* + * call-seq: + * array.zip(arg, ...) -> an_array + * array.zip(arg, ...) {| arr | block } -> nil + * + * Converts any arguments to arrays, then merges elements of + * <i>self</i> with corresponding elements from each argument. This + * generates a sequence of <code>self.size</code> <em>n</em>-element + * arrays, where <em>n</em> is one more that the count of arguments. If + * the size of any argument is less than <code>enumObj.size</code>, + * <code>nil</code> values are supplied. If a block given, it is + * invoked for each output array, otherwise an array of arrays is + * returned. + * + * a = [ 4, 5, 6 ] + * b = [ 7, 8, 9 ] + * + * [1,2,3].zip(a, b) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] + * [1,2].zip(a,b) #=> [[1, 4, 7], [2, 5, 8]] + * a.zip([1,2],[8]) #=> [[4,1,8], [5,2,nil], [6,nil,nil]] + */ + +static VALUE +rb_ary_zip(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + int i, j; + long len; + VALUE result; + + for (i=0; i<argc; i++) { + argv[i] = to_ary(argv[i]); + } + if (rb_block_given_p()) { + for (i=0; i<RARRAY(ary)->len; i++) { + VALUE tmp = rb_ary_new2(argc+1); + + rb_ary_push(tmp, rb_ary_elt(ary, i)); + for (j=0; j<argc; j++) { + rb_ary_push(tmp, rb_ary_elt(argv[j], i)); + } + rb_yield(tmp); + } + return Qnil; + } + len = RARRAY(ary)->len; + result = rb_ary_new2(len); + for (i=0; i<len; i++) { + VALUE tmp = rb_ary_new2(argc+1); + + rb_ary_push(tmp, rb_ary_elt(ary, i)); + for (j=0; j<argc; j++) { + rb_ary_push(tmp, rb_ary_elt(argv[j], i)); + } + rb_ary_push(result, tmp); + } + return result; +} + +/* + * call-seq: + * array.transpose -> an_array + * + * Assumes that <i>self</i> is an array of arrays and transposes the + * rows and columns. + * + * a = [[1,2], [3,4], [5,6]] + * a.transpose #=> [[1, 3, 5], [2, 4, 6]] + */ + +static VALUE +rb_ary_transpose(ary) + VALUE ary; +{ + long elen = -1, alen, i, j; + VALUE tmp, result = 0; + + alen = RARRAY(ary)->len; + if (alen == 0) return rb_ary_dup(ary); + for (i=0; i<alen; i++) { + tmp = to_ary(rb_ary_elt(ary, i)); + if (elen < 0) { /* first element */ + elen = RARRAY(tmp)->len; + result = rb_ary_new2(elen); + for (j=0; j<elen; j++) { + rb_ary_store(result, j, rb_ary_new2(alen)); + } + } + else if (elen != RARRAY(tmp)->len) { + rb_raise(rb_eIndexError, "element size differs (%d should be %d)", + RARRAY(tmp)->len, elen); + } + for (j=0; j<elen; j++) { + rb_ary_store(rb_ary_elt(result, j), i, rb_ary_elt(tmp, j)); + } + } + return result; +} + +/* + * call-seq: + * array.replace(other_array) -> array + * + * Replaces the contents of <i>self</i> with the contents of + * <i>other_array</i>, truncating or expanding if necessary. + * + * a = [ "a", "b", "c", "d", "e" ] + * a.replace([ "x", "y", "z" ]) #=> ["x", "y", "z"] + * a #=> ["x", "y", "z"] + */ + +static VALUE +rb_ary_replace(copy, orig) + VALUE copy, orig; +{ + VALUE shared; + + rb_ary_modify(copy); + orig = to_ary(orig); + if (copy == orig) return copy; + shared = ary_make_shared(orig); + if (RARRAY(copy)->ptr && !FL_TEST(copy, ELTS_SHARED)) + free(RARRAY(copy)->ptr); + RARRAY(copy)->ptr = RARRAY(orig)->ptr; + RARRAY(copy)->len = RARRAY(orig)->len; + RARRAY(copy)->aux.shared = shared; + FL_SET(copy, ELTS_SHARED); + + return copy; +} + +/* + * call-seq: + * array.clear -> array + * + * Removes all elements from _self_. + * + * a = [ "a", "b", "c", "d", "e" ] + * a.clear #=> [ ] + */ + +VALUE +rb_ary_clear(ary) + VALUE ary; +{ + rb_ary_modify(ary); + RARRAY(ary)->len = 0; + if (ARY_DEFAULT_SIZE * 2 < RARRAY(ary)->aux.capa) { + REALLOC_N(RARRAY(ary)->ptr, VALUE, ARY_DEFAULT_SIZE * 2); + RARRAY(ary)->aux.capa = ARY_DEFAULT_SIZE * 2; + } + return ary; +} + +/* + * call-seq: + * array.fill(obj) -> array + * array.fill(obj, start [, length]) -> array + * array.fill(obj, range ) -> array + * array.fill {|index| block } -> array + * array.fill(start [, length] ) {|index| block } -> array + * array.fill(range) {|index| block } -> array + * + * The first three forms set the selected elements of <i>self</i> (which + * may be the entire array) to <i>obj</i>. A <i>start</i> of + * <code>nil</code> is equivalent to zero. A <i>length</i> of + * <code>nil</code> is equivalent to <i>self.length</i>. The last three + * forms fill the array with the value of the block. The block is + * passed the absolute index of each element to be filled. + * + * a = [ "a", "b", "c", "d" ] + * a.fill("x") #=> ["x", "x", "x", "x"] + * a.fill("z", 2, 2) #=> ["x", "x", "z", "z"] + * a.fill("y", 0..1) #=> ["y", "y", "z", "z"] + * a.fill {|i| i*i} #=> [0, 1, 4, 9] + * a.fill(-2) {|i| i*i*i} #=> [0, 1, 8, 27] + */ + +static VALUE +rb_ary_fill(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + VALUE item, arg1, arg2; + long beg = 0, end = 0, len = 0; + VALUE *p, *pend; + int block_p = Qfalse; + + if (rb_block_given_p()) { + block_p = Qtrue; + rb_scan_args(argc, argv, "02", &arg1, &arg2); + argc += 1; /* hackish */ + } + else { + rb_scan_args(argc, argv, "12", &item, &arg1, &arg2); + } + switch (argc) { + case 1: + beg = 0; + len = RARRAY(ary)->len; + break; + case 2: + if (rb_range_beg_len(arg1, &beg, &len, RARRAY(ary)->len, 1)) { + break; + } + /* fall through */ + case 3: + beg = NIL_P(arg1) ? 0 : NUM2LONG(arg1); + if (beg < 0) { + beg = RARRAY(ary)->len + beg; + if (beg < 0) beg = 0; + } + len = NIL_P(arg2) ? RARRAY(ary)->len - beg : NUM2LONG(arg2); + break; + } + rb_ary_modify(ary); + if (len < 0) { + return ary; + } + if (beg >= ARY_MAX_SIZE || len > ARY_MAX_SIZE - beg) { + rb_raise(rb_eArgError, "argument too big"); + } + end = beg + len; + if (end > RARRAY(ary)->len) { + if (end >= RARRAY(ary)->aux.capa) { + REALLOC_N(RARRAY(ary)->ptr, VALUE, end); + RARRAY(ary)->aux.capa = end; + } + rb_mem_clear(RARRAY(ary)->ptr + RARRAY(ary)->len, end - RARRAY(ary)->len); + RARRAY(ary)->len = end; + } + + if (block_p) { + VALUE v; + long i; + + for (i=beg; i<end; i++) { + v = rb_yield(LONG2NUM(i)); + if (i>=RARRAY(ary)->len) break; + RARRAY(ary)->ptr[i] = v; + } + } + else { + p = RARRAY(ary)->ptr + beg; + pend = p + len; + while (p < pend) { + *p++ = item; + } + } + return ary; +} + +/* + * call-seq: + * array + other_array -> an_array + * + * Concatenation---Returns a new array built by concatenating the + * two arrays together to produce a third array. + * + * [ 1, 2, 3 ] + [ 4, 5 ] #=> [ 1, 2, 3, 4, 5 ] + */ + +VALUE +rb_ary_plus(x, y) + VALUE x, y; +{ + VALUE z; + long len; + + y = to_ary(y); + len = RARRAY(x)->len + RARRAY(y)->len; + z = rb_ary_new2(len); + MEMCPY(RARRAY(z)->ptr, RARRAY(x)->ptr, VALUE, RARRAY(x)->len); + MEMCPY(RARRAY(z)->ptr + RARRAY(x)->len, RARRAY(y)->ptr, VALUE, RARRAY(y)->len); + RARRAY(z)->len = len; + return z; +} + +/* + * call-seq: + * array.concat(other_array) -> array + * + * Appends the elements in other_array to _self_. + * + * [ "a", "b" ].concat( ["c", "d"] ) #=> [ "a", "b", "c", "d" ] + */ + + +VALUE +rb_ary_concat(x, y) + VALUE x, y; +{ + y = to_ary(y); + if (RARRAY(y)->len > 0) { + rb_ary_splice(x, RARRAY(x)->len, 0, y); + } + return x; +} + + +/* + * call-seq: + * array * int -> an_array + * array * str -> a_string + * + * Repetition---With a String argument, equivalent to + * self.join(str). Otherwise, returns a new array + * built by concatenating the _int_ copies of _self_. + * + * + * [ 1, 2, 3 ] * 3 #=> [ 1, 2, 3, 1, 2, 3, 1, 2, 3 ] + * [ 1, 2, 3 ] * "," #=> "1,2,3" + * + */ + +static VALUE +rb_ary_times(ary, times) + VALUE ary, times; +{ + VALUE ary2, tmp; + long i, len; + + tmp = rb_check_string_type(times); + if (!NIL_P(tmp)) { + return rb_ary_join(ary, tmp); + } + + len = NUM2LONG(times); + if (len == 0) return ary_new(rb_obj_class(ary), 0); + if (len < 0) { + rb_raise(rb_eArgError, "negative argument"); + } + if (ARY_MAX_SIZE/len < RARRAY(ary)->len) { + rb_raise(rb_eArgError, "argument too big"); + } + len *= RARRAY(ary)->len; + + ary2 = ary_new(rb_obj_class(ary), len); + RARRAY(ary2)->len = len; + + for (i=0; i<len; i+=RARRAY(ary)->len) { + MEMCPY(RARRAY(ary2)->ptr+i, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len); + } + OBJ_INFECT(ary2, ary); + + return ary2; +} + +/* + * call-seq: + * array.assoc(obj) -> an_array or nil + * + * Searches through an array whose elements are also arrays + * comparing _obj_ with the first element of each contained array + * using obj.==. + * Returns the first contained array that matches (that + * is, the first associated array), + * or +nil+ if no match is found. + * See also <code>Array#rassoc</code>. + * + * s1 = [ "colors", "red", "blue", "green" ] + * s2 = [ "letters", "a", "b", "c" ] + * s3 = "foo" + * a = [ s1, s2, s3 ] + * a.assoc("letters") #=> [ "letters", "a", "b", "c" ] + * a.assoc("foo") #=> nil + */ + +VALUE +rb_ary_assoc(ary, key) + VALUE ary, key; +{ + long i; + VALUE v; + + for (i = 0; i < RARRAY(ary)->len; ++i) { + v = RARRAY(ary)->ptr[i]; + if (TYPE(v) == T_ARRAY && + RARRAY(v)->len > 0 && + rb_equal(RARRAY(v)->ptr[0], key)) + return v; + } + return Qnil; +} + +/* + * call-seq: + * array.rassoc(key) -> an_array or nil + * + * Searches through the array whose elements are also arrays. Compares + * <em>key</em> with the second element of each contained array using + * <code>==</code>. Returns the first contained array that matches. See + * also <code>Array#assoc</code>. + * + * a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ] + * a.rassoc("two") #=> [2, "two"] + * a.rassoc("four") #=> nil + */ + +VALUE +rb_ary_rassoc(ary, value) + VALUE ary, value; +{ + long i; + VALUE v; + + for (i = 0; i < RARRAY(ary)->len; ++i) { + v = RARRAY(ary)->ptr[i]; + if (TYPE(v) == T_ARRAY && + RARRAY(v)->len > 1 && + rb_equal(RARRAY(v)->ptr[1], value)) + return v; + } + return Qnil; +} + +static VALUE +recursive_equal(ary1, ary2) + VALUE ary1, ary2; +{ + long i; + + for (i=0; i<RARRAY(ary1)->len; i++) { + if (!rb_equal(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i))) + return Qfalse; + } + return Qtrue; +} + +/* + * call-seq: + * array == other_array -> bool + * + * Equality---Two arrays are equal if they contain the same number + * of elements and if each element is equal to (according to + * Object.==) the corresponding element in the other array. + * + * [ "a", "c" ] == [ "a", "c", 7 ] #=> false + * [ "a", "c", 7 ] == [ "a", "c", 7 ] #=> true + * [ "a", "c", 7 ] == [ "a", "d", "f" ] #=> false + * + */ + +static VALUE +rb_ary_equal(ary1, ary2) + VALUE ary1, ary2; +{ + if (ary1 == ary2) return Qtrue; + if (TYPE(ary2) != T_ARRAY) { + if (!rb_respond_to(ary2, rb_intern("to_ary"))) { + return Qfalse; + } + return rb_equal(ary2, ary1); + } + if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse; + if (rb_inspecting_p(ary1)) return Qfalse; + return rb_protect_inspect(recursive_equal, ary1, ary2); +} + +static VALUE +recursive_eql(ary1, ary2) + VALUE ary1, ary2; +{ + long i; + + for (i=0; i<RARRAY(ary1)->len; i++) { + if (!rb_eql(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i))) + return Qfalse; + } + return Qtrue; +} + +/* + * call-seq: + * array.eql?(other) -> true or false + * + * Returns <code>true</code> if _array_ and _other_ are the same object, + * or are both arrays with the same content. + */ + +static VALUE +rb_ary_eql(ary1, ary2) + VALUE ary1, ary2; +{ + if (ary1 == ary2) return Qtrue; + if (TYPE(ary2) != T_ARRAY) return Qfalse; + if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse; + if (rb_inspecting_p(ary1)) return Qfalse; + return rb_protect_inspect(recursive_eql, ary1, ary2); +} + +static VALUE recursive_hash _((VALUE ary)); + +static VALUE +recursive_hash(ary) + VALUE ary; +{ + long i, h; + VALUE n; + + h = RARRAY(ary)->len; + for (i=0; i<RARRAY(ary)->len; i++) { + h = (h << 1) | (h<0 ? 1 : 0); + n = rb_hash(RARRAY(ary)->ptr[i]); + h ^= NUM2LONG(n); + } + return LONG2FIX(h); +} + +/* + * call-seq: + * array.hash -> fixnum + * + * Compute a hash-code for this array. Two arrays with the same content + * will have the same hash code (and will compare using <code>eql?</code>). + */ + +static VALUE +rb_ary_hash(ary) + VALUE ary; +{ + if (rb_inspecting_p(ary)) { + return LONG2FIX(0); + } + return rb_protect_inspect(recursive_hash, ary, 0); +} + +/* + * call-seq: + * array.include?(obj) -> true or false + * + * Returns <code>true</code> if the given object is present in + * <i>self</i> (that is, if any object <code>==</code> <i>anObject</i>), + * <code>false</code> otherwise. + * + * a = [ "a", "b", "c" ] + * a.include?("b") #=> true + * a.include?("z") #=> false + */ + +VALUE +rb_ary_includes(ary, item) + VALUE ary; + VALUE item; +{ + long i; + + for (i=0; i<RARRAY(ary)->len; i++) { + if (rb_equal(RARRAY(ary)->ptr[i], item)) { + return Qtrue; + } + } + return Qfalse; +} + +VALUE +recursive_cmp(ary1, ary2) + VALUE ary1, ary2; +{ + long i, len; + + len = RARRAY(ary1)->len; + if (len > RARRAY(ary2)->len) { + len = RARRAY(ary2)->len; + } + for (i=0; i<len; i++) { + VALUE v = rb_funcall(rb_ary_elt(ary1, i), id_cmp, 1, rb_ary_elt(ary2, i)); + if (v != INT2FIX(0)) { + return v; + } + } + return Qundef; +} + +/* + * call-seq: + * array <=> other_array -> -1, 0, +1 + * + * Comparison---Returns an integer (-1, 0, + * or +1) if this array is less than, equal to, or greater than + * other_array. Each object in each array is compared + * (using <=>). If any value isn't + * equal, then that inequality is the return value. If all the + * values found are equal, then the return is based on a + * comparison of the array lengths. Thus, two arrays are + * ``equal'' according to <code>Array#<=></code> if and only if they have + * the same length and the value of each element is equal to the + * value of the corresponding element in the other array. + * + * [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1 + * [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1 + * + */ + +VALUE +rb_ary_cmp(ary1, ary2) + VALUE ary1, ary2; +{ + long len; + VALUE v; + + ary2 = to_ary(ary2); + if (ary1 == ary2) return INT2FIX(0); + if (rb_inspecting_p(ary1)) return INT2FIX(0); + v = rb_protect_inspect(recursive_cmp, ary1, ary2); + if (v != Qundef) return v; + len = RARRAY(ary1)->len - RARRAY(ary2)->len; + if (len == 0) return INT2FIX(0); + if (len > 0) return INT2FIX(1); + return INT2FIX(-1); +} + +static VALUE +ary_make_hash(ary1, ary2) + VALUE ary1, ary2; +{ + VALUE hash = rb_hash_new(); + long i; + + for (i=0; i<RARRAY(ary1)->len; i++) { + rb_hash_aset(hash, RARRAY(ary1)->ptr[i], Qtrue); + } + if (ary2) { + for (i=0; i<RARRAY(ary2)->len; i++) { + rb_hash_aset(hash, RARRAY(ary2)->ptr[i], Qtrue); + } + } + return hash; +} + +/* + * call-seq: + * array - other_array -> an_array + * + * Array Difference---Returns a new array that is a copy of + * the original array, removing any items that also appear in + * other_array. (If you need set-like behavior, see the + * library class Set.) + * + * [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ] + */ + +static VALUE +rb_ary_diff(ary1, ary2) + VALUE ary1, ary2; +{ + VALUE ary3; + volatile VALUE hash; + long i; + + hash = ary_make_hash(to_ary(ary2), 0); + ary3 = rb_ary_new(); + + for (i=0; i<RARRAY(ary1)->len; i++) { + if (st_lookup(RHASH(hash)->tbl, RARRAY(ary1)->ptr[i], 0)) continue; + rb_ary_push(ary3, rb_ary_elt(ary1, i)); + } + return ary3; +} + +/* + * call-seq: + * array & other_array + * + * Set Intersection---Returns a new array + * containing elements common to the two arrays, with no duplicates. + * + * [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ] + */ + + +static VALUE +rb_ary_and(ary1, ary2) + VALUE ary1, ary2; +{ + VALUE hash, ary3, v, vv; + long i; + + ary2 = to_ary(ary2); + ary3 = rb_ary_new2(RARRAY(ary1)->len < RARRAY(ary2)->len ? + RARRAY(ary1)->len : RARRAY(ary2)->len); + hash = ary_make_hash(ary2, 0); + + for (i=0; i<RARRAY(ary1)->len; i++) { + v = vv = rb_ary_elt(ary1, i); + if (st_delete(RHASH(hash)->tbl, (st_data_t*)&vv, 0)) { + rb_ary_push(ary3, v); + } + } + + return ary3; +} + +/* + * call-seq: + * array | other_array -> an_array + * + * Set Union---Returns a new array by joining this array with + * other_array, removing duplicates. + * + * [ "a", "b", "c" ] | [ "c", "d", "a" ] + * #=> [ "a", "b", "c", "d" ] + */ + +static VALUE +rb_ary_or(ary1, ary2) + VALUE ary1, ary2; +{ + VALUE hash, ary3; + VALUE v, vv; + long i; + + ary2 = to_ary(ary2); + ary3 = rb_ary_new2(RARRAY(ary1)->len+RARRAY(ary2)->len); + hash = ary_make_hash(ary1, ary2); + + for (i=0; i<RARRAY(ary1)->len; i++) { + v = vv = rb_ary_elt(ary1, i); + if (st_delete(RHASH(hash)->tbl, (st_data_t*)&vv, 0)) { + rb_ary_push(ary3, v); + } + } + for (i=0; i<RARRAY(ary2)->len; i++) { + v = vv = rb_ary_elt(ary2, i); + if (st_delete(RHASH(hash)->tbl, (st_data_t*)&vv, 0)) { + rb_ary_push(ary3, v); + } + } + return ary3; +} + +/* + * call-seq: + * array.uniq! -> array or nil + * + * Removes duplicate elements from _self_. + * Returns <code>nil</code> if no changes are made (that is, no + * duplicates are found). + * + * a = [ "a", "a", "b", "b", "c" ] + * a.uniq! #=> ["a", "b", "c"] + * b = [ "a", "b", "c" ] + * b.uniq! #=> nil + */ + +static VALUE +rb_ary_uniq_bang(ary) + VALUE ary; +{ + VALUE hash, v, vv; + long i, j; + + hash = ary_make_hash(ary, 0); + + if (RARRAY(ary)->len == RHASH(hash)->tbl->num_entries) { + return Qnil; + } + for (i=j=0; i<RARRAY(ary)->len; i++) { + v = vv = rb_ary_elt(ary, i); + if (st_delete(RHASH(hash)->tbl, (st_data_t*)&vv, 0)) { + rb_ary_store(ary, j++, v); + } + } + RARRAY(ary)->len = j; + + return ary; +} + +/* + * call-seq: + * array.uniq -> an_array + * + * Returns a new array by removing duplicate values in <i>self</i>. + * + * a = [ "a", "a", "b", "b", "c" ] + * a.uniq #=> ["a", "b", "c"] + */ + +static VALUE +rb_ary_uniq(ary) + VALUE ary; +{ + ary = rb_ary_dup(ary); + rb_ary_uniq_bang(ary); + return ary; +} + +/* + * call-seq: + * array.compact! -> array or nil + * + * Removes +nil+ elements from array. + * Returns +nil+ if no changes were made. + * + * [ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ] + * [ "a", "b", "c" ].compact! #=> nil + */ + +static VALUE +rb_ary_compact_bang(ary) + VALUE ary; +{ + VALUE *p, *t, *end; + + rb_ary_modify(ary); + p = t = RARRAY(ary)->ptr; + end = p + RARRAY(ary)->len; + + while (t < end) { + if (NIL_P(*t)) t++; + else *p++ = *t++; + } + if (RARRAY(ary)->len == (p - RARRAY(ary)->ptr)) { + return Qnil; + } + RARRAY(ary)->len = RARRAY(ary)->aux.capa = (p - RARRAY(ary)->ptr); + REALLOC_N(RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len); + + return ary; +} + +/* + * call-seq: + * array.compact -> an_array + * + * Returns a copy of _self_ with all +nil+ elements removed. + * + * [ "a", nil, "b", nil, "c", nil ].compact + * #=> [ "a", "b", "c" ] + */ + +static VALUE +rb_ary_compact(ary) + VALUE ary; +{ + ary = rb_ary_dup(ary); + rb_ary_compact_bang(ary); + return ary; +} + +/* + * call-seq: + * array.nitems -> int + * + * Returns the number of non-<code>nil</code> elements in _self_. + * May be zero. + * + * [ 1, nil, 3, nil, 5 ].nitems #=> 3 + */ + +static VALUE +rb_ary_nitems(ary) + VALUE ary; +{ + long n = 0; + VALUE *p, *pend; + + p = RARRAY(ary)->ptr; + pend = p + RARRAY(ary)->len; + + while (p < pend) { + if (!NIL_P(*p)) n++; + p++; + } + return LONG2NUM(n); +} + +static long +flatten(ary, idx, ary2, memo) + VALUE ary; + long idx; + VALUE ary2, memo; +{ + VALUE id; + long i = idx; + long n, lim = idx + RARRAY(ary2)->len; + + id = rb_obj_id(ary2); + if (rb_ary_includes(memo, id)) { + rb_raise(rb_eArgError, "tried to flatten recursive array"); + } + rb_ary_push(memo, id); + rb_ary_splice(ary, idx, 1, ary2); + while (i < lim) { + VALUE tmp; + + tmp = rb_check_array_type(rb_ary_elt(ary, i)); + if (!NIL_P(tmp)) { + n = flatten(ary, i, tmp, memo); + i += n; lim += n; + } + i++; + } + rb_ary_pop(memo); + + return lim - idx - 1; /* returns number of increased items */ +} + +/* + * call-seq: + * array.flatten! -> array or nil + * + * Flattens _self_ in place. + * Returns <code>nil</code> if no modifications were made (i.e., + * <i>array</i> contains no subarrays.) + * + * a = [ 1, 2, [3, [4, 5] ] ] + * a.flatten! #=> [1, 2, 3, 4, 5] + * a.flatten! #=> nil + * a #=> [1, 2, 3, 4, 5] + */ + +static VALUE +rb_ary_flatten_bang(ary) + VALUE ary; +{ + long i = 0; + int mod = 0; + VALUE memo = Qnil; + + while (i<RARRAY(ary)->len) { + VALUE ary2 = RARRAY(ary)->ptr[i]; + VALUE tmp; + + tmp = rb_check_array_type(ary2); + if (!NIL_P(tmp)) { + if (NIL_P(memo)) { + memo = rb_ary_new(); + } + i += flatten(ary, i, tmp, memo); + mod = 1; + } + i++; + } + if (mod == 0) return Qnil; + return ary; +} + +/* + * call-seq: + * array.flatten -> an_array + * + * Returns a new array that is a one-dimensional flattening of this + * array (recursively). That is, for every element that is an array, + * extract its elements into the new array. + * + * s = [ 1, 2, 3 ] #=> [1, 2, 3] + * t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]] + * a = [ s, t, 9, 10 ] #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10] + * a.flatten #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + */ + +static VALUE +rb_ary_flatten(ary) + VALUE ary; +{ + ary = rb_ary_dup(ary); + rb_ary_flatten_bang(ary); + return ary; +} + + +/* Arrays are ordered, integer-indexed collections of any object. + * Array indexing starts at 0, as in C or Java. A negative index is + * assumed to be relative to the end of the array---that is, an index of -1 + * indicates the last element of the array, -2 is the next to last + * element in the array, and so on. + */ + +void +Init_Array() +{ + rb_cArray = rb_define_class("Array", rb_cObject); + rb_include_module(rb_cArray, rb_mEnumerable); + + rb_define_alloc_func(rb_cArray, ary_alloc); + rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1); + rb_define_method(rb_cArray, "initialize", rb_ary_initialize, -1); + rb_define_method(rb_cArray, "initialize_copy", rb_ary_replace, 1); + + rb_define_method(rb_cArray, "to_s", rb_ary_to_s, 0); + rb_define_method(rb_cArray, "inspect", rb_ary_inspect, 0); + rb_define_method(rb_cArray, "to_a", rb_ary_to_a, 0); + rb_define_method(rb_cArray, "to_ary", rb_ary_to_ary_m, 0); + rb_define_method(rb_cArray, "frozen?", rb_ary_frozen_p, 0); + + rb_define_method(rb_cArray, "==", rb_ary_equal, 1); + rb_define_method(rb_cArray, "eql?", rb_ary_eql, 1); + rb_define_method(rb_cArray, "hash", rb_ary_hash, 0); + + rb_define_method(rb_cArray, "[]", rb_ary_aref, -1); + rb_define_method(rb_cArray, "[]=", rb_ary_aset, -1); + rb_define_method(rb_cArray, "at", rb_ary_at, 1); + rb_define_method(rb_cArray, "fetch", rb_ary_fetch, -1); + rb_define_method(rb_cArray, "first", rb_ary_first, -1); + rb_define_method(rb_cArray, "last", rb_ary_last, -1); + rb_define_method(rb_cArray, "concat", rb_ary_concat, 1); + rb_define_method(rb_cArray, "<<", rb_ary_push, 1); + rb_define_method(rb_cArray, "push", rb_ary_push_m, -1); + rb_define_method(rb_cArray, "pop", rb_ary_pop, 0); + rb_define_method(rb_cArray, "shift", rb_ary_shift, 0); + rb_define_method(rb_cArray, "unshift", rb_ary_unshift_m, -1); + rb_define_method(rb_cArray, "insert", rb_ary_insert, -1); + rb_define_method(rb_cArray, "each", rb_ary_each, 0); + rb_define_method(rb_cArray, "each_index", rb_ary_each_index, 0); + rb_define_method(rb_cArray, "reverse_each", rb_ary_reverse_each, 0); + rb_define_method(rb_cArray, "length", rb_ary_length, 0); + rb_define_alias(rb_cArray, "size", "length"); + rb_define_method(rb_cArray, "empty?", rb_ary_empty_p, 0); + rb_define_method(rb_cArray, "index", rb_ary_index, 1); + rb_define_method(rb_cArray, "rindex", rb_ary_rindex, 1); + rb_define_method(rb_cArray, "indexes", rb_ary_indexes, -1); + rb_define_method(rb_cArray, "indices", rb_ary_indexes, -1); + rb_define_method(rb_cArray, "join", rb_ary_join_m, -1); + rb_define_method(rb_cArray, "reverse", rb_ary_reverse_m, 0); + rb_define_method(rb_cArray, "reverse!", rb_ary_reverse_bang, 0); + rb_define_method(rb_cArray, "sort", rb_ary_sort, 0); + rb_define_method(rb_cArray, "sort!", rb_ary_sort_bang, 0); + rb_define_method(rb_cArray, "collect", rb_ary_collect, 0); + rb_define_method(rb_cArray, "collect!", rb_ary_collect_bang, 0); + rb_define_method(rb_cArray, "map", rb_ary_collect, 0); + rb_define_method(rb_cArray, "map!", rb_ary_collect_bang, 0); + rb_define_method(rb_cArray, "select", rb_ary_select, 0); + rb_define_method(rb_cArray, "values_at", rb_ary_values_at, -1); + rb_define_method(rb_cArray, "delete", rb_ary_delete, 1); + rb_define_method(rb_cArray, "delete_at", rb_ary_delete_at_m, 1); + rb_define_method(rb_cArray, "delete_if", rb_ary_delete_if, 0); + rb_define_method(rb_cArray, "reject", rb_ary_reject, 0); + rb_define_method(rb_cArray, "reject!", rb_ary_reject_bang, 0); + rb_define_method(rb_cArray, "zip", rb_ary_zip, -1); + rb_define_method(rb_cArray, "transpose", rb_ary_transpose, 0); + rb_define_method(rb_cArray, "replace", rb_ary_replace, 1); + rb_define_method(rb_cArray, "clear", rb_ary_clear, 0); + rb_define_method(rb_cArray, "fill", rb_ary_fill, -1); + rb_define_method(rb_cArray, "include?", rb_ary_includes, 1); + rb_define_method(rb_cArray, "<=>", rb_ary_cmp, 1); + + rb_define_method(rb_cArray, "slice", rb_ary_aref, -1); + rb_define_method(rb_cArray, "slice!", rb_ary_slice_bang, -1); + + rb_define_method(rb_cArray, "assoc", rb_ary_assoc, 1); + rb_define_method(rb_cArray, "rassoc", rb_ary_rassoc, 1); + + rb_define_method(rb_cArray, "+", rb_ary_plus, 1); + rb_define_method(rb_cArray, "*", rb_ary_times, 1); + + rb_define_method(rb_cArray, "-", rb_ary_diff, 1); + rb_define_method(rb_cArray, "&", rb_ary_and, 1); + rb_define_method(rb_cArray, "|", rb_ary_or, 1); + + rb_define_method(rb_cArray, "uniq", rb_ary_uniq, 0); + rb_define_method(rb_cArray, "uniq!", rb_ary_uniq_bang, 0); + rb_define_method(rb_cArray, "compact", rb_ary_compact, 0); + rb_define_method(rb_cArray, "compact!", rb_ary_compact_bang, 0); + rb_define_method(rb_cArray, "flatten", rb_ary_flatten, 0); + rb_define_method(rb_cArray, "flatten!", rb_ary_flatten_bang, 0); + rb_define_method(rb_cArray, "nitems", rb_ary_nitems, 0); + + id_cmp = rb_intern("<=>"); + inspect_key = rb_intern("__inspect_key__"); +} +/********************************************************************** + + bignum.c - + + $Author: wyhaines $ + $Date: 2009-07-14 17:05:27 +0200 (Tue, 14 Jul 2009) $ + created at: Fri Jun 10 00:48:55 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "rubysig.h" + +#include <math.h> +#include <ctype.h> +#ifdef HAVE_IEEEFP_H +#include <ieeefp.h> +#endif + +VALUE rb_cBignum; + +#if defined __MINGW32__ +#define USHORT _USHORT +#endif + +#define BDIGITS(x) ((BDIGIT*)RBIGNUM(x)->digits) +#define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT) +#define BIGRAD ((BDIGIT_DBL)1 << BITSPERDIG) +#define DIGSPERLONG ((unsigned int)(SIZEOF_LONG/SIZEOF_BDIGITS)) +#if HAVE_LONG_LONG +# define DIGSPERLL ((unsigned int)(SIZEOF_LONG_LONG/SIZEOF_BDIGITS)) +#endif +#define BIGUP(x) ((BDIGIT_DBL)(x) << BITSPERDIG) +#define BIGDN(x) RSHIFT(x,BITSPERDIG) +#define BIGLO(x) ((BDIGIT)((x) & (BIGRAD-1))) +#define BDIGMAX ((BDIGIT)-1) + +#define BIGZEROP(x) (RBIGNUM(x)->len == 0 || \ + (BDIGITS(x)[0] == 0 && \ + (RBIGNUM(x)->len == 1 || bigzero_p(x)))) + +static int bigzero_p(VALUE); +static int +bigzero_p(x) + VALUE x; +{ + long i; + for (i = 0; i < RBIGNUM(x)->len; ++i) { + if (BDIGITS(x)[i]) return 0; + } + return 1; +} + +static VALUE +bignew_1(klass, len, sign) + VALUE klass; + long len; + int sign; +{ + NEWOBJ(big, struct RBignum); + OBJSETUP(big, klass, T_BIGNUM); + big->sign = sign?1:0; + big->len = len; + big->digits = ALLOC_N(BDIGIT, len); + + return (VALUE)big; +} + +#define bignew(len,sign) bignew_1(rb_cBignum,len,sign) + +VALUE +rb_big_clone(x) + VALUE x; +{ + VALUE z = bignew_1(CLASS_OF(x), RBIGNUM(x)->len, RBIGNUM(x)->sign); + + MEMCPY(BDIGITS(z), BDIGITS(x), BDIGIT, RBIGNUM(x)->len); + return z; +} + +/* modify a bignum by 2's complement */ +static void +get2comp(x) + VALUE x; +{ + long i = RBIGNUM(x)->len; + BDIGIT *ds = BDIGITS(x); + BDIGIT_DBL num; + + if (!i) return; + while (i--) ds[i] = ~ds[i]; + i = 0; num = 1; + do { + num += ds[i]; + ds[i++] = BIGLO(num); + num = BIGDN(num); + } while (i < RBIGNUM(x)->len); + if (num != 0) { + REALLOC_N(RBIGNUM(x)->digits, BDIGIT, ++RBIGNUM(x)->len); + ds = BDIGITS(x); + ds[RBIGNUM(x)->len-1] = RBIGNUM(x)->sign ? ~0 : 1; + } +} + +void +rb_big_2comp(x) /* get 2's complement */ + VALUE x; +{ + get2comp(x); +} + +static VALUE +bigtrunc(x) + VALUE x; +{ + long len = RBIGNUM(x)->len; + BDIGIT *ds = BDIGITS(x); + + if (len == 0) return x; + while (--len && !ds[len]); + RBIGNUM(x)->len = ++len; + return x; +} + +static VALUE +bigfixize(VALUE x) +{ + long len = RBIGNUM(x)->len; + BDIGIT *ds = BDIGITS(x); + + if (len*SIZEOF_BDIGITS <= sizeof(VALUE)) { + long num = 0; + while (len--) { + num = BIGUP(num) + ds[len]; + } + if (num >= 0) { + if (RBIGNUM(x)->sign) { + if (POSFIXABLE(num)) return LONG2FIX(num); + } + else { + if (NEGFIXABLE(-(long)num)) return LONG2FIX(-(long)num); + } + } + } + return x; +} + +static VALUE +bignorm(VALUE x) +{ + if (!FIXNUM_P(x) && TYPE(x) == T_BIGNUM) { + x = bigfixize(bigtrunc(x)); + } + return x; +} + +VALUE +rb_big_norm(x) + VALUE x; +{ + return bignorm(x); +} + +VALUE +rb_uint2big(n) + unsigned long n; +{ + BDIGIT_DBL num = n; + long i = 0; + BDIGIT *digits; + VALUE big; + + big = bignew(DIGSPERLONG, 1); + digits = BDIGITS(big); + while (i < DIGSPERLONG) { + digits[i++] = BIGLO(num); + num = BIGDN(num); + } + + i = DIGSPERLONG; + while (--i && !digits[i]) ; + RBIGNUM(big)->len = i+1; + return big; +} + +VALUE +rb_int2big(n) + long n; +{ + long neg = 0; + VALUE big; + + if (n < 0) { + n = -n; + neg = 1; + } + big = rb_uint2big(n); + if (neg) { + RBIGNUM(big)->sign = 0; + } + return big; +} + +VALUE +rb_uint2inum(n) + unsigned long n; +{ + if (POSFIXABLE(n)) return LONG2FIX(n); + return rb_uint2big(n); +} + +VALUE +rb_int2inum(n) + long n; +{ + if (FIXABLE(n)) return LONG2FIX(n); + return rb_int2big(n); +} + +#ifdef HAVE_LONG_LONG + +void +rb_quad_pack(buf, val) + char *buf; + VALUE val; +{ + LONG_LONG q; + + val = rb_to_int(val); + if (FIXNUM_P(val)) { + q = FIX2LONG(val); + } + else { + long len = RBIGNUM(val)->len; + BDIGIT *ds; + + if (len > SIZEOF_LONG_LONG/SIZEOF_BDIGITS) + rb_raise(rb_eRangeError, "bignum too big to convert into `quad int'"); + ds = BDIGITS(val); + q = 0; + while (len--) { + q = BIGUP(q); + q += ds[len]; + } + if (!RBIGNUM(val)->sign) q = -q; + } + memcpy(buf, (char*)&q, SIZEOF_LONG_LONG); +} + +VALUE +rb_quad_unpack(buf, sign) + const char *buf; + int sign; +{ + unsigned LONG_LONG q; + long neg = 0; + long i; + BDIGIT *digits; + VALUE big; + + memcpy(&q, buf, SIZEOF_LONG_LONG); + if (sign) { + if (FIXABLE((LONG_LONG)q)) return LONG2FIX((LONG_LONG)q); + if ((LONG_LONG)q < 0) { + q = -(LONG_LONG)q; + neg = 1; + } + } + else { + if (POSFIXABLE(q)) return LONG2FIX(q); + } + + i = 0; + big = bignew(DIGSPERLL, 1); + digits = BDIGITS(big); + while (i < DIGSPERLL) { + digits[i++] = BIGLO(q); + q = BIGDN(q); + } + + i = DIGSPERLL; + while (i-- && !digits[i]) ; + RBIGNUM(big)->len = i+1; + + if (neg) { + RBIGNUM(big)->sign = 0; + } + return bignorm(big); +} + +#else + +#define QUAD_SIZE 8 + +void +rb_quad_pack(buf, val) + char *buf; + VALUE val; +{ + long len; + + memset(buf, 0, QUAD_SIZE); + val = rb_to_int(val); + if (FIXNUM_P(val)) { + val = rb_int2big(FIX2LONG(val)); + } + len = RBIGNUM(val)->len * SIZEOF_BDIGITS; + if (len > QUAD_SIZE) { + rb_raise(rb_eRangeError, "bignum too big to convert into `quad int'"); + } + memcpy(buf, (char*)BDIGITS(val), len); + if (!RBIGNUM(val)->sign) { + len = QUAD_SIZE; + while (len--) { + *buf = ~*buf; + buf++; + } + } +} + +#define BNEG(b) (RSHIFT(((BDIGIT*)b)[QUAD_SIZE/SIZEOF_BDIGITS-1],BITSPERDIG-1) != 0) + +VALUE +rb_quad_unpack(buf, sign) + const char *buf; + int sign; +{ + VALUE big = bignew(QUAD_SIZE/SIZEOF_BDIGITS, 1); + + memcpy((char*)BDIGITS(big), buf, QUAD_SIZE); + if (sign && BNEG(buf)) { + long len = QUAD_SIZE; + char *tmp = (char*)BDIGITS(big); + + RBIGNUM(big)->sign = 0; + while (len--) { + *tmp = ~*tmp; + tmp++; + } + } + + return bignorm(big); +} + +#endif + +VALUE +rb_cstr_to_inum(str, base, badcheck) + const char *str; + int base; + int badcheck; +{ + const char *s = str; + char *end; + char sign = 1, nondigit = 0; + int c; + BDIGIT_DBL num; + long len, blen = 1; + long i; + VALUE z; + BDIGIT *zds; + +#define conv_digit(c) \ + (!ISASCII(c) ? -1 : \ + isdigit(c) ? ((c) - '0') : \ + islower(c) ? ((c) - 'a' + 10) : \ + isupper(c) ? ((c) - 'A' + 10) : \ + -1) + + if (!str) { + if (badcheck) goto bad; + return INT2FIX(0); + } + if (badcheck) { + while (ISSPACE(*str)) str++; + } + else { + while (ISSPACE(*str) || *str == '_') str++; + } + + if (str[0] == '+') { + str++; + } + else if (str[0] == '-') { + str++; + sign = 0; + } + if (str[0] == '+' || str[0] == '-') { + if (badcheck) goto bad; + return INT2FIX(0); + } + if (base <= 0) { + if (str[0] == '0') { + switch (str[1]) { + case 'x': case 'X': + base = 16; + break; + case 'b': case 'B': + base = 2; + break; + case 'o': case 'O': + base = 8; + break; + case 'd': case 'D': + base = 10; + break; + default: + base = 8; + } + } + else if (base < -1) { + base = -base; + } + else { + base = 10; + } + } + switch (base) { + case 2: + len = 1; + if (str[0] == '0' && (str[1] == 'b'||str[1] == 'B')) { + str += 2; + } + break; + case 3: + len = 2; + break; + case 8: + if (str[0] == '0' && (str[1] == 'o'||str[1] == 'O')) { + str += 2; + } + case 4: case 5: case 6: case 7: + len = 3; + break; + case 10: + if (str[0] == '0' && (str[1] == 'd'||str[1] == 'D')) { + str += 2; + } + case 9: case 11: case 12: case 13: case 14: case 15: + len = 4; + break; + case 16: + len = 4; + if (str[0] == '0' && (str[1] == 'x'||str[1] == 'X')) { + str += 2; + } + break; + default: + if (base < 2 || 36 < base) { + rb_raise(rb_eArgError, "illegal radix %d", base); + } + if (base <= 32) { + len = 5; + } + else { + len = 6; + } + break; + } + if (*str == '0') { /* squeeze preceeding 0s */ + while (*++str == '0'); + if (!(c = *str) || ISSPACE(c)) --str; + } + c = *str; + c = conv_digit(c); + if (c < 0 || c >= base) { + if (badcheck) goto bad; + return INT2FIX(0); + } + len *= strlen(str)*sizeof(char); + + if (len <= (sizeof(VALUE)*CHAR_BIT)) { + unsigned long val = strtoul((char*)str, &end, base); + + if (*end == '_') goto bigparse; + if (badcheck) { + if (end == str) goto bad; /* no number */ + while (*end && ISSPACE(*end)) end++; + if (*end) goto bad; /* trailing garbage */ + } + + if (POSFIXABLE(val)) { + if (sign) return LONG2FIX(val); + else { + long result = -(long)val; + return LONG2FIX(result); + } + } + else { + VALUE big = rb_uint2big(val); + RBIGNUM(big)->sign = sign; + return bignorm(big); + } + } + bigparse: + len = (len/BITSPERDIG)+1; + if (badcheck && *str == '_') goto bad; + + z = bignew(len, sign); + zds = BDIGITS(z); + for (i=len;i--;) zds[i]=0; + while ((c = *str++) != 0) { + if (c == '_') { + if (badcheck) { + if (nondigit) goto bad; + nondigit = c; + } + continue; + } + else if ((c = conv_digit(c)) < 0) { + break; + } + if (c >= base) break; + nondigit = 0; + i = 0; + num = c; + for (;;) { + while (i<blen) { + num += (BDIGIT_DBL)zds[i]*base; + zds[i++] = BIGLO(num); + num = BIGDN(num); + } + if (num) { + blen++; + continue; + } + break; + } + } + if (badcheck) { + str--; + if (s+1 < str && str[-1] == '_') goto bad; + while (*str && ISSPACE(*str)) str++; + if (*str) { + bad: + rb_invalid_str(s, "Integer"); + } + } + + return bignorm(z); +} + +VALUE +rb_str_to_inum(str, base, badcheck) + VALUE str; + int base; + int badcheck; +{ + char *s; + long len; + + StringValue(str); + if (badcheck) { + s = StringValueCStr(str); + } + else { + s = RSTRING(str)->ptr; + } + if (s) { + len = RSTRING(str)->len; + if (s[len]) { /* no sentinel somehow */ + char *p = ALLOCA_N(char, len+1); + + MEMCPY(p, s, char, len); + p[len] = '\0'; + s = p; + } + } + return rb_cstr_to_inum(s, base, badcheck); +} + +#if HAVE_LONG_LONG + +VALUE +rb_ull2big(n) + unsigned LONG_LONG n; +{ + BDIGIT_DBL num = n; + long i = 0; + BDIGIT *digits; + VALUE big; + + big = bignew(DIGSPERLL, 1); + digits = BDIGITS(big); + while (i < DIGSPERLL) { + digits[i++] = BIGLO(num); + num = BIGDN(num); + } + + i = DIGSPERLL; + while (i-- && !digits[i]) ; + RBIGNUM(big)->len = i+1; + return big; +} + +VALUE +rb_ll2big(n) + LONG_LONG n; +{ + long neg = 0; + VALUE big; + + if (n < 0) { + n = -n; + neg = 1; + } + big = rb_ull2big(n); + if (neg) { + RBIGNUM(big)->sign = 0; + } + return big; +} + +VALUE +rb_ull2inum(n) + unsigned LONG_LONG n; +{ + if (POSFIXABLE(n)) return LONG2FIX(n); + return rb_ull2big(n); +} + +VALUE +rb_ll2inum(n) + LONG_LONG n; +{ + if (FIXABLE(n)) return LONG2FIX(n); + return rb_ll2big(n); +} + +#endif /* HAVE_LONG_LONG */ + +VALUE +rb_cstr2inum(str, base) + const char *str; + int base; +{ + return rb_cstr_to_inum(str, base, base==0); +} + +VALUE +rb_str2inum(str, base) + VALUE str; + int base; +{ + return rb_str_to_inum(str, base, base==0); +} + +const char ruby_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz"; +VALUE +rb_big2str0(x, base, trim) + VALUE x; + int base; + int trim; +{ + volatile VALUE t; + BDIGIT *ds; + long i, j, hbase; + VALUE ss; + char *s; + + if (FIXNUM_P(x)) { + return rb_fix2str(x, base); + } + i = RBIGNUM(x)->len; + if (BIGZEROP(x)) { + return rb_str_new2("0"); + } + if (i >= LONG_MAX/SIZEOF_BDIGITS/CHAR_BIT) { + rb_raise(rb_eRangeError, "bignum too big to convert into `string'"); + } + j = SIZEOF_BDIGITS*CHAR_BIT*i; + switch (base) { + case 2: break; + case 3: + j = j * 53L / 84 + 1; + break; + case 4: case 5: case 6: case 7: + j = (j + 1) / 2; + break; + case 8: case 9: + j = (j + 2) / 3; + break; + case 10: case 11: case 12: case 13: case 14: case 15: + j = j * 28L / 93 + 1; + break; + case 16: case 17: case 18: case 19: case 20: case 21: + case 22: case 23: case 24: case 25: case 26: case 27: + case 28: case 29: case 30: case 31: + j = (j + 3) / 4; + break; + case 32: case 33: case 34: case 35: case 36: + j = (j + 4) / 5; + break; + default: + rb_raise(rb_eArgError, "illegal radix %d", base); + break; + } + j++; /* space for sign */ + + hbase = base * base; +#if SIZEOF_BDIGITS > 2 + hbase *= hbase; +#endif + + t = rb_big_clone(x); + ds = BDIGITS(t); + ss = rb_str_new(0, j+1); + s = RSTRING(ss)->ptr; + + s[0] = RBIGNUM(x)->sign ? '+' : '-'; + TRAP_BEG; + while (i && j > 1) { + long k = i; + BDIGIT_DBL num = 0; + + while (k--) { + num = BIGUP(num) + ds[k]; + ds[k] = (BDIGIT)(num / hbase); + num %= hbase; + } + if (trim && ds[i-1] == 0) i--; + k = SIZEOF_BDIGITS; + while (k--) { + s[--j] = ruby_digitmap[num % base]; + num /= base; + if (!trim && j <= 1) break; + if (trim && i == 0 && num == 0) break; + } + } + if (trim) {while (s[j] == '0') j++;} + i = RSTRING(ss)->len - j; + if (RBIGNUM(x)->sign) { + memmove(s, s+j, i); + RSTRING(ss)->len = i-1; + } + else { + memmove(s+1, s+j, i); + RSTRING(ss)->len = i; + } + s[RSTRING(ss)->len] = '\0'; + TRAP_END; + + return ss; +} + +VALUE +rb_big2str(VALUE x, int base) +{ + return rb_big2str0(x, base, Qtrue); +} + +/* + * call-seq: + * big.to_s(base=10) => string + * + * Returns a string containing the representation of <i>big</i> radix + * <i>base</i> (2 through 36). + * + * 12345654321.to_s #=> "12345654321" + * 12345654321.to_s(2) #=> "1011011111110110111011110000110001" + * 12345654321.to_s(8) #=> "133766736061" + * 12345654321.to_s(16) #=> "2dfdbbc31" + * 78546939656932.to_s(36) #=> "rubyrules" + */ + +static VALUE +rb_big_to_s(argc, argv, x) + int argc; + VALUE *argv; + VALUE x; +{ + VALUE b; + int base; + + rb_scan_args(argc, argv, "01", &b); + if (argc == 0) base = 10; + else base = NUM2INT(b); + return rb_big2str(x, base); +} + +static unsigned long +big2ulong(x, type) + VALUE x; + char *type; +{ + long len = RBIGNUM(x)->len; + BDIGIT_DBL num; + BDIGIT *ds; + + if (len > SIZEOF_LONG/SIZEOF_BDIGITS) + rb_raise(rb_eRangeError, "bignum too big to convert into `%s'", type); + ds = BDIGITS(x); + num = 0; + while (len--) { + num = BIGUP(num); + num += ds[len]; + } + return num; +} + +unsigned long +rb_big2ulong_pack(x) + VALUE x; +{ + unsigned long num = big2ulong(x, "unsigned long"); + if (!RBIGNUM(x)->sign) { + return -num; + } + return num; +} + +unsigned long +rb_big2ulong(x) + VALUE x; +{ + unsigned long num = big2ulong(x, "unsigned long"); + + if (!RBIGNUM(x)->sign) { + if ((long)num < 0) { + rb_raise(rb_eRangeError, "bignum out of range of unsigned long"); + } + return -num; + } + return num; +} + +long +rb_big2long(x) + VALUE x; +{ + unsigned long num = big2ulong(x, "long"); + + if ((long)num < 0 && (RBIGNUM(x)->sign || (long)num != LONG_MIN)) { + rb_raise(rb_eRangeError, "bignum too big to convert into `long'"); + } + if (!RBIGNUM(x)->sign) return -(long)num; + return num; +} + +#if HAVE_LONG_LONG + +static unsigned LONG_LONG +big2ull(x, type) + VALUE x; + char *type; +{ + long len = RBIGNUM(x)->len; + BDIGIT_DBL num; + BDIGIT *ds; + + if (len > SIZEOF_LONG_LONG/SIZEOF_BDIGITS) + rb_raise(rb_eRangeError, "bignum too big to convert into `%s'", type); + ds = BDIGITS(x); + num = 0; + while (len--) { + num = BIGUP(num); + num += ds[len]; + } + return num; +} + +unsigned LONG_LONG +rb_big2ull(x) + VALUE x; +{ + unsigned LONG_LONG num = big2ull(x, "unsigned long long"); + + if (!RBIGNUM(x)->sign) return -num; + return num; +} + +LONG_LONG +rb_big2ll(x) + VALUE x; +{ + unsigned LONG_LONG num = big2ull(x, "long long"); + + if ((LONG_LONG)num < 0 && (RBIGNUM(x)->sign + || (LONG_LONG)num != LLONG_MIN)) { + rb_raise(rb_eRangeError, "bignum too big to convert into `long long'"); + } + if (!RBIGNUM(x)->sign) return -(LONG_LONG)num; + return num; +} + +#endif /* HAVE_LONG_LONG */ + +static VALUE +dbl2big(d) + double d; +{ + long i = 0; + BDIGIT c; + BDIGIT *digits; + VALUE z; + double u = (d < 0)?-d:d; + + if (isinf(d)) { + rb_raise(rb_eFloatDomainError, d < 0 ? "-Infinity" : "Infinity"); + } + if (isnan(d)) { + rb_raise(rb_eFloatDomainError, "NaN"); + } + + while (!POSFIXABLE(u) || 0 != (long)u) { + u /= (double)(BIGRAD); + i++; + } + z = bignew(i, d>=0); + digits = BDIGITS(z); + while (i--) { + u *= BIGRAD; + c = (BDIGIT)u; + u -= c; + digits[i] = c; + } + + return z; +} + +VALUE +rb_dbl2big(d) + double d; +{ + return bignorm(dbl2big(d)); +} + +double +rb_big2dbl(x) + VALUE x; +{ + double d = 0.0; + long i = RBIGNUM(x)->len; + BDIGIT *ds = BDIGITS(x); + + while (i--) { + d = ds[i] + BIGRAD*d; + } + if (isinf(d)) { + rb_warn("Bignum out of Float range"); + d = HUGE_VAL; + } + if (!RBIGNUM(x)->sign) d = -d; + return d; +} + +/* + * call-seq: + * big.to_f -> float + * + * Converts <i>big</i> to a <code>Float</code>. If <i>big</i> doesn't + * fit in a <code>Float</code>, the result is infinity. + * + */ + +static VALUE +rb_big_to_f(x) + VALUE x; +{ + return rb_float_new(rb_big2dbl(x)); +} + +/* + * call-seq: + * big <=> numeric => -1, 0, +1 + * + * Comparison---Returns -1, 0, or +1 depending on whether <i>big</i> is + * less than, equal to, or greater than <i>numeric</i>. This is the + * basis for the tests in <code>Comparable</code>. + * + */ + +static VALUE +rb_big_cmp(x, y) + VALUE x, y; +{ + long xlen = RBIGNUM(x)->len; + + switch (TYPE(y)) { + case T_FIXNUM: + y = rb_int2big(FIX2LONG(y)); + break; + + case T_BIGNUM: + break; + + case T_FLOAT: + { + double a = RFLOAT(y)->value; + + if (isinf(a)) { + if (a > 0.0) return INT2FIX(-1); + else return INT2FIX(1); + } + return rb_dbl_cmp(rb_big2dbl(x), a); + } + + default: + return rb_num_coerce_cmp(x, y); + } + + if (RBIGNUM(x)->sign > RBIGNUM(y)->sign) return INT2FIX(1); + if (RBIGNUM(x)->sign < RBIGNUM(y)->sign) return INT2FIX(-1); + if (xlen < RBIGNUM(y)->len) + return (RBIGNUM(x)->sign) ? INT2FIX(-1) : INT2FIX(1); + if (xlen > RBIGNUM(y)->len) + return (RBIGNUM(x)->sign) ? INT2FIX(1) : INT2FIX(-1); + + while(xlen-- && (BDIGITS(x)[xlen]==BDIGITS(y)[xlen])); + if (-1 == xlen) return INT2FIX(0); + return (BDIGITS(x)[xlen] > BDIGITS(y)[xlen]) ? + (RBIGNUM(x)->sign ? INT2FIX(1) : INT2FIX(-1)) : + (RBIGNUM(x)->sign ? INT2FIX(-1) : INT2FIX(1)); +} + +/* + * call-seq: + * big == obj => true or false + * + * Returns <code>true</code> only if <i>obj</i> has the same value + * as <i>big</i>. Contrast this with <code>Bignum#eql?</code>, which + * requires <i>obj</i> to be a <code>Bignum</code>. + * + * 68719476736 == 68719476736.0 #=> true + */ + +static VALUE +rb_big_eq(x, y) + VALUE x, y; +{ + switch (TYPE(y)) { + case T_FIXNUM: + y = rb_int2big(FIX2LONG(y)); + break; + case T_BIGNUM: + break; + case T_FLOAT: + { + volatile double a, b; + + a = RFLOAT(y)->value; + if (isnan(a)) return Qfalse; + b = rb_big2dbl(x); + return (a == b)?Qtrue:Qfalse; + } + default: + return rb_equal(y, x); + } + if (RBIGNUM(x)->sign != RBIGNUM(y)->sign) return Qfalse; + if (RBIGNUM(x)->len != RBIGNUM(y)->len) return Qfalse; + if (MEMCMP(BDIGITS(x),BDIGITS(y),BDIGIT,RBIGNUM(y)->len) != 0) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * big.eql?(obj) => true or false + * + * Returns <code>true</code> only if <i>obj</i> is a + * <code>Bignum</code> with the same value as <i>big</i>. Contrast this + * with <code>Bignum#==</code>, which performs type conversions. + * + * 68719476736.eql?(68719476736.0) #=> false + */ + +static VALUE +rb_big_eql(x, y) + VALUE x, y; +{ + if (TYPE(y) != T_BIGNUM) return Qfalse; + if (RBIGNUM(x)->sign != RBIGNUM(y)->sign) return Qfalse; + if (RBIGNUM(x)->len != RBIGNUM(y)->len) return Qfalse; + if (MEMCMP(BDIGITS(x),BDIGITS(y),BDIGIT,RBIGNUM(y)->len) != 0) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * -big => other_big + * + * Unary minus (returns a new Bignum whose value is 0-big) + */ + +static VALUE +rb_big_uminus(x) + VALUE x; +{ + VALUE z = rb_big_clone(x); + + RBIGNUM(z)->sign = !RBIGNUM(x)->sign; + + return bignorm(z); +} + +/* + * call-seq: + * ~big => integer + * + * Inverts the bits in big. As Bignums are conceptually infinite + * length, the result acts as if it had an infinite number of one + * bits to the left. In hex representations, this is displayed + * as two periods to the left of the digits. + * + * sprintf("%X", ~0x1122334455) #=> "..FEEDDCCBBAA" + */ + +static VALUE +rb_big_neg(x) + VALUE x; +{ + VALUE z = rb_big_clone(x); + long i; + BDIGIT *ds; + + if (!RBIGNUM(x)->sign) get2comp(z); + ds = BDIGITS(z); + i = RBIGNUM(x)->len; + if (!i) return INT2FIX(~0); + while (i--) ds[i] = ~ds[i]; + RBIGNUM(z)->sign = !RBIGNUM(z)->sign; + if (RBIGNUM(x)->sign) get2comp(z); + + return bignorm(z); +} + +static VALUE +bigsub(x, y) + VALUE x, y; +{ + VALUE z = 0; + BDIGIT *zds; + BDIGIT_DBL_SIGNED num; + long i = RBIGNUM(x)->len; + + /* if x is larger than y, swap */ + if (RBIGNUM(x)->len < RBIGNUM(y)->len) { + z = x; x = y; y = z; /* swap x y */ + } + else if (RBIGNUM(x)->len == RBIGNUM(y)->len) { + while (i > 0) { + i--; + if (BDIGITS(x)[i] > BDIGITS(y)[i]) { + break; + } + if (BDIGITS(x)[i] < BDIGITS(y)[i]) { + z = x; x = y; y = z; /* swap x y */ + break; + } + } + } + + z = bignew(RBIGNUM(x)->len, z==0); + zds = BDIGITS(z); + + for (i = 0, num = 0; i < RBIGNUM(y)->len; i++) { + num += (BDIGIT_DBL_SIGNED)BDIGITS(x)[i] - BDIGITS(y)[i]; + zds[i] = BIGLO(num); + num = BIGDN(num); + } + while (num && i < RBIGNUM(x)->len) { + num += BDIGITS(x)[i]; + zds[i++] = BIGLO(num); + num = BIGDN(num); + } + while (i < RBIGNUM(x)->len) { + zds[i] = BDIGITS(x)[i]; + i++; + } + + return z; +} + +static VALUE +bigadd(x, y, sign) + VALUE x, y; + int sign; +{ + VALUE z; + BDIGIT_DBL num; + long i, len; + + sign = (sign == RBIGNUM(y)->sign); + if (RBIGNUM(x)->sign != sign) { + if (sign) return bigsub(y, x); + return bigsub(x, y); + } + + if (RBIGNUM(x)->len > RBIGNUM(y)->len) { + len = RBIGNUM(x)->len + 1; + z = x; x = y; y = z; + } + else { + len = RBIGNUM(y)->len + 1; + } + z = bignew(len, sign); + + len = RBIGNUM(x)->len; + for (i = 0, num = 0; i < len; i++) { + num += (BDIGIT_DBL)BDIGITS(x)[i] + BDIGITS(y)[i]; + BDIGITS(z)[i] = BIGLO(num); + num = BIGDN(num); + } + len = RBIGNUM(y)->len; + while (num && i < len) { + num += BDIGITS(y)[i]; + BDIGITS(z)[i++] = BIGLO(num); + num = BIGDN(num); + } + while (i < len) { + BDIGITS(z)[i] = BDIGITS(y)[i]; + i++; + } + BDIGITS(z)[i] = (BDIGIT)num; + + return z; +} + +/* + * call-seq: + * big + other => Numeric + * + * Adds big and other, returning the result. + */ + +VALUE +rb_big_plus(x, y) + VALUE x, y; +{ + switch (TYPE(y)) { + case T_FIXNUM: + y = rb_int2big(FIX2LONG(y)); + /* fall through */ + case T_BIGNUM: + return bignorm(bigadd(x, y, 1)); + + case T_FLOAT: + return rb_float_new(rb_big2dbl(x) + RFLOAT(y)->value); + + default: + return rb_num_coerce_bin(x, y); + } +} + +/* + * call-seq: + * big - other => Numeric + * + * Subtracts other from big, returning the result. + */ + +VALUE +rb_big_minus(x, y) + VALUE x, y; +{ + switch (TYPE(y)) { + case T_FIXNUM: + y = rb_int2big(FIX2LONG(y)); + /* fall through */ + case T_BIGNUM: + return bignorm(bigadd(x, y, 0)); + + case T_FLOAT: + return rb_float_new(rb_big2dbl(x) - RFLOAT(y)->value); + + default: + return rb_num_coerce_bin(x, y); + } +} + +VALUE +rb_big_mul0(x, y) + VALUE x, y; +{ + long i, j; + BDIGIT_DBL n = 0; + VALUE z; + BDIGIT *zds; + + if (FIXNUM_P(x)) x = rb_int2big(FIX2LONG(x)); + switch (TYPE(y)) { + case T_FIXNUM: + y = rb_int2big(FIX2LONG(y)); + break; + + case T_BIGNUM: + break; + + case T_FLOAT: + return rb_float_new(rb_big2dbl(x) * RFLOAT(y)->value); + + default: + return rb_num_coerce_bin(x, y); + } + + j = RBIGNUM(x)->len + RBIGNUM(y)->len + 1; + z = bignew(j, RBIGNUM(x)->sign==RBIGNUM(y)->sign); + zds = BDIGITS(z); + while (j--) zds[j] = 0; + for (i = 0; i < RBIGNUM(x)->len; i++) { + BDIGIT_DBL dd = BDIGITS(x)[i]; + if (dd == 0) continue; + n = 0; + for (j = 0; j < RBIGNUM(y)->len; j++) { + BDIGIT_DBL ee = n + (BDIGIT_DBL)dd * BDIGITS(y)[j]; + n = zds[i + j] + ee; + if (ee) zds[i + j] = BIGLO(n); + n = BIGDN(n); + } + if (n) { + zds[i + j] = n; + } + } + + return z; +} + +/* + * call-seq: + * big * other => Numeric + * + * Multiplies big and other, returning the result. + */ + +VALUE +rb_big_mul(x, y) + VALUE x, y; +{ + return bignorm(rb_big_mul0(x, y)); +} + +static void +bigdivrem(x, y, divp, modp) + VALUE x, y; + VALUE *divp, *modp; +{ + long nx = RBIGNUM(x)->len, ny = RBIGNUM(y)->len; + long i, j; + VALUE yy, z; + BDIGIT *xds, *yds, *zds, *tds; + BDIGIT_DBL t2; + BDIGIT_DBL_SIGNED num; + BDIGIT dd, q; + + if (BIGZEROP(y)) rb_num_zerodiv(); + yds = BDIGITS(y); + if (nx < ny || (nx == ny && BDIGITS(x)[nx - 1] < BDIGITS(y)[ny - 1])) { + if (divp) *divp = rb_int2big(0); + if (modp) *modp = x; + return; + } + xds = BDIGITS(x); + if (ny == 1) { + dd = yds[0]; + z = rb_big_clone(x); + zds = BDIGITS(z); + t2 = 0; i = nx; + while (i--) { + t2 = BIGUP(t2) + zds[i]; + zds[i] = (BDIGIT)(t2 / dd); + t2 %= dd; + } + RBIGNUM(z)->sign = RBIGNUM(x)->sign==RBIGNUM(y)->sign; + if (modp) { + *modp = rb_uint2big((unsigned long)t2); + RBIGNUM(*modp)->sign = RBIGNUM(x)->sign; + } + if (divp) *divp = z; + return; + } + z = bignew(nx==ny?nx+2:nx+1, RBIGNUM(x)->sign==RBIGNUM(y)->sign); + zds = BDIGITS(z); + if (nx==ny) zds[nx+1] = 0; + while (!yds[ny-1]) ny--; + + dd = 0; + q = yds[ny-1]; + while ((q & (1<<(BITSPERDIG-1))) == 0) { + q <<= 1; + dd++; + } + if (dd) { + yy = rb_big_clone(y); + tds = BDIGITS(yy); + j = 0; + t2 = 0; + while (j<ny) { + t2 += (BDIGIT_DBL)yds[j]<<dd; + tds[j++] = BIGLO(t2); + t2 = BIGDN(t2); + } + yds = tds; + j = 0; + t2 = 0; + while (j<nx) { + t2 += (BDIGIT_DBL)xds[j]<<dd; + zds[j++] = BIGLO(t2); + t2 = BIGDN(t2); + } + zds[j] = (BDIGIT)t2; + } + else { + zds[nx] = 0; + j = nx; + while (j--) zds[j] = xds[j]; + } + + j = nx==ny?nx+1:nx; + do { + if (zds[j] == yds[ny-1]) q = BIGRAD-1; + else q = (BDIGIT)((BIGUP(zds[j]) + zds[j-1])/yds[ny-1]); + if (q) { + i = 0; num = 0; t2 = 0; + do { /* multiply and subtract */ + BDIGIT_DBL ee; + t2 += (BDIGIT_DBL)yds[i] * q; + ee = num - BIGLO(t2); + num = (BDIGIT_DBL)zds[j - ny + i] + ee; + if (ee) zds[j - ny + i] = BIGLO(num); + num = BIGDN(num); + t2 = BIGDN(t2); + } while (++i < ny); + num += zds[j - ny + i] - t2;/* borrow from high digit; don't update */ + while (num) { /* "add back" required */ + i = 0; num = 0; q--; + do { + BDIGIT_DBL ee = num + yds[i]; + num = (BDIGIT_DBL)zds[j - ny + i] + ee; + if (ee) zds[j - ny + i] = BIGLO(num); + num = BIGDN(num); + } while (++i < ny); + num--; + } + } + zds[j] = q; + } while (--j >= ny); + if (divp) { /* move quotient down in z */ + *divp = rb_big_clone(z); + zds = BDIGITS(*divp); + j = (nx==ny ? nx+2 : nx+1) - ny; + for (i = 0;i < j;i++) zds[i] = zds[i+ny]; + RBIGNUM(*divp)->len = i; + } + if (modp) { /* normalize remainder */ + *modp = rb_big_clone(z); + zds = BDIGITS(*modp); + while (--ny && !zds[ny]); ++ny; + if (dd) { + t2 = 0; i = ny; + while(i--) { + t2 = (t2 | zds[i]) >> dd; + q = zds[i]; + zds[i] = BIGLO(t2); + t2 = BIGUP(q); + } + } + RBIGNUM(*modp)->len = ny; + RBIGNUM(*modp)->sign = RBIGNUM(x)->sign; + } +} + +static void +bigdivmod(x, y, divp, modp) + VALUE x, y; + VALUE *divp, *modp; +{ + VALUE mod; + + bigdivrem(x, y, divp, &mod); + if (RBIGNUM(x)->sign != RBIGNUM(y)->sign && !BIGZEROP(mod)) { + if (divp) *divp = bigadd(*divp, rb_int2big(1), 0); + if (modp) *modp = bigadd(mod, y, 1); + } + else { + if (divp) *divp = *divp; + if (modp) *modp = mod; + } +} + +/* + * call-seq: + * big / other => Numeric + * big.div(other) => Numeric + * + * Divides big by other, returning the result. + */ + +static VALUE +rb_big_div(x, y) + VALUE x, y; +{ + VALUE z; + + switch (TYPE(y)) { + case T_FIXNUM: + y = rb_int2big(FIX2LONG(y)); + break; + + case T_BIGNUM: + break; + + case T_FLOAT: + return rb_float_new(rb_big2dbl(x) / RFLOAT(y)->value); + + default: + return rb_num_coerce_bin(x, y); + } + bigdivmod(x, y, &z, 0); + + return bignorm(z); +} + +/* + * call-seq: + * big % other => Numeric + * big.modulo(other) => Numeric + * + * Returns big modulo other. See Numeric.divmod for more + * information. + */ + +static VALUE +rb_big_modulo(x, y) + VALUE x, y; +{ + VALUE z; + + switch (TYPE(y)) { + case T_FIXNUM: + y = rb_int2big(FIX2LONG(y)); + break; + + case T_BIGNUM: + break; + + default: + return rb_num_coerce_bin(x, y); + } + bigdivmod(x, y, 0, &z); + + return bignorm(z); +} + +/* + * call-seq: + * big.remainder(numeric) => number + * + * Returns the remainder after dividing <i>big</i> by <i>numeric</i>. + * + * -1234567890987654321.remainder(13731) #=> -6966 + * -1234567890987654321.remainder(13731.24) #=> -9906.22531493148 + */ +static VALUE +rb_big_remainder(x, y) + VALUE x, y; +{ + VALUE z; + + switch (TYPE(y)) { + case T_FIXNUM: + y = rb_int2big(FIX2LONG(y)); + break; + + case T_BIGNUM: + break; + + default: + return rb_num_coerce_bin(x, y); + } + bigdivrem(x, y, 0, &z); + + return bignorm(z); +} + +static VALUE big_lshift _((VALUE, unsigned long)); +static VALUE big_rshift _((VALUE, unsigned long)); + +static VALUE big_shift(x, n) + VALUE x; + int n; +{ + if (n < 0) + return big_lshift(x, (unsigned int)n); + else if (n > 0) + return big_rshift(x, (unsigned int)n); + return x; +} + +/* + * call-seq: + * big.divmod(numeric) => array + * + * See <code>Numeric#divmod</code>. + * + */ +VALUE +rb_big_divmod(x, y) + VALUE x, y; +{ + VALUE div, mod; + + switch (TYPE(y)) { + case T_FIXNUM: + y = rb_int2big(FIX2LONG(y)); + break; + + case T_BIGNUM: + break; + + default: + return rb_num_coerce_bin(x, y); + } + bigdivmod(x, y, &div, &mod); + + return rb_assoc_new(bignorm(div), bignorm(mod)); +} + +/* + * call-seq: + * big.quo(numeric) -> float + * + * Returns the floating point result of dividing <i>big</i> by + * <i>numeric</i>. + * + * -1234567890987654321.quo(13731) #=> -89910996357705.5 + * -1234567890987654321.quo(13731.24) #=> -89909424858035.7 + * + */ + +static VALUE +rb_big_quo(x, y) + VALUE x, y; +{ + double dx = rb_big2dbl(x); + double dy; + + switch (TYPE(y)) { + case T_FIXNUM: + dy = (double)FIX2LONG(y); + break; + + case T_BIGNUM: + dy = rb_big2dbl(y); + break; + + case T_FLOAT: + dy = RFLOAT(y)->value; + break; + + default: + return rb_num_coerce_bin(x, y); + } + return rb_float_new(dx / dy); +} + +/* + * call-seq: + * big ** exponent #=> numeric + * + * Raises _big_ to the _exponent_ power (which may be an integer, float, + * or anything that will coerce to a number). The result may be + * a Fixnum, Bignum, or Float + * + * 123456789 ** 2 #=> 15241578750190521 + * 123456789 ** 1.2 #=> 5126464716.09932 + * 123456789 ** -2 #=> 6.5610001194102e-17 + */ + +VALUE +rb_big_pow(x, y) + VALUE x, y; +{ + double d; + long yy; + + if (y == INT2FIX(0)) return INT2FIX(1); + switch (TYPE(y)) { + case T_FLOAT: + d = RFLOAT(y)->value; + break; + + case T_BIGNUM: + rb_warn("in a**b, b may be too big"); + d = rb_big2dbl(y); + break; + + case T_FIXNUM: + yy = FIX2LONG(y); + if (yy > 0) { + VALUE z = x; + const long BIGLEN_LIMIT = 1024*1024 / SIZEOF_BDIGITS; + + if ((RBIGNUM(x)->len > BIGLEN_LIMIT) || + (RBIGNUM(x)->len > BIGLEN_LIMIT / yy)) { + rb_warn("in a**b, b may be too big"); + d = (double)yy; + break; + } + for (;;) { + yy -= 1; + if (yy == 0) break; + while (yy % 2 == 0) { + yy /= 2; + x = rb_big_mul0(x, x); + bigtrunc(x); + } + z = rb_big_mul0(z, x); + bigtrunc(z); + } + return bignorm(z); + } + d = (double)yy; + break; + + default: + return rb_num_coerce_bin(x, y); + } + return rb_float_new(pow(rb_big2dbl(x), d)); +} + +/* + * call-seq: + * big & numeric => integer + * + * Performs bitwise +and+ between _big_ and _numeric_. + */ + +VALUE +rb_big_and(xx, yy) + VALUE xx, yy; +{ + volatile VALUE x, y, z; + BDIGIT *ds1, *ds2, *zds; + long i, l1, l2; + char sign; + + x = xx; + y = rb_to_int(yy); + if (FIXNUM_P(y)) { + y = rb_int2big(FIX2LONG(y)); + } + if (!RBIGNUM(y)->sign) { + y = rb_big_clone(y); + get2comp(y); + } + if (!RBIGNUM(x)->sign) { + x = rb_big_clone(x); + get2comp(x); + } + if (RBIGNUM(x)->len > RBIGNUM(y)->len) { + l1 = RBIGNUM(y)->len; + l2 = RBIGNUM(x)->len; + ds1 = BDIGITS(y); + ds2 = BDIGITS(x); + sign = RBIGNUM(y)->sign; + } + else { + l1 = RBIGNUM(x)->len; + l2 = RBIGNUM(y)->len; + ds1 = BDIGITS(x); + ds2 = BDIGITS(y); + sign = RBIGNUM(x)->sign; + } + z = bignew(l2, RBIGNUM(x)->sign || RBIGNUM(y)->sign); + zds = BDIGITS(z); + + for (i=0; i<l1; i++) { + zds[i] = ds1[i] & ds2[i]; + } + for (; i<l2; i++) { + zds[i] = sign?0:ds2[i]; + } + if (!RBIGNUM(z)->sign) get2comp(z); + return bignorm(z); +} + +/* + * call-seq: + * big | numeric => integer + * + * Performs bitwise +or+ between _big_ and _numeric_. + */ + +VALUE +rb_big_or(xx, yy) + VALUE xx, yy; +{ + volatile VALUE x, y, z; + BDIGIT *ds1, *ds2, *zds; + long i, l1, l2; + char sign; + + x = xx; + y = rb_to_int(yy); + if (FIXNUM_P(y)) { + y = rb_int2big(FIX2LONG(y)); + } + if (!RBIGNUM(y)->sign) { + y = rb_big_clone(y); + get2comp(y); + } + if (!RBIGNUM(x)->sign) { + x = rb_big_clone(x); + get2comp(x); + } + if (RBIGNUM(x)->len > RBIGNUM(y)->len) { + l1 = RBIGNUM(y)->len; + l2 = RBIGNUM(x)->len; + ds1 = BDIGITS(y); + ds2 = BDIGITS(x); + sign = RBIGNUM(y)->sign; + } + else { + l1 = RBIGNUM(x)->len; + l2 = RBIGNUM(y)->len; + ds1 = BDIGITS(x); + ds2 = BDIGITS(y); + sign = RBIGNUM(x)->sign; + } + z = bignew(l2, RBIGNUM(x)->sign && RBIGNUM(y)->sign); + zds = BDIGITS(z); + + for (i=0; i<l1; i++) { + zds[i] = ds1[i] | ds2[i]; + } + for (; i<l2; i++) { + zds[i] = sign?ds2[i]:(BIGRAD-1); + } + if (!RBIGNUM(z)->sign) get2comp(z); + + return bignorm(z); +} + +/* + * call-seq: + * big ^ numeric => integer + * + * Performs bitwise +exclusive or+ between _big_ and _numeric_. + */ + +VALUE +rb_big_xor(xx, yy) + VALUE xx, yy; +{ + volatile VALUE x, y; + VALUE z; + BDIGIT *ds1, *ds2, *zds; + long i, l1, l2; + char sign; + + x = xx; + y = rb_to_int(yy); + if (FIXNUM_P(y)) { + y = rb_int2big(FIX2LONG(y)); + } + if (!RBIGNUM(y)->sign) { + y = rb_big_clone(y); + get2comp(y); + } + if (!RBIGNUM(x)->sign) { + x = rb_big_clone(x); + get2comp(x); + } + if (RBIGNUM(x)->len > RBIGNUM(y)->len) { + l1 = RBIGNUM(y)->len; + l2 = RBIGNUM(x)->len; + ds1 = BDIGITS(y); + ds2 = BDIGITS(x); + sign = RBIGNUM(y)->sign; + } + else { + l1 = RBIGNUM(x)->len; + l2 = RBIGNUM(y)->len; + ds1 = BDIGITS(x); + ds2 = BDIGITS(y); + sign = RBIGNUM(x)->sign; + } + RBIGNUM(x)->sign = RBIGNUM(x)->sign?1:0; + RBIGNUM(y)->sign = RBIGNUM(y)->sign?1:0; + z = bignew(l2, !(RBIGNUM(x)->sign ^ RBIGNUM(y)->sign)); + zds = BDIGITS(z); + + for (i=0; i<l1; i++) { + zds[i] = ds1[i] ^ ds2[i]; + } + for (; i<l2; i++) { + zds[i] = sign?ds2[i]:~ds2[i]; + } + if (!RBIGNUM(z)->sign) get2comp(z); + + return bignorm(z); +} + +static VALUE +check_shiftdown(VALUE y, VALUE x) +{ + if (!RBIGNUM(x)->len) return INT2FIX(0); + if (RBIGNUM(y)->len > SIZEOF_LONG / SIZEOF_BDIGITS) { + return RBIGNUM(x)->sign ? INT2FIX(0) : INT2FIX(-1); + } + return Qnil; +} + +/* + * call-seq: + * big << numeric => integer + * + * Shifts big left _numeric_ positions (right if _numeric_ is negative). + */ + +VALUE +rb_big_lshift(x, y) + VALUE x, y; +{ + long shift; + int neg = 0; + + for (;;) { + if (FIXNUM_P(y)) { + shift = FIX2LONG(y); + if (shift < 0) { + neg = 1; + shift = -shift; + } + break; + } + else if (TYPE(y) == T_BIGNUM) { + if (!RBIGNUM(y)->sign) { + VALUE t = check_shiftdown(y, x); + if (!NIL_P(t)) return t; + neg = 1; + } + shift = big2ulong(y, "long", Qtrue); + break; + } + y = rb_to_int(y); + } + + if (neg) return big_rshift(x, shift); + return big_lshift(x, shift); +} + +static VALUE +big_lshift(x, shift) + VALUE x; + unsigned long shift; +{ + BDIGIT *xds, *zds; + long s1 = shift/BITSPERDIG; + int s2 = shift%BITSPERDIG; + VALUE z; + BDIGIT_DBL num = 0; + long len, i; + + len = RBIGNUM(x)->len; + z = bignew(len+s1+1, RBIGNUM(x)->sign); + zds = BDIGITS(z); + for (i=0; i<s1; i++) { + *zds++ = 0; + } + xds = BDIGITS(x); + for (i=0; i<len; i++) { + num = num | (BDIGIT_DBL)*xds++<<s2; + *zds++ = BIGLO(num); + num = BIGDN(num); + } + *zds = BIGLO(num); + return bignorm(z); +} + +/* + * call-seq: + * big >> numeric => integer + * + * Shifts big right _numeric_ positions (left if _numeric_ is negative). + */ + +VALUE +rb_big_rshift(x, y) + VALUE x, y; +{ + long shift; + int neg = 0; + + for (;;) { + if (FIXNUM_P(y)) { + shift = FIX2LONG(y); + if (shift < 0) { + neg = 1; + shift = -shift; + } + break; + } + else if (TYPE(y) == T_BIGNUM) { + if (RBIGNUM(y)->sign) { + VALUE t = check_shiftdown(y, x); + if (!NIL_P(t)) return t; + } + else { + neg = 1; + } + shift = big2ulong(y, "long", Qtrue); + break; + } + y = rb_to_int(y); + } + + if (neg) return big_lshift(x, shift); + return big_rshift(x, shift); +} + +static VALUE +big_rshift(x, shift) + VALUE x; + unsigned long shift; +{ + BDIGIT *xds, *zds; + long s1 = shift/BITSPERDIG; + int s2 = shift%BITSPERDIG; + VALUE z; + BDIGIT_DBL num = 0; + long i, j; + volatile VALUE save_x; + + if (s1 > RBIGNUM(x)->len) { + if (RBIGNUM(x)->sign) + return INT2FIX(0); + else + return INT2FIX(-1); + } + if (!RBIGNUM(x)->sign) { + save_x = x = rb_big_clone(x); + get2comp(x); + } + xds = BDIGITS(x); + i = RBIGNUM(x)->len; j = i - s1; + if (j == 0) { + if (RBIGNUM(x)->sign) return INT2FIX(0); + else return INT2FIX(-1); + } + z = bignew(j, RBIGNUM(x)->sign); + if (!RBIGNUM(x)->sign) { + num = ((BDIGIT_DBL)~0) << BITSPERDIG; + } + zds = BDIGITS(z); + while (i--, j--) { + num = (num | xds[i]) >> s2; + zds[j] = BIGLO(num); + num = BIGUP(xds[i]); + } + if (!RBIGNUM(x)->sign) { + get2comp(z); + } + return bignorm(z); +} + +/* + * call-seq: + * big[n] -> 0, 1 + * + * Bit Reference---Returns the <em>n</em>th bit in the (assumed) binary + * representation of <i>big</i>, where <i>big</i>[0] is the least + * significant bit. + * + * a = 9**15 + * 50.downto(0) do |n| + * print a[n] + * end + * + * <em>produces:</em> + * + * 000101110110100000111000011110010100111100010111001 + * + */ + +static VALUE +rb_big_aref(x, y) + VALUE x, y; +{ + BDIGIT *xds; + BDIGIT_DBL num; + unsigned long shift; + long i, s1, s2; + + if (TYPE(y) == T_BIGNUM) { + if (!RBIGNUM(y)->sign) + return INT2FIX(0); + if (RBIGNUM(bigtrunc(y))->len > SIZEOF_LONG/SIZEOF_BDIGITS) { + out_of_range: + return RBIGNUM(x)->sign ? INT2FIX(0) : INT2FIX(1); + } + shift = big2ulong(y, "long", Qfalse); + } + else { + i = NUM2LONG(y); + if (i < 0) return INT2FIX(0); + shift = (VALUE)i; + } + s1 = shift/BITSPERDIG; + s2 = shift%BITSPERDIG; + + if (s1 >= RBIGNUM(x)->len) goto out_of_range; + if (!RBIGNUM(x)->sign) { + xds = BDIGITS(x); + i = 0; num = 1; + while (num += ~xds[i], ++i <= s1) { + num = BIGDN(num); + } + } + else { + num = BDIGITS(x)[s1]; + } + if (num & ((BDIGIT_DBL)1<<s2)) + return INT2FIX(1); + return INT2FIX(0); +} + +/* + * call-seq: + * big.hash => fixnum + * + * Compute a hash based on the value of _big_. + */ + +static VALUE +rb_big_hash(x) + VALUE x; +{ + long i, len, key; + BDIGIT *digits; + + key = 0; digits = BDIGITS(x); len = RBIGNUM(x)->len; + for (i=0; i<len; i++) { + key ^= *digits++; + } + return LONG2FIX(key); +} + +/* + * MISSING: documentation + */ + +static VALUE +rb_big_coerce(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + return rb_assoc_new(rb_int2big(FIX2LONG(y)), x); + } + else if (TYPE(y) == T_BIGNUM) { + return rb_assoc_new(y, x); + } + else { + rb_raise(rb_eTypeError, "can't coerce %s to Bignum", + rb_obj_classname(y)); + } + /* not reached */ + return Qnil; +} + +/* + * call-seq: + * big.abs -> aBignum + * + * Returns the absolute value of <i>big</i>. + * + * -1234567890987654321.abs #=> 1234567890987654321 + */ + +static VALUE +rb_big_abs(x) + VALUE x; +{ + if (!RBIGNUM(x)->sign) { + x = rb_big_clone(x); + RBIGNUM(x)->sign = 1; + } + return x; +} + +VALUE +rb_big_rand(max, rand_buf) + VALUE max; + double *rand_buf; +{ + VALUE v; + long len = RBIGNUM(max)->len; + + if (BIGZEROP(max)) { + return rb_float_new(rand_buf[0]); + } + v = bignew(len,1); + len--; + BDIGITS(v)[len] = BDIGITS(max)[len] * rand_buf[len]; + while (len--) { + BDIGITS(v)[len] = ((BDIGIT)~0) * rand_buf[len]; + } + + return v; +} + +/* + * call-seq: + * big.size -> integer + * + * Returns the number of bytes in the machine representation of + * <i>big</i>. + * + * (256**10 - 1).size #=> 12 + * (256**20 - 1).size #=> 20 + * (256**40 - 1).size #=> 40 + */ + +static VALUE +rb_big_size(big) + VALUE big; +{ + return LONG2FIX(RBIGNUM(big)->len*SIZEOF_BDIGITS); +} + +/* + * Bignum objects hold integers outside the range of + * Fixnum. Bignum objects are created + * automatically when integer calculations would otherwise overflow a + * Fixnum. When a calculation involving + * Bignum objects returns a result that will fit in a + * Fixnum, the result is automatically converted. + * + * For the purposes of the bitwise operations and <code>[]</code>, a + * Bignum is treated as if it were an infinite-length + * bitstring with 2's complement representation. + * + * While Fixnum values are immediate, Bignum + * objects are not---assignment and parameter passing work with + * references to objects, not the objects themselves. + * + */ + +void +Init_Bignum() +{ + rb_cBignum = rb_define_class("Bignum", rb_cInteger); + + rb_define_method(rb_cBignum, "to_s", rb_big_to_s, -1); + rb_define_method(rb_cBignum, "coerce", rb_big_coerce, 1); + rb_define_method(rb_cBignum, "-@", rb_big_uminus, 0); + rb_define_method(rb_cBignum, "+", rb_big_plus, 1); + rb_define_method(rb_cBignum, "-", rb_big_minus, 1); + rb_define_method(rb_cBignum, "*", rb_big_mul, 1); + rb_define_method(rb_cBignum, "/", rb_big_div, 1); + rb_define_method(rb_cBignum, "%", rb_big_modulo, 1); + rb_define_method(rb_cBignum, "div", rb_big_div, 1); + rb_define_method(rb_cBignum, "divmod", rb_big_divmod, 1); + rb_define_method(rb_cBignum, "modulo", rb_big_modulo, 1); + rb_define_method(rb_cBignum, "remainder", rb_big_remainder, 1); + rb_define_method(rb_cBignum, "quo", rb_big_quo, 1); + rb_define_method(rb_cBignum, "**", rb_big_pow, 1); + rb_define_method(rb_cBignum, "&", rb_big_and, 1); + rb_define_method(rb_cBignum, "|", rb_big_or, 1); + rb_define_method(rb_cBignum, "^", rb_big_xor, 1); + rb_define_method(rb_cBignum, "~", rb_big_neg, 0); + rb_define_method(rb_cBignum, "<<", rb_big_lshift, 1); + rb_define_method(rb_cBignum, ">>", rb_big_rshift, 1); + rb_define_method(rb_cBignum, "[]", rb_big_aref, 1); + + rb_define_method(rb_cBignum, "<=>", rb_big_cmp, 1); + rb_define_method(rb_cBignum, "==", rb_big_eq, 1); + rb_define_method(rb_cBignum, "eql?", rb_big_eql, 1); + rb_define_method(rb_cBignum, "hash", rb_big_hash, 0); + rb_define_method(rb_cBignum, "to_f", rb_big_to_f, 0); + rb_define_method(rb_cBignum, "abs", rb_big_abs, 0); + rb_define_method(rb_cBignum, "size", rb_big_size, 0); +} +/********************************************************************** + + class.c - + + $Author: shyouhei $ + $Date: 2009-01-16 02:58:45 +0100 (Fri, 16 Jan 2009) $ + created at: Tue Aug 10 15:05:44 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "rubysig.h" +#include "node.h" +#include "st.h" +#include <ctype.h> + +extern st_table *rb_class_tbl; + +VALUE +rb_class_boot(super) + VALUE super; +{ + NEWOBJ(klass, struct RClass); + OBJSETUP(klass, rb_cClass, T_CLASS); + + klass->super = super; + klass->iv_tbl = 0; + klass->m_tbl = 0; /* safe GC */ + klass->m_tbl = st_init_numtable(); + + OBJ_INFECT(klass, super); + return (VALUE)klass; +} + +VALUE +rb_class_new(super) + VALUE super; +{ + Check_Type(super, T_CLASS); + if (super == rb_cClass) { + rb_raise(rb_eTypeError, "can't make subclass of Class"); + } + if (FL_TEST(super, FL_SINGLETON)) { + rb_raise(rb_eTypeError, "can't make subclass of virtual class"); + } + return rb_class_boot(super); +} + +struct clone_method_data { + st_table *tbl; + VALUE klass; +}; + +static int +clone_method(mid, body, data) + ID mid; + NODE *body; + struct clone_method_data *data; +{ + NODE *fbody = body->nd_body; + + if (fbody && nd_type(fbody) == NODE_SCOPE) { + NODE *cref = (NODE*)fbody->nd_rval; + + if (cref) cref = cref->nd_next; + fbody = rb_copy_node_scope(fbody, NEW_CREF(data->klass, cref)); + } + st_insert(data->tbl, mid, (st_data_t)NEW_METHOD(fbody, body->nd_noex)); + return ST_CONTINUE; +} + +/* :nodoc: */ +VALUE +rb_mod_init_copy(clone, orig) + VALUE clone, orig; +{ + rb_obj_init_copy(clone, orig); + if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) { + RBASIC(clone)->klass = RBASIC(orig)->klass; + RBASIC(clone)->klass = rb_singleton_class_clone(clone); + } + RCLASS(clone)->super = RCLASS(orig)->super; + if (RCLASS(orig)->iv_tbl) { + ID id; + + RCLASS(clone)->iv_tbl = st_copy(RCLASS(orig)->iv_tbl); + id = rb_intern("__classpath__"); + st_delete(RCLASS(clone)->iv_tbl, (st_data_t*)&id, 0); + id = rb_intern("__classid__"); + st_delete(RCLASS(clone)->iv_tbl, (st_data_t*)&id, 0); + } + if (RCLASS(orig)->m_tbl) { + struct clone_method_data data; + + data.tbl = RCLASS(clone)->m_tbl = st_init_numtable(); + data.klass = (VALUE)clone; + + st_foreach(RCLASS(orig)->m_tbl, clone_method, (st_data_t)&data); + } + + return clone; +} + +/* :nodoc: */ +VALUE +rb_class_init_copy(clone, orig) + VALUE clone, orig; +{ + if (RCLASS(clone)->super != 0) { + rb_raise(rb_eTypeError, "already initialized class"); + } + if (FL_TEST(orig, FL_SINGLETON)) { + rb_raise(rb_eTypeError, "can't copy singleton class"); + } + return rb_mod_init_copy(clone, orig); +} + +VALUE +rb_singleton_class_clone(obj) + VALUE obj; +{ + VALUE klass = RBASIC(obj)->klass; + + if (!FL_TEST(klass, FL_SINGLETON)) + return klass; + else { + /* copy singleton(unnamed) class */ + NEWOBJ(clone, struct RClass); + OBJSETUP(clone, 0, RBASIC(klass)->flags); + + if (BUILTIN_TYPE(obj) == T_CLASS) { + RBASIC(clone)->klass = (VALUE)clone; + } + else { + RBASIC(clone)->klass = rb_singleton_class_clone(klass); + } + + clone->super = RCLASS(klass)->super; + clone->iv_tbl = 0; + clone->m_tbl = 0; + if (RCLASS(klass)->iv_tbl) { + clone->iv_tbl = st_copy(RCLASS(klass)->iv_tbl); + } + { + struct clone_method_data data; + + data.tbl = clone->m_tbl = st_init_numtable(); + switch (TYPE(obj)) { + case T_CLASS: + case T_MODULE: + data.klass = obj; + break; + default: + data.klass = 0; + break; + } + + st_foreach(RCLASS(klass)->m_tbl, clone_method, (st_data_t)&data); + } + rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone); + FL_SET(clone, FL_SINGLETON); + return (VALUE)clone; + } +} + +void +rb_singleton_class_attached(klass, obj) + VALUE klass, obj; +{ + if (FL_TEST(klass, FL_SINGLETON)) { + if (!RCLASS(klass)->iv_tbl) { + RCLASS(klass)->iv_tbl = st_init_numtable(); + } + st_insert(RCLASS(klass)->iv_tbl, rb_intern("__attached__"), obj); + } +} + +VALUE +rb_make_metaclass(obj, super) + VALUE obj, super; +{ + VALUE klass = rb_class_boot(super); + FL_SET(klass, FL_SINGLETON); + RBASIC(obj)->klass = klass; + rb_singleton_class_attached(klass, obj); + if (BUILTIN_TYPE(obj) == T_CLASS && FL_TEST(obj, FL_SINGLETON)) { + RBASIC(klass)->klass = klass; + RCLASS(klass)->super = RBASIC(rb_class_real(RCLASS(obj)->super))->klass; + } + else { + VALUE metasuper = RBASIC(rb_class_real(super))->klass; + + /* metaclass of a superclass may be NULL at boot time */ + if (metasuper) { + RBASIC(klass)->klass = metasuper; + } + } + + return klass; +} + +VALUE +rb_define_class_id(id, super) + ID id; + VALUE super; +{ + VALUE klass; + + if (!super) super = rb_cObject; + klass = rb_class_new(super); + rb_make_metaclass(klass, RBASIC(super)->klass); + + return klass; +} + +void +rb_check_inheritable(super) + VALUE super; +{ + if (TYPE(super) != T_CLASS) { + rb_raise(rb_eTypeError, "superclass must be a Class (%s given)", + rb_obj_classname(super)); + } + if (RBASIC(super)->flags & FL_SINGLETON) { + rb_raise(rb_eTypeError, "can't make subclass of virtual class"); + } +} + +VALUE +rb_class_inherited(super, klass) + VALUE super, klass; +{ + if (!super) super = rb_cObject; + return rb_funcall(super, rb_intern("inherited"), 1, klass); +} + +VALUE +rb_define_class(name, super) + const char *name; + VALUE super; +{ + VALUE klass; + ID id; + + id = rb_intern(name); + if (rb_const_defined(rb_cObject, id)) { + klass = rb_const_get(rb_cObject, id); + if (TYPE(klass) != T_CLASS) { + rb_raise(rb_eTypeError, "%s is not a class", name); + } + if (rb_class_real(RCLASS(klass)->super) != super) { + rb_name_error(id, "%s is already defined", name); + } + return klass; + } + if (!super) { + rb_warn("no super class for `%s', Object assumed", name); + } + klass = rb_define_class_id(id, super); + st_add_direct(rb_class_tbl, id, klass); + rb_name_class(klass, id); + rb_const_set(rb_cObject, id, klass); + rb_class_inherited(super, klass); + + return klass; +} + +VALUE +rb_define_class_under(outer, name, super) + VALUE outer; + const char *name; + VALUE super; +{ + VALUE klass; + ID id; + + id = rb_intern(name); + if (rb_const_defined_at(outer, id)) { + klass = rb_const_get_at(outer, id); + if (TYPE(klass) != T_CLASS) { + rb_raise(rb_eTypeError, "%s is not a class", name); + } + if (rb_class_real(RCLASS(klass)->super) != super) { + rb_name_error(id, "%s is already defined", name); + } + return klass; + } + if (!super) { + rb_warn("no super class for `%s::%s', Object assumed", + rb_class2name(outer), name); + } + klass = rb_define_class_id(id, super); + rb_set_class_path(klass, outer, name); + rb_const_set(outer, id, klass); + rb_class_inherited(super, klass); + + return klass; +} + +VALUE +rb_module_new() +{ + NEWOBJ(mdl, struct RClass); + OBJSETUP(mdl, rb_cModule, T_MODULE); + + mdl->super = 0; + mdl->iv_tbl = 0; + mdl->m_tbl = 0; + mdl->m_tbl = st_init_numtable(); + + return (VALUE)mdl; +} + +VALUE +rb_define_module_id(id) + ID id; +{ + VALUE mdl; + + mdl = rb_module_new(); + rb_name_class(mdl, id); + + return mdl; +} + +VALUE +rb_define_module(name) + const char *name; +{ + VALUE module; + ID id; + + id = rb_intern(name); + if (rb_const_defined(rb_cObject, id)) { + module = rb_const_get(rb_cObject, id); + if (TYPE(module) == T_MODULE) + return module; + rb_raise(rb_eTypeError, "%s is not a module", rb_obj_classname(module)); + } + module = rb_define_module_id(id); + st_add_direct(rb_class_tbl, id, module); + rb_const_set(rb_cObject, id, module); + + return module; +} + +VALUE +rb_define_module_under(outer, name) + VALUE outer; + const char *name; +{ + VALUE module; + ID id; + + id = rb_intern(name); + if (rb_const_defined_at(outer, id)) { + module = rb_const_get_at(outer, id); + if (TYPE(module) == T_MODULE) + return module; + rb_raise(rb_eTypeError, "%s::%s is not a module", + rb_class2name(outer), rb_obj_classname(module)); + } + module = rb_define_module_id(id); + rb_const_set(outer, id, module); + rb_set_class_path(module, outer, name); + + return module; +} + +static VALUE +include_class_new(module, super) + VALUE module, super; +{ + NEWOBJ(klass, struct RClass); + OBJSETUP(klass, rb_cClass, T_ICLASS); + + if (BUILTIN_TYPE(module) == T_ICLASS) { + module = RBASIC(module)->klass; + } + if (!RCLASS(module)->iv_tbl) { + RCLASS(module)->iv_tbl = st_init_numtable(); + } + klass->iv_tbl = RCLASS(module)->iv_tbl; + klass->m_tbl = RCLASS(module)->m_tbl; + klass->super = super; + if (TYPE(module) == T_ICLASS) { + RBASIC(klass)->klass = RBASIC(module)->klass; + } + else { + RBASIC(klass)->klass = module; + } + OBJ_INFECT(klass, module); + OBJ_INFECT(klass, super); + + return (VALUE)klass; +} + +void +rb_include_module(klass, module) + VALUE klass, module; +{ + VALUE p, c; + int changed = 0; + + rb_frozen_class_p(klass); + if (!OBJ_TAINTED(klass)) { + rb_secure(4); + } + + if (TYPE(module) != T_MODULE) { + Check_Type(module, T_MODULE); + } + + OBJ_INFECT(klass, module); + c = klass; + while (module) { + int superclass_seen = Qfalse; + + if (RCLASS(klass)->m_tbl == RCLASS(module)->m_tbl) + rb_raise(rb_eArgError, "cyclic include detected"); + /* ignore if the module included already in superclasses */ + for (p = RCLASS(klass)->super; p; p = RCLASS(p)->super) { + switch (BUILTIN_TYPE(p)) { + case T_ICLASS: + if (RCLASS(p)->m_tbl == RCLASS(module)->m_tbl) { + if (!superclass_seen) { + c = p; /* move insertion point */ + } + goto skip; + } + break; + case T_CLASS: + superclass_seen = Qtrue; + break; + } + } + c = RCLASS(c)->super = include_class_new(module, RCLASS(c)->super); + changed = 1; + skip: + module = RCLASS(module)->super; + } + if (changed) rb_clear_cache(); +} + +/* + * call-seq: + * mod.included_modules -> array + * + * Returns the list of modules included in <i>mod</i>. + * + * module Mixin + * end + * + * module Outer + * include Mixin + * end + * + * Mixin.included_modules #=> [] + * Outer.included_modules #=> [Mixin] + */ + +VALUE +rb_mod_included_modules(mod) + VALUE mod; +{ + VALUE ary = rb_ary_new(); + VALUE p; + + for (p = RCLASS(mod)->super; p; p = RCLASS(p)->super) { + if (BUILTIN_TYPE(p) == T_ICLASS) { + rb_ary_push(ary, RBASIC(p)->klass); + } + } + return ary; +} + +/* + * call-seq: + * mod.include?(module) => true or false + * + * Returns <code>true</code> if <i>module</i> is included in + * <i>mod</i> or one of <i>mod</i>'s ancestors. + * + * module A + * end + * class B + * include A + * end + * class C < B + * end + * B.include?(A) #=> true + * C.include?(A) #=> true + * A.include?(A) #=> false + */ + +VALUE +rb_mod_include_p(mod, mod2) + VALUE mod; + VALUE mod2; +{ + VALUE p; + + Check_Type(mod2, T_MODULE); + for (p = RCLASS(mod)->super; p; p = RCLASS(p)->super) { + if (BUILTIN_TYPE(p) == T_ICLASS) { + if (RBASIC(p)->klass == mod2) return Qtrue; + } + } + return Qfalse; +} + +/* + * call-seq: + * mod.ancestors -> array + * + * Returns a list of modules included in <i>mod</i> (including + * <i>mod</i> itself). + * + * module Mod + * include Math + * include Comparable + * end + * + * Mod.ancestors #=> [Mod, Comparable, Math] + * Math.ancestors #=> [Math] + */ + +VALUE +rb_mod_ancestors(mod) + VALUE mod; +{ + VALUE p, ary = rb_ary_new(); + + for (p = mod; p; p = RCLASS(p)->super) { + if (FL_TEST(p, FL_SINGLETON)) + continue; + if (BUILTIN_TYPE(p) == T_ICLASS) { + rb_ary_push(ary, RBASIC(p)->klass); + } + else { + rb_ary_push(ary, p); + } + } + return ary; +} + +#define VISI(x) ((x)&NOEX_MASK) +#define VISI_CHECK(x,f) (VISI(x) == (f)) + +static int +ins_methods_push(name, type, ary, visi) + ID name; + long type; + VALUE ary; + long visi; +{ + if (type == -1) return ST_CONTINUE; + switch (visi) { + case NOEX_PRIVATE: + case NOEX_PROTECTED: + case NOEX_PUBLIC: + visi = (type == visi); + break; + default: + visi = (type != NOEX_PRIVATE); + break; + } + if (visi) { + rb_ary_push(ary, rb_str_new2(rb_id2name(name))); + } + return ST_CONTINUE; +} + +static int +ins_methods_i(name, type, ary) + ID name; + long type; + VALUE ary; +{ + return ins_methods_push(name, type, ary, -1); /* everything but private */ +} + +static int +ins_methods_prot_i(name, type, ary) + ID name; + long type; + VALUE ary; +{ + return ins_methods_push(name, type, ary, NOEX_PROTECTED); +} + +static int +ins_methods_priv_i(name, type, ary) + ID name; + long type; + VALUE ary; +{ + return ins_methods_push(name, type, ary, NOEX_PRIVATE); +} + +static int +ins_methods_pub_i(name, type, ary) + ID name; + long type; + VALUE ary; +{ + return ins_methods_push(name, type, ary, NOEX_PUBLIC); +} + +static int +method_entry(key, body, list) + ID key; + NODE *body; + st_table *list; +{ + long type; + + if (key == ID_ALLOCATOR) return ST_CONTINUE; + if (!st_lookup(list, key, 0)) { + if (!body->nd_body) type = -1; /* none */ + else type = VISI(body->nd_noex); + st_add_direct(list, key, type); + } + return ST_CONTINUE; +} + +static VALUE +class_instance_method_list(argc, argv, mod, func) + int argc; + VALUE *argv; + VALUE mod; + int (*func) _((ID, long, VALUE)); +{ + VALUE ary; + int recur; + st_table *list; + + if (argc == 0) { + recur = Qtrue; + } + else { + VALUE r; + rb_scan_args(argc, argv, "01", &r); + recur = RTEST(r); + } + + list = st_init_numtable(); + for (; mod; mod = RCLASS(mod)->super) { + st_foreach(RCLASS(mod)->m_tbl, method_entry, (st_data_t)list); + if (BUILTIN_TYPE(mod) == T_ICLASS) continue; + if (FL_TEST(mod, FL_SINGLETON)) continue; + if (!recur) break; + } + ary = rb_ary_new(); + st_foreach(list, func, ary); + st_free_table(list); + + return ary; +} + +/* + * call-seq: + * mod.instance_methods(include_super=true) => array + * + * Returns an array containing the names of public instance methods in + * the receiver. For a module, these are the public methods; for a + * class, they are the instance (not singleton) methods. With no + * argument, or with an argument that is <code>false</code>, the + * instance methods in <i>mod</i> are returned, otherwise the methods + * in <i>mod</i> and <i>mod</i>'s superclasses are returned. + * + * module A + * def method1() end + * end + * class B + * def method2() end + * end + * class C < B + * def method3() end + * end + * + * A.instance_methods #=> ["method1"] + * B.instance_methods(false) #=> ["method2"] + * C.instance_methods(false) #=> ["method3"] + * C.instance_methods(true).length #=> 43 + */ + +VALUE +rb_class_instance_methods(argc, argv, mod) + int argc; + VALUE *argv; + VALUE mod; +{ + return class_instance_method_list(argc, argv, mod, ins_methods_i); +} + +/* + * call-seq: + * mod.protected_instance_methods(include_super=true) => array + * + * Returns a list of the protected instance methods defined in + * <i>mod</i>. If the optional parameter is not <code>false</code>, the + * methods of any ancestors are included. + */ + +VALUE +rb_class_protected_instance_methods(argc, argv, mod) + int argc; + VALUE *argv; + VALUE mod; +{ + return class_instance_method_list(argc, argv, mod, ins_methods_prot_i); +} + +/* + * call-seq: + * mod.private_instance_methods(include_super=true) => array + * + * Returns a list of the private instance methods defined in + * <i>mod</i>. If the optional parameter is not <code>false</code>, the + * methods of any ancestors are included. + * + * module Mod + * def method1() end + * private :method1 + * def method2() end + * end + * Mod.instance_methods #=> ["method2"] + * Mod.private_instance_methods #=> ["method1"] + */ + +VALUE +rb_class_private_instance_methods(argc, argv, mod) + int argc; + VALUE *argv; + VALUE mod; +{ + return class_instance_method_list(argc, argv, mod, ins_methods_priv_i); +} + +/* + * call-seq: + * mod.public_instance_methods(include_super=true) => array + * + * Returns a list of the public instance methods defined in <i>mod</i>. + * If the optional parameter is not <code>false</code>, the methods of + * any ancestors are included. + */ + +VALUE +rb_class_public_instance_methods(argc, argv, mod) + int argc; + VALUE *argv; + VALUE mod; +{ + return class_instance_method_list(argc, argv, mod, ins_methods_pub_i); +} + +/* + * call-seq: + * obj.singleton_methods(all=true) => array + * + * Returns an array of the names of singleton methods for <i>obj</i>. + * If the optional <i>all</i> parameter is true, the list will include + * methods in modules included in <i>obj</i>. + * + * module Other + * def three() end + * end + * + * class Single + * def Single.four() end + * end + * + * a = Single.new + * + * def a.one() + * end + * + * class << a + * include Other + * def two() + * end + * end + * + * Single.singleton_methods #=> ["four"] + * a.singleton_methods(false) #=> ["two", "one"] + * a.singleton_methods #=> ["two", "one", "three"] + */ + +VALUE +rb_obj_singleton_methods(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE recur, ary, klass; + st_table *list; + + rb_scan_args(argc, argv, "01", &recur); + if (argc == 0) { + recur = Qtrue; + } + klass = CLASS_OF(obj); + list = st_init_numtable(); + if (klass && FL_TEST(klass, FL_SINGLETON)) { + st_foreach(RCLASS(klass)->m_tbl, method_entry, (st_data_t)list); + klass = RCLASS(klass)->super; + } + if (RTEST(recur)) { + while (klass && (FL_TEST(klass, FL_SINGLETON) || TYPE(klass) == T_ICLASS)) { + st_foreach(RCLASS(klass)->m_tbl, method_entry, (st_data_t)list); + klass = RCLASS(klass)->super; + } + } + ary = rb_ary_new(); + st_foreach(list, ins_methods_i, ary); + st_free_table(list); + + return ary; +} + +void +rb_define_method_id(klass, name, func, argc) + VALUE klass; + ID name; + VALUE (*func)(); + int argc; +{ + rb_add_method(klass, name, NEW_CFUNC(func,argc), NOEX_PUBLIC); +} + +void +rb_define_method(klass, name, func, argc) + VALUE klass; + const char *name; + VALUE (*func)(); + int argc; +{ + ID id = rb_intern(name); + int ex = NOEX_PUBLIC; + + + rb_add_method(klass, id, NEW_CFUNC(func, argc), ex); +} + +void +rb_define_protected_method(klass, name, func, argc) + VALUE klass; + const char *name; + VALUE (*func)(); + int argc; +{ + rb_add_method(klass, rb_intern(name), NEW_CFUNC(func, argc), NOEX_PROTECTED); +} + +void +rb_define_private_method(klass, name, func, argc) + VALUE klass; + const char *name; + VALUE (*func)(); + int argc; +{ + rb_add_method(klass, rb_intern(name), NEW_CFUNC(func, argc), NOEX_PRIVATE); +} + +void +rb_undef_method(klass, name) + VALUE klass; + const char *name; +{ + rb_add_method(klass, rb_intern(name), 0, NOEX_UNDEF); +} + +#define SPECIAL_SINGLETON(x,c) do {\ + if (obj == (x)) {\ + return c;\ + }\ +} while (0) + +VALUE +rb_singleton_class(obj) + VALUE obj; +{ + VALUE klass; + + if (FIXNUM_P(obj) || SYMBOL_P(obj)) { + rb_raise(rb_eTypeError, "can't define singleton"); + } + if (rb_special_const_p(obj)) { + SPECIAL_SINGLETON(Qnil, rb_cNilClass); + SPECIAL_SINGLETON(Qfalse, rb_cFalseClass); + SPECIAL_SINGLETON(Qtrue, rb_cTrueClass); + rb_bug("unknown immediate %ld", obj); + } + + DEFER_INTS; + if (FL_TEST(RBASIC(obj)->klass, FL_SINGLETON) && + rb_iv_get(RBASIC(obj)->klass, "__attached__") == obj) { + klass = RBASIC(obj)->klass; + } + else { + klass = rb_make_metaclass(obj, RBASIC(obj)->klass); + } + if (OBJ_TAINTED(obj)) { + OBJ_TAINT(klass); + } + else { + FL_UNSET(klass, FL_TAINT); + } + if (OBJ_FROZEN(obj)) OBJ_FREEZE(klass); + ALLOW_INTS; + + return klass; +} + +void +rb_define_singleton_method(obj, name, func, argc) + VALUE obj; + const char *name; + VALUE (*func)(); + int argc; +{ + rb_define_method(rb_singleton_class(obj), name, func, argc); +} + +void +rb_define_module_function(module, name, func, argc) + VALUE module; + const char *name; + VALUE (*func)(); + int argc; +{ + rb_define_private_method(module, name, func, argc); + rb_define_singleton_method(module, name, func, argc); +} + +void +rb_define_global_function(name, func, argc) + const char *name; + VALUE (*func)(); + int argc; +{ + rb_define_module_function(rb_mKernel, name, func, argc); +} + +void +rb_define_alias(klass, name1, name2) + VALUE klass; + const char *name1, *name2; +{ + rb_alias(klass, rb_intern(name1), rb_intern(name2)); +} + +void +rb_define_attr(klass, name, read, write) + VALUE klass; + const char *name; + int read, write; +{ + rb_attr(klass, rb_intern(name), read, write, Qfalse); +} + +#ifdef HAVE_STDARG_PROTOTYPES +#include <stdarg.h> +#define va_init_list(a,b) va_start(a,b) +#else +#include <varargs.h> +#define va_init_list(a,b) va_start(a) +#endif + +int +#ifdef HAVE_STDARG_PROTOTYPES +rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...) +#else +rb_scan_args(argc, argv, fmt, va_alist) + int argc; + const VALUE *argv; + const char *fmt; + va_dcl +#endif +{ + int n, i = 0; + const char *p = fmt; + VALUE *var; + va_list vargs; + + va_init_list(vargs, fmt); + + if (*p == '*') goto rest_arg; + + if (ISDIGIT(*p)) { + n = *p - '0'; + if (n > argc) + rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, n); + for (i=0; i<n; i++) { + var = va_arg(vargs, VALUE*); + if (var) *var = argv[i]; + } + p++; + } + else { + goto error; + } + + if (ISDIGIT(*p)) { + n = i + *p - '0'; + for (; i<n; i++) { + var = va_arg(vargs, VALUE*); + if (argc > i) { + if (var) *var = argv[i]; + } + else { + if (var) *var = Qnil; + } + } + p++; + } + + if(*p == '*') { + rest_arg: + var = va_arg(vargs, VALUE*); + if (argc > i) { + if (var) *var = rb_ary_new4(argc-i, argv+i); + i = argc; + } + else { + if (var) *var = rb_ary_new(); + } + p++; + } + + if (*p == '&') { + var = va_arg(vargs, VALUE*); + if (rb_block_given_p()) { + *var = rb_block_proc(); + } + else { + *var = Qnil; + } + p++; + } + va_end(vargs); + + if (*p != '\0') { + goto error; + } + + if (argc > i) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, i); + } + + return argc; + + error: + rb_fatal("bad scan arg format: %s", fmt); + return 0; +} +/********************************************************************** + + compar.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Thu Aug 26 14:39:48 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" + +VALUE rb_mComparable; + +static ID cmp; + +int +rb_cmpint(val, a, b) + VALUE val, a, b; +{ + if (NIL_P(val)) { + rb_cmperr(a, b); + } + if (FIXNUM_P(val)) return FIX2INT(val); + if (TYPE(val) == T_BIGNUM) { + if (RBIGNUM(val)->sign) return 1; + return -1; + } + if (RTEST(rb_funcall(val, '>', 1, INT2FIX(0)))) return 1; + if (RTEST(rb_funcall(val, '<', 1, INT2FIX(0)))) return -1; + return 0; +} + +void +rb_cmperr(x, y) + VALUE x, y; +{ + const char *classname; + + if (SPECIAL_CONST_P(y)) { + y = rb_inspect(y); + classname = StringValuePtr(y); + } + else { + classname = rb_obj_classname(y); + } + rb_raise(rb_eArgError, "comparison of %s with %s failed", + rb_obj_classname(x), classname); +} + +#define cmperr() (rb_cmperr(x, y), Qnil) + +static VALUE +cmp_eq(a) + VALUE *a; +{ + VALUE c = rb_funcall(a[0], cmp, 1, a[1]); + + if (NIL_P(c)) return Qnil; + if (rb_cmpint(c, a[0], a[1]) == 0) return Qtrue; + return Qfalse; +} + +static VALUE +cmp_failed() +{ + return Qnil; +} + +/* + * call-seq: + * obj == other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns 0. Also returns true if + * _obj_ and _other_ are the same object. + */ + +static VALUE +cmp_equal(x, y) + VALUE x, y; +{ + VALUE a[2]; + + if (x == y) return Qtrue; + + a[0] = x; a[1] = y; + return rb_rescue(cmp_eq, (VALUE)a, cmp_failed, 0); +} + +/* + * call-seq: + * obj > other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns 1. + */ + +static VALUE +cmp_gt(x, y) + VALUE x, y; +{ + VALUE c = rb_funcall(x, cmp, 1, y); + + if (NIL_P(c)) return cmperr(); + if (rb_cmpint(c, x, y) > 0) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * obj >= other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns 0 or 1. + */ + +static VALUE +cmp_ge(x, y) + VALUE x, y; +{ + VALUE c = rb_funcall(x, cmp, 1, y); + + if (NIL_P(c)) return cmperr(); + if (rb_cmpint(c, x, y) >= 0) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * obj < other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns -1. + */ + +static VALUE +cmp_lt(x, y) + VALUE x, y; +{ + VALUE c = rb_funcall(x, cmp, 1, y); + + if (NIL_P(c)) return cmperr(); + if (rb_cmpint(c, x, y) < 0) return Qtrue; + return Qfalse; +} + + +/* + * call-seq: + * obj <= other => true or false + * + * Compares two objects based on the receiver's <code><=></code> + * method, returning true if it returns -1 or 0. + */ + +static VALUE +cmp_le(x, y) + VALUE x, y; +{ + VALUE c = rb_funcall(x, cmp, 1, y); + + if (NIL_P(c)) return cmperr(); + if (rb_cmpint(c, x, y) <= 0) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * obj.between?(min, max) => true or false + * + * Returns <code>false</code> if <i>obj</i> <code><=></code> + * <i>min</i> is less than zero or if <i>anObject</i> <code><=></code> + * <i>max</i> is greater than zero, <code>true</code> otherwise. + * + * 3.between?(1, 5) #=> true + * 6.between?(1, 5) #=> false + * 'cat'.between?('ant', 'dog') #=> true + * 'gnu'.between?('ant', 'dog') #=> false + * + */ + +static VALUE +cmp_between(x, min, max) + VALUE x, min, max; +{ + if (RTEST(cmp_lt(x, min))) return Qfalse; + if (RTEST(cmp_gt(x, max))) return Qfalse; + return Qtrue; +} + +/* + * The <code>Comparable</code> mixin is used by classes whose objects + * may be ordered. The class must define the <code><=></code> operator, + * which compares the receiver against another object, returning -1, 0, + * or +1 depending on whether the receiver is less than, equal to, or + * greater than the other object. <code>Comparable</code> uses + * <code><=></code> to implement the conventional comparison operators + * (<code><</code>, <code><=</code>, <code>==</code>, <code>>=</code>, + * and <code>></code>) and the method <code>between?</code>. + * + * class SizeMatters + * include Comparable + * attr :str + * def <=>(anOther) + * str.size <=> anOther.str.size + * end + * def initialize(str) + * @str = str + * end + * def inspect + * @str + * end + * end + * + * s1 = SizeMatters.new("Z") + * s2 = SizeMatters.new("YY") + * s3 = SizeMatters.new("XXX") + * s4 = SizeMatters.new("WWWW") + * s5 = SizeMatters.new("VVVVV") + * + * s1 < s2 #=> true + * s4.between?(s1, s3) #=> false + * s4.between?(s3, s5) #=> true + * [ s3, s2, s5, s4, s1 ].sort #=> [Z, YY, XXX, WWWW, VVVVV] + * + */ + +void +Init_Comparable() +{ + rb_mComparable = rb_define_module("Comparable"); + rb_define_method(rb_mComparable, "==", cmp_equal, 1); + rb_define_method(rb_mComparable, ">", cmp_gt, 1); + rb_define_method(rb_mComparable, ">=", cmp_ge, 1); + rb_define_method(rb_mComparable, "<", cmp_lt, 1); + rb_define_method(rb_mComparable, "<=", cmp_le, 1); + rb_define_method(rb_mComparable, "between?", cmp_between, 2); + + cmp = rb_intern("<=>"); +} +/********************************************************************** + + dir.c - + + $Author: shyouhei $ + $Date: 2009-02-04 06:26:31 +0100 (Wed, 04 Feb 2009) $ + created at: Wed Jan 5 09:51:01 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" + +#include <sys/types.h> +#include <sys/stat.h> + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#if defined HAVE_DIRENT_H && !defined _WIN32 +# include <dirent.h> +# define NAMLEN(dirent) strlen((dirent)->d_name) +#elif defined HAVE_DIRECT_H && !defined _WIN32 +# include <direct.h> +# define NAMLEN(dirent) strlen((dirent)->d_name) +#else +# define dirent direct +# if !defined __NeXT__ +# define NAMLEN(dirent) (dirent)->d_namlen +# else +# /* On some versions of NextStep, d_namlen is always zero, so avoid it. */ +# define NAMLEN(dirent) strlen((dirent)->d_name) +# endif +# if HAVE_SYS_NDIR_H +# include <sys/ndir.h> +# endif +# if HAVE_SYS_DIR_H +# include <sys/dir.h> +# endif +# if HAVE_NDIR_H +# include <ndir.h> +# endif +# ifdef _WIN32 +# include "win32/dir.h" +# endif +#endif + +#include <errno.h> + +#ifndef HAVE_STDLIB_H +char *getenv(); +#endif + +#ifndef HAVE_STRING_H +char *strchr _((char*,char)); +#endif + +#include <ctype.h> + +#include "util.h" + +#if !defined HAVE_LSTAT && !defined lstat +#define lstat stat +#endif + +#ifndef CASEFOLD_FILESYSTEM +# if defined DOSISH || defined __VMS +# define CASEFOLD_FILESYSTEM 1 +# else +# define CASEFOLD_FILESYSTEM 0 +# endif +#endif + +#define FNM_NOESCAPE 0x01 +#define FNM_PATHNAME 0x02 +#define FNM_DOTMATCH 0x04 +#define FNM_CASEFOLD 0x08 +#if CASEFOLD_FILESYSTEM +#define FNM_SYSCASE FNM_CASEFOLD +#else +#define FNM_SYSCASE 0 +#endif + +#define FNM_NOMATCH 1 +#define FNM_ERROR 2 + +#define downcase(c) (nocase && ISUPPER(c) ? tolower(c) : (c)) +#define compare(c1, c2) (((unsigned char)(c1)) - ((unsigned char)(c2))) + +/* caution: in case *p == '\0' + Next(p) == p + 1 in single byte environment + Next(p) == p in multi byte environment +*/ +#if defined(CharNext) +# define Next(p) CharNext(p) +#elif defined(DJGPP) +# define Next(p) ((p) + mblen(p, RUBY_MBCHAR_MAXSIZE)) +#elif defined(__EMX__) +# define Next(p) ((p) + emx_mblen(p)) +static inline int +emx_mblen(const char *p) +{ + int n = mblen(p, RUBY_MBCHAR_MAXSIZE); + return (n < 0) ? 1 : n; +} +#endif + +#ifndef Next /* single byte environment */ +# define Next(p) ((p) + 1) +# define Inc(p) (++(p)) +# define Compare(p1, p2) (compare(downcase(*(p1)), downcase(*(p2)))) +#else /* multi byte environment */ +# define Inc(p) ((p) = Next(p)) +# define Compare(p1, p2) (CompareImpl(p1, p2, nocase)) +static int +CompareImpl(const char *p1, const char *p2, int nocase) +{ + const int len1 = Next(p1) - p1; + const int len2 = Next(p2) - p2; +#ifdef _WIN32 + char buf1[10], buf2[10]; /* large enough? */ +#endif + + if (len1 < 0 || len2 < 0) { + rb_fatal("CompareImpl: negative len"); + } + + if (len1 == 0) return len2; + if (len2 == 0) return -len1; + +#ifdef _WIN32 + if (nocase && rb_w32_iswinnt()) { + if (len1 > 1) { + if (len1 >= sizeof(buf1)) { + rb_fatal("CompareImpl: too large len"); + } + memcpy(buf1, p1, len1); + buf1[len1] = '\0'; + CharLower(buf1); + p1 = buf1; /* trick */ + } + if (len2 > 1) { + if (len2 >= sizeof(buf2)) { + rb_fatal("CompareImpl: too large len"); + } + memcpy(buf2, p2, len2); + buf2[len2] = '\0'; + CharLower(buf2); + p2 = buf2; /* trick */ + } + } +#endif + if (len1 == 1) + if (len2 == 1) + return compare(downcase(*p1), downcase(*p2)); + else { + const int ret = compare(downcase(*p1), *p2); + return ret ? ret : -1; + } + else + if (len2 == 1) { + const int ret = compare(*p1, downcase(*p2)); + return ret ? ret : 1; + } + else { + const int ret = memcmp(p1, p2, len1 < len2 ? len1 : len2); + return ret ? ret : len1 - len2; + } +} +#endif /* environment */ + +static char * +bracket(p, s, flags) + const char *p; /* pattern (next to '[') */ + const char *s; /* string */ + int flags; +{ + const int nocase = flags & FNM_CASEFOLD; + const int escape = !(flags & FNM_NOESCAPE); + + int ok = 0, not = 0; + + if (*p == '!' || *p == '^') { + not = 1; + p++; + } + + while (*p != ']') { + const char *t1 = p; + if (escape && *t1 == '\\') + t1++; + if (!*t1) + return NULL; + p = Next(t1); + if (p[0] == '-' && p[1] != ']') { + const char *t2 = p + 1; + if (escape && *t2 == '\\') + t2++; + if (!*t2) + return NULL; + p = Next(t2); + if (!ok && Compare(t1, s) <= 0 && Compare(s, t2) <= 0) + ok = 1; + } + else + if (!ok && Compare(t1, s) == 0) + ok = 1; + } + + return ok == not ? NULL : (char *)p + 1; +} + +/* If FNM_PATHNAME is set, only path element will be matched. (upto '/' or '\0') + Otherwise, entire string will be matched. + End marker itself won't be compared. + And if function succeeds, *pcur reaches end marker. +*/ +#define UNESCAPE(p) (escape && *(p) == '\\' ? (p) + 1 : (p)) +#define ISEND(p) (!*(p) || (pathname && *(p) == '/')) +#define RETURN(val) return *pcur = p, *scur = s, (val); + +static int +fnmatch_helper(pcur, scur, flags) + const char **pcur; /* pattern */ + const char **scur; /* string */ + int flags; +{ + const int period = !(flags & FNM_DOTMATCH); + const int pathname = flags & FNM_PATHNAME; + const int escape = !(flags & FNM_NOESCAPE); + const int nocase = flags & FNM_CASEFOLD; + + const char *ptmp = 0; + const char *stmp = 0; + + const char *p = *pcur; + const char *s = *scur; + + if (period && *s == '.' && *UNESCAPE(p) != '.') /* leading period */ + RETURN(FNM_NOMATCH); + + while (1) { + switch (*p) { + case '*': + do { p++; } while (*p == '*'); + if (ISEND(UNESCAPE(p))) { + p = UNESCAPE(p); + RETURN(0); + } + if (ISEND(s)) + RETURN(FNM_NOMATCH); + ptmp = p; + stmp = s; + continue; + + case '?': + if (ISEND(s)) + RETURN(FNM_NOMATCH); + p++; + Inc(s); + continue; + + case '[': { + const char *t; + if (ISEND(s)) + RETURN(FNM_NOMATCH); + if (t = bracket(p + 1, s, flags)) { + p = t; + Inc(s); + continue; + } + goto failed; + } + } + + /* ordinary */ + p = UNESCAPE(p); + if (ISEND(s)) + RETURN(ISEND(p) ? 0 : FNM_NOMATCH); + if (ISEND(p)) + goto failed; + if (Compare(p, s) != 0) + goto failed; + Inc(p); + Inc(s); + continue; + + failed: /* try next '*' position */ + if (ptmp && stmp) { + p = ptmp; + Inc(stmp); /* !ISEND(*stmp) */ + s = stmp; + continue; + } + RETURN(FNM_NOMATCH); + } +} + +static int +fnmatch(p, s, flags) + const char *p; /* pattern */ + const char *s; /* string */ + int flags; +{ + const int period = !(flags & FNM_DOTMATCH); + const int pathname = flags & FNM_PATHNAME; + + const char *ptmp = 0; + const char *stmp = 0; + + if (pathname) { + while (1) { + if (p[0] == '*' && p[1] == '*' && p[2] == '/') { + do { p += 3; } while (p[0] == '*' && p[1] == '*' && p[2] == '/'); + ptmp = p; + stmp = s; + } + if (fnmatch_helper(&p, &s, flags) == 0) { + while (*s && *s != '/') Inc(s); + if (*p && *s) { + p++; + s++; + continue; + } + if (!*p && !*s) + return 0; + } + /* failed : try next recursion */ + if (ptmp && stmp && !(period && *stmp == '.')) { + while (*stmp && *stmp != '/') Inc(stmp); + if (*stmp) { + p = ptmp; + stmp++; + s = stmp; + continue; + } + } + return FNM_NOMATCH; + } + } + else + return fnmatch_helper(&p, &s, flags); +} + +VALUE rb_cDir; + +struct dir_data { + DIR *dir; + char *path; +}; + +static void +free_dir(dir) + struct dir_data *dir; +{ + if (dir) { + if (dir->dir) closedir(dir->dir); + if (dir->path) free(dir->path); + } + free(dir); +} + +static VALUE dir_close _((VALUE)); + +static VALUE dir_s_alloc _((VALUE)); +static VALUE +dir_s_alloc(klass) + VALUE klass; +{ + struct dir_data *dirp; + VALUE obj = Data_Make_Struct(klass, struct dir_data, 0, free_dir, dirp); + + dirp->dir = NULL; + dirp->path = NULL; + + return obj; +} + +/* + * call-seq: + * Dir.new( string ) -> aDir + * + * Returns a new directory object for the named directory. + */ +static VALUE +dir_initialize(dir, dirname) + VALUE dir, dirname; +{ + struct dir_data *dp; + + SafeStringValue(dirname); + Data_Get_Struct(dir, struct dir_data, dp); + if (dp->dir) closedir(dp->dir); + if (dp->path) free(dp->path); + dp->dir = NULL; + dp->path = NULL; + dp->dir = opendir(RSTRING(dirname)->ptr); + if (dp->dir == NULL) { + if (errno == EMFILE || errno == ENFILE) { + rb_gc(); + dp->dir = opendir(RSTRING(dirname)->ptr); + } + if (dp->dir == NULL) { + rb_sys_fail(RSTRING(dirname)->ptr); + } + } + dp->path = strdup(RSTRING(dirname)->ptr); + + return dir; +} + +/* + * call-seq: + * Dir.open( string ) => aDir + * Dir.open( string ) {| aDir | block } => anObject + * + * With no block, <code>open</code> is a synonym for + * <code>Dir::new</code>. If a block is present, it is passed + * <i>aDir</i> as a parameter. The directory is closed at the end of + * the block, and <code>Dir::open</code> returns the value of the + * block. + */ + +static VALUE +dir_s_open(klass, dirname) + VALUE klass, dirname; +{ + struct dir_data *dp; + VALUE dir = Data_Make_Struct(klass, struct dir_data, 0, free_dir, dp); + + dir_initialize(dir, dirname); + if (rb_block_given_p()) { + return rb_ensure(rb_yield, dir, dir_close, dir); + } + + return dir; +} + +static void +dir_closed() +{ + rb_raise(rb_eIOError, "closed directory"); +} + +static void +dir_check(dir) + VALUE dir; +{ + if (!OBJ_TAINTED(dir) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: operation on untainted Dir"); + rb_check_frozen(dir); +} + +#define GetDIR(obj, dirp) do {\ + dir_check(dir);\ + Data_Get_Struct(obj, struct dir_data, dirp);\ + if (dirp->dir == NULL) dir_closed();\ +} while (0) + +/* + * call-seq: + * dir.inspect => string + * + * Return a string describing this Dir object. + */ +static VALUE +dir_inspect(dir) + VALUE dir; +{ + struct dir_data *dirp; + + GetDIR(dir, dirp); + if (dirp->path) { + char *c = rb_obj_classname(dir); + int len = strlen(c) + strlen(dirp->path) + 4; + VALUE s = rb_str_new(0, len); + snprintf(RSTRING_PTR(s), len+1, "#<%s:%s>", c, dirp->path); + return s; + } + return rb_funcall(dir, rb_intern("to_s"), 0, 0); +} + +/* + * call-seq: + * dir.path => string or nil + * + * Returns the path parameter passed to <em>dir</em>'s constructor. + * + * d = Dir.new("..") + * d.path #=> ".." + */ +static VALUE +dir_path(dir) + VALUE dir; +{ + struct dir_data *dirp; + + GetDIR(dir, dirp); + if (!dirp->path) return Qnil; + return rb_str_new2(dirp->path); +} + +/* + * call-seq: + * dir.read => string or nil + * + * Reads the next entry from <em>dir</em> and returns it as a string. + * Returns <code>nil</code> at the end of the stream. + * + * d = Dir.new("testdir") + * d.read #=> "." + * d.read #=> ".." + * d.read #=> "config.h" + */ +static VALUE +dir_read(dir) + VALUE dir; +{ + struct dir_data *dirp; + struct dirent *dp; + + GetDIR(dir, dirp); + errno = 0; + dp = readdir(dirp->dir); + if (dp) { + return rb_tainted_str_new(dp->d_name, NAMLEN(dp)); + } + else if (errno == 0) { /* end of stream */ + return Qnil; + } + else { + rb_sys_fail(0); + } + return Qnil; /* not reached */ +} + +/* + * call-seq: + * dir.each { |filename| block } => dir + * + * Calls the block once for each entry in this directory, passing the + * filename of each entry as a parameter to the block. + * + * d = Dir.new("testdir") + * d.each {|x| puts "Got #{x}" } + * + * <em>produces:</em> + * + * Got . + * Got .. + * Got config.h + * Got main.rb + */ +static VALUE +dir_each(dir) + VALUE dir; +{ + struct dir_data *dirp; + struct dirent *dp; + + GetDIR(dir, dirp); + rewinddir(dirp->dir); + for (dp = readdir(dirp->dir); dp != NULL; dp = readdir(dirp->dir)) { + rb_yield(rb_tainted_str_new(dp->d_name, NAMLEN(dp))); + if (dirp->dir == NULL) dir_closed(); + } + return dir; +} + +/* + * call-seq: + * dir.pos => integer + * dir.tell => integer + * + * Returns the current position in <em>dir</em>. See also + * <code>Dir#seek</code>. + * + * d = Dir.new("testdir") + * d.tell #=> 0 + * d.read #=> "." + * d.tell #=> 12 + */ +static VALUE +dir_tell(dir) + VALUE dir; +{ +#ifdef HAVE_TELLDIR + struct dir_data *dirp; + long pos; + + GetDIR(dir, dirp); + pos = telldir(dirp->dir); + return rb_int2inum(pos); +#else + rb_notimplement(); +#endif +} + +/* + * call-seq: + * dir.seek( integer ) => dir + * + * Seeks to a particular location in <em>dir</em>. <i>integer</i> + * must be a value returned by <code>Dir#tell</code>. + * + * d = Dir.new("testdir") #=> #<Dir:0x401b3c40> + * d.read #=> "." + * i = d.tell #=> 12 + * d.read #=> ".." + * d.seek(i) #=> #<Dir:0x401b3c40> + * d.read #=> ".." + */ +static VALUE +dir_seek(dir, pos) + VALUE dir, pos; +{ + struct dir_data *dirp; + off_t p = NUM2OFFT(pos); + + GetDIR(dir, dirp); +#ifdef HAVE_SEEKDIR + seekdir(dirp->dir, p); + return dir; +#else + rb_notimplement(); +#endif +} + +/* + * call-seq: + * dir.pos( integer ) => integer + * + * Synonym for <code>Dir#seek</code>, but returns the position + * parameter. + * + * d = Dir.new("testdir") #=> #<Dir:0x401b3c40> + * d.read #=> "." + * i = d.pos #=> 12 + * d.read #=> ".." + * d.pos = i #=> 12 + * d.read #=> ".." + */ +static VALUE +dir_set_pos(dir, pos) + VALUE dir, pos; +{ + dir_seek(dir, pos); + return pos; +} + +/* + * call-seq: + * dir.rewind => dir + * + * Repositions <em>dir</em> to the first entry. + * + * d = Dir.new("testdir") + * d.read #=> "." + * d.rewind #=> #<Dir:0x401b3fb0> + * d.read #=> "." + */ +static VALUE +dir_rewind(dir) + VALUE dir; +{ + struct dir_data *dirp; + + if (rb_safe_level() >= 4 && !OBJ_TAINTED(dir)) { + rb_raise(rb_eSecurityError, "Insecure: can't close"); + } + GetDIR(dir, dirp); + rewinddir(dirp->dir); + return dir; +} + +/* + * call-seq: + * dir.close => nil + * + * Closes the directory stream. Any further attempts to access + * <em>dir</em> will raise an <code>IOError</code>. + * + * d = Dir.new("testdir") + * d.close #=> nil + */ +static VALUE +dir_close(dir) + VALUE dir; +{ + struct dir_data *dirp; + + GetDIR(dir, dirp); + closedir(dirp->dir); + dirp->dir = NULL; + + return Qnil; +} + +static void +dir_chdir(path) + VALUE path; +{ + if (chdir(RSTRING(path)->ptr) < 0) + rb_sys_fail(RSTRING(path)->ptr); +} + +static int chdir_blocking = 0; +static VALUE chdir_thread = Qnil; + +struct chdir_data { + VALUE old_path, new_path; + int done; +}; + +static VALUE +chdir_yield(args) + struct chdir_data *args; +{ + dir_chdir(args->new_path); + args->done = Qtrue; + chdir_blocking++; + if (chdir_thread == Qnil) + chdir_thread = rb_thread_current(); + return rb_yield(args->new_path); +} + +static VALUE +chdir_restore(args) + struct chdir_data *args; +{ + if (args->done) { + chdir_blocking--; + if (chdir_blocking == 0) + chdir_thread = Qnil; + dir_chdir(args->old_path); + } + return Qnil; +} + +/* + * call-seq: + * Dir.chdir( [ string] ) => 0 + * Dir.chdir( [ string] ) {| path | block } => anObject + * + * Changes the current working directory of the process to the given + * string. When called without an argument, changes the directory to + * the value of the environment variable <code>HOME</code>, or + * <code>LOGDIR</code>. <code>SystemCallError</code> (probably + * <code>Errno::ENOENT</code>) if the target directory does not exist. + * + * If a block is given, it is passed the name of the new current + * directory, and the block is executed with that as the current + * directory. The original working directory is restored when the block + * exits. The return value of <code>chdir</code> is the value of the + * block. <code>chdir</code> blocks can be nested, but in a + * multi-threaded program an error will be raised if a thread attempts + * to open a <code>chdir</code> block while another thread has one + * open. + * + * Dir.chdir("/var/spool/mail") + * puts Dir.pwd + * Dir.chdir("/tmp") do + * puts Dir.pwd + * Dir.chdir("/usr") do + * puts Dir.pwd + * end + * puts Dir.pwd + * end + * puts Dir.pwd + * + * <em>produces:</em> + * + * /var/spool/mail + * /tmp + * /usr + * /tmp + * /var/spool/mail + */ +static VALUE +dir_s_chdir(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE path = Qnil; + + rb_secure(2); + if (rb_scan_args(argc, argv, "01", &path) == 1) { + SafeStringValue(path); + } + else { + const char *dist = getenv("HOME"); + if (!dist) { + dist = getenv("LOGDIR"); + if (!dist) rb_raise(rb_eArgError, "HOME/LOGDIR not set"); + } + path = rb_str_new2(dist); + } + + if (chdir_blocking > 0) { + if (!rb_block_given_p() || rb_thread_current() != chdir_thread) + rb_warn("conflicting chdir during another chdir block"); + } + + if (rb_block_given_p()) { + struct chdir_data args; + char *cwd = my_getcwd(); + + args.old_path = rb_tainted_str_new2(cwd); free(cwd); + args.new_path = path; + args.done = Qfalse; + return rb_ensure(chdir_yield, (VALUE)&args, chdir_restore, (VALUE)&args); + } + dir_chdir(path); + + return INT2FIX(0); +} + +/* + * call-seq: + * Dir.getwd => string + * Dir.pwd => string + * + * Returns the path to the current working directory of this process as + * a string. + * + * Dir.chdir("/tmp") #=> 0 + * Dir.getwd #=> "/tmp" + */ +static VALUE +dir_s_getwd(dir) + VALUE dir; +{ + char *path; + VALUE cwd; + + rb_secure(4); + path = my_getcwd(); + cwd = rb_tainted_str_new2(path); + + free(path); + return cwd; +} + +static void check_dirname _((volatile VALUE *)); +static void +check_dirname(dir) + volatile VALUE *dir; +{ + char *path, *pend; + + SafeStringValue(*dir); + rb_secure(2); + path = RSTRING(*dir)->ptr; + if (path && *(pend = rb_path_end(rb_path_skip_prefix(path)))) { + *dir = rb_str_new(path, pend - path); + } +} + +/* + * call-seq: + * Dir.chroot( string ) => 0 + * + * Changes this process's idea of the file system root. Only a + * privileged process may make this call. Not available on all + * platforms. On Unix systems, see <code>chroot(2)</code> for more + * information. + */ +static VALUE +dir_s_chroot(dir, path) + VALUE dir, path; +{ +#if defined(HAVE_CHROOT) && !defined(__CHECKER__) + check_dirname(&path); + + if (chroot(RSTRING(path)->ptr) == -1) + rb_sys_fail(RSTRING(path)->ptr); + + return INT2FIX(0); +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + +/* + * call-seq: + * Dir.mkdir( string [, integer] ) => 0 + * + * Makes a new directory named by <i>string</i>, with permissions + * specified by the optional parameter <i>anInteger</i>. The + * permissions may be modified by the value of + * <code>File::umask</code>, and are ignored on NT. Raises a + * <code>SystemCallError</code> if the directory cannot be created. See + * also the discussion of permissions in the class documentation for + * <code>File</code>. + * + */ +static VALUE +dir_s_mkdir(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE path, vmode; + int mode; + + if (rb_scan_args(argc, argv, "11", &path, &vmode) == 2) { + mode = NUM2INT(vmode); + } + else { + mode = 0777; + } + + check_dirname(&path); + if (mkdir(RSTRING(path)->ptr, mode) == -1) + rb_sys_fail(RSTRING(path)->ptr); + + return INT2FIX(0); +} + +/* + * call-seq: + * Dir.delete( string ) => 0 + * Dir.rmdir( string ) => 0 + * Dir.unlink( string ) => 0 + * + * Deletes the named directory. Raises a subclass of + * <code>SystemCallError</code> if the directory isn't empty. + */ +static VALUE +dir_s_rmdir(obj, dir) + VALUE obj, dir; +{ + check_dirname(&dir); + if (rmdir(RSTRING(dir)->ptr) < 0) + rb_sys_fail(RSTRING(dir)->ptr); + + return INT2FIX(0); +} + +static void +sys_warning_1(mesg) + const char* mesg; +{ + rb_sys_warning("%s", mesg); +} + +#define GLOB_VERBOSE (1UL << (sizeof(int) * CHAR_BIT - 1)) +#define sys_warning(val) \ + (void)((flags & GLOB_VERBOSE) && rb_protect((VALUE (*)_((VALUE)))sys_warning_1, (VALUE)(val), 0)) + +#define GLOB_ALLOC(type) (type *)malloc(sizeof(type)) +#define GLOB_ALLOC_N(type, n) (type *)malloc(sizeof(type) * (n)) +#define GLOB_JUMP_TAG(status) ((status == -1) ? rb_memerror() : rb_jump_tag(status)) + +/* + * ENOTDIR can be returned by stat(2) if a non-leaf element of the path + * is not a directory. + */ +#define to_be_ignored(e) ((e) == ENOENT || (e) == ENOTDIR) + +/* System call with warning */ +static int +do_stat(const char *path, struct stat *pst, int flags) + +{ + int ret = stat(path, pst); + if (ret < 0 && !to_be_ignored(errno)) + sys_warning(path); + + return ret; +} + +static int +do_lstat(const char *path, struct stat *pst, int flags) +{ + int ret = lstat(path, pst); + if (ret < 0 && !to_be_ignored(errno)) + sys_warning(path); + + return ret; +} + +static DIR * +do_opendir(const char *path, int flags) +{ + DIR *dirp = opendir(path); + if (dirp == NULL && !to_be_ignored(errno)) + sys_warning(path); + + return dirp; +} + +/* Return nonzero if S has any special globbing chars in it. */ +static int +has_magic(s, flags) + const char *s; + int flags; +{ + const int escape = !(flags & FNM_NOESCAPE); + const int nocase = flags & FNM_CASEFOLD; + + register const char *p = s; + register char c; + + while (c = *p++) { + switch (c) { + case '*': + case '?': + case '[': + return 1; + + case '\\': + if (escape && !(c = *p++)) + return 0; + continue; + + default: + if (!FNM_SYSCASE && ISALPHA(c) && nocase) + return 1; + } + + p = Next(p-1); + } + + return 0; +} + +/* Find separator in globbing pattern. */ +static char * +find_dirsep(const char *s, int flags) +{ + const int escape = !(flags & FNM_NOESCAPE); + + register const char *p = s; + register char c; + int open = 0; + + while (c = *p++) { + switch (c) { + case '[': + open = 1; + continue; + case ']': + open = 0; + continue; + + case '/': + if (!open) + return (char *)p-1; + continue; + + case '\\': + if (escape && !(c = *p++)) + return (char *)p-1; + continue; + } + + p = Next(p-1); + } + + return (char *)p-1; +} + +/* Remove escaping backslashes */ +static void +remove_backslashes(p) + char *p; +{ + char *t = p; + char *s = p; + + while (*p) { + if (*p == '\\') { + if (t != s) + memmove(t, s, p - s); + t += p - s; + s = ++p; + if (!*p) break; + } + Inc(p); + } + + while (*p++); + + if (t != s) + memmove(t, s, p - s); /* move '\0' too */ +} + +/* Globing pattern */ +enum glob_pattern_type { PLAIN, MAGICAL, RECURSIVE, MATCH_ALL, MATCH_DIR }; + +struct glob_pattern { + char *str; + enum glob_pattern_type type; + struct glob_pattern *next; +}; + +static void glob_free_pattern(struct glob_pattern *list); + +static struct glob_pattern * +glob_make_pattern(const char *p, int flags) +{ + struct glob_pattern *list, *tmp, **tail = &list; + int dirsep = 0; /* pattern is terminated with '/' */ + + while (*p) { + tmp = GLOB_ALLOC(struct glob_pattern); + if (!tmp) goto error; + if (p[0] == '*' && p[1] == '*' && p[2] == '/') { + /* fold continuous RECURSIVEs (needed in glob_helper) */ + do { p += 3; } while (p[0] == '*' && p[1] == '*' && p[2] == '/'); + tmp->type = RECURSIVE; + tmp->str = 0; + dirsep = 1; + } + else { + const char *m = find_dirsep(p, flags); + char *buf = GLOB_ALLOC_N(char, m-p+1); + if (!buf) { + free(tmp); + goto error; + } + memcpy(buf, p, m-p); + buf[m-p] = '\0'; + tmp->type = has_magic(buf, flags) ? MAGICAL : PLAIN; + tmp->str = buf; + if (*m) { + dirsep = 1; + p = m + 1; + } + else { + dirsep = 0; + p = m; + } + } + *tail = tmp; + tail = &tmp->next; + } + + tmp = GLOB_ALLOC(struct glob_pattern); + if (!tmp) { + error: + *tail = 0; + glob_free_pattern(list); + return 0; + } + tmp->type = dirsep ? MATCH_DIR : MATCH_ALL; + tmp->str = 0; + *tail = tmp; + tmp->next = 0; + + return list; +} + +static void +glob_free_pattern(struct glob_pattern *list) +{ + while (list) { + struct glob_pattern *tmp = list; + list = list->next; + if (tmp->str) + free(tmp->str); + free(tmp); + } +} + +static char * +join_path(const char *path, int dirsep, const char *name) +{ + long len = strlen(path); + char *buf = GLOB_ALLOC_N(char, len+strlen(name)+(dirsep?1:0)+1); + + if (!buf) return 0; + memcpy(buf, path, len); + if (dirsep) { + strcpy(buf+len, "/"); + len++; + } + strcpy(buf+len, name); + return buf; +} + +enum answer { YES, NO, UNKNOWN }; + +#ifndef S_ISLNK +# ifndef S_IFLNK +# define S_ISLNK(m) (0) +# else +# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK) +# endif +#endif + +#ifndef S_ISDIR +# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) +#endif + +struct glob_args { + void (*func) _((const char*, VALUE)); + const char *c; + VALUE v; +}; + +static VALUE glob_func_caller _((VALUE)); + +static VALUE +glob_func_caller(val) + VALUE val; +{ + struct glob_args *args = (struct glob_args *)val; + + (*args->func)(args->c, args->v); + return Qnil; +} + +#define glob_call_func(func, path, arg) (*func)(path, arg) + +static int glob_helper _((const char *, int, enum answer, enum answer, struct glob_pattern **, struct glob_pattern **, int, ruby_glob_func *, VALUE)); + +static int +glob_helper(path, dirsep, exist, isdir, beg, end, flags, func, arg) + const char *path; + int dirsep; /* '/' should be placed before appending child entry's name to 'path'. */ + enum answer exist; /* Does 'path' indicate an existing entry? */ + enum answer isdir; /* Does 'path' indicate a directory or a symlink to a directory? */ + struct glob_pattern **beg; + struct glob_pattern **end; + int flags; + ruby_glob_func *func; + VALUE arg; +{ + struct stat st; + int status = 0; + struct glob_pattern **cur, **new_beg, **new_end; + int plain = 0, magical = 0, recursive = 0, match_all = 0, match_dir = 0; + int escape = !(flags & FNM_NOESCAPE); + + for (cur = beg; cur < end; ++cur) { + struct glob_pattern *p = *cur; + if (p->type == RECURSIVE) { + recursive = 1; + p = p->next; + } + switch (p->type) { + case PLAIN: + plain = 1; + break; + case MAGICAL: + magical = 1; + break; + case MATCH_ALL: + match_all = 1; + break; + case MATCH_DIR: + match_dir = 1; + break; + case RECURSIVE: + rb_bug("continuous RECURSIVEs"); + } + } + + if (*path) { + if (match_all && exist == UNKNOWN) { + if (do_lstat(path, &st, flags) == 0) { + exist = YES; + isdir = S_ISDIR(st.st_mode) ? YES : S_ISLNK(st.st_mode) ? UNKNOWN : NO; + } + else { + exist = NO; + isdir = NO; + } + } + if (match_dir && isdir == UNKNOWN) { + if (do_stat(path, &st, flags) == 0) { + exist = YES; + isdir = S_ISDIR(st.st_mode) ? YES : NO; + } + else { + exist = NO; + isdir = NO; + } + } + if (match_all && exist == YES) { + status = glob_call_func(func, path, arg); + if (status) return status; + } + if (match_dir && isdir == YES) { + char *tmp = join_path(path, dirsep, ""); + if (!tmp) return -1; + status = glob_call_func(func, tmp, arg); + free(tmp); + if (status) return status; + } + } + + if (exist == NO || isdir == NO) return 0; + + if (magical || recursive) { + struct dirent *dp; + DIR *dirp = do_opendir(*path ? path : ".", flags); + if (dirp == NULL) return 0; + + for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + char *buf = join_path(path, dirsep, dp->d_name); + enum answer new_isdir = UNKNOWN; + + if (!buf) { + status = -1; + break; + } + if (recursive && strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0 + && fnmatch("*", dp->d_name, flags) == 0) { +#ifndef _WIN32 + if (do_lstat(buf, &st, flags) == 0) + new_isdir = S_ISDIR(st.st_mode) ? YES : S_ISLNK(st.st_mode) ? UNKNOWN : NO; + else + new_isdir = NO; +#else + new_isdir = dp->d_isdir ? (!dp->d_isrep ? YES : UNKNOWN) : NO; +#endif + } + + new_beg = new_end = GLOB_ALLOC_N(struct glob_pattern *, (end - beg) * 2); + if (!new_beg) { + status = -1; + break; + } + + for (cur = beg; cur < end; ++cur) { + struct glob_pattern *p = *cur; + if (p->type == RECURSIVE) { + if (new_isdir == YES) /* not symlink but real directory */ + *new_end++ = p; /* append recursive pattern */ + p = p->next; /* 0 times recursion */ + } + if (p->type == PLAIN || p->type == MAGICAL) { + if (fnmatch(p->str, dp->d_name, flags) == 0) + *new_end++ = p->next; + } + } + + status = glob_helper(buf, 1, YES, new_isdir, new_beg, new_end, flags, func, arg); + free(buf); + free(new_beg); + if (status) break; + } + + closedir(dirp); + } + else if (plain) { + struct glob_pattern **copy_beg, **copy_end, **cur2; + + copy_beg = copy_end = GLOB_ALLOC_N(struct glob_pattern *, end - beg); + if (!copy_beg) return -1; + for (cur = beg; cur < end; ++cur) + *copy_end++ = (*cur)->type == PLAIN ? *cur : 0; + + for (cur = copy_beg; cur < copy_end; ++cur) { + if (*cur) { + char *buf; + char *name; + name = GLOB_ALLOC_N(char, strlen((*cur)->str) + 1); + if (!name) { + status = -1; + break; + } + strcpy(name, (*cur)->str); + if (escape) remove_backslashes(name); + + new_beg = new_end = GLOB_ALLOC_N(struct glob_pattern *, end - beg); + if (!new_beg) { + free(name); + status = -1; + break; + } + *new_end++ = (*cur)->next; + for (cur2 = cur + 1; cur2 < copy_end; ++cur2) { + if (*cur2 && fnmatch((*cur2)->str, name, flags) == 0) { + *new_end++ = (*cur2)->next; + *cur2 = 0; + } + } + + buf = join_path(path, dirsep, name); + free(name); + if (!buf) { + free(new_beg); + status = -1; + break; + } + status = glob_helper(buf, 1, UNKNOWN, UNKNOWN, new_beg, new_end, flags, func, arg); + free(buf); + free(new_beg); + if (status) break; + } + } + + free(copy_beg); + } + + return status; +} + +static int +ruby_glob0(path, flags, func, arg) + const char *path; + int flags; + ruby_glob_func *func; + VALUE arg; +{ + struct glob_pattern *list; + const char *root, *start; + char *buf; + int n; + int status; + + start = root = path; + flags |= FNM_SYSCASE; +#if defined DOSISH + root = rb_path_skip_prefix(root); +#endif + + if (root && *root == '/') root++; + + n = root - start; + buf = GLOB_ALLOC_N(char, n + 1); + if (!buf) return -1; + MEMCPY(buf, start, char, n); + buf[n] = '\0'; + + list = glob_make_pattern(root, flags); + if (!list) { + free(buf); + return -1; + } + status = glob_helper(buf, 0, UNKNOWN, UNKNOWN, &list, &list + 1, flags, func, arg); + glob_free_pattern(list); + free(buf); + + return status; +} + +int +ruby_glob(path, flags, func, arg) + const char *path; + int flags; + ruby_glob_func *func; + VALUE arg; +{ + return ruby_glob0(path, flags & ~GLOB_VERBOSE, func, arg); +} + +static int rb_glob_caller _((const char *, VALUE)); + +static int +rb_glob_caller(path, a) + const char *path; + VALUE a; +{ + int status; + struct glob_args *args = (struct glob_args *)a; + + args->c = path; + rb_protect(glob_func_caller, a, &status); + return status; +} + +static int +rb_glob2(path, flags, func, arg) + const char *path; + int flags; + void (*func) _((const char *, VALUE)); + VALUE arg; +{ + struct glob_args args; + + args.func = func; + args.v = arg; + + if (flags & FNM_SYSCASE) { + rb_warning("Dir.glob() ignores File::FNM_CASEFOLD"); + } + + return ruby_glob0(path, flags | GLOB_VERBOSE, rb_glob_caller, (VALUE)&args); +} + +void +rb_glob(path, func, arg) + const char *path; + void (*func) _((const char*, VALUE)); + VALUE arg; +{ + int status = rb_glob2(path, 0, func, arg); + if (status) GLOB_JUMP_TAG(status); +} + +static void push_pattern _((const char* path, VALUE ary)); +static void +push_pattern(path, ary) + const char *path; + VALUE ary; +{ + rb_ary_push(ary, rb_tainted_str_new2(path)); +} + +int +ruby_brace_expand(str, flags, func, arg) + const char *str; + int flags; + ruby_glob_func *func; + VALUE arg; +{ + const int escape = !(flags & FNM_NOESCAPE); + const char *p = str; + const char *s = p; + const char *lbrace = 0, *rbrace = 0; + int nest = 0, status = 0; + + while (*p) { + if (*p == '{' && nest++ == 0) { + lbrace = p; + } + if (*p == '}' && --nest <= 0) { + rbrace = p; + break; + } + if (*p == '\\' && escape) { + if (!*++p) break; + } + Inc(p); + } + + if (lbrace && rbrace) { + char *buf = GLOB_ALLOC_N(char, strlen(s) + 1); + long shift; + + if (!buf) return -1; + memcpy(buf, s, lbrace-s); + shift = (lbrace-s); + p = lbrace; + while (p < rbrace) { + const char *t = ++p; + nest = 0; + while (p < rbrace && !(*p == ',' && nest == 0)) { + if (*p == '{') nest++; + if (*p == '}') nest--; + if (*p == '\\' && escape) { + if (++p == rbrace) break; + } + Inc(p); + } + memcpy(buf+shift, t, p-t); + strcpy(buf+shift+(p-t), rbrace+1); + status = ruby_brace_expand(buf, flags, func, arg); + if (status) break; + } + free(buf); + } + else if (!lbrace && !rbrace) { + status = (*func)(s, arg); + } + + return status; +} + +struct brace_args { + ruby_glob_func *func; + VALUE value; + int flags; +}; + +static int glob_brace _((const char *, VALUE)); +static int +glob_brace(path, val) + const char *path; + VALUE val; +{ + struct brace_args *arg = (struct brace_args *)val; + + return ruby_glob0(path, arg->flags, arg->func, arg->value); +} + +static int +ruby_brace_glob0(str, flags, func, arg) + const char *str; + int flags; + ruby_glob_func *func; + VALUE arg; +{ + struct brace_args args; + + args.func = func; + args.value = arg; + args.flags = flags; + return ruby_brace_expand(str, flags, glob_brace, (VALUE)&args); +} + +int +ruby_brace_glob(str, flags, func, arg) + const char *str; + int flags; + ruby_glob_func *func; + VALUE arg; +{ + return ruby_brace_glob0(str, flags & ~GLOB_VERBOSE, func, arg); +} + +static int +push_glob(VALUE ary, const char *str, int flags) +{ + struct glob_args args; + + args.func = push_pattern; + args.v = ary; + return ruby_brace_glob0(str, flags | GLOB_VERBOSE, rb_glob_caller, (VALUE)&args); +} + +static VALUE +rb_push_glob(str, flags) /* '\0' is delimiter */ + VALUE str; + int flags; +{ + long offset = 0; + VALUE ary; + + ary = rb_ary_new(); + SafeStringValue(str); + + while (offset < RSTRING_LEN(str)) { + int status = push_glob(ary, RSTRING(str)->ptr + offset, flags); + char *p, *pend; + if (status) GLOB_JUMP_TAG(status); + if (offset >= RSTRING_LEN(str)) break; + p = RSTRING(str)->ptr + offset; + p += strlen(p) + 1; + pend = RSTRING(str)->ptr + RSTRING_LEN(str); + while (p < pend && !*p) + p++; + offset = p - RSTRING(str)->ptr; + } + + return ary; +} + +static VALUE +dir_globs(argc, argv, flags) + long argc; + VALUE *argv; + int flags; +{ + VALUE ary = rb_ary_new(); + long i; + + for (i = 0; i < argc; ++i) { + int status; + VALUE str = argv[i]; + SafeStringValue(str); + status = push_glob(ary, RSTRING(str)->ptr, flags); + if (status) GLOB_JUMP_TAG(status); + } + + return ary; +} + +/* + * call-seq: + * Dir[ array ] => array + * Dir[ string [, string ...] ] => array + * + * Equivalent to calling + * <code>Dir.glob(</code><i>array,</i><code>0)</code> and + * <code>Dir.glob([</code><i>string,...</i><code>],0)</code>. + * + */ +static VALUE +dir_s_aref(int argc, VALUE *argv, VALUE obj) + { + if (argc == 1) { + return rb_push_glob(argv[0], 0); + } + return dir_globs(argc, argv, 0); + } + +/* + * call-seq: + * Dir.glob( pattern, [flags] ) => array + * Dir.glob( pattern, [flags] ) {| filename | block } => nil + * + * Returns the filenames found by expanding <i>pattern</i> which is + * an +Array+ of the patterns or the pattern +String+, either as an + * <i>array</i> or as parameters to the block. Note that this pattern + * is not a regexp (it's closer to a shell glob). See + * <code>File::fnmatch</code> for the meaning of the <i>flags</i> + * parameter. Note that case sensitivity depends on your system (so + * <code>File::FNM_CASEFOLD</code> is ignored) + * + * <code>*</code>:: Matches any file. Can be restricted by + * other values in the glob. <code>*</code> + * will match all files; <code>c*</code> will + * match all files beginning with + * <code>c</code>; <code>*c</code> will match + * all files ending with <code>c</code>; and + * <code>*c*</code> will match all files that + * have <code>c</code> in them (including at + * the beginning or end). Equivalent to + * <code>/ .* /x</code> in regexp. + * <code>**</code>:: Matches directories recursively. + * <code>?</code>:: Matches any one character. Equivalent to + * <code>/.{1}/</code> in regexp. + * <code>[set]</code>:: Matches any one character in +set+. + * Behaves exactly like character sets in + * Regexp, including set negation + * (<code>[^a-z]</code>). + * <code>{p,q}</code>:: Matches either literal <code>p</code> or + * literal <code>q</code>. Matching literals + * may be more than one character in length. + * More than two literals may be specified. + * Equivalent to pattern alternation in + * regexp. + * <code>\</code>:: Escapes the next metacharacter. + * + * Dir["config.?"] #=> ["config.h"] + * Dir.glob("config.?") #=> ["config.h"] + * Dir.glob("*.[a-z][a-z]") #=> ["main.rb"] + * Dir.glob("*.[^r]*") #=> ["config.h"] + * Dir.glob("*.{rb,h}") #=> ["main.rb", "config.h"] + * Dir.glob("*") #=> ["config.h", "main.rb"] + * Dir.glob("*", File::FNM_DOTMATCH) #=> [".", "..", "config.h", "main.rb"] + * + * rbfiles = File.join("**", "*.rb") + * Dir.glob(rbfiles) #=> ["main.rb", + * "lib/song.rb", + * "lib/song/karaoke.rb"] + * libdirs = File.join("**", "lib") + * Dir.glob(libdirs) #=> ["lib"] + * + * librbfiles = File.join("**", "lib", "**", "*.rb") + * Dir.glob(librbfiles) #=> ["lib/song.rb", + * "lib/song/karaoke.rb"] + * + * librbfiles = File.join("**", "lib", "*.rb") + * Dir.glob(librbfiles) #=> ["lib/song.rb"] + */ +static VALUE +dir_s_glob(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE str, rflags, ary; + int flags; + + if (rb_scan_args(argc, argv, "11", &str, &rflags) == 2) + flags = NUM2INT(rflags); + else + flags = 0; + + ary = rb_check_array_type(str); + if (NIL_P(ary)) { + ary = rb_push_glob(str, flags); + } + else { + volatile VALUE v = ary; + ary = dir_globs(RARRAY_LEN(v), RARRAY_PTR(v), flags); + } + + if (rb_block_given_p()) { + rb_ary_each(ary); + return Qnil; + } + return ary; +} + +static VALUE +dir_open_dir(path) + VALUE path; +{ + VALUE dir = rb_funcall(rb_cDir, rb_intern("open"), 1, path); + + if (TYPE(dir) != T_DATA || + RDATA(dir)->dfree != (RUBY_DATA_FUNC)free_dir) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Dir)", + rb_obj_classname(dir)); + } + return dir; +} + + +/* + * call-seq: + * Dir.foreach( dirname ) {| filename | block } => nil + * + * Calls the block once for each entry in the named directory, passing + * the filename of each entry as a parameter to the block. + * + * Dir.foreach("testdir") {|x| puts "Got #{x}" } + * + * <em>produces:</em> + * + * Got . + * Got .. + * Got config.h + * Got main.rb + * + */ +static VALUE +dir_foreach(io, dirname) + VALUE io, dirname; +{ + VALUE dir; + + dir = dir_open_dir(dirname); + rb_ensure(dir_each, dir, dir_close, dir); + return Qnil; +} + +/* + * call-seq: + * Dir.entries( dirname ) => array + * + * Returns an array containing all of the filenames in the given + * directory. Will raise a <code>SystemCallError</code> if the named + * directory doesn't exist. + * + * Dir.entries("testdir") #=> [".", "..", "config.h", "main.rb"] + * + */ +static VALUE +dir_entries(io, dirname) + VALUE io, dirname; +{ + VALUE dir; + + dir = dir_open_dir(dirname); + return rb_ensure(rb_Array, dir, dir_close, dir); +} + +/* + * call-seq: + * File.fnmatch( pattern, path, [flags] ) => (true or false) + * File.fnmatch?( pattern, path, [flags] ) => (true or false) + * + * Returns true if <i>path</i> matches against <i>pattern</i> The + * pattern is not a regular expression; instead it follows rules + * similar to shell filename globbing. It may contain the following + * metacharacters: + * + * <code>*</code>:: Matches any file. Can be restricted by + * other values in the glob. <code>*</code> + * will match all files; <code>c*</code> will + * match all files beginning with + * <code>c</code>; <code>*c</code> will match + * all files ending with <code>c</code>; and + * <code>*c*</code> will match all files that + * have <code>c</code> in them (including at + * the beginning or end). Equivalent to + * <code>/ .* /x</code> in regexp. + * <code>**</code>:: Matches directories recursively or files + * expansively. + * <code>?</code>:: Matches any one character. Equivalent to + * <code>/.{1}/</code> in regexp. + * <code>[set]</code>:: Matches any one character in +set+. + * Behaves exactly like character sets in + * Regexp, including set negation + * (<code>[^a-z]</code>). + * <code>\</code>:: Escapes the next metacharacter. + * + * <i>flags</i> is a bitwise OR of the <code>FNM_xxx</code> + * parameters. The same glob pattern and flags are used by + * <code>Dir::glob</code>. + * + * File.fnmatch('cat', 'cat') #=> true : match entire string + * File.fnmatch('cat', 'category') #=> false : only match partial string + * File.fnmatch('c{at,ub}s', 'cats') #=> false : { } isn't supported + * + * File.fnmatch('c?t', 'cat') #=> true : '?' match only 1 character + * File.fnmatch('c??t', 'cat') #=> false : ditto + * File.fnmatch('c*', 'cats') #=> true : '*' match 0 or more characters + * File.fnmatch('c*t', 'c/a/b/t') #=> true : ditto + * File.fnmatch('ca[a-z]', 'cat') #=> true : inclusive bracket expression + * File.fnmatch('ca[^t]', 'cat') #=> false : exclusive bracket expression ('^' or '!') + * + * File.fnmatch('cat', 'CAT') #=> false : case sensitive + * File.fnmatch('cat', 'CAT', File::FNM_CASEFOLD) #=> true : case insensitive + * + * File.fnmatch('?', '/', File::FNM_PATHNAME) #=> false : wildcard doesn't match '/' on FNM_PATHNAME + * File.fnmatch('*', '/', File::FNM_PATHNAME) #=> false : ditto + * File.fnmatch('[/]', '/', File::FNM_PATHNAME) #=> false : ditto + * + * File.fnmatch('\?', '?') #=> true : escaped wildcard becomes ordinary + * File.fnmatch('\a', 'a') #=> true : escaped ordinary remains ordinary + * File.fnmatch('\a', '\a', File::FNM_NOESCAPE) #=> true : FNM_NOESACPE makes '\' ordinary + * File.fnmatch('[\?]', '?') #=> true : can escape inside bracket expression + * + * File.fnmatch('*', '.profile') #=> false : wildcard doesn't match leading + * File.fnmatch('*', '.profile', File::FNM_DOTMATCH) #=> true period by default. + * File.fnmatch('.*', '.profile') #=> true + * + * rbfiles = '**' '/' '*.rb' # you don't have to do like this. just write in single string. + * File.fnmatch(rbfiles, 'main.rb') #=> false + * File.fnmatch(rbfiles, './main.rb') #=> false + * File.fnmatch(rbfiles, 'lib/song.rb') #=> true + * File.fnmatch('**.rb', 'main.rb') #=> true + * File.fnmatch('**.rb', './main.rb') #=> false + * File.fnmatch('**.rb', 'lib/song.rb') #=> true + * File.fnmatch('*', 'dave/.profile') #=> true + * + * pattern = '*' '/' '*' + * File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME) #=> false + * File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true + * + * pattern = '**' '/' 'foo' + * File.fnmatch(pattern, 'a/b/c/foo', File::FNM_PATHNAME) #=> true + * File.fnmatch(pattern, '/a/b/c/foo', File::FNM_PATHNAME) #=> true + * File.fnmatch(pattern, 'c:/a/b/c/foo', File::FNM_PATHNAME) #=> true + * File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME) #=> false + * File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true + */ +static VALUE +file_s_fnmatch(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE pattern, path; + VALUE rflags; + int flags; + + if (rb_scan_args(argc, argv, "21", &pattern, &path, &rflags) == 3) + flags = NUM2INT(rflags); + else + flags = 0; + + StringValue(pattern); + StringValue(path); + + if (fnmatch(RSTRING(pattern)->ptr, RSTRING(path)->ptr, flags) == 0) + return Qtrue; + + return Qfalse; +} + +/* + * Objects of class <code>Dir</code> are directory streams representing + * directories in the underlying file system. They provide a variety of + * ways to list directories and their contents. See also + * <code>File</code>. + * + * The directory used in these examples contains the two regular files + * (<code>config.h</code> and <code>main.rb</code>), the parent + * directory (<code>..</code>), and the directory itself + * (<code>.</code>). + */ +void +Init_Dir() +{ + rb_cDir = rb_define_class("Dir", rb_cObject); + + rb_include_module(rb_cDir, rb_mEnumerable); + + rb_define_alloc_func(rb_cDir, dir_s_alloc); + rb_define_singleton_method(rb_cDir, "open", dir_s_open, 1); + rb_define_singleton_method(rb_cDir, "foreach", dir_foreach, 1); + rb_define_singleton_method(rb_cDir, "entries", dir_entries, 1); + + rb_define_method(rb_cDir,"initialize", dir_initialize, 1); + rb_define_method(rb_cDir,"path", dir_path, 0); + rb_define_method(rb_cDir,"read", dir_read, 0); + rb_define_method(rb_cDir,"each", dir_each, 0); + rb_define_method(rb_cDir,"rewind", dir_rewind, 0); + rb_define_method(rb_cDir,"tell", dir_tell, 0); + rb_define_method(rb_cDir,"seek", dir_seek, 1); + rb_define_method(rb_cDir,"pos", dir_tell, 0); + rb_define_method(rb_cDir,"pos=", dir_set_pos, 1); + rb_define_method(rb_cDir,"close", dir_close, 0); + + rb_define_singleton_method(rb_cDir,"chdir", dir_s_chdir, -1); + rb_define_singleton_method(rb_cDir,"getwd", dir_s_getwd, 0); + rb_define_singleton_method(rb_cDir,"pwd", dir_s_getwd, 0); + rb_define_singleton_method(rb_cDir,"chroot", dir_s_chroot, 1); + rb_define_singleton_method(rb_cDir,"mkdir", dir_s_mkdir, -1); + rb_define_singleton_method(rb_cDir,"rmdir", dir_s_rmdir, 1); + rb_define_singleton_method(rb_cDir,"delete", dir_s_rmdir, 1); + rb_define_singleton_method(rb_cDir,"unlink", dir_s_rmdir, 1); + + rb_define_singleton_method(rb_cDir,"glob", dir_s_glob, -1); + rb_define_singleton_method(rb_cDir,"[]", dir_s_aref, -1); + + rb_define_singleton_method(rb_cFile,"fnmatch", file_s_fnmatch, -1); + rb_define_singleton_method(rb_cFile,"fnmatch?", file_s_fnmatch, -1); + + rb_file_const("FNM_NOESCAPE", INT2FIX(FNM_NOESCAPE)); + rb_file_const("FNM_PATHNAME", INT2FIX(FNM_PATHNAME)); + rb_file_const("FNM_DOTMATCH", INT2FIX(FNM_DOTMATCH)); + rb_file_const("FNM_CASEFOLD", INT2FIX(FNM_CASEFOLD)); + rb_file_const("FNM_SYSCASE", INT2FIX(FNM_SYSCASE)); +} +/********************************************************************** + + dln.c - + + $Author: shyouhei $ + $Date: 2008-06-15 15:25:08 +0200 (Sun, 15 Jun 2008) $ + created at: Tue Jan 18 17:05:06 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "dln.h" + +#ifdef HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#ifdef __CHECKER__ +#undef HAVE_DLOPEN +#undef USE_DLN_A_OUT +#undef USE_DLN_DLOPEN +#endif + +#ifdef USE_DLN_A_OUT +char *dln_argv0; +#endif + +#if defined(HAVE_ALLOCA_H) +#include <alloca.h> +#endif + +#ifdef HAVE_STRING_H +# include <string.h> +#else +# include <strings.h> +#endif + +#ifndef xmalloc +void *xmalloc(); +void *xcalloc(); +void *xrealloc(); +#endif + +#include <stdio.h> +#if defined(_WIN32) || defined(__VMS) +#include "missing/file.h" +#endif +#include <sys/types.h> +#include <sys/stat.h> + +#ifndef S_ISDIR +# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) +#endif + +#ifdef HAVE_SYS_PARAM_H +# include <sys/param.h> +#endif +#ifndef MAXPATHLEN +# define MAXPATHLEN 1024 +#endif + +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif + +#ifndef _WIN32 +char *getenv(); +#endif + +#if defined(__VMS) +#pragma builtins +#include <dlfcn.h> +#endif + +#ifdef __MACOS__ +# include <TextUtils.h> +# include <CodeFragments.h> +# include <Aliases.h> +# include "macruby_private.h" +#endif + +#ifdef __BEOS__ +# include <image.h> +#endif + +#ifndef NO_DLN_LOAD + +#if defined(HAVE_DLOPEN) && !defined(USE_DLN_A_OUT) && !defined(_AIX) && !defined(__APPLE__) && !defined(_UNICOSMP) +/* dynamic load with dlopen() */ +# define USE_DLN_DLOPEN +#endif + +#ifndef FUNCNAME_PATTERN +# if defined(__hp9000s300) || (defined(__NetBSD__) && !defined(__ELF__)) || defined(__BORLANDC__) || (defined(__FreeBSD__) && !defined(__ELF__)) || (defined(__OpenBSD__) && !defined(__ELF__)) || defined(NeXT) || defined(__WATCOMC__) || defined(__APPLE__) +# define FUNCNAME_PATTERN "_Init_%s" +# else +# define FUNCNAME_PATTERN "Init_%s" +# endif +#endif + +static int +init_funcname_len(buf, file) + char **buf; + const char *file; +{ + char *p; + const char *slash; + int len; + + /* Load the file as an object one */ + for (slash = file-1; *file; file++) /* Find position of last '/' */ +#ifdef __MACOS__ + if (*file == ':') slash = file; +#else + if (*file == '/') slash = file; +#endif + + len = strlen(FUNCNAME_PATTERN) + strlen(slash + 1); + *buf = xmalloc(len); + snprintf(*buf, len, FUNCNAME_PATTERN, slash + 1); + for (p = *buf; *p; p++) { /* Delete suffix if it exists */ + if (*p == '.') { + *p = '\0'; break; + } + } + return p - *buf; +} + +#define init_funcname(buf, file) do {\ + int len = init_funcname_len(buf, file);\ + char *tmp = ALLOCA_N(char, len+1);\ + if (!tmp) {\ + free(*buf);\ + rb_memerror();\ + }\ + strcpy(tmp, *buf);\ + free(*buf);\ + *buf = tmp;\ +} while (0) + +#ifdef USE_DLN_A_OUT + +#ifndef LIBC_NAME +# define LIBC_NAME "libc.a" +#endif + +#ifndef DLN_DEFAULT_LIB_PATH +# define DLN_DEFAULT_LIB_PATH "/lib:/usr/lib:/usr/local/lib:." +#endif + +#include <errno.h> + +static int dln_errno; + +#define DLN_ENOEXEC ENOEXEC /* Exec format error */ +#define DLN_ECONFL 1201 /* Symbol name conflict */ +#define DLN_ENOINIT 1202 /* No initializer given */ +#define DLN_EUNDEF 1203 /* Undefine symbol remains */ +#define DLN_ENOTLIB 1204 /* Not a library file */ +#define DLN_EBADLIB 1205 /* Malformed library file */ +#define DLN_EINIT 1206 /* Not initialized */ + +static int dln_init_p = 0; + +#include <ar.h> +#include <a.out.h> +#ifndef N_COMM +# define N_COMM 0x12 +#endif +#ifndef N_MAGIC +# define N_MAGIC(x) (x).a_magic +#endif + +#define INVALID_OBJECT(h) (N_MAGIC(h) != OMAGIC) + +#include "util.h" +#include "st.h" + +static st_table *sym_tbl; +static st_table *undef_tbl; + +static int load_lib(); + +static int +load_header(fd, hdrp, disp) + int fd; + struct exec *hdrp; + long disp; +{ + int size; + + lseek(fd, disp, 0); + size = read(fd, hdrp, sizeof(struct exec)); + if (size == -1) { + dln_errno = errno; + return -1; + } + if (size != sizeof(struct exec) || N_BADMAG(*hdrp)) { + dln_errno = DLN_ENOEXEC; + return -1; + } + return 0; +} + +#if defined(sequent) +#define RELOC_SYMBOL(r) ((r)->r_symbolnum) +#define RELOC_MEMORY_SUB_P(r) ((r)->r_bsr) +#define RELOC_PCREL_P(r) ((r)->r_pcrel || (r)->r_bsr) +#define RELOC_TARGET_SIZE(r) ((r)->r_length) +#endif + +/* Default macros */ +#ifndef RELOC_ADDRESS +#define RELOC_ADDRESS(r) ((r)->r_address) +#define RELOC_EXTERN_P(r) ((r)->r_extern) +#define RELOC_SYMBOL(r) ((r)->r_symbolnum) +#define RELOC_MEMORY_SUB_P(r) 0 +#define RELOC_PCREL_P(r) ((r)->r_pcrel) +#define RELOC_TARGET_SIZE(r) ((r)->r_length) +#endif + +#if defined(sun) && defined(sparc) +/* Sparc (Sun 4) macros */ +# undef relocation_info +# define relocation_info reloc_info_sparc +# define R_RIGHTSHIFT(r) (reloc_r_rightshift[(r)->r_type]) +# define R_BITSIZE(r) (reloc_r_bitsize[(r)->r_type]) +# define R_LENGTH(r) (reloc_r_length[(r)->r_type]) +static int reloc_r_rightshift[] = { + 0, 0, 0, 0, 0, 0, 2, 2, 10, 0, 0, 0, 0, 0, 0, +}; +static int reloc_r_bitsize[] = { + 8, 16, 32, 8, 16, 32, 30, 22, 22, 22, 13, 10, 32, 32, 16, +}; +static int reloc_r_length[] = { + 0, 1, 2, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +}; +# define R_PCREL(r) \ + ((r)->r_type >= RELOC_DISP8 && (r)->r_type <= RELOC_WDISP22) +# define R_SYMBOL(r) ((r)->r_index) +#endif + +#if defined(sequent) +#define R_SYMBOL(r) ((r)->r_symbolnum) +#define R_MEMORY_SUB(r) ((r)->r_bsr) +#define R_PCREL(r) ((r)->r_pcrel || (r)->r_bsr) +#define R_LENGTH(r) ((r)->r_length) +#endif + +#ifndef R_SYMBOL +# define R_SYMBOL(r) ((r)->r_symbolnum) +# define R_MEMORY_SUB(r) 0 +# define R_PCREL(r) ((r)->r_pcrel) +# define R_LENGTH(r) ((r)->r_length) +#endif + +static struct relocation_info * +load_reloc(fd, hdrp, disp) + int fd; + struct exec *hdrp; + long disp; +{ + struct relocation_info *reloc; + int size; + + lseek(fd, disp + N_TXTOFF(*hdrp) + hdrp->a_text + hdrp->a_data, 0); + size = hdrp->a_trsize + hdrp->a_drsize; + reloc = (struct relocation_info*)xmalloc(size); + if (reloc == NULL) { + dln_errno = errno; + return NULL; + } + + if (read(fd, reloc, size) != size) { + dln_errno = errno; + free(reloc); + return NULL; + } + + return reloc; +} + +static struct nlist * +load_sym(fd, hdrp, disp) + int fd; + struct exec *hdrp; + long disp; +{ + struct nlist * buffer; + struct nlist * sym; + struct nlist * end; + long displ; + int size; + + lseek(fd, N_SYMOFF(*hdrp) + hdrp->a_syms + disp, 0); + if (read(fd, &size, sizeof(int)) != sizeof(int)) { + goto err_noexec; + } + + buffer = (struct nlist*)xmalloc(hdrp->a_syms + size); + if (buffer == NULL) { + dln_errno = errno; + return NULL; + } + + lseek(fd, disp + N_SYMOFF(*hdrp), 0); + if (read(fd, buffer, hdrp->a_syms + size) != hdrp->a_syms + size) { + free(buffer); + goto err_noexec; + } + + sym = buffer; + end = sym + hdrp->a_syms / sizeof(struct nlist); + displ = (long)buffer + (long)(hdrp->a_syms); + + while (sym < end) { + sym->n_un.n_name = (char*)sym->n_un.n_strx + displ; + sym++; + } + return buffer; + + err_noexec: + dln_errno = DLN_ENOEXEC; + return NULL; +} + +static st_table * +sym_hash(hdrp, syms) + struct exec *hdrp; + struct nlist *syms; +{ + st_table *tbl; + struct nlist *sym = syms; + struct nlist *end = syms + (hdrp->a_syms / sizeof(struct nlist)); + + tbl = st_init_strtable(); + if (tbl == NULL) { + dln_errno = errno; + return NULL; + } + + while (sym < end) { + st_insert(tbl, sym->n_un.n_name, sym); + sym++; + } + return tbl; +} + +static int +dln_init(prog) + const char *prog; +{ + char *file; + int fd; + struct exec hdr; + struct nlist *syms; + + if (dln_init_p == 1) return 0; + + file = dln_find_exe(prog, NULL); + if (file == NULL || (fd = open(file, O_RDONLY)) < 0) { + dln_errno = errno; + return -1; + } + + if (load_header(fd, &hdr, 0) == -1) return -1; + syms = load_sym(fd, &hdr, 0); + if (syms == NULL) { + close(fd); + return -1; + } + sym_tbl = sym_hash(&hdr, syms); + if (sym_tbl == NULL) { /* file may be start with #! */ + char c = '\0'; + char buf[MAXPATHLEN]; + char *p; + + free(syms); + lseek(fd, 0L, 0); + if (read(fd, &c, 1) == -1) { + dln_errno = errno; + return -1; + } + if (c != '#') goto err_noexec; + if (read(fd, &c, 1) == -1) { + dln_errno = errno; + return -1; + } + if (c != '!') goto err_noexec; + + p = buf; + /* skip forwarding spaces */ + while (read(fd, &c, 1) == 1) { + if (c == '\n') goto err_noexec; + if (c != '\t' && c != ' ') { + *p++ = c; + break; + } + } + /* read in command name */ + while (read(fd, p, 1) == 1) { + if (*p == '\n' || *p == '\t' || *p == ' ') break; + p++; + if (p-buf >= MAXPATHLEN) { + dln_errno = ENAMETOOLONG; + return -1; + } + } + *p = '\0'; + + return dln_init(buf); + } + dln_init_p = 1; + undef_tbl = st_init_strtable(); + close(fd); + return 0; + + err_noexec: + close(fd); + dln_errno = DLN_ENOEXEC; + return -1; +} + +static long +load_text_data(fd, hdrp, bss, disp) + int fd; + struct exec *hdrp; + int bss; + long disp; +{ + int size; + unsigned char* addr; + + lseek(fd, disp + N_TXTOFF(*hdrp), 0); + size = hdrp->a_text + hdrp->a_data; + + if (bss == -1) size += hdrp->a_bss; + else if (bss > 1) size += bss; + + addr = (unsigned char*)xmalloc(size); + if (addr == NULL) { + dln_errno = errno; + return 0; + } + + if (read(fd, addr, size) != size) { + dln_errno = errno; + free(addr); + return 0; + } + + if (bss == -1) { + memset(addr + hdrp->a_text + hdrp->a_data, 0, hdrp->a_bss); + } + else if (bss > 0) { + memset(addr + hdrp->a_text + hdrp->a_data, 0, bss); + } + + return (long)addr; +} + +static int +undef_print(key, value) + char *key, *value; +{ + fprintf(stderr, " %s\n", key); + return ST_CONTINUE; +} + +static void +dln_print_undef() +{ + fprintf(stderr, " Undefined symbols:\n"); + st_foreach(undef_tbl, undef_print, NULL); +} + +static void +dln_undefined() +{ + if (undef_tbl->num_entries > 0) { + fprintf(stderr, "dln: Calling undefined function\n"); + dln_print_undef(); + rb_exit(1); + } +} + +struct undef { + char *name; + struct relocation_info reloc; + long base; + char *addr; + union { + char c; + short s; + long l; + } u; +}; + +static st_table *reloc_tbl = NULL; +static void +link_undef(name, base, reloc) + const char *name; + long base; + struct relocation_info *reloc; +{ + static int u_no = 0; + struct undef *obj; + char *addr = (char*)(reloc->r_address + base); + + obj = (struct undef*)xmalloc(sizeof(struct undef)); + obj->name = strdup(name); + obj->reloc = *reloc; + obj->base = base; + switch (R_LENGTH(reloc)) { + case 0: /* byte */ + obj->u.c = *addr; + break; + case 1: /* word */ + obj->u.s = *(short*)addr; + break; + case 2: /* long */ + obj->u.l = *(long*)addr; + break; + } + if (reloc_tbl == NULL) { + reloc_tbl = st_init_numtable(); + } + st_insert(reloc_tbl, u_no++, obj); +} + +struct reloc_arg { + const char *name; + long value; +}; + +static int +reloc_undef(no, undef, arg) + int no; + struct undef *undef; + struct reloc_arg *arg; +{ + int datum; + char *address; +#if defined(sun) && defined(sparc) + unsigned int mask = 0; +#endif + + if (strcmp(arg->name, undef->name) != 0) return ST_CONTINUE; + address = (char*)(undef->base + undef->reloc.r_address); + datum = arg->value; + + if (R_PCREL(&(undef->reloc))) datum -= undef->base; +#if defined(sun) && defined(sparc) + datum += undef->reloc.r_addend; + datum >>= R_RIGHTSHIFT(&(undef->reloc)); + mask = (1 << R_BITSIZE(&(undef->reloc))) - 1; + mask |= mask -1; + datum &= mask; + switch (R_LENGTH(&(undef->reloc))) { + case 0: + *address = undef->u.c; + *address &= ~mask; + *address |= datum; + break; + case 1: + *(short *)address = undef->u.s; + *(short *)address &= ~mask; + *(short *)address |= datum; + break; + case 2: + *(long *)address = undef->u.l; + *(long *)address &= ~mask; + *(long *)address |= datum; + break; + } +#else + switch (R_LENGTH(&(undef->reloc))) { + case 0: /* byte */ + if (R_MEMORY_SUB(&(undef->reloc))) + *address = datum - *address; + else *address = undef->u.c + datum; + break; + case 1: /* word */ + if (R_MEMORY_SUB(&(undef->reloc))) + *(short*)address = datum - *(short*)address; + else *(short*)address = undef->u.s + datum; + break; + case 2: /* long */ + if (R_MEMORY_SUB(&(undef->reloc))) + *(long*)address = datum - *(long*)address; + else *(long*)address = undef->u.l + datum; + break; + } +#endif + free(undef->name); + free(undef); + return ST_DELETE; +} + +static void +unlink_undef(name, value) + const char *name; + long value; +{ + struct reloc_arg arg; + + arg.name = name; + arg.value = value; + st_foreach(reloc_tbl, reloc_undef, &arg); +} + +#ifdef N_INDR +struct indr_data { + char *name0, *name1; +}; + +static int +reloc_repl(no, undef, data) + int no; + struct undef *undef; + struct indr_data *data; +{ + if (strcmp(data->name0, undef->name) == 0) { + free(undef->name); + undef->name = strdup(data->name1); + } + return ST_CONTINUE; +} +#endif + +static int +load_1(fd, disp, need_init) + int fd; + long disp; + const char *need_init; +{ + static char *libc = LIBC_NAME; + struct exec hdr; + struct relocation_info *reloc = NULL; + long block = 0; + long new_common = 0; /* Length of new common */ + struct nlist *syms = NULL; + struct nlist *sym; + struct nlist *end; + int init_p = 0; + + if (load_header(fd, &hdr, disp) == -1) return -1; + if (INVALID_OBJECT(hdr)) { + dln_errno = DLN_ENOEXEC; + return -1; + } + reloc = load_reloc(fd, &hdr, disp); + if (reloc == NULL) return -1; + + syms = load_sym(fd, &hdr, disp); + if (syms == NULL) { + free(reloc); + return -1; + } + + sym = syms; + end = syms + (hdr.a_syms / sizeof(struct nlist)); + while (sym < end) { + struct nlist *old_sym; + int value = sym->n_value; + +#ifdef N_INDR + if (sym->n_type == (N_INDR | N_EXT)) { + char *key = sym->n_un.n_name; + + if (st_lookup(sym_tbl, sym[1].n_un.n_name, &old_sym)) { + if (st_delete(undef_tbl, (st_data_t*)&key, NULL)) { + unlink_undef(key, old_sym->n_value); + free(key); + } + } + else { + struct indr_data data; + + data.name0 = sym->n_un.n_name; + data.name1 = sym[1].n_un.n_name; + st_foreach(reloc_tbl, reloc_repl, &data); + + st_insert(undef_tbl, strdup(sym[1].n_un.n_name), NULL); + if (st_delete(undef_tbl, (st_data_t*)&key, NULL)) { + free(key); + } + } + sym += 2; + continue; + } +#endif + if (sym->n_type == (N_UNDF | N_EXT)) { + if (st_lookup(sym_tbl, sym->n_un.n_name, &old_sym) == 0) { + old_sym = NULL; + } + + if (value) { + if (old_sym) { + sym->n_type = N_EXT | N_COMM; + sym->n_value = old_sym->n_value; + } + else { + int rnd = + value >= sizeof(double) ? sizeof(double) - 1 + : value >= sizeof(long) ? sizeof(long) - 1 + : sizeof(short) - 1; + + sym->n_type = N_COMM; + new_common += rnd; + new_common &= ~(long)rnd; + sym->n_value = new_common; + new_common += value; + } + } + else { + if (old_sym) { + sym->n_type = N_EXT | N_COMM; + sym->n_value = old_sym->n_value; + } + else { + sym->n_value = (long)dln_undefined; + st_insert(undef_tbl, strdup(sym->n_un.n_name), NULL); + } + } + } + sym++; + } + + block = load_text_data(fd, &hdr, hdr.a_bss + new_common, disp); + if (block == 0) goto err_exit; + + sym = syms; + while (sym < end) { + struct nlist *new_sym; + char *key; + + switch (sym->n_type) { + case N_COMM: + sym->n_value += hdr.a_text + hdr.a_data; + case N_TEXT|N_EXT: + case N_DATA|N_EXT: + + sym->n_value += block; + + if (st_lookup(sym_tbl, sym->n_un.n_name, &new_sym) != 0 + && new_sym->n_value != (long)dln_undefined) { + dln_errno = DLN_ECONFL; + goto err_exit; + } + + key = sym->n_un.n_name; + if (st_delete(undef_tbl, (st_data_t*)&key, NULL) != 0) { + unlink_undef(key, sym->n_value); + free(key); + } + + new_sym = (struct nlist*)xmalloc(sizeof(struct nlist)); + *new_sym = *sym; + new_sym->n_un.n_name = strdup(sym->n_un.n_name); + st_insert(sym_tbl, new_sym->n_un.n_name, new_sym); + break; + + case N_TEXT: + case N_DATA: + sym->n_value += block; + break; + } + sym++; + } + + /* + * First comes the text-relocation + */ + { + struct relocation_info * rel = reloc; + struct relocation_info * rel_beg = reloc + + (hdr.a_trsize/sizeof(struct relocation_info)); + struct relocation_info * rel_end = reloc + + (hdr.a_trsize+hdr.a_drsize)/sizeof(struct relocation_info); + + while (rel < rel_end) { + char *address = (char*)(rel->r_address + block); + long datum = 0; +#if defined(sun) && defined(sparc) + unsigned int mask = 0; +#endif + + if(rel >= rel_beg) + address += hdr.a_text; + + if (rel->r_extern) { /* Look it up in symbol-table */ + sym = &(syms[R_SYMBOL(rel)]); + switch (sym->n_type) { + case N_EXT|N_UNDF: + link_undef(sym->n_un.n_name, block, rel); + case N_EXT|N_COMM: + case N_COMM: + datum = sym->n_value; + break; + default: + goto err_exit; + } + } /* end.. look it up */ + else { /* is static */ + switch (R_SYMBOL(rel)) { + case N_TEXT: + case N_DATA: + datum = block; + break; + case N_BSS: + datum = block + new_common; + break; + case N_ABS: + break; + } + } /* end .. is static */ + if (R_PCREL(rel)) datum -= block; + +#if defined(sun) && defined(sparc) + datum += rel->r_addend; + datum >>= R_RIGHTSHIFT(rel); + mask = (1 << R_BITSIZE(rel)) - 1; + mask |= mask -1; + datum &= mask; + + switch (R_LENGTH(rel)) { + case 0: + *address &= ~mask; + *address |= datum; + break; + case 1: + *(short *)address &= ~mask; + *(short *)address |= datum; + break; + case 2: + *(long *)address &= ~mask; + *(long *)address |= datum; + break; + } +#else + switch (R_LENGTH(rel)) { + case 0: /* byte */ + if (datum < -128 || datum > 127) goto err_exit; + *address += datum; + break; + case 1: /* word */ + *(short *)address += datum; + break; + case 2: /* long */ + *(long *)address += datum; + break; + } +#endif + rel++; + } + } + + if (need_init) { + int len; + char **libs_to_be_linked = 0; + char *buf; + + if (undef_tbl->num_entries > 0) { + if (load_lib(libc) == -1) goto err_exit; + } + + init_funcname(&buf, need_init); + len = strlen(buf); + + for (sym = syms; sym<end; sym++) { + char *name = sym->n_un.n_name; + if (name[0] == '_' && sym->n_value >= block) { + if (strcmp(name+1, "dln_libs_to_be_linked") == 0) { + libs_to_be_linked = (char**)sym->n_value; + } + else if (strcmp(name+1, buf) == 0) { + init_p = 1; + ((int (*)())sym->n_value)(); + } + } + } + if (libs_to_be_linked && undef_tbl->num_entries > 0) { + while (*libs_to_be_linked) { + load_lib(*libs_to_be_linked); + libs_to_be_linked++; + } + } + } + free(reloc); + free(syms); + if (need_init) { + if (init_p == 0) { + dln_errno = DLN_ENOINIT; + return -1; + } + if (undef_tbl->num_entries > 0) { + if (load_lib(libc) == -1) goto err_exit; + if (undef_tbl->num_entries > 0) { + dln_errno = DLN_EUNDEF; + return -1; + } + } + } + return 0; + + err_exit: + if (syms) free(syms); + if (reloc) free(reloc); + if (block) free((char*)block); + return -1; +} + +static int target_offset; +static int +search_undef(key, value, lib_tbl) + const char *key; + int value; + st_table *lib_tbl; +{ + long offset; + + if (st_lookup(lib_tbl, key, &offset) == 0) return ST_CONTINUE; + target_offset = offset; + return ST_STOP; +} + +struct symdef { + int rb_str_index; + int lib_offset; +}; + +char *dln_librrb_ary_path = DLN_DEFAULT_LIB_PATH; + +static int +load_lib(lib) + const char *lib; +{ + char *path, *file; + char armagic[SARMAG]; + int fd, size; + struct ar_hdr ahdr; + st_table *lib_tbl = NULL; + int *data, nsym; + struct symdef *base; + char *name_base; + + if (dln_init_p == 0) { + dln_errno = DLN_ENOINIT; + return -1; + } + + if (undef_tbl->num_entries == 0) return 0; + dln_errno = DLN_EBADLIB; + + if (lib[0] == '-' && lib[1] == 'l') { + long len = strlen(lib) + 4; + char *p = alloca(len); + snprintf(p, len, "lib%s.a", lib+2); + lib = p; + } + + /* library search path: */ + /* look for environment variable DLN_LIBRARY_PATH first. */ + /* then variable dln_librrb_ary_path. */ + /* if path is still NULL, use "." for path. */ + path = getenv("DLN_LIBRARY_PATH"); + if (path == NULL) path = dln_librrb_ary_path; + + file = dln_find_file(lib, path); + fd = open(file, O_RDONLY); + if (fd == -1) goto syserr; + size = read(fd, armagic, SARMAG); + if (size == -1) goto syserr; + + if (size != SARMAG) { + dln_errno = DLN_ENOTLIB; + goto badlib; + } + size = read(fd, &ahdr, sizeof(ahdr)); + if (size == -1) goto syserr; + if (size != sizeof(ahdr) || sscanf(ahdr.ar_size, "%d", &size) != 1) { + goto badlib; + } + + if (strncmp(ahdr.ar_name, "__.SYMDEF", 9) == 0) { + /* make hash table from __.SYMDEF */ + + lib_tbl = st_init_strtable(); + data = (int*)xmalloc(size); + if (data == NULL) goto syserr; + size = read(fd, data, size); + nsym = *data / sizeof(struct symdef); + base = (struct symdef*)(data + 1); + name_base = (char*)(base + nsym) + sizeof(int); + while (nsym > 0) { + char *name = name_base + base->rb_str_index; + + st_insert(lib_tbl, name, base->lib_offset + sizeof(ahdr)); + nsym--; + base++; + } + for (;;) { + target_offset = -1; + st_foreach(undef_tbl, search_undef, lib_tbl); + if (target_offset == -1) break; + if (load_1(fd, target_offset, 0) == -1) { + st_free_table(lib_tbl); + free(data); + goto badlib; + } + if (undef_tbl->num_entries == 0) break; + } + free(data); + st_free_table(lib_tbl); + } + else { + /* linear library, need to scan (FUTURE) */ + + for (;;) { + int offset = SARMAG; + int found = 0; + struct exec hdr; + struct nlist *syms, *sym, *end; + + while (undef_tbl->num_entries > 0) { + found = 0; + lseek(fd, offset, 0); + size = read(fd, &ahdr, sizeof(ahdr)); + if (size == -1) goto syserr; + if (size == 0) break; + if (size != sizeof(ahdr) + || sscanf(ahdr.ar_size, "%d", &size) != 1) { + goto badlib; + } + offset += sizeof(ahdr); + if (load_header(fd, &hdr, offset) == -1) + goto badlib; + syms = load_sym(fd, &hdr, offset); + if (syms == NULL) goto badlib; + sym = syms; + end = syms + (hdr.a_syms / sizeof(struct nlist)); + while (sym < end) { + if (sym->n_type == N_EXT|N_TEXT + && st_lookup(undef_tbl, sym->n_un.n_name, NULL)) { + break; + } + sym++; + } + if (sym < end) { + found++; + free(syms); + if (load_1(fd, offset, 0) == -1) { + goto badlib; + } + } + offset += size; + if (offset & 1) offset++; + } + if (found) break; + } + } + close(fd); + return 0; + + syserr: + dln_errno = errno; + badlib: + if (fd >= 0) close(fd); + return -1; +} + +static int +load(file) + const char *file; +{ + int fd; + int result; + + if (dln_init_p == 0) { + if (dln_init(dln_argv0) == -1) return -1; + } + result = strlen(file); + if (file[result-1] == 'a') { + return load_lib(file); + } + + fd = open(file, O_RDONLY); + if (fd == -1) { + dln_errno = errno; + return -1; + } + result = load_1(fd, 0, file); + close(fd); + + return result; +} + +void* +dln_sym(name) + const char *name; +{ + struct nlist *sym; + + if (st_lookup(sym_tbl, name, &sym)) + return (void*)sym->n_value; + return NULL; +} + +#endif /* USE_DLN_A_OUT */ + +#ifdef USE_DLN_DLOPEN +# if defined(__NetBSD__) && defined(__NetBSD_Version__) && __NetBSD_Version__ < 105000000 +# include <nlist.h> +# include <link.h> +# else +# include <dlfcn.h> +# endif +#endif + +#ifdef __hpux +#include <errno.h> +#include "dl.h" +#endif + +#if defined(_AIX) +#include <ctype.h> /* for isdigit() */ +#include <errno.h> /* for global errno */ +#include <sys/ldr.h> +#endif + +#ifdef NeXT +#if NS_TARGET_MAJOR < 4 +#include <mach-o/rld.h> +#else +#include <mach-o/dyld.h> +#ifndef NSLINKMODULE_OPTION_BINDNOW +#define NSLINKMODULE_OPTION_BINDNOW 1 +#endif +#endif +#else +#ifdef __APPLE__ +#include <mach-o/dyld.h> +#endif +#endif + +#if defined _WIN32 && !defined __CYGWIN__ +#include <windows.h> +#endif + +#ifdef _WIN32_WCE +#undef FormatMessage +#define FormatMessage FormatMessageA +#undef LoadLibrary +#define LoadLibrary LoadLibraryA +#undef GetProcAddress +#define GetProcAddress GetProcAddressA +#endif + +static const char * +dln_strerror() +{ +#ifdef USE_DLN_A_OUT + char *strerror(); + + switch (dln_errno) { + case DLN_ECONFL: + return "Symbol name conflict"; + case DLN_ENOINIT: + return "No initializer given"; + case DLN_EUNDEF: + return "Unresolved symbols"; + case DLN_ENOTLIB: + return "Not a library file"; + case DLN_EBADLIB: + return "Malformed library file"; + case DLN_EINIT: + return "Not initialized"; + default: + return strerror(dln_errno); + } +#endif + +#ifdef USE_DLN_DLOPEN + return (char*)dlerror(); +#endif + +#if defined _WIN32 && !defined __CYGWIN__ + static char message[1024]; + int error = GetLastError(); + char *p = message; + p += sprintf(message, "%d: ", error); + FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + p, + sizeof message - strlen(message), + NULL); + + for (p = message; *p; p++) { + if (*p == '\n' || *p == '\r') + *p = ' '; + } + return message; +#endif +} + + +#if defined(_AIX) && ! defined(_IA64) +static void +aix_loaderror(const char *pathname) +{ + char *message[8], errbuf[1024]; + int i,j; + + struct errtab { + int errnum; + char *errstr; + } load_errtab[] = { + {L_ERROR_TOOMANY, "too many errors, rest skipped."}, + {L_ERROR_NOLIB, "can't load library:"}, + {L_ERROR_UNDEF, "can't find symbol in library:"}, + {L_ERROR_RLDBAD, + "RLD index out of range or bad relocation type:"}, + {L_ERROR_FORMAT, "not a valid, executable xcoff file:"}, + {L_ERROR_MEMBER, + "file not an archive or does not contain requested member:"}, + {L_ERROR_TYPE, "symbol table mismatch:"}, + {L_ERROR_ALIGN, "text alignment in file is wrong."}, + {L_ERROR_SYSTEM, "System error:"}, + {L_ERROR_ERRNO, NULL} + }; + +#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0])) +#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1) + + snprintf(errbuf, 1024, "load failed - %s ", pathname); + + if (!loadquery(1, &message[0], sizeof(message))) + ERRBUF_APPEND(strerror(errno)); + for(i = 0; message[i] && *message[i]; i++) { + int nerr = atoi(message[i]); + for (j=0; j<LOAD_ERRTAB_LEN; j++) { + if (nerr == load_errtab[i].errnum && load_errtab[i].errstr) + ERRBUF_APPEND(load_errtab[i].errstr); + } + while (isdigit(*message[i])) message[i]++; + ERRBUF_APPEND(message[i]); + ERRBUF_APPEND("\n"); + } + errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */ + rb_loaderror(errbuf); + return; +} +#endif + +#if defined(__VMS) +#include <starlet.h> +#include <rms.h> +#include <stsdef.h> +#include <unixlib.h> +#include <descrip.h> +#include <lib$routines.h> + +static char *vms_filespec; +static int vms_fileact(char *filespec, int type); +static long vms_fisexh(long *sigarr, long *mecarr); +#endif + +#endif /* NO_DLN_LOAD */ + +void* +dln_load(file) + const char *file; +{ +#ifdef NO_DLN_LOAD + rb_raise(rb_eLoadError, "this executable file can't load extension libraries"); +#else + +#if !defined(_AIX) && !defined(NeXT) + const char *error = 0; +#define DLN_ERROR() (error = dln_strerror(), strcpy(ALLOCA_N(char, strlen(error) + 1), error)) +#endif + +#if defined _WIN32 && !defined __CYGWIN__ + HINSTANCE handle; + char winfile[MAXPATHLEN]; + void (*init_fct)(); + char *buf; + + if (strlen(file) >= MAXPATHLEN) rb_loaderror("filename too long"); + + /* Load the file as an object one */ + init_funcname(&buf, file); + + strcpy(winfile, file); + + /* Load file */ + if ((handle = LoadLibrary(winfile)) == NULL) { + error = dln_strerror(); + goto failed; + } + + if ((init_fct = (void(*)())GetProcAddress(handle, buf)) == NULL) { + rb_loaderror("%s - %s\n%s", dln_strerror(), buf, file); + } + + /* Call the init code */ + (*init_fct)(); + return handle; +#else +#ifdef USE_DLN_A_OUT + if (load(file) == -1) { + error = dln_strerror(); + goto failed; + } + return 0; +#else + + char *buf; + /* Load the file as an object one */ + init_funcname(&buf, file); + +#ifdef USE_DLN_DLOPEN +#define DLN_DEFINED + { + void *handle; + void (*init_fct)(); + +#ifndef RTLD_LAZY +# define RTLD_LAZY 1 +#endif +#ifdef __INTERIX +# undef RTLD_GLOBAL +#endif +#ifndef RTLD_GLOBAL +# define RTLD_GLOBAL 0 +#endif + + /* Load file */ + if ((handle = (void*)dlopen(file, RTLD_LAZY|RTLD_GLOBAL)) == NULL) { + error = dln_strerror(); + goto failed; + } + + init_fct = (void(*)())dlsym(handle, buf); + if (init_fct == NULL) { + error = DLN_ERROR(); + dlclose(handle); + goto failed; + } + /* Call the init code */ + (*init_fct)(); + + return handle; + } +#endif /* USE_DLN_DLOPEN */ + +#ifdef __hpux +#define DLN_DEFINED + { + shl_t lib = NULL; + int flags; + void (*init_fct)(); + + flags = BIND_DEFERRED; + lib = shl_load(file, flags, 0); + if (lib == NULL) { + extern int errno; + rb_loaderror("%s - %s", strerror(errno), file); + } + shl_findsym(&lib, buf, TYPE_PROCEDURE, (void*)&init_fct); + if (init_fct == NULL) { + shl_findsym(&lib, buf, TYPE_UNDEFINED, (void*)&init_fct); + if (init_fct == NULL) { + errno = ENOSYM; + rb_loaderror("%s - %s", strerror(ENOSYM), file); + } + } + (*init_fct)(); + return (void*)lib; + } +#endif /* hpux */ + +#if defined(_AIX) && ! defined(_IA64) +#define DLN_DEFINED + { + void (*init_fct)(); + + init_fct = (void(*)())load((char*)file, 1, 0); + if (init_fct == NULL) { + aix_loaderror(file); + } + if (loadbind(0, (void*)dln_load, (void*)init_fct) == -1) { + aix_loaderror(file); + } + (*init_fct)(); + return (void*)init_fct; + } +#endif /* _AIX */ + +#if defined(NeXT) || defined(__APPLE__) +#define DLN_DEFINED +/*---------------------------------------------------- + By SHIROYAMA Takayuki Psi@fortune.nest.or.jp + + Special Thanks... + Yu tomoak-i@is.aist-nara.ac.jp, + Mi hisho@tasihara.nest.or.jp, + sunshine@sunshineco.com, + and... Miss ARAI Akino(^^;) + ----------------------------------------------------*/ +#if defined(NeXT) && (NS_TARGET_MAJOR < 4)/* NeXTSTEP rld functions */ + + { + NXStream* s; + unsigned long init_address; + char *object_files[2] = {NULL, NULL}; + + void (*init_fct)(); + + object_files[0] = (char*)file; + + s = NXOpenFile(2,NX_WRITEONLY); + + /* Load object file, if return value ==0 , load failed*/ + if(rld_load(s, NULL, object_files, NULL) == 0) { + NXFlush(s); + NXClose(s); + rb_loaderror("Failed to load %.200s", file); + } + + /* lookup the initial function */ + if(rld_lookup(s, buf, &init_address) == 0) { + NXFlush(s); + NXClose(s); + rb_loaderror("Failed to lookup Init function %.200s", file); + } + + NXFlush(s); + NXClose(s); + + /* Cannot call *init_address directory, so copy this value to + funtion pointer */ + init_fct = (void(*)())init_address; + (*init_fct)(); + return (void*)init_address; + } +#else/* OPENSTEP dyld functions */ + { + int dyld_result; + NSObjectFileImage obj_file; /* handle, but not use it */ + /* "file" is module file name . + "buf" is pointer to initial function name with "_" . */ + + void (*init_fct)(); + + + dyld_result = NSCreateObjectFileImageFromFile(file, &obj_file); + + if (dyld_result != NSObjectFileImageSuccess) { + rb_loaderror("Failed to load %.200s", file); + } + + NSLinkModule(obj_file, file, NSLINKMODULE_OPTION_BINDNOW); + + /* lookup the initial function */ + if(!NSIsSymbolNameDefined(buf)) { + rb_loaderror("Failed to lookup Init function %.200s",file); + } + init_fct = NSAddressOfSymbol(NSLookupAndBindSymbol(buf)); + (*init_fct)(); + + return (void*)init_fct; + } +#endif /* rld or dyld */ +#endif + +#ifdef __BEOS__ +# define DLN_DEFINED + { + status_t err_stat; /* BeOS error status code */ + image_id img_id; /* extention module unique id */ + void (*init_fct)(); /* initialize function for extention module */ + + /* load extention module */ + img_id = load_add_on(file); + if (img_id <= 0) { + rb_loaderror("Failed to load %.200s", file); + } + + /* find symbol for module initialize function. */ + /* The Be Book KernelKit Images section described to use + B_SYMBOL_TYPE_TEXT for symbol of function, not + B_SYMBOL_TYPE_CODE. Why ? */ + /* strcat(init_fct_symname, "__Fv"); */ /* parameter nothing. */ + /* "__Fv" dont need! The Be Book Bug ? */ + err_stat = get_image_symbol(img_id, buf, + B_SYMBOL_TYPE_TEXT, (void **)&init_fct); + + if (err_stat != B_NO_ERROR) { + char real_name[MAXPATHLEN]; + + strcpy(real_name, buf); + strcat(real_name, "__Fv"); + err_stat = get_image_symbol(img_id, real_name, + B_SYMBOL_TYPE_TEXT, (void **)&init_fct); + } + + if ((B_BAD_IMAGE_ID == err_stat) || (B_BAD_INDEX == err_stat)) { + unload_add_on(img_id); + rb_loaderror("Failed to lookup Init function %.200s", file); + } + else if (B_NO_ERROR != err_stat) { + char errmsg[] = "Internal of BeOS version. %.200s (symbol_name = %s)"; + unload_add_on(img_id); + rb_loaderror(errmsg, strerror(err_stat), buf); + } + + /* call module initialize function. */ + (*init_fct)(); + return (void*)img_id; + } +#endif /* __BEOS__*/ + +#ifdef __MACOS__ +# define DLN_DEFINED + { + OSErr err; + FSSpec libspec; + CFragConnectionID connID; + Ptr mainAddr; + char errMessage[1024]; + Boolean isfolder, didsomething; + Str63 fragname; + Ptr symAddr; + CFragSymbolClass class; + void (*init_fct)(); + char fullpath[MAXPATHLEN]; + + strcpy(fullpath, file); + + /* resolve any aliases to find the real file */ + c2pstr(fullpath); + (void)FSMakeFSSpec(0, 0, fullpath, &libspec); + err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething); + if (err) { + rb_loaderror("Unresolved Alias - %s", file); + } + + /* Load the fragment (or return the connID if it is already loaded */ + fragname[0] = 0; + err = GetDiskFragment(&libspec, 0, 0, fragname, + kLoadCFrag, &connID, &mainAddr, + errMessage); + if (err) { + p2cstr(errMessage); + rb_loaderror("%s - %s",errMessage , file); + } + + /* Locate the address of the correct init function */ + c2pstr(buf); + err = FindSymbol(connID, buf, &symAddr, &class); + if (err) { + rb_loaderror("Unresolved symbols - %s" , file); + } + init_fct = (void (*)())symAddr; + (*init_fct)(); + return (void*)init_fct; + } +#endif /* __MACOS__ */ + +#if defined(__VMS) +#define DLN_DEFINED + { + long status; + void (*init_fct)(); + char *fname, *p1, *p2; + + $DESCRIPTOR(fname_d, ""); + $DESCRIPTOR(image_d, ""); + $DESCRIPTOR(buf_d, ""); + + decc$to_vms(file, vms_fileact, 0, 0); + + fname = (char *)__alloca(strlen(file)+1); + strcpy(fname,file); + if (p1 = strrchr(fname,'/')) + fname = p1 + 1; + if (p2 = strrchr(fname,'.')) + *p2 = '\0'; + + fname_d.dsc$w_length = strlen(fname); + fname_d.dsc$a_pointer = fname; + image_d.dsc$w_length = strlen(vms_filespec); + image_d.dsc$a_pointer = vms_filespec; + buf_d.dsc$w_length = strlen(buf); + buf_d.dsc$a_pointer = buf; + + lib$establish(vms_fisexh); + + status = lib$find_image_symbol ( + &fname_d, + &buf_d, + &init_fct, + &image_d); + + lib$establish(0); + + if (status == RMS$_FNF) { + error = dln_strerror(); + goto failed; + } else if (!$VMS_STATUS_SUCCESS(status)) { + error = DLN_ERROR(); + goto failed; + } + + /* Call the init code */ + (*init_fct)(); + + return 1; + } +#endif /* __VMS */ + +#ifndef DLN_DEFINED + rb_notimplement(); +#endif + +#endif /* USE_DLN_A_OUT */ +#endif +#if !defined(_AIX) && !defined(NeXT) + failed: + rb_loaderror("%s - %s", error, file); +#endif + +#endif /* NO_DLN_LOAD */ + return 0; /* dummy return */ +} + +static char *dln_find_1(); + +char * +dln_find_exe(fname, path) + const char *fname; + const char *path; +{ + if (!path) { + path = getenv(PATH_ENV); + } + + if (!path) { +#if defined(MSDOS) || defined(_WIN32) || defined(__human68k__) || defined(__MACOS__) + path = "/usr/local/bin;/usr/ucb;/usr/bin;/bin;."; +#else + path = "/usr/local/bin:/usr/ucb:/usr/bin:/bin:."; +#endif + } + return dln_find_1(fname, path, 1); +} + +char * +dln_find_file(fname, path) + const char *fname; + const char *path; +{ +#ifndef __MACOS__ + if (!path) path = "."; + return dln_find_1(fname, path, 0); +#else + if (!path) path = "."; + return _macruby_path_conv_posix_to_macos(dln_find_1(fname, path, 0)); +#endif +} + +static char fbuf[MAXPATHLEN]; + +static char * +dln_find_1(fname, path, exe_flag) + char *fname; + char *path; + int exe_flag; /* non 0 if looking for executable. */ +{ + register char *dp; + register char *ep; + register char *bp; + struct stat st; +#ifdef __MACOS__ + const char* mac_fullpath; +#endif + + if (!fname) return fname; + if (fname[0] == '/') return fname; + if (strncmp("./", fname, 2) == 0 || strncmp("../", fname, 3) == 0) + return fname; + if (exe_flag && strchr(fname, '/')) return fname; +#ifdef DOSISH + if (fname[0] == '\\') return fname; +# ifdef DOSISH_DRIVE_LETTER + if (strlen(fname) > 2 && fname[1] == ':') return fname; +# endif + if (strncmp(".\\", fname, 2) == 0 || strncmp("..\\", fname, 3) == 0) + return fname; + if (exe_flag && strchr(fname, '\\')) return fname; +#endif + + for (dp = path;; dp = ++ep) { + register int l; + int i; + int fspace; + + /* extract a component */ + ep = strchr(dp, PATH_SEP[0]); + if (ep == NULL) + ep = dp+strlen(dp); + + /* find the length of that component */ + l = ep - dp; + bp = fbuf; + fspace = sizeof fbuf - 2; + if (l > 0) { + /* + ** If the length of the component is zero length, + ** start from the current directory. If the + ** component begins with "~", start from the + ** user's $HOME environment variable. Otherwise + ** take the path literally. + */ + + if (*dp == '~' && (l == 1 || +#if defined(DOSISH) + dp[1] == '\\' || +#endif + dp[1] == '/')) { + char *home; + + home = getenv("HOME"); + if (home != NULL) { + i = strlen(home); + if ((fspace -= i) < 0) + goto toolong; + memcpy(bp, home, i); + bp += i; + } + dp++; + l--; + } + if (l > 0) { + if ((fspace -= l) < 0) + goto toolong; + memcpy(bp, dp, l); + bp += l; + } + + /* add a "/" between directory and filename */ + if (ep[-1] != '/') + *bp++ = '/'; + } + + /* now append the file name */ + i = strlen(fname); + if ((fspace -= i) < 0) { + toolong: + fprintf(stderr, "openpath: pathname too long (ignored)\n"); + *bp = '\0'; + fprintf(stderr, "\tDirectory \"%s\"\n", fbuf); + fprintf(stderr, "\tFile \"%s\"\n", fname); + goto next; + } + memcpy(bp, fname, i + 1); + +#if defined(DOSISH) + if (exe_flag) { + static const char extension[][5] = { +#if defined(MSDOS) + ".com", ".exe", ".bat", +#if defined(DJGPP) + ".btm", ".sh", ".ksh", ".pl", ".sed", +#endif +#elif defined(__EMX__) || defined(_WIN32) + ".exe", ".com", ".cmd", ".bat", +/* end of __EMX__ or _WIN32 */ +#else + ".r", ".R", ".x", ".X", ".bat", ".BAT", +/* __human68k__ */ +#endif + }; + int j; + + for (j = 0; j < sizeof(extension) / sizeof(extension[0]); j++) { + if (fspace < strlen(extension[j])) { + fprintf(stderr, "openpath: pathname too long (ignored)\n"); + fprintf(stderr, "\tDirectory \"%.*s\"\n", (int) (bp - fbuf), fbuf); + fprintf(stderr, "\tFile \"%s%s\"\n", fname, extension[j]); + continue; + } + strcpy(bp + i, extension[j]); +#ifndef __MACOS__ + if (stat(fbuf, &st) == 0) + return fbuf; +#else + if (mac_fullpath = _macruby_exist_file_in_libdir_as_posix_name(fbuf)) + return mac_fullpath; + +#endif + } + goto next; + } +#endif /* MSDOS or _WIN32 or __human68k__ or __EMX__ */ + +#ifndef __MACOS__ + if (stat(fbuf, &st) == 0) { + if (exe_flag == 0) return fbuf; + /* looking for executable */ + if (!S_ISDIR(st.st_mode) && eaccess(fbuf, X_OK) == 0) + return fbuf; + } +#else + if (mac_fullpath = _macruby_exist_file_in_libdir_as_posix_name(fbuf)) { + if (exe_flag == 0) return mac_fullpath; + /* looking for executable */ + if (stat(mac_fullpath, &st) == 0) { + if (!S_ISDIR(st.st_mode) && eaccess(mac_fullpath, X_OK) == 0) + return mac_fullpath; + } + } +#endif + + next: + /* if not, and no other alternatives, life is bleak */ + if (*ep == '\0') { + return NULL; + } + + /* otherwise try the next component in the search path */ + } +} + +#if defined(__VMS) + +/* action routine for decc$to_vms */ +static int vms_fileact(char *filespec, int type) +{ + if (vms_filespec) + free(vms_filespec); + vms_filespec = malloc(strlen(filespec)+1); + strcpy(vms_filespec, filespec); + return 1; +} + +/* exception handler for LIB$FIND_IMAGE_SYMBOL */ +static long vms_fisexh(long *sigarr, long *mecarr) +{ + sys$unwind(1, 0); + return 1; +} + +#endif /* __VMS */ +#define NO_DLN_LOAD 1 +#include "dln.c" +void +Init_ext() +{ +} +/********************************************************************** + + enum.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Fri Oct 1 15:15:19 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "node.h" +#include "util.h" + +VALUE rb_mEnumerable; +static ID id_each, id_eqq, id_cmp; + +VALUE +rb_each(obj) + VALUE obj; +{ + return rb_funcall(obj, id_each, 0, 0); +} + +static VALUE +grep_i(i, arg) + VALUE i, *arg; +{ + if (RTEST(rb_funcall(arg[0], id_eqq, 1, i))) { + rb_ary_push(arg[1], i); + } + return Qnil; +} + +static VALUE +grep_iter_i(i, arg) + VALUE i, *arg; +{ + if (RTEST(rb_funcall(arg[0], id_eqq, 1, i))) { + rb_ary_push(arg[1], rb_yield(i)); + } + return Qnil; +} + +/* + * call-seq: + * enum.grep(pattern) => array + * enum.grep(pattern) {| obj | block } => array + * + * Returns an array of every element in <i>enum</i> for which + * <code>Pattern === element</code>. If the optional <em>block</em> is + * supplied, each matching element is passed to it, and the block's + * result is stored in the output array. + * + * (1..100).grep 38..44 #=> [38, 39, 40, 41, 42, 43, 44] + * c = IO.constants + * c.grep(/SEEK/) #=> ["SEEK_END", "SEEK_SET", "SEEK_CUR"] + * res = c.grep(/SEEK/) {|v| IO.const_get(v) } + * res #=> [2, 0, 1] + * + */ + +static VALUE +enum_grep(obj, pat) + VALUE obj, pat; +{ + VALUE ary = rb_ary_new(); + VALUE arg[2]; + + arg[0] = pat; + arg[1] = ary; + + rb_iterate(rb_each, obj, rb_block_given_p() ? grep_iter_i : grep_i, (VALUE)arg); + + return ary; +} + +static VALUE +find_i(i, memo) + VALUE i; + VALUE *memo; +{ + if (RTEST(rb_yield(i))) { + *memo = i; + rb_iter_break(); + } + return Qnil; +} + +/* + * call-seq: + * enum.detect(ifnone = nil) {| obj | block } => obj or nil + * enum.find(ifnone = nil) {| obj | block } => obj or nil + * + * Passes each entry in <i>enum</i> to <em>block</em>. Returns the + * first for which <em>block</em> is not <code>false</code>. If no + * object matches, calls <i>ifnone</i> and returns its result when it + * is specified, or returns <code>nil</code> + * + * (1..10).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> nil + * (1..100).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> 35 + * + */ + +static VALUE +enum_find(argc, argv, obj) + int argc; + VALUE* argv; + VALUE obj; +{ + VALUE memo = Qundef; + VALUE if_none; + + rb_scan_args(argc, argv, "01", &if_none); + rb_iterate(rb_each, obj, find_i, (VALUE)&memo); + if (memo != Qundef) { + return memo; + } + if (!NIL_P(if_none)) { + return rb_funcall(if_none, rb_intern("call"), 0, 0); + } + return Qnil; +} + +static VALUE +find_all_i(i, ary) + VALUE i, ary; +{ + if (RTEST(rb_yield(i))) { + rb_ary_push(ary, i); + } + return Qnil; +} + +/* + * call-seq: + * enum.find_all {| obj | block } => array + * enum.select {| obj | block } => array + * + * Returns an array containing all elements of <i>enum</i> for which + * <em>block</em> is not <code>false</code> (see also + * <code>Enumerable#reject</code>). + * + * (1..10).find_all {|i| i % 3 == 0 } #=> [3, 6, 9] + * + */ + +static VALUE +enum_find_all(obj) + VALUE obj; +{ + VALUE ary = rb_ary_new(); + + rb_iterate(rb_each, obj, find_all_i, ary); + + return ary; +} + +static VALUE +reject_i(i, ary) + VALUE i, ary; +{ + if (!RTEST(rb_yield(i))) { + rb_ary_push(ary, i); + } + return Qnil; +} + +/* + * call-seq: + * enum.reject {| obj | block } => array + * + * Returns an array for all elements of <i>enum</i> for which + * <em>block</em> is false (see also <code>Enumerable#find_all</code>). + * + * (1..10).reject {|i| i % 3 == 0 } #=> [1, 2, 4, 5, 7, 8, 10] + * + */ + +static VALUE +enum_reject(obj) + VALUE obj; +{ + VALUE ary = rb_ary_new(); + + rb_iterate(rb_each, obj, reject_i, ary); + + return ary; +} + +static VALUE +collect_i(i, ary) + VALUE i, ary; +{ + rb_ary_push(ary, rb_yield(i)); + + return Qnil; +} + +static VALUE +collect_all(i, ary) + VALUE i, ary; +{ + rb_ary_push(ary, i); + + return Qnil; +} + +/* + * call-seq: + * enum.collect {| obj | block } => array + * enum.map {| obj | block } => array + * + * Returns a new array with the results of running <em>block</em> once + * for every element in <i>enum</i>. + * + * (1..4).collect {|i| i*i } #=> [1, 4, 9, 16] + * (1..4).collect { "cat" } #=> ["cat", "cat", "cat", "cat"] + * + */ + +static VALUE +enum_collect(obj) + VALUE obj; +{ + VALUE ary = rb_ary_new(); + + rb_iterate(rb_each, obj, rb_block_given_p() ? collect_i : collect_all, ary); + + return ary; +} + +/* + * call-seq: + * enum.to_a => array + * enum.entries => array + * + * Returns an array containing the items in <i>enum</i>. + * + * (1..7).to_a #=> [1, 2, 3, 4, 5, 6, 7] + * { 'a'=>1, 'b'=>2, 'c'=>3 }.to_a #=> [["a", 1], ["b", 2], ["c", 3]] + */ +static VALUE +enum_to_a(obj) + VALUE obj; +{ + VALUE ary = rb_ary_new(); + + rb_iterate(rb_each, obj, collect_all, ary); + + return ary; +} + +static VALUE +inject_i(i, memo) + VALUE i; + VALUE *memo; +{ + if (*memo == Qundef) { + *memo = i; + } + else { + *memo = rb_yield_values(2, *memo, i); + } + return Qnil; +} + +/* + * call-seq: + * enum.inject(initial) {| memo, obj | block } => obj + * enum.inject {| memo, obj | block } => obj + * + * Combines the elements of <i>enum</i> by applying the block to an + * accumulator value (<i>memo</i>) and each element in turn. At each + * step, <i>memo</i> is set to the value returned by the block. The + * first form lets you supply an initial value for <i>memo</i>. The + * second form uses the first element of the collection as a the + * initial value (and skips that element while iterating). + * + * # Sum some numbers + * (5..10).inject {|sum, n| sum + n } #=> 45 + * # Multiply some numbers + * (5..10).inject(1) {|product, n| product * n } #=> 151200 + * + * # find the longest word + * longest = %w{ cat sheep bear }.inject do |memo,word| + * memo.length > word.length ? memo : word + * end + * longest #=> "sheep" + * + * # find the length of the longest word + * longest = %w{ cat sheep bear }.inject(0) do |memo,word| + * memo >= word.length ? memo : word.length + * end + * longest #=> 5 + * + */ + +static VALUE +enum_inject(argc, argv, obj) + int argc; + VALUE *argv, obj; +{ + VALUE memo = Qundef; + + if (rb_scan_args(argc, argv, "01", &memo) == 0) + memo = Qundef; + rb_iterate(rb_each, obj, inject_i, (VALUE)&memo); + if (memo == Qundef) return Qnil; + return memo; +} + +static VALUE +partition_i(i, ary) + VALUE i, *ary; +{ + if (RTEST(rb_yield(i))) { + rb_ary_push(ary[0], i); + } + else { + rb_ary_push(ary[1], i); + } + return Qnil; +} + +/* + * call-seq: + * enum.partition {| obj | block } => [ true_array, false_array ] + * + * Returns two arrays, the first containing the elements of + * <i>enum</i> for which the block evaluates to true, the second + * containing the rest. + * + * (1..6).partition {|i| (i&1).zero?} #=> [[2, 4, 6], [1, 3, 5]] + * + */ + +static VALUE +enum_partition(obj) + VALUE obj; +{ + VALUE ary[2]; + + ary[0] = rb_ary_new(); + ary[1] = rb_ary_new(); + rb_iterate(rb_each, obj, partition_i, (VALUE)ary); + + return rb_assoc_new(ary[0], ary[1]); +} + +/* + * call-seq: + * enum.sort => array + * enum.sort {| a, b | block } => array + * + * Returns an array containing the items in <i>enum</i> sorted, + * either according to their own <code><=></code> method, or by using + * the results of the supplied block. The block should return -1, 0, or + * +1 depending on the comparison between <i>a</i> and <i>b</i>. As of + * Ruby 1.8, the method <code>Enumerable#sort_by</code> implements a + * built-in Schwartzian Transform, useful when key computation or + * comparison is expensive.. + * + * %w(rhea kea flea).sort #=> ["flea", "kea", "rhea"] + * (1..10).sort {|a,b| b <=> a} #=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] + */ + +static VALUE +enum_sort(obj) + VALUE obj; +{ + return rb_ary_sort(enum_to_a(obj)); +} + +static VALUE +sort_by_i(i, ary) + VALUE i, ary; +{ + VALUE v; + NODE *memo; + + v = rb_yield(i); + if (RBASIC(ary)->klass) { + rb_raise(rb_eRuntimeError, "sort_by reentered"); + } + memo = rb_node_newnode(NODE_MEMO, v, i, 0); + rb_ary_push(ary, (VALUE)memo); + return Qnil; +} + +static int +sort_by_cmp(aa, bb) + NODE **aa, **bb; +{ + VALUE a = aa[0]->u1.value; + VALUE b = bb[0]->u1.value; + + return rb_cmpint(rb_funcall(a, id_cmp, 1, b), a, b); +} + +/* + * call-seq: + * enum.sort_by {| obj | block } => array + * + * Sorts <i>enum</i> using a set of keys generated by mapping the + * values in <i>enum</i> through the given block. + * + * %w{ apple pear fig }.sort_by {|word| word.length} + #=> ["fig", "pear", "apple"] + * + * The current implementation of <code>sort_by</code> generates an + * array of tuples containing the original collection element and the + * mapped value. This makes <code>sort_by</code> fairly expensive when + * the keysets are simple + * + * require 'benchmark' + * include Benchmark + * + * a = (1..100000).map {rand(100000)} + * + * bm(10) do |b| + * b.report("Sort") { a.sort } + * b.report("Sort by") { a.sort_by {|a| a} } + * end + * + * <em>produces:</em> + * + * user system total real + * Sort 0.180000 0.000000 0.180000 ( 0.175469) + * Sort by 1.980000 0.040000 2.020000 ( 2.013586) + * + * However, consider the case where comparing the keys is a non-trivial + * operation. The following code sorts some files on modification time + * using the basic <code>sort</code> method. + * + * files = Dir["*"] + * sorted = files.sort {|a,b| File.new(a).mtime <=> File.new(b).mtime} + * sorted #=> ["mon", "tues", "wed", "thurs"] + * + * This sort is inefficient: it generates two new <code>File</code> + * objects during every comparison. A slightly better technique is to + * use the <code>Kernel#test</code> method to generate the modification + * times directly. + * + * files = Dir["*"] + * sorted = files.sort { |a,b| + * test(?M, a) <=> test(?M, b) + * } + * sorted #=> ["mon", "tues", "wed", "thurs"] + * + * This still generates many unnecessary <code>Time</code> objects. A + * more efficient technique is to cache the sort keys (modification + * times in this case) before the sort. Perl users often call this + * approach a Schwartzian Transform, after Randal Schwartz. We + * construct a temporary array, where each element is an array + * containing our sort key along with the filename. We sort this array, + * and then extract the filename from the result. + * + * sorted = Dir["*"].collect { |f| + * [test(?M, f), f] + * }.sort.collect { |f| f[1] } + * sorted #=> ["mon", "tues", "wed", "thurs"] + * + * This is exactly what <code>sort_by</code> does internally. + * + * sorted = Dir["*"].sort_by {|f| test(?M, f)} + * sorted #=> ["mon", "tues", "wed", "thurs"] + */ + +static VALUE +enum_sort_by(obj) + VALUE obj; +{ + VALUE ary; + long i; + + if (TYPE(obj) == T_ARRAY) { + ary = rb_ary_new2(RARRAY(obj)->len); + } + else { + ary = rb_ary_new(); + } + RBASIC(ary)->klass = 0; + rb_iterate(rb_each, obj, sort_by_i, ary); + if (RARRAY(ary)->len > 1) { + qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE), sort_by_cmp, 0); + } + if (RBASIC(ary)->klass) { + rb_raise(rb_eRuntimeError, "sort_by reentered"); + } + for (i=0; i<RARRAY(ary)->len; i++) { + RARRAY(ary)->ptr[i] = RNODE(RARRAY(ary)->ptr[i])->u2.value; + } + RBASIC(ary)->klass = rb_cArray; + return ary; +} + +static VALUE +all_iter_i(i, memo) + VALUE i; + VALUE *memo; +{ + if (!RTEST(rb_yield(i))) { + *memo = Qfalse; + rb_iter_break(); + } + return Qnil; +} + +static VALUE +all_i(i, memo) + VALUE i; + VALUE *memo; +{ + if (!RTEST(i)) { + *memo = Qfalse; + rb_iter_break(); + } + return Qnil; +} + +/* + * call-seq: + * enum.all? [{|obj| block } ] => true or false + * + * Passes each element of the collection to the given block. The method + * returns <code>true</code> if the block never returns + * <code>false</code> or <code>nil</code>. If the block is not given, + * Ruby adds an implicit block of <code>{|obj| obj}</code> (that is + * <code>all?</code> will return <code>true</code> only if none of the + * collection members are <code>false</code> or <code>nil</code>.) + * + * %w{ ant bear cat}.all? {|word| word.length >= 3} #=> true + * %w{ ant bear cat}.all? {|word| word.length >= 4} #=> false + * [ nil, true, 99 ].all? #=> false + * + */ + +static VALUE +enum_all(obj) + VALUE obj; +{ + VALUE result = Qtrue; + + rb_iterate(rb_each, obj, rb_block_given_p() ? all_iter_i : all_i, (VALUE)&result); + return result; +} + +static VALUE +any_iter_i(i, memo) + VALUE i; + VALUE *memo; +{ + if (RTEST(rb_yield(i))) { + *memo = Qtrue; + rb_iter_break(); + } + return Qnil; +} + +static VALUE +any_i(i, memo) + VALUE i; + VALUE *memo; +{ + if (RTEST(i)) { + *memo = Qtrue; + rb_iter_break(); + } + return Qnil; +} + +/* + * call-seq: + * enum.any? [{|obj| block } ] => true or false + * + * Passes each element of the collection to the given block. The method + * returns <code>true</code> if the block ever returns a value other + * than <code>false</code> or <code>nil</code>. If the block is not + * given, Ruby adds an implicit block of <code>{|obj| obj}</code> (that + * is <code>any?</code> will return <code>true</code> if at least one + * of the collection members is not <code>false</code> or + * <code>nil</code>. + * + * %w{ ant bear cat}.any? {|word| word.length >= 3} #=> true + * %w{ ant bear cat}.any? {|word| word.length >= 4} #=> true + * [ nil, true, 99 ].any? #=> true + * + */ + +static VALUE +enum_any(obj) + VALUE obj; +{ + VALUE result = Qfalse; + + rb_iterate(rb_each, obj, rb_block_given_p() ? any_iter_i : any_i, (VALUE)&result); + return result; +} + +static VALUE +min_i(i, memo) + VALUE i; + VALUE *memo; +{ + VALUE cmp; + + if (*memo == Qundef) { + *memo = i; + } + else { + cmp = rb_funcall(i, id_cmp, 1, *memo); + if (rb_cmpint(cmp, i, *memo) < 0) { + *memo = i; + } + } + return Qnil; +} + +static VALUE +min_ii(i, memo) + VALUE i; + VALUE *memo; +{ + VALUE cmp; + + if (*memo == Qundef) { + *memo = i; + } + else { + cmp = rb_yield_values(2, i, *memo); + if (rb_cmpint(cmp, i, *memo) < 0) { + *memo = i; + } + } + return Qnil; +} + + +/* + * call-seq: + * enum.min => obj + * enum.min {| a,b | block } => obj + * + * Returns the object in <i>enum</i> with the minimum value. The + * first form assumes all objects implement <code>Comparable</code>; + * the second uses the block to return <em>a <=> b</em>. + * + * a = %w(albatross dog horse) + * a.min #=> "albatross" + * a.min {|a,b| a.length <=> b.length } #=> "dog" + */ + +static VALUE +enum_min(obj) + VALUE obj; +{ + VALUE result = Qundef; + + rb_iterate(rb_each, obj, rb_block_given_p() ? min_ii : min_i, (VALUE)&result); + if (result == Qundef) return Qnil; + return result; +} + +/* + * call-seq: + * enum.max => obj + * enum.max {| a,b | block } => obj + * + * Returns the object in <i>enum</i> with the maximum value. The + * first form assumes all objects implement <code>Comparable</code>; + * the second uses the block to return <em>a <=> b</em>. + * + * a = %w(albatross dog horse) + * a.max #=> "horse" + * a.max {|a,b| a.length <=> b.length } #=> "albatross" + */ + +static VALUE +max_i(i, memo) + VALUE i; + VALUE *memo; +{ + VALUE cmp; + + if (*memo == Qundef) { + *memo = i; + } + else { + cmp = rb_funcall(i, id_cmp, 1, *memo); + if (rb_cmpint(cmp, i, *memo) > 0) { + *memo = i; + } + } + return Qnil; +} + +static VALUE +max_ii(i, memo) + VALUE i; + VALUE *memo; +{ + VALUE cmp; + + if (*memo == Qundef) { + *memo = i; + } + else { + cmp = rb_yield_values(2, i, *memo); + if (rb_cmpint(cmp, i, *memo) > 0) { + *memo = i; + } + } + return Qnil; +} + +/* + * call-seq: + * enum.max => obj + * enum.max {|a,b| block } => obj + * + * Returns the object in _enum_ with the maximum value. The + * first form assumes all objects implement <code>Comparable</code>; + * the second uses the block to return <em>a <=> b</em>. + * + * a = %w(albatross dog horse) + * a.max #=> "horse" + * a.max {|a,b| a.length <=> b.length } #=> "albatross" + */ + +static VALUE +enum_max(obj) + VALUE obj; +{ + VALUE result = Qundef; + + rb_iterate(rb_each, obj, rb_block_given_p() ? max_ii : max_i, (VALUE)&result); + if (result == Qundef) return Qnil; + return result; +} + +static VALUE +member_i(item, memo) + VALUE item; + VALUE *memo; +{ + if (rb_equal(item, memo[0])) { + memo[1] = Qtrue; + rb_iter_break(); + } + return Qnil; +} + +/* + * call-seq: + * enum.include?(obj) => true or false + * enum.member?(obj) => true or false + * + * Returns <code>true</code> if any member of <i>enum</i> equals + * <i>obj</i>. Equality is tested using <code>==</code>. + * + * IO.constants.include? "SEEK_SET" #=> true + * IO.constants.include? "SEEK_NO_FURTHER" #=> false + * + */ + +static VALUE +enum_member(obj, val) + VALUE obj, val; +{ + VALUE memo[2]; + + memo[0] = val; + memo[1] = Qfalse; + rb_iterate(rb_each, obj, member_i, (VALUE)memo); + return memo[1]; +} + +static VALUE +each_with_index_i(val, memo) + VALUE val; + VALUE *memo; +{ + rb_yield_values(2, val, INT2FIX(*memo)); + ++*memo; + return Qnil; +} + +/* + * call-seq: + * enum.each_with_index {|obj, i| block } -> enum + * + * Calls <em>block</em> with two arguments, the item and its index, for + * each item in <i>enum</i>. + * + * hash = Hash.new + * %w(cat dog wombat).each_with_index {|item, index| + * hash[item] = index + * } + * hash #=> {"cat"=>0, "wombat"=>2, "dog"=>1} + * + */ + +static VALUE +enum_each_with_index(obj) + VALUE obj; +{ + VALUE memo = 0; + + rb_need_block(); + rb_iterate(rb_each, obj, each_with_index_i, (VALUE)&memo); + return obj; +} + +static VALUE +zip_i(val, memo) + VALUE val; + VALUE *memo; +{ + VALUE result = memo[0]; + VALUE args = memo[1]; + int idx = memo[2]++; + VALUE tmp; + int i; + + tmp = rb_ary_new2(RARRAY(args)->len + 1); + rb_ary_store(tmp, 0, val); + for (i=0; i<RARRAY(args)->len; i++) { + rb_ary_push(tmp, rb_ary_entry(RARRAY(args)->ptr[i], idx)); + } + if (rb_block_given_p()) { + rb_yield(tmp); + } + else { + rb_ary_push(result, tmp); + } + return Qnil; +} + +/* + * call-seq: + * enum.zip(arg, ...) => array + * enum.zip(arg, ...) {|arr| block } => nil + * + * Converts any arguments to arrays, then merges elements of + * <i>enum</i> with corresponding elements from each argument. This + * generates a sequence of <code>enum#size</code> <em>n</em>-element + * arrays, where <em>n</em> is one more that the count of arguments. If + * the size of any argument is less than <code>enum#size</code>, + * <code>nil</code> values are supplied. If a block given, it is + * invoked for each output array, otherwise an array of arrays is + * returned. + * + * a = [ 4, 5, 6 ] + * b = [ 7, 8, 9 ] + * + * (1..3).zip(a, b) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] + * "cat\ndog".zip([1]) #=> [["cat\n", 1], ["dog", nil]] + * (1..3).zip #=> [[1], [2], [3]] + * + */ + +static VALUE +enum_zip(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + int i; + VALUE result; + VALUE memo[3]; + + for (i=0; i<argc; i++) { + argv[i] = rb_convert_type(argv[i], T_ARRAY, "Array", "to_a"); + } + result = rb_block_given_p() ? Qnil : rb_ary_new(); + memo[0] = result; + memo[1] = rb_ary_new4(argc, argv); + memo[2] = 0; + rb_iterate(rb_each, obj, zip_i, (VALUE)memo); + + return result; +} + +/* + * The <code>Enumerable</code> mixin provides collection classes with + * several traversal and searching methods, and with the ability to + * sort. The class must provide a method <code>each</code>, which + * yields successive members of the collection. If + * <code>Enumerable#max</code>, <code>#min</code>, or + * <code>#sort</code> is used, the objects in the collection must also + * implement a meaningful <code><=></code> operator, as these methods + * rely on an ordering between members of the collection. + */ + +void +Init_Enumerable() +{ + rb_mEnumerable = rb_define_module("Enumerable"); + + rb_define_method(rb_mEnumerable,"to_a", enum_to_a, 0); + rb_define_method(rb_mEnumerable,"entries", enum_to_a, 0); + + rb_define_method(rb_mEnumerable,"sort", enum_sort, 0); + rb_define_method(rb_mEnumerable,"sort_by", enum_sort_by, 0); + rb_define_method(rb_mEnumerable,"grep", enum_grep, 1); + rb_define_method(rb_mEnumerable,"find", enum_find, -1); + rb_define_method(rb_mEnumerable,"detect", enum_find, -1); + rb_define_method(rb_mEnumerable,"find_all", enum_find_all, 0); + rb_define_method(rb_mEnumerable,"select", enum_find_all, 0); + rb_define_method(rb_mEnumerable,"reject", enum_reject, 0); + rb_define_method(rb_mEnumerable,"collect", enum_collect, 0); + rb_define_method(rb_mEnumerable,"map", enum_collect, 0); + rb_define_method(rb_mEnumerable,"inject", enum_inject, -1); + rb_define_method(rb_mEnumerable,"partition", enum_partition, 0); + rb_define_method(rb_mEnumerable,"all?", enum_all, 0); + rb_define_method(rb_mEnumerable,"any?", enum_any, 0); + rb_define_method(rb_mEnumerable,"min", enum_min, 0); + rb_define_method(rb_mEnumerable,"max", enum_max, 0); + rb_define_method(rb_mEnumerable,"member?", enum_member, 1); + rb_define_method(rb_mEnumerable,"include?", enum_member, 1); + rb_define_method(rb_mEnumerable,"each_with_index", enum_each_with_index, 0); + rb_define_method(rb_mEnumerable, "zip", enum_zip, -1); + + id_eqq = rb_intern("==="); + id_each = rb_intern("each"); + id_cmp = rb_intern("<=>"); +} + +/********************************************************************** + + error.c - + + $Author: shyouhei $ + $Date: 2008-08-04 05:16:55 +0200 (Mon, 04 Aug 2008) $ + created at: Mon Aug 9 16:11:34 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "env.h" +#include "st.h" + +#include <stdio.h> +#ifdef HAVE_STDARG_PROTOTYPES +#include <stdarg.h> +#define va_init_list(a,b) va_start(a,b) +#else +#include <varargs.h> +#define va_init_list(a,b) va_start(a) +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#endif + +extern const char ruby_version[], ruby_release_date[], ruby_platform[]; + +int ruby_nerrs; + +static int +err_position(buf, len) + char *buf; + long len; +{ + ruby_set_current_source(); + if (!ruby_sourcefile) { + return 0; + } + else if (ruby_sourceline == 0) { + return snprintf(buf, len, "%s: ", ruby_sourcefile); + } + else { + return snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline); + } +} + +static void +err_snprintf(buf, len, fmt, args) + char *buf; + long len; + const char *fmt; + va_list args; +{ + long n; + + n = err_position(buf, len); + if (len > n) { + vsnprintf((char*)buf+n, len-n, fmt, args); + } +} + +static void err_append _((const char*)); +static void +err_print(fmt, args) + const char *fmt; + va_list args; +{ + char buf[BUFSIZ]; + + err_snprintf(buf, BUFSIZ, fmt, args); + err_append(buf); +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_compile_error(const char *fmt, ...) +#else +rb_compile_error(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + va_list args; + + va_init_list(args, fmt); + err_print(fmt, args); + va_end(args); + ruby_nerrs++; +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_compile_error_append(const char *fmt, ...) +#else +rb_compile_error_append(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + va_list args; + char buf[BUFSIZ]; + + va_init_list(args, fmt); + vsnprintf(buf, BUFSIZ, fmt, args); + va_end(args); + err_append(buf); +} + +static void +warn_print(fmt, args) + const char *fmt; + va_list args; +{ + char buf[BUFSIZ]; + int len; + + err_snprintf(buf, BUFSIZ, fmt, args); + len = strlen(buf); + buf[len++] = '\n'; + rb_write_error2(buf, len); +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_warn(const char *fmt, ...) +#else +rb_warn(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + char buf[BUFSIZ]; + va_list args; + + if (NIL_P(ruby_verbose)) return; + + snprintf(buf, BUFSIZ, "warning: %s", fmt); + + va_init_list(args, fmt); + warn_print(buf, args); + va_end(args); +} + +/* rb_warning() reports only in verbose mode */ +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_warning(const char *fmt, ...) +#else +rb_warning(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + char buf[BUFSIZ]; + va_list args; + + if (!RTEST(ruby_verbose)) return; + + snprintf(buf, BUFSIZ, "warning: %s", fmt); + + va_init_list(args, fmt); + warn_print(buf, args); + va_end(args); +} + +/* + * call-seq: + * warn(msg) => nil + * + * Display the given message (followed by a newline) on STDERR unless + * warnings are disabled (for example with the <code>-W0</code> flag). + */ + +static VALUE +rb_warn_m(self, mesg) + VALUE self, mesg; +{ + if (!NIL_P(ruby_verbose)) { + rb_io_write(rb_stderr, mesg); + rb_io_write(rb_stderr, rb_default_rs); + } + return Qnil; +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_bug(const char *fmt, ...) +#else +rb_bug(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + char buf[BUFSIZ]; + va_list args; + FILE *out = stderr; + int len = err_position(buf, BUFSIZ); + + if (fwrite(buf, 1, len, out) == len || + fwrite(buf, 1, len, (out = stdout)) == len) { + fputs("[BUG] ", out); + va_init_list(args, fmt); + vfprintf(out, fmt, args); + va_end(args); + fprintf(out, "\nruby %s (%s) [%s]\n\n", + ruby_version, ruby_release_date, ruby_platform); + } + abort(); +} + +static struct types { + int type; + const char *name; +} builtin_types[] = { + {T_NIL, "nil"}, + {T_OBJECT, "Object"}, + {T_CLASS, "Class"}, + {T_ICLASS, "iClass"}, /* internal use: mixed-in module holder */ + {T_MODULE, "Module"}, + {T_FLOAT, "Float"}, + {T_STRING, "String"}, + {T_REGEXP, "Regexp"}, + {T_ARRAY, "Array"}, + {T_FIXNUM, "Fixnum"}, + {T_HASH, "Hash"}, + {T_STRUCT, "Struct"}, + {T_BIGNUM, "Bignum"}, + {T_FILE, "File"}, + {T_TRUE, "true"}, + {T_FALSE, "false"}, + {T_SYMBOL, "Symbol"}, /* :symbol */ + {T_DATA, "Data"}, /* internal use: wrapped C pointers */ + {T_MATCH, "MatchData"}, /* data of $~ */ + {T_VARMAP, "Varmap"}, /* internal use: dynamic variables */ + {T_SCOPE, "Scope"}, /* internal use: variable scope */ + {T_NODE, "Node"}, /* internal use: syntax tree node */ + {T_UNDEF, "undef"}, /* internal use: #undef; should not happen */ + {-1, 0} +}; + +void +rb_check_type(x, t) + VALUE x; + int t; +{ + struct types *type = builtin_types; + + if (x == Qundef) { + rb_bug("undef leaked to the Ruby space"); + } + + if (TYPE(x) != t) { + while (type->type >= 0) { + if (type->type == t) { + char *etype; + + if (NIL_P(x)) { + etype = "nil"; + } + else if (FIXNUM_P(x)) { + etype = "Fixnum"; + } + else if (SYMBOL_P(x)) { + etype = "Symbol"; + } + else if (rb_special_const_p(x)) { + etype = RSTRING(rb_obj_as_string(x))->ptr; + } + else { + etype = rb_obj_classname(x); + } + rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", + etype, type->name); + } + type++; + } + rb_bug("unknown type 0x%x", t); + } +} + +/* exception classes */ +#include <errno.h> + +VALUE rb_eException; +VALUE rb_eSystemExit; +VALUE rb_eInterrupt; +VALUE rb_eSignal; +VALUE rb_eFatal; +VALUE rb_eStandardError; +VALUE rb_eRuntimeError; +VALUE rb_eTypeError; +VALUE rb_eArgError; +VALUE rb_eIndexError; +VALUE rb_eRangeError; +VALUE rb_eNameError; +VALUE rb_eNoMethodError; +VALUE rb_eSecurityError; +VALUE rb_eNotImpError; +VALUE rb_eNoMemError; +VALUE rb_cNameErrorMesg; + +VALUE rb_eScriptError; +VALUE rb_eSyntaxError; +VALUE rb_eLoadError; + +VALUE rb_eSystemCallError; +VALUE rb_mErrno; + +VALUE +rb_exc_new(etype, ptr, len) + VALUE etype; + const char *ptr; + long len; +{ + return rb_funcall(etype, rb_intern("new"), 1, rb_str_new(ptr, len)); +} + +VALUE +rb_exc_new2(etype, s) + VALUE etype; + const char *s; +{ + return rb_exc_new(etype, s, strlen(s)); +} + +VALUE +rb_exc_new3(etype, str) + VALUE etype, str; +{ + StringValue(str); + return rb_funcall(etype, rb_intern("new"), 1, str); +} + +/* + * call-seq: + * Exception.new(msg = nil) => exception + * + * Construct a new Exception object, optionally passing in + * a message. + */ + +static VALUE +exc_initialize(argc, argv, exc) + int argc; + VALUE *argv; + VALUE exc; +{ + VALUE arg; + + rb_scan_args(argc, argv, "01", &arg); + rb_iv_set(exc, "mesg", arg); + rb_iv_set(exc, "bt", Qnil); + + return exc; +} + +/* + * Document-method: exception + * + * call-seq: + * exc.exception(string) -> an_exception or exc + * + * With no argument, or if the argument is the same as the receiver, + * return the receiver. Otherwise, create a new + * exception object of the same class as the receiver, but with a + * message equal to <code>string.to_str</code>. + * + */ + +static VALUE +exc_exception(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + VALUE exc; + + if (argc == 0) return self; + if (argc == 1 && self == argv[0]) return self; + exc = rb_obj_clone(self); + exc_initialize(argc, argv, exc); + + return exc; +} + +/* + * call-seq: + * exception.to_s => string + * + * Returns exception's message (or the name of the exception if + * no message is set). + */ + +static VALUE +exc_to_s(exc) + VALUE exc; +{ + VALUE mesg = rb_attr_get(exc, rb_intern("mesg")); + + if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc)); + if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg); + return mesg; +} + +/* + * call-seq: + * exception.message => string + * exception.to_str => string + * + * Returns the result of invoking <code>exception.to_s</code>. + * Normally this returns the exception's message or name. By + * supplying a to_str method, exceptions are agreeing to + * be used where Strings are expected. + */ + +static VALUE +exc_to_str(exc) + VALUE exc; +{ + return rb_funcall(exc, rb_intern("to_s"), 0, 0); +} + +/* + * call-seq: + * exception.inspect => string + * + * Return this exception's class name an message + */ + +static VALUE +exc_inspect(exc) + VALUE exc; +{ + VALUE str, klass; + + klass = CLASS_OF(exc); + exc = rb_obj_as_string(exc); + if (RSTRING(exc)->len == 0) { + return rb_str_dup(rb_class_name(klass)); + } + + str = rb_str_buf_new2("#<"); + klass = rb_class_name(klass); + rb_str_buf_append(str, klass); + rb_str_buf_cat(str, ": ", 2); + rb_str_buf_append(str, exc); + rb_str_buf_cat(str, ">", 1); + + return str; +} + +/* + * call-seq: + * exception.backtrace => array + * + * Returns any backtrace associated with the exception. The backtrace + * is an array of strings, each containing either ``filename:lineNo: in + * `method''' or ``filename:lineNo.'' + * + * def a + * raise "boom" + * end + * + * def b + * a() + * end + * + * begin + * b() + * rescue => detail + * print detail.backtrace.join("\n") + * end + * + * <em>produces:</em> + * + * prog.rb:2:in `a' + * prog.rb:6:in `b' + * prog.rb:10 +*/ + +static VALUE +exc_backtrace(exc) + VALUE exc; +{ + static ID bt; + + if (!bt) bt = rb_intern("bt"); + return rb_attr_get(exc, bt); +} + +VALUE +rb_check_backtrace(bt) + VALUE bt; +{ + long i; + static char *err = "backtrace must be Array of String"; + + if (!NIL_P(bt)) { + int t = TYPE(bt); + + if (t == T_STRING) return rb_ary_new3(1, bt); + if (t != T_ARRAY) { + rb_raise(rb_eTypeError, err); + } + for (i=0;i<RARRAY(bt)->len;i++) { + if (TYPE(RARRAY(bt)->ptr[i]) != T_STRING) { + rb_raise(rb_eTypeError, err); + } + } + } + return bt; +} + +/* + * call-seq: + * exc.set_backtrace(array) => array + * + * Sets the backtrace information associated with <i>exc</i>. The + * argument must be an array of <code>String</code> objects in the + * format described in <code>Exception#backtrace</code>. + * + */ + +static VALUE +exc_set_backtrace(exc, bt) + VALUE exc; + VALUE bt; +{ + return rb_iv_set(exc, "bt", rb_check_backtrace(bt)); +} + +/* + * call-seq: + * SystemExit.new(status=0) => system_exit + * + * Create a new +SystemExit+ exception with the given status. + */ + +static VALUE +exit_initialize(argc, argv, exc) + int argc; + VALUE *argv; + VALUE exc; +{ + VALUE status = INT2FIX(EXIT_SUCCESS); + if (argc > 0 && FIXNUM_P(argv[0])) { + status = *argv++; + --argc; + } + rb_call_super(argc, argv); + rb_iv_set(exc, "status", status); + return exc; +} + + +/* + * call-seq: + * system_exit.status => fixnum + * + * Return the status value associated with this system exit. + */ + +static VALUE +exit_status(exc) + VALUE exc; +{ + return rb_attr_get(exc, rb_intern("status")); +} + + +/* + * call-seq: + * system_exit.success? => true or false + * + * Returns +true+ if exiting successful, +false+ if not. + */ + +static VALUE +exit_success_p(exc) + VALUE exc; +{ + VALUE status = rb_attr_get(exc, rb_intern("status")); + if (NIL_P(status)) return Qtrue; + if (status == INT2FIX(EXIT_SUCCESS)) return Qtrue; + return Qfalse; +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_name_error(ID id, const char *fmt, ...) +#else +rb_name_error(id, fmt, va_alist) + ID id; + const char *fmt; + va_dcl +#endif +{ + VALUE exc, argv[2]; + va_list args; + char buf[BUFSIZ]; + + va_init_list(args, fmt); + vsnprintf(buf, BUFSIZ, fmt, args); + va_end(args); + + argv[0] = rb_str_new2(buf); + argv[1] = ID2SYM(id); + exc = rb_class_new_instance(2, argv, rb_eNameError); + rb_exc_raise(exc); +} + +/* + * call-seq: + * NameError.new(msg [, name]) => name_error + * + * Construct a new NameError exception. If given the <i>name</i> + * parameter may subsequently be examined using the <code>NameError.name</code> + * method. + */ + +static VALUE +name_err_initialize(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + VALUE name; + + name = (argc > 1) ? argv[--argc] : Qnil; + rb_call_super(argc, argv); + rb_iv_set(self, "name", name); + return self; +} + +/* + * call-seq: + * name_error.name => string or nil + * + * Return the name associated with this NameError exception. + */ + +static VALUE +name_err_name(self) + VALUE self; +{ + return rb_attr_get(self, rb_intern("name")); +} + +/* + * call-seq: + * name_error.to_s => string + * + * Produce a nicely-formated string representing the +NameError+. + */ + +static VALUE +name_err_to_s(exc) + VALUE exc; +{ + VALUE mesg = rb_attr_get(exc, rb_intern("mesg")), str = mesg; + + if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc)); + StringValue(str); + if (str != mesg) { + rb_iv_set(exc, "mesg", mesg = str); + } + if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg); + return mesg; +} + +/* + * call-seq: + * NoMethodError.new(msg, name [, args]) => no_method_error + * + * Construct a NoMethodError exception for a method of the given name + * called with the given arguments. The name may be accessed using + * the <code>#name</code> method on the resulting object, and the + * arguments using the <code>#args</code> method. + */ + +static VALUE +nometh_err_initialize(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + VALUE args = (argc > 2) ? argv[--argc] : Qnil; + name_err_initialize(argc, argv, self); + rb_iv_set(self, "args", args); + return self; +} + +/* :nodoc: */ +static void +name_err_mesg_mark(ptr) + VALUE *ptr; +{ + rb_gc_mark_locations(ptr, ptr+3); +} + +/* :nodoc: */ +static VALUE +name_err_mesg_new(obj, mesg, recv, method) + VALUE obj, mesg, recv, method; +{ + VALUE *ptr = ALLOC_N(VALUE, 3); + + ptr[0] = mesg; + ptr[1] = recv; + ptr[2] = method; + return Data_Wrap_Struct(rb_cNameErrorMesg, name_err_mesg_mark, -1, ptr); +} + +/* :nodoc: */ +static VALUE +name_err_mesg_to_str(obj) + VALUE obj; +{ + VALUE *ptr, mesg; + Data_Get_Struct(obj, VALUE, ptr); + + mesg = ptr[0]; + if (NIL_P(mesg)) return Qnil; + else { + char *desc = 0; + VALUE d = 0, args[3]; + + obj = ptr[1]; + switch (TYPE(obj)) { + case T_NIL: + desc = "nil"; + break; + case T_TRUE: + desc = "true"; + break; + case T_FALSE: + desc = "false"; + break; + default: + d = rb_protect(rb_inspect, obj, 0); + if (NIL_P(d) || RSTRING(d)->len > 65) { + d = rb_any_to_s(obj); + } + desc = RSTRING(d)->ptr; + break; + } + if (desc && desc[0] != '#') { + d = rb_str_new2(desc); + rb_str_cat2(d, ":"); + rb_str_cat2(d, rb_obj_classname(obj)); + } + args[0] = mesg; + args[1] = ptr[2]; + args[2] = d; + mesg = rb_f_sprintf(3, args); + } + if (OBJ_TAINTED(obj)) OBJ_TAINT(mesg); + return mesg; +} + +/* :nodoc: */ +static VALUE +name_err_mesg_load(klass, str) + VALUE klass, str; +{ + return str; +} + +/* + * call-seq: + * no_method_error.args => obj + * + * Return the arguments passed in as the third parameter to + * the constructor. + */ + +static VALUE +nometh_err_args(self) + VALUE self; +{ + return rb_attr_get(self, rb_intern("args")); +} + +void +rb_invalid_str(str, type) + const char *str, *type; +{ + VALUE s = rb_str_inspect(rb_str_new2(str)); + + rb_raise(rb_eArgError, "invalid value for %s: %s", type, RSTRING(s)->ptr); +} + +/* + * Document-module: Errno + * + * Ruby exception objects are subclasses of <code>Exception</code>. + * However, operating systems typically report errors using plain + * integers. Module <code>Errno</code> is created dynamically to map + * these operating system errors to Ruby classes, with each error + * number generating its own subclass of <code>SystemCallError</code>. + * As the subclass is created in module <code>Errno</code>, its name + * will start <code>Errno::</code>. + * + * The names of the <code>Errno::</code> classes depend on + * the environment in which Ruby runs. On a typical Unix or Windows + * platform, there are <code>Errno</code> classes such as + * <code>Errno::EACCES</code>, <code>Errno::EAGAIN</code>, + * <code>Errno::EINTR</code>, and so on. + * + * The integer operating system error number corresponding to a + * particular error is available as the class constant + * <code>Errno::</code><em>error</em><code>::Errno</code>. + * + * Errno::EACCES::Errno #=> 13 + * Errno::EAGAIN::Errno #=> 11 + * Errno::EINTR::Errno #=> 4 + * + * The full list of operating system errors on your particular platform + * are available as the constants of <code>Errno</code>. + * + * Errno.constants #=> E2BIG, EACCES, EADDRINUSE, EADDRNOTAVAIL, ... + */ + +static st_table *syserr_tbl; + +static VALUE +set_syserr(n, name) + int n; + const char *name; +{ + VALUE error; + + if (!st_lookup(syserr_tbl, n, &error)) { + error = rb_define_class_under(rb_mErrno, name, rb_eSystemCallError); + rb_define_const(error, "Errno", INT2NUM(n)); + st_add_direct(syserr_tbl, n, error); + } + else { + rb_define_const(rb_mErrno, name, error); + } + return error; +} + +static VALUE +get_syserr(n) + int n; +{ + VALUE error; + + if (!st_lookup(syserr_tbl, n, &error)) { + char name[8]; /* some Windows' errno have 5 digits. */ + + snprintf(name, sizeof(name), "E%03d", n); + error = set_syserr(n, name); + } + return error; +} + +/* + * call-seq: + * SystemCallError.new(msg, errno) => system_call_error_subclass + * + * If _errno_ corresponds to a known system error code, constructs + * the appropriate <code>Errno</code> class for that error, otherwise + * constructs a generic <code>SystemCallError</code> object. The + * error number is subsequently available via the <code>errno</code> + * method. + */ + +static VALUE +syserr_initialize(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ +#if !defined(_WIN32) && !defined(__VMS) + char *strerror(); +#endif + char *err; + VALUE mesg, error; + VALUE klass = rb_obj_class(self); + + if (klass == rb_eSystemCallError) { + rb_scan_args(argc, argv, "11", &mesg, &error); + if (argc == 1 && FIXNUM_P(mesg)) { + error = mesg; mesg = Qnil; + } + if (!NIL_P(error) && st_lookup(syserr_tbl, NUM2LONG(error), &klass)) { + /* change class */ + if (TYPE(self) != T_OBJECT) { /* insurance to avoid type crash */ + rb_raise(rb_eTypeError, "invalid instance type"); + } + RBASIC(self)->klass = klass; + } + } + else { + rb_scan_args(argc, argv, "01", &mesg); + error = rb_const_get(klass, rb_intern("Errno")); + } + if (!NIL_P(error)) err = strerror(NUM2LONG(error)); + else err = "unknown error"; + if (!NIL_P(mesg)) { + VALUE str = mesg; + size_t len; + + StringValue(str); + len = strlen(err)+RSTRING(str)->len+3; + mesg = rb_str_new(0, len); + snprintf(RSTRING(mesg)->ptr, len+1, "%s - %.*s", err, + (int)RSTRING(str)->len, RSTRING(str)->ptr); + rb_str_resize(mesg, strlen(RSTRING(mesg)->ptr)); + } + else { + mesg = rb_str_new2(err); + } + rb_call_super(1, &mesg); + rb_iv_set(self, "errno", error); + return self; +} + +/* + * call-seq: + * system_call_error.errno => fixnum + * + * Return this SystemCallError's error number. + */ + +static VALUE +syserr_errno(self) + VALUE self; +{ + return rb_attr_get(self, rb_intern("errno")); +} + +/* + * call-seq: + * system_call_error === other => true or false + * + * Return +true+ if the receiver is a generic +SystemCallError+, or + * if the error numbers _self_ and _other_ are the same. + */ + + +static VALUE +syserr_eqq(self, exc) + VALUE self, exc; +{ + VALUE num, e; + + if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) return Qfalse; + if (self == rb_eSystemCallError) return Qtrue; + + num = rb_attr_get(exc, rb_intern("errno")); + if (NIL_P(num)) { + VALUE klass = CLASS_OF(exc); + + while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) { + klass = (VALUE)RCLASS(klass)->super; + } + num = rb_const_get(klass, rb_intern("Errno")); + } + e = rb_const_get(self, rb_intern("Errno")); + if (FIXNUM_P(num) ? num == e : rb_equal(num, e)) + return Qtrue; + return Qfalse; +} + +/* + * Descendents of class <code>Exception</code> are used to communicate + * between <code>raise</code> methods and <code>rescue</code> + * statements in <code>begin/end</code> blocks. <code>Exception</code> + * objects carry information about the exception---its type (the + * exception's class name), an optional descriptive string, and + * optional traceback information. Programs may subclass + * <code>Exception</code> to add additional information. + */ + +void +Init_Exception() +{ + rb_eException = rb_define_class("Exception", rb_cObject); + rb_define_singleton_method(rb_eException, "exception", rb_class_new_instance, -1); + rb_define_method(rb_eException, "exception", exc_exception, -1); + rb_define_method(rb_eException, "initialize", exc_initialize, -1); + rb_define_method(rb_eException, "to_s", exc_to_s, 0); + rb_define_method(rb_eException, "to_str", exc_to_str, 0); + rb_define_method(rb_eException, "message", exc_to_str, 0); + rb_define_method(rb_eException, "inspect", exc_inspect, 0); + rb_define_method(rb_eException, "backtrace", exc_backtrace, 0); + rb_define_method(rb_eException, "set_backtrace", exc_set_backtrace, 1); + + rb_eSystemExit = rb_define_class("SystemExit", rb_eException); + rb_define_method(rb_eSystemExit, "initialize", exit_initialize, -1); + rb_define_method(rb_eSystemExit, "status", exit_status, 0); + rb_define_method(rb_eSystemExit, "success?", exit_success_p, 0); + + rb_eFatal = rb_define_class("fatal", rb_eException); + rb_eSignal = rb_define_class("SignalException", rb_eException); + rb_eInterrupt = rb_define_class("Interrupt", rb_eSignal); + + rb_eStandardError = rb_define_class("StandardError", rb_eException); + rb_eTypeError = rb_define_class("TypeError", rb_eStandardError); + rb_eArgError = rb_define_class("ArgumentError", rb_eStandardError); + rb_eIndexError = rb_define_class("IndexError", rb_eStandardError); + rb_eRangeError = rb_define_class("RangeError", rb_eStandardError); + rb_eNameError = rb_define_class("NameError", rb_eStandardError); + rb_define_method(rb_eNameError, "initialize", name_err_initialize, -1); + rb_define_method(rb_eNameError, "name", name_err_name, 0); + rb_define_method(rb_eNameError, "to_s", name_err_to_s, 0); + rb_cNameErrorMesg = rb_define_class_under(rb_eNameError, "message", rb_cData); + rb_define_singleton_method(rb_cNameErrorMesg, "!", name_err_mesg_new, 3); + rb_define_method(rb_cNameErrorMesg, "to_str", name_err_mesg_to_str, 0); + rb_define_method(rb_cNameErrorMesg, "_dump", name_err_mesg_to_str, 1); + rb_define_singleton_method(rb_cNameErrorMesg, "_load", name_err_mesg_load, 1); + rb_eNoMethodError = rb_define_class("NoMethodError", rb_eNameError); + rb_define_method(rb_eNoMethodError, "initialize", nometh_err_initialize, -1); + rb_define_method(rb_eNoMethodError, "args", nometh_err_args, 0); + + rb_eScriptError = rb_define_class("ScriptError", rb_eException); + rb_eSyntaxError = rb_define_class("SyntaxError", rb_eScriptError); + rb_eLoadError = rb_define_class("LoadError", rb_eScriptError); + rb_eNotImpError = rb_define_class("NotImplementedError", rb_eScriptError); + + rb_eRuntimeError = rb_define_class("RuntimeError", rb_eStandardError); + rb_eSecurityError = rb_define_class("SecurityError", rb_eStandardError); + rb_eNoMemError = rb_define_class("NoMemoryError", rb_eException); + + syserr_tbl = st_init_numtable(); + rb_eSystemCallError = rb_define_class("SystemCallError", rb_eStandardError); + rb_define_method(rb_eSystemCallError, "initialize", syserr_initialize, -1); + rb_define_method(rb_eSystemCallError, "errno", syserr_errno, 0); + rb_define_singleton_method(rb_eSystemCallError, "===", syserr_eqq, 1); + + rb_mErrno = rb_define_module("Errno"); + + rb_define_global_function("warn", rb_warn_m, 1); +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_raise(VALUE exc, const char *fmt, ...) +#else +rb_raise(exc, fmt, va_alist) + VALUE exc; + const char *fmt; + va_dcl +#endif +{ + va_list args; + char buf[BUFSIZ]; + + va_init_list(args,fmt); + vsnprintf(buf, BUFSIZ, fmt, args); + va_end(args); + rb_exc_raise(rb_exc_new2(exc, buf)); +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_loaderror(const char *fmt, ...) +#else +rb_loaderror(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + va_list args; + char buf[BUFSIZ]; + + va_init_list(args, fmt); + vsnprintf(buf, BUFSIZ, fmt, args); + va_end(args); + rb_exc_raise(rb_exc_new2(rb_eLoadError, buf)); +} + +void +rb_notimplement() +{ + rb_raise(rb_eNotImpError, + "%s() function is unimplemented on this machine", + rb_id2name(ruby_frame->last_func)); +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_fatal(const char *fmt, ...) +#else +rb_fatal(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + va_list args; + char buf[BUFSIZ]; + + va_init_list(args, fmt); + vsnprintf(buf, BUFSIZ, fmt, args); + va_end(args); + + ruby_in_eval = 0; + rb_exc_fatal(rb_exc_new2(rb_eFatal, buf)); +} + +void +rb_sys_fail(mesg) + const char *mesg; +{ + int n = errno; + VALUE arg; + + errno = 0; + if (n == 0) { + rb_bug("rb_sys_fail(%s) - errno == 0", mesg ? mesg : ""); + } + + arg = mesg ? rb_str_new2(mesg) : Qnil; + rb_exc_raise(rb_class_new_instance(1, &arg, get_syserr(n))); +} + +void +#ifdef HAVE_STDARG_PROTOTYPES +rb_sys_warning(const char *fmt, ...) +#else +rb_sys_warning(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + char buf[BUFSIZ]; + va_list args; + int errno_save; + + errno_save = errno; + + if (!RTEST(ruby_verbose)) return; + + snprintf(buf, BUFSIZ, "warning: %s", fmt); + snprintf(buf+strlen(buf), BUFSIZ-strlen(buf), ": %s", strerror(errno_save)); + + va_init_list(args, fmt); + warn_print(buf, args); + va_end(args); + errno = errno_save; +} + +void +rb_load_fail(path) + const char *path; +{ + rb_loaderror("%s -- %s", strerror(errno), path); +} + +void +rb_error_frozen(what) + const char *what; +{ + rb_raise(rb_eTypeError, "can't modify frozen %s", what); +} + +void +rb_check_frozen(obj) + VALUE obj; +{ + if (OBJ_FROZEN(obj)) rb_error_frozen(rb_obj_classname(obj)); +} + +void +Init_syserr() +{ +#ifdef EPERM + set_syserr(EPERM, "EPERM"); +#endif +#ifdef ENOENT + set_syserr(ENOENT, "ENOENT"); +#endif +#ifdef ESRCH + set_syserr(ESRCH, "ESRCH"); +#endif +#ifdef EINTR + set_syserr(EINTR, "EINTR"); +#endif +#ifdef EIO + set_syserr(EIO, "EIO"); +#endif +#ifdef ENXIO + set_syserr(ENXIO, "ENXIO"); +#endif +#ifdef E2BIG + set_syserr(E2BIG, "E2BIG"); +#endif +#ifdef ENOEXEC + set_syserr(ENOEXEC, "ENOEXEC"); +#endif +#ifdef EBADF + set_syserr(EBADF, "EBADF"); +#endif +#ifdef ECHILD + set_syserr(ECHILD, "ECHILD"); +#endif +#ifdef EAGAIN + set_syserr(EAGAIN, "EAGAIN"); +#endif +#ifdef ENOMEM + set_syserr(ENOMEM, "ENOMEM"); +#endif +#ifdef EACCES + set_syserr(EACCES, "EACCES"); +#endif +#ifdef EFAULT + set_syserr(EFAULT, "EFAULT"); +#endif +#ifdef ENOTBLK + set_syserr(ENOTBLK, "ENOTBLK"); +#endif +#ifdef EBUSY + set_syserr(EBUSY, "EBUSY"); +#endif +#ifdef EEXIST + set_syserr(EEXIST, "EEXIST"); +#endif +#ifdef EXDEV + set_syserr(EXDEV, "EXDEV"); +#endif +#ifdef ENODEV + set_syserr(ENODEV, "ENODEV"); +#endif +#ifdef ENOTDIR + set_syserr(ENOTDIR, "ENOTDIR"); +#endif +#ifdef EISDIR + set_syserr(EISDIR, "EISDIR"); +#endif +#ifdef EINVAL + set_syserr(EINVAL, "EINVAL"); +#endif +#ifdef ENFILE + set_syserr(ENFILE, "ENFILE"); +#endif +#ifdef EMFILE + set_syserr(EMFILE, "EMFILE"); +#endif +#ifdef ENOTTY + set_syserr(ENOTTY, "ENOTTY"); +#endif +#ifdef ETXTBSY + set_syserr(ETXTBSY, "ETXTBSY"); +#endif +#ifdef EFBIG + set_syserr(EFBIG, "EFBIG"); +#endif +#ifdef ENOSPC + set_syserr(ENOSPC, "ENOSPC"); +#endif +#ifdef ESPIPE + set_syserr(ESPIPE, "ESPIPE"); +#endif +#ifdef EROFS + set_syserr(EROFS, "EROFS"); +#endif +#ifdef EMLINK + set_syserr(EMLINK, "EMLINK"); +#endif +#ifdef EPIPE + set_syserr(EPIPE, "EPIPE"); +#endif +#ifdef EDOM + set_syserr(EDOM, "EDOM"); +#endif +#ifdef ERANGE + set_syserr(ERANGE, "ERANGE"); +#endif +#ifdef EDEADLK + set_syserr(EDEADLK, "EDEADLK"); +#endif +#ifdef ENAMETOOLONG + set_syserr(ENAMETOOLONG, "ENAMETOOLONG"); +#endif +#ifdef ENOLCK + set_syserr(ENOLCK, "ENOLCK"); +#endif +#ifdef ENOSYS + set_syserr(ENOSYS, "ENOSYS"); +#endif +#ifdef ENOTEMPTY + set_syserr(ENOTEMPTY, "ENOTEMPTY"); +#endif +#ifdef ELOOP + set_syserr(ELOOP, "ELOOP"); +#endif +#ifdef EWOULDBLOCK + set_syserr(EWOULDBLOCK, "EWOULDBLOCK"); +#endif +#ifdef ENOMSG + set_syserr(ENOMSG, "ENOMSG"); +#endif +#ifdef EIDRM + set_syserr(EIDRM, "EIDRM"); +#endif +#ifdef ECHRNG + set_syserr(ECHRNG, "ECHRNG"); +#endif +#ifdef EL2NSYNC + set_syserr(EL2NSYNC, "EL2NSYNC"); +#endif +#ifdef EL3HLT + set_syserr(EL3HLT, "EL3HLT"); +#endif +#ifdef EL3RST + set_syserr(EL3RST, "EL3RST"); +#endif +#ifdef ELNRNG + set_syserr(ELNRNG, "ELNRNG"); +#endif +#ifdef EUNATCH + set_syserr(EUNATCH, "EUNATCH"); +#endif +#ifdef ENOCSI + set_syserr(ENOCSI, "ENOCSI"); +#endif +#ifdef EL2HLT + set_syserr(EL2HLT, "EL2HLT"); +#endif +#ifdef EBADE + set_syserr(EBADE, "EBADE"); +#endif +#ifdef EBADR + set_syserr(EBADR, "EBADR"); +#endif +#ifdef EXFULL + set_syserr(EXFULL, "EXFULL"); +#endif +#ifdef ENOANO + set_syserr(ENOANO, "ENOANO"); +#endif +#ifdef EBADRQC + set_syserr(EBADRQC, "EBADRQC"); +#endif +#ifdef EBADSLT + set_syserr(EBADSLT, "EBADSLT"); +#endif +#ifdef EDEADLOCK + set_syserr(EDEADLOCK, "EDEADLOCK"); +#endif +#ifdef EBFONT + set_syserr(EBFONT, "EBFONT"); +#endif +#ifdef ENOSTR + set_syserr(ENOSTR, "ENOSTR"); +#endif +#ifdef ENODATA + set_syserr(ENODATA, "ENODATA"); +#endif +#ifdef ETIME + set_syserr(ETIME, "ETIME"); +#endif +#ifdef ENOSR + set_syserr(ENOSR, "ENOSR"); +#endif +#ifdef ENONET + set_syserr(ENONET, "ENONET"); +#endif +#ifdef ENOPKG + set_syserr(ENOPKG, "ENOPKG"); +#endif +#ifdef EREMOTE + set_syserr(EREMOTE, "EREMOTE"); +#endif +#ifdef ENOLINK + set_syserr(ENOLINK, "ENOLINK"); +#endif +#ifdef EADV + set_syserr(EADV, "EADV"); +#endif +#ifdef ESRMNT + set_syserr(ESRMNT, "ESRMNT"); +#endif +#ifdef ECOMM + set_syserr(ECOMM, "ECOMM"); +#endif +#ifdef EPROTO + set_syserr(EPROTO, "EPROTO"); +#endif +#ifdef EMULTIHOP + set_syserr(EMULTIHOP, "EMULTIHOP"); +#endif +#ifdef EDOTDOT + set_syserr(EDOTDOT, "EDOTDOT"); +#endif +#ifdef EBADMSG + set_syserr(EBADMSG, "EBADMSG"); +#endif +#ifdef EOVERFLOW + set_syserr(EOVERFLOW, "EOVERFLOW"); +#endif +#ifdef ENOTUNIQ + set_syserr(ENOTUNIQ, "ENOTUNIQ"); +#endif +#ifdef EBADFD + set_syserr(EBADFD, "EBADFD"); +#endif +#ifdef EREMCHG + set_syserr(EREMCHG, "EREMCHG"); +#endif +#ifdef ELIBACC + set_syserr(ELIBACC, "ELIBACC"); +#endif +#ifdef ELIBBAD + set_syserr(ELIBBAD, "ELIBBAD"); +#endif +#ifdef ELIBSCN + set_syserr(ELIBSCN, "ELIBSCN"); +#endif +#ifdef ELIBMAX + set_syserr(ELIBMAX, "ELIBMAX"); +#endif +#ifdef ELIBEXEC + set_syserr(ELIBEXEC, "ELIBEXEC"); +#endif +#ifdef EILSEQ + set_syserr(EILSEQ, "EILSEQ"); +#endif +#ifdef ERESTART + set_syserr(ERESTART, "ERESTART"); +#endif +#ifdef ESTRPIPE + set_syserr(ESTRPIPE, "ESTRPIPE"); +#endif +#ifdef EUSERS + set_syserr(EUSERS, "EUSERS"); +#endif +#ifdef ENOTSOCK + set_syserr(ENOTSOCK, "ENOTSOCK"); +#endif +#ifdef EDESTADDRREQ + set_syserr(EDESTADDRREQ, "EDESTADDRREQ"); +#endif +#ifdef EMSGSIZE + set_syserr(EMSGSIZE, "EMSGSIZE"); +#endif +#ifdef EPROTOTYPE + set_syserr(EPROTOTYPE, "EPROTOTYPE"); +#endif +#ifdef ENOPROTOOPT + set_syserr(ENOPROTOOPT, "ENOPROTOOPT"); +#endif +#ifdef EPROTONOSUPPORT + set_syserr(EPROTONOSUPPORT, "EPROTONOSUPPORT"); +#endif +#ifdef ESOCKTNOSUPPORT + set_syserr(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT"); +#endif +#ifdef EOPNOTSUPP + set_syserr(EOPNOTSUPP, "EOPNOTSUPP"); +#endif +#ifdef EPFNOSUPPORT + set_syserr(EPFNOSUPPORT, "EPFNOSUPPORT"); +#endif +#ifdef EAFNOSUPPORT + set_syserr(EAFNOSUPPORT, "EAFNOSUPPORT"); +#endif +#ifdef EADDRINUSE + set_syserr(EADDRINUSE, "EADDRINUSE"); +#endif +#ifdef EADDRNOTAVAIL + set_syserr(EADDRNOTAVAIL, "EADDRNOTAVAIL"); +#endif +#ifdef ENETDOWN + set_syserr(ENETDOWN, "ENETDOWN"); +#endif +#ifdef ENETUNREACH + set_syserr(ENETUNREACH, "ENETUNREACH"); +#endif +#ifdef ENETRESET + set_syserr(ENETRESET, "ENETRESET"); +#endif +#ifdef ECONNABORTED + set_syserr(ECONNABORTED, "ECONNABORTED"); +#endif +#ifdef ECONNRESET + set_syserr(ECONNRESET, "ECONNRESET"); +#endif +#ifdef ENOBUFS + set_syserr(ENOBUFS, "ENOBUFS"); +#endif +#ifdef EISCONN + set_syserr(EISCONN, "EISCONN"); +#endif +#ifdef ENOTCONN + set_syserr(ENOTCONN, "ENOTCONN"); +#endif +#ifdef ESHUTDOWN + set_syserr(ESHUTDOWN, "ESHUTDOWN"); +#endif +#ifdef ETOOMANYREFS + set_syserr(ETOOMANYREFS, "ETOOMANYREFS"); +#endif +#ifdef ETIMEDOUT + set_syserr(ETIMEDOUT, "ETIMEDOUT"); +#endif +#ifdef ECONNREFUSED + set_syserr(ECONNREFUSED, "ECONNREFUSED"); +#endif +#ifdef EHOSTDOWN + set_syserr(EHOSTDOWN, "EHOSTDOWN"); +#endif +#ifdef EHOSTUNREACH + set_syserr(EHOSTUNREACH, "EHOSTUNREACH"); +#endif +#ifdef EALREADY + set_syserr(EALREADY, "EALREADY"); +#endif +#ifdef EINPROGRESS + set_syserr(EINPROGRESS, "EINPROGRESS"); +#endif +#ifdef ESTALE + set_syserr(ESTALE, "ESTALE"); +#endif +#ifdef EUCLEAN + set_syserr(EUCLEAN, "EUCLEAN"); +#endif +#ifdef ENOTNAM + set_syserr(ENOTNAM, "ENOTNAM"); +#endif +#ifdef ENAVAIL + set_syserr(ENAVAIL, "ENAVAIL"); +#endif +#ifdef EISNAM + set_syserr(EISNAM, "EISNAM"); +#endif +#ifdef EREMOTEIO + set_syserr(EREMOTEIO, "EREMOTEIO"); +#endif +#ifdef EDQUOT + set_syserr(EDQUOT, "EDQUOT"); +#endif +} + +static void +err_append(s) + const char *s; +{ + extern VALUE ruby_errinfo; + + if (ruby_in_eval) { + if (NIL_P(ruby_errinfo)) { + ruby_errinfo = rb_exc_new2(rb_eSyntaxError, s); + } + else { + VALUE str = rb_obj_as_string(ruby_errinfo); + + rb_str_cat2(str, "\n"); + rb_str_cat2(str, s); + ruby_errinfo = rb_exc_new3(rb_eSyntaxError, str); + } + } + else { + rb_write_error(s); + rb_write_error("\n"); + } +} +/********************************************************************** + + eval.c - + + $Author: wyhaines $ + $Date: 2009-08-20 19:22:00 +0200 (Thu, 20 Aug 2009) $ + created at: Thu Jun 10 14:22:17 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "node.h" +#include "env.h" +#include "util.h" +#include "rubysig.h" + +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#endif +#ifndef EXIT_FAILURE +#define EXIT_FAILURE 1 +#endif + +#include <stdio.h> + +#include "st.h" +#include "dln.h" + +#ifdef __APPLE__ +#include <crt_externs.h> +#endif + +/* Make alloca work the best possible way. */ +#ifdef __GNUC__ +# ifndef atarist +# ifndef alloca +# define alloca __builtin_alloca +# endif +# endif /* atarist */ +#else +# ifdef HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifndef _AIX +# ifndef alloca /* predefined by HP cc +Olibcalls */ +void *alloca (); +# endif +# endif /* AIX */ +# endif /* HAVE_ALLOCA_H */ +#endif /* __GNUC__ */ + +#ifdef HAVE_STDARG_PROTOTYPES +#include <stdarg.h> +#define va_init_list(a,b) va_start(a,b) +#else +#include <varargs.h> +#define va_init_list(a,b) va_start(a) +#endif + +#ifndef HAVE_STRING_H +char *strrchr _((const char*,const char)); +#endif + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#include <time.h> + +#if defined(HAVE_FCNTL_H) || defined(_WIN32) +#include <fcntl.h> +#elif defined(HAVE_SYS_FCNTL_H) +#include <sys/fcntl.h> +#endif +#ifdef __CYGWIN__ +#include <io.h> +#endif + +#if defined(__BEOS__) && !defined(BONE) +#include <net/socket.h> +#endif + +#ifdef __MACOS__ +#include "macruby_private.h" +#endif + +#ifdef __VMS +#include "vmsruby_private.h" +#endif + +#ifdef USE_CONTEXT + +NORETURN(static void rb_jump_context(rb_jmpbuf_t, int)); +static inline void +rb_jump_context(env, val) + rb_jmpbuf_t env; + int val; +{ + env->status = val; + setcontext(&env->context); + abort(); /* ensure noreturn */ +} +/* + * PRE_GETCONTEXT and POST_GETCONTEXT is a magic for getcontext, gcc, + * IA64 register stack and SPARC register window combination problem. + * + * Assume following code sequence. + * + * 1. set a register in the register stack/window such as r32/l0. + * 2. call getcontext. + * 3. use the register. + * 4. update the register for other use. + * 5. call setcontext indirectly (or directly). + * + * This code should be run as 1->2->3->4->5->3->4. + * But after second getcontext return (second 3), + * the register is broken (updated). + * It's because getcontext/setcontext doesn't preserve the content of the + * register stack/window. + * + * setjmp also doesn't preserve the content of the register stack/window. + * But it has not the problem because gcc knows setjmp may return twice. + * gcc detects setjmp and generates setjmp safe code. + * + * So setjmp calls before and after the getcontext call makes the code + * somewhat safe. + * It fix the problem on IA64. + * It is not required that setjmp is called at run time, since the problem is + * register usage. + * + * Since the magic setjmp is not enough for SPARC, + * inline asm is used to prohibit registers in register windows. + * + * Since the problem is fixed at gcc 4.0.3, the magic is applied only for + * prior versions of gcc. + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21957 + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22127 + */ +# define GCC_VERSION_BEFORE(major, minor, patchlevel) \ + (defined(__GNUC__) && !defined(__INTEL_COMPILER) && \ + ((__GNUC__ < (major)) || \ + (__GNUC__ == (major) && __GNUC_MINOR__ < (minor)) || \ + (__GNUC__ == (major) && __GNUC_MINOR__ == (minor) && __GNUC_PATCHLEVEL__ < (patchlevel)))) +# if GCC_VERSION_BEFORE(4,0,3) && (defined(sparc) || defined(__sparc__)) +# ifdef __pic__ +/* + * %l7 is excluded for PIC because it is PIC register. + * http://lists.freebsd.org/pipermail/freebsd-sparc64/2006-January/003739.html + */ +# define PRE_GETCONTEXT \ + ({ __asm__ volatile ("" : : : \ + "%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7", \ + "%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", \ + "%i0", "%i1", "%i2", "%i3", "%i4", "%i5", "%i7"); }) +# else +# define PRE_GETCONTEXT \ + ({ __asm__ volatile ("" : : : \ + "%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7", \ + "%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7", \ + "%i0", "%i1", "%i2", "%i3", "%i4", "%i5", "%i7"); }) +# endif +# define POST_GETCONTEXT PRE_GETCONTEXT +# elif GCC_VERSION_BEFORE(4,0,3) && defined(__ia64) +static jmp_buf function_call_may_return_twice_jmp_buf; +int function_call_may_return_twice_false_1 = 0; +int function_call_may_return_twice_false_2 = 0; +# define PRE_GETCONTEXT \ + (function_call_may_return_twice_false_1 ? \ + setjmp(function_call_may_return_twice_jmp_buf) : \ + 0) +# define POST_GETCONTEXT \ + (function_call_may_return_twice_false_2 ? \ + setjmp(function_call_may_return_twice_jmp_buf) : \ + 0) +# elif defined(__FreeBSD__) && __FreeBSD__ < 7 +/* + * workaround for FreeBSD/i386 getcontext/setcontext bug. + * clear the carry flag by (0 ? ... : ...). + * FreeBSD PR 92110 http://www.freebsd.org/cgi/query-pr.cgi?pr=92110 + * [ruby-dev:28263] + */ +static int volatile freebsd_clear_carry_flag = 0; +# define PRE_GETCONTEXT \ + (freebsd_clear_carry_flag ? (freebsd_clear_carry_flag = 0) : 0) +# endif +# ifndef PRE_GETCONTEXT +# define PRE_GETCONTEXT 0 +# endif +# ifndef POST_GETCONTEXT +# define POST_GETCONTEXT 0 +# endif +# define ruby_longjmp(env, val) rb_jump_context(env, val) +# define ruby_setjmp(just_before_setjmp, j) ((j)->status = 0, \ + (just_before_setjmp), \ + PRE_GETCONTEXT, \ + getcontext(&(j)->context), \ + POST_GETCONTEXT, \ + (j)->status) +#else +# if !defined(setjmp) && defined(HAVE__SETJMP) +# define ruby_setjmp(just_before_setjmp, env) \ + ((just_before_setjmp), _setjmp(env)) +# define ruby_longjmp(env,val) _longjmp(env,val) +# else +# define ruby_setjmp(just_before_setjmp, env) \ + ((just_before_setjmp), setjmp(env)) +# define ruby_longjmp(env,val) longjmp(env,val) +# endif +#endif + +#include <sys/types.h> +#include <signal.h> +#include <errno.h> + +#if defined(__VMS) +#pragma nostandard +#endif + +#ifdef HAVE_SYS_SELECT_H +#include <sys/select.h> +#endif + +#include <sys/stat.h> + +VALUE rb_cProc; +VALUE rb_cBinding; +static VALUE proc_invoke _((VALUE,VALUE,VALUE,VALUE)); +static VALUE rb_f_binding _((VALUE)); +static void rb_f_END _((void)); +static VALUE rb_f_block_given_p _((void)); +static VALUE block_pass _((VALUE,NODE*)); + +VALUE rb_cMethod; +static VALUE method_call _((int, VALUE*, VALUE)); +VALUE rb_cUnboundMethod; +static VALUE umethod_bind _((VALUE, VALUE)); +static VALUE rb_mod_define_method _((int, VALUE*, VALUE)); +NORETURN(static void rb_raise_jump _((VALUE))); +static VALUE rb_make_exception _((int argc, VALUE *argv)); + +static int scope_vmode; +#define SCOPE_PUBLIC 0 +#define SCOPE_PRIVATE 1 +#define SCOPE_PROTECTED 2 +#define SCOPE_MODFUNC 5 +#define SCOPE_MASK 7 +#define SCOPE_SET(f) (scope_vmode=(f)) +#define SCOPE_TEST(f) (scope_vmode&(f)) + +VALUE (*ruby_sandbox_save)_((rb_thread_t)); +VALUE (*ruby_sandbox_restore)_((rb_thread_t)); +NODE* ruby_current_node; +int ruby_safe_level = 0; +/* safe-level: + 0 - strings from streams/environment/ARGV are tainted (default) + 1 - no dangerous operation by tainted value + 2 - process/file operations prohibited + 3 - all generated objects are tainted + 4 - no global (non-tainted) variable modification/no direct output +*/ + +static VALUE safe_getter _((void)); +static void safe_setter _((VALUE val)); + +void +rb_secure(level) + int level; +{ + if (level <= ruby_safe_level) { + if (ruby_frame->last_func) { + rb_raise(rb_eSecurityError, "Insecure operation `%s' at level %d", + rb_id2name(ruby_frame->last_func), ruby_safe_level); + } + else { + rb_raise(rb_eSecurityError, "Insecure operation at level %d", ruby_safe_level); + } + } +} + +void +rb_secure_update(obj) + VALUE obj; +{ + if (!OBJ_TAINTED(obj)) rb_secure(4); +} + +void +rb_check_safe_obj(x) + VALUE x; +{ + if (ruby_safe_level > 0 && OBJ_TAINTED(x)){ + if (ruby_frame->last_func) { + rb_raise(rb_eSecurityError, "Insecure operation - %s", + rb_id2name(ruby_frame->last_func)); + } + else { + rb_raise(rb_eSecurityError, "Insecure operation: -r"); + } + } + rb_secure(4); +} + +void +rb_check_safe_str(x) + VALUE x; +{ + rb_check_safe_obj(x); + if (TYPE(x)!= T_STRING) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected String)", + rb_obj_classname(x)); + } +} + +NORETURN(static void print_undef _((VALUE, ID))); +static void +print_undef(klass, id) + VALUE klass; + ID id; +{ + rb_name_error(id, "undefined method `%s' for %s `%s'", + rb_id2name(id), + (TYPE(klass) == T_MODULE) ? "module" : "class", + rb_class2name(klass)); +} + +static ID removed, singleton_removed, undefined, singleton_undefined; + +#define CACHE_SIZE 0x800 +#define CACHE_MASK 0x7ff +#define EXPR1(c,m) ((((c)>>3)^(m))&CACHE_MASK) + +struct cache_entry { /* method hash table. */ + ID mid; /* method's id */ + ID mid0; /* method's original id */ + VALUE klass; /* receiver's class */ + VALUE origin; /* where method defined */ + NODE *method; + int noex; +}; + +static struct cache_entry cache[CACHE_SIZE]; +static int ruby_running = 0; + +void +rb_clear_cache() +{ + struct cache_entry *ent, *end; + + if (!ruby_running) return; + ent = cache; end = ent + CACHE_SIZE; + while (ent < end) { + ent->mid = 0; + ent++; + } +} + +static void +rb_clear_cache_for_undef(klass, id) + VALUE klass; + ID id; +{ + struct cache_entry *ent, *end; + + if (!ruby_running) return; + ent = cache; end = ent + CACHE_SIZE; + while (ent < end) { + if (ent->mid == id && + RCLASS(ent->origin)->m_tbl == RCLASS(klass)->m_tbl) { + ent->mid = 0; + } + ent++; + } +} + +static void +rb_clear_cache_by_id(id) + ID id; +{ + struct cache_entry *ent, *end; + + if (!ruby_running) return; + ent = cache; end = ent + CACHE_SIZE; + while (ent < end) { + if (ent->mid == id) { + ent->mid = 0; + } + ent++; + } +} + +void +rb_clear_cache_by_class(klass) + VALUE klass; +{ + struct cache_entry *ent, *end; + + if (!ruby_running) return; + ent = cache; end = ent + CACHE_SIZE; + while (ent < end) { + if (ent->klass == klass || ent->origin == klass) { + ent->mid = 0; + } + ent++; + } +} + +static ID init, eqq, each, aref, aset, match, missing; +static ID added, singleton_added; +static ID __id__, __send__, respond_to; + +#define NOEX_TAINTED 8 +#define NOEX_SAFE(n) ((n) >> 4) +#define NOEX_WITH(n, v) ((n) | (v) << 4) +#define NOEX_WITH_SAFE(n) NOEX_WITH(n, ruby_safe_level) + +void +rb_add_method(klass, mid, node, noex) + VALUE klass; + ID mid; + NODE *node; + int noex; +{ + NODE *body; + + if (NIL_P(klass)) klass = rb_cObject; + if (ruby_safe_level >= 4 && (klass == rb_cObject || !OBJ_TAINTED(klass))) { + rb_raise(rb_eSecurityError, "Insecure: can't define method"); + } + if (!FL_TEST(klass, FL_SINGLETON) && + node && nd_type(node) != NODE_ZSUPER && + (mid == rb_intern("initialize" )|| mid == rb_intern("initialize_copy"))) { + noex = NOEX_PRIVATE | noex; + } + else if (FL_TEST(klass, FL_SINGLETON) && node && nd_type(node) == NODE_CFUNC && + mid == rb_intern("allocate")) { + rb_warn("defining %s.allocate is deprecated; use rb_define_alloc_func()", + rb_class2name(rb_iv_get(klass, "__attached__"))); + mid = ID_ALLOCATOR; + } + if (OBJ_FROZEN(klass)) rb_error_frozen("class/module"); + rb_clear_cache_by_id(mid); + body = NEW_METHOD(node, NOEX_WITH_SAFE(noex)); + st_insert(RCLASS(klass)->m_tbl, mid, (st_data_t)body); + if (node && mid != ID_ALLOCATOR && ruby_running) { + if (FL_TEST(klass, FL_SINGLETON)) { + rb_funcall(rb_iv_get(klass, "__attached__"), singleton_added, 1, ID2SYM(mid)); + } + else { + rb_funcall(klass, added, 1, ID2SYM(mid)); + } + } +} + +void +rb_define_alloc_func(klass, func) + VALUE klass; + VALUE (*func) _((VALUE)); +{ + Check_Type(klass, T_CLASS); + rb_add_method(rb_singleton_class(klass), ID_ALLOCATOR, NEW_CFUNC(func, 0), + NOEX_PRIVATE); +} + +void +rb_undef_alloc_func(klass) + VALUE klass; +{ + Check_Type(klass, T_CLASS); + rb_add_method(rb_singleton_class(klass), ID_ALLOCATOR, 0, NOEX_UNDEF); +} + +static NODE* +search_method(klass, id, origin) + VALUE klass, *origin; + ID id; +{ + st_data_t body; + + if (!klass) return 0; + while (!st_lookup(RCLASS(klass)->m_tbl, id, &body)) { + klass = RCLASS(klass)->super; + if (!klass) return 0; + } + + if (origin) *origin = klass; + return (NODE *)body; +} + +static NODE* +rb_get_method_body(klassp, idp, noexp) + VALUE *klassp; + ID *idp; + int *noexp; +{ + ID id = *idp; + VALUE klass = *klassp; + VALUE origin; + NODE * volatile body; + struct cache_entry *ent; + + if ((body = search_method(klass, id, &origin)) == 0 || !body->nd_body) { + /* store empty info in cache */ + ent = cache + EXPR1(klass, id); + ent->klass = klass; + ent->origin = klass; + ent->mid = ent->mid0 = id; + ent->noex = 0; + ent->method = 0; + + return 0; + } + + if (ruby_running) { + /* store in cache */ + ent = cache + EXPR1(klass, id); + ent->klass = klass; + ent->noex = body->nd_noex; + if (noexp) *noexp = body->nd_noex; + body = body->nd_body; + if (nd_type(body) == NODE_FBODY) { + ent->mid = id; + *klassp = body->nd_orig; + ent->origin = body->nd_orig; + *idp = ent->mid0 = body->nd_mid; + body = ent->method = body->nd_head; + } + else { + *klassp = origin; + ent->origin = origin; + ent->mid = ent->mid0 = id; + ent->method = body; + } + } + else { + if (noexp) *noexp = body->nd_noex; + body = body->nd_body; + if (nd_type(body) == NODE_FBODY) { + *klassp = body->nd_orig; + *idp = body->nd_mid; + body = body->nd_head; + } + else { + *klassp = origin; + } + } + + return body; +} + +NODE* +rb_method_node(klass, id) + VALUE klass; + ID id; +{ + int noex; + + return rb_get_method_body(&klass, &id, &noex); +} + +static void +remove_method(klass, mid) + VALUE klass; + ID mid; +{ + st_data_t data; + NODE *body = 0; + + if (klass == rb_cObject) { + rb_secure(4); + } + if (ruby_safe_level >= 4 && !OBJ_TAINTED(klass)) { + rb_raise(rb_eSecurityError, "Insecure: can't remove method"); + } + if (OBJ_FROZEN(klass)) rb_error_frozen("class/module"); + if (mid == __id__ || mid == __send__ || mid == init) { + rb_warn("removing `%s' may cause serious problem", rb_id2name(mid)); + } + if (st_lookup(RCLASS(klass)->m_tbl, mid, &data)) { + body = (NODE *)data; + if (!body || !body->nd_body) body = 0; + else { + st_delete(RCLASS(klass)->m_tbl, &mid, &data); + } + } + if (!body) { + rb_name_error(mid, "method `%s' not defined in %s", + rb_id2name(mid), rb_class2name(klass)); + } + rb_clear_cache_for_undef(klass, mid); + if (FL_TEST(klass, FL_SINGLETON)) { + rb_funcall(rb_iv_get(klass, "__attached__"), singleton_removed, 1, ID2SYM(mid)); + } + else { + rb_funcall(klass, removed, 1, ID2SYM(mid)); + } +} + +void +rb_remove_method(klass, name) + VALUE klass; + const char *name; +{ + remove_method(klass, rb_intern(name)); +} + +/* + * call-seq: + * remove_method(symbol) => self + * + * Removes the method identified by _symbol_ from the current + * class. For an example, see <code>Module.undef_method</code>. + */ + +static VALUE +rb_mod_remove_method(argc, argv, mod) + int argc; + VALUE *argv; + VALUE mod; +{ + int i; + + for (i=0; i<argc; i++) { + remove_method(mod, rb_to_id(argv[i])); + } + return mod; +} + +#undef rb_disable_super +#undef rb_enable_super + +void +rb_disable_super(klass, name) + VALUE klass; + const char *name; +{ + /* obsolete - no use */ +} + +void +rb_enable_super(klass, name) + VALUE klass; + const char *name; +{ + rb_warn("rb_enable_super() is obsolete"); +} + +static void +rb_export_method(klass, name, noex) + VALUE klass; + ID name; + ID noex; +{ + NODE *body; + VALUE origin; + + if (klass == rb_cObject) { + rb_secure(4); + } + body = search_method(klass, name, &origin); + if (!body && TYPE(klass) == T_MODULE) { + body = search_method(rb_cObject, name, &origin); + } + if (!body || !body->nd_body) { + print_undef(klass, name); + } + if (body->nd_noex != noex) { + if (klass == origin) { + body->nd_noex = noex; + } + else { + rb_add_method(klass, name, NEW_ZSUPER(), noex); + } + } +} + +int +rb_method_boundp(klass, id, ex) + VALUE klass; + ID id; + int ex; +{ + struct cache_entry *ent; + int noex; + + /* is it in the method cache? */ + ent = cache + EXPR1(klass, id); + if (ent->mid == id && ent->klass == klass) { + if (ex && (ent->noex & NOEX_PRIVATE)) + return Qfalse; + if (!ent->method) return Qfalse; + return Qtrue; + } + if (rb_get_method_body(&klass, &id, &noex)) { + if (ex && (noex & NOEX_PRIVATE)) + return Qfalse; + return Qtrue; + } + return Qfalse; +} + +void +rb_attr(klass, id, read, write, ex) + VALUE klass; + ID id; + int read, write, ex; +{ + const char *name; + char *buf; + ID attriv; + int noex; + size_t len; + + if (!ex) noex = NOEX_PUBLIC; + else { + if (SCOPE_TEST(SCOPE_PRIVATE)) { + noex = NOEX_PRIVATE; + rb_warning((scope_vmode == SCOPE_MODFUNC) ? + "attribute accessor as module_function" : + "private attribute?"); + } + else if (SCOPE_TEST(SCOPE_PROTECTED)) { + noex = NOEX_PROTECTED; + } + else { + noex = NOEX_PUBLIC; + } + } + + if (!rb_is_local_id(id) && !rb_is_const_id(id)) { + rb_name_error(id, "invalid attribute name `%s'", rb_id2name(id)); + } + name = rb_id2name(id); + if (!name) { + rb_raise(rb_eArgError, "argument needs to be symbol or string"); + } + len = strlen(name)+2; + buf = ALLOCA_N(char,len); + snprintf(buf, len, "@%s", name); + attriv = rb_intern(buf); + if (read) { + rb_add_method(klass, id, NEW_IVAR(attriv), noex); + } + if (write) { + rb_add_method(klass, rb_id_attrset(id), NEW_ATTRSET(attriv), noex); + } +} + +extern int ruby_in_compile; + +VALUE ruby_errinfo = Qnil; +extern NODE *ruby_eval_tree_begin; +extern NODE *ruby_eval_tree; +extern int ruby_nerrs; + +VALUE rb_eLocalJumpError; +VALUE rb_eSysStackError; + +extern VALUE ruby_top_self; + +struct FRAME *ruby_frame; +struct SCOPE *ruby_scope; +static struct FRAME *top_frame; +static struct SCOPE *top_scope; + +static unsigned long frame_unique = 0; + +#define PUSH_FRAME() do { \ + volatile struct FRAME _frame; \ + _frame.prev = ruby_frame; \ + _frame.tmp = 0; \ + _frame.node = ruby_current_node; \ + _frame.iter = ruby_iter->iter; \ + _frame.argc = 0; \ + _frame.flags = 0; \ + _frame.uniq = frame_unique++; \ + ruby_frame = &_frame + +#define POP_FRAME() \ + ruby_current_node = _frame.node; \ + ruby_frame = _frame.prev; \ +} while (0) + +struct BLOCK { + NODE *var; + NODE *body; + VALUE self; + struct FRAME frame; + struct SCOPE *scope; + VALUE klass; + NODE *cref; + int iter; + int vmode; + int flags; + int uniq; + struct RVarmap *dyna_vars; + VALUE orig_thread; + VALUE wrapper; + VALUE block_obj; + struct BLOCK *outer; + struct BLOCK *prev; +}; + +#define BLOCK_D_SCOPE 1 +#define BLOCK_LAMBDA 2 + +static struct BLOCK *ruby_block; +static unsigned long block_unique = 1; + +#define PUSH_BLOCK(v,b) do { \ + struct BLOCK _block; \ + _block.var = (v); \ + _block.body = (b); \ + _block.self = self; \ + _block.frame = *ruby_frame; \ + _block.klass = ruby_class; \ + _block.cref = ruby_cref; \ + _block.frame.node = ruby_current_node;\ + _block.scope = ruby_scope; \ + _block.prev = ruby_block; \ + _block.outer = ruby_block; \ + _block.iter = ruby_iter->iter; \ + _block.vmode = scope_vmode; \ + _block.flags = BLOCK_D_SCOPE; \ + _block.dyna_vars = ruby_dyna_vars; \ + _block.wrapper = ruby_wrapper; \ + _block.block_obj = 0; \ + _block.uniq = (b)?block_unique++:0; \ + if (b) { \ + prot_tag->blkid = _block.uniq; \ + } \ + ruby_block = &_block + +#define POP_BLOCK() \ + ruby_block = _block.prev; \ +} while (0) + +struct RVarmap *ruby_dyna_vars; +#define PUSH_VARS() do { \ + struct RVarmap * volatile _old; \ + _old = ruby_dyna_vars; \ + ruby_dyna_vars = 0 + +#define POP_VARS() \ + if (_old && (ruby_scope->flags & SCOPE_DONT_RECYCLE)) {\ + if (RBASIC(_old)->flags) /* unless it's already recycled */ \ + FL_SET(_old, DVAR_DONT_RECYCLE); \ + }\ + ruby_dyna_vars = _old; \ +} while (0) + +#define DVAR_DONT_RECYCLE FL_USER2 + +#define DMETHOD_P() (ruby_frame->flags & FRAME_DMETH) + +static struct RVarmap* +new_dvar(id, value, prev) + ID id; + VALUE value; + struct RVarmap *prev; +{ + NEWOBJ(vars, struct RVarmap); + OBJSETUP(vars, 0, T_VARMAP); + vars->id = id; + vars->val = value; + vars->next = prev; + + return vars; +} + +VALUE +rb_dvar_defined(id) + ID id; +{ + struct RVarmap *vars = ruby_dyna_vars; + + while (vars) { + if (vars->id == id) return Qtrue; + vars = vars->next; + } + return Qfalse; +} + +VALUE +rb_dvar_curr(id) + ID id; +{ + struct RVarmap *vars = ruby_dyna_vars; + + while (vars) { + if (vars->id == 0) break; + if (vars->id == id) return Qtrue; + vars = vars->next; + } + return Qfalse; +} + +VALUE +rb_dvar_ref(id) + ID id; +{ + struct RVarmap *vars = ruby_dyna_vars; + + while (vars) { + if (vars->id == id) { + return vars->val; + } + vars = vars->next; + } + return Qnil; +} + +void +rb_dvar_push(id, value) + ID id; + VALUE value; +{ + ruby_dyna_vars = new_dvar(id, value, ruby_dyna_vars); +} + +static void +dvar_asgn_internal(id, value, curr) + ID id; + VALUE value; + int curr; +{ + int n = 0; + struct RVarmap *vars = ruby_dyna_vars; + + while (vars) { + if (curr && vars->id == 0) { + /* first null is a dvar header */ + n++; + if (n == 2) break; + } + if (vars->id == id) { + vars->val = value; + return; + } + vars = vars->next; + } + if (!ruby_dyna_vars) { + ruby_dyna_vars = new_dvar(id, value, 0); + } + else { + vars = new_dvar(id, value, ruby_dyna_vars->next); + ruby_dyna_vars->next = vars; + } +} + +static inline void +dvar_asgn(id, value) + ID id; + VALUE value; +{ + dvar_asgn_internal(id, value, 0); +} + +static inline void +dvar_asgn_curr(id, value) + ID id; + VALUE value; +{ + dvar_asgn_internal(id, value, 1); +} + +VALUE * +rb_svar(cnt) + int cnt; +{ + struct RVarmap *vars = ruby_dyna_vars; + ID id; + + if (!ruby_scope->local_tbl) return NULL; + if (cnt >= ruby_scope->local_tbl[0]) return NULL; + id = ruby_scope->local_tbl[cnt+1]; + while (vars) { + if (vars->id == id) return &vars->val; + vars = vars->next; + } + if (ruby_scope->local_vars == 0) return NULL; + return &ruby_scope->local_vars[cnt]; +} + +struct iter { + int iter; + struct iter *prev; +}; +static struct iter *ruby_iter; + +#define ITER_NOT 0 +#define ITER_PRE 1 +#define ITER_CUR 2 +#define ITER_PAS 3 + +#define PUSH_ITER(i) do { \ + struct iter _iter; \ + _iter.prev = ruby_iter; \ + _iter.iter = (i); \ + ruby_iter = &_iter + +#define POP_ITER() \ + ruby_iter = _iter.prev; \ +} while (0) + +struct tag { + rb_jmpbuf_t buf; + struct FRAME *frame; + struct iter *iter; + VALUE tag; + VALUE retval; + struct SCOPE *scope; + VALUE dst; + struct tag *prev; + int blkid; +}; +static struct tag *prot_tag; + +#define PUSH_TAG(ptag) do { \ + struct tag _tag; \ + _tag.retval = Qnil; \ + _tag.frame = ruby_frame; \ + _tag.iter = ruby_iter; \ + _tag.prev = prot_tag; \ + _tag.scope = ruby_scope; \ + _tag.tag = ptag; \ + _tag.dst = 0; \ + _tag.blkid = 0; \ + prot_tag = &_tag + +#define PROT_NONE Qfalse /* 0 */ +#define PROT_THREAD Qtrue /* 2 */ +#define PROT_FUNC INT2FIX(0) /* 1 */ +#define PROT_LOOP INT2FIX(1) /* 3 */ +#define PROT_LAMBDA INT2FIX(2) /* 5 */ +#define PROT_YIELD INT2FIX(3) /* 7 */ + +#define EXEC_TAG() (FLUSH_REGISTER_WINDOWS, ruby_setjmp(((void)0), prot_tag->buf)) + +#define JUMP_TAG(st) do { \ + ruby_frame = prot_tag->frame; \ + ruby_iter = prot_tag->iter; \ + ruby_longjmp(prot_tag->buf,(st)); \ +} while (0) + +#define POP_TAG() \ + prot_tag = _tag.prev; \ +} while (0) + +#define TAG_DST() (_tag.dst == (VALUE)ruby_frame->uniq) + +#define TAG_RETURN 0x1 +#define TAG_BREAK 0x2 +#define TAG_NEXT 0x3 +#define TAG_RETRY 0x4 +#define TAG_REDO 0x5 +#define TAG_RAISE 0x6 +#define TAG_THROW 0x7 +#define TAG_FATAL 0x8 +#define TAG_MASK 0xf + +VALUE ruby_class; +static VALUE ruby_wrapper; /* security wrapper */ + +#define PUSH_CLASS(c) do { \ + volatile VALUE _class = ruby_class; \ + ruby_class = (c) + +#define POP_CLASS() ruby_class = _class; \ +} while (0) + +NODE *ruby_cref = 0; +NODE *ruby_top_cref; +#define PUSH_CREF(c) ruby_cref = NEW_CREF(c,ruby_cref) +#define POP_CREF() ruby_cref = ruby_cref->nd_next + +#define PUSH_SCOPE() do { \ + volatile int _vmode = scope_vmode; \ + struct SCOPE * volatile _old; \ + NEWOBJ(_scope, struct SCOPE); \ + OBJSETUP(_scope, 0, T_SCOPE); \ + _scope->local_tbl = 0; \ + _scope->local_vars = 0; \ + _scope->flags = 0; \ + _old = ruby_scope; \ + ruby_scope = _scope; \ + scope_vmode = SCOPE_PUBLIC + +rb_thread_t rb_curr_thread; +rb_thread_t rb_main_thread; +#define main_thread rb_main_thread +#define curr_thread rb_curr_thread + +static void scope_dup _((struct SCOPE *)); + +#define POP_SCOPE() \ + if (ruby_scope->flags & SCOPE_DONT_RECYCLE) {\ + if (_old) scope_dup(_old); \ + } \ + if (!(ruby_scope->flags & SCOPE_MALLOC)) {\ + ruby_scope->local_vars = 0; \ + ruby_scope->local_tbl = 0; \ + if (!(ruby_scope->flags & SCOPE_DONT_RECYCLE) && \ + ruby_scope != top_scope) { \ + rb_gc_force_recycle((VALUE)ruby_scope);\ + } \ + } \ + ruby_scope->flags |= SCOPE_NOSTACK; \ + ruby_scope = _old; \ + scope_vmode = _vmode; \ +} while (0) + +static VALUE rb_eval _((VALUE,NODE*)); +static VALUE eval _((VALUE,VALUE,VALUE,char*,int)); +static NODE *compile _((VALUE, char*, int)); + +static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int)); + +#define YIELD_LAMBDA_CALL 1 +#define YIELD_PROC_CALL 2 +#define YIELD_PUBLIC_DEF 4 +#define YIELD_FUNC_AVALUE 1 +#define YIELD_FUNC_SVALUE 2 + +static VALUE rb_call _((VALUE,VALUE,ID,int,const VALUE*,int,VALUE)); +static VALUE module_setup _((VALUE,NODE*)); + +static VALUE massign _((VALUE,NODE*,VALUE,int)); +static void assign _((VALUE,NODE*,VALUE,int)); + +typedef struct event_hook { + rb_event_hook_func_t func; + rb_event_t events; + struct event_hook *next; +} rb_event_hook_t; + +static rb_event_hook_t *event_hooks; + +#define EXEC_EVENT_HOOK(event, node, self, id, klass) \ + do { \ + rb_event_hook_t *hook = event_hooks; \ + rb_event_hook_func_t hook_func; \ + rb_event_t events; \ + \ + while (hook) { \ + hook_func = hook->func; \ + events = hook->events; \ + hook = hook->next; \ + if (events & event) \ + (*hook_func)(event, node, self, id, klass); \ + } \ + } while (0) + +static VALUE trace_func = 0; +static int tracing = 0; +static void call_trace_func _((rb_event_t,NODE*,VALUE,ID,VALUE)); + +#if 0 +#define SET_CURRENT_SOURCE() (ruby_sourcefile = ruby_current_node->nd_file, \ + ruby_sourceline = nd_line(ruby_current_node)) +#else +#define SET_CURRENT_SOURCE() ((void)0) +#endif + +void +ruby_set_current_source() +{ + if (ruby_current_node) { + ruby_sourcefile = ruby_current_node->nd_file; + ruby_sourceline = nd_line(ruby_current_node); + } +} + +static void +#ifdef HAVE_STDARG_PROTOTYPES +warn_printf(const char *fmt, ...) +#else +warn_printf(fmt, va_alist) + const char *fmt; + va_dcl +#endif +{ + char buf[BUFSIZ]; + va_list args; + + va_init_list(args, fmt); + vsnprintf(buf, BUFSIZ, fmt, args); + va_end(args); + rb_write_error(buf); +} + +#define warn_print(x) rb_write_error(x) +#define warn_print2(x,l) rb_write_error2(x,l) + +static void +error_pos() +{ + ruby_set_current_source(); + if (ruby_sourcefile) { + if (ruby_frame->last_func) { + warn_printf("%s:%d:in `%s'", ruby_sourcefile, ruby_sourceline, + rb_id2name(ruby_frame->orig_func)); + } + else if (ruby_sourceline == 0) { + warn_printf("%s", ruby_sourcefile); + } + else { + warn_printf("%s:%d", ruby_sourcefile, ruby_sourceline); + } + } +} + +VALUE rb_check_backtrace(VALUE); + +static VALUE +get_backtrace(info) + VALUE info; +{ + if (NIL_P(info)) return Qnil; + info = rb_funcall(info, rb_intern("backtrace"), 0); + if (NIL_P(info)) return Qnil; + return rb_check_backtrace(info); +} + +static void +set_backtrace(info, bt) + VALUE info, bt; +{ + rb_funcall(info, rb_intern("set_backtrace"), 1, bt); +} + +static void +error_print() +{ + VALUE errat = Qnil; /* OK */ + volatile VALUE eclass, e; + char *einfo; + long elen; + + if (NIL_P(ruby_errinfo)) return; + + PUSH_TAG(PROT_NONE); + if (EXEC_TAG() == 0) { + errat = get_backtrace(ruby_errinfo); + } + else { + errat = Qnil; + } + if (EXEC_TAG()) goto error; + if (NIL_P(errat)){ + ruby_set_current_source(); + if (ruby_sourcefile) + warn_printf("%s:%d", ruby_sourcefile, ruby_sourceline); + else + warn_printf("%d", ruby_sourceline); + } + else if (RARRAY(errat)->len == 0) { + error_pos(); + } + else { + VALUE mesg = RARRAY(errat)->ptr[0]; + + if (NIL_P(mesg)) error_pos(); + else { + warn_print2(RSTRING(mesg)->ptr, RSTRING(mesg)->len); + } + } + + eclass = CLASS_OF(ruby_errinfo); + if (EXEC_TAG() == 0) { + e = rb_funcall(ruby_errinfo, rb_intern("message"), 0, 0); + StringValue(e); + einfo = RSTRING(e)->ptr; + elen = RSTRING(e)->len; + } + else { + einfo = ""; + elen = 0; + } + if (EXEC_TAG()) goto error; + if (eclass == rb_eRuntimeError && elen == 0) { + warn_print(": unhandled exception\n"); + } + else { + VALUE epath; + + epath = rb_class_name(eclass); + if (elen == 0) { + warn_print(": "); + warn_print2(RSTRING(epath)->ptr, RSTRING(epath)->len); + warn_print("\n"); + } + else { + char *tail = 0; + long len = elen; + + if (RSTRING(epath)->ptr[0] == '#') epath = 0; + if ((tail = memchr(einfo, '\n', elen)) != 0) { + len = tail - einfo; + tail++; /* skip newline */ + } + warn_print(": "); + warn_print2(einfo, len); + if (epath) { + warn_print(" ("); + warn_print2(RSTRING(epath)->ptr, RSTRING(epath)->len); + warn_print(")\n"); + } + if (tail && elen>len+1) { + warn_print2(tail, elen-len-1); + if (einfo[elen-1] != '\n') warn_print2("\n", 1); + } + } + } + + if (!NIL_P(errat)) { + long i; + struct RArray *ep = RARRAY(errat); + +#define TRACE_MAX (TRACE_HEAD+TRACE_TAIL+5) +#define TRACE_HEAD 8 +#define TRACE_TAIL 5 + + ep = RARRAY(errat); + for (i=1; i<ep->len; i++) { + if (TYPE(ep->ptr[i]) == T_STRING) { + warn_printf("\tfrom %s\n", RSTRING(ep->ptr[i])->ptr); + } + if (i == TRACE_HEAD && ep->len > TRACE_MAX) { + warn_printf("\t ... %ld levels...\n", + ep->len - TRACE_HEAD - TRACE_TAIL); + i = ep->len - TRACE_TAIL; + } + } + } + error: + POP_TAG(); +} + +#if defined(__APPLE__) +#define environ (*_NSGetEnviron()) +#elif !defined(_WIN32) && !defined(__MACOS__) || defined(_WIN32_WCE) +extern char **environ; +#endif +char **rb_origenviron; + +void rb_call_inits _((void)); +void Init_stack _((VALUE*)); +void Init_heap _((void)); +void Init_ext _((void)); + +#ifdef HAVE_NATIVETHREAD +static rb_nativethread_t ruby_thid; +int +is_ruby_native_thread() { + return NATIVETHREAD_EQUAL(ruby_thid, NATIVETHREAD_CURRENT()); +} + +# ifdef HAVE_NATIVETHREAD_KILL +void +ruby_native_thread_kill(sig) + int sig; +{ + NATIVETHREAD_KILL(ruby_thid, sig); +} +# endif +#endif + +void +ruby_init() +{ + static int initialized = 0; + static struct FRAME frame; + static struct iter iter; + int state; + + if (initialized) + return; + initialized = 1; +#ifdef HAVE_NATIVETHREAD + ruby_thid = NATIVETHREAD_CURRENT(); +#endif + + ruby_frame = top_frame = &frame; + ruby_iter = &iter; + +#ifdef __MACOS__ + rb_origenviron = 0; +#else + rb_origenviron = environ; +#endif + + Init_stack((void*)&state); + Init_heap(); + PUSH_SCOPE(); + ruby_scope->local_vars = 0; + ruby_scope->local_tbl = 0; + top_scope = ruby_scope; + /* default visibility is private at toplevel */ + SCOPE_SET(SCOPE_PRIVATE); + + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + rb_call_inits(); + ruby_class = rb_cObject; + ruby_frame->self = ruby_top_self; + ruby_top_cref = rb_node_newnode(NODE_CREF,rb_cObject,0,0); + ruby_cref = ruby_top_cref; + rb_define_global_const("TOPLEVEL_BINDING", rb_f_binding(ruby_top_self)); +#ifdef __MACOS__ + _macruby_init(); +#elif defined(__VMS) + _vmsruby_init(); +#endif + ruby_prog_init(); + ALLOW_INTS; + } + POP_TAG(); + if (state) { + error_print(); + exit(EXIT_FAILURE); + } + POP_SCOPE(); + ruby_scope = top_scope; + top_scope->flags &= ~SCOPE_NOSTACK; + ruby_running = 1; +} + +static VALUE +eval_node(self, node) + VALUE self; + NODE *node; +{ + NODE *beg_tree = ruby_eval_tree_begin; + + ruby_eval_tree_begin = 0; + if (beg_tree) { + rb_eval(self, beg_tree); + } + + if (!node) return Qnil; + return rb_eval(self, node); +} + +int ruby_in_eval; + +static void rb_thread_cleanup _((void)); +static void rb_thread_wait_other_threads _((void)); + +static int thread_no_ensure _((void)); + +static VALUE exception_error; +static VALUE sysstack_error; + +static int +sysexit_status(err) + VALUE err; +{ + VALUE st = rb_iv_get(err, "status"); + return NUM2INT(st); +} + +static int +error_handle(ex) + int ex; +{ + int status = EXIT_FAILURE; + rb_thread_t th = curr_thread; + + if (rb_thread_set_raised(th)) + return EXIT_FAILURE; + switch (ex & TAG_MASK) { + case 0: + status = EXIT_SUCCESS; + break; + + case TAG_RETURN: + error_pos(); + warn_print(": unexpected return\n"); + break; + case TAG_NEXT: + error_pos(); + warn_print(": unexpected next\n"); + break; + case TAG_BREAK: + error_pos(); + warn_print(": unexpected break\n"); + break; + case TAG_REDO: + error_pos(); + warn_print(": unexpected redo\n"); + break; + case TAG_RETRY: + error_pos(); + warn_print(": retry outside of rescue clause\n"); + break; + case TAG_THROW: + if (prot_tag && prot_tag->frame && prot_tag->frame->node) { + NODE *tag = prot_tag->frame->node; + warn_printf("%s:%d: uncaught throw\n", + tag->nd_file, nd_line(tag)); + } + else { + error_pos(); + warn_printf(": unexpected throw\n"); + } + break; + case TAG_RAISE: + case TAG_FATAL: + if (rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) { + status = sysexit_status(ruby_errinfo); + } + else if (rb_obj_is_instance_of(ruby_errinfo, rb_eSignal)) { + /* no message when exiting by signal */ + } + else { + error_print(); + } + break; + default: + rb_bug("Unknown longjmp status %d", ex); + break; + } + rb_thread_reset_raised(th); + return status; +} + +void +ruby_options(argc, argv) + int argc; + char **argv; +{ + int state; + + Init_stack((void*)&state); + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + ruby_process_options(argc, argv); + } + else { + trace_func = 0; + tracing = 0; + exit(error_handle(state)); + } + POP_TAG(); +} + +void rb_exec_end_proc _((void)); + +static void +ruby_finalize_0() +{ + PUSH_TAG(PROT_NONE); + if (EXEC_TAG() == 0) { + rb_trap_exit(); + } + POP_TAG(); + rb_exec_end_proc(); +} + +static void +ruby_finalize_1() +{ + signal(SIGINT, SIG_DFL); + ruby_errinfo = 0; + rb_gc_call_finalizer_at_exit(); + trace_func = 0; + tracing = 0; +} + +void +ruby_finalize() +{ + ruby_finalize_0(); + ruby_finalize_1(); +} + +int +ruby_cleanup(ex) + int ex; +{ + int state; + volatile VALUE errs[2]; + int nerr; + + errs[1] = ruby_errinfo; + ruby_safe_level = 0; + Init_stack((void *)&state); + ruby_finalize_0(); + errs[0] = ruby_errinfo; + PUSH_TAG(PROT_NONE); + PUSH_ITER(ITER_NOT); + if ((state = EXEC_TAG()) == 0) { + rb_thread_cleanup(); + rb_thread_wait_other_threads(); + } + else if (ex == 0) { + ex = state; + } + POP_ITER(); + ruby_errinfo = errs[1]; + ex = error_handle(ex); + ruby_finalize_1(); + POP_TAG(); + + for (nerr = 0; nerr < sizeof(errs) / sizeof(errs[0]); ++nerr) { + VALUE err = errs[nerr]; + + if (!RTEST(err)) continue; + + if (rb_obj_is_kind_of(err, rb_eSystemExit)) { + return sysexit_status(err); + } + else if (rb_obj_is_kind_of(err, rb_eSignal)) { + VALUE sig = rb_iv_get(err, "signo"); + ruby_default_signal(NUM2INT(sig)); + } + else if (ex == 0) { + ex = 1; + } + } + +#if EXIT_SUCCESS != 0 || EXIT_FAILURE != 1 + switch (ex) { +#if EXIT_SUCCESS != 0 + case 0: return EXIT_SUCCESS; +#endif +#if EXIT_FAILURE != 1 + case 1: return EXIT_FAILURE; +#endif + } +#endif + + return ex; +} + +static int +ruby_exec_internal() +{ + int state; + + PUSH_TAG(PROT_NONE); + PUSH_ITER(ITER_NOT); + /* default visibility is private at toplevel */ + SCOPE_SET(SCOPE_PRIVATE); + if ((state = EXEC_TAG()) == 0) { + eval_node(ruby_top_self, ruby_eval_tree); + } + POP_ITER(); + POP_TAG(); + return state; +} + +void +ruby_stop(ex) + int ex; +{ + exit(ruby_cleanup(ex)); +} + +int +ruby_exec() +{ + volatile NODE *tmp; + + Init_stack((void*)&tmp); + return ruby_exec_internal(); +} + +void +ruby_run() +{ + int state; + static int ex; + + if (ruby_nerrs > 0) exit(EXIT_FAILURE); + state = ruby_exec(); + if (state && !ex) ex = state; + ruby_stop(ex); +} + +static void +compile_error(at) + const char *at; +{ + VALUE str; + + ruby_nerrs = 0; + str = rb_str_buf_new2("compile error"); + if (at) { + rb_str_buf_cat2(str, " in "); + rb_str_buf_cat2(str, at); + } + rb_str_buf_cat(str, "\n", 1); + if (!NIL_P(ruby_errinfo)) { + rb_str_append(str, rb_obj_as_string(ruby_errinfo)); + } + rb_exc_raise(rb_exc_new3(rb_eSyntaxError, str)); +} + +VALUE +rb_eval_string(str) + const char *str; +{ + VALUE v; + NODE *oldsrc = ruby_current_node; + + ruby_current_node = 0; + ruby_sourcefile = rb_source_filename("(eval)"); + v = eval(ruby_top_self, rb_str_new2(str), Qnil, 0, 0); + ruby_current_node = oldsrc; + + return v; +} + +VALUE +rb_eval_string_protect(str, state) + const char *str; + int *state; +{ + return rb_protect((VALUE (*)_((VALUE)))rb_eval_string, (VALUE)str, state); +} + +VALUE +rb_eval_string_wrap(str, state) + const char *str; + int *state; +{ + int status; + VALUE self = ruby_top_self; + VALUE wrapper = ruby_wrapper; + VALUE val; + + PUSH_CLASS(ruby_wrapper = rb_module_new()); + ruby_top_self = rb_obj_clone(ruby_top_self); + rb_extend_object(ruby_top_self, ruby_wrapper); + PUSH_FRAME(); + ruby_frame->last_func = 0; + ruby_frame->last_class = 0; + ruby_frame->self = self; + PUSH_CREF(ruby_wrapper); + PUSH_SCOPE(); + + val = rb_eval_string_protect(str, &status); + ruby_top_self = self; + + POP_SCOPE(); + POP_FRAME(); + POP_CLASS(); + ruby_wrapper = wrapper; + if (state) { + *state = status; + } + else if (status) { + JUMP_TAG(status); + } + return val; +} + +NORETURN(static void localjump_error(const char*, VALUE, int)); +static void +localjump_error(mesg, value, reason) + const char *mesg; + VALUE value; + int reason; +{ + VALUE exc = rb_exc_new2(rb_eLocalJumpError, mesg); + ID id; + + rb_iv_set(exc, "@exit_value", value); + switch (reason) { + case TAG_BREAK: + id = rb_intern("break"); break; + case TAG_REDO: + id = rb_intern("redo"); break; + case TAG_RETRY: + id = rb_intern("retry"); break; + case TAG_NEXT: + id = rb_intern("next"); break; + case TAG_RETURN: + id = rb_intern("return"); break; + default: + id = rb_intern("noreason"); break; + } + rb_iv_set(exc, "@reason", ID2SYM(id)); + rb_exc_raise(exc); +} + +/* + * call_seq: + * local_jump_error.exit_value => obj + * + * Returns the exit value associated with this +LocalJumpError+. + */ +static VALUE +localjump_xvalue(exc) + VALUE exc; +{ + return rb_iv_get(exc, "@exit_value"); +} + +/* + * call-seq: + * local_jump_error.reason => symbol + * + * The reason this block was terminated: + * :break, :redo, :retry, :next, :return, or :noreason. + */ + +static VALUE +localjump_reason(exc) + VALUE exc; +{ + return rb_iv_get(exc, "@reason"); +} + +NORETURN(static void jump_tag_but_local_jump _((int,VALUE))); +static void +jump_tag_but_local_jump(state, val) + int state; + VALUE val; +{ + + if (val == Qundef) val = prot_tag->retval; + switch (state) { + case 0: + break; + case TAG_RETURN: + localjump_error("unexpected return", val, state); + break; + case TAG_BREAK: + localjump_error("unexpected break", val, state); + break; + case TAG_NEXT: + localjump_error("unexpected next", val, state); + break; + case TAG_REDO: + localjump_error("unexpected redo", Qnil, state); + break; + case TAG_RETRY: + localjump_error("retry outside of rescue clause", Qnil, state); + break; + default: + break; + } + JUMP_TAG(state); +} + +VALUE +rb_eval_cmd(cmd, arg, level) + VALUE cmd, arg; + int level; +{ + int state; + VALUE val = Qnil; /* OK */ + struct SCOPE *saved_scope; + volatile int safe = ruby_safe_level; + + if (OBJ_TAINTED(cmd)) { + level = 4; + } + if (TYPE(cmd) != T_STRING) { + PUSH_ITER(ITER_NOT); + PUSH_TAG(PROT_NONE); + ruby_safe_level = level; + if ((state = EXEC_TAG()) == 0) { + val = rb_funcall2(cmd, rb_intern("call"), RARRAY(arg)->len, RARRAY(arg)->ptr); + } + ruby_safe_level = safe; + POP_TAG(); + POP_ITER(); + if (state) JUMP_TAG(state); + return val; + } + + saved_scope = ruby_scope; + ruby_scope = top_scope; + PUSH_FRAME(); + ruby_frame->last_func = 0; + ruby_frame->last_class = 0; + ruby_frame->self = ruby_top_self; + PUSH_CREF(ruby_wrapper ? ruby_wrapper : rb_cObject); + + ruby_safe_level = level; + + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + val = eval(ruby_top_self, cmd, Qnil, 0, 0); + } + if (ruby_scope->flags & SCOPE_DONT_RECYCLE) + scope_dup(saved_scope); + ruby_scope = saved_scope; + ruby_safe_level = safe; + POP_TAG(); + POP_FRAME(); + + if (state) jump_tag_but_local_jump(state, val); + return val; +} + +#define ruby_cbase (ruby_cref->nd_clss) + +static VALUE +ev_const_defined(cref, id, self) + NODE *cref; + ID id; + VALUE self; +{ + NODE *cbase = cref; + VALUE result; + + while (cbase && cbase->nd_next) { + struct RClass *klass = RCLASS(cbase->nd_clss); + + if (!NIL_P(klass)) { + if (klass->iv_tbl && st_lookup(klass->iv_tbl, id, &result)) { + if (result == Qundef && NIL_P(rb_autoload_p((VALUE)klass, id))) { + return Qfalse; + } + return Qtrue; + } + } + cbase = cbase->nd_next; + } + return rb_const_defined(cref->nd_clss, id); +} + +static VALUE +ev_const_get(cref, id, self) + NODE *cref; + ID id; + VALUE self; +{ + NODE *cbase = cref; + VALUE result; + + while (cbase && cbase->nd_next) { + VALUE klass = cbase->nd_clss; + + if (!NIL_P(klass)) { + while (RCLASS(klass)->iv_tbl && + st_lookup(RCLASS(klass)->iv_tbl, id, &result)) { + if (result == Qundef) { + if (!RTEST(rb_autoload_load(klass, id))) break; + continue; + } + return result; + } + } + cbase = cbase->nd_next; + } + return rb_const_get(NIL_P(cref->nd_clss) ? CLASS_OF(self): cref->nd_clss, id); +} + +static VALUE +cvar_cbase() +{ + NODE *cref = ruby_cref; + + while (cref && cref->nd_next && (NIL_P(cref->nd_clss) || FL_TEST(cref->nd_clss, FL_SINGLETON))) { + cref = cref->nd_next; + if (!cref->nd_next) { + rb_warn("class variable access from toplevel singleton method"); + } + } + if (NIL_P(cref->nd_clss)) { + rb_raise(rb_eTypeError, "no class variables available"); + } + return cref->nd_clss; +} + +/* + * call-seq: + * Module.nesting => array + * + * Returns the list of +Modules+ nested at the point of call. + * + * module M1 + * module M2 + * $a = Module.nesting + * end + * end + * $a #=> [M1::M2, M1] + * $a[0].name #=> "M1::M2" + */ + +static VALUE +rb_mod_nesting() +{ + NODE *cbase = ruby_cref; + VALUE ary = rb_ary_new(); + + while (cbase && cbase->nd_next) { + if (!NIL_P(cbase->nd_clss)) rb_ary_push(ary, cbase->nd_clss); + cbase = cbase->nd_next; + } + if (ruby_wrapper && RARRAY(ary)->len == 0) { + rb_ary_push(ary, ruby_wrapper); + } + return ary; +} + +/* + * call-seq: + * Module.constants => array + * + * Returns an array of the names of all constants defined in the + * system. This list includes the names of all modules and classes. + * + * p Module.constants.sort[1..5] + * + * <em>produces:</em> + * + * ["ARGV", "ArgumentError", "Array", "Bignum", "Binding"] + */ + +static VALUE +rb_mod_s_constants() +{ + NODE *cbase = ruby_cref; + void *data = 0; + + while (cbase) { + if (!NIL_P(cbase->nd_clss)) { + data = rb_mod_const_at(cbase->nd_clss, data); + } + cbase = cbase->nd_next; + } + + if (!NIL_P(ruby_cbase)) { + data = rb_mod_const_of(ruby_cbase, data); + } + return rb_const_list(data); +} + +void +rb_frozen_class_p(klass) + VALUE klass; +{ + char *desc = "something(?!)"; + + if (OBJ_FROZEN(klass)) { + if (FL_TEST(klass, FL_SINGLETON)) + desc = "object"; + else { + switch (TYPE(klass)) { + case T_MODULE: + case T_ICLASS: + desc = "module"; break; + case T_CLASS: + desc = "class"; break; + } + } + rb_error_frozen(desc); + } +} + +void +rb_undef(klass, id) + VALUE klass; + ID id; +{ + VALUE origin; + NODE *body; + + if (ruby_cbase == rb_cObject && klass == rb_cObject) { + rb_secure(4); + } + if (ruby_safe_level >= 4 && !OBJ_TAINTED(klass)) { + rb_raise(rb_eSecurityError, "Insecure: can't undef `%s'", rb_id2name(id)); + } + rb_frozen_class_p(klass); + if (id == __id__ || id == __send__ || id == init) { + rb_warn("undefining `%s' may cause serious problem", rb_id2name(id)); + } + body = search_method(klass, id, &origin); + if (!body || !body->nd_body) { + char *s0 = " class"; + VALUE c = klass; + + if (FL_TEST(c, FL_SINGLETON)) { + VALUE obj = rb_iv_get(klass, "__attached__"); + + switch (TYPE(obj)) { + case T_MODULE: + case T_CLASS: + c = obj; + s0 = ""; + } + } + else if (TYPE(c) == T_MODULE) { + s0 = " module"; + } + rb_name_error(id, "undefined method `%s' for%s `%s'", + rb_id2name(id),s0,rb_class2name(c)); + } + rb_add_method(klass, id, 0, NOEX_PUBLIC); + if (FL_TEST(klass, FL_SINGLETON)) { + rb_funcall(rb_iv_get(klass, "__attached__"), + singleton_undefined, 1, ID2SYM(id)); + } + else { + rb_funcall(klass, undefined, 1, ID2SYM(id)); + } +} + +/* + * call-seq: + * undef_method(symbol) => self + * + * Prevents the current class from responding to calls to the named + * method. Contrast this with <code>remove_method</code>, which deletes + * the method from the particular class; Ruby will still search + * superclasses and mixed-in modules for a possible receiver. + * + * class Parent + * def hello + * puts "In parent" + * end + * end + * class Child < Parent + * def hello + * puts "In child" + * end + * end + * + * + * c = Child.new + * c.hello + * + * + * class Child + * remove_method :hello # remove from child, still in parent + * end + * c.hello + * + * + * class Child + * undef_method :hello # prevent any calls to 'hello' + * end + * c.hello + * + * <em>produces:</em> + * + * In child + * In parent + * prog.rb:23: undefined method `hello' for #<Child:0x401b3bb4> (NoMethodError) + */ + +static VALUE +rb_mod_undef_method(argc, argv, mod) + int argc; + VALUE *argv; + VALUE mod; +{ + int i; + + for (i=0; i<argc; i++) { + rb_undef(mod, rb_to_id(argv[i])); + } + return mod; +} + +void +rb_alias(klass, name, def) + VALUE klass; + ID name, def; +{ + VALUE origin; + NODE *orig, *body, *node; + VALUE singleton = 0; + st_data_t data; + + rb_frozen_class_p(klass); + if (name == def) return; + if (klass == rb_cObject) { + rb_secure(4); + } + orig = search_method(klass, def, &origin); + if (!orig || !orig->nd_body) { + if (TYPE(klass) == T_MODULE) { + orig = search_method(rb_cObject, def, &origin); + } + } + if (!orig || !orig->nd_body) { + print_undef(klass, def); + } + if (FL_TEST(klass, FL_SINGLETON)) { + singleton = rb_iv_get(klass, "__attached__"); + } + body = orig->nd_body; + orig->nd_cnt++; + if (nd_type(body) == NODE_FBODY) { /* was alias */ + def = body->nd_mid; + origin = body->nd_orig; + body = body->nd_head; + } + + rb_clear_cache_by_id(name); + if (RTEST(ruby_verbose) && st_lookup(RCLASS(klass)->m_tbl, name, &data)) { + node = (NODE *)data; + if (node->nd_cnt == 0 && node->nd_body) { + rb_warning("discarding old %s", rb_id2name(name)); + } + } + st_insert(RCLASS(klass)->m_tbl, name, + (st_data_t)NEW_METHOD(NEW_FBODY(body, def, origin), + NOEX_WITH_SAFE(orig->nd_noex))); + + if (!ruby_running) return; + + if (singleton) { + rb_funcall(singleton, singleton_added, 1, ID2SYM(name)); + } + else { + rb_funcall(klass, added, 1, ID2SYM(name)); + } +} + +/* + * call-seq: + * alias_method(new_name, old_name) => self + * + * Makes <i>new_name</i> a new copy of the method <i>old_name</i>. This can + * be used to retain access to methods that are overridden. + * + * module Mod + * alias_method :orig_exit, :exit + * def exit(code=0) + * puts "Exiting with code #{code}" + * orig_exit(code) + * end + * end + * include Mod + * exit(99) + * + * <em>produces:</em> + * + * Exiting with code 99 + */ + +static VALUE +rb_mod_alias_method(mod, newname, oldname) + VALUE mod, newname, oldname; +{ + rb_alias(mod, rb_to_id(newname), rb_to_id(oldname)); + return mod; +} + +NODE * +rb_copy_node_scope(node, rval) + NODE *node; + NODE *rval; +{ + NODE *copy = NEW_NODE(NODE_SCOPE,0,rval,node->nd_next); + + if (node->nd_tbl) { + copy->nd_tbl = ALLOC_N(ID, node->nd_tbl[0]+1); + MEMCPY(copy->nd_tbl, node->nd_tbl, ID, node->nd_tbl[0]+1); + } + else { + copy->nd_tbl = 0; + } + return copy; +} + +#ifdef C_ALLOCA +# define TMP_PROTECT NODE * volatile tmp__protect_tmp=0 +# define TMP_ALLOC(n) \ + (tmp__protect_tmp = NEW_NODE(NODE_ALLOCA, \ + ALLOC_N(VALUE,n),tmp__protect_tmp,n), \ + (void*)tmp__protect_tmp->nd_head) +#else +# define TMP_PROTECT typedef int foobazzz +# define TMP_ALLOC(n) ALLOCA_N(VALUE,n) +#endif + +#define SETUP_ARGS0(anode,extra) do {\ + NODE *n = anode;\ + if (!n) {\ + argc = 0;\ + argv = 0;\ + }\ + else if (nd_type(n) == NODE_ARRAY) {\ + argc=anode->nd_alen;\ + if (argc > 0) {\ + int i;\ + n = anode;\ + argv = TMP_ALLOC(argc+extra);\ + for (i=0;i<argc;i++) {\ + argv[i] = rb_eval(self,n->nd_head);\ + n=n->nd_next;\ + }\ + }\ + else {\ + argc = 0;\ + argv = 0;\ + }\ + }\ + else {\ + VALUE args = rb_eval(self,n);\ + if (TYPE(args) != T_ARRAY)\ + args = rb_ary_to_ary(args);\ + argc = RARRAY(args)->len;\ + argv = TMP_ALLOC(argc+extra);\ + MEMCPY(argv, RARRAY(args)->ptr, VALUE, argc);\ + }\ +} while (0) + +#define SETUP_ARGS(anode) SETUP_ARGS0(anode,0) + +#define BEGIN_CALLARGS do {\ + struct BLOCK *tmp_block = ruby_block;\ + int tmp_iter = ruby_iter->iter;\ + switch (tmp_iter) {\ + case ITER_PRE:\ + if (ruby_block) ruby_block = ruby_block->outer;\ + case ITER_PAS:\ + tmp_iter = ITER_NOT;\ + }\ + PUSH_ITER(tmp_iter) + +#define END_CALLARGS \ + ruby_block = tmp_block;\ + POP_ITER();\ +} while (0) + +#define MATCH_DATA *rb_svar(node->nd_cnt) + +static char* is_defined _((VALUE, NODE*, char*)); + +static char* +arg_defined(self, node, buf, type) + VALUE self; + NODE *node; + char *buf; + char *type; +{ + int argc; + int i; + + if (!node) return type; /* no args */ + if (nd_type(node) == NODE_ARRAY) { + argc=node->nd_alen; + if (argc > 0) { + for (i=0;i<argc;i++) { + if (!is_defined(self, node->nd_head, buf)) + return 0; + node = node->nd_next; + } + } + } + else if (!is_defined(self, node, buf)) { + return 0; + } + return type; +} + +static char* +is_defined(self, node, buf) + VALUE self; + NODE *node; /* OK */ + char *buf; +{ + VALUE val; /* OK */ + int state; + + again: + if (!node) return "expression"; + switch (nd_type(node)) { + case NODE_SUPER: + case NODE_ZSUPER: + if (ruby_frame->last_func == 0) return 0; + else if (ruby_frame->last_class == 0) return 0; + val = ruby_frame->last_class; + if (rb_method_boundp(RCLASS(val)->super, ruby_frame->orig_func, 0)) { + if (nd_type(node) == NODE_SUPER) { + return arg_defined(self, node->nd_args, buf, "super"); + } + return "super"; + } + break; + + case NODE_VCALL: + case NODE_FCALL: + val = self; + goto check_bound; + + case NODE_ATTRASGN: + val = self; + if (node->nd_recv == (NODE *)1) goto check_bound; + case NODE_CALL: + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + val = rb_eval(self, node->nd_recv); + } + POP_TAG(); + if (state) { + ruby_errinfo = Qnil; + return 0; + } + check_bound: + { + int call = nd_type(node)==NODE_CALL; + + val = CLASS_OF(val); + if (call) { + int noex; + ID id = node->nd_mid; + + if (!rb_get_method_body(&val, &id, &noex)) + break; + if ((noex & NOEX_PRIVATE)) + break; + if ((noex & NOEX_PROTECTED) && + !rb_obj_is_kind_of(self, rb_class_real(val))) + break; + } + else if (!rb_method_boundp(val, node->nd_mid, call)) + break; + return arg_defined(self, node->nd_args, buf, + nd_type(node) == NODE_ATTRASGN ? + "assignment" : "method"); + } + break; + + case NODE_MATCH2: + case NODE_MATCH3: + return "method"; + + case NODE_YIELD: + if (rb_block_given_p()) { + return "yield"; + } + break; + + case NODE_SELF: + return "self"; + + case NODE_NIL: + return "nil"; + + case NODE_TRUE: + return "true"; + + case NODE_FALSE: + return "false"; + + case NODE_ATTRSET: + case NODE_OP_ASGN1: + case NODE_OP_ASGN2: + case NODE_OP_ASGN_OR: + case NODE_OP_ASGN_AND: + case NODE_MASGN: + case NODE_LASGN: + case NODE_DASGN: + case NODE_DASGN_CURR: + case NODE_GASGN: + case NODE_IASGN: + case NODE_CDECL: + case NODE_CVDECL: + case NODE_CVASGN: + return "assignment"; + + case NODE_LVAR: + return "local-variable"; + case NODE_DVAR: + return "local-variable(in-block)"; + + case NODE_GVAR: + if (rb_gvar_defined(node->nd_entry)) { + return "global-variable"; + } + break; + + case NODE_IVAR: + if (rb_ivar_defined(self, node->nd_vid)) { + return "instance-variable"; + } + break; + + case NODE_CONST: + if (ev_const_defined(ruby_cref, node->nd_vid, self)) { + return "constant"; + } + break; + + case NODE_CVAR: + if (rb_cvar_defined(cvar_cbase(), node->nd_vid)) { + return "class variable"; + } + break; + + case NODE_COLON2: + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + val = rb_eval(self, node->nd_head); + } + POP_TAG(); + if (state) { + ruby_errinfo = Qnil; + return 0; + } + else { + switch (TYPE(val)) { + case T_CLASS: + case T_MODULE: + if (rb_const_defined_from(val, node->nd_mid)) + return "constant"; + break; + default: + if (rb_method_boundp(CLASS_OF(val), node->nd_mid, 1)) { + return "method"; + } + } + } + break; + + case NODE_COLON3: + if (rb_const_defined_from(rb_cObject, node->nd_mid)) { + return "constant"; + } + break; + + case NODE_NTH_REF: + if (RTEST(rb_reg_nth_defined(node->nd_nth, MATCH_DATA))) { + sprintf(buf, "$%d", (int)node->nd_nth); + return buf; + } + break; + + case NODE_BACK_REF: + if (RTEST(rb_reg_nth_defined(0, MATCH_DATA))) { + sprintf(buf, "$%c", (char)node->nd_nth); + return buf; + } + break; + + case NODE_NEWLINE: + node = node->nd_next; + goto again; + + default: + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + rb_eval(self, node); + } + POP_TAG(); + if (!state) { + return "expression"; + } + ruby_errinfo = Qnil; + break; + } + return 0; +} + +static int handle_rescue _((VALUE,NODE*)); + +static void blk_free(); + +static VALUE +rb_obj_is_proc(proc) + VALUE proc; +{ + if (TYPE(proc) == T_DATA && RDATA(proc)->dfree == (RUBY_DATA_FUNC)blk_free) { + return Qtrue; + } + return Qfalse; +} + +void +rb_add_event_hook(func, events) + rb_event_hook_func_t func; + rb_event_t events; +{ + rb_event_hook_t *hook; + + hook = ALLOC(rb_event_hook_t); + hook->func = func; + hook->events = events; + hook->next = event_hooks; + event_hooks = hook; +} + +int +rb_remove_event_hook(func) + rb_event_hook_func_t func; +{ + rb_event_hook_t *prev, *hook; + + prev = NULL; + hook = event_hooks; + while (hook) { + if (hook->func == func) { + if (prev) { + prev->next = hook->next; + } + else { + event_hooks = hook->next; + } + xfree(hook); + return 0; + } + prev = hook; + hook = hook->next; + } + return -1; +} + +/* + * call-seq: + * set_trace_func(proc) => proc + * set_trace_func(nil) => nil + * + * Establishes _proc_ as the handler for tracing, or disables + * tracing if the parameter is +nil+. _proc_ takes up + * to six parameters: an event name, a filename, a line number, an + * object id, a binding, and the name of a class. _proc_ is + * invoked whenever an event occurs. Events are: <code>c-call</code> + * (call a C-language routine), <code>c-return</code> (return from a + * C-language routine), <code>call</code> (call a Ruby method), + * <code>class</code> (start a class or module definition), + * <code>end</code> (finish a class or module definition), + * <code>line</code> (execute code on a new line), <code>raise</code> + * (raise an exception), and <code>return</code> (return from a Ruby + * method). Tracing is disabled within the context of _proc_. + * + * class Test + * def test + * a = 1 + * b = 2 + * end + * end + * + * set_trace_func proc { |event, file, line, id, binding, classname| + * printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname + * } + * t = Test.new + * t.test + * + * line prog.rb:11 false + * c-call prog.rb:11 new Class + * c-call prog.rb:11 initialize Object + * c-return prog.rb:11 initialize Object + * c-return prog.rb:11 new Class + * line prog.rb:12 false + * call prog.rb:2 test Test + * line prog.rb:3 test Test + * line prog.rb:4 test Test + * return prog.rb:4 test Test + */ + + +static VALUE +set_trace_func(obj, trace) + VALUE obj, trace; +{ + rb_event_hook_t *hook; + + rb_secure(4); + if (NIL_P(trace)) { + trace_func = 0; + rb_remove_event_hook(call_trace_func); + return Qnil; + } + if (!rb_obj_is_proc(trace)) { + rb_raise(rb_eTypeError, "trace_func needs to be Proc"); + } + trace_func = trace; + for (hook = event_hooks; hook; hook = hook->next) { + if (hook->func == call_trace_func) + return trace; + } + rb_add_event_hook(call_trace_func, RUBY_EVENT_ALL); + return trace; +} + +static char * +get_event_name(rb_event_t event) +{ + switch (event) { + case RUBY_EVENT_LINE: + return "line"; + case RUBY_EVENT_CLASS: + return "class"; + case RUBY_EVENT_END: + return "end"; + case RUBY_EVENT_CALL: + return "call"; + case RUBY_EVENT_RETURN: + return "return"; + case RUBY_EVENT_C_CALL: + return "c-call"; + case RUBY_EVENT_C_RETURN: + return "c-return"; + case RUBY_EVENT_RAISE: + return "raise"; + default: + return "unknown"; + } +} + +static void +call_trace_func(event, node, self, id, klass) + rb_event_t event; + NODE *node; + VALUE self; + ID id; + VALUE klass; /* OK */ +{ + int state, raised; + struct FRAME *prev; + NODE *node_save; + VALUE srcfile; + char *event_name; + rb_thread_t th = curr_thread; + + if (!trace_func) return; + if (tracing) return; + if (ruby_in_compile) return; + if (id == ID_ALLOCATOR) return; + + if (!(node_save = ruby_current_node)) { + node_save = NEW_NEWLINE(0); + } + tracing = 1; + prev = ruby_frame; + PUSH_FRAME(); + *ruby_frame = *prev; + ruby_frame->prev = prev; + ruby_frame->iter = 0; /* blocks not available anyway */ + + if (node) { + ruby_current_node = node; + ruby_frame->node = node; + ruby_sourcefile = node->nd_file; + ruby_sourceline = nd_line(node); + } + if (klass) { + if (TYPE(klass) == T_ICLASS) { + klass = RBASIC(klass)->klass; + } + else if (FL_TEST(klass, FL_SINGLETON)) { + klass = rb_iv_get(klass, "__attached__"); + } + } + PUSH_TAG(PROT_NONE); + raised = rb_thread_reset_raised(th); + if ((state = EXEC_TAG()) == 0) { + srcfile = rb_str_new2(ruby_sourcefile?ruby_sourcefile:"(ruby)"); + event_name = get_event_name(event); + proc_invoke(trace_func, rb_ary_new3(6, rb_str_new2(event_name), + srcfile, + INT2FIX(ruby_sourceline), + id?ID2SYM(id):Qnil, + self?rb_f_binding(self):Qnil, + klass), + Qundef, 0); + } + if (raised) rb_thread_set_raised(th); + POP_TAG(); + POP_FRAME(); + + tracing = 0; + ruby_current_node = node_save; + SET_CURRENT_SOURCE(); + if (state) JUMP_TAG(state); +} + +static VALUE +avalue_to_svalue(v) + VALUE v; +{ + VALUE tmp, top; + + tmp = rb_check_array_type(v); + if (NIL_P(tmp)) { + return v; + } + if (RARRAY(tmp)->len == 0) { + return Qundef; + } + if (RARRAY(tmp)->len == 1) { + top = rb_check_array_type(RARRAY(tmp)->ptr[0]); + if (NIL_P(top)) { + return RARRAY(tmp)->ptr[0]; + } + if (RARRAY(top)->len > 1) { + return v; + } + return top; + } + return tmp; +} + +static VALUE +svalue_to_avalue(v) + VALUE v; +{ + VALUE tmp, top; + + if (v == Qundef) return rb_ary_new2(0); + tmp = rb_check_array_type(v); + if (NIL_P(tmp)) { + return rb_ary_new3(1, v); + } + if (RARRAY(tmp)->len == 1) { + top = rb_check_array_type(RARRAY(tmp)->ptr[0]); + if (!NIL_P(top) && RARRAY(top)->len > 1) { + return tmp; + } + return rb_ary_new3(1, v); + } + return tmp; +} + +static VALUE +svalue_to_mrhs(v, lhs) + VALUE v; + NODE *lhs; +{ + VALUE tmp; + + if (v == Qundef) return rb_ary_new2(0); + tmp = rb_check_array_type(v); + if (NIL_P(tmp)) { + return rb_ary_new3(1, v); + } + /* no lhs means splat lhs only */ + if (!lhs) { + return rb_ary_new3(1, v); + } + return tmp; +} + +static VALUE +avalue_splat(v) + VALUE v; +{ + if (RARRAY(v)->len == 0) { + return Qundef; + } + if (RARRAY(v)->len == 1) { + return RARRAY(v)->ptr[0]; + } + return v; +} + +#if 1 +VALUE +rb_Array(val) + VALUE val; +{ + VALUE tmp = rb_check_array_type(val); + + if (NIL_P(tmp)) { + /* hack to avoid invoke Object#to_a */ + VALUE origin; + ID id = rb_intern("to_a"); + + if (search_method(CLASS_OF(val), id, &origin) && + RCLASS(origin)->m_tbl != RCLASS(rb_mKernel)->m_tbl) { /* exclude Kernel#to_a */ + val = rb_funcall(val, id, 0); + if (TYPE(val) != T_ARRAY) { + rb_raise(rb_eTypeError, "`to_a' did not return Array"); + } + return val; + } + else { + return rb_ary_new3(1, val); + } + } + return tmp; +} +#endif + +static VALUE +splat_value(v) + VALUE v; +{ + if (NIL_P(v)) return rb_ary_new3(1, Qnil); + return rb_Array(v); +} + +static VALUE +class_prefix(self, cpath) + VALUE self; + NODE *cpath; +{ + if (!cpath) { + rb_bug("class path missing"); + } + if (cpath->nd_head) { + VALUE c = rb_eval(self, cpath->nd_head); + switch (TYPE(c)) { + case T_CLASS: + case T_MODULE: + break; + default: + rb_raise(rb_eTypeError, "%s is not a class/module", + RSTRING(rb_obj_as_string(c))->ptr); + } + return c; + } + else if (nd_type(cpath) == NODE_COLON2) { + return ruby_cbase; + } + else if (ruby_wrapper) { + return ruby_wrapper; + } + else { + return rb_cObject; + } +} + +#define return_value(v) do {\ + if ((prot_tag->retval = (v)) == Qundef) {\ + prot_tag->retval = Qnil;\ + }\ +} while (0) + +NORETURN(static void return_jump _((VALUE))); +NORETURN(static void break_jump _((VALUE))); +NORETURN(static void next_jump _((VALUE))); +NORETURN(static void unknown_node _((NODE * volatile))); + +static void +unknown_node(node) + NODE *volatile node; +{ + ruby_current_node = 0; + if (node->flags == 0) { + rb_bug("terminated node (0x%lx)", node); + } + else if (BUILTIN_TYPE(node) != T_NODE) { + rb_bug("not a node 0x%02lx (0x%lx)", BUILTIN_TYPE(node), node); + } + else { + rb_bug("unknown node type %d (0x%lx)", nd_type(node), node); + } +} + +static VALUE +rb_eval(self, n) + VALUE self; + NODE *n; +{ + NODE * volatile contnode = 0; + NODE * volatile node = n; + int state; + volatile VALUE result = Qnil; + st_data_t data; + +#define RETURN(v) do { \ + result = (v); \ + goto finish; \ +} while (0) + + again: + if (!node) RETURN(Qnil); + + ruby_current_node = node; + switch (nd_type(node)) { + case NODE_BLOCK: + if (contnode) { + result = rb_eval(self, node); + break; + } + contnode = node->nd_next; + node = node->nd_head; + goto again; + + case NODE_POSTEXE: + rb_f_END(); + nd_set_type(node, NODE_NIL); /* exec just once */ + result = Qnil; + break; + + /* begin .. end without clauses */ + case NODE_BEGIN: + node = node->nd_body; + goto again; + + /* nodes for speed-up(default match) */ + case NODE_MATCH: + result = rb_reg_match2(node->nd_lit); + break; + + /* nodes for speed-up(literal match) */ + case NODE_MATCH2: + { + VALUE l = rb_eval(self,node->nd_recv); + VALUE r = rb_eval(self,node->nd_value); + result = rb_reg_match(l, r); + } + break; + + /* nodes for speed-up(literal match) */ + case NODE_MATCH3: + { + VALUE r = rb_eval(self,node->nd_recv); + VALUE l = rb_eval(self,node->nd_value); + if (TYPE(l) == T_STRING) { + result = rb_reg_match(r, l); + } + else { + result = rb_funcall(l, match, 1, r); + } + } + break; + + /* node for speed-up(top-level loop for -n/-p) */ + case NODE_OPT_N: + PUSH_TAG(PROT_LOOP); + switch (state = EXEC_TAG()) { + case 0: + opt_n_next: + while (!NIL_P(rb_gets())) { + opt_n_redo: + rb_eval(self, node->nd_body); + } + break; + + case TAG_REDO: + state = 0; + goto opt_n_redo; + case TAG_NEXT: + state = 0; + goto opt_n_next; + case TAG_BREAK: + state = 0; + default: + break; + } + POP_TAG(); + if (state) JUMP_TAG(state); + RETURN(Qnil); + + case NODE_SELF: + RETURN(self); + + case NODE_NIL: + RETURN(Qnil); + + case NODE_TRUE: + RETURN(Qtrue); + + case NODE_FALSE: + RETURN(Qfalse); + + case NODE_IF: + EXEC_EVENT_HOOK(RUBY_EVENT_LINE, node, self, + ruby_frame->last_func, + ruby_frame->last_class); + if (RTEST(rb_eval(self, node->nd_cond))) { + node = node->nd_body; + } + else { + node = node->nd_else; + } + goto again; + + case NODE_WHEN: + while (node) { + NODE *tag; + + if (nd_type(node) != NODE_WHEN) goto again; + tag = node->nd_head; + while (tag) { + EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self, + ruby_frame->last_func, + ruby_frame->last_class); + if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) { + VALUE v = rb_eval(self, tag->nd_head->nd_head); + long i; + + if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v); + for (i=0; i<RARRAY(v)->len; i++) { + if (RTEST(RARRAY(v)->ptr[i])) { + node = node->nd_body; + goto again; + } + } + tag = tag->nd_next; + continue; + } + if (RTEST(rb_eval(self, tag->nd_head))) { + node = node->nd_body; + goto again; + } + tag = tag->nd_next; + } + node = node->nd_next; + } + RETURN(Qnil); + + case NODE_CASE: + { + VALUE val; + + val = rb_eval(self, node->nd_head); + node = node->nd_body; + while (node) { + NODE *tag; + + if (nd_type(node) != NODE_WHEN) { + goto again; + } + tag = node->nd_head; + while (tag) { + EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self, + ruby_frame->last_func, + ruby_frame->last_class); + if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) { + VALUE v = rb_eval(self, tag->nd_head->nd_head); + long i; + + if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v); + for (i=0; i<RARRAY(v)->len; i++) { + if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val))){ + node = node->nd_body; + goto again; + } + } + tag = tag->nd_next; + continue; + } + if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val))) { + node = node->nd_body; + goto again; + } + tag = tag->nd_next; + } + node = node->nd_next; + } + } + RETURN(Qnil); + + case NODE_WHILE: + PUSH_TAG(PROT_LOOP); + result = Qnil; + switch (state = EXEC_TAG()) { + case 0: + if (node->nd_state && !RTEST(rb_eval(self, node->nd_cond))) + goto while_out; + do { + while_redo: + rb_eval(self, node->nd_body); + while_next: + ; + } while (RTEST(rb_eval(self, node->nd_cond))); + break; + + case TAG_REDO: + state = 0; + goto while_redo; + case TAG_NEXT: + state = 0; + goto while_next; + case TAG_BREAK: + if (TAG_DST()) { + state = 0; + result = prot_tag->retval; + } + /* fall through */ + default: + break; + } + while_out: + POP_TAG(); + if (state) JUMP_TAG(state); + RETURN(result); + + case NODE_UNTIL: + PUSH_TAG(PROT_LOOP); + result = Qnil; + switch (state = EXEC_TAG()) { + case 0: + if (node->nd_state && RTEST(rb_eval(self, node->nd_cond))) + goto until_out; + do { + until_redo: + rb_eval(self, node->nd_body); + until_next: + ; + } while (!RTEST(rb_eval(self, node->nd_cond))); + break; + + case TAG_REDO: + state = 0; + goto until_redo; + case TAG_NEXT: + state = 0; + goto until_next; + case TAG_BREAK: + if (TAG_DST()) { + state = 0; + result = prot_tag->retval; + } + /* fall through */ + default: + break; + } + until_out: + POP_TAG(); + if (state) JUMP_TAG(state); + RETURN(result); + + case NODE_BLOCK_PASS: + result = block_pass(self, node); + break; + + case NODE_ITER: + case NODE_FOR: + { + PUSH_TAG(PROT_LOOP); + PUSH_BLOCK(node->nd_var, node->nd_body); + + state = EXEC_TAG(); + if (state == 0) { + iter_retry: + PUSH_ITER(ITER_PRE); + if (nd_type(node) == NODE_ITER) { + result = rb_eval(self, node->nd_iter); + } + else { + VALUE recv; + + _block.flags &= ~BLOCK_D_SCOPE; + BEGIN_CALLARGS; + recv = rb_eval(self, node->nd_iter); + END_CALLARGS; + ruby_current_node = node; + SET_CURRENT_SOURCE(); + result = rb_call(CLASS_OF(recv),recv,each,0,0,0,self); + } + POP_ITER(); + } + else if (state == TAG_BREAK && TAG_DST()) { + result = prot_tag->retval; + state = 0; + } + else if (state == TAG_RETRY) { + state = 0; + goto iter_retry; + } + POP_BLOCK(); + POP_TAG(); + switch (state) { + case 0: + break; + default: + JUMP_TAG(state); + } + } + break; + + case NODE_BREAK: + break_jump(rb_eval(self, node->nd_stts)); + break; + + case NODE_NEXT: + CHECK_INTS; + next_jump(rb_eval(self, node->nd_stts)); + break; + + case NODE_REDO: + CHECK_INTS; + JUMP_TAG(TAG_REDO); + break; + + case NODE_RETRY: + CHECK_INTS; + JUMP_TAG(TAG_RETRY); + break; + + case NODE_SPLAT: + result = splat_value(rb_eval(self, node->nd_head)); + break; + + case NODE_TO_ARY: + result = rb_ary_to_ary(rb_eval(self, node->nd_head)); + break; + + case NODE_SVALUE: + result = avalue_splat(rb_eval(self, node->nd_head)); + if (result == Qundef) result = Qnil; + break; + + case NODE_YIELD: + if (node->nd_head) { + result = rb_eval(self, node->nd_head); + ruby_current_node = node; + } + else { + result = Qundef; /* no arg */ + } + SET_CURRENT_SOURCE(); + result = rb_yield_0(result, 0, 0, 0, node->nd_state); + break; + + case NODE_RESCUE: + { + volatile VALUE e_info = ruby_errinfo; + volatile int rescuing = 0; + + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + retry_entry: + result = rb_eval(self, node->nd_head); + } + else if (rescuing) { + if (rescuing < 0) { + /* in rescue argument, just reraise */ + } + else if (state == TAG_RETRY) { + rescuing = state = 0; + ruby_errinfo = e_info; + goto retry_entry; + } + else if (state != TAG_RAISE) { + result = prot_tag->retval; + } + } + else if (state == TAG_RAISE) { + NODE *resq = node->nd_resq; + + rescuing = -1; + while (resq) { + ruby_current_node = resq; + if (handle_rescue(self, resq)) { + state = 0; + rescuing = 1; + result = rb_eval(self, resq->nd_body); + break; + } + resq = resq->nd_head; /* next rescue */ + } + } + else { + result = prot_tag->retval; + } + POP_TAG(); + if (state != TAG_RAISE) ruby_errinfo = e_info; + if (state) { + JUMP_TAG(state); + } + /* no exception raised */ + if (!rescuing && (node = node->nd_else)) { /* else clause given */ + goto again; + } + } + break; + + case NODE_ENSURE: + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + result = rb_eval(self, node->nd_head); + } + POP_TAG(); + if (node->nd_ensr && !thread_no_ensure()) { + VALUE retval = prot_tag->retval; /* save retval */ + VALUE errinfo = ruby_errinfo; + + rb_eval(self, node->nd_ensr); + return_value(retval); + ruby_errinfo = errinfo; + } + if (state) JUMP_TAG(state); + break; + + case NODE_AND: + result = rb_eval(self, node->nd_1st); + if (!RTEST(result)) break; + node = node->nd_2nd; + goto again; + + case NODE_OR: + result = rb_eval(self, node->nd_1st); + if (RTEST(result)) break; + node = node->nd_2nd; + goto again; + + case NODE_NOT: + if (RTEST(rb_eval(self, node->nd_body))) result = Qfalse; + else result = Qtrue; + break; + + case NODE_DOT2: + case NODE_DOT3: + { + VALUE beg = rb_eval(self, node->nd_beg); + VALUE end = rb_eval(self, node->nd_end); + result = rb_range_new(beg, end, nd_type(node) == NODE_DOT3); + } + break; + + case NODE_FLIP2: /* like AWK */ + { + VALUE *flip = rb_svar(node->nd_cnt); + if (!flip) rb_bug("unexpected local variable"); + if (!RTEST(*flip)) { + if (RTEST(rb_eval(self, node->nd_beg))) { + *flip = RTEST(rb_eval(self, node->nd_end))?Qfalse:Qtrue; + result = Qtrue; + } + else { + result = Qfalse; + } + } + else { + if (RTEST(rb_eval(self, node->nd_end))) { + *flip = Qfalse; + } + result = Qtrue; + } + } + break; + + case NODE_FLIP3: /* like SED */ + { + VALUE *flip = rb_svar(node->nd_cnt); + if (!flip) rb_bug("unexpected local variable"); + if (!RTEST(*flip)) { + result = RTEST(rb_eval(self, node->nd_beg)) ? Qtrue : Qfalse; + *flip = result; + } + else { + if (RTEST(rb_eval(self, node->nd_end))) { + *flip = Qfalse; + } + result = Qtrue; + } + } + break; + + case NODE_RETURN: + return_jump(rb_eval(self, node->nd_stts)); + break; + + case NODE_ARGSCAT: + { + VALUE args = rb_eval(self, node->nd_head); + result = rb_ary_concat(args, splat_value(rb_eval(self, node->nd_body))); + } + break; + + case NODE_ARGSPUSH: + { + VALUE args = rb_ary_dup(rb_eval(self, node->nd_head)); + result = rb_ary_push(args, rb_eval(self, node->nd_body)); + } + break; + + case NODE_ATTRASGN: + { + VALUE recv; + int argc; VALUE *argv; /* used in SETUP_ARGS */ + int scope; + TMP_PROTECT; + + BEGIN_CALLARGS; + if (node->nd_recv == (NODE *)1) { + recv = self; + scope = 1; + } + else { + recv = rb_eval(self, node->nd_recv); + scope = 0; + } + SETUP_ARGS(node->nd_args); + END_CALLARGS; + + ruby_current_node = node; + SET_CURRENT_SOURCE(); + rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,scope,self); + result = argv[argc-1]; + } + break; + + case NODE_CALL: + { + VALUE recv; + int argc; VALUE *argv; /* used in SETUP_ARGS */ + TMP_PROTECT; + + BEGIN_CALLARGS; + recv = rb_eval(self, node->nd_recv); + SETUP_ARGS(node->nd_args); + END_CALLARGS; + + ruby_current_node = node; + SET_CURRENT_SOURCE(); + result = rb_call(CLASS_OF(recv),recv,node->nd_mid,argc,argv,0,self); + } + break; + + case NODE_FCALL: + { + int argc; VALUE *argv; /* used in SETUP_ARGS */ + TMP_PROTECT; + + BEGIN_CALLARGS; + SETUP_ARGS(node->nd_args); + END_CALLARGS; + + ruby_current_node = node; + SET_CURRENT_SOURCE(); + result = rb_call(CLASS_OF(self),self,node->nd_mid,argc,argv,1,self); + } + break; + + case NODE_VCALL: + SET_CURRENT_SOURCE(); + result = rb_call(CLASS_OF(self),self,node->nd_mid,0,0,2,self); + break; + + case NODE_SUPER: + case NODE_ZSUPER: + { + int argc; VALUE *argv; /* used in SETUP_ARGS */ + TMP_PROTECT; + + if (ruby_frame->last_class == 0) { + if (ruby_frame->last_func) { + rb_name_error(ruby_frame->last_func, + "superclass method `%s' disabled", + rb_id2name(ruby_frame->orig_func)); + } + else { + rb_raise(rb_eNoMethodError, "super called outside of method"); + } + } + if (nd_type(node) == NODE_ZSUPER) { + argc = ruby_frame->argc; + if (argc && DMETHOD_P()) { + if (TYPE(RBASIC(ruby_scope)->klass) != T_ARRAY || + RARRAY(RBASIC(ruby_scope)->klass)->len != argc) { + rb_raise(rb_eRuntimeError, + "super: specify arguments explicitly"); + } + argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr; + } + else if (!ruby_scope->local_vars) { + argc = 0; + argv = 0; + } + else { + argv = ruby_scope->local_vars + 2; + } + } + else { + BEGIN_CALLARGS; + SETUP_ARGS(node->nd_args); + END_CALLARGS; + ruby_current_node = node; + } + + SET_CURRENT_SOURCE(); + result = rb_call_super(argc, argv); + } + break; + + case NODE_SCOPE: + { + struct FRAME frame; + NODE *saved_cref = 0; + + frame = *ruby_frame; + frame.tmp = ruby_frame; + ruby_frame = &frame; + + PUSH_SCOPE(); + PUSH_TAG(PROT_NONE); + if (node->nd_rval) { + saved_cref = ruby_cref; + ruby_cref = (NODE*)node->nd_rval; + } + if (node->nd_tbl) { + VALUE *vars = ALLOCA_N(VALUE, node->nd_tbl[0]+1); + *vars++ = (VALUE)node; + ruby_scope->local_vars = vars; + rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]); + ruby_scope->local_tbl = node->nd_tbl; + } + else { + ruby_scope->local_vars = 0; + ruby_scope->local_tbl = 0; + } + if ((state = EXEC_TAG()) == 0) { + result = rb_eval(self, node->nd_next); + } + POP_TAG(); + POP_SCOPE(); + ruby_frame = frame.tmp; + if (saved_cref) + ruby_cref = saved_cref; + if (state) JUMP_TAG(state); + } + break; + + case NODE_OP_ASGN1: + { + int argc; VALUE *argv; /* used in SETUP_ARGS */ + VALUE recv, val, tmp; + NODE *rval; + TMP_PROTECT; + + recv = rb_eval(self, node->nd_recv); + rval = node->nd_args->nd_head; + SETUP_ARGS0(node->nd_args->nd_body, 1); + val = rb_funcall3(recv, aref, argc, argv); + switch (node->nd_mid) { + case 0: /* OR */ + if (RTEST(val)) RETURN(val); + val = rb_eval(self, rval); + break; + case 1: /* AND */ + if (!RTEST(val)) RETURN(val); + val = rb_eval(self, rval); + break; + default: + tmp = rb_eval(self, rval); + val = rb_funcall3(val, node->nd_mid, 1, &tmp); + } + argv[argc] = val; + rb_funcall2(recv, aset, argc+1, argv); + result = val; + } + break; + + case NODE_OP_ASGN2: + { + ID id = node->nd_next->nd_vid; + VALUE recv, val, tmp; + + recv = rb_eval(self, node->nd_recv); + val = rb_funcall3(recv, id, 0, 0); + switch (node->nd_next->nd_mid) { + case 0: /* OR */ + if (RTEST(val)) RETURN(val); + val = rb_eval(self, node->nd_value); + break; + case 1: /* AND */ + if (!RTEST(val)) RETURN(val); + val = rb_eval(self, node->nd_value); + break; + default: + tmp = rb_eval(self, node->nd_value); + val = rb_funcall3(val, node->nd_next->nd_mid, 1, &tmp); + } + + rb_funcall2(recv, node->nd_next->nd_aid, 1, &val); + result = val; + } + break; + + case NODE_OP_ASGN_AND: + result = rb_eval(self, node->nd_head); + if (!RTEST(result)) break; + node = node->nd_value; + goto again; + + case NODE_OP_ASGN_OR: + if ((node->nd_aid && !is_defined(self, node->nd_head, 0)) || + !RTEST(result = rb_eval(self, node->nd_head))) { + node = node->nd_value; + goto again; + } + break; + + case NODE_MASGN: + result = massign(self, node, rb_eval(self, node->nd_value), 0); + break; + + case NODE_LASGN: + if (ruby_scope->local_vars == 0) + rb_bug("unexpected local variable assignment"); + result = rb_eval(self, node->nd_value); + ruby_scope->local_vars[node->nd_cnt] = result; + break; + + case NODE_DASGN: + result = rb_eval(self, node->nd_value); + dvar_asgn(node->nd_vid, result); + break; + + case NODE_DASGN_CURR: + result = rb_eval(self, node->nd_value); + dvar_asgn_curr(node->nd_vid, result); + break; + + case NODE_GASGN: + result = rb_eval(self, node->nd_value); + rb_gvar_set(node->nd_entry, result); + break; + + case NODE_IASGN: + result = rb_eval(self, node->nd_value); + rb_ivar_set(self, node->nd_vid, result); + break; + + case NODE_CDECL: + result = rb_eval(self, node->nd_value); + if (node->nd_vid == 0) { + rb_const_set(class_prefix(self, node->nd_else), node->nd_else->nd_mid, result); + } + else { + rb_const_set(ruby_cbase, node->nd_vid, result); + } + break; + + case NODE_CVDECL: + if (NIL_P(ruby_cbase)) { + rb_raise(rb_eTypeError, "no class/module to define class variable"); + } + result = rb_eval(self, node->nd_value); + rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qtrue); + break; + + case NODE_CVASGN: + result = rb_eval(self, node->nd_value); + rb_cvar_set(cvar_cbase(), node->nd_vid, result, Qfalse); + break; + + case NODE_LVAR: + if (ruby_scope->local_vars == 0) { + rb_bug("unexpected local variable"); + } + result = ruby_scope->local_vars[node->nd_cnt]; + break; + + case NODE_DVAR: + result = rb_dvar_ref(node->nd_vid); + break; + + case NODE_GVAR: + result = rb_gvar_get(node->nd_entry); + break; + + case NODE_IVAR: + result = rb_ivar_get(self, node->nd_vid); + break; + + case NODE_CONST: + result = ev_const_get(ruby_cref, node->nd_vid, self); + break; + + case NODE_CVAR: + result = rb_cvar_get(cvar_cbase(), node->nd_vid); + break; + + case NODE_BLOCK_ARG: + if (ruby_scope->local_vars == 0) + rb_bug("unexpected block argument"); + if (rb_block_given_p()) { + result = rb_block_proc(); + ruby_scope->local_vars[node->nd_cnt] = result; + } + else { + result = Qnil; + } + break; + + case NODE_COLON2: + { + VALUE klass; + + klass = rb_eval(self, node->nd_head); + if (rb_is_const_id(node->nd_mid)) { + switch (TYPE(klass)) { + case T_CLASS: + case T_MODULE: + result = rb_const_get_from(klass, node->nd_mid); + break; + default: + rb_raise(rb_eTypeError, "%s is not a class/module", + RSTRING(rb_obj_as_string(klass))->ptr); + break; + } + } + else { + result = rb_funcall(klass, node->nd_mid, 0, 0); + } + } + break; + + case NODE_COLON3: + result = rb_const_get_from(rb_cObject, node->nd_mid); + break; + + case NODE_NTH_REF: + result = rb_reg_nth_match(node->nd_nth, MATCH_DATA); + break; + + case NODE_BACK_REF: + switch (node->nd_nth) { + case '&': + result = rb_reg_last_match(MATCH_DATA); + break; + case '`': + result = rb_reg_match_pre(MATCH_DATA); + break; + case '\'': + result = rb_reg_match_post(MATCH_DATA); + break; + case '+': + result = rb_reg_match_last(MATCH_DATA); + break; + default: + rb_bug("unexpected back-ref"); + } + break; + + case NODE_HASH: + { + NODE *list; + VALUE hash = rb_hash_new(); + VALUE key, val; + + list = node->nd_head; + while (list) { + key = rb_eval(self, list->nd_head); + list = list->nd_next; + if (list == 0) + rb_bug("odd number list for Hash"); + val = rb_eval(self, list->nd_head); + list = list->nd_next; + rb_hash_aset(hash, key, val); + } + result = hash; + } + break; + + case NODE_ZARRAY: /* zero length list */ + result = rb_ary_new(); + break; + + case NODE_ARRAY: + { + VALUE ary; + long i; + + i = node->nd_alen; + ary = rb_ary_new2(i); + for (i=0;node;node=node->nd_next) { + RARRAY(ary)->ptr[i++] = rb_eval(self, node->nd_head); + RARRAY(ary)->len = i; + } + + result = ary; + } + break; + + case NODE_STR: + result = rb_str_new3(node->nd_lit); + break; + + case NODE_EVSTR: + result = rb_obj_as_string(rb_eval(self, node->nd_body)); + break; + + case NODE_DSTR: + case NODE_DXSTR: + case NODE_DREGX: + case NODE_DREGX_ONCE: + case NODE_DSYM: + { + VALUE str, str2; + NODE *list = node->nd_next; + + str = rb_str_new3(node->nd_lit); + while (list) { + if (list->nd_head) { + switch (nd_type(list->nd_head)) { + case NODE_STR: + str2 = list->nd_head->nd_lit; + break; + default: + str2 = rb_eval(self, list->nd_head); + break; + } + rb_str_append(str, str2); + OBJ_INFECT(str, str2); + } + list = list->nd_next; + } + switch (nd_type(node)) { + case NODE_DREGX: + result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, + node->nd_cflag); + break; + case NODE_DREGX_ONCE: /* regexp expand once */ + result = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, + node->nd_cflag); + nd_set_type(node, NODE_LIT); + node->nd_lit = result; + break; + case NODE_LIT: + /* other thread may replace NODE_DREGX_ONCE to NODE_LIT */ + goto again; + case NODE_DXSTR: + result = rb_funcall(self, '`', 1, str); + break; + case NODE_DSYM: + result = rb_str_intern(str); + break; + default: + result = str; + break; + } + } + break; + + case NODE_XSTR: + result = rb_funcall(self, '`', 1, rb_str_new3(node->nd_lit)); + break; + + case NODE_LIT: + result = node->nd_lit; + break; + + case NODE_DEFN: + if (node->nd_defn) { + NODE *body, *defn; + VALUE origin; + int noex; + + if (NIL_P(ruby_class)) { + rb_raise(rb_eTypeError, "no class/module to add method"); + } + if (ruby_class == rb_cObject && node->nd_mid == init) { + rb_warn("redefining Object#initialize may cause infinite loop"); + } + if (node->nd_mid == __id__ || node->nd_mid == __send__) { + rb_warn("redefining `%s' may cause serious problem", + rb_id2name(node->nd_mid)); + } + rb_frozen_class_p(ruby_class); + body = search_method(ruby_class, node->nd_mid, &origin); + if (body){ + if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0 && body->nd_body) { + rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid)); + } + } + + if (SCOPE_TEST(SCOPE_PRIVATE) || node->nd_mid == init) { + noex = NOEX_PRIVATE; + } + else if (SCOPE_TEST(SCOPE_PROTECTED)) { + noex = NOEX_PROTECTED; + } + else { + noex = NOEX_PUBLIC; + } + if (body && origin == ruby_class && body->nd_body == 0) { + noex |= NOEX_NOSUPER; + } + + defn = rb_copy_node_scope(node->nd_defn, ruby_cref); + rb_add_method(ruby_class, node->nd_mid, defn, noex); + if (scope_vmode == SCOPE_MODFUNC) { + rb_add_method(rb_singleton_class(ruby_class), + node->nd_mid, defn, NOEX_PUBLIC); + } + result = Qnil; + } + break; + + case NODE_DEFS: + if (node->nd_defn) { + VALUE recv = rb_eval(self, node->nd_recv); + VALUE klass; + NODE *body = 0, *defn; + + if (ruby_safe_level >= 4 && !OBJ_TAINTED(recv)) { + rb_raise(rb_eSecurityError, "Insecure: can't define singleton method"); + } + if (FIXNUM_P(recv) || SYMBOL_P(recv)) { + rb_raise(rb_eTypeError, + "can't define singleton method \"%s\" for %s", + rb_id2name(node->nd_mid), + rb_obj_classname(recv)); + } + + if (OBJ_FROZEN(recv)) rb_error_frozen("object"); + klass = rb_singleton_class(recv); + if (st_lookup(RCLASS(klass)->m_tbl, node->nd_mid, &data)) { + body = (NODE *)data; + if (ruby_safe_level >= 4) { + rb_raise(rb_eSecurityError, "redefining method prohibited"); + } + if (RTEST(ruby_verbose)) { + rb_warning("redefine %s", rb_id2name(node->nd_mid)); + } + } + defn = rb_copy_node_scope(node->nd_defn, ruby_cref); + rb_add_method(klass, node->nd_mid, defn, + NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0)); + result = Qnil; + } + break; + + case NODE_UNDEF: + if (NIL_P(ruby_class)) { + rb_raise(rb_eTypeError, "no class to undef method"); + } + rb_undef(ruby_class, rb_to_id(rb_eval(self, node->u2.node))); + result = Qnil; + break; + + case NODE_ALIAS: + if (NIL_P(ruby_class)) { + rb_raise(rb_eTypeError, "no class to make alias"); + } + rb_alias(ruby_class, rb_to_id(rb_eval(self, node->u1.node)), + rb_to_id(rb_eval(self, node->u2.node))); + result = Qnil; + break; + + case NODE_VALIAS: + rb_alias_variable(node->u1.id, node->u2.id); + result = Qnil; + break; + + case NODE_CLASS: + { + VALUE super, klass, tmp, cbase; + ID cname; + int gen = Qfalse; + + cbase = class_prefix(self, node->nd_cpath); + cname = node->nd_cpath->nd_mid; + + if (NIL_P(ruby_cbase)) { + rb_raise(rb_eTypeError, "no outer class/module"); + } + if (node->nd_super) { + super = rb_eval(self, node->nd_super); + rb_check_inheritable(super); + } + else { + super = 0; + } + + if (rb_const_defined_at(cbase, cname)) { + klass = rb_const_get_at(cbase, cname); + if (TYPE(klass) != T_CLASS) { + rb_raise(rb_eTypeError, "%s is not a class", + rb_id2name(cname)); + } + if (super) { + tmp = rb_class_real(RCLASS(klass)->super); + if (tmp != super) { + rb_raise(rb_eTypeError, "superclass mismatch for class %s", + rb_id2name(cname)); + } + super = 0; + } + if (ruby_safe_level >= 4) { + rb_raise(rb_eSecurityError, "extending class prohibited"); + } + } + else { + if (!super) super = rb_cObject; + klass = rb_define_class_id(cname, super); + rb_set_class_path(klass, cbase, rb_id2name(cname)); + rb_const_set(cbase, cname, klass); + gen = Qtrue; + } + if (ruby_wrapper) { + rb_extend_object(klass, ruby_wrapper); + rb_include_module(klass, ruby_wrapper); + } + if (super && gen) { + rb_class_inherited(super, klass); + } + result = module_setup(klass, node); + } + break; + + case NODE_MODULE: + { + VALUE module, cbase; + ID cname; + + if (NIL_P(ruby_cbase)) { + rb_raise(rb_eTypeError, "no outer class/module"); + } + cbase = class_prefix(self, node->nd_cpath); + cname = node->nd_cpath->nd_mid; + if (rb_const_defined_at(cbase, cname)) { + module = rb_const_get_at(cbase, cname); + if (TYPE(module) != T_MODULE) { + rb_raise(rb_eTypeError, "%s is not a module", + rb_id2name(cname)); + } + if (ruby_safe_level >= 4) { + rb_raise(rb_eSecurityError, "extending module prohibited"); + } + } + else { + module = rb_define_module_id(cname); + rb_set_class_path(module, cbase, rb_id2name(cname)); + rb_const_set(cbase, cname, module); + } + if (ruby_wrapper) { + rb_extend_object(module, ruby_wrapper); + rb_include_module(module, ruby_wrapper); + } + + result = module_setup(module, node); + } + break; + + case NODE_SCLASS: + { + VALUE klass; + + result = rb_eval(self, node->nd_recv); + if (FIXNUM_P(result) || SYMBOL_P(result)) { + rb_raise(rb_eTypeError, "no virtual class for %s", + rb_obj_classname(result)); + } + if (ruby_safe_level >= 4 && !OBJ_TAINTED(result)) + rb_raise(rb_eSecurityError, "Insecure: can't extend object"); + klass = rb_singleton_class(result); + + if (ruby_wrapper) { + rb_extend_object(klass, ruby_wrapper); + rb_include_module(klass, ruby_wrapper); + } + + result = module_setup(klass, node); + } + break; + + case NODE_DEFINED: + { + char buf[20]; + char *desc = is_defined(self, node->nd_head, buf); + + if (desc) result = rb_str_new2(desc); + else result = Qnil; + } + break; + + case NODE_NEWLINE: + EXEC_EVENT_HOOK(RUBY_EVENT_LINE, node, self, + ruby_frame->last_func, + ruby_frame->last_class); + node = node->nd_next; + goto again; + + default: + unknown_node(node); + } + finish: + CHECK_INTS; + if (contnode) { + node = contnode; + contnode = 0; + goto again; + } + return result; +} + +static VALUE +module_setup(module, n) + VALUE module; + NODE *n; +{ + NODE * volatile node = n->nd_body; + int state; + struct FRAME frame; + VALUE result = Qnil; /* OK */ + TMP_PROTECT; + + frame = *ruby_frame; + frame.tmp = ruby_frame; + ruby_frame = &frame; + + PUSH_CLASS(module); + PUSH_SCOPE(); + PUSH_VARS(); + + if (node->nd_tbl) { + VALUE *vars = TMP_ALLOC(node->nd_tbl[0]+1); + *vars++ = (VALUE)node; + ruby_scope->local_vars = vars; + rb_mem_clear(ruby_scope->local_vars, node->nd_tbl[0]); + ruby_scope->local_tbl = node->nd_tbl; + } + else { + ruby_scope->local_vars = 0; + ruby_scope->local_tbl = 0; + } + + PUSH_CREF(module); + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + EXEC_EVENT_HOOK(RUBY_EVENT_CLASS, n, ruby_cbase, + ruby_frame->last_func, ruby_frame->last_class); + result = rb_eval(ruby_cbase, node->nd_next); + } + POP_TAG(); + POP_CREF(); + POP_VARS(); + POP_SCOPE(); + POP_CLASS(); + + ruby_frame = frame.tmp; + EXEC_EVENT_HOOK(RUBY_EVENT_END, n, 0, + ruby_frame->last_func, ruby_frame->last_class); + if (state) JUMP_TAG(state); + + return result; +} + +static NODE *basic_respond_to = 0; + +int +rb_obj_respond_to(obj, id, priv) + VALUE obj; + ID id; + int priv; +{ + VALUE klass = CLASS_OF(obj); + + if (rb_method_node(klass, respond_to) == basic_respond_to) { + return rb_method_boundp(klass, id, !priv); + } + else { + VALUE args[2]; + int n = 0; + args[n++] = ID2SYM(id); + if (priv) args[n++] = Qtrue; + return RTEST(rb_funcall2(obj, respond_to, n, args)); + } +} + +int +rb_respond_to(obj, id) + VALUE obj; + ID id; +{ + return rb_obj_respond_to(obj, id, Qfalse); +} + +/* + * call-seq: + * obj.respond_to?(symbol, include_private=false) => true or false + * + * Returns +true+> if _obj_ responds to the given + * method. Private methods are included in the search only if the + * optional second parameter evaluates to +true+. + */ + +static VALUE +obj_respond_to(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE mid, priv; + ID id; + + rb_scan_args(argc, argv, "11", &mid, &priv); + id = rb_to_id(mid); + if (rb_method_boundp(CLASS_OF(obj), id, !RTEST(priv))) { + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * mod.method_defined?(symbol) => true or false + * + * Returns +true+ if the named method is defined by + * _mod_ (or its included modules and, if _mod_ is a class, + * its ancestors). Public and protected methods are matched. + * + * module A + * def method1() end + * end + * class B + * def method2() end + * end + * class C < B + * include A + * def method3() end + * end + * + * A.method_defined? :method1 #=> true + * C.method_defined? "method1" #=> true + * C.method_defined? "method2" #=> true + * C.method_defined? "method3" #=> true + * C.method_defined? "method4" #=> false + */ + +static VALUE +rb_mod_method_defined(mod, mid) + VALUE mod, mid; +{ + return rb_method_boundp(mod, rb_to_id(mid), 1); +} + +#define VISI_CHECK(x,f) (((x)&NOEX_MASK) == (f)) + +/* + * call-seq: + * mod.public_method_defined?(symbol) => true or false + * + * Returns +true+ if the named public method is defined by + * _mod_ (or its included modules and, if _mod_ is a class, + * its ancestors). + * + * module A + * def method1() end + * end + * class B + * protected + * def method2() end + * end + * class C < B + * include A + * def method3() end + * end + * + * A.method_defined? :method1 #=> true + * C.public_method_defined? "method1" #=> true + * C.public_method_defined? "method2" #=> false + * C.method_defined? "method2" #=> true + */ + +static VALUE +rb_mod_public_method_defined(mod, mid) + VALUE mod, mid; +{ + ID id = rb_to_id(mid); + int noex; + + if (rb_get_method_body(&mod, &id, &noex)) { + if (VISI_CHECK(noex, NOEX_PUBLIC)) + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * mod.private_method_defined?(symbol) => true or false + * + * Returns +true+ if the named private method is defined by + * _ mod_ (or its included modules and, if _mod_ is a class, + * its ancestors). + * + * module A + * def method1() end + * end + * class B + * private + * def method2() end + * end + * class C < B + * include A + * def method3() end + * end + * + * A.method_defined? :method1 #=> true + * C.private_method_defined? "method1" #=> false + * C.private_method_defined? "method2" #=> true + * C.method_defined? "method2" #=> false + */ + +static VALUE +rb_mod_private_method_defined(mod, mid) + VALUE mod, mid; +{ + ID id = rb_to_id(mid); + int noex; + + if (rb_get_method_body(&mod, &id, &noex)) { + if (VISI_CHECK(noex, NOEX_PRIVATE)) + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * mod.protected_method_defined?(symbol) => true or false + * + * Returns +true+ if the named protected method is defined + * by _mod_ (or its included modules and, if _mod_ is a + * class, its ancestors). + * + * module A + * def method1() end + * end + * class B + * protected + * def method2() end + * end + * class C < B + * include A + * def method3() end + * end + * + * A.method_defined? :method1 #=> true + * C.protected_method_defined? "method1" #=> false + * C.protected_method_defined? "method2" #=> true + * C.method_defined? "method2" #=> true + */ + +static VALUE +rb_mod_protected_method_defined(mod, mid) + VALUE mod, mid; +{ + ID id = rb_to_id(mid); + int noex; + + if (rb_get_method_body(&mod, &id, &noex)) { + if (VISI_CHECK(noex, NOEX_PROTECTED)) + return Qtrue; + } + return Qfalse; +} + +NORETURN(static VALUE terminate_process _((int, VALUE))); +static VALUE +terminate_process(status, mesg) + int status; + VALUE mesg; +{ + VALUE args[2]; + args[0] = INT2NUM(status); + args[1] = mesg; + + rb_exc_raise(rb_class_new_instance(2, args, rb_eSystemExit)); +} + +void +rb_exit(status) + int status; +{ + if (prot_tag) { + terminate_process(status, rb_str_new("exit", 4)); + } + ruby_finalize(); + exit(status); +} + + +/* + * call-seq: + * exit(integer=0) + * Kernel::exit(integer=0) + * Process::exit(integer=0) + * + * Initiates the termination of the Ruby script by raising the + * <code>SystemExit</code> exception. This exception may be caught. The + * optional parameter is used to return a status code to the invoking + * environment. + * + * begin + * exit + * puts "never get here" + * rescue SystemExit + * puts "rescued a SystemExit exception" + * end + * puts "after begin block" + * + * <em>produces:</em> + * + * rescued a SystemExit exception + * after begin block + * + * Just prior to termination, Ruby executes any <code>at_exit</code> functions + * (see Kernel::at_exit) and runs any object finalizers (see + * ObjectSpace::define_finalizer). + * + * at_exit { puts "at_exit function" } + * ObjectSpace.define_finalizer("string", proc { puts "in finalizer" }) + * exit + * + * <em>produces:</em> + * + * at_exit function + * in finalizer + */ + +VALUE +rb_f_exit(argc, argv) + int argc; + VALUE *argv; +{ + VALUE status; + int istatus; + + rb_secure(4); + if (rb_scan_args(argc, argv, "01", &status) == 1) { + switch (status) { + case Qtrue: + istatus = EXIT_SUCCESS; + break; + case Qfalse: + istatus = EXIT_FAILURE; + break; + default: + istatus = NUM2INT(status); +#if EXIT_SUCCESS != 0 + if (istatus == 0) istatus = EXIT_SUCCESS; +#endif + break; + } + } + else { + istatus = EXIT_SUCCESS; + } + rb_exit(istatus); + return Qnil; /* not reached */ +} + + +/* + * call-seq: + * abort + * Kernel::abort + * Process::abort + * + * Terminate execution immediately, effectively by calling + * <code>Kernel.exit(1)</code>. If _msg_ is given, it is written + * to STDERR prior to terminating. + */ + +VALUE +rb_f_abort(argc, argv) + int argc; + VALUE *argv; +{ + rb_secure(4); + if (argc == 0) { + if (!NIL_P(ruby_errinfo)) { + error_print(); + } + rb_exit(EXIT_FAILURE); + } + else { + VALUE mesg; + + rb_scan_args(argc, argv, "1", &mesg); + StringValue(mesg); + rb_io_puts(1, &mesg, rb_stderr); + terminate_process(EXIT_FAILURE, mesg); + } + return Qnil; /* not reached */ +} + +void +rb_iter_break() +{ + break_jump(Qnil); +} + +NORETURN(static void rb_longjmp _((int, VALUE))); +static VALUE make_backtrace _((void)); + +static void +rb_longjmp(tag, mesg) + int tag; + VALUE mesg; +{ + VALUE at; + rb_thread_t th = curr_thread; + + if (rb_thread_set_raised(th)) { + ruby_errinfo = exception_error; + JUMP_TAG(TAG_FATAL); + } + if (NIL_P(mesg)) mesg = ruby_errinfo; + if (NIL_P(mesg)) { + mesg = rb_exc_new(rb_eRuntimeError, 0, 0); + } + + ruby_set_current_source(); + if (ruby_sourcefile && !NIL_P(mesg)) { + at = get_backtrace(mesg); + if (NIL_P(at)) { + at = make_backtrace(); + if (OBJ_FROZEN(mesg)) { + mesg = rb_obj_dup(mesg); + } + set_backtrace(mesg, at); + } + } + if (!NIL_P(mesg)) { + ruby_errinfo = mesg; + } + + if (RTEST(ruby_debug) && !NIL_P(ruby_errinfo) + && !rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) { + VALUE e = ruby_errinfo; + int status; + + PUSH_TAG(PROT_NONE); + if ((status = EXEC_TAG()) == 0) { + StringValue(e); + warn_printf("Exception `%s' at %s:%d - %s\n", + rb_obj_classname(ruby_errinfo), + ruby_sourcefile, ruby_sourceline, + RSTRING(e)->ptr); + } + POP_TAG(); + if (status == TAG_FATAL && ruby_errinfo == exception_error) { + ruby_errinfo = mesg; + } + else if (status) { + rb_thread_reset_raised(th); + JUMP_TAG(status); + } + } + + rb_trap_restore_mask(); + if (tag != TAG_FATAL) { + EXEC_EVENT_HOOK(RUBY_EVENT_RAISE, ruby_current_node, + ruby_frame->self, + ruby_frame->last_func, + ruby_frame->last_class); + } + if (!prot_tag) { + error_print(); + } + rb_thread_raised_clear(th); + JUMP_TAG(tag); +} + +void +rb_exc_jump(mesg) + VALUE mesg; +{ + rb_thread_raised_clear(rb_curr_thread); + ruby_errinfo = mesg; + JUMP_TAG(TAG_RAISE); +} + +void +rb_exc_raise(mesg) + VALUE mesg; +{ + rb_longjmp(TAG_RAISE, mesg); +} + +void +rb_exc_fatal(mesg) + VALUE mesg; +{ + rb_longjmp(TAG_FATAL, mesg); +} + +void +rb_interrupt() +{ + rb_raise(rb_eInterrupt, ""); +} + +/* + * call-seq: + * raise + * raise(string) + * raise(exception [, string [, array]]) + * fail + * fail(string) + * fail(exception [, string [, array]]) + * + * With no arguments, raises the exception in <code>$!</code> or raises + * a <code>RuntimeError</code> if <code>$!</code> is +nil+. + * With a single +String+ argument, raises a + * +RuntimeError+ with the string as a message. Otherwise, + * the first parameter should be the name of an +Exception+ + * class (or an object that returns an +Exception+ object when sent + * an +exception+ message). The optional second parameter sets the + * message associated with the exception, and the third parameter is an + * array of callback information. Exceptions are caught by the + * +rescue+ clause of <code>begin...end</code> blocks. + * + * raise "Failed to create socket" + * raise ArgumentError, "No parameters", caller + */ + +static VALUE +rb_f_raise(argc, argv) + int argc; + VALUE *argv; +{ + rb_raise_jump(rb_make_exception(argc, argv)); + return Qnil; /* not reached */ +} + +static VALUE +rb_make_exception(argc, argv) + int argc; + VALUE *argv; +{ + VALUE mesg; + ID exception; + int n; + + mesg = Qnil; + switch (argc) { + case 0: + mesg = Qnil; + break; + case 1: + if (NIL_P(argv[0])) break; + if (TYPE(argv[0]) == T_STRING) { + mesg = rb_exc_new3(rb_eRuntimeError, argv[0]); + break; + } + n = 0; + goto exception_call; + + case 2: + case 3: + n = 1; + exception_call: + exception = rb_intern("exception"); + if (!rb_respond_to(argv[0], exception)) { + rb_raise(rb_eTypeError, "exception class/object expected"); + } + mesg = rb_funcall(argv[0], exception, n, argv[1]); + break; + default: + rb_raise(rb_eArgError, "wrong number of arguments"); + break; + } + if (argc > 0) { + if (!rb_obj_is_kind_of(mesg, rb_eException)) + rb_raise(rb_eTypeError, "exception object expected"); + if (argc>2) + set_backtrace(mesg, argv[2]); + } + + return mesg; +} + +static void +rb_raise_jump(mesg) + VALUE mesg; +{ + if (ruby_frame != top_frame) { + PUSH_FRAME(); /* fake frame */ + *ruby_frame = *_frame.prev->prev; + rb_longjmp(TAG_RAISE, mesg); + POP_FRAME(); + } + rb_longjmp(TAG_RAISE, mesg); +} + +void +rb_jump_tag(tag) + int tag; +{ + JUMP_TAG(tag); +} + +int +rb_block_given_p() +{ + if (ruby_frame->iter == ITER_CUR && ruby_block) + return Qtrue; + return Qfalse; +} + +int +rb_iterator_p() +{ + return rb_block_given_p(); +} + +/* + * call-seq: + * block_given? => true or false + * iterator? => true or false + * + * Returns <code>true</code> if <code>yield</code> would execute a + * block in the current context. The <code>iterator?</code> form + * is mildly deprecated. + * + * def try + * if block_given? + * yield + * else + * "no block" + * end + * end + * try #=> "no block" + * try { "hello" } #=> "hello" + * try do "hello" end #=> "hello" + */ + + +static VALUE +rb_f_block_given_p() +{ + if (ruby_frame->prev && ruby_frame->prev->iter == ITER_CUR && ruby_block) + return Qtrue; + return Qfalse; +} + +VALUE rb_eThreadError; + +NORETURN(static void proc_jump_error(int, VALUE)); +static void +proc_jump_error(state, result) + int state; + VALUE result; +{ + char mesg[32]; + char *statement; + + switch (state) { + case TAG_BREAK: + statement = "break"; break; + case TAG_RETURN: + statement = "return"; break; + case TAG_RETRY: + statement = "retry"; break; + default: + statement = "local-jump"; break; /* should not happen */ + } + snprintf(mesg, sizeof mesg, "%s from proc-closure", statement); + localjump_error(mesg, result, state); +} + +static void +return_jump(retval) + VALUE retval; +{ + struct tag *tt = prot_tag; + int yield = Qfalse; + + if (retval == Qundef) retval = Qnil; + while (tt) { + if (tt->tag == PROT_YIELD) { + yield = Qtrue; + tt = tt->prev; + } + if (tt->tag == PROT_FUNC && tt->frame->uniq == ruby_frame->uniq) { + tt->dst = (VALUE)ruby_frame->uniq; + tt->retval = retval; + JUMP_TAG(TAG_RETURN); + } + if (tt->tag == PROT_LAMBDA && !yield) { + tt->dst = (VALUE)tt->frame->uniq; + tt->retval = retval; + JUMP_TAG(TAG_RETURN); + } + if (tt->tag == PROT_THREAD) { + rb_raise(rb_eThreadError, "return can't jump across threads"); + } + tt = tt->prev; + } + localjump_error("unexpected return", retval, TAG_RETURN); +} + +static void +break_jump(retval) + VALUE retval; +{ + struct tag *tt = prot_tag; + + if (retval == Qundef) retval = Qnil; + while (tt) { + switch (tt->tag) { + case PROT_THREAD: + case PROT_YIELD: + case PROT_LOOP: + case PROT_LAMBDA: + tt->dst = (VALUE)tt->frame->uniq; + tt->retval = retval; + JUMP_TAG(TAG_BREAK); + break; + case PROT_FUNC: + tt = 0; + continue; + default: + break; + } + tt = tt->prev; + } + localjump_error("unexpected break", retval, TAG_BREAK); +} + +static void +next_jump(retval) + VALUE retval; +{ + struct tag *tt = prot_tag; + + if (retval == Qundef) retval = Qnil; + while (tt) { + switch (tt->tag) { + case PROT_THREAD: + case PROT_YIELD: + case PROT_LOOP: + case PROT_LAMBDA: + case PROT_FUNC: + tt->dst = (VALUE)tt->frame->uniq; + tt->retval = retval; + JUMP_TAG(TAG_NEXT); + break; + default: + break; + } + tt = tt->prev; + } + localjump_error("unexpected next", retval, TAG_NEXT); +} + +void +rb_need_block() +{ + if (!rb_block_given_p()) { + localjump_error("no block given", Qnil, 0); + } +} + +static VALUE +rb_yield_0(val, self, klass, flags, avalue) + VALUE val, self, klass; /* OK */ + int flags, avalue; +{ + NODE *node; + volatile VALUE result = Qnil; + volatile VALUE old_cref; + volatile VALUE old_wrapper; + struct BLOCK * volatile block; + struct SCOPE * volatile old_scope; + int old_vmode; + struct FRAME frame; + NODE *cnode = ruby_current_node; + int lambda = flags & YIELD_LAMBDA_CALL; + int state; + + rb_need_block(); + + PUSH_VARS(); + block = ruby_block; + frame = block->frame; + frame.prev = ruby_frame; + frame.node = cnode; + ruby_frame = &(frame); + old_cref = (VALUE)ruby_cref; + ruby_cref = block->cref; + old_wrapper = ruby_wrapper; + ruby_wrapper = block->wrapper; + old_scope = ruby_scope; + ruby_scope = block->scope; + old_vmode = scope_vmode; + scope_vmode = (flags & YIELD_PUBLIC_DEF) ? SCOPE_PUBLIC : block->vmode; + ruby_block = block->prev; + if (block->flags & BLOCK_D_SCOPE) { + /* put place holder for dynamic (in-block) local variables */ + ruby_dyna_vars = new_dvar(0, 0, block->dyna_vars); + } + else { + /* FOR does not introduce new scope */ + ruby_dyna_vars = block->dyna_vars; + } + PUSH_CLASS(klass ? klass : block->klass); + if (!klass) { + self = block->self; + } + node = block->body; + + if (block->var) { + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + if (block->var == (NODE*)1) { /* no parameter || */ + if (lambda && RARRAY(val)->len != 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%ld for 0)", + RARRAY(val)->len); + } + } + else if (block->var == (NODE*)2) { + if (TYPE(val) == T_ARRAY && RARRAY(val)->len != 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%ld for 0)", + RARRAY(val)->len); + } + } + else if (nd_type(block->var) == NODE_MASGN) { + if (!avalue) { + val = svalue_to_mrhs(val, block->var->nd_head); + } + massign(self, block->var, val, lambda); + } + else { + int len = 0; + if (avalue) { + len = RARRAY(val)->len; + if (len == 0) { + goto zero_arg; + } + if (len == 1) { + val = RARRAY(val)->ptr[0]; + } + else { + goto multi_values; + } + } + else if (val == Qundef) { + zero_arg: + val = Qnil; + multi_values: + { + ruby_current_node = block->var; + rb_warn("multiple values for a block parameter (%d for 1)\n\tfrom %s:%d", + len, cnode->nd_file, nd_line(cnode)); + ruby_current_node = cnode; + } + } + assign(self, block->var, val, lambda); + } + } + POP_TAG(); + if (state) goto pop_state; + } + if (!node) { + state = 0; + goto pop_state; + } + ruby_current_node = node; + + PUSH_ITER(block->iter); + PUSH_TAG(lambda ? PROT_NONE : PROT_YIELD); + if ((state = EXEC_TAG()) == 0) { + redo: + if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) { + if (node->nd_state == YIELD_FUNC_AVALUE) { + if (!avalue) { + val = svalue_to_avalue(val); + } + } + else { + if (avalue) { + val = avalue_to_svalue(val); + } + if (val == Qundef && node->nd_state != YIELD_FUNC_SVALUE) + val = Qnil; + } + result = (*node->nd_cfnc)(val, node->nd_tval, self); + } + else { + result = rb_eval(self, node); + } + } + else { + switch (state) { + case TAG_REDO: + state = 0; + CHECK_INTS; + goto redo; + case TAG_NEXT: + if (!lambda) { + state = 0; + result = prot_tag->retval; + } + break; + case TAG_BREAK: + if (TAG_DST()) { + result = prot_tag->retval; + } + else { + lambda = Qtrue; /* just pass TAG_BREAK */ + } + break; + default: + break; + } + } + POP_TAG(); + POP_ITER(); + pop_state: + POP_CLASS(); + if (ruby_dyna_vars && (block->flags & BLOCK_D_SCOPE) && + !FL_TEST(ruby_dyna_vars, DVAR_DONT_RECYCLE)) { + struct RVarmap *vars = ruby_dyna_vars; + + if (ruby_dyna_vars->id == 0) { + vars = ruby_dyna_vars->next; + rb_gc_force_recycle((VALUE)ruby_dyna_vars); + while (vars && vars->id != 0 && vars != block->dyna_vars) { + struct RVarmap *tmp = vars->next; + rb_gc_force_recycle((VALUE)vars); + vars = tmp; + } + } + } + POP_VARS(); + ruby_block = block; + ruby_frame = ruby_frame->prev; + ruby_cref = (NODE*)old_cref; + ruby_wrapper = old_wrapper; + if (ruby_scope->flags & SCOPE_DONT_RECYCLE) + scope_dup(old_scope); + ruby_scope = old_scope; + scope_vmode = old_vmode; + switch (state) { + case 0: + break; + case TAG_BREAK: + if (!lambda) { + struct tag *tt = prot_tag; + + while (tt) { + if (tt->tag == PROT_LOOP && tt->blkid == ruby_block->uniq) { + tt->dst = (VALUE)tt->frame->uniq; + tt->retval = result; + JUMP_TAG(TAG_BREAK); + } + tt = tt->prev; + } + proc_jump_error(TAG_BREAK, result); + } + /* fall through */ + default: + JUMP_TAG(state); + break; + } + ruby_current_node = cnode; + return result; +} + +VALUE +rb_yield(val) + VALUE val; +{ + return rb_yield_0(val, 0, 0, 0, Qfalse); +} + +VALUE +#ifdef HAVE_STDARG_PROTOTYPES +rb_yield_values(int n, ...) +#else +rb_yield_values(n, va_alist) + int n; + va_dcl +#endif +{ + va_list args; + VALUE ary; + + if (n == 0) { + return rb_yield_0(Qundef, 0, 0, 0, Qfalse); + } + ary = rb_ary_new2(n); + va_init_list(args, n); + while (n--) { + rb_ary_push(ary, va_arg(args, VALUE)); + } + va_end(args); + return rb_yield_0(ary, 0, 0, 0, Qtrue); +} + +VALUE +rb_yield_splat(values) + VALUE values; +{ + int avalue = Qfalse; + + if (TYPE(values) == T_ARRAY) { + if (RARRAY(values)->len == 0) { + values = Qundef; + } + else { + avalue = Qtrue; + } + } + return rb_yield_0(values, 0, 0, 0, avalue); +} + +/* + * call-seq: + * loop {|| block } + * + * Repeatedly executes the block. + * + * loop do + * print "Input: " + * line = gets + * break if !line or line =~ /^qQ/ + * # ... + * end + */ + +static VALUE +rb_f_loop() +{ + for (;;) { + rb_yield_0(Qundef, 0, 0, 0, Qfalse); + CHECK_INTS; + } + return Qnil; /* dummy */ +} + +static VALUE +massign(self, node, val, pcall) + VALUE self; + NODE *node; + VALUE val; + int pcall; +{ + NODE *list; + long i = 0, len; + + len = RARRAY(val)->len; + list = node->nd_head; + for (; list && i<len; i++) { + assign(self, list->nd_head, RARRAY(val)->ptr[i], pcall); + list = list->nd_next; + } + if (pcall && list) goto arg_error; + if (node->nd_args) { + if ((long)(node->nd_args) == -1) { + /* no check for mere `*' */ + } + else if (!list && i<len) { + assign(self, node->nd_args, rb_ary_new4(len-i, RARRAY(val)->ptr+i), pcall); + } + else { + assign(self, node->nd_args, rb_ary_new2(0), pcall); + } + } + else if (pcall && i < len) { + goto arg_error; + } + + while (list) { + i++; + assign(self, list->nd_head, Qnil, pcall); + list = list->nd_next; + } + return val; + + arg_error: + while (list) { + i++; + list = list->nd_next; + } + rb_raise(rb_eArgError, "wrong number of arguments (%ld for %ld)", len, i); +} + +static void +assign(self, lhs, val, pcall) + VALUE self; + NODE *lhs; + VALUE val; + int pcall; +{ + ruby_current_node = lhs; + if (val == Qundef) { + rb_warning("assigning void value"); + val = Qnil; + } + switch (nd_type(lhs)) { + case NODE_GASGN: + rb_gvar_set(lhs->nd_entry, val); + break; + + case NODE_IASGN: + rb_ivar_set(self, lhs->nd_vid, val); + break; + + case NODE_LASGN: + if (ruby_scope->local_vars == 0) + rb_bug("unexpected local variable assignment"); + ruby_scope->local_vars[lhs->nd_cnt] = val; + break; + + case NODE_DASGN: + dvar_asgn(lhs->nd_vid, val); + break; + + case NODE_DASGN_CURR: + dvar_asgn_curr(lhs->nd_vid, val); + break; + + case NODE_CDECL: + if (lhs->nd_vid == 0) { + rb_const_set(class_prefix(self, lhs->nd_else), lhs->nd_else->nd_mid, val); + } + else { + rb_const_set(ruby_cbase, lhs->nd_vid, val); + } + break; + + case NODE_CVDECL: + if (RTEST(ruby_verbose) && FL_TEST(ruby_cbase, FL_SINGLETON)) { + rb_warn("declaring singleton class variable"); + } + rb_cvar_set(cvar_cbase(), lhs->nd_vid, val, Qtrue); + break; + + case NODE_CVASGN: + rb_cvar_set(cvar_cbase(), lhs->nd_vid, val, Qfalse); + break; + + case NODE_MASGN: + massign(self, lhs, svalue_to_mrhs(val, lhs->nd_head), pcall); + break; + + case NODE_CALL: + case NODE_ATTRASGN: + { + VALUE recv; + int scope; + if (lhs->nd_recv == (NODE *)1) { + recv = self; + scope = 1; + } + else { + recv = rb_eval(self, lhs->nd_recv); + scope = 0; + } + if (!lhs->nd_args) { + /* attr set */ + ruby_current_node = lhs; + SET_CURRENT_SOURCE(); + rb_call(CLASS_OF(recv), recv, lhs->nd_mid, 1, &val, scope, self); + } + else { + /* array set */ + VALUE args; + + args = rb_eval(self, lhs->nd_args); + rb_ary_push(args, val); + ruby_current_node = lhs; + SET_CURRENT_SOURCE(); + rb_call(CLASS_OF(recv), recv, lhs->nd_mid, + RARRAY(args)->len, RARRAY(args)->ptr, scope, self); + } + } + break; + + default: + rb_bug("bug in variable assignment"); + break; + } +} + +VALUE +rb_iterate(it_proc, data1, bl_proc, data2) + VALUE (*it_proc) _((VALUE)), (*bl_proc)(ANYARGS); + VALUE data1, data2; +{ + int state; + volatile VALUE retval = Qnil; + NODE *node = NEW_IFUNC(bl_proc, data2); + VALUE self = ruby_top_self; + + PUSH_TAG(PROT_LOOP); + PUSH_BLOCK(0, node); + PUSH_ITER(ITER_PRE); + state = EXEC_TAG(); + if (state == 0) { + iter_retry: + retval = (*it_proc)(data1); + } + else if (state == TAG_BREAK && TAG_DST()) { + retval = prot_tag->retval; + state = 0; + } + else if (state == TAG_RETRY) { + state = 0; + goto iter_retry; + } + POP_ITER(); + POP_BLOCK(); + POP_TAG(); + + switch (state) { + case 0: + break; + default: + JUMP_TAG(state); + } + return retval; +} + +static int +handle_rescue(self, node) + VALUE self; + NODE *node; +{ + int argc; VALUE *argv; /* used in SETUP_ARGS */ + TMP_PROTECT; + + if (!node->nd_args) { + return rb_obj_is_kind_of(ruby_errinfo, rb_eStandardError); + } + + BEGIN_CALLARGS; + SETUP_ARGS(node->nd_args); + END_CALLARGS; + + while (argc--) { + if (!rb_obj_is_kind_of(argv[0], rb_cModule)) { + rb_raise(rb_eTypeError, "class or module required for rescue clause"); + } + if (RTEST(rb_funcall(*argv, eqq, 1, ruby_errinfo))) return 1; + argv++; + } + return 0; +} + +VALUE +#ifdef HAVE_STDARG_PROTOTYPES +rb_rescue2(VALUE (*b_proc)(ANYARGS), VALUE data1, VALUE (*r_proc)(ANYARGS), VALUE data2, ...) +#else +rb_rescue2(b_proc, data1, r_proc, data2, va_alist) + VALUE (*b_proc)(ANYARGS), (*r_proc)(ANYARGS); + VALUE data1, data2; + va_dcl +#endif +{ + int state; + volatile VALUE result; + volatile VALUE e_info = ruby_errinfo; + volatile int handle = Qfalse; + VALUE eclass; + va_list args; + + PUSH_TAG(PROT_NONE); + switch (state = EXEC_TAG()) { + case TAG_RETRY: + if (!handle) break; + handle = Qfalse; + state = 0; + ruby_errinfo = Qnil; + case 0: + result = (*b_proc)(data1); + break; + case TAG_RAISE: + if (handle) break; + handle = Qfalse; + va_init_list(args, data2); + while ((eclass = va_arg(args, VALUE)) != 0) { + if (rb_obj_is_kind_of(ruby_errinfo, eclass)) { + handle = Qtrue; + break; + } + } + va_end(args); + + if (handle) { + state = 0; + if (r_proc) { + result = (*r_proc)(data2, ruby_errinfo); + } + else { + result = Qnil; + } + ruby_errinfo = e_info; + } + } + POP_TAG(); + if (state) JUMP_TAG(state); + + return result; +} + +VALUE +rb_rescue(b_proc, data1, r_proc, data2) + VALUE (*b_proc)(), (*r_proc)(); + VALUE data1, data2; +{ + return rb_rescue2(b_proc, data1, r_proc, data2, rb_eStandardError, (VALUE)0); +} + +static VALUE cont_protect; + +VALUE +rb_protect(proc, data, state) + VALUE (*proc) _((VALUE)); + VALUE data; + int *state; +{ + VALUE result = Qnil; /* OK */ + int status; + + PUSH_TAG(PROT_NONE); + cont_protect = (VALUE)rb_node_newnode(NODE_MEMO, cont_protect, 0, 0); + if ((status = EXEC_TAG()) == 0) { + result = (*proc)(data); + } + cont_protect = ((NODE *)cont_protect)->u1.value; + POP_TAG(); + if (state) { + *state = status; + } + if (status != 0) { + return Qnil; + } + + return result; +} + +VALUE +rb_ensure(b_proc, data1, e_proc, data2) + VALUE (*b_proc)(); + VALUE data1; + VALUE (*e_proc)(); + VALUE data2; +{ + int state; + volatile VALUE result = Qnil; + VALUE retval; + + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + result = (*b_proc)(data1); + } + POP_TAG(); + retval = prot_tag ? prot_tag->retval : Qnil; /* save retval */ + if (!thread_no_ensure()) { + (*e_proc)(data2); + } + if (prot_tag) return_value(retval); + if (state) JUMP_TAG(state); + return result; +} + +VALUE +rb_with_disable_interrupt(proc, data) + VALUE (*proc)(); + VALUE data; +{ + VALUE result = Qnil; /* OK */ + int status; + + DEFER_INTS; + { + int thr_critical = rb_thread_critical; + + rb_thread_critical = Qtrue; + PUSH_TAG(PROT_NONE); + if ((status = EXEC_TAG()) == 0) { + result = (*proc)(data); + } + POP_TAG(); + rb_thread_critical = thr_critical; + } + ENABLE_INTS; + if (status) JUMP_TAG(status); + + return result; +} + +static void +stack_check() +{ + rb_thread_t th = rb_curr_thread; + + if (!rb_thread_raised_p(th, RAISED_STACKOVERFLOW) && ruby_stack_check()) { + rb_thread_raised_set(th, RAISED_STACKOVERFLOW); + rb_exc_raise(sysstack_error); + } +} + +static int last_call_status; + +#define CSTAT_PRIV 1 +#define CSTAT_PROT 2 +#define CSTAT_VCALL 4 +#define CSTAT_SUPER 8 + +/* + * call-seq: + * obj.method_missing(symbol [, *args] ) => result + * + * Invoked by Ruby when <i>obj</i> is sent a message it cannot handle. + * <i>symbol</i> is the symbol for the method called, and <i>args</i> + * are any arguments that were passed to it. By default, the interpreter + * raises an error when this method is called. However, it is possible + * to override the method to provide more dynamic behavior. + * The example below creates + * a class <code>Roman</code>, which responds to methods with names + * consisting of roman numerals, returning the corresponding integer + * values. + * + * class Roman + * def romanToInt(str) + * # ... + * end + * def method_missing(methId) + * str = methId.id2name + * romanToInt(str) + * end + * end + * + * r = Roman.new + * r.iv #=> 4 + * r.xxiii #=> 23 + * r.mm #=> 2000 + */ + +static VALUE +rb_method_missing(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + ID id; + VALUE exc = rb_eNoMethodError; + char *format = 0; + NODE *cnode = ruby_current_node; + + if (argc == 0 || !SYMBOL_P(argv[0])) { + rb_raise(rb_eArgError, "no id given"); + } + + stack_check(); + + id = SYM2ID(argv[0]); + + if (last_call_status & CSTAT_PRIV) { + format = "private method `%s' called for %s"; + } + else if (last_call_status & CSTAT_PROT) { + format = "protected method `%s' called for %s"; + } + else if (last_call_status & CSTAT_VCALL) { + format = "undefined local variable or method `%s' for %s"; + exc = rb_eNameError; + } + else if (last_call_status & CSTAT_SUPER) { + format = "super: no superclass method `%s'"; + } + if (!format) { + format = "undefined method `%s' for %s"; + } + + ruby_current_node = cnode; + { + int n = 0; + VALUE args[3]; + + args[n++] = rb_funcall(rb_const_get(exc, rb_intern("message")), '!', + 3, rb_str_new2(format), obj, argv[0]); + args[n++] = argv[0]; + if (exc == rb_eNoMethodError) { + args[n++] = rb_ary_new4(argc-1, argv+1); + } + exc = rb_class_new_instance(n, args, exc); + ruby_frame = ruby_frame->prev; /* pop frame for "method_missing" */ + rb_exc_raise(exc); + } + + return Qnil; /* not reached */ +} + +static VALUE +method_missing(obj, id, argc, argv, call_status) + VALUE obj; + ID id; + int argc; + const VALUE *argv; + int call_status; +{ + VALUE *nargv; + + last_call_status = call_status; + + if (id == missing) { + PUSH_FRAME(); + rb_method_missing(argc, argv, obj); + POP_FRAME(); + } + else if (id == ID_ALLOCATOR) { + rb_raise(rb_eTypeError, "allocator undefined for %s", rb_class2name(obj)); + } + if (argc < 0) { + VALUE tmp; + + argc = -argc-1; + tmp = splat_value(argv[argc]); + nargv = ALLOCA_N(VALUE, argc + RARRAY(tmp)->len + 1); + MEMCPY(nargv+1, argv, VALUE, argc); + MEMCPY(nargv+1+argc, RARRAY(tmp)->ptr, VALUE, RARRAY(tmp)->len); + argc += RARRAY(tmp)->len; + } + else { + nargv = ALLOCA_N(VALUE, argc+1); + MEMCPY(nargv+1, argv, VALUE, argc); + } + nargv[0] = ID2SYM(id); + return rb_funcall2(obj, missing, argc+1, nargv); +} + +static inline VALUE +call_cfunc(func, recv, len, argc, argv) + VALUE (*func)(); + VALUE recv; + int len, argc; + VALUE *argv; +{ + if (len >= 0 && argc != len) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", + argc, len); + } + + switch (len) { + case -2: + return (*func)(recv, rb_ary_new4(argc, argv)); + break; + case -1: + return (*func)(argc, argv, recv); + break; + case 0: + return (*func)(recv); + break; + case 1: + return (*func)(recv, argv[0]); + break; + case 2: + return (*func)(recv, argv[0], argv[1]); + break; + case 3: + return (*func)(recv, argv[0], argv[1], argv[2]); + break; + case 4: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3]); + break; + case 5: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4]); + break; + case 6: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5]); + break; + case 7: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6]); + break; + case 8: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6], argv[7]); + break; + case 9: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6], argv[7], argv[8]); + break; + case 10: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6], argv[7], argv[8], argv[9]); + break; + case 11: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]); + break; + case 12: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6], argv[7], argv[8], argv[9], + argv[10], argv[11]); + break; + case 13: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], + argv[11], argv[12]); + break; + case 14: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], + argv[11], argv[12], argv[13]); + break; + case 15: + return (*func)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], + argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], + argv[11], argv[12], argv[13], argv[14]); + break; + default: + rb_raise(rb_eArgError, "too many arguments (%d)", len); + break; + } + return Qnil; /* not reached */ +} + +static VALUE +rb_call0(klass, recv, id, oid, argc, argv, body, flags) + VALUE klass, recv; + ID id; + ID oid; + int argc; /* OK */ + VALUE *argv; /* OK */ + NODE * volatile body; + int flags; +{ + NODE *b2; /* OK */ + volatile VALUE result = Qnil; + int itr; + static int tick; + TMP_PROTECT; + volatile int safe = -1; + + if (NOEX_SAFE(flags) > ruby_safe_level && NOEX_SAFE(flags) > 2) { + rb_raise(rb_eSecurityError, "calling insecure method: %s", + rb_id2name(id)); + } + switch (ruby_iter->iter) { + case ITER_PRE: + case ITER_PAS: + itr = ITER_CUR; + break; + case ITER_CUR: + default: + itr = ITER_NOT; + break; + } + + if ((++tick & 0xff) == 0) { + CHECK_INTS; /* better than nothing */ + stack_check(); + rb_gc_finalize_deferred(); + } + if (argc < 0) { + VALUE tmp; + VALUE *nargv; + + argc = -argc-1; + tmp = splat_value(argv[argc]); + nargv = TMP_ALLOC(argc + RARRAY(tmp)->len); + MEMCPY(nargv, argv, VALUE, argc); + MEMCPY(nargv+argc, RARRAY(tmp)->ptr, VALUE, RARRAY(tmp)->len); + argc += RARRAY(tmp)->len; + argv = nargv; + } + PUSH_ITER(itr); + PUSH_FRAME(); + + ruby_frame->last_func = id; + ruby_frame->orig_func = oid; + ruby_frame->last_class = (flags & NOEX_NOSUPER)?0:klass; + ruby_frame->self = recv; + ruby_frame->argc = argc; + ruby_frame->flags = 0; + + switch (nd_type(body)) { + case NODE_CFUNC: + { + int len = body->nd_argc; + + if (len < -2) { + rb_bug("bad argc (%d) specified for `%s(%s)'", + len, rb_class2name(klass), rb_id2name(id)); + } + if (event_hooks) { + int state; + + EXEC_EVENT_HOOK(RUBY_EVENT_C_CALL, ruby_current_node, + recv, id, klass); + PUSH_TAG(PROT_FUNC); + if ((state = EXEC_TAG()) == 0) { + result = call_cfunc(body->nd_cfnc, recv, len, argc, argv); + } + POP_TAG(); + ruby_current_node = ruby_frame->node; + EXEC_EVENT_HOOK(RUBY_EVENT_C_RETURN, ruby_current_node, + recv, id, klass); + if (state) JUMP_TAG(state); + } + else { + result = call_cfunc(body->nd_cfnc, recv, len, argc, argv); + } + } + break; + + /* for attr get/set */ + case NODE_IVAR: + if (argc != 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); + } + result = rb_attr_get(recv, body->nd_vid); + break; + + case NODE_ATTRSET: + if (argc != 1) + rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc); + result = rb_ivar_set(recv, body->nd_vid, argv[0]); + break; + + case NODE_ZSUPER: + result = rb_call_super(argc, argv); + break; + + case NODE_DMETHOD: + result = method_call(argc, argv, umethod_bind(body->nd_cval, recv)); + break; + + case NODE_BMETHOD: + ruby_frame->flags |= FRAME_DMETH; + if (event_hooks) { + struct BLOCK *data; + Data_Get_Struct(body->nd_cval, struct BLOCK, data); + EXEC_EVENT_HOOK(RUBY_EVENT_CALL, data->body, recv, id, klass); + } + result = proc_invoke(body->nd_cval, rb_ary_new4(argc, argv), recv, klass); + if (event_hooks) { + EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, body, recv, id, klass); + } + break; + + case NODE_SCOPE: + { + int state; + VALUE *local_vars; /* OK */ + NODE *saved_cref = 0; + + PUSH_SCOPE(); + if (body->nd_rval) { + saved_cref = ruby_cref; + ruby_cref = (NODE*)body->nd_rval; + } + PUSH_CLASS(ruby_cbase); + if (body->nd_tbl) { + local_vars = TMP_ALLOC(body->nd_tbl[0]+1); + *local_vars++ = (VALUE)body; + rb_mem_clear(local_vars, body->nd_tbl[0]); + ruby_scope->local_tbl = body->nd_tbl; + ruby_scope->local_vars = local_vars; + } + else { + local_vars = ruby_scope->local_vars = 0; + ruby_scope->local_tbl = 0; + } + b2 = body = body->nd_next; + + if (NOEX_SAFE(flags) > ruby_safe_level) { + safe = ruby_safe_level; + ruby_safe_level = NOEX_SAFE(flags); + } + PUSH_VARS(); + PUSH_TAG(PROT_FUNC); + if ((state = EXEC_TAG()) == 0) { + NODE *node = 0; + int i, nopt = 0; + + if (nd_type(body) == NODE_ARGS) { + node = body; + body = 0; + } + else if (nd_type(body) == NODE_BLOCK) { + node = body->nd_head; + body = body->nd_next; + } + if (node) { + if (nd_type(node) != NODE_ARGS) { + rb_bug("no argument-node"); + } + + i = node->nd_cnt; + if (i > argc) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", + argc, i); + } + if (!node->nd_rest) { + NODE *optnode = node->nd_opt; + + nopt = i; + while (optnode) { + nopt++; + optnode = optnode->nd_next; + } + if (nopt < argc) { + rb_raise(rb_eArgError, + "wrong number of arguments (%d for %d)", + argc, nopt); + } + } + if (local_vars) { + if (i > 0) { + /* +2 for $_ and $~ */ + MEMCPY(local_vars+2, argv, VALUE, i); + } + } + argv += i; argc -= i; + if (node->nd_opt) { + NODE *opt = node->nd_opt; + + while (opt && argc) { + assign(recv, opt->nd_head, *argv, 1); + argv++; argc--; + ++i; + opt = opt->nd_next; + } + if (opt) { + rb_eval(recv, opt); + while (opt) { + opt = opt->nd_next; + ++i; + } + } + } + if (!node->nd_rest) { + i = nopt; + } + else { + VALUE v; + + if (argc > 0) { + v = rb_ary_new4(argc,argv); + i = -i - 1; + } + else { + v = rb_ary_new2(0); + } + assign(recv, node->nd_rest, v, 1); + } + ruby_frame->argc = i; + } + if (event_hooks) { + EXEC_EVENT_HOOK(RUBY_EVENT_CALL, b2, recv, id, klass); + } + result = rb_eval(recv, body); + } + else if (state == TAG_RETURN && TAG_DST()) { + result = prot_tag->retval; + state = 0; + } + POP_TAG(); + if (event_hooks) { + EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, body, recv, id, klass); + } + POP_VARS(); + POP_CLASS(); + POP_SCOPE(); + ruby_cref = saved_cref; + if (safe >= 0) ruby_safe_level = safe; + switch (state) { + case 0: + break; + + case TAG_BREAK: + case TAG_RETURN: + JUMP_TAG(state); + break; + + case TAG_RETRY: + if (rb_block_given_p()) JUMP_TAG(state); + /* fall through */ + default: + jump_tag_but_local_jump(state, result); + break; + } + } + break; + + default: + unknown_node(body); + break; + } + POP_FRAME(); + POP_ITER(); + return result; +} + +static VALUE +rb_call(klass, recv, mid, argc, argv, scope, self) + VALUE klass, recv; + ID mid; + int argc; /* OK */ + const VALUE *argv; /* OK */ + int scope; + VALUE self; +{ + NODE *body; /* OK */ + int noex; + ID id = mid; + struct cache_entry *ent; + + if (!klass) { + rb_raise(rb_eNotImpError, "method `%s' called on terminated object (0x%lx)", + rb_id2name(mid), recv); + } + /* is it in the method cache? */ + ent = cache + EXPR1(klass, mid); + if (ent->mid == mid && ent->klass == klass) { + if (!ent->method) + return method_missing(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0); + klass = ent->origin; + id = ent->mid0; + noex = ent->noex; + body = ent->method; + } + else if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) { + if (scope == 3) { + return method_missing(recv, mid, argc, argv, CSTAT_SUPER); + } + return method_missing(recv, mid, argc, argv, scope==2?CSTAT_VCALL:0); + } + + if (mid != missing && scope == 0) { + /* receiver specified form for private method */ + if (noex & NOEX_PRIVATE) + return method_missing(recv, mid, argc, argv, CSTAT_PRIV); + + /* self must be kind of a specified form for protected method */ + if (noex & NOEX_PROTECTED) { + VALUE defined_class = klass; + + if (self == Qundef) self = ruby_frame->self; + if (TYPE(defined_class) == T_ICLASS) { + defined_class = RBASIC(defined_class)->klass; + } + if (!rb_obj_is_kind_of(self, rb_class_real(defined_class))) + return method_missing(recv, mid, argc, argv, CSTAT_PROT); + } + } + + return rb_call0(klass, recv, mid, id, argc, argv, body, noex); +} + +VALUE +rb_apply(recv, mid, args) + VALUE recv; + ID mid; + VALUE args; +{ + int argc; + VALUE *argv; + + argc = RARRAY(args)->len; /* Assigns LONG, but argc is INT */ + argv = ALLOCA_N(VALUE, argc); + MEMCPY(argv, RARRAY(args)->ptr, VALUE, argc); + return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 1, Qundef); +} + +/* + * call-seq: + * obj.send(symbol [, args...]) => obj + * obj.__send__(symbol [, args...]) => obj + * + * Invokes the method identified by _symbol_, passing it any + * arguments specified. You can use <code>\_\_send__</code> if the name + * +send+ clashes with an existing method in _obj_. + * + * class Klass + * def hello(*args) + * "Hello " + args.join(' ') + * end + * end + * k = Klass.new + * k.send :hello, "gentle", "readers" #=> "Hello gentle readers" + */ + +static VALUE +rb_f_send(argc, argv, recv) + int argc; + VALUE *argv; + VALUE recv; +{ + VALUE vid; + + if (argc == 0) rb_raise(rb_eArgError, "no method name given"); + + vid = *argv++; argc--; + PUSH_ITER(rb_block_given_p()?ITER_PRE:ITER_NOT); + vid = rb_call(CLASS_OF(recv), recv, rb_to_id(vid), argc, argv, 1, Qundef); + POP_ITER(); + + return vid; +} + +static VALUE +vafuncall(recv, mid, n, ar) + VALUE recv; + ID mid; + int n; + va_list *ar; +{ + VALUE *argv; + + if (n > 0) { + long i; + + argv = ALLOCA_N(VALUE, n); + + for (i=0;i<n;i++) { + argv[i] = va_arg(*ar, VALUE); + } + va_end(*ar); + } + else { + argv = 0; + } + + return rb_call(CLASS_OF(recv), recv, mid, n, argv, 1, Qundef); +} + +VALUE +#ifdef HAVE_STDARG_PROTOTYPES +rb_funcall(VALUE recv, ID mid, int n, ...) +#else +rb_funcall(recv, mid, n, va_alist) + VALUE recv; + ID mid; + int n; + va_dcl +#endif +{ + va_list ar; + va_init_list(ar, n); + + return vafuncall(recv, mid, n, &ar); +} + +VALUE +#ifdef HAVE_STDARG_PROTOTYPES +rb_funcall_rescue(VALUE recv, ID mid, int n, ...) +#else +rb_funcall_rescue(recv, mid, n, va_alist) + VALUE recv; + ID mid; + int n; + va_dcl +#endif +{ + VALUE result = Qnil; /* OK */ + int status; + va_list ar; + + va_init_list(ar, n); + + PUSH_TAG(PROT_NONE); + if ((status = EXEC_TAG()) == 0) { + result = vafuncall(recv, mid, n, &ar); + } + POP_TAG(); + switch (status) { + case 0: + return result; + case TAG_RAISE: + return Qundef; + default: + JUMP_TAG(status); + } +} + +VALUE +rb_funcall2(recv, mid, argc, argv) + VALUE recv; + ID mid; + int argc; + const VALUE *argv; +{ + return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 1, Qundef); +} + +VALUE +rb_funcall3(recv, mid, argc, argv) + VALUE recv; + ID mid; + int argc; + const VALUE *argv; +{ + return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 0, Qundef); +} + +VALUE +rb_call_super(argc, argv) + int argc; + const VALUE *argv; +{ + VALUE result, self, klass; + + if (ruby_frame->last_class == 0) { + rb_name_error(ruby_frame->last_func, "calling `super' from `%s' is prohibited", + rb_id2name(ruby_frame->orig_func)); + } + + self = ruby_frame->self; + klass = ruby_frame->last_class; + if (RCLASS(klass)->super == 0) { + return method_missing(self, ruby_frame->orig_func, argc, argv, CSTAT_SUPER); + } + + PUSH_ITER(ruby_iter->iter ? ITER_PRE : ITER_NOT); + result = rb_call(RCLASS(klass)->super, self, ruby_frame->orig_func, argc, argv, 3, Qundef); + POP_ITER(); + + return result; +} + +static VALUE +backtrace(lev) + int lev; +{ + struct FRAME *frame = ruby_frame; + char buf[BUFSIZ]; + VALUE ary; + NODE *n; + + ary = rb_ary_new(); + if (frame->last_func == ID_ALLOCATOR) { + frame = frame->prev; + } + if (lev < 0) { + ruby_set_current_source(); + if (frame->last_func) { + snprintf(buf, BUFSIZ, "%s:%d:in `%s'", + ruby_sourcefile, ruby_sourceline, + rb_id2name(frame->last_func)); + } + else if (ruby_sourceline == 0) { + snprintf(buf, BUFSIZ, "%s", ruby_sourcefile); + } + else { + snprintf(buf, BUFSIZ, "%s:%d", ruby_sourcefile, ruby_sourceline); + } + rb_ary_push(ary, rb_str_new2(buf)); + if (lev < -1) return ary; + } + else { + while (lev-- > 0) { + frame = frame->prev; + if (!frame) { + ary = Qnil; + break; + } + } + } + for (; frame && (n = frame->node); frame = frame->prev) { + if (frame->prev && frame->prev->last_func) { + if (frame->prev->node == n) { + if (frame->prev->last_func == frame->last_func) continue; + } + snprintf(buf, BUFSIZ, "%s:%d:in `%s'", + n->nd_file, nd_line(n), + rb_id2name(frame->prev->last_func)); + } + else { + snprintf(buf, BUFSIZ, "%s:%d", n->nd_file, nd_line(n)); + } + rb_ary_push(ary, rb_str_new2(buf)); + } + + return ary; +} + +/* + * call-seq: + * caller(start=1) => array + * + * Returns the current execution stack---an array containing strings in + * the form ``<em>file:line</em>'' or ``<em>file:line: in + * `method'</em>''. The optional _start_ parameter + * determines the number of initial stack entries to omit from the + * result. + * + * def a(skip) + * caller(skip) + * end + * def b(skip) + * a(skip) + * end + * def c(skip) + * b(skip) + * end + * c(0) #=> ["prog:2:in `a'", "prog:5:in `b'", "prog:8:in `c'", "prog:10"] + * c(1) #=> ["prog:5:in `b'", "prog:8:in `c'", "prog:11"] + * c(2) #=> ["prog:8:in `c'", "prog:12"] + * c(3) #=> ["prog:13"] + */ + +static VALUE +rb_f_caller(argc, argv) + int argc; + VALUE *argv; +{ + VALUE level; + int lev; + + rb_scan_args(argc, argv, "01", &level); + + if (NIL_P(level)) lev = 1; + else lev = NUM2INT(level); + if (lev < 0) rb_raise(rb_eArgError, "negative level (%d)", lev); + + return backtrace(lev); +} + +void +rb_backtrace() +{ + long i; + VALUE ary; + + ary = backtrace(-1); + for (i=0; i<RARRAY(ary)->len; i++) { + printf("\tfrom %s\n", RSTRING(RARRAY(ary)->ptr[i])->ptr); + } +} + +static VALUE +make_backtrace() +{ + return backtrace(-1); +} + +ID +rb_frame_last_func() +{ + return ruby_frame->last_func; +} + +static NODE* +compile(src, file, line) + VALUE src; + char *file; + int line; +{ + NODE *node; + int critical; + + ruby_nerrs = 0; + StringValue(src); + critical = rb_thread_critical; + rb_thread_critical = Qtrue; + node = rb_compile_string(file, src, line); + rb_thread_critical = critical; + + if (ruby_nerrs == 0) return node; + return 0; +} + +static VALUE +eval(self, src, scope, file, line) + VALUE self, src, scope; + char *file; + int line; +{ + struct BLOCK *data = NULL; + volatile VALUE result = Qnil; + struct SCOPE * volatile old_scope; + struct BLOCK * volatile old_block; + struct RVarmap * volatile old_dyna_vars; + VALUE volatile old_cref; + int volatile old_vmode; + volatile VALUE old_wrapper; + struct FRAME frame; + NODE *nodesave = ruby_current_node; + volatile int iter = ruby_frame->iter; + volatile int safe = ruby_safe_level; + int state; + + if (!NIL_P(scope)) { + if (!rb_obj_is_proc(scope)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Proc/Binding)", + rb_obj_classname(scope)); + } + + Data_Get_Struct(scope, struct BLOCK, data); + /* PUSH BLOCK from data */ + frame = data->frame; + frame.tmp = ruby_frame; /* gc protection */ + ruby_frame = &(frame); + old_scope = ruby_scope; + ruby_scope = data->scope; + old_block = ruby_block; + ruby_block = data->prev; + old_dyna_vars = ruby_dyna_vars; + ruby_dyna_vars = data->dyna_vars; + old_vmode = scope_vmode; + scope_vmode = data->vmode; + old_cref = (VALUE)ruby_cref; + ruby_cref = data->cref; + old_wrapper = ruby_wrapper; + ruby_wrapper = data->wrapper; + if ((file == 0 || (line == 1 && strcmp(file, "(eval)") == 0)) && data->frame.node) { + file = data->frame.node->nd_file; + if (!file) file = "__builtin__"; + line = nd_line(data->frame.node); + } + + self = data->self; + ruby_frame->iter = data->iter; + } + else { + if (ruby_frame->prev) { + ruby_frame->iter = ruby_frame->prev->iter; + } + } + if (file == 0) { + ruby_set_current_source(); + file = ruby_sourcefile; + line = ruby_sourceline; + } + PUSH_CLASS(data ? data->klass : ruby_class); + ruby_in_eval++; + if (TYPE(ruby_class) == T_ICLASS) { + ruby_class = RBASIC(ruby_class)->klass; + } + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + NODE *node; + + ruby_safe_level = 0; + result = ruby_errinfo; + ruby_errinfo = Qnil; + node = compile(src, file, line); + ruby_safe_level = safe; + if (ruby_nerrs > 0) { + compile_error(0); + } + if (!NIL_P(result)) ruby_errinfo = result; + result = eval_node(self, node); + } + POP_TAG(); + POP_CLASS(); + ruby_in_eval--; + if (!NIL_P(scope)) { + int dont_recycle = ruby_scope->flags & SCOPE_DONT_RECYCLE; + + ruby_wrapper = old_wrapper; + ruby_cref = (NODE*)old_cref; + ruby_frame = frame.tmp; + ruby_scope = old_scope; + ruby_block = old_block; + ruby_dyna_vars = old_dyna_vars; + data->vmode = scope_vmode; /* write back visibility mode */ + scope_vmode = old_vmode; + if (dont_recycle) { + struct tag *tag; + struct RVarmap *vars; + + scope_dup(ruby_scope); + for (tag=prot_tag; tag; tag=tag->prev) { + scope_dup(tag->scope); + } + for (vars = ruby_dyna_vars; vars; vars = vars->next) { + FL_SET(vars, DVAR_DONT_RECYCLE); + } + } + } + else { + ruby_frame->iter = iter; + } + ruby_current_node = nodesave; + ruby_set_current_source(); + if (state) { + if (state == TAG_RAISE) { + if (strcmp(file, "(eval)") == 0) { + VALUE mesg, errat, bt2; + + errat = get_backtrace(ruby_errinfo); + mesg = rb_attr_get(ruby_errinfo, rb_intern("mesg")); + if (!NIL_P(errat) && TYPE(errat) == T_ARRAY && + (bt2 = backtrace(-2), RARRAY(bt2)->len > 0)) { + if (!NIL_P(mesg) && TYPE(mesg) == T_STRING) { + rb_str_update(mesg, 0, 0, rb_str_new2(": ")); + rb_str_update(mesg, 0, 0, RARRAY(errat)->ptr[0]); + } + RARRAY(errat)->ptr[0] = RARRAY(bt2)->ptr[0]; + } + } + rb_exc_raise(ruby_errinfo); + } + JUMP_TAG(state); + } + + return result; +} + +/* + * call-seq: + * eval(string [, binding [, filename [,lineno]]]) => obj + * + * Evaluates the Ruby expression(s) in <em>string</em>. If + * <em>binding</em> is given, the evaluation is performed in its + * context. The binding may be a <code>Binding</code> object or a + * <code>Proc</code> object. If the optional <em>filename</em> and + * <em>lineno</em> parameters are present, they will be used when + * reporting syntax errors. + * + * def getBinding(str) + * return binding + * end + * str = "hello" + * eval "str + ' Fred'" #=> "hello Fred" + * eval "str + ' Fred'", getBinding("bye") #=> "bye Fred" + */ + +static VALUE +rb_f_eval(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + VALUE src, scope, vfile, vline; + char *file = "(eval)"; + int line = 1; + + rb_scan_args(argc, argv, "13", &src, &scope, &vfile, &vline); + if (ruby_safe_level >= 4) { + StringValue(src); + if (!NIL_P(scope) && !OBJ_TAINTED(scope)) { + rb_raise(rb_eSecurityError, "Insecure: can't modify trusted binding"); + } + } + else { + SafeStringValue(src); + } + if (argc >= 3) { + StringValue(vfile); + } + if (argc >= 4) { + line = NUM2INT(vline); + } + + if (!NIL_P(vfile)) file = RSTRING(vfile)->ptr; + if (NIL_P(scope) && ruby_frame->prev) { + struct FRAME *prev; + VALUE val; + + prev = ruby_frame; + PUSH_FRAME(); + *ruby_frame = *prev->prev; + ruby_frame->prev = prev; + val = eval(self, src, scope, file, line); + POP_FRAME(); + + return val; + } + return eval(self, src, scope, file, line); +} + +/* function to call func under the specified class/module context */ +static VALUE +exec_under(func, under, cbase, args) + VALUE (*func)(); + VALUE under, cbase; + void *args; +{ + VALUE val = Qnil; /* OK */ + int state; + int mode; + struct FRAME *f = ruby_frame; + + PUSH_CLASS(under); + PUSH_FRAME(); + ruby_frame->self = f->self; + ruby_frame->last_func = f->last_func; + ruby_frame->orig_func = f->orig_func; + ruby_frame->last_class = f->last_class; + ruby_frame->argc = f->argc; + if (cbase) { + PUSH_CREF(cbase); + } + + mode = scope_vmode; + SCOPE_SET(SCOPE_PUBLIC); + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + val = (*func)(args); + } + POP_TAG(); + if (cbase) POP_CREF(); + SCOPE_SET(mode); + POP_FRAME(); + POP_CLASS(); + if (state) JUMP_TAG(state); + + return val; +} + +static VALUE +eval_under_i(args) + VALUE *args; +{ + struct FRAME *f = ruby_frame; + + if (f && (f = f->prev) && (f = f->prev)) { + ruby_frame = f; + } + return eval(args[0], args[1], Qnil, (char*)args[2], (int)args[3]); +} + +/* string eval under the class/module context */ +static VALUE +eval_under(under, self, src, file, line) + VALUE under, self, src; + const char *file; + int line; +{ + VALUE args[4]; + + if (ruby_safe_level >= 4) { + StringValue(src); + } + else { + SafeStringValue(src); + } + args[0] = self; + args[1] = src; + args[2] = (VALUE)file; + args[3] = (VALUE)line; + return exec_under(eval_under_i, under, under, args); +} + +static VALUE +yield_under_i(self) + VALUE self; +{ + return rb_yield_0(self, self, ruby_class, YIELD_PUBLIC_DEF, Qfalse); +} + +/* block eval under the class/module context */ +static VALUE +yield_under(under, self) + VALUE under, self; +{ + return exec_under(yield_under_i, under, 0, self); +} + +static VALUE +specific_eval(argc, argv, klass, self) + int argc; + VALUE *argv; + VALUE klass, self; +{ + if (rb_block_given_p()) { + if (argc > 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); + } + return yield_under(klass, self); + } + else { + char *file = "(eval)"; + int line = 1; + + if (argc == 0) { + rb_raise(rb_eArgError, "block not supplied"); + } + else { + if (ruby_safe_level >= 4) { + StringValue(argv[0]); + } + else { + SafeStringValue(argv[0]); + } + if (argc > 3) { + rb_raise(rb_eArgError, "wrong number of arguments: %s(src) or %s{..}", + rb_id2name(ruby_frame->last_func), + rb_id2name(ruby_frame->last_func)); + } + if (argc > 2) line = NUM2INT(argv[2]); + if (argc > 1) { + file = StringValuePtr(argv[1]); + } + } + return eval_under(klass, self, argv[0], file, line); + } +} + +/* + * call-seq: + * obj.instance_eval(string [, filename [, lineno]] ) => obj + * obj.instance_eval {| | block } => obj + * + * Evaluates a string containing Ruby source code, or the given block, + * within the context of the receiver (_obj_). In order to set the + * context, the variable +self+ is set to _obj_ while + * the code is executing, giving the code access to _obj_'s + * instance variables. In the version of <code>instance_eval</code> + * that takes a +String+, the optional second and third + * parameters supply a filename and starting line number that are used + * when reporting compilation errors. + * + * class Klass + * def initialize + * @secret = 99 + * end + * end + * k = Klass.new + * k.instance_eval { @secret } #=> 99 + */ + +VALUE +rb_obj_instance_eval(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + VALUE klass; + + if (SPECIAL_CONST_P(self)) { + klass = Qnil; + } + else { + klass = rb_singleton_class(self); + } + return specific_eval(argc, argv, klass, self); +} + +/* + * call-seq: + * mod.class_eval(string [, filename [, lineno]]) => obj + * mod.module_eval {|| block } => obj + * + * Evaluates the string or block in the context of _mod_. This can + * be used to add methods to a class. <code>module_eval</code> returns + * the result of evaluating its argument. The optional _filename_ + * and _lineno_ parameters set the text for error messages. + * + * class Thing + * end + * a = %q{def hello() "Hello there!" end} + * Thing.module_eval(a) + * puts Thing.new.hello() + * Thing.module_eval("invalid code", "dummy", 123) + * + * <em>produces:</em> + * + * Hello there! + * dummy:123:in `module_eval': undefined local variable + * or method `code' for Thing:Class + */ + +VALUE +rb_mod_module_eval(argc, argv, mod) + int argc; + VALUE *argv; + VALUE mod; +{ + return specific_eval(argc, argv, mod, mod); +} + +VALUE rb_load_path; + +NORETURN(static void load_failed _((VALUE))); + +void +rb_load(fname, wrap) + VALUE fname; + int wrap; +{ + VALUE tmp; + int state; + volatile int prohibit_int = rb_prohibit_interrupt; + volatile ID last_func; + volatile VALUE wrapper = ruby_wrapper; + volatile VALUE self = ruby_top_self; + NODE *volatile last_node; + NODE *saved_cref = ruby_cref; + + if (wrap && ruby_safe_level >= 4) { + StringValue(fname); + } + else { + SafeStringValue(fname); + } + fname = rb_str_new4(fname); + tmp = rb_find_file(fname); + if (!tmp) { + load_failed(fname); + } + fname = tmp; + + ruby_errinfo = Qnil; /* ensure */ + PUSH_VARS(); + PUSH_CLASS(ruby_wrapper); + ruby_cref = ruby_top_cref; + if (!wrap) { + rb_secure(4); /* should alter global state */ + ruby_class = rb_cObject; + ruby_wrapper = 0; + } + else { + /* load in anonymous module as toplevel */ + ruby_class = ruby_wrapper = rb_module_new(); + self = rb_obj_clone(ruby_top_self); + rb_extend_object(self, ruby_wrapper); + PUSH_CREF(ruby_wrapper); + } + PUSH_ITER(ITER_NOT); + PUSH_FRAME(); + ruby_frame->last_func = 0; + ruby_frame->last_class = 0; + ruby_frame->self = self; + PUSH_SCOPE(); + /* default visibility is private at loading toplevel */ + SCOPE_SET(SCOPE_PRIVATE); + PUSH_TAG(PROT_NONE); + state = EXEC_TAG(); + last_func = ruby_frame->last_func; + last_node = ruby_current_node; + if (!ruby_current_node && ruby_sourcefile) { + last_node = NEW_NEWLINE(0); + } + ruby_current_node = 0; + if (state == 0) { + NODE *node; + volatile int critical; + + DEFER_INTS; + ruby_in_eval++; + critical = rb_thread_critical; + rb_thread_critical = Qtrue; + rb_load_file(RSTRING(fname)->ptr); + ruby_in_eval--; + node = ruby_eval_tree; + rb_thread_critical = critical; + ALLOW_INTS; + if (ruby_nerrs == 0) { + eval_node(self, node); + } + } + ruby_frame->last_func = last_func; + ruby_current_node = last_node; + ruby_sourcefile = 0; + ruby_set_current_source(); + if (ruby_scope->flags == SCOPE_ALLOCA && ruby_class == rb_cObject) { + if (ruby_scope->local_tbl) /* toplevel was empty */ + free(ruby_scope->local_tbl); + } + POP_TAG(); + rb_prohibit_interrupt = prohibit_int; + ruby_cref = saved_cref; + POP_SCOPE(); + POP_FRAME(); + POP_ITER(); + POP_CLASS(); + POP_VARS(); + ruby_wrapper = wrapper; + if (ruby_nerrs > 0) { + ruby_nerrs = 0; + rb_exc_raise(ruby_errinfo); + } + if (state) jump_tag_but_local_jump(state, Qundef); + if (!NIL_P(ruby_errinfo)) /* exception during load */ + rb_exc_raise(ruby_errinfo); +} + +void +rb_load_protect(fname, wrap, state) + VALUE fname; + int wrap; + int *state; +{ + int status; + + PUSH_TAG(PROT_NONE); + if ((status = EXEC_TAG()) == 0) { + rb_load(fname, wrap); + } + POP_TAG(); + if (state) *state = status; +} + +/* + * call-seq: + * load(filename, wrap=false) => true + * + * Loads and executes the Ruby + * program in the file _filename_. If the filename does not + * resolve to an absolute path, the file is searched for in the library + * directories listed in <code>$:</code>. If the optional _wrap_ + * parameter is +true+, the loaded script will be executed + * under an anonymous module, protecting the calling program's global + * namespace. In no circumstance will any local variables in the loaded + * file be propagated to the loading environment. + */ + + +static VALUE +rb_f_load(argc, argv) + int argc; + VALUE *argv; +{ + VALUE fname, wrap; + + rb_scan_args(argc, argv, "11", &fname, &wrap); + rb_load(fname, RTEST(wrap)); + return Qtrue; +} + +VALUE ruby_dln_librefs; +static VALUE rb_features; +static st_table *loading_tbl; + +#define IS_SOEXT(e) (strcmp(e, ".so") == 0 || strcmp(e, ".o") == 0) +#ifdef DLEXT2 +#define IS_DLEXT(e) (strcmp(e, DLEXT) == 0 || strcmp(e, DLEXT2) == 0) +#else +#define IS_DLEXT(e) (strcmp(e, DLEXT) == 0) +#endif + + +static const char *const loadable_ext[] = { + ".rb", DLEXT, +#ifdef DLEXT2 + DLEXT2, +#endif + 0 +}; + +static int rb_feature_p _((const char **, const char *, int)); +static int search_required _((VALUE, VALUE *, VALUE *)); + +static int +rb_feature_p(ftptr, ext, rb) + const char **ftptr, *ext; + int rb; +{ + VALUE v; + const char *f, *e, *feature = *ftptr; + long i, len, elen; + + if (ext) { + len = ext - feature; + elen = strlen(ext); + } + else { + len = strlen(feature); + elen = 0; + } + for (i = 0; i < RARRAY_LEN(rb_features); ++i) { + v = RARRAY_PTR(rb_features)[i]; + f = StringValuePtr(v); + if (RSTRING_LEN(v) < len || strncmp(f, feature, len) != 0) + continue; + if (!*(e = f + len)) { + if (ext) continue; + *ftptr = 0; + return 'u'; + } + if (*e != '.') continue; + if ((!rb || !ext) && (IS_SOEXT(e) || IS_DLEXT(e))) { + *ftptr = 0; + return 's'; + } + if ((rb || !ext) && (strcmp(e, ".rb") == 0)) { + *ftptr = 0; + return 'r'; + } + } + if (loading_tbl) { + if (st_lookup(loading_tbl, (st_data_t)feature, (st_data_t *)ftptr)) { + if (!ext) return 'u'; + return strcmp(ext, ".rb") ? 's' : 'r'; + } + else { + char *buf; + + if (ext && *ext) return 0; + buf = ALLOCA_N(char, len + DLEXT_MAXLEN + 1); + MEMCPY(buf, feature, char, len); + for (i = 0; (e = loadable_ext[i]) != 0; i++) { + strncpy(buf + len, e, DLEXT_MAXLEN + 1); + if (st_lookup(loading_tbl, (st_data_t)buf, (st_data_t *)ftptr)) { + return i ? 's' : 'r'; + } + } + } + } + return 0; +} +#define rb_feature_p(feature, ext, rb) rb_feature_p(&feature, ext, rb) + +int +rb_provided(feature) + const char *feature; +{ + const char *ext = strrchr(feature, '.'); + + if (ext && !strchr(ext, '/')) { + if (strcmp(".rb", ext) == 0) { + if (rb_feature_p(feature, ext, Qtrue)) return Qtrue; + return Qfalse; + } + else if (IS_SOEXT(ext) || IS_DLEXT(ext)) { + if (rb_feature_p(feature, ext, Qfalse)) return Qtrue; + return Qfalse; + } + } + if (rb_feature_p(feature, feature + strlen(feature), Qtrue)) + return Qtrue; + + return Qfalse; +} + +static void +rb_provide_feature(feature) + VALUE feature; +{ + rb_ary_push(rb_features, feature); +} + +void +rb_provide(feature) + const char *feature; +{ + rb_provide_feature(rb_str_new2(feature)); +} + +static char * +load_lock(ftptr) + const char *ftptr; +{ + st_data_t th; + + if (!loading_tbl || + !st_lookup(loading_tbl, (st_data_t)ftptr, &th)) + { + /* loading ruby library should be serialized. */ + if (!loading_tbl) { + loading_tbl = st_init_strtable(); + } + /* partial state */ + ftptr = ruby_strdup(ftptr); + st_insert(loading_tbl, (st_data_t)ftptr, (st_data_t)curr_thread); + return (char *)ftptr; + } + do { + rb_thread_t owner = (rb_thread_t)th; + if (owner == curr_thread) return 0; + rb_thread_join(owner->thread, -1.0); + } while (st_lookup(loading_tbl, (st_data_t)ftptr, &th)); + return 0; +} + +static void +load_unlock(const char *ftptr) +{ + if (ftptr) { + st_data_t key = (st_data_t)ftptr; + + if (st_delete(loading_tbl, &key, 0)) { + free((char *)key); + } + } +} + +/* + * call-seq: + * require(string) => true or false + * + * Ruby tries to load the library named _string_, returning + * +true+ if successful. If the filename does not resolve to + * an absolute path, it will be searched for in the directories listed + * in <code>$:</code>. If the file has the extension ``.rb'', it is + * loaded as a source file; if the extension is ``.so'', ``.o'', or + * ``.dll'', or whatever the default shared library extension is on + * the current platform, Ruby loads the shared library as a Ruby + * extension. Otherwise, Ruby tries adding ``.rb'', ``.so'', and so on + * to the name. The name of the loaded feature is added to the array in + * <code>$"</code>. A feature will not be loaded if it's name already + * appears in <code>$"</code>. However, the file name is not converted + * to an absolute path, so that ``<code>require 'a';require + * './a'</code>'' will load <code>a.rb</code> twice. + * + * require "my-library.rb" + * require "db-driver" + */ + +VALUE +rb_f_require(obj, fname) + VALUE obj, fname; +{ + return rb_require_safe(fname, ruby_safe_level); +} + +static int +search_required(fname, featurep, path) + VALUE fname, *featurep, *path; +{ + VALUE tmp; + const char *ext, *ftptr; + int type; + + *featurep = fname; + *path = 0; + ext = strrchr(ftptr = RSTRING_PTR(fname), '.'); + if (ext && !strchr(ext, '/')) { + if (strcmp(".rb", ext) == 0) { + if (rb_feature_p(ftptr, ext, Qtrue)) { + if (ftptr) *path = rb_str_new2(ftptr); + return 'r'; + } + if ((*path = rb_find_file(fname)) != 0) return 'r'; + return 0; + } + else if (IS_SOEXT(ext)) { + if (rb_feature_p(ftptr, ext, Qfalse)) { + if (ftptr) *path = rb_str_new2(ftptr); + return 's'; + } + tmp = rb_str_new(RSTRING_PTR(fname), ext-RSTRING_PTR(fname)); + *featurep = tmp; +#ifdef DLEXT2 + OBJ_FREEZE(tmp); + if (rb_find_file_ext(&tmp, loadable_ext+1)) { + *featurep = tmp; + *path = rb_find_file(tmp); + return 's'; + } +#else + rb_str_cat2(tmp, DLEXT); + OBJ_FREEZE(tmp); + if ((*path = rb_find_file(tmp)) != 0) { + return 's'; + } +#endif + } + else if (IS_DLEXT(ext)) { + if (rb_feature_p(ftptr, ext, Qfalse)) { + if (ftptr) *path = rb_str_new2(ftptr); + return 's'; + } + if ((*path = rb_find_file(fname)) != 0) return 's'; + } + } + tmp = fname; + type = rb_find_file_ext(&tmp, loadable_ext); + *featurep = tmp; + switch (type) { + case 0: + type = rb_feature_p(ftptr, 0, Qfalse); + if (type && ftptr) *path = rb_str_new2(ftptr); + return type; + + default: + ext = strrchr(ftptr = RSTRING(tmp)->ptr, '.'); + if (!rb_feature_p(ftptr, ext, !--type)) + *path = rb_find_file(tmp); + else if (ftptr) + *path = rb_str_new2(ftptr); + } + return type ? 's' : 'r'; +} + +static void +load_failed(fname) + VALUE fname; +{ + rb_raise(rb_eLoadError, "no such file to load -- %s", RSTRING(fname)->ptr); +} + +VALUE +rb_require_safe(fname, safe) + VALUE fname; + int safe; +{ + VALUE result = Qnil; + volatile VALUE errinfo = ruby_errinfo; + int state; + struct { + NODE *node; + ID func; + int vmode, safe; + } volatile saved; + char *volatile ftptr = 0; + + if (OBJ_TAINTED(fname)) { + rb_check_safe_obj(fname); + } + StringValue(fname); + fname = rb_str_new4(fname); + saved.vmode = scope_vmode; + saved.node = ruby_current_node; + saved.func = ruby_frame->last_func; + saved.safe = ruby_safe_level; + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + VALUE feature, path; + long handle; + int found; + + ruby_safe_level = safe; + found = search_required(fname, &feature, &path); + if (found) { + if (!path || !(ftptr = load_lock(RSTRING_PTR(feature)))) { + result = Qfalse; + } + else { + ruby_safe_level = 0; + switch (found) { + case 'r': + rb_load(path, 0); + break; + + case 's': + ruby_current_node = 0; + ruby_sourcefile = rb_source_filename(RSTRING(path)->ptr); + ruby_sourceline = 0; + ruby_frame->last_func = 0; + SCOPE_SET(SCOPE_PUBLIC); + handle = (long)dln_load(RSTRING(path)->ptr); + rb_ary_push(ruby_dln_librefs, LONG2NUM(handle)); + break; + } + rb_provide_feature(feature); + result = Qtrue; + } + } + } + POP_TAG(); + ruby_current_node = saved.node; + ruby_set_current_source(); + ruby_frame->last_func = saved.func; + SCOPE_SET(saved.vmode); + ruby_safe_level = saved.safe; + load_unlock(ftptr); + if (state) JUMP_TAG(state); + if (NIL_P(result)) { + load_failed(fname); + } + ruby_errinfo = errinfo; + + return result; +} + +VALUE +rb_require(fname) + const char *fname; +{ + VALUE fn = rb_str_new2(fname); + OBJ_FREEZE(fn); + return rb_require_safe(fn, ruby_safe_level); +} + +void +ruby_init_ext(name, init) + const char *name; + void (*init) _((void)); +{ + ruby_current_node = 0; + ruby_sourcefile = rb_source_filename(name); + ruby_sourceline = 0; + ruby_frame->last_func = 0; + ruby_frame->orig_func = 0; + SCOPE_SET(SCOPE_PUBLIC); + if (load_lock(name)) { + (*init)(); + rb_provide(name); + load_unlock(name); + } +} + +static void +secure_visibility(self) + VALUE self; +{ + if (ruby_safe_level >= 4 && !OBJ_TAINTED(self)) { + rb_raise(rb_eSecurityError, "Insecure: can't change method visibility"); + } +} + +static void +set_method_visibility(self, argc, argv, ex) + VALUE self; + int argc; + VALUE *argv; + ID ex; +{ + int i; + + secure_visibility(self); + for (i=0; i<argc; i++) { + rb_export_method(self, rb_to_id(argv[i]), ex); + } + rb_clear_cache_by_class(self); +} + +/* + * call-seq: + * public => self + * public(symbol, ...) => self + * + * With no arguments, sets the default visibility for subsequently + * defined methods to public. With arguments, sets the named methods to + * have public visibility. + */ + +static VALUE +rb_mod_public(argc, argv, module) + int argc; + VALUE *argv; + VALUE module; +{ + secure_visibility(module); + if (argc == 0) { + SCOPE_SET(SCOPE_PUBLIC); + } + else { + set_method_visibility(module, argc, argv, NOEX_PUBLIC); + } + return module; +} + +/* + * call-seq: + * protected => self + * protected(symbol, ...) => self + * + * With no arguments, sets the default visibility for subsequently + * defined methods to protected. With arguments, sets the named methods + * to have protected visibility. + */ + +static VALUE +rb_mod_protected(argc, argv, module) + int argc; + VALUE *argv; + VALUE module; +{ + secure_visibility(module); + if (argc == 0) { + SCOPE_SET(SCOPE_PROTECTED); + } + else { + set_method_visibility(module, argc, argv, NOEX_PROTECTED); + } + return module; +} + +/* + * call-seq: + * private => self + * private(symbol, ...) => self + * + * With no arguments, sets the default visibility for subsequently + * defined methods to private. With arguments, sets the named methods + * to have private visibility. + * + * module Mod + * def a() end + * def b() end + * private + * def c() end + * private :a + * end + * Mod.private_instance_methods #=> ["a", "c"] + */ + +static VALUE +rb_mod_private(argc, argv, module) + int argc; + VALUE *argv; + VALUE module; +{ + secure_visibility(module); + if (argc == 0) { + SCOPE_SET(SCOPE_PRIVATE); + } + else { + set_method_visibility(module, argc, argv, NOEX_PRIVATE); + } + return module; +} + +/* + * call-seq: + * mod.public_class_method(symbol, ...) => mod + * + * Makes a list of existing class methods public. + */ + +static VALUE +rb_mod_public_method(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + set_method_visibility(CLASS_OF(obj), argc, argv, NOEX_PUBLIC); + return obj; +} + +/* + * call-seq: + * mod.private_class_method(symbol, ...) => mod + * + * Makes existing class methods private. Often used to hide the default + * constructor <code>new</code>. + * + * class SimpleSingleton # Not thread safe + * private_class_method :new + * def SimpleSingleton.create(*args, &block) + * @me = new(*args, &block) if ! @me + * @me + * end + * end + */ + +static VALUE +rb_mod_private_method(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + set_method_visibility(CLASS_OF(obj), argc, argv, NOEX_PRIVATE); + return obj; +} + +/* + * call-seq: + * public + * public(symbol, ...) + * + * With no arguments, sets the default visibility for subsequently + * defined methods to public. With arguments, sets the named methods to + * have public visibility. + */ + +static VALUE +top_public(argc, argv) + int argc; + VALUE *argv; +{ + return rb_mod_public(argc, argv, rb_cObject); +} + +static VALUE +top_private(argc, argv) + int argc; + VALUE *argv; +{ + return rb_mod_private(argc, argv, rb_cObject); +} + +/* + * call-seq: + * module_function(symbol, ...) => self + * + * Creates module functions for the named methods. These functions may + * be called with the module as a receiver, and also become available + * as instance methods to classes that mix in the module. Module + * functions are copies of the original, and so may be changed + * independently. The instance-method versions are made private. If + * used with no arguments, subsequently defined methods become module + * functions. + * + * module Mod + * def one + * "This is one" + * end + * module_function :one + * end + * class Cls + * include Mod + * def callOne + * one + * end + * end + * Mod.one #=> "This is one" + * c = Cls.new + * c.callOne #=> "This is one" + * module Mod + * def one + * "This is the new one" + * end + * end + * Mod.one #=> "This is one" + * c.callOne #=> "This is the new one" + */ + +static VALUE +rb_mod_modfunc(argc, argv, module) + int argc; + VALUE *argv; + VALUE module; +{ + int i; + ID id; + NODE *body; + + if (TYPE(module) != T_MODULE) { + rb_raise(rb_eTypeError, "module_function must be called for modules"); + } + + secure_visibility(module); + if (argc == 0) { + SCOPE_SET(SCOPE_MODFUNC); + return module; + } + + set_method_visibility(module, argc, argv, NOEX_PRIVATE); + for (i=0; i<argc; i++) { + VALUE m = module; + + id = rb_to_id(argv[i]); + for (;;) { + body = search_method(m, id, &m); + if (body == 0) { + body = search_method(rb_cObject, id, &m); + } + if (body == 0 || body->nd_body == 0) { + print_undef(module, id); + } + if (nd_type(body->nd_body) != NODE_ZSUPER) { + break; /* normal case: need not to follow 'super' link */ + } + m = RCLASS(m)->super; + if (!m) break; + } + rb_add_method(rb_singleton_class(module), id, body->nd_body, NOEX_PUBLIC); + } + return module; +} + +/* + * call-seq: + * append_features(mod) => mod + * + * When this module is included in another, Ruby calls + * <code>append_features</code> in this module, passing it the + * receiving module in _mod_. Ruby's default implementation is + * to add the constants, methods, and module variables of this module + * to _mod_ if this module has not already been added to + * _mod_ or one of its ancestors. See also <code>Module#include</code>. + */ + +static VALUE +rb_mod_append_features(module, include) + VALUE module, include; +{ + switch (TYPE(include)) { + case T_CLASS: + case T_MODULE: + break; + default: + Check_Type(include, T_CLASS); + break; + } + rb_include_module(include, module); + + return module; +} + +/* + * call-seq: + * include(module, ...) => self + * + * Invokes <code>Module.append_features</code> on each parameter in turn. + */ + +static VALUE +rb_mod_include(argc, argv, module) + int argc; + VALUE *argv; + VALUE module; +{ + int i; + + for (i=0; i<argc; i++) Check_Type(argv[i], T_MODULE); + while (argc--) { + rb_funcall(argv[argc], rb_intern("append_features"), 1, module); + rb_funcall(argv[argc], rb_intern("included"), 1, module); + } + return module; +} + +void +rb_obj_call_init(obj, argc, argv) + VALUE obj; + int argc; + VALUE *argv; +{ + PUSH_ITER(rb_block_given_p()?ITER_PRE:ITER_NOT); + rb_funcall2(obj, init, argc, argv); + POP_ITER(); +} + +void +rb_extend_object(obj, module) + VALUE obj, module; +{ + rb_include_module(rb_singleton_class(obj), module); +} + +/* + * call-seq: + * extend_object(obj) => obj + * + * Extends the specified object by adding this module's constants and + * methods (which are added as singleton methods). This is the callback + * method used by <code>Object#extend</code>. + * + * module Picky + * def Picky.extend_object(o) + * if String === o + * puts "Can't add Picky to a String" + * else + * puts "Picky added to #{o.class}" + * super + * end + * end + * end + * (s = Array.new).extend Picky # Call Object.extend + * (s = "quick brown fox").extend Picky + * + * <em>produces:</em> + * + * Picky added to Array + * Can't add Picky to a String + */ + +static VALUE +rb_mod_extend_object(mod, obj) + VALUE mod, obj; +{ + rb_extend_object(obj, mod); + return obj; +} + +/* + * call-seq: + * obj.extend(module, ...) => obj + * + * Adds to _obj_ the instance methods from each module given as a + * parameter. + * + * module Mod + * def hello + * "Hello from Mod.\n" + * end + * end + * + * class Klass + * def hello + * "Hello from Klass.\n" + * end + * end + * + * k = Klass.new + * k.hello #=> "Hello from Klass.\n" + * k.extend(Mod) #=> #<Klass:0x401b3bc8> + * k.hello #=> "Hello from Mod.\n" + */ + +static VALUE +rb_obj_extend(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + int i; + + if (argc == 0) { + rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)"); + } + for (i=0; i<argc; i++) Check_Type(argv[i], T_MODULE); + while (argc--) { + rb_funcall(argv[argc], rb_intern("extend_object"), 1, obj); + rb_funcall(argv[argc], rb_intern("extended"), 1, obj); + } + return obj; +} + +/* + * call-seq: + * include(module, ...) => self + * + * Invokes <code>Module.append_features</code> + * on each parameter in turn. Effectively adds the methods and constants + * in each module to the receiver. + */ + +static VALUE +top_include(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + rb_secure(4); + if (ruby_wrapper) { + rb_warning("main#include in the wrapped load is effective only in wrapper module"); + return rb_mod_include(argc, argv, ruby_wrapper); + } + return rb_mod_include(argc, argv, rb_cObject); +} + +VALUE rb_f_trace_var(); +VALUE rb_f_untrace_var(); + +static void +errinfo_setter(val, id, var) + VALUE val; + ID id; + VALUE *var; +{ + if (!NIL_P(val) && !rb_obj_is_kind_of(val, rb_eException)) { + rb_raise(rb_eTypeError, "assigning non-exception to $!"); + } + *var = val; +} + +static VALUE +errat_getter(id) + ID id; +{ + return get_backtrace(ruby_errinfo); +} + +static void +errat_setter(val, id, var) + VALUE val; + ID id; + VALUE *var; +{ + if (NIL_P(ruby_errinfo)) { + rb_raise(rb_eArgError, "$! not set"); + } + set_backtrace(ruby_errinfo, val); +} + +/* + * call-seq: + * local_variables => array + * + * Returns the names of the current local variables. + * + * fred = 1 + * for i in 1..10 + * # ... + * end + * local_variables #=> ["fred", "i"] + */ + +static VALUE +rb_f_local_variables() +{ + ID *tbl; + int n, i; + VALUE ary = rb_ary_new(); + struct RVarmap *vars; + + tbl = ruby_scope->local_tbl; + if (tbl) { + n = *tbl++; + for (i=2; i<n; i++) { /* skip first 2 ($_ and $~) */ + if (!rb_is_local_id(tbl[i])) continue; /* skip flip states */ + rb_ary_push(ary, rb_str_new2(rb_id2name(tbl[i]))); + } + } + + vars = ruby_dyna_vars; + while (vars) { + if (vars->id && rb_is_local_id(vars->id)) { /* skip $_, $~ and flip states */ + rb_ary_push(ary, rb_str_new2(rb_id2name(vars->id))); + } + vars = vars->next; + } + + return ary; +} + +static VALUE rb_f_catch _((VALUE,VALUE)); +NORETURN(static VALUE rb_f_throw _((int,VALUE*))); + +struct end_proc_data { + void (*func)(); + VALUE data; + int safe; + struct end_proc_data *next; +}; + +static struct end_proc_data *end_procs, *ephemeral_end_procs, *tmp_end_procs; + +void +rb_set_end_proc(func, data) + void (*func) _((VALUE)); + VALUE data; +{ + struct end_proc_data *link = ALLOC(struct end_proc_data); + struct end_proc_data **list; + + if (ruby_wrapper) list = &ephemeral_end_procs; + else list = &end_procs; + link->next = *list; + link->func = func; + link->data = data; + link->safe = ruby_safe_level; + *list = link; +} + +void +rb_mark_end_proc() +{ + struct end_proc_data *link; + + link = end_procs; + while (link) { + rb_gc_mark(link->data); + link = link->next; + } + link = ephemeral_end_procs; + while (link) { + rb_gc_mark(link->data); + link = link->next; + } + link = tmp_end_procs; + while (link) { + rb_gc_mark(link->data); + link = link->next; + } +} + +static void call_end_proc _((VALUE data)); + +static void +call_end_proc(data) + VALUE data; +{ + PUSH_ITER(ITER_NOT); + PUSH_FRAME(); + ruby_frame->self = ruby_frame->prev->self; + ruby_frame->node = 0; + ruby_frame->last_func = 0; + ruby_frame->last_class = 0; + proc_invoke(data, rb_ary_new2(0), Qundef, 0); + POP_FRAME(); + POP_ITER(); +} + +static void +rb_f_END() +{ + PUSH_FRAME(); + ruby_frame->argc = 0; + ruby_frame->iter = ITER_CUR; + rb_set_end_proc(call_end_proc, rb_block_proc()); + POP_FRAME(); +} + +/* + * call-seq: + * at_exit { block } -> proc + * + * Converts _block_ to a +Proc+ object (and therefore + * binds it at the point of call) and registers it for execution when + * the program exits. If multiple handlers are registered, they are + * executed in reverse order of registration. + * + * def do_at_exit(str1) + * at_exit { print str1 } + * end + * at_exit { puts "cruel world" } + * do_at_exit("goodbye ") + * exit + * + * <em>produces:</em> + * + * goodbye cruel world + */ + +static VALUE +rb_f_at_exit() +{ + VALUE proc; + + if (!rb_block_given_p()) { + rb_raise(rb_eArgError, "called without a block"); + } + proc = rb_block_proc(); + rb_set_end_proc(call_end_proc, proc); + return proc; +} + +void +rb_exec_end_proc() +{ + struct end_proc_data *link, *tmp; + int status; + volatile int safe = ruby_safe_level; + + while (ephemeral_end_procs) { + tmp_end_procs = link = ephemeral_end_procs; + ephemeral_end_procs = 0; + while (link) { + PUSH_TAG(PROT_NONE); + if ((status = EXEC_TAG()) == 0) { + ruby_safe_level = link->safe; + (*link->func)(link->data); + } + POP_TAG(); + if (status) { + error_handle(status); + } + tmp = link; + tmp_end_procs = link = link->next; + free(tmp); + } + } + while (end_procs) { + tmp_end_procs = link = end_procs; + end_procs = 0; + while (link) { + PUSH_TAG(PROT_NONE); + if ((status = EXEC_TAG()) == 0) { + ruby_safe_level = link->safe; + (*link->func)(link->data); + } + POP_TAG(); + if (status) { + error_handle(status); + } + tmp = link; + tmp_end_procs = link = link->next; + free(tmp); + } + } + ruby_safe_level = safe; +} + +void +Init_eval() +{ + init = rb_intern("initialize"); + eqq = rb_intern("==="); + each = rb_intern("each"); + + aref = rb_intern("[]"); + aset = rb_intern("[]="); + match = rb_intern("=~"); + missing = rb_intern("method_missing"); + added = rb_intern("method_added"); + singleton_added = rb_intern("singleton_method_added"); + removed = rb_intern("method_removed"); + singleton_removed = rb_intern("singleton_method_removed"); + undefined = rb_intern("method_undefined"); + singleton_undefined = rb_intern("singleton_method_undefined"); + + __id__ = rb_intern("__id__"); + __send__ = rb_intern("__send__"); + + rb_global_variable((void *)&top_scope); + rb_global_variable((void *)&ruby_eval_tree_begin); + + rb_global_variable((void *)&ruby_eval_tree); + rb_global_variable((void *)&ruby_dyna_vars); + + rb_define_virtual_variable("$@", errat_getter, errat_setter); + rb_define_hooked_variable("$!", &ruby_errinfo, 0, errinfo_setter); + + rb_define_global_function("eval", rb_f_eval, -1); + rb_define_global_function("iterator?", rb_f_block_given_p, 0); + rb_define_global_function("block_given?", rb_f_block_given_p, 0); + rb_define_global_function("method_missing", rb_method_missing, -1); + rb_define_global_function("loop", rb_f_loop, 0); + + rb_define_method(rb_mKernel, "respond_to?", obj_respond_to, -1); + respond_to = rb_intern("respond_to?"); + rb_global_variable((void *)&basic_respond_to); + basic_respond_to = rb_method_node(rb_cObject, respond_to); + + rb_define_global_function("raise", rb_f_raise, -1); + rb_define_global_function("fail", rb_f_raise, -1); + + rb_define_global_function("caller", rb_f_caller, -1); + + rb_define_global_function("exit", rb_f_exit, -1); + rb_define_global_function("abort", rb_f_abort, -1); + + rb_define_global_function("at_exit", rb_f_at_exit, 0); + + rb_define_global_function("catch", rb_f_catch, 1); + rb_define_global_function("throw", rb_f_throw, -1); + rb_define_global_function("global_variables", rb_f_global_variables, 0); /* in variable.c */ + rb_define_global_function("local_variables", rb_f_local_variables, 0); + + rb_define_method(rb_mKernel, "send", rb_f_send, -1); + rb_define_method(rb_mKernel, "__send__", rb_f_send, -1); + rb_define_method(rb_mKernel, "instance_eval", rb_obj_instance_eval, -1); + + rb_define_private_method(rb_cModule, "append_features", rb_mod_append_features, 1); + rb_define_private_method(rb_cModule, "extend_object", rb_mod_extend_object, 1); + rb_define_private_method(rb_cModule, "include", rb_mod_include, -1); + rb_define_private_method(rb_cModule, "public", rb_mod_public, -1); + rb_define_private_method(rb_cModule, "protected", rb_mod_protected, -1); + rb_define_private_method(rb_cModule, "private", rb_mod_private, -1); + rb_define_private_method(rb_cModule, "module_function", rb_mod_modfunc, -1); + rb_define_method(rb_cModule, "method_defined?", rb_mod_method_defined, 1); + rb_define_method(rb_cModule, "public_method_defined?", rb_mod_public_method_defined, 1); + rb_define_method(rb_cModule, "private_method_defined?", rb_mod_private_method_defined, 1); + rb_define_method(rb_cModule, "protected_method_defined?", rb_mod_protected_method_defined, 1); + rb_define_method(rb_cModule, "public_class_method", rb_mod_public_method, -1); + rb_define_method(rb_cModule, "private_class_method", rb_mod_private_method, -1); + rb_define_method(rb_cModule, "module_eval", rb_mod_module_eval, -1); + rb_define_method(rb_cModule, "class_eval", rb_mod_module_eval, -1); + + rb_undef_method(rb_cClass, "module_function"); + + rb_define_private_method(rb_cModule, "remove_method", rb_mod_remove_method, -1); + rb_define_private_method(rb_cModule, "undef_method", rb_mod_undef_method, -1); + rb_define_private_method(rb_cModule, "alias_method", rb_mod_alias_method, 2); + rb_define_private_method(rb_cModule, "define_method", rb_mod_define_method, -1); + + rb_define_singleton_method(rb_cModule, "nesting", rb_mod_nesting, 0); + rb_define_singleton_method(rb_cModule, "constants", rb_mod_s_constants, 0); + + rb_define_singleton_method(ruby_top_self, "include", top_include, -1); + rb_define_singleton_method(ruby_top_self, "public", top_public, -1); + rb_define_singleton_method(ruby_top_self, "private", top_private, -1); + + rb_define_method(rb_mKernel, "extend", rb_obj_extend, -1); + + rb_define_global_function("trace_var", rb_f_trace_var, -1); /* in variable.c */ + rb_define_global_function("untrace_var", rb_f_untrace_var, -1); /* in variable.c */ + + rb_define_global_function("set_trace_func", set_trace_func, 1); + rb_global_variable(&trace_func); + + rb_define_virtual_variable("$SAFE", safe_getter, safe_setter); +} + +/* + * call-seq: + * mod.autoload(name, filename) => nil + * + * Registers _filename_ to be loaded (using <code>Kernel::require</code>) + * the first time that _name_ (which may be a <code>String</code> or + * a symbol) is accessed in the namespace of _mod_. + * + * module A + * end + * A.autoload(:B, "b") + * A::B.doit # autoloads "b" + */ + +static VALUE +rb_mod_autoload(mod, sym, file) + VALUE mod; + VALUE sym; + VALUE file; +{ + ID id = rb_to_id(sym); + + Check_SafeStr(file); + rb_autoload(mod, id, RSTRING(file)->ptr); + return Qnil; +} + +/* + * call-seq: + * mod.autoload?(name) => String or nil + * + * Returns _filename_ to be loaded if _name_ is registered as + * +autoload+ in the namespace of _mod_. + * + * module A + * end + * A.autoload(:B, "b") + * A.autoload?(:B) # => "b" + */ + +static VALUE +rb_mod_autoload_p(mod, sym) + VALUE mod, sym; +{ + return rb_autoload_p(mod, rb_to_id(sym)); +} + +/* + * call-seq: + * autoload(module, filename) => nil + * + * Registers _filename_ to be loaded (using <code>Kernel::require</code>) + * the first time that _module_ (which may be a <code>String</code> or + * a symbol) is accessed. + * + * autoload(:MyModule, "/usr/local/lib/modules/my_module.rb") + */ + +static VALUE +rb_f_autoload(obj, sym, file) + VALUE obj; + VALUE sym; + VALUE file; +{ + if (NIL_P(ruby_cbase)) { + rb_raise(rb_eTypeError, "no class/module for autoload target"); + } + return rb_mod_autoload(ruby_cbase, sym, file); +} + +/* + * call-seq: + * autoload(module, filename) => nil + * + * Registers _filename_ to be loaded (using <code>Kernel::require</code>) + * the first time that _module_ (which may be a <code>String</code> or + * a symbol) is accessed. + * + * autoload(:MyModule, "/usr/local/lib/modules/my_module.rb") + */ + +static VALUE +rb_f_autoload_p(obj, sym) + VALUE obj; + VALUE sym; +{ + /* use ruby_cbase as same as rb_f_autoload. */ + if (NIL_P(ruby_cbase)) { + return Qfalse; + } + return rb_mod_autoload_p(ruby_cbase, sym); +} + +void +Init_load() +{ + rb_define_readonly_variable("$:", &rb_load_path); + rb_define_readonly_variable("$-I", &rb_load_path); + rb_define_readonly_variable("$LOAD_PATH", &rb_load_path); + rb_load_path = rb_ary_new(); + + rb_define_readonly_variable("$\"", &rb_features); + rb_define_readonly_variable("$LOADED_FEATURES", &rb_features); + rb_features = rb_ary_new(); + + rb_define_global_function("load", rb_f_load, -1); + rb_define_global_function("require", rb_f_require, 1); + rb_define_method(rb_cModule, "autoload", rb_mod_autoload, 2); + rb_define_method(rb_cModule, "autoload?", rb_mod_autoload_p, 1); + rb_define_global_function("autoload", rb_f_autoload, 2); + rb_define_global_function("autoload?", rb_f_autoload_p, 1); + rb_global_variable(&ruby_wrapper); + + rb_global_variable(&ruby_dln_librefs); + ruby_dln_librefs = rb_ary_new(); +} + +static void +scope_dup(scope) + struct SCOPE *scope; +{ + ID *tbl; + VALUE *vars; + + scope->flags |= SCOPE_DONT_RECYCLE; + if (scope->flags & SCOPE_MALLOC) return; + + if (scope->local_tbl) { + tbl = scope->local_tbl; + vars = ALLOC_N(VALUE, tbl[0]+1); + *vars++ = scope->local_vars[-1]; + MEMCPY(vars, scope->local_vars, VALUE, tbl[0]); + scope->local_vars = vars; + scope->flags |= SCOPE_MALLOC; + } +} + +static void +blk_mark(data) + struct BLOCK *data; +{ + while (data) { + rb_gc_mark_frame(&data->frame); + rb_gc_mark((VALUE)data->scope); + rb_gc_mark((VALUE)data->var); + rb_gc_mark((VALUE)data->body); + rb_gc_mark((VALUE)data->self); + rb_gc_mark((VALUE)data->dyna_vars); + rb_gc_mark((VALUE)data->cref); + rb_gc_mark(data->wrapper); + rb_gc_mark(data->block_obj); + data = data->prev; + } +} + +static void +frame_free(frame) + struct FRAME *frame; +{ + struct FRAME *tmp; + + frame = frame->prev; + while (frame) { + tmp = frame; + frame = frame->prev; + free(tmp); + } +} + +static void +blk_free(data) + struct BLOCK *data; +{ + void *tmp; + + while (data) { + frame_free(&data->frame); + tmp = data; + data = data->prev; + free(tmp); + } +} + +static void +frame_dup(frame) + struct FRAME *frame; +{ + struct FRAME *tmp; + + for (;;) { + frame->tmp = 0; /* should not preserve tmp */ + if (!frame->prev) break; + tmp = ALLOC(struct FRAME); + *tmp = *frame->prev; + frame->prev = tmp; + frame = tmp; + } +} + + +static void +blk_copy_prev(block) + struct BLOCK *block; +{ + struct BLOCK *tmp; + struct RVarmap* vars; + + while (block->prev) { + tmp = ALLOC_N(struct BLOCK, 1); + MEMCPY(tmp, block->prev, struct BLOCK, 1); + scope_dup(tmp->scope); + frame_dup(&tmp->frame); + + for (vars = tmp->dyna_vars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; + FL_SET(vars, DVAR_DONT_RECYCLE); + } + + block->prev = tmp; + block = tmp; + } +} + + +static void +blk_dup(dup, orig) + struct BLOCK *dup, *orig; +{ + MEMCPY(dup, orig, struct BLOCK, 1); + frame_dup(&dup->frame); + + if (dup->iter) { + blk_copy_prev(dup); + } + else { + dup->prev = 0; + } +} + +/* + * MISSING: documentation + */ + +static VALUE +proc_clone(self) + VALUE self; +{ + struct BLOCK *orig, *data; + VALUE bind; + + Data_Get_Struct(self, struct BLOCK, orig); + bind = Data_Make_Struct(rb_obj_class(self),struct BLOCK,blk_mark,blk_free,data); + CLONESETUP(bind, self); + blk_dup(data, orig); + + return bind; +} + +/* + * MISSING: documentation + */ + +#define PROC_TSHIFT (FL_USHIFT+1) +#define PROC_TMASK (FL_USER1|FL_USER2|FL_USER3) +#define PROC_TMAX (PROC_TMASK >> PROC_TSHIFT) + +static int proc_get_safe_level(VALUE); + +static VALUE +proc_dup(self) + VALUE self; +{ + struct BLOCK *orig, *data; + VALUE bind; + int safe = proc_get_safe_level(self); + + Data_Get_Struct(self, struct BLOCK, orig); + bind = Data_Make_Struct(rb_obj_class(self),struct BLOCK,blk_mark,blk_free,data); + blk_dup(data, orig); + if (safe > PROC_TMAX) safe = PROC_TMAX; + FL_SET(bind, (safe << PROC_TSHIFT) & PROC_TMASK); + + return bind; +} + +/* + * call-seq: + * binding -> a_binding + * + * Returns a +Binding+ object, describing the variable and + * method bindings at the point of call. This object can be used when + * calling +eval+ to execute the evaluated command in this + * environment. Also see the description of class +Binding+. + * + * def getBinding(param) + * return binding + * end + * b = getBinding("hello") + * eval("param", b) #=> "hello" + */ + +static VALUE +rb_f_binding(self) + VALUE self; +{ + struct BLOCK *data, *p; + struct RVarmap *vars; + VALUE bind; + + PUSH_BLOCK(0,0); + bind = Data_Make_Struct(rb_cBinding,struct BLOCK,blk_mark,blk_free,data); + *data = *ruby_block; + + data->orig_thread = rb_thread_current(); + data->wrapper = ruby_wrapper; + data->iter = rb_f_block_given_p(); + frame_dup(&data->frame); + if (ruby_frame->prev) { + data->frame.last_func = ruby_frame->prev->last_func; + data->frame.last_class = ruby_frame->prev->last_class; + data->frame.orig_func = ruby_frame->prev->orig_func; + } + + if (data->iter) { + blk_copy_prev(data); + } + else { + data->prev = 0; + } + + for (p = data; p; p = p->prev) { + for (vars = p->dyna_vars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; + FL_SET(vars, DVAR_DONT_RECYCLE); + } + } + scope_dup(data->scope); + POP_BLOCK(); + + return bind; +} + +#define SAFE_LEVEL_MAX PROC_TMASK + +static void +proc_save_safe_level(data) + VALUE data; +{ + int safe = ruby_safe_level; + if (safe > PROC_TMAX) safe = PROC_TMAX; + FL_SET(data, (safe << PROC_TSHIFT) & PROC_TMASK); +} + +static int +proc_get_safe_level(data) + VALUE data; +{ + return (RBASIC(data)->flags & PROC_TMASK) >> PROC_TSHIFT; +} + +static void +proc_set_safe_level(data) + VALUE data; +{ + ruby_safe_level = proc_get_safe_level(data); +} + +static VALUE +proc_alloc(klass, proc) + VALUE klass; + int proc; +{ + volatile VALUE block; + struct BLOCK *data, *p; + struct RVarmap *vars; + + if (!rb_block_given_p() && !rb_f_block_given_p()) { + rb_raise(rb_eArgError, "tried to create Proc object without a block"); + } + if (proc && !rb_block_given_p()) { + rb_warn("tried to create Proc object without a block"); + } + + if (!proc && ruby_block->block_obj && CLASS_OF(ruby_block->block_obj) == klass) { + return ruby_block->block_obj; + } + block = Data_Make_Struct(klass, struct BLOCK, blk_mark, blk_free, data); + *data = *ruby_block; + + data->orig_thread = rb_thread_current(); + data->wrapper = ruby_wrapper; + data->iter = data->prev?Qtrue:Qfalse; + data->block_obj = block; + frame_dup(&data->frame); + if (data->iter) { + blk_copy_prev(data); + } + else { + data->prev = 0; + } + + for (p = data; p; p = p->prev) { + for (vars = p->dyna_vars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; + FL_SET(vars, DVAR_DONT_RECYCLE); + } + } + scope_dup(data->scope); + proc_save_safe_level(block); + if (proc) { + data->flags |= BLOCK_LAMBDA; + } + else { + ruby_block->block_obj = block; + } + + return block; +} + +/* + * call-seq: + * Proc.new {|...| block } => a_proc + * Proc.new => a_proc + * + * Creates a new <code>Proc</code> object, bound to the current + * context. <code>Proc::new</code> may be called without a block only + * within a method with an attached block, in which case that block is + * converted to the <code>Proc</code> object. + * + * def proc_from + * Proc.new + * end + * proc = proc_from { "hello" } + * proc.call #=> "hello" + */ + +static VALUE +proc_s_new(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + VALUE block = proc_alloc(klass, Qfalse); + + rb_obj_call_init(block, argc, argv); + return block; +} + +VALUE +rb_block_proc() +{ + return proc_alloc(rb_cProc, Qfalse); +} + +VALUE +rb_f_lambda() +{ + rb_warn("rb_f_lambda() is deprecated; use rb_block_proc() instead"); + return proc_alloc(rb_cProc, Qtrue); +} + +/* + * call-seq: + * proc { |...| block } => a_proc + * lambda { |...| block } => a_proc + * + * Equivalent to <code>Proc.new</code>, except the resulting Proc objects + * check the number of parameters passed when called. + */ + +static VALUE +proc_lambda() +{ + return proc_alloc(rb_cProc, Qtrue); +} + +static int +block_orphan(data) + struct BLOCK *data; +{ + if (data->scope->flags & SCOPE_NOSTACK) { + return 1; + } + if (data->orig_thread != rb_thread_current()) { + return 1; + } + return 0; +} + +static VALUE +proc_invoke(proc, args, self, klass) + VALUE proc, args; /* OK */ + VALUE self, klass; +{ + struct BLOCK * volatile old_block; + struct BLOCK _block; + struct BLOCK *data; + volatile VALUE result = Qundef; + int state; + volatile int safe = ruby_safe_level; + volatile VALUE old_wrapper = ruby_wrapper; + volatile int pcall, avalue = Qtrue; + volatile VALUE tmp = args; + + if (rb_block_given_p() && ruby_frame->last_func) { + if (klass != ruby_frame->last_class) + klass = rb_obj_class(proc); + rb_warning("block for %s#%s is useless", + rb_class2name(klass), + rb_id2name(ruby_frame->last_func)); + } + + Data_Get_Struct(proc, struct BLOCK, data); + pcall = (data->flags & BLOCK_LAMBDA) ? YIELD_LAMBDA_CALL : 0; + if (!pcall && RARRAY(args)->len == 1) { + avalue = Qfalse; + args = RARRAY(args)->ptr[0]; + } + + PUSH_VARS(); + ruby_wrapper = data->wrapper; + ruby_dyna_vars = data->dyna_vars; + /* PUSH BLOCK from data */ + old_block = ruby_block; + _block = *data; + if (self != Qundef) _block.frame.self = self; + if (klass) _block.frame.last_class = klass; + _block.frame.argc = RARRAY(tmp)->len; + _block.frame.flags = ruby_frame->flags; + if (_block.frame.argc && DMETHOD_P()) { + NEWOBJ(scope, struct SCOPE); + OBJSETUP(scope, tmp, T_SCOPE); + scope->local_tbl = _block.scope->local_tbl; + scope->local_vars = _block.scope->local_vars; + scope->flags |= SCOPE_CLONE | (_block.scope->flags & SCOPE_MALLOC); + _block.scope = scope; + } + /* modify current frame */ + ruby_block = &_block; + PUSH_ITER(ITER_CUR); + ruby_frame->iter = ITER_CUR; + PUSH_TAG(pcall ? PROT_LAMBDA : PROT_NONE); + state = EXEC_TAG(); + if (state == 0) { + proc_set_safe_level(proc); + result = rb_yield_0(args, self, (self!=Qundef)?CLASS_OF(self):0, pcall, avalue); + } + else if (TAG_DST()) { + result = prot_tag->retval; + } + POP_TAG(); + POP_ITER(); + ruby_block = old_block; + ruby_wrapper = old_wrapper; + POP_VARS(); + ruby_safe_level = safe; + + switch (state) { + case 0: + break; + case TAG_RETRY: + proc_jump_error(TAG_RETRY, Qnil); /* xxx */ + JUMP_TAG(state); + break; + case TAG_NEXT: + case TAG_BREAK: + if (!pcall && result != Qundef) { + proc_jump_error(state, result); + } + case TAG_RETURN: + if (result != Qundef) { + if (pcall) break; + return_jump(result); + } + default: + JUMP_TAG(state); + } + return result; +} + +/* CHECKME: are the argument checking semantics correct? */ + +/* + * call-seq: + * prc.call(params,...) => obj + * prc[params,...] => obj + * + * Invokes the block, setting the block's parameters to the values in + * <i>params</i> using something close to method calling semantics. + * Generates a warning if multiple values are passed to a proc that + * expects just one (previously this silently converted the parameters + * to an array). + * + * For procs created using <code>Kernel.proc</code>, generates an + * error if the wrong number of parameters + * are passed to a proc with multiple parameters. For procs created using + * <code>Proc.new</code>, extra parameters are silently discarded. + * + * Returns the value of the last expression evaluated in the block. See + * also <code>Proc#yield</code>. + * + * a_proc = Proc.new {|a, *b| b.collect {|i| i*a }} + * a_proc.call(9, 1, 2, 3) #=> [9, 18, 27] + * a_proc[9, 1, 2, 3] #=> [9, 18, 27] + * a_proc = Proc.new {|a,b| a} + * a_proc.call(1,2,3) + * + * <em>produces:</em> + * + * prog.rb:5: wrong number of arguments (3 for 2) (ArgumentError) + * from prog.rb:4:in `call' + * from prog.rb:5 + */ + +static VALUE +proc_call(proc, args) + VALUE proc, args; /* OK */ +{ + return proc_invoke(proc, args, Qundef, 0); +} + +static VALUE bmcall _((VALUE, VALUE)); +static VALUE method_arity _((VALUE)); + +/* + * call-seq: + * prc.arity -> fixnum + * + * Returns the number of arguments that would not be ignored. If the block + * is declared to take no arguments, returns 0. If the block is known + * to take exactly n arguments, returns n. If the block has optional + * arguments, return -n-1, where n is the number of mandatory + * arguments. A <code>proc</code> with no argument declarations + * is the same a block declaring <code>||</code> as its arguments. + * + * Proc.new {}.arity #=> 0 + * Proc.new {||}.arity #=> 0 + * Proc.new {|a|}.arity #=> 1 + * Proc.new {|a,b|}.arity #=> 2 + * Proc.new {|a,b,c|}.arity #=> 3 + * Proc.new {|*a|}.arity #=> -1 + * Proc.new {|a,*b|}.arity #=> -2 + */ + +static VALUE +proc_arity(proc) + VALUE proc; +{ + struct BLOCK *data; + NODE *list; + int n; + + Data_Get_Struct(proc, struct BLOCK, data); + if (data->var == 0) { + if (data->body && nd_type(data->body) == NODE_IFUNC && + data->body->nd_cfnc == bmcall) { + return method_arity(data->body->nd_tval); + } + return INT2FIX(-1); + } + if (data->var == (NODE*)1) return INT2FIX(0); + if (data->var == (NODE*)2) return INT2FIX(0); + switch (nd_type(data->var)) { + default: + return INT2FIX(1); + case NODE_MASGN: + list = data->var->nd_head; + n = 0; + while (list) { + n++; + list = list->nd_next; + } + if (data->var->nd_args) return INT2FIX(-n-1); + return INT2FIX(n); + } +} + +/* + * call-seq: + * prc == other_proc => true or false + * + * Return <code>true</code> if <i>prc</i> is the same object as + * <i>other_proc</i>, or if they are both procs with the same body. + */ + +static VALUE +proc_eq(self, other) + VALUE self, other; +{ + struct BLOCK *data, *data2; + + if (self == other) return Qtrue; + if (TYPE(other) != T_DATA) return Qfalse; + if (RDATA(other)->dmark != (RUBY_DATA_FUNC)blk_mark) return Qfalse; + if (CLASS_OF(self) != CLASS_OF(other)) return Qfalse; + Data_Get_Struct(self, struct BLOCK, data); + Data_Get_Struct(other, struct BLOCK, data2); + if (data->body != data2->body) return Qfalse; + if (data->var != data2->var) return Qfalse; + if (data->scope != data2->scope) return Qfalse; + if (data->dyna_vars != data2->dyna_vars) return Qfalse; + if (data->flags != data2->flags) return Qfalse; + + return Qtrue; +} + +/* + * call-seq: + * prc.to_s => string + * + * Shows the unique identifier for this proc, along with + * an indication of where the proc was defined. + */ + +static VALUE +proc_to_s(self) + VALUE self; +{ + struct BLOCK *data; + NODE *node; + char *cname = rb_obj_classname(self); + const int w = (sizeof(VALUE) * CHAR_BIT) / 4; + long len = strlen(cname)+6+w; /* 6:tags 16:addr */ + VALUE str; + + Data_Get_Struct(self, struct BLOCK, data); + if ((node = data->frame.node) || (node = data->body)) { + len += strlen(node->nd_file) + 2 + (SIZEOF_LONG*CHAR_BIT-NODE_LSHIFT)/3; + str = rb_str_new(0, len); + snprintf(RSTRING(str)->ptr, len+1, + "#<%s:0x%.*lx@%s:%d>", cname, w, (VALUE)data->body, + node->nd_file, nd_line(node)); + } + else { + str = rb_str_new(0, len); + snprintf(RSTRING(str)->ptr, len+1, + "#<%s:0x%.*lx>", cname, w, (VALUE)data->body); + } + RSTRING(str)->len = strlen(RSTRING(str)->ptr); + if (OBJ_TAINTED(self)) OBJ_TAINT(str); + + return str; +} + +/* + * call-seq: + * prc.to_proc -> prc + * + * Part of the protocol for converting objects to <code>Proc</code> + * objects. Instances of class <code>Proc</code> simply return + * themselves. + */ + +static VALUE +proc_to_self(self) + VALUE self; +{ + return self; +} + +/* + * call-seq: + * prc.binding => binding + * + * Returns the binding associated with <i>prc</i>. Note that + * <code>Kernel#eval</code> accepts either a <code>Proc</code> or a + * <code>Binding</code> object as its second parameter. + * + * def fred(param) + * proc {} + * end + * + * b = fred(99) + * eval("param", b.binding) #=> 99 + * eval("param", b) #=> 99 + */ + +static VALUE +proc_binding(proc) + VALUE proc; +{ + struct BLOCK *orig, *data; + VALUE bind; + + Data_Get_Struct(proc, struct BLOCK, orig); + bind = Data_Make_Struct(rb_cBinding,struct BLOCK,blk_mark,blk_free,data); + MEMCPY(data, orig, struct BLOCK, 1); + frame_dup(&data->frame); + + if (data->iter) { + blk_copy_prev(data); + } + else { + data->prev = 0; + } + + return bind; +} + +static VALUE +block_pass(self, node) + VALUE self; + NODE *node; +{ + VALUE proc = rb_eval(self, node->nd_body); /* OK */ + VALUE b; + struct BLOCK * volatile old_block; + struct BLOCK _block; + struct BLOCK *data; + volatile VALUE result = Qnil; + int state; + volatile int orphan; + volatile int safe = ruby_safe_level; + + if (NIL_P(proc)) { + PUSH_ITER(ITER_NOT); + result = rb_eval(self, node->nd_iter); + POP_ITER(); + return result; + } + if (!rb_obj_is_proc(proc)) { + b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc"); + if (!rb_obj_is_proc(b)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Proc)", + rb_obj_classname(proc)); + } + proc = b; + } + + if (ruby_safe_level >= 1 && OBJ_TAINTED(proc) && + ruby_safe_level > proc_get_safe_level(proc)) { + rb_raise(rb_eSecurityError, "Insecure: tainted block value"); + } + + if (ruby_block && ruby_block->block_obj == proc) { + PUSH_ITER(ITER_PAS); + result = rb_eval(self, node->nd_iter); + POP_ITER(); + return result; + } + + Data_Get_Struct(proc, struct BLOCK, data); + orphan = block_orphan(data); + + /* PUSH BLOCK from data */ + old_block = ruby_block; + _block = *data; + _block.outer = ruby_block; + if (orphan) _block.uniq = block_unique++; + ruby_block = &_block; + PUSH_ITER(ITER_PRE); + if (ruby_frame->iter == ITER_NOT) + ruby_frame->iter = ITER_PRE; + + PUSH_TAG(PROT_LOOP); + state = EXEC_TAG(); + if (state == 0) { + retry: + proc_set_safe_level(proc); + if (safe > ruby_safe_level) + ruby_safe_level = safe; + result = rb_eval(self, node->nd_iter); + } + else if (state == TAG_BREAK && TAG_DST()) { + result = prot_tag->retval; + state = 0; + } + else if (state == TAG_RETRY) { + state = 0; + goto retry; + } + POP_TAG(); + POP_ITER(); + ruby_block = old_block; + ruby_safe_level = safe; + + switch (state) {/* escape from orphan block */ + case 0: + break; + case TAG_RETURN: + if (orphan) { + proc_jump_error(state, prot_tag->retval); + } + default: + JUMP_TAG(state); + } + + return result; +} + +struct METHOD { + VALUE klass, rklass; + VALUE recv; + ID id, oid; + int safe_level; + NODE *body; +}; + +static void +bm_mark(data) + struct METHOD *data; +{ + rb_gc_mark(data->rklass); + rb_gc_mark(data->klass); + rb_gc_mark(data->recv); + rb_gc_mark((VALUE)data->body); +} + +static VALUE +mnew(klass, obj, id, mklass) + VALUE klass, obj, mklass; + ID id; +{ + VALUE method; + NODE *body; + int noex; + struct METHOD *data; + VALUE rklass = klass; + ID oid = id; + + again: + if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) { + print_undef(rklass, oid); + } + + if (nd_type(body) == NODE_ZSUPER) { + klass = RCLASS(klass)->super; + goto again; + } + + while (rklass != klass && + (FL_TEST(rklass, FL_SINGLETON) || TYPE(rklass) == T_ICLASS)) { + rklass = RCLASS(rklass)->super; + } + method = Data_Make_Struct(mklass, struct METHOD, bm_mark, free, data); + data->klass = klass; + data->recv = obj; + data->id = id; + data->body = body; + data->rklass = rklass; + data->oid = oid; + data->safe_level = NOEX_WITH_SAFE(noex); + OBJ_INFECT(method, klass); + + return method; +} + + +/********************************************************************** + * + * Document-class : Method + * + * Method objects are created by <code>Object#method</code>, and are + * associated with a particular object (not just with a class). They + * may be used to invoke the method within the object, and as a block + * associated with an iterator. They may also be unbound from one + * object (creating an <code>UnboundMethod</code>) and bound to + * another. + * + * class Thing + * def square(n) + * n*n + * end + * end + * thing = Thing.new + * meth = thing.method(:square) + * + * meth.call(9) #=> 81 + * [ 1, 2, 3 ].collect(&meth) #=> [1, 4, 9] + * + */ + +/* + * call-seq: + * meth == other_meth => true or false + * + * Two method objects are equal if that are bound to the same + * object and contain the same body. + */ + + +static VALUE +method_eq(method, other) + VALUE method, other; +{ + struct METHOD *m1, *m2; + + if (TYPE(other) != T_DATA || RDATA(other)->dmark != (RUBY_DATA_FUNC)bm_mark) + return Qfalse; + if (CLASS_OF(method) != CLASS_OF(other)) + return Qfalse; + + Data_Get_Struct(method, struct METHOD, m1); + Data_Get_Struct(other, struct METHOD, m2); + + if (m1->klass != m2->klass || m1->rklass != m2->rklass || + m1->recv != m2->recv || m1->body != m2->body) + return Qfalse; + + return Qtrue; +} + +/* + * call-seq: + * meth.unbind => unbound_method + * + * Dissociates <i>meth</i> from it's current receiver. The resulting + * <code>UnboundMethod</code> can subsequently be bound to a new object + * of the same class (see <code>UnboundMethod</code>). + */ + +static VALUE +method_unbind(obj) + VALUE obj; +{ + VALUE method; + struct METHOD *orig, *data; + + Data_Get_Struct(obj, struct METHOD, orig); + method = Data_Make_Struct(rb_cUnboundMethod, struct METHOD, bm_mark, free, data); + data->klass = orig->klass; + data->recv = Qundef; + data->id = orig->id; + data->body = orig->body; + data->rklass = orig->rklass; + data->oid = orig->oid; + OBJ_INFECT(method, obj); + + return method; +} + +/* + * call-seq: + * obj.method(sym) => method + * + * Looks up the named method as a receiver in <i>obj</i>, returning a + * <code>Method</code> object (or raising <code>NameError</code>). The + * <code>Method</code> object acts as a closure in <i>obj</i>'s object + * instance, so instance variables and the value of <code>self</code> + * remain available. + * + * class Demo + * def initialize(n) + * @iv = n + * end + * def hello() + * "Hello, @iv = #{@iv}" + * end + * end + * + * k = Demo.new(99) + * m = k.method(:hello) + * m.call #=> "Hello, @iv = 99" + * + * l = Demo.new('Fred') + * m = l.method("hello") + * m.call #=> "Hello, @iv = Fred" + */ + +static VALUE +rb_obj_method(obj, vid) + VALUE obj; + VALUE vid; +{ + return mnew(CLASS_OF(obj), obj, rb_to_id(vid), rb_cMethod); +} + +/* + * call-seq: + * mod.instance_method(symbol) => unbound_method + * + * Returns an +UnboundMethod+ representing the given + * instance method in _mod_. + * + * class Interpreter + * def do_a() print "there, "; end + * def do_d() print "Hello "; end + * def do_e() print "!\n"; end + * def do_v() print "Dave"; end + * Dispatcher = { + * ?a => instance_method(:do_a), + * ?d => instance_method(:do_d), + * ?e => instance_method(:do_e), + * ?v => instance_method(:do_v) + * } + * def interpret(string) + * string.each_byte {|b| Dispatcher[b].bind(self).call } + * end + * end + * + * + * interpreter = Interpreter.new + * interpreter.interpret('dave') + * + * <em>produces:</em> + * + * Hello there, Dave! + */ + +static VALUE +rb_mod_method(mod, vid) + VALUE mod; + VALUE vid; +{ + return mnew(mod, Qundef, rb_to_id(vid), rb_cUnboundMethod); +} + +/* + * MISSING: documentation + */ + +static VALUE +method_clone(self) + VALUE self; +{ + VALUE clone; + struct METHOD *orig, *data; + + Data_Get_Struct(self, struct METHOD, orig); + clone = Data_Make_Struct(CLASS_OF(self),struct METHOD, bm_mark, free, data); + CLONESETUP(clone, self); + *data = *orig; + + return clone; +} + +/* + * call-seq: + * meth.call(args, ...) => obj + * meth[args, ...] => obj + * + * Invokes the <i>meth</i> with the specified arguments, returning the + * method's return value. + * + * m = 12.method("+") + * m.call(3) #=> 15 + * m.call(20) #=> 32 + */ + +static VALUE +method_call(argc, argv, method) + int argc; + VALUE *argv; + VALUE method; +{ + VALUE result = Qnil; /* OK */ + struct METHOD *data; + int safe; + + Data_Get_Struct(method, struct METHOD, data); + if (data->recv == Qundef) { + rb_raise(rb_eTypeError, "can't call unbound method; bind first"); + } + if (OBJ_TAINTED(method)) { + safe = NOEX_WITH(data->safe_level, 4)|NOEX_TAINTED; + } + else { + safe = data->safe_level; + } + PUSH_ITER(rb_block_given_p()?ITER_PRE:ITER_NOT); + result = rb_call0(data->klass,data->recv,data->id,data->oid,argc,argv,data->body,safe); + POP_ITER(); + return result; +} + +/********************************************************************** + * + * Document-class: UnboundMethod + * + * Ruby supports two forms of objectified methods. Class + * <code>Method</code> is used to represent methods that are associated + * with a particular object: these method objects are bound to that + * object. Bound method objects for an object can be created using + * <code>Object#method</code>. + * + * Ruby also supports unbound methods; methods objects that are not + * associated with a particular object. These can be created either by + * calling <code>Module#instance_method</code> or by calling + * <code>unbind</code> on a bound method object. The result of both of + * these is an <code>UnboundMethod</code> object. + * + * Unbound methods can only be called after they are bound to an + * object. That object must be be a kind_of? the method's original + * class. + * + * class Square + * def area + * @side * @side + * end + * def initialize(side) + * @side = side + * end + * end + * + * area_un = Square.instance_method(:area) + * + * s = Square.new(12) + * area = area_un.bind(s) + * area.call #=> 144 + * + * Unbound methods are a reference to the method at the time it was + * objectified: subsequent changes to the underlying class will not + * affect the unbound method. + * + * class Test + * def test + * :original + * end + * end + * um = Test.instance_method(:test) + * class Test + * def test + * :modified + * end + * end + * t = Test.new + * t.test #=> :modified + * um.bind(t).call #=> :original + * + */ + +/* + * call-seq: + * umeth.bind(obj) -> method + * + * Bind <i>umeth</i> to <i>obj</i>. If <code>Klass</code> was the class + * from which <i>umeth</i> was obtained, + * <code>obj.kind_of?(Klass)</code> must be true. + * + * class A + * def test + * puts "In test, class = #{self.class}" + * end + * end + * class B < A + * end + * class C < B + * end + * + * + * um = B.instance_method(:test) + * bm = um.bind(C.new) + * bm.call + * bm = um.bind(B.new) + * bm.call + * bm = um.bind(A.new) + * bm.call + * + * <em>produces:</em> + * + * In test, class = C + * In test, class = B + * prog.rb:16:in `bind': bind argument must be an instance of B (TypeError) + * from prog.rb:16 + */ + +static VALUE +umethod_bind(method, recv) + VALUE method, recv; +{ + struct METHOD *data, *bound; + VALUE rklass = CLASS_OF(recv); + + Data_Get_Struct(method, struct METHOD, data); + if (data->rklass != rklass) { + if (FL_TEST(data->rklass, FL_SINGLETON)) { + rb_raise(rb_eTypeError, "singleton method bound for a different object"); + } + if (TYPE(data->rklass) == T_MODULE) { + st_table *m_tbl = RCLASS(data->rklass)->m_tbl; + while (RCLASS(rklass)->m_tbl != m_tbl) { + rklass = RCLASS(rklass)->super; + if (!rklass) goto not_instace; + } + } + else if (!rb_obj_is_kind_of(recv, data->rklass)) { + not_instace: + rb_raise(rb_eTypeError, "bind argument must be an instance of %s", + rb_class2name(data->rklass)); + } + } + + method = Data_Make_Struct(rb_cMethod,struct METHOD,bm_mark,free,bound); + *bound = *data; + bound->recv = recv; + bound->rklass = rklass; + + return method; +} + +/* + * call-seq: + * meth.arity => fixnum + * + * Returns an indication of the number of arguments accepted by a + * method. Returns a nonnegative integer for methods that take a fixed + * number of arguments. For Ruby methods that take a variable number of + * arguments, returns -n-1, where n is the number of required + * arguments. For methods written in C, returns -1 if the call takes a + * variable number of arguments. + * + * class C + * def one; end + * def two(a); end + * def three(*a); end + * def four(a, b); end + * def five(a, b, *c); end + * def six(a, b, *c, &d); end + * end + * c = C.new + * c.method(:one).arity #=> 0 + * c.method(:two).arity #=> 1 + * c.method(:three).arity #=> -1 + * c.method(:four).arity #=> 2 + * c.method(:five).arity #=> -3 + * c.method(:six).arity #=> -3 + * + * "cat".method(:size).arity #=> 0 + * "cat".method(:replace).arity #=> 1 + * "cat".method(:squeeze).arity #=> -1 + * "cat".method(:count).arity #=> -1 + */ + +static VALUE +method_arity(method) + VALUE method; +{ + struct METHOD *data; + NODE *body; + int n; + + Data_Get_Struct(method, struct METHOD, data); + + body = data->body; + switch (nd_type(body)) { + case NODE_CFUNC: + if (body->nd_argc < 0) return INT2FIX(-1); + return INT2FIX(body->nd_argc); + case NODE_ZSUPER: + return INT2FIX(-1); + case NODE_ATTRSET: + return INT2FIX(1); + case NODE_IVAR: + return INT2FIX(0); + case NODE_BMETHOD: + return proc_arity(body->nd_cval); + case NODE_DMETHOD: + return method_arity(body->nd_cval); + case NODE_SCOPE: + body = body->nd_next; /* skip NODE_SCOPE */ + if (nd_type(body) == NODE_BLOCK) + body = body->nd_head; + if (!body) return INT2FIX(0); + n = body->nd_cnt; + if (body->nd_opt || body->nd_rest) + n = -n-1; + return INT2FIX(n); + default: + rb_raise(rb_eArgError, "invalid node 0x%x", nd_type(body)); + } +} + +/* + * call-seq: + * meth.to_s => string + * meth.inspect => string + * + * Show the name of the underlying method. + * + * "cat".method(:count).inspect #=> "#<Method: String#count>" + */ + +static VALUE +method_inspect(method) + VALUE method; +{ + struct METHOD *data; + VALUE str; + const char *s; + char *sharp = "#"; + + Data_Get_Struct(method, struct METHOD, data); + str = rb_str_buf_new2("#<"); + s = rb_obj_classname(method); + rb_str_buf_cat2(str, s); + rb_str_buf_cat2(str, ": "); + + if (FL_TEST(data->klass, FL_SINGLETON)) { + VALUE v = rb_iv_get(data->klass, "__attached__"); + + if (data->recv == Qundef) { + rb_str_buf_append(str, rb_inspect(data->klass)); + } + else if (data->recv == v) { + rb_str_buf_append(str, rb_inspect(v)); + sharp = "."; + } + else { + rb_str_buf_append(str, rb_inspect(data->recv)); + rb_str_buf_cat2(str, "("); + rb_str_buf_append(str, rb_inspect(v)); + rb_str_buf_cat2(str, ")"); + sharp = "."; + } + } + else { + rb_str_buf_cat2(str, rb_class2name(data->rklass)); + if (data->rklass != data->klass) { + VALUE klass = data -> klass; + if (TYPE(klass) == T_ICLASS) { + klass = RBASIC(klass)->klass; + } + rb_str_buf_cat2(str, "("); + rb_str_buf_cat2(str, rb_class2name(klass)); + rb_str_buf_cat2(str, ")"); + } + } + rb_str_buf_cat2(str, sharp); + rb_str_buf_cat2(str, rb_id2name(data->oid)); + rb_str_buf_cat2(str, ">"); + + return str; +} + +static VALUE +mproc(method) + VALUE method; +{ + VALUE proc; + + /* emulate ruby's method call */ + PUSH_ITER(ITER_CUR); + PUSH_FRAME(); + proc = rb_block_proc(); + POP_FRAME(); + POP_ITER(); + + return proc; +} + +static VALUE +bmcall(args, method) + VALUE args, method; +{ + volatile VALUE a; + VALUE ret; + + a = svalue_to_avalue(args); + ret = method_call(RARRAY(a)->len, RARRAY(a)->ptr, method); + a = Qnil; /* prevent tail call */ + return ret; +} + +VALUE +rb_proc_new(func, val) + VALUE (*func)(ANYARGS); /* VALUE yieldarg[, VALUE procarg] */ + VALUE val; +{ + struct BLOCK *data; + VALUE proc = rb_iterate((VALUE(*)_((VALUE)))mproc, 0, func, val); + + Data_Get_Struct(proc, struct BLOCK, data); + data->body->nd_state = YIELD_FUNC_AVALUE; + return proc; +} + +/* + * call-seq: + * meth.to_proc => prc + * + * Returns a <code>Proc</code> object corresponding to this method. + */ + +static VALUE +method_proc(method) + VALUE method; +{ + VALUE proc; + struct METHOD *mdata; + struct BLOCK *bdata; + + proc = rb_iterate((VALUE(*)_((VALUE)))mproc, 0, bmcall, method); + Data_Get_Struct(method, struct METHOD, mdata); + Data_Get_Struct(proc, struct BLOCK, bdata); + bdata->body->nd_file = mdata->body->nd_file; + nd_set_line(bdata->body, nd_line(mdata->body)); + bdata->body->nd_state = YIELD_FUNC_SVALUE; + + return proc; +} + +static VALUE +rb_obj_is_method(m) + VALUE m; +{ + if (TYPE(m) == T_DATA && RDATA(m)->dmark == (RUBY_DATA_FUNC)bm_mark) { + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * define_method(symbol, method) => new_method + * define_method(symbol) { block } => proc + * + * Defines an instance method in the receiver. The _method_ + * parameter can be a +Proc+ or +Method+ object. + * If a block is specified, it is used as the method body. This block + * is evaluated using <code>instance_eval</code>, a point that is + * tricky to demonstrate because <code>define_method</code> is private. + * (This is why we resort to the +send+ hack in this example.) + * + * class A + * def fred + * puts "In Fred" + * end + * def create_method(name, &block) + * self.class.send(:define_method, name, &block) + * end + * define_method(:wilma) { puts "Charge it!" } + * end + * class B < A + * define_method(:barney, instance_method(:fred)) + * end + * a = B.new + * a.barney + * a.wilma + * a.create_method(:betty) { p self } + * a.betty + * + * <em>produces:</em> + * + * In Fred + * Charge it! + * #<B:0x401b39e8> + */ + +static VALUE +rb_mod_define_method(argc, argv, mod) + int argc; + VALUE *argv; + VALUE mod; +{ + ID id; + VALUE body; + NODE *node; + int noex; + + if (argc == 1) { + id = rb_to_id(argv[0]); + body = proc_lambda(); + } + else if (argc == 2) { + id = rb_to_id(argv[0]); + body = argv[1]; + if (!rb_obj_is_method(body) && !rb_obj_is_proc(body)) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Proc/Method)", + rb_obj_classname(body)); + } + } + else { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc); + } + if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) { + node = NEW_DMETHOD(method_unbind(body)); + } + else if (RDATA(body)->dmark == (RUBY_DATA_FUNC)blk_mark) { + struct BLOCK *block; + + body = proc_clone(body); + Data_Get_Struct(body, struct BLOCK, block); + block->frame.last_func = id; + block->frame.orig_func = id; + block->frame.last_class = mod; + node = NEW_BMETHOD(body); + } + else { + /* type error */ + rb_raise(rb_eTypeError, "wrong argument type (expected Proc/Method)"); + } + + noex = NOEX_PUBLIC; + if (ruby_cbase == mod) { + if (SCOPE_TEST(SCOPE_PRIVATE)) { + noex = NOEX_PRIVATE; + } + else if (SCOPE_TEST(SCOPE_PROTECTED)) { + noex = NOEX_PROTECTED; + } + } + rb_add_method(mod, id, node, noex); + return body; +} + +/* + * <code>Proc</code> objects are blocks of code that have been bound to + * a set of local variables. Once bound, the code may be called in + * different contexts and still access those variables. + * + * def gen_times(factor) + * return Proc.new {|n| n*factor } + * end + * + * times3 = gen_times(3) + * times5 = gen_times(5) + * + * times3.call(12) #=> 36 + * times5.call(5) #=> 25 + * times3.call(times5.call(4)) #=> 60 + * + */ + +void +Init_Proc() +{ + rb_eLocalJumpError = rb_define_class("LocalJumpError", rb_eStandardError); + rb_define_method(rb_eLocalJumpError, "exit_value", localjump_xvalue, 0); + rb_define_method(rb_eLocalJumpError, "reason", localjump_reason, 0); + + rb_global_variable(&exception_error); + exception_error = rb_exc_new3(rb_eFatal, + rb_obj_freeze(rb_str_new2("exception reentered"))); + OBJ_TAINT(exception_error); + OBJ_FREEZE(exception_error); + + rb_eSysStackError = rb_define_class("SystemStackError", rb_eStandardError); + rb_global_variable(&sysstack_error); + sysstack_error = rb_exc_new3(rb_eSysStackError, + rb_obj_freeze(rb_str_new2("stack level too deep"))); + OBJ_TAINT(sysstack_error); + OBJ_FREEZE(sysstack_error); + + rb_cProc = rb_define_class("Proc", rb_cObject); + rb_undef_alloc_func(rb_cProc); + rb_define_singleton_method(rb_cProc, "new", proc_s_new, -1); + + rb_define_method(rb_cProc, "clone", proc_clone, 0); + rb_define_method(rb_cProc, "dup", proc_dup, 0); + rb_define_method(rb_cProc, "call", proc_call, -2); + rb_define_method(rb_cProc, "arity", proc_arity, 0); + rb_define_method(rb_cProc, "[]", proc_call, -2); + rb_define_method(rb_cProc, "==", proc_eq, 1); + rb_define_method(rb_cProc, "to_s", proc_to_s, 0); + rb_define_method(rb_cProc, "to_proc", proc_to_self, 0); + rb_define_method(rb_cProc, "binding", proc_binding, 0); + + rb_define_global_function("proc", proc_lambda, 0); + rb_define_global_function("lambda", proc_lambda, 0); + + rb_cMethod = rb_define_class("Method", rb_cObject); + rb_undef_alloc_func(rb_cMethod); + rb_undef_method(CLASS_OF(rb_cMethod), "new"); + rb_define_method(rb_cMethod, "==", method_eq, 1); + rb_define_method(rb_cMethod, "clone", method_clone, 0); + rb_define_method(rb_cMethod, "call", method_call, -1); + rb_define_method(rb_cMethod, "[]", method_call, -1); + rb_define_method(rb_cMethod, "arity", method_arity, 0); + rb_define_method(rb_cMethod, "inspect", method_inspect, 0); + rb_define_method(rb_cMethod, "to_s", method_inspect, 0); + rb_define_method(rb_cMethod, "to_proc", method_proc, 0); + rb_define_method(rb_cMethod, "unbind", method_unbind, 0); + rb_define_method(rb_mKernel, "method", rb_obj_method, 1); + + rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cObject); + rb_undef_alloc_func(rb_cUnboundMethod); + rb_undef_method(CLASS_OF(rb_cUnboundMethod), "new"); + rb_define_method(rb_cUnboundMethod, "==", method_eq, 1); + rb_define_method(rb_cUnboundMethod, "clone", method_clone, 0); + rb_define_method(rb_cUnboundMethod, "arity", method_arity, 0); + rb_define_method(rb_cUnboundMethod, "inspect", method_inspect, 0); + rb_define_method(rb_cUnboundMethod, "to_s", method_inspect, 0); + rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1); + rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1); +} + +/* + * Objects of class <code>Binding</code> encapsulate the execution + * context at some particular place in the code and retain this context + * for future use. The variables, methods, value of <code>self</code>, + * and possibly an iterator block that can be accessed in this context + * are all retained. Binding objects can be created using + * <code>Kernel#binding</code>, and are made available to the callback + * of <code>Kernel#set_trace_func</code>. + * + * These binding objects can be passed as the second argument of the + * <code>Kernel#eval</code> method, establishing an environment for the + * evaluation. + * + * class Demo + * def initialize(n) + * @secret = n + * end + * def getBinding + * return binding() + * end + * end + * + * k1 = Demo.new(99) + * b1 = k1.getBinding + * k2 = Demo.new(-3) + * b2 = k2.getBinding + * + * eval("@secret", b1) #=> 99 + * eval("@secret", b2) #=> -3 + * eval("@secret") #=> nil + * + * Binding objects have no class-specific methods. + * + */ + +void +Init_Binding() +{ + rb_cBinding = rb_define_class("Binding", rb_cObject); + rb_undef_alloc_func(rb_cBinding); + rb_undef_method(CLASS_OF(rb_cBinding), "new"); + rb_define_method(rb_cBinding, "clone", proc_clone, 0); + rb_define_method(rb_cBinding, "dup", proc_dup, 0); + rb_define_global_function("binding", rb_f_binding, 0); +} + +/* Windows SEH refers data on the stack. */ +#undef SAVE_WIN32_EXCEPTION_LIST +#if defined _WIN32 || defined __CYGWIN__ +#if defined __CYGWIN__ +typedef unsigned long DWORD; +#endif + +static inline DWORD +win32_get_exception_list() +{ + DWORD p; +# if defined _MSC_VER +# ifdef _M_IX86 +# define SAVE_WIN32_EXCEPTION_LIST +# if _MSC_VER >= 1310 + /* warning: unsafe assignment to fs:0 ... this is ok */ +# pragma warning(disable: 4733) +# endif + __asm mov eax, fs:[0]; + __asm mov p, eax; +# endif +# elif defined __GNUC__ +# ifdef __i386__ +# define SAVE_WIN32_EXCEPTION_LIST + __asm__("movl %%fs:0,%0" : "=r"(p)); +# endif +# elif defined __BORLANDC__ +# define SAVE_WIN32_EXCEPTION_LIST + __emit__(0x64, 0xA1, 0, 0, 0, 0); /* mov eax, fs:[0] */ + p = _EAX; +# endif + return p; +} + +static inline void +win32_set_exception_list(p) + DWORD p; +{ +# if defined _MSC_VER +# ifdef _M_IX86 + __asm mov eax, p; + __asm mov fs:[0], eax; +# endif +# elif defined __GNUC__ +# ifdef __i386__ + __asm__("movl %0,%%fs:0" :: "r"(p)); +# endif +# elif defined __BORLANDC__ + _EAX = p; + __emit__(0x64, 0xA3, 0, 0, 0, 0); /* mov fs:[0], eax */ +# endif +} + +#if !defined SAVE_WIN32_EXCEPTION_LIST && !defined _WIN32_WCE +# error unsupported platform +#endif +#endif + +int rb_thread_pending = 0; + +VALUE rb_cThread; + +extern VALUE rb_last_status; + +#define WAIT_FD (1<<0) +#define WAIT_SELECT (1<<1) +#define WAIT_TIME (1<<2) +#define WAIT_JOIN (1<<3) +#define WAIT_PID (1<<4) + +/* +infty, for this purpose */ +#define DELAY_INFTY 1E30 + +#if !defined HAVE_PAUSE +# if defined _WIN32 && !defined __CYGWIN__ +# define pause() Sleep(INFINITE) +# else +# define pause() sleep(0x7fffffff) +# endif +#endif + +#define THREAD_TERMINATING 0x400 /* persistent flag */ +#define THREAD_NO_ENSURE 0x800 /* persistent flag */ +#define THREAD_FLAGS_MASK 0xfc00 /* mask for persistent flags */ + +#define FOREACH_THREAD_FROM(f,x) x = f; do { x = x->next; +#define END_FOREACH_FROM(f,x) } while (x != f) + +#define FOREACH_THREAD(x) FOREACH_THREAD_FROM(curr_thread,x) +#define END_FOREACH(x) END_FOREACH_FROM(curr_thread,x) + +struct thread_status_t { + NODE *node; + + int tracing; + VALUE errinfo; + VALUE last_status; + VALUE last_line; + VALUE last_match; + + int safe; + + enum rb_thread_status status; + int wait_for; + int fd; + fd_set readfds; + fd_set writefds; + fd_set exceptfds; + int select_value; + double delay; + rb_thread_t join; +}; + +#define THREAD_COPY_STATUS(src, dst) (void)( \ + (dst)->node = (src)->node, \ + \ + (dst)->tracing = (src)->tracing, \ + (dst)->errinfo = (src)->errinfo, \ + (dst)->last_status = (src)->last_status, \ + (dst)->last_line = (src)->last_line, \ + (dst)->last_match = (src)->last_match, \ + \ + (dst)->safe = (src)->safe, \ + \ + (dst)->status = (src)->status, \ + (dst)->wait_for = (src)->wait_for, \ + (dst)->fd = (src)->fd, \ + (dst)->readfds = (src)->readfds, \ + (dst)->writefds = (src)->writefds, \ + (dst)->exceptfds = (src)->exceptfds, \ + (dst)->select_value = (src)->select_value, \ + (dst)->delay = (src)->delay, \ + (dst)->join = (src)->join, \ + 0) + +int +rb_thread_set_raised(th) + rb_thread_t th; +{ + if (th->flags & RAISED_EXCEPTION) { + return 1; + } + th->flags |= RAISED_EXCEPTION; + return 0; +} + +int +rb_thread_reset_raised(th) + rb_thread_t th; +{ + if (!(th->flags & RAISED_EXCEPTION)) { + return 0; + } + th->flags &= ~RAISED_EXCEPTION; + return 1; +} + +static int +thread_no_ensure() +{ + return ((curr_thread->flags & THREAD_NO_ENSURE) == THREAD_NO_ENSURE); +} + +static void rb_thread_ready _((rb_thread_t)); + +static VALUE run_trap_eval _((VALUE)); +static VALUE +run_trap_eval(arg) + VALUE arg; +{ + VALUE *p = (VALUE *)arg; + return rb_eval_cmd(p[0], p[1], (int)p[2]); +} + +static VALUE +rb_trap_eval(cmd, sig, safe) + VALUE cmd; + int sig, safe; +{ + int state; + VALUE val = Qnil; /* OK */ + volatile struct thread_status_t save; + VALUE arg[3]; + + arg[0] = cmd; + arg[1] = rb_ary_new3(1, INT2FIX(sig)); + arg[2] = (VALUE)safe; + THREAD_COPY_STATUS(curr_thread, &save); + rb_thread_ready(curr_thread); + PUSH_ITER(ITER_NOT); + val = rb_protect(run_trap_eval, (VALUE)&arg, &state); + POP_ITER(); + THREAD_COPY_STATUS(&save, curr_thread); + + if (state) { + rb_trap_immediate = 0; + rb_thread_ready(curr_thread); + JUMP_TAG(state); + } + + if (curr_thread->status == THREAD_STOPPED) { + rb_thread_schedule(); + } + errno = EINTR; + + return val; +} + +static const char * +thread_status_name(status) + enum rb_thread_status status; +{ + switch (status) { + case THREAD_RUNNABLE: + return "run"; + case THREAD_STOPPED: + return "sleep"; + case THREAD_TO_KILL: + return "aborting"; + case THREAD_KILLED: + return "dead"; + default: + return "unknown"; + } +} + +/* $SAFE accessor */ +void +rb_set_safe_level(level) + int level; +{ + if (level > ruby_safe_level) { + if (level > SAFE_LEVEL_MAX) level = SAFE_LEVEL_MAX; + ruby_safe_level = level; + curr_thread->safe = level; + } +} + +static VALUE +safe_getter() +{ + return INT2NUM(ruby_safe_level); +} + +static void +safe_setter(val) + VALUE val; +{ + int level = NUM2INT(val); + + if (level < ruby_safe_level) { + rb_raise(rb_eSecurityError, "tried to downgrade safe level from %d to %d", + ruby_safe_level, level); + } + if (level > SAFE_LEVEL_MAX) level = SAFE_LEVEL_MAX; + ruby_safe_level = level; + curr_thread->safe = level; +} + +/* Return the current time as a floating-point number */ +static double +timeofday() +{ + struct timeval tv; +#ifdef CLOCK_MONOTONIC + struct timespec tp; + + if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0) { + return (double)tp.tv_sec + (double)tp.tv_nsec * 1e-9; + } +#endif + gettimeofday(&tv, NULL); + return (double)tv.tv_sec + (double)tv.tv_usec * 1e-6; +} + +#define STACK(addr) (th->stk_pos<(VALUE*)(addr) && (VALUE*)(addr)<th->stk_pos+th->stk_len) +#define ADJ(addr) (void*)(STACK(addr)?(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr):(VALUE*)(addr)) +static void +thread_mark(th) + rb_thread_t th; +{ + struct FRAME *frame; + struct BLOCK *block; + + rb_gc_mark(th->result); + rb_gc_mark(th->thread); + if (th->join) rb_gc_mark(th->join->thread); + + rb_gc_mark(th->klass); + rb_gc_mark(th->wrapper); + rb_gc_mark((VALUE)th->cref); + + rb_gc_mark((VALUE)th->scope); + rb_gc_mark((VALUE)th->dyna_vars); + rb_gc_mark(th->errinfo); + rb_gc_mark(th->last_status); + rb_gc_mark(th->last_line); + rb_gc_mark(th->last_match); + rb_mark_tbl(th->locals); + rb_gc_mark(th->thgroup); + rb_gc_mark_maybe(th->sandbox); + + /* mark data in copied stack */ + if (th == curr_thread) return; + if (th->status == THREAD_KILLED) return; + if (th->stk_len == 0) return; /* stack not active, no need to mark. */ + if (th->stk_ptr) { + rb_gc_mark_locations(th->stk_ptr, th->stk_ptr+th->stk_len); +#if defined(THINK_C) || defined(__human68k__) + rb_gc_mark_locations(th->stk_ptr+2, th->stk_ptr+th->stk_len+2); +#endif +#ifdef __ia64 + if (th->bstr_ptr) { + rb_gc_mark_locations(th->bstr_ptr, th->bstr_ptr+th->bstr_len); + } +#endif + } + frame = th->frame; + while (frame && frame != top_frame) { + frame = ADJ(frame); + rb_gc_mark_frame(frame); + if (frame->tmp) { + struct FRAME *tmp = frame->tmp; + + while (tmp && tmp != top_frame) { + tmp = ADJ(tmp); + rb_gc_mark_frame(tmp); + tmp = tmp->prev; + } + } + frame = frame->prev; + } + block = th->block; + while (block) { + block = ADJ(block); + rb_gc_mark_frame(&block->frame); + block = block->prev; + } +} + +static int +mark_loading_thread(key, value, lev) + ID key; + VALUE value; + int lev; +{ + rb_gc_mark(((rb_thread_t)value)->thread); + return ST_CONTINUE; +} + +void +rb_gc_mark_threads() +{ + rb_thread_t th; + + /* static global mark */ + rb_gc_mark((VALUE)ruby_cref); + + if (!curr_thread) return; + rb_gc_mark(main_thread->thread); + rb_gc_mark(curr_thread->thread); + FOREACH_THREAD_FROM(main_thread, th) { + switch (th->status) { + case THREAD_TO_KILL: + case THREAD_RUNNABLE: + break; + case THREAD_STOPPED: + if (th->wait_for) break; + default: + continue; + } + rb_gc_mark(th->thread); + } END_FOREACH_FROM(main_thread, th); + if (loading_tbl) st_foreach(loading_tbl, mark_loading_thread, 0); +} + +void +rb_gc_abort_threads() +{ + rb_thread_t th; + + if (!main_thread) + return; + + FOREACH_THREAD_FROM(main_thread, th) { + if (FL_TEST(th->thread, FL_MARK)) continue; + if (th->status == THREAD_STOPPED) { + th->status = THREAD_TO_KILL; + rb_gc_mark(th->thread); + } + } END_FOREACH_FROM(main_thread, th); +} + +static inline void +stack_free(th) + rb_thread_t th; +{ + if (th->stk_ptr) free(th->stk_ptr); + th->stk_ptr = 0; +#ifdef __ia64 + if (th->bstr_ptr) free(th->bstr_ptr); + th->bstr_ptr = 0; +#endif +} + +static void +thread_free(th) + rb_thread_t th; +{ + stack_free(th); + if (th->locals) st_free_table(th->locals); + if (th->status != THREAD_KILLED) { + if (th->prev) th->prev->next = th->next; + if (th->next) th->next->prev = th->prev; + } + if (th != main_thread) free(th); +} + +static rb_thread_t +rb_thread_check(data) + VALUE data; +{ + if (TYPE(data) != T_DATA || RDATA(data)->dmark != (RUBY_DATA_FUNC)thread_mark) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Thread)", + rb_obj_classname(data)); + } + return (rb_thread_t)RDATA(data)->data; +} + +static VALUE rb_thread_raise _((int, VALUE*, rb_thread_t)); + +static VALUE th_raise_exception; +static NODE *th_raise_node; +static VALUE th_cmd; +static int th_sig, th_safe; + +#define RESTORE_NORMAL 1 +#define RESTORE_FATAL 2 +#define RESTORE_INTERRUPT 3 +#define RESTORE_TRAP 4 +#define RESTORE_RAISE 5 +#define RESTORE_SIGNAL 6 +#define RESTORE_EXIT 7 + +extern VALUE *rb_gc_stack_start; +#ifdef __ia64 +extern VALUE *rb_gc_register_stack_start; +#endif + +static void +rb_thread_save_context(th) + rb_thread_t th; +{ + VALUE *pos; + size_t len; + static VALUE tval; + + len = ruby_stack_length(&pos); + th->stk_len = 0; + th->stk_pos = pos; + if (len > th->stk_max) { + VALUE *ptr = realloc(th->stk_ptr, sizeof(VALUE) * len); + if (!ptr) rb_memerror(); + th->stk_ptr = ptr; + th->stk_max = len; + } + th->stk_len = len; + FLUSH_REGISTER_WINDOWS; + MEMCPY(th->stk_ptr, th->stk_pos, VALUE, th->stk_len); +#ifdef __ia64 + th->bstr_pos = rb_gc_register_stack_start; + len = (VALUE*)rb_ia64_bsp() - th->bstr_pos; + th->bstr_len = 0; + if (len > th->bstr_max) { + VALUE *ptr = realloc(th->bstr_ptr, sizeof(VALUE) * len); + if (!ptr) rb_memerror(); + th->bstr_ptr = ptr; + th->bstr_max = len; + } + th->bstr_len = len; + rb_ia64_flushrs(); + MEMCPY(th->bstr_ptr, th->bstr_pos, VALUE, th->bstr_len); +#endif +#ifdef SAVE_WIN32_EXCEPTION_LIST + th->win32_exception_list = win32_get_exception_list(); +#endif + + th->frame = ruby_frame; + th->scope = ruby_scope; + ruby_scope->flags |= SCOPE_DONT_RECYCLE; + th->klass = ruby_class; + th->wrapper = ruby_wrapper; + th->cref = ruby_cref; + th->dyna_vars = ruby_dyna_vars; + th->block = ruby_block; + th->flags &= THREAD_FLAGS_MASK; + th->flags |= (rb_trap_immediate<<8) | scope_vmode; + th->iter = ruby_iter; + th->tag = prot_tag; + th->tracing = tracing; + th->errinfo = ruby_errinfo; + th->last_status = rb_last_status; + tval = rb_lastline_get(); + rb_lastline_set(th->last_line); + th->last_line = tval; + tval = rb_backref_get(); + rb_backref_set(th->last_match); + th->last_match = tval; + th->safe = ruby_safe_level; + + th->node = ruby_current_node; + if (ruby_sandbox_save != NULL) { + ruby_sandbox_save(th); + } +} + +static int +rb_thread_switch(n) + int n; +{ + rb_trap_immediate = (curr_thread->flags&0x100)?1:0; + switch (n) { + case 0: + return 0; + case RESTORE_FATAL: + JUMP_TAG(TAG_FATAL); + break; + case RESTORE_INTERRUPT: + rb_interrupt(); + break; + case RESTORE_TRAP: + rb_trap_eval(th_cmd, th_sig, th_safe); + break; + case RESTORE_RAISE: + ruby_frame->last_func = 0; + ruby_current_node = th_raise_node; + rb_raise_jump(th_raise_exception); + break; + case RESTORE_SIGNAL: + rb_thread_signal_raise(th_sig); + break; + case RESTORE_EXIT: + ruby_errinfo = th_raise_exception; + ruby_current_node = th_raise_node; + if (!rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) { + terminate_process(EXIT_FAILURE, ruby_errinfo); + } + rb_exc_raise(th_raise_exception); + break; + case RESTORE_NORMAL: + default: + break; + } + return 1; +} + +#define THREAD_SAVE_CONTEXT(th) \ + (rb_thread_switch((FLUSH_REGISTER_WINDOWS, ruby_setjmp(rb_thread_save_context(th), (th)->context)))) + +NORETURN(static void rb_thread_restore_context _((rb_thread_t,int))); +NORETURN(NOINLINE(static void rb_thread_restore_context_0(rb_thread_t,int))); +NORETURN(NOINLINE(static void stack_extend(rb_thread_t, int))); + +static void +rb_thread_restore_context_0(rb_thread_t th, int exit) +{ + static rb_thread_t tmp; + static int ex; + static VALUE tval; + + rb_trap_immediate = 0; /* inhibit interrupts from here */ + if (ruby_sandbox_restore != NULL) { + ruby_sandbox_restore(th); + } + ruby_frame = th->frame; + ruby_scope = th->scope; + ruby_class = th->klass; + ruby_wrapper = th->wrapper; + ruby_cref = th->cref; + ruby_dyna_vars = th->dyna_vars; + ruby_block = th->block; + scope_vmode = th->flags&SCOPE_MASK; + ruby_iter = th->iter; + prot_tag = th->tag; + tracing = th->tracing; + ruby_errinfo = th->errinfo; + rb_last_status = th->last_status; + ruby_safe_level = th->safe; + + ruby_current_node = th->node; + +#ifdef SAVE_WIN32_EXCEPTION_LIST + win32_set_exception_list(th->win32_exception_list); +#endif + tmp = th; + ex = exit; + FLUSH_REGISTER_WINDOWS; + MEMCPY(tmp->stk_pos, tmp->stk_ptr, VALUE, tmp->stk_len); +#ifdef __ia64 + MEMCPY(tmp->bstr_pos, tmp->bstr_ptr, VALUE, tmp->bstr_len); +#endif + + tval = rb_lastline_get(); + rb_lastline_set(tmp->last_line); + tmp->last_line = tval; + tval = rb_backref_get(); + rb_backref_set(tmp->last_match); + tmp->last_match = tval; + + ruby_longjmp(tmp->context, ex); +} + +#ifdef __ia64 +#define C(a) rse_##a##0, rse_##a##1, rse_##a##2, rse_##a##3, rse_##a##4 +#define E(a) rse_##a##0= rse_##a##1= rse_##a##2= rse_##a##3= rse_##a##4 +static volatile int C(a), C(b), C(c), C(d), C(e); +static volatile int C(f), C(g), C(h), C(i), C(j); +static volatile int C(k), C(l), C(m), C(n), C(o); +static volatile int C(p), C(q), C(r), C(s), C(t); +int rb_dummy_false = 0; +NORETURN(NOINLINE(static void register_stack_extend(rb_thread_t, int, VALUE *))); +static void +register_stack_extend(rb_thread_t th, int exit, VALUE *curr_bsp) +{ + if (rb_dummy_false) { + /* use registers as much as possible */ + E(a) = E(b) = E(c) = E(d) = E(e) = + E(f) = E(g) = E(h) = E(i) = E(j) = + E(k) = E(l) = E(m) = E(n) = E(o) = + E(p) = E(q) = E(r) = E(s) = E(t) = 0; + E(a) = E(b) = E(c) = E(d) = E(e) = + E(f) = E(g) = E(h) = E(i) = E(j) = + E(k) = E(l) = E(m) = E(n) = E(o) = + E(p) = E(q) = E(r) = E(s) = E(t) = 0; + } + if (curr_bsp < th->bstr_pos+th->bstr_len) { + register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp()); + } + stack_extend(th, exit); +} +#undef C +#undef E +#endif + +static void +stack_extend(rb_thread_t th, int exit) +{ +#define STACK_PAD_SIZE 1024 + volatile VALUE space[STACK_PAD_SIZE], *sp = space; + +#if !STACK_GROW_DIRECTION + if (space < rb_gc_stack_start) { + /* Stack grows downward */ +#endif +#if STACK_GROW_DIRECTION <= 0 + if (space > th->stk_pos) { +# ifdef HAVE_ALLOCA + sp = ALLOCA_N(VALUE, &space[0] - th->stk_pos); +# else + stack_extend(th, exit); +# endif + } +#endif +#if !STACK_GROW_DIRECTION + } + else { + /* Stack grows upward */ +#endif +#if STACK_GROW_DIRECTION >= 0 + if (&space[STACK_PAD_SIZE] < th->stk_pos + th->stk_len) { +# ifdef HAVE_ALLOCA + sp = ALLOCA_N(VALUE, th->stk_pos + th->stk_len - &space[STACK_PAD_SIZE]); +# else + stack_extend(th, exit); +# endif + } +#endif +#if !STACK_GROW_DIRECTION + } +#endif + rb_thread_restore_context_0(th, exit); +} +#ifdef __ia64 +#define stack_extend(th, exit) register_stack_extend(th, exit, (VALUE*)rb_ia64_bsp()) +#endif + +static void +rb_thread_restore_context(th, exit) + rb_thread_t th; + int exit; +{ + if (!th->stk_ptr) rb_bug("unsaved context"); + stack_extend(th, exit); +} + +static void +rb_thread_ready(th) + rb_thread_t th; +{ + th->wait_for = 0; + if (th->status != THREAD_TO_KILL) { + th->status = THREAD_RUNNABLE; + } +} + +static void +rb_thread_die(th) + rb_thread_t th; +{ + th->thgroup = 0; + th->status = THREAD_KILLED; + stack_free(th); +} + +static void +rb_thread_remove(th) + rb_thread_t th; +{ + if (th->status == THREAD_KILLED) return; + + rb_thread_ready(th); + rb_thread_die(th); + th->prev->next = th->next; + th->next->prev = th->prev; +} + +static int +rb_thread_dead(th) + rb_thread_t th; +{ + return th->status == THREAD_KILLED; +} + +void +rb_thread_fd_close(fd) + int fd; +{ + rb_thread_t th; + + FOREACH_THREAD(th) { + if (((th->wait_for & WAIT_FD) && fd == th->fd) || + ((th->wait_for & WAIT_SELECT) && (fd < th->fd) && + (FD_ISSET(fd, &th->readfds) || + FD_ISSET(fd, &th->writefds) || + FD_ISSET(fd, &th->exceptfds)))) { + VALUE exc = rb_exc_new2(rb_eIOError, "stream closed"); + rb_thread_raise(1, &exc, th); + } + } + END_FOREACH(th); +} + +NORETURN(static void rb_thread_main_jump _((VALUE, int))); +static void +rb_thread_main_jump(err, tag) + VALUE err; + int tag; +{ + curr_thread = main_thread; + th_raise_exception = err; + th_raise_node = ruby_current_node; + rb_thread_restore_context(main_thread, tag); +} + +NORETURN(static void rb_thread_deadlock _((void))); +static void +rb_thread_deadlock() +{ + char msg[21+SIZEOF_LONG*2]; + VALUE e; + + sprintf(msg, "Thread(0x%lx): deadlock", curr_thread->thread); + e = rb_exc_new2(rb_eFatal, msg); + if (curr_thread == main_thread) { + rb_exc_raise(e); + } + rb_thread_main_jump(e, RESTORE_RAISE); +} + +static void +copy_fds(dst, src, max) + fd_set *dst, *src; + int max; +{ + int n = 0; + int i; + + for (i=0; i<=max; i++) { + if (FD_ISSET(i, src)) { + n = i; + FD_SET(i, dst); + } + } +} + +static int +match_fds(dst, src, max) + fd_set *dst, *src; + int max; +{ + int i; + + for (i=0; i<=max; i++) { + if (FD_ISSET(i, src) && FD_ISSET(i, dst)) { + return Qtrue; + } + } + return Qfalse; +} + +static int +intersect_fds(src, dst, max) + fd_set *src, *dst; + int max; +{ + int i, n = 0; + + for (i=0; i<=max; i++) { + if (FD_ISSET(i, dst)) { + if (FD_ISSET(i, src)) { + /* Wake up only one thread per fd. */ + FD_CLR(i, src); + n++; + } + else { + FD_CLR(i, dst); + } + } + } + return n; +} + +static int +find_bad_fds(dst, src, max) + fd_set *dst, *src; + int max; +{ + int i, test = Qfalse; + + for (i=0; i<=max; i++) { + if (FD_ISSET(i, src) && !FD_ISSET(i, dst)) { + FD_CLR(i, src); + test = Qtrue; + } + } + return test; +} + +void +rb_thread_schedule() +{ + rb_thread_t next; /* OK */ + rb_thread_t th; + rb_thread_t curr; + rb_thread_t th_found = 0; + int found = 0; + + fd_set readfds; + fd_set writefds; + fd_set exceptfds; + struct timeval delay_tv, *delay_ptr; + double delay, now; /* OK */ + int n, max; + int need_select = 0; + int select_timeout = 0; + +#ifdef HAVE_NATIVETHREAD + if (!is_ruby_native_thread()) { + rb_bug("cross-thread violation on rb_thread_schedule()"); + } +#endif + rb_thread_pending = 0; + rb_gc_finalize_deferred(); + if (curr_thread == curr_thread->next + && curr_thread->status == THREAD_RUNNABLE) + return; + + next = 0; + curr = curr_thread; /* starting thread */ + + while (curr->status == THREAD_KILLED) { + curr = curr->prev; + } + + again: + max = -1; + FD_ZERO(&readfds); + FD_ZERO(&writefds); + FD_ZERO(&exceptfds); + delay = DELAY_INFTY; + now = -1.0; + + FOREACH_THREAD_FROM(curr, th) { + if (!found && th->status <= THREAD_RUNNABLE) { + found = 1; + } + if (th->status != THREAD_STOPPED) continue; + if (th->wait_for & WAIT_JOIN) { + if (rb_thread_dead(th->join)) { + th->status = THREAD_RUNNABLE; + found = 1; + } + } + if (th->wait_for & WAIT_FD) { + FD_SET(th->fd, &readfds); + if (max < th->fd) max = th->fd; + need_select = 1; + } + if (th->wait_for & WAIT_SELECT) { + copy_fds(&readfds, &th->readfds, th->fd); + copy_fds(&writefds, &th->writefds, th->fd); + copy_fds(&exceptfds, &th->exceptfds, th->fd); + if (max < th->fd) max = th->fd; + need_select = 1; + if (th->wait_for & WAIT_TIME) { + select_timeout = 1; + } + th->select_value = 0; + } + if (th->wait_for & WAIT_TIME) { + double th_delay; + + if (now < 0.0) now = timeofday(); + th_delay = th->delay - now; + if (th_delay <= 0.0) { + th->status = THREAD_RUNNABLE; + found = 1; + } + else if (th_delay < delay) { + delay = th_delay; + need_select = 1; + } + else if (th->delay == DELAY_INFTY) { + need_select = 1; + } + } + } + END_FOREACH_FROM(curr, th); + + /* Do the select if needed */ + if (need_select) { + /* Convert delay to a timeval */ + /* If a thread is runnable, just poll */ + if (found) { + delay_tv.tv_sec = 0; + delay_tv.tv_usec = 0; + delay_ptr = &delay_tv; + } + else if (delay == DELAY_INFTY) { + delay_ptr = 0; + } + else { + delay_tv.tv_sec = delay; + delay_tv.tv_usec = (delay - (double)delay_tv.tv_sec)*1e6; + delay_ptr = &delay_tv; + } + + n = select(max+1, &readfds, &writefds, &exceptfds, delay_ptr); + if (n < 0) { + int e = errno; + + if (rb_trap_pending) rb_trap_exec(); + if (e == EINTR) goto again; +#ifdef ERESTART + if (e == ERESTART) goto again; +#endif + if (e == EBADF) { + int badfd = -1; + int fd; + int dummy; + for (fd = 0; fd <= max; fd++) { + if ((FD_ISSET(fd, &readfds) || + FD_ISSET(fd, &writefds) || + FD_ISSET(fd, &exceptfds)) && + fcntl(fd, F_GETFD, &dummy) == -1 && + errno == EBADF) { + badfd = fd; + break; + } + } + if (badfd != -1) { + FOREACH_THREAD_FROM(curr, th) { + if (th->wait_for & WAIT_FD) { + if (th->fd == badfd) { + found = 1; + th->status = THREAD_RUNNABLE; + th->fd = 0; + break; + } + } + if (th->wait_for & WAIT_SELECT) { + if (FD_ISSET(badfd, &th->readfds) || + FD_ISSET(badfd, &th->writefds) || + FD_ISSET(badfd, &th->exceptfds)) { + found = 1; + th->status = THREAD_RUNNABLE; + th->select_value = -EBADF; + break; + } + } + } + END_FOREACH_FROM(curr, th); + } + } + else { + FOREACH_THREAD_FROM(curr, th) { + if (th->wait_for & WAIT_SELECT) { + int v = 0; + + v |= find_bad_fds(&readfds, &th->readfds, th->fd); + v |= find_bad_fds(&writefds, &th->writefds, th->fd); + v |= find_bad_fds(&exceptfds, &th->exceptfds, th->fd); + if (v) { + th->select_value = n; + n = max; + } + } + } + END_FOREACH_FROM(curr, th); + } + } + if (select_timeout && n == 0) { + if (now < 0.0) now = timeofday(); + FOREACH_THREAD_FROM(curr, th) { + if (((th->wait_for&(WAIT_SELECT|WAIT_TIME)) == (WAIT_SELECT|WAIT_TIME)) && + th->delay <= now) { + th->status = THREAD_RUNNABLE; + th->wait_for = 0; + th->select_value = 0; + found = 1; + intersect_fds(&readfds, &th->readfds, max); + intersect_fds(&writefds, &th->writefds, max); + intersect_fds(&exceptfds, &th->exceptfds, max); + } + } + END_FOREACH_FROM(curr, th); + } + if (n > 0) { + now = -1.0; + /* Some descriptors are ready. + * Choose a thread which may run next. + * Don't change the status of threads which don't run next. + */ + FOREACH_THREAD_FROM(curr, th) { + if ((th->wait_for&WAIT_FD) && FD_ISSET(th->fd, &readfds)) { + th_found = th; + found = 1; + break; + } + if ((th->wait_for&WAIT_SELECT) && + (match_fds(&readfds, &th->readfds, max) || + match_fds(&writefds, &th->writefds, max) || + match_fds(&exceptfds, &th->exceptfds, max))) { + th_found = th; + found = 1; + break; + } + } + END_FOREACH_FROM(curr, th); + } + /* The delays for some of the threads should have expired. + Go through the loop once more, to check the delays. */ + if (!found && delay != DELAY_INFTY) + goto again; + } + + FOREACH_THREAD_FROM(curr, th) { + if (th->status == THREAD_TO_KILL) { + next = th; + break; + } + if ((th->status == THREAD_RUNNABLE || th == th_found) && th->stk_ptr) { + if (!next || next->priority < th->priority) { + if (th == th_found) { + th_found->status = THREAD_RUNNABLE; + th_found->wait_for = 0; + if (th->wait_for&WAIT_FD) { + th_found->fd = 0; + } + else { /* th->wait_for&WAIT_SELECT */ + n = intersect_fds(&readfds, &th_found->readfds, max) + + intersect_fds(&writefds, &th_found->writefds, max) + + intersect_fds(&exceptfds, &th_found->exceptfds, max); + th_found->select_value = n; + } + } + next = th; + } + } + } + END_FOREACH_FROM(curr, th); + + if (!next) { + /* raise fatal error to main thread */ + curr_thread->node = ruby_current_node; + if (curr->next == curr) { + TRAP_BEG; + pause(); + TRAP_END; + } + FOREACH_THREAD_FROM(curr, th) { + warn_printf("deadlock 0x%lx: %s:", + th->thread, thread_status_name(th->status)); + if (th->wait_for & WAIT_FD) warn_printf("F(%d)", th->fd); + if (th->wait_for & WAIT_SELECT) warn_printf("S"); + if (th->wait_for & WAIT_TIME) warn_printf("T(%f)", th->delay); + if (th->wait_for & WAIT_JOIN) + warn_printf("J(0x%lx)", th->join ? th->join->thread : 0); + if (th->wait_for & WAIT_PID) warn_printf("P"); + if (!th->wait_for) warn_printf("-"); + warn_printf(" %s - %s:%d\n", + th==main_thread ? "(main)" : "", + th->node->nd_file, nd_line(th->node)); + } + END_FOREACH_FROM(curr, th); + next = main_thread; + rb_thread_ready(next); + next->status = THREAD_TO_KILL; + if (!rb_thread_dead(curr_thread)) { + rb_thread_save_context(curr_thread); + } + rb_thread_deadlock(); + } + next->wait_for = 0; + if (next->status == THREAD_RUNNABLE && next == curr_thread) { + return; + } + + /* context switch */ + if (curr == curr_thread) { + if (THREAD_SAVE_CONTEXT(curr)) { + return; + } + } + + curr_thread = next; + if (next->status == THREAD_TO_KILL) { + if (!(next->flags & THREAD_TERMINATING)) { + next->flags |= THREAD_TERMINATING; + /* terminate; execute ensure-clause if any */ + rb_thread_restore_context(next, RESTORE_FATAL); + } + } + rb_thread_restore_context(next, RESTORE_NORMAL); +} + +void +rb_thread_wait_fd(fd) + int fd; +{ + if (rb_thread_critical) return; + if (ruby_in_compile) return; + if (curr_thread == curr_thread->next) return; + if (curr_thread->status == THREAD_TO_KILL) return; + + curr_thread->status = THREAD_STOPPED; + curr_thread->fd = fd; + curr_thread->wait_for = WAIT_FD; + rb_thread_schedule(); +} + +int +rb_thread_fd_writable(fd) + int fd; +{ + if (rb_thread_critical) return Qtrue; + if (curr_thread == curr_thread->next) return Qtrue; + if (curr_thread->status == THREAD_TO_KILL) return Qtrue; + if (curr_thread->status == THREAD_KILLED) return Qtrue; + + curr_thread->status = THREAD_STOPPED; + FD_ZERO(&curr_thread->readfds); + FD_ZERO(&curr_thread->writefds); + FD_SET(fd, &curr_thread->writefds); + FD_ZERO(&curr_thread->exceptfds); + curr_thread->fd = fd+1; + curr_thread->wait_for = WAIT_SELECT; + rb_thread_schedule(); + return Qfalse; +} + +void +rb_thread_wait_for(time) + struct timeval time; +{ + double date; + + if (rb_thread_critical || + curr_thread == curr_thread->next || + curr_thread->status == THREAD_TO_KILL) { + int n; + int thr_critical = rb_thread_critical; +#ifndef linux + double d, limit; + limit = timeofday()+(double)time.tv_sec+(double)time.tv_usec*1e-6; +#endif + for (;;) { + rb_thread_critical = Qtrue; + TRAP_BEG; + n = select(0, 0, 0, 0, &time); + rb_thread_critical = thr_critical; + TRAP_END; + if (n == 0) return; + if (n < 0) { + switch (errno) { + case EINTR: +#ifdef ERESTART + case ERESTART: +#endif + break; + default: + rb_sys_fail("sleep"); + } + } +#ifndef linux + d = limit - timeofday(); + + time.tv_sec = (int)d; + time.tv_usec = (int)((d - (int)d)*1e6); + if (time.tv_usec < 0) { + time.tv_usec += (long)1e6; + time.tv_sec -= 1; + } + if (time.tv_sec < 0) return; +#endif + } + } + + date = timeofday() + (double)time.tv_sec + (double)time.tv_usec*1e-6; + curr_thread->status = THREAD_STOPPED; + curr_thread->delay = date; + curr_thread->wait_for = WAIT_TIME; + rb_thread_schedule(); +} + +void rb_thread_sleep_forever _((void)); + +int +rb_thread_alone() +{ + return curr_thread == curr_thread->next; +} + +int +rb_thread_select(max, read, write, except, timeout) + int max; + fd_set *read, *write, *except; + struct timeval *timeout; +{ +#ifndef linux + double limit; +#endif + int n; + + if (!read && !write && !except) { + if (!timeout) { + rb_thread_sleep_forever(); + return 0; + } + rb_thread_wait_for(*timeout); + return 0; + } + +#ifndef linux + if (timeout) { + limit = timeofday()+ + (double)timeout->tv_sec+(double)timeout->tv_usec*1e-6; + } +#endif + + if (rb_thread_critical || + curr_thread == curr_thread->next || + curr_thread->status == THREAD_TO_KILL) { +#ifndef linux + struct timeval tv, *tvp = timeout; + + if (timeout) { + tv = *timeout; + tvp = &tv; + } +#else + struct timeval *const tvp = timeout; +#endif + for (;;) { + TRAP_BEG; + n = select(max, read, write, except, tvp); + TRAP_END; + if (n < 0) { + switch (errno) { + case EINTR: +#ifdef ERESTART + case ERESTART: +#endif +#ifndef linux + if (timeout) { + double d = limit - timeofday(); + + tv.tv_sec = (unsigned int)d; + tv.tv_usec = (long)((d-(double)tv.tv_sec)*1e6); + if (tv.tv_sec < 0) tv.tv_sec = 0; + if (tv.tv_usec < 0) tv.tv_usec = 0; + } +#endif + continue; + default: + break; + } + } + return n; + } + } + + curr_thread->status = THREAD_STOPPED; + if (read) curr_thread->readfds = *read; + else FD_ZERO(&curr_thread->readfds); + if (write) curr_thread->writefds = *write; + else FD_ZERO(&curr_thread->writefds); + if (except) curr_thread->exceptfds = *except; + else FD_ZERO(&curr_thread->exceptfds); + curr_thread->fd = max; + curr_thread->wait_for = WAIT_SELECT; + if (timeout) { + curr_thread->delay = timeofday() + + (double)timeout->tv_sec + (double)timeout->tv_usec*1e-6; + curr_thread->wait_for |= WAIT_TIME; + } + rb_thread_schedule(); + if (read) *read = curr_thread->readfds; + if (write) *write = curr_thread->writefds; + if (except) *except = curr_thread->exceptfds; + if (curr_thread->select_value < 0) { + errno = -curr_thread->select_value; + return -1; + } + return curr_thread->select_value; +} + +static int rb_thread_join0 _((rb_thread_t, double)); +int rb_thread_join _((VALUE, double)); + +static int +rb_thread_join0(th, limit) + rb_thread_t th; + double limit; +{ + enum rb_thread_status last_status = THREAD_RUNNABLE; + + if (rb_thread_critical) rb_thread_deadlock(); + if (!rb_thread_dead(th)) { + if (th == curr_thread) + rb_raise(rb_eThreadError, "thread 0x%lx tried to join itself", + th->thread); + if ((th->wait_for & WAIT_JOIN) && th->join == curr_thread) + rb_raise(rb_eThreadError, "Thread#join: deadlock 0x%lx - mutual join(0x%lx)", + curr_thread->thread, th->thread); + if (curr_thread->status == THREAD_TO_KILL) + last_status = THREAD_TO_KILL; + if (limit == 0) return Qfalse; + curr_thread->status = THREAD_STOPPED; + curr_thread->join = th; + curr_thread->wait_for = WAIT_JOIN; + curr_thread->delay = timeofday() + limit; + if (limit < DELAY_INFTY) curr_thread->wait_for |= WAIT_TIME; + rb_thread_schedule(); + curr_thread->status = last_status; + if (!rb_thread_dead(th)) return Qfalse; + } + + if (!NIL_P(th->errinfo) && (th->flags & RAISED_EXCEPTION)) { + VALUE oldbt = get_backtrace(th->errinfo); + VALUE errat = make_backtrace(); + VALUE errinfo = rb_obj_dup(th->errinfo); + + if (TYPE(oldbt) == T_ARRAY && RARRAY(oldbt)->len > 0) { + rb_ary_unshift(errat, rb_ary_entry(oldbt, 0)); + } + set_backtrace(errinfo, errat); + rb_exc_raise(errinfo); + } + + return Qtrue; +} + +int +rb_thread_join(thread, limit) + VALUE thread; + double limit; +{ + if (limit < 0) limit = DELAY_INFTY; + return rb_thread_join0(rb_thread_check(thread), limit); +} + + +/* + * call-seq: + * thr.join => thr + * thr.join(limit) => thr + * + * The calling thread will suspend execution and run <i>thr</i>. Does not + * return until <i>thr</i> exits or until <i>limit</i> seconds have passed. If + * the time limit expires, <code>nil</code> will be returned, otherwise + * <i>thr</i> is returned. + * + * Any threads not joined will be killed when the main program exits. If + * <i>thr</i> had previously raised an exception and the + * <code>abort_on_exception</code> and <code>$DEBUG</code> flags are not set + * (so the exception has not yet been processed) it will be processed at this + * time. + * + * a = Thread.new { print "a"; sleep(10); print "b"; print "c" } + * x = Thread.new { print "x"; Thread.pass; print "y"; print "z" } + * x.join # Let x thread finish, a will be killed on exit. + * + * <em>produces:</em> + * + * axyz + * + * The following example illustrates the <i>limit</i> parameter. + * + * y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }} + * puts "Waiting" until y.join(0.15) + * + * <em>produces:</em> + * + * tick... + * Waiting + * tick... + * Waitingtick... + * + * + * tick... + */ + +static VALUE +rb_thread_join_m(argc, argv, thread) + int argc; + VALUE *argv; + VALUE thread; +{ + VALUE limit; + double delay = DELAY_INFTY; + + rb_scan_args(argc, argv, "01", &limit); + if (!NIL_P(limit)) delay = rb_num2dbl(limit); + if (!rb_thread_join0(rb_thread_check(thread), delay)) + return Qnil; + return thread; +} + + +/* + * call-seq: + * Thread.current => thread + * + * Returns the currently executing thread. + * + * Thread.current #=> #<Thread:0x401bdf4c run> + */ + +VALUE +rb_thread_current() +{ + return curr_thread->thread; +} + + +/* + * call-seq: + * Thread.main => thread + * + * Returns the main thread for the process. + * + * Thread.main #=> #<Thread:0x401bdf4c run> + */ + +VALUE +rb_thread_main() +{ + return main_thread->thread; +} + + +/* + * call-seq: + * Thread.list => array + * + * Returns an array of <code>Thread</code> objects for all threads that are + * either runnable or stopped. + * + * Thread.new { sleep(200) } + * Thread.new { 1000000.times {|i| i*i } } + * Thread.new { Thread.stop } + * Thread.list.each {|t| p t} + * + * <em>produces:</em> + * + * #<Thread:0x401b3e84 sleep> + * #<Thread:0x401b3f38 run> + * #<Thread:0x401b3fb0 sleep> + * #<Thread:0x401bdf4c run> + */ + +VALUE +rb_thread_list() +{ + rb_thread_t th; + VALUE ary = rb_ary_new(); + + FOREACH_THREAD(th) { + switch (th->status) { + case THREAD_RUNNABLE: + case THREAD_STOPPED: + case THREAD_TO_KILL: + rb_ary_push(ary, th->thread); + default: + break; + } + } + END_FOREACH(th); + + return ary; +} + + +/* + * call-seq: + * thr.wakeup => thr + * + * Marks <i>thr</i> as eligible for scheduling (it may still remain blocked on + * I/O, however). Does not invoke the scheduler (see <code>Thread#run</code>). + * + * c = Thread.new { Thread.stop; puts "hey!" } + * c.wakeup + * + * <em>produces:</em> + * + * hey! + */ + +VALUE +rb_thread_wakeup(thread) + VALUE thread; +{ + if (!RTEST(rb_thread_wakeup_alive(thread))) + rb_raise(rb_eThreadError, "killed thread"); + return thread; +} + +VALUE +rb_thread_wakeup_alive(thread) + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + + if (th->status == THREAD_KILLED) + return Qnil; + rb_thread_ready(th); + + return thread; +} + + +/* + * call-seq: + * thr.run => thr + * + * Wakes up <i>thr</i>, making it eligible for scheduling. If not in a critical + * section, then invokes the scheduler. + * + * a = Thread.new { puts "a"; Thread.stop; puts "c" } + * Thread.pass + * puts "Got here" + * a.run + * a.join + * + * <em>produces:</em> + * + * a + * Got here + * c + */ + +VALUE +rb_thread_run(thread) + VALUE thread; +{ + rb_thread_wakeup(thread); + if (!rb_thread_critical) rb_thread_schedule(); + + return thread; +} + + +static void +rb_kill_thread(th, flags) + rb_thread_t th; + int flags; +{ + if (th != curr_thread && th->safe < 4) { + rb_secure(4); + } + if (th->status == THREAD_TO_KILL || th->status == THREAD_KILLED) + return; + if (th == th->next || th == main_thread) rb_exit(EXIT_SUCCESS); + + rb_thread_ready(th); + th->flags |= flags; + th->status = THREAD_TO_KILL; + if (!rb_thread_critical) rb_thread_schedule(); +} + + +/* + * call-seq: + * thr.exit => thr + * thr.kill => thr + * thr.terminate => thr + * + * Terminates <i>thr</i> and schedules another thread to be run, returning + * the terminated <code>Thread</code>. If this is the main thread, or the + * last thread, exits the process. + */ + +VALUE +rb_thread_kill(thread) + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + + rb_kill_thread(th, 0); + return thread; +} + + +/* + * call-seq: + * thr.exit! => thr + * thr.kill! => thr + * thr.terminate! => thr + * + * Terminates <i>thr</i> without calling ensure clauses and schedules + * another thread to be run, returning the terminated <code>Thread</code>. + * If this is the main thread, or the last thread, exits the process. + * + * See <code>Thread#exit</code> for the safer version. + */ + +static VALUE +rb_thread_kill_bang(thread) + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + rb_kill_thread(th, THREAD_NO_ENSURE); + return thread; +} + +/* + * call-seq: + * Thread.kill(thread) => thread + * + * Causes the given <em>thread</em> to exit (see <code>Thread::exit</code>). + * + * count = 0 + * a = Thread.new { loop { count += 1 } } + * sleep(0.1) #=> 0 + * Thread.kill(a) #=> #<Thread:0x401b3d30 dead> + * count #=> 93947 + * a.alive? #=> false + */ + +static VALUE +rb_thread_s_kill(obj, th) + VALUE obj, th; +{ + return rb_thread_kill(th); +} + + +/* + * call-seq: + * Thread.exit => thread + * + * Terminates the currently running thread and schedules another thread to be + * run. If this thread is already marked to be killed, <code>exit</code> + * returns the <code>Thread</code>. If this is the main thread, or the last + * thread, exit the process. + */ + +static VALUE +rb_thread_exit() +{ + return rb_thread_kill(curr_thread->thread); +} + + +/* + * call-seq: + * Thread.pass => nil + * + * Invokes the thread scheduler to pass execution to another thread. + * + * a = Thread.new { print "a"; Thread.pass; + * print "b"; Thread.pass; + * print "c" } + * b = Thread.new { print "x"; Thread.pass; + * print "y"; Thread.pass; + * print "z" } + * a.join + * b.join + * + * <em>produces:</em> + * + * axbycz + */ + +static VALUE +rb_thread_pass() +{ + rb_thread_schedule(); + return Qnil; +} + + +/* + * call-seq: + * Thread.stop => nil + * + * Stops execution of the current thread, putting it into a ``sleep'' state, + * and schedules execution of another thread. Resets the ``critical'' condition + * to <code>false</code>. + * + * a = Thread.new { print "a"; Thread.stop; print "c" } + * Thread.pass + * print "b" + * a.run + * a.join + * + * <em>produces:</em> + * + * abc + */ + +VALUE +rb_thread_stop() +{ + enum rb_thread_status last_status = THREAD_RUNNABLE; + + rb_thread_critical = 0; + if (curr_thread == curr_thread->next) { + rb_raise(rb_eThreadError, "stopping only thread\n\tnote: use sleep to stop forever"); + } + if (curr_thread->status == THREAD_TO_KILL) + last_status = THREAD_TO_KILL; + curr_thread->status = THREAD_STOPPED; + rb_thread_schedule(); + curr_thread->status = last_status; + + return Qnil; +} + +struct timeval rb_time_timeval(); + +void +rb_thread_polling() +{ + if (curr_thread != curr_thread->next) { + curr_thread->status = THREAD_STOPPED; + curr_thread->delay = timeofday() + (double)0.06; + curr_thread->wait_for = WAIT_TIME; + rb_thread_schedule(); + } +} + +void +rb_thread_sleep(sec) + int sec; +{ + if (curr_thread == curr_thread->next) { + TRAP_BEG; + sleep(sec); + TRAP_END; + return; + } + rb_thread_wait_for(rb_time_timeval(INT2FIX(sec))); +} + +void +rb_thread_sleep_forever() +{ + int thr_critical = rb_thread_critical; + if (curr_thread == curr_thread->next || + curr_thread->status == THREAD_TO_KILL) { + rb_thread_critical = Qtrue; + TRAP_BEG; + pause(); + rb_thread_critical = thr_critical; + TRAP_END; + return; + } + + curr_thread->delay = DELAY_INFTY; + curr_thread->wait_for = WAIT_TIME; + curr_thread->status = THREAD_STOPPED; + rb_thread_schedule(); +} + + +/* + * call-seq: + * thr.priority => integer + * + * Returns the priority of <i>thr</i>. Default is inherited from the + * current thread which creating the new thread, or zero for the + * initial main thread; higher-priority threads will run before + * lower-priority threads. + * + * Thread.current.priority #=> 0 + */ + +static VALUE +rb_thread_priority(thread) + VALUE thread; +{ + return INT2NUM(rb_thread_check(thread)->priority); +} + + +/* + * call-seq: + * thr.priority= integer => thr + * + * Sets the priority of <i>thr</i> to <i>integer</i>. Higher-priority threads + * will run before lower-priority threads. + * + * count1 = count2 = 0 + * a = Thread.new do + * loop { count1 += 1 } + * end + * a.priority = -1 + * + * b = Thread.new do + * loop { count2 += 1 } + * end + * b.priority = -2 + * sleep 1 #=> 1 + * Thread.critical = 1 + * count1 #=> 622504 + * count2 #=> 5832 + */ + +static VALUE +rb_thread_priority_set(thread, prio) + VALUE thread, prio; +{ + rb_thread_t th; + + rb_secure(4); + th = rb_thread_check(thread); + + th->priority = NUM2INT(prio); + rb_thread_schedule(); + return prio; +} + + +/* + * call-seq: + * thr.safe_level => integer + * + * Returns the safe level in effect for <i>thr</i>. Setting thread-local safe + * levels can help when implementing sandboxes which run insecure code. + * + * thr = Thread.new { $SAFE = 3; sleep } + * Thread.current.safe_level #=> 0 + * thr.safe_level #=> 3 + */ + +static VALUE +rb_thread_safe_level(thread) + VALUE thread; +{ + rb_thread_t th; + + th = rb_thread_check(thread); + if (th == curr_thread) { + return INT2NUM(ruby_safe_level); + } + return INT2NUM(th->safe); +} + +static int ruby_thread_abort; +static VALUE thgroup_default; + + +/* + * call-seq: + * Thread.abort_on_exception => true or false + * + * Returns the status of the global ``abort on exception'' condition. The + * default is <code>false</code>. When set to <code>true</code>, or if the + * global <code>$DEBUG</code> flag is <code>true</code> (perhaps because the + * command line option <code>-d</code> was specified) all threads will abort + * (the process will <code>exit(0)</code>) if an exception is raised in any + * thread. See also <code>Thread::abort_on_exception=</code>. + */ + +static VALUE +rb_thread_s_abort_exc() +{ + return ruby_thread_abort?Qtrue:Qfalse; +} + + +/* + * call-seq: + * Thread.abort_on_exception= boolean => true or false + * + * When set to <code>true</code>, all threads will abort if an exception is + * raised. Returns the new state. + * + * Thread.abort_on_exception = true + * t1 = Thread.new do + * puts "In new thread" + * raise "Exception from thread" + * end + * sleep(1) + * puts "not reached" + * + * <em>produces:</em> + * + * In new thread + * prog.rb:4: Exception from thread (RuntimeError) + * from prog.rb:2:in `initialize' + * from prog.rb:2:in `new' + * from prog.rb:2 + */ + +static VALUE +rb_thread_s_abort_exc_set(self, val) + VALUE self, val; +{ + rb_secure(4); + ruby_thread_abort = RTEST(val); + return val; +} + + +/* + * call-seq: + * thr.abort_on_exception => true or false + * + * Returns the status of the thread-local ``abort on exception'' condition for + * <i>thr</i>. The default is <code>false</code>. See also + * <code>Thread::abort_on_exception=</code>. + */ + +static VALUE +rb_thread_abort_exc(thread) + VALUE thread; +{ + return rb_thread_check(thread)->abort?Qtrue:Qfalse; +} + + +/* + * call-seq: + * thr.abort_on_exception= boolean => true or false + * + * When set to <code>true</code>, causes all threads (including the main + * program) to abort if an exception is raised in <i>thr</i>. The process will + * effectively <code>exit(0)</code>. + */ + +static VALUE +rb_thread_abort_exc_set(thread, val) + VALUE thread, val; +{ + rb_secure(4); + rb_thread_check(thread)->abort = RTEST(val); + return val; +} + + +enum rb_thread_status +rb_thread_status(thread) + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + return th->status; +} + + +/* + * call-seq: + * thr.group => thgrp or nil + * + * Returns the <code>ThreadGroup</code> which contains <i>thr</i>, or nil if + * the thread is not a member of any group. + * + * Thread.main.group #=> #<ThreadGroup:0x4029d914> + */ + +VALUE +rb_thread_group(thread) + VALUE thread; +{ + VALUE group = rb_thread_check(thread)->thgroup; + if (!group) { + group = Qnil; + } + return group; +} + +#ifdef __ia64 +# define IA64_INIT(x) x +#else +# define IA64_INIT(x) +#endif + +#define THREAD_ALLOC(th) do {\ + th = ALLOC(struct rb_thread);\ +\ + th->next = 0;\ + th->prev = 0;\ +\ + th->status = THREAD_RUNNABLE;\ + th->result = 0;\ + th->flags = 0;\ +\ + th->stk_ptr = 0;\ + th->stk_len = 0;\ + th->stk_max = 0;\ + th->wait_for = 0;\ + IA64_INIT(th->bstr_ptr = 0);\ + IA64_INIT(th->bstr_len = 0);\ + IA64_INIT(th->bstr_max = 0);\ + FD_ZERO(&th->readfds);\ + FD_ZERO(&th->writefds);\ + FD_ZERO(&th->exceptfds);\ + th->delay = 0.0;\ + th->join = 0;\ +\ + th->frame = 0;\ + th->scope = 0;\ + th->klass = 0;\ + th->wrapper = 0;\ + th->cref = ruby_cref;\ + th->dyna_vars = ruby_dyna_vars;\ + th->block = 0;\ + th->iter = 0;\ + th->tag = 0;\ + th->tracing = 0;\ + th->errinfo = Qnil;\ + th->last_status = 0;\ + th->last_line = 0;\ + th->last_match = Qnil;\ + th->abort = 0;\ + th->priority = 0;\ + th->thgroup = thgroup_default;\ + th->locals = 0;\ + th->thread = 0;\ + if (curr_thread == 0) {\ + th->sandbox = Qnil;\ + } else {\ + th->sandbox = curr_thread->sandbox;\ + }\ +} while (0) + +static rb_thread_t +rb_thread_alloc(klass) + VALUE klass; +{ + rb_thread_t th; + struct RVarmap *vars; + + THREAD_ALLOC(th); + th->thread = Data_Wrap_Struct(klass, thread_mark, thread_free, th); + + for (vars = th->dyna_vars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; + FL_SET(vars, DVAR_DONT_RECYCLE); + } + return th; +} + +static int thread_init; + +#if defined(_THREAD_SAFE) +static void +catch_timer(sig) + int sig; +{ +#if !defined(POSIX_SIGNAL) && !defined(BSD_SIGNAL) + signal(sig, catch_timer); +#endif + /* cause EINTR */ +} + +static int time_thread_alive_p = 0; +static pthread_t time_thread; + +static void* +thread_timer(dummy) + void *dummy; +{ +#ifdef _THREAD_SAFE +#define test_cancel() pthread_testcancel() +#else +#define test_cancel() /* void */ +#endif + + sigset_t all_signals; + + sigfillset(&all_signals); + pthread_sigmask(SIG_BLOCK, &all_signals, 0); + + for (;;) { +#ifdef HAVE_NANOSLEEP + struct timespec req, rem; + + test_cancel(); + req.tv_sec = 0; + req.tv_nsec = 10000000; + nanosleep(&req, &rem); +#else + struct timeval tv; + + test_cancel(); + tv.tv_sec = 0; + tv.tv_usec = 10000; + select(0, NULL, NULL, NULL, &tv); +#endif + if (!rb_thread_critical) { + rb_thread_pending = 1; + if (rb_trap_immediate) { + pthread_kill(ruby_thid, SIGVTALRM); + } + } + } +#undef test_cancel +} + +void +rb_thread_start_timer() +{ +} + +void +rb_thread_stop_timer() +{ +} + +void +rb_child_atfork() +{ + time_thread_alive_p = 0; +} + +void +rb_thread_cancel_timer() +{ +#ifdef _THREAD_SAFE + if( time_thread_alive_p ) + { + pthread_cancel( time_thread ); + pthread_join( time_thread, NULL ); + time_thread_alive_p = 0; + } + thread_init = 0; +#endif +} +#elif defined(HAVE_SETITIMER) +static void +catch_timer(sig) + int sig; +{ +#if !defined(POSIX_SIGNAL) && !defined(BSD_SIGNAL) + signal(sig, catch_timer); +#endif + if (!rb_thread_critical) { + rb_thread_pending = 1; + } + /* cause EINTR */ +} + +void +rb_thread_start_timer() +{ + struct itimerval tval; + + if (!thread_init) return; + tval.it_interval.tv_sec = 0; + tval.it_interval.tv_usec = 10000; + tval.it_value = tval.it_interval; + setitimer(ITIMER_VIRTUAL, &tval, NULL); +} + +void +rb_thread_stop_timer() +{ + struct itimerval tval; + + if (!thread_init) return; + tval.it_interval.tv_sec = 0; + tval.it_interval.tv_usec = 0; + tval.it_value = tval.it_interval; + setitimer(ITIMER_VIRTUAL, &tval, NULL); +} + +void +rb_thread_cancel_timer() +{ +} + +#else /* !(_THREAD_SAFE || HAVE_SETITIMER) */ +int rb_thread_tick = THREAD_TICK; + +void +rb_thread_cancel_timer() +{ +} +#endif + +static VALUE +rb_thread_start_0(fn, arg, th) + VALUE (*fn)(); + void *arg; + rb_thread_t th; +{ + volatile rb_thread_t th_save = th; + volatile VALUE thread = th->thread; + struct BLOCK *volatile saved_block = 0; + enum rb_thread_status status; + int state; + + if (OBJ_FROZEN(curr_thread->thgroup)) { + rb_raise(rb_eThreadError, + "can't start a new thread (frozen ThreadGroup)"); + } + + if (!thread_init) { + thread_init = 1; +#if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE) +#if defined(POSIX_SIGNAL) + posix_signal(SIGVTALRM, catch_timer); +#else + signal(SIGVTALRM, catch_timer); +#endif + +#ifdef _THREAD_SAFE + pthread_create(&time_thread, 0, thread_timer, 0); + time_thread_alive_p = 1; + pthread_atfork(0, 0, rb_child_atfork); +#else + rb_thread_start_timer(); +#endif +#endif + } + + if (THREAD_SAVE_CONTEXT(curr_thread)) { + return thread; + } + + if (ruby_block) { /* should nail down higher blocks */ + struct BLOCK dummy; + + dummy.prev = ruby_block; + blk_copy_prev(&dummy); + saved_block = ruby_block = dummy.prev; + } + scope_dup(ruby_scope); + + if (!th->next) { + /* merge in thread list */ + th->prev = curr_thread; + curr_thread->next->prev = th; + th->next = curr_thread->next; + curr_thread->next = th; + th->priority = curr_thread->priority; + th->thgroup = curr_thread->thgroup; + } + + PUSH_TAG(PROT_THREAD); + if ((state = EXEC_TAG()) == 0) { + if (THREAD_SAVE_CONTEXT(th) == 0) { + curr_thread = th; + th->result = (*fn)(arg, th); + } + th = th_save; + } + else if (TAG_DST()) { + th = th_save; + th->result = prot_tag->retval; + } + POP_TAG(); + status = th->status; + + if (th == main_thread) ruby_stop(state); + rb_thread_remove(th); + + if (saved_block) { + blk_free(saved_block); + } + + if (state && status != THREAD_TO_KILL && !NIL_P(ruby_errinfo)) { + th->flags |= RAISED_EXCEPTION; + if (state == TAG_FATAL) { + /* fatal error within this thread, need to stop whole script */ + main_thread->errinfo = ruby_errinfo; + rb_thread_cleanup(); + } + else if (rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) { + if (th->safe >= 4) { + char buf[32]; + + sprintf(buf, "Insecure exit at level %d", th->safe); + th->errinfo = rb_exc_new2(rb_eSecurityError, buf); + } + else { + /* delegate exception to main_thread */ + rb_thread_main_jump(ruby_errinfo, RESTORE_RAISE); + } + } + else if (th->safe < 4 && (ruby_thread_abort || th->abort || RTEST(ruby_debug))) { + /* exit on main_thread */ + error_print(); + rb_thread_main_jump(ruby_errinfo, RESTORE_EXIT); + } + else { + th->errinfo = ruby_errinfo; + } + } + rb_thread_schedule(); + ruby_stop(0); /* last thread termination */ + return 0; /* not reached */ +} + +VALUE +rb_thread_create(fn, arg) + VALUE (*fn)(); + void *arg; +{ + Init_stack((void *)&arg); + return rb_thread_start_0(fn, arg, rb_thread_alloc(rb_cThread)); +} + +static VALUE +rb_thread_yield(arg, th) + VALUE arg; + rb_thread_t th; +{ + const ID *tbl; + + scope_dup(ruby_block->scope); + + tbl = ruby_scope->local_tbl; + if (tbl) { + int n = *tbl++; + for (tbl += 2, n -= 2; n > 0; --n) { /* skip first 2 ($_ and $~) */ + ID id = *tbl++; + if (id != 0 && !rb_is_local_id(id)) /* push flip states */ + rb_dvar_push(id, Qfalse); + } + } + rb_dvar_push('_', Qnil); + rb_dvar_push('~', Qnil); + ruby_block->dyna_vars = ruby_dyna_vars; + + return rb_yield_0(arg, 0, 0, YIELD_LAMBDA_CALL, Qtrue); +} + +/* + * call-seq: + * Thread.new([arg]*) {|args| block } => thread + * + * Creates and runs a new thread to execute the instructions given in + * <i>block</i>. Any arguments passed to <code>Thread::new</code> are passed + * into the block. + * + * x = Thread.new { sleep 0.1; print "x"; print "y"; print "z" } + * a = Thread.new { print "a"; print "b"; sleep 0.2; print "c" } + * x.join # Let the threads finish before + * a.join # main thread exits... + * + * <em>produces:</em> + * + * abxyzc + */ + +static VALUE +rb_thread_s_new(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + rb_thread_t th = rb_thread_alloc(klass); + volatile VALUE *pos; + + pos = th->stk_pos; + rb_obj_call_init(th->thread, argc, argv); + if (th->stk_pos == 0) { + rb_raise(rb_eThreadError, "uninitialized thread - check `%s#initialize'", + rb_class2name(klass)); + } + + return th->thread; +} + + +/* + * call-seq: + * Thread.new([arg]*) {|args| block } => thread + * + * Creates and runs a new thread to execute the instructions given in + * <i>block</i>. Any arguments passed to <code>Thread::new</code> are passed + * into the block. + * + * x = Thread.new { sleep 0.1; print "x"; print "y"; print "z" } + * a = Thread.new { print "a"; print "b"; sleep 0.2; print "c" } + * x.join # Let the threads finish before + * a.join # main thread exits... + * + * <em>produces:</em> + * + * abxyzc + */ + +static VALUE +rb_thread_initialize(thread, args) + VALUE thread, args; +{ + rb_thread_t th; + + if (!rb_block_given_p()) { + rb_raise(rb_eThreadError, "must be called with a block"); + } + th = rb_thread_check(thread); + if (th->stk_max) { + NODE *node = th->node; + if (!node) { + rb_raise(rb_eThreadError, "already initialized thread"); + } + rb_raise(rb_eThreadError, "already initialized thread - %s:%d", + node->nd_file, nd_line(node)); + } + return rb_thread_start_0(rb_thread_yield, args, th); +} + + +/* + * call-seq: + * Thread.start([args]*) {|args| block } => thread + * Thread.fork([args]*) {|args| block } => thread + * + * Basically the same as <code>Thread::new</code>. However, if class + * <code>Thread</code> is subclassed, then calling <code>start</code> in that + * subclass will not invoke the subclass's <code>initialize</code> method. + */ + +static VALUE +rb_thread_start(klass, args) + VALUE klass, args; +{ + if (!rb_block_given_p()) { + rb_raise(rb_eThreadError, "must be called with a block"); + } + return rb_thread_start_0(rb_thread_yield, args, rb_thread_alloc(klass)); +} + + +/* + * call-seq: + * thr.value => obj + * + * Waits for <i>thr</i> to complete (via <code>Thread#join</code>) and returns + * its value. + * + * a = Thread.new { 2 + 2 } + * a.value #=> 4 + */ + +static VALUE +rb_thread_value(thread) + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + + while (!rb_thread_join0(th, DELAY_INFTY)); + + return th->result; +} + + +/* + * call-seq: + * thr.status => string, false or nil + * + * Returns the status of <i>thr</i>: ``<code>sleep</code>'' if <i>thr</i> is + * sleeping or waiting on I/O, ``<code>run</code>'' if <i>thr</i> is executing, + * ``<code>aborting</code>'' if <i>thr</i> is aborting, <code>false</code> if + * <i>thr</i> terminated normally, and <code>nil</code> if <i>thr</i> + * terminated with an exception. + * + * a = Thread.new { raise("die now") } + * b = Thread.new { Thread.stop } + * c = Thread.new { Thread.exit } + * d = Thread.new { sleep } + * Thread.critical = true + * d.kill #=> #<Thread:0x401b3678 aborting> + * a.status #=> nil + * b.status #=> "sleep" + * c.status #=> false + * d.status #=> "aborting" + * Thread.current.status #=> "run" + */ + +static VALUE +rb_thread_status_name(thread) + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + + if (rb_thread_dead(th)) { + if (!NIL_P(th->errinfo) && (th->flags & RAISED_EXCEPTION)) + return Qnil; + return Qfalse; + } + + return rb_str_new2(thread_status_name(th->status)); +} + + +/* + * call-seq: + * thr.alive? => true or false + * + * Returns <code>true</code> if <i>thr</i> is running or sleeping. + * + * thr = Thread.new { } + * thr.join #=> #<Thread:0x401b3fb0 dead> + * Thread.current.alive? #=> true + * thr.alive? #=> false + */ + +VALUE +rb_thread_alive_p(thread) + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + + if (rb_thread_dead(th)) return Qfalse; + return Qtrue; +} + + +/* + * call-seq: + * thr.stop? => true or false + * + * Returns <code>true</code> if <i>thr</i> is dead or sleeping. + * + * a = Thread.new { Thread.stop } + * b = Thread.current + * a.stop? #=> true + * b.stop? #=> false + */ + +static VALUE +rb_thread_stop_p(thread) + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + + if (rb_thread_dead(th)) return Qtrue; + if (th->status == THREAD_STOPPED) return Qtrue; + return Qfalse; +} + +static void +rb_thread_wait_other_threads() +{ + rb_thread_t th; + int found; + + /* wait other threads to terminate */ + while (curr_thread != curr_thread->next) { + found = 0; + FOREACH_THREAD(th) { + if (th != curr_thread && th->status != THREAD_STOPPED) { + found = 1; + break; + } + } + END_FOREACH(th); + if (!found) return; + rb_thread_schedule(); + } +} + +static void +rb_thread_cleanup() +{ + rb_thread_t curr, th; + + curr = curr_thread; + while (curr->status == THREAD_KILLED) { + curr = curr->prev; + } + + FOREACH_THREAD_FROM(curr, th) { + if (th->status != THREAD_KILLED) { + rb_thread_ready(th); + if (th != main_thread) { + th->thgroup = 0; + th->priority = 0; + th->status = THREAD_TO_KILL; + RDATA(th->thread)->dfree = NULL; + } + } + } + END_FOREACH_FROM(curr, th); +} + +int rb_thread_critical; + + +/* + * call-seq: + * Thread.critical => true or false + * + * Returns the status of the global ``thread critical'' condition. + */ + +static VALUE +rb_thread_critical_get() +{ + return rb_thread_critical?Qtrue:Qfalse; +} + + +/* + * call-seq: + * Thread.critical= boolean => true or false + * + * Sets the status of the global ``thread critical'' condition and returns + * it. When set to <code>true</code>, prohibits scheduling of any existing + * thread. Does not block new threads from being created and run. Certain + * thread operations (such as stopping or killing a thread, sleeping in the + * current thread, and raising an exception) may cause a thread to be scheduled + * even when in a critical section. <code>Thread::critical</code> is not + * intended for daily use: it is primarily there to support folks writing + * threading libraries. + */ + +static VALUE +rb_thread_critical_set(obj, val) + VALUE obj, val; +{ + rb_thread_critical = RTEST(val); + return val; +} + +void +rb_thread_interrupt() +{ + rb_thread_critical = 0; + rb_thread_ready(main_thread); + if (curr_thread == main_thread) { + rb_interrupt(); + } + if (!rb_thread_dead(curr_thread)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { + return; + } + } + curr_thread = main_thread; + rb_thread_restore_context(curr_thread, RESTORE_INTERRUPT); +} + +void +rb_thread_signal_raise(sig) + int sig; +{ + rb_thread_critical = 0; + if (curr_thread == main_thread) { + VALUE argv[1]; + + rb_thread_ready(curr_thread); + argv[0] = INT2FIX(sig); + rb_exc_raise(rb_class_new_instance(1, argv, rb_eSignal)); + } + rb_thread_ready(main_thread); + if (!rb_thread_dead(curr_thread)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { + return; + } + } + th_sig = sig; + curr_thread = main_thread; + rb_thread_restore_context(curr_thread, RESTORE_SIGNAL); +} + +void +rb_thread_trap_eval(cmd, sig, safe) + VALUE cmd; + int sig, safe; +{ + rb_thread_critical = 0; + if (curr_thread == main_thread) { + rb_trap_eval(cmd, sig, safe); + return; + } + if (!rb_thread_dead(curr_thread)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { + return; + } + } + th_cmd = cmd; + th_sig = sig; + th_safe = safe; + curr_thread = main_thread; + rb_thread_restore_context(curr_thread, RESTORE_TRAP); +} + +void +rb_thread_signal_exit() +{ + VALUE args[2]; + + rb_thread_critical = 0; + if (curr_thread == main_thread) { + rb_thread_ready(curr_thread); + rb_exit(EXIT_SUCCESS); + } + args[0] = INT2NUM(EXIT_SUCCESS); + args[1] = rb_str_new2("exit"); + rb_thread_ready(main_thread); + if (!rb_thread_dead(curr_thread)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { + return; + } + } + rb_thread_main_jump(rb_class_new_instance(2, args, rb_eSystemExit), + RESTORE_EXIT); +} + +static VALUE +rb_thread_raise(argc, argv, th) + int argc; + VALUE *argv; + rb_thread_t th; +{ + volatile rb_thread_t th_save = th; + VALUE exc; + + if (!th->next) { + rb_raise(rb_eArgError, "unstarted thread"); + } + if (rb_thread_dead(th)) return Qnil; + exc = rb_make_exception(argc, argv); + if (curr_thread == th) { + rb_raise_jump(exc); + } + + if (!rb_thread_dead(curr_thread)) { + if (THREAD_SAVE_CONTEXT(curr_thread)) { + return th_save->thread; + } + } + + rb_thread_ready(th); + curr_thread = th; + + th_raise_exception = exc; + th_raise_node = ruby_current_node; + rb_thread_restore_context(curr_thread, RESTORE_RAISE); + return Qnil; /* not reached */ +} + + +/* + * call-seq: + * thr.raise(exception) + * + * Raises an exception (see <code>Kernel::raise</code>) from <i>thr</i>. The + * caller does not have to be <i>thr</i>. + * + * Thread.abort_on_exception = true + * a = Thread.new { sleep(200) } + * a.raise("Gotcha") + * + * <em>produces:</em> + * + * prog.rb:3: Gotcha (RuntimeError) + * from prog.rb:2:in `initialize' + * from prog.rb:2:in `new' + * from prog.rb:2 + */ + +static VALUE +rb_thread_raise_m(argc, argv, thread) + int argc; + VALUE *argv; + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + + if (ruby_safe_level > th->safe) { + rb_secure(4); + } + rb_thread_raise(argc, argv, th); + return Qnil; /* not reached */ +} + +VALUE +rb_thread_local_aref(thread, id) + VALUE thread; + ID id; +{ + rb_thread_t th; + VALUE val; + + th = rb_thread_check(thread); + if (ruby_safe_level >= 4 && th != curr_thread) { + rb_raise(rb_eSecurityError, "Insecure: thread locals"); + } + if (!th->locals) return Qnil; + if (st_lookup(th->locals, id, &val)) { + return val; + } + return Qnil; +} + + +/* + * call-seq: + * thr[sym] => obj or nil + * + * Attribute Reference---Returns the value of a thread-local variable, using + * either a symbol or a string name. If the specified variable does not exist, + * returns <code>nil</code>. + * + * a = Thread.new { Thread.current["name"] = "A"; Thread.stop } + * b = Thread.new { Thread.current[:name] = "B"; Thread.stop } + * c = Thread.new { Thread.current["name"] = "C"; Thread.stop } + * Thread.list.each {|x| puts "#{x.inspect}: #{x[:name]}" } + * + * <em>produces:</em> + * + * #<Thread:0x401b3b3c sleep>: C + * #<Thread:0x401b3bc8 sleep>: B + * #<Thread:0x401b3c68 sleep>: A + * #<Thread:0x401bdf4c run>: + */ + +static VALUE +rb_thread_aref(thread, id) + VALUE thread, id; +{ + return rb_thread_local_aref(thread, rb_to_id(id)); +} + +VALUE +rb_thread_local_aset(thread, id, val) + VALUE thread; + ID id; + VALUE val; +{ + rb_thread_t th = rb_thread_check(thread); + + if (ruby_safe_level >= 4 && th != curr_thread) { + rb_raise(rb_eSecurityError, "Insecure: can't modify thread locals"); + } + if (OBJ_FROZEN(thread)) rb_error_frozen("thread locals"); + + if (!th->locals) { + th->locals = st_init_numtable(); + } + if (NIL_P(val)) { + st_delete(th->locals, (st_data_t*)&id, 0); + return Qnil; + } + st_insert(th->locals, id, val); + + return val; +} + + +/* + * call-seq: + * thr[sym] = obj => obj + * + * Attribute Assignment---Sets or creates the value of a thread-local variable, + * using either a symbol or a string. See also <code>Thread#[]</code>. + */ + +static VALUE +rb_thread_aset(thread, id, val) + VALUE thread, id, val; +{ + return rb_thread_local_aset(thread, rb_to_id(id), val); +} + + +/* + * call-seq: + * thr.key?(sym) => true or false + * + * Returns <code>true</code> if the given string (or symbol) exists as a + * thread-local variable. + * + * me = Thread.current + * me[:oliver] = "a" + * me.key?(:oliver) #=> true + * me.key?(:stanley) #=> false + */ + +static VALUE +rb_thread_key_p(thread, id) + VALUE thread, id; +{ + rb_thread_t th = rb_thread_check(thread); + + if (!th->locals) return Qfalse; + if (st_lookup(th->locals, rb_to_id(id), 0)) + return Qtrue; + return Qfalse; +} + +static int +thread_keys_i(key, value, ary) + ID key; + VALUE value, ary; +{ + rb_ary_push(ary, ID2SYM(key)); + return ST_CONTINUE; +} + + +/* + * call-seq: + * thr.keys => array + * + * Returns an an array of the names of the thread-local variables (as Symbols). + * + * thr = Thread.new do + * Thread.current[:cat] = 'meow' + * Thread.current["dog"] = 'woof' + * end + * thr.join #=> #<Thread:0x401b3f10 dead> + * thr.keys #=> [:dog, :cat] + */ + +static VALUE +rb_thread_keys(thread) + VALUE thread; +{ + rb_thread_t th = rb_thread_check(thread); + VALUE ary = rb_ary_new(); + + if (th->locals) { + st_foreach(th->locals, thread_keys_i, ary); + } + return ary; +} + +/* + * call-seq: + * thr.inspect => string + * + * Dump the name, id, and status of _thr_ to a string. + */ + +static VALUE +rb_thread_inspect(thread) + VALUE thread; +{ + char *cname = rb_obj_classname(thread); + rb_thread_t th = rb_thread_check(thread); + const char *status = thread_status_name(th->status); + VALUE str; + size_t len = strlen(cname)+7+16+9+1; + + str = rb_str_new(0, len); /* 7:tags 16:addr 9:status 1:nul */ + snprintf(RSTRING(str)->ptr, len, "#<%s:0x%lx %s>", cname, thread, status); + RSTRING(str)->len = strlen(RSTRING(str)->ptr); + OBJ_INFECT(str, thread); + + return str; +} + +void +rb_thread_atfork() +{ + rb_thread_t th; + + if (rb_thread_alone()) return; + FOREACH_THREAD(th) { + if (th != curr_thread) { + rb_thread_die(th); + } + } + END_FOREACH(th); + main_thread = curr_thread; + curr_thread->next = curr_thread; + curr_thread->prev = curr_thread; +} + + +static void +cc_purge(cc) + rb_thread_t cc; +{ + /* free continuation's stack if it has just died */ + if (NIL_P(cc->thread)) return; + if (rb_thread_check(cc->thread)->status == THREAD_KILLED) { + cc->thread = Qnil; + rb_thread_die(cc); /* can't possibly activate this stack */ + } +} + +static void +cc_mark(cc) + rb_thread_t cc; +{ + /* mark this continuation's stack only if its parent thread is still alive */ + cc_purge(cc); + thread_mark(cc); +} + +static rb_thread_t +rb_cont_check(data) + VALUE data; +{ + if (TYPE(data) != T_DATA || RDATA(data)->dmark != (RUBY_DATA_FUNC)cc_mark) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Continuation)", + rb_obj_classname(data)); + } + return (rb_thread_t)RDATA(data)->data; +} + +/* + * Document-class: Continuation + * + * Continuation objects are generated by + * <code>Kernel#callcc</code>. They hold a return address and execution + * context, allowing a nonlocal return to the end of the + * <code>callcc</code> block from anywhere within a program. + * Continuations are somewhat analogous to a structured version of C's + * <code>setjmp/longjmp</code> (although they contain more state, so + * you might consider them closer to threads). + * + * For instance: + * + * arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ] + * callcc{|$cc|} + * puts(message = arr.shift) + * $cc.call unless message =~ /Max/ + * + * <em>produces:</em> + * + * Freddie + * Herbie + * Ron + * Max + * + * This (somewhat contrived) example allows the inner loop to abandon + * processing early: + * + * callcc {|cont| + * for i in 0..4 + * print "\n#{i}: " + * for j in i*5...(i+1)*5 + * cont.call() if j == 17 + * printf "%3d", j + * end + * end + * } + * print "\n" + * + * <em>produces:</em> + * + * 0: 0 1 2 3 4 + * 1: 5 6 7 8 9 + * 2: 10 11 12 13 14 + * 3: 15 16 + */ + +VALUE rb_cCont; + +/* + * call-seq: + * callcc {|cont| block } => obj + * + * Generates a <code>Continuation</code> object, which it passes to the + * associated block. Performing a <em>cont</em><code>.call</code> will + * cause the <code>callcc</code> to return (as will falling through the + * end of the block). The value returned by the <code>callcc</code> is + * the value of the block, or the value passed to + * <em>cont</em><code>.call</code>. See class <code>Continuation</code> + * for more details. Also see <code>Kernel::throw</code> for + * an alternative mechanism for unwinding a call stack. + */ + +static VALUE +rb_callcc(self) + VALUE self; +{ + volatile VALUE cont; + rb_thread_t th; + volatile rb_thread_t th_save; + struct tag *tag; + struct RVarmap *vars; + + THREAD_ALLOC(th); + /* must finish th initialization before any possible gc. + * brent@mbari.org */ + th->thread = curr_thread->thread; + th->thgroup = cont_protect; + cont = Data_Wrap_Struct(rb_cCont, cc_mark, thread_free, th); + + scope_dup(ruby_scope); + for (tag=prot_tag; tag; tag=tag->prev) { + scope_dup(tag->scope); + } + + for (vars = ruby_dyna_vars; vars; vars = vars->next) { + if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; + FL_SET(vars, DVAR_DONT_RECYCLE); + } + th_save = th; + if (THREAD_SAVE_CONTEXT(th)) { + return th_save->result; + } + else { + return rb_yield(cont); + } +} + +/* + * call-seq: + * cont.call(args, ...) + * cont[args, ...] + * + * Invokes the continuation. The program continues from the end of the + * <code>callcc</code> block. If no arguments are given, the original + * <code>callcc</code> returns <code>nil</code>. If one argument is + * given, <code>callcc</code> returns it. Otherwise, an array + * containing <i>args</i> is returned. + * + * callcc {|cont| cont.call } #=> nil + * callcc {|cont| cont.call 1 } #=> 1 + * callcc {|cont| cont.call 1, 2, 3 } #=> [1, 2, 3] + */ + +static VALUE +rb_cont_call(argc, argv, cont) + int argc; + VALUE *argv; + VALUE cont; +{ + rb_thread_t th = rb_cont_check(cont); + + if (th->thread != curr_thread->thread) { + rb_raise(rb_eRuntimeError, "continuation called across threads"); + } + if (th->thgroup != cont_protect) { + rb_raise(rb_eRuntimeError, "continuation called across trap"); + } + switch (argc) { + case 0: + th->result = Qnil; + break; + case 1: + th->result = argv[0]; + break; + default: + th->result = rb_ary_new4(argc, argv); + break; + } + + rb_thread_restore_context(th, RESTORE_NORMAL); + return Qnil; +} + +struct thgroup { + int enclosed; + VALUE group; +}; + + +/* + * Document-class: ThreadGroup + * + * <code>ThreadGroup</code> provides a means of keeping track of a number of + * threads as a group. A <code>Thread</code> can belong to only one + * <code>ThreadGroup</code> at a time; adding a thread to a new group will + * remove it from any previous group. + * + * Newly created threads belong to the same group as the thread from which they + * were created. + */ + +static VALUE thgroup_s_alloc _((VALUE)); +static VALUE +thgroup_s_alloc(klass) + VALUE klass; +{ + VALUE group; + struct thgroup *data; + + group = Data_Make_Struct(klass, struct thgroup, 0, free, data); + data->enclosed = 0; + data->group = group; + + return group; +} + + +/* + * call-seq: + * thgrp.list => array + * + * Returns an array of all existing <code>Thread</code> objects that belong to + * this group. + * + * ThreadGroup::Default.list #=> [#<Thread:0x401bdf4c run>] + */ + +static VALUE +thgroup_list(group) + VALUE group; +{ + struct thgroup *data; + rb_thread_t th; + VALUE ary; + + Data_Get_Struct(group, struct thgroup, data); + ary = rb_ary_new(); + + FOREACH_THREAD(th) { + if (th->thgroup == data->group) { + rb_ary_push(ary, th->thread); + } + } + END_FOREACH(th); + + return ary; +} + + +/* + * call-seq: + * thgrp.enclose => thgrp + * + * Prevents threads from being added to or removed from the receiving + * <code>ThreadGroup</code>. New threads can still be started in an enclosed + * <code>ThreadGroup</code>. + * + * ThreadGroup::Default.enclose #=> #<ThreadGroup:0x4029d914> + * thr = Thread::new { Thread.stop } #=> #<Thread:0x402a7210 sleep> + * tg = ThreadGroup::new #=> #<ThreadGroup:0x402752d4> + * tg.add thr + * + * <em>produces:</em> + * + * ThreadError: can't move from the enclosed thread group + */ + +static VALUE +thgroup_enclose(group) + VALUE group; +{ + struct thgroup *data; + + Data_Get_Struct(group, struct thgroup, data); + data->enclosed = 1; + + return group; +} + + +/* + * call-seq: + * thgrp.enclosed? => true or false + * + * Returns <code>true</code> if <em>thgrp</em> is enclosed. See also + * ThreadGroup#enclose. + */ + +static VALUE +thgroup_enclosed_p(group) + VALUE group; +{ + struct thgroup *data; + + Data_Get_Struct(group, struct thgroup, data); + if (data->enclosed) return Qtrue; + return Qfalse; +} + + +/* + * call-seq: + * thgrp.add(thread) => thgrp + * + * Adds the given <em>thread</em> to this group, removing it from any other + * group to which it may have previously belonged. + * + * puts "Initial group is #{ThreadGroup::Default.list}" + * tg = ThreadGroup.new + * t1 = Thread.new { sleep } + * t2 = Thread.new { sleep } + * puts "t1 is #{t1}" + * puts "t2 is #{t2}" + * tg.add(t1) + * puts "Initial group now #{ThreadGroup::Default.list}" + * puts "tg group now #{tg.list}" + * + * <em>produces:</em> + * + * Initial group is #<Thread:0x401bdf4c> + * t1 is #<Thread:0x401b3c90> + * t2 is #<Thread:0x401b3c18> + * Initial group now #<Thread:0x401b3c18>#<Thread:0x401bdf4c> + * tg group now #<Thread:0x401b3c90> + */ + +static VALUE +thgroup_add(group, thread) + VALUE group, thread; +{ + rb_thread_t th; + struct thgroup *data; + + rb_secure(4); + th = rb_thread_check(thread); + + if (OBJ_FROZEN(group)) { + rb_raise(rb_eThreadError, "can't move to the frozen thread group"); + } + Data_Get_Struct(group, struct thgroup, data); + if (data->enclosed) { + rb_raise(rb_eThreadError, "can't move to the enclosed thread group"); + } + + if (!th->thgroup) { + return Qnil; + } + if (OBJ_FROZEN(th->thgroup)) { + rb_raise(rb_eThreadError, "can't move from the frozen thread group"); + } + Data_Get_Struct(th->thgroup, struct thgroup, data); + if (data->enclosed) { + rb_raise(rb_eThreadError, "can't move from the enclosed thread group"); + } + + th->thgroup = group; + return group; +} + + +/* + * +Thread+ encapsulates the behavior of a thread of + * execution, including the main thread of the Ruby script. + * + * In the descriptions of the methods in this class, the parameter _sym_ + * refers to a symbol, which is either a quoted string or a + * +Symbol+ (such as <code>:name</code>). + */ + +void +Init_Thread() +{ + VALUE cThGroup; + + rb_eThreadError = rb_define_class("ThreadError", rb_eStandardError); + rb_cThread = rb_define_class("Thread", rb_cObject); + rb_undef_alloc_func(rb_cThread); + + rb_define_singleton_method(rb_cThread, "new", rb_thread_s_new, -1); + rb_define_method(rb_cThread, "initialize", rb_thread_initialize, -2); + rb_define_singleton_method(rb_cThread, "start", rb_thread_start, -2); + rb_define_singleton_method(rb_cThread, "fork", rb_thread_start, -2); + + rb_define_singleton_method(rb_cThread, "stop", rb_thread_stop, 0); + rb_define_singleton_method(rb_cThread, "kill", rb_thread_s_kill, 1); + rb_define_singleton_method(rb_cThread, "exit", rb_thread_exit, 0); + rb_define_singleton_method(rb_cThread, "pass", rb_thread_pass, 0); + rb_define_singleton_method(rb_cThread, "current", rb_thread_current, 0); + rb_define_singleton_method(rb_cThread, "main", rb_thread_main, 0); + rb_define_singleton_method(rb_cThread, "list", rb_thread_list, 0); + + rb_define_singleton_method(rb_cThread, "critical", rb_thread_critical_get, 0); + rb_define_singleton_method(rb_cThread, "critical=", rb_thread_critical_set, 1); + + rb_define_singleton_method(rb_cThread, "abort_on_exception", rb_thread_s_abort_exc, 0); + rb_define_singleton_method(rb_cThread, "abort_on_exception=", rb_thread_s_abort_exc_set, 1); + + rb_define_method(rb_cThread, "run", rb_thread_run, 0); + rb_define_method(rb_cThread, "wakeup", rb_thread_wakeup, 0); + rb_define_method(rb_cThread, "kill", rb_thread_kill, 0); + rb_define_method(rb_cThread, "terminate", rb_thread_kill, 0); + rb_define_method(rb_cThread, "exit", rb_thread_kill, 0); + rb_define_method(rb_cThread, "kill!", rb_thread_kill_bang, 0); + rb_define_method(rb_cThread, "terminate!", rb_thread_kill_bang, 0); + rb_define_method(rb_cThread, "exit!", rb_thread_kill_bang, 0); + rb_define_method(rb_cThread, "value", rb_thread_value, 0); + rb_define_method(rb_cThread, "status", rb_thread_status_name, 0); + rb_define_method(rb_cThread, "join", rb_thread_join_m, -1); + rb_define_method(rb_cThread, "alive?", rb_thread_alive_p, 0); + rb_define_method(rb_cThread, "stop?", rb_thread_stop_p, 0); + rb_define_method(rb_cThread, "raise", rb_thread_raise_m, -1); + + rb_define_method(rb_cThread, "abort_on_exception", rb_thread_abort_exc, 0); + rb_define_method(rb_cThread, "abort_on_exception=", rb_thread_abort_exc_set, 1); + + rb_define_method(rb_cThread, "priority", rb_thread_priority, 0); + rb_define_method(rb_cThread, "priority=", rb_thread_priority_set, 1); + rb_define_method(rb_cThread, "safe_level", rb_thread_safe_level, 0); + rb_define_method(rb_cThread, "group", rb_thread_group, 0); + + rb_define_method(rb_cThread, "[]", rb_thread_aref, 1); + rb_define_method(rb_cThread, "[]=", rb_thread_aset, 2); + rb_define_method(rb_cThread, "key?", rb_thread_key_p, 1); + rb_define_method(rb_cThread, "keys", rb_thread_keys, 0); + + rb_define_method(rb_cThread, "inspect", rb_thread_inspect, 0); + + rb_cCont = rb_define_class("Continuation", rb_cObject); + rb_undef_alloc_func(rb_cCont); + rb_undef_method(CLASS_OF(rb_cCont), "new"); + rb_define_method(rb_cCont, "call", rb_cont_call, -1); + rb_define_method(rb_cCont, "[]", rb_cont_call, -1); + rb_define_global_function("callcc", rb_callcc, 0); + rb_global_variable(&cont_protect); + + cThGroup = rb_define_class("ThreadGroup", rb_cObject); + rb_define_alloc_func(cThGroup, thgroup_s_alloc); + rb_define_method(cThGroup, "list", thgroup_list, 0); + rb_define_method(cThGroup, "enclose", thgroup_enclose, 0); + rb_define_method(cThGroup, "enclosed?", thgroup_enclosed_p, 0); + rb_define_method(cThGroup, "add", thgroup_add, 1); + rb_global_variable(&thgroup_default); + thgroup_default = rb_obj_alloc(cThGroup); + rb_define_const(cThGroup, "Default", thgroup_default); + + /* allocate main thread */ + main_thread = rb_thread_alloc(rb_cThread); + curr_thread = main_thread->prev = main_thread->next = main_thread; +} + +/* + * call-seq: + * catch(symbol) {| | block } > obj + * + * +catch+ executes its block. If a +throw+ is + * executed, Ruby searches up its stack for a +catch+ block + * with a tag corresponding to the +throw+'s + * _symbol_. If found, that block is terminated, and + * +catch+ returns the value given to +throw+. If + * +throw+ is not called, the block terminates normally, and + * the value of +catch+ is the value of the last expression + * evaluated. +catch+ expressions may be nested, and the + * +throw+ call need not be in lexical scope. + * + * def routine(n) + * puts n + * throw :done if n <= 0 + * routine(n-1) + * end + * + * + * catch(:done) { routine(3) } + * + * <em>produces:</em> + * + * 3 + * 2 + * 1 + * 0 + */ + +static VALUE +rb_f_catch(dmy, tag) + VALUE dmy, tag; +{ + int state; + VALUE val = Qnil; /* OK */ + + tag = ID2SYM(rb_to_id(tag)); + PUSH_TAG(tag); + if ((state = EXEC_TAG()) == 0) { + val = rb_yield_0(tag, 0, 0, 0, Qfalse); + } + else if (state == TAG_THROW && tag == prot_tag->dst) { + val = prot_tag->retval; + state = 0; + } + POP_TAG(); + if (state) JUMP_TAG(state); + + return val; +} + +static VALUE +catch_i(tag) + VALUE tag; +{ + return rb_funcall(Qnil, rb_intern("catch"), 1, tag); +} + +VALUE +rb_catch(tag, func, data) + const char *tag; + VALUE (*func)(); + VALUE data; +{ + return rb_iterate((VALUE(*)_((VALUE)))catch_i, ID2SYM(rb_intern(tag)), func, data); +} + +/* + * call-seq: + * throw(symbol [, obj]) + * + * Transfers control to the end of the active +catch+ block + * waiting for _symbol_. Raises +NameError+ if there + * is no +catch+ block for the symbol. The optional second + * parameter supplies a return value for the +catch+ block, + * which otherwise defaults to +nil+. For examples, see + * <code>Kernel::catch</code>. + */ + +static VALUE +rb_f_throw(argc, argv) + int argc; + VALUE *argv; +{ + VALUE tag, value; + struct tag *tt = prot_tag; + + rb_scan_args(argc, argv, "11", &tag, &value); + tag = ID2SYM(rb_to_id(tag)); + + while (tt) { + if (tt->tag == tag) { + tt->dst = tag; + tt->retval = value; + break; + } + if (tt->tag == PROT_THREAD) { + rb_raise(rb_eThreadError, "uncaught throw `%s' in thread 0x%lx", + rb_id2name(SYM2ID(tag)), + curr_thread); + } + tt = tt->prev; + } + if (!tt) { + rb_name_error(SYM2ID(tag), "uncaught throw `%s'", rb_id2name(SYM2ID(tag))); + } + rb_trap_restore_mask(); + JUMP_TAG(TAG_THROW); +#ifndef __GNUC__ + return Qnil; /* not reached */ +#endif +} + +void +rb_throw(tag, val) + const char *tag; + VALUE val; +{ + VALUE argv[2]; + + argv[0] = ID2SYM(rb_intern(tag)); + argv[1] = val; + rb_f_throw(2, argv); +} +/********************************************************************** + + file.c - + + $Author: wyhaines $ + $Date: 2009-08-25 20:37:21 +0200 (Tue, 25 Aug 2009) $ + created at: Mon Nov 15 12:24:34 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#ifdef _WIN32 +#include "missing/file.h" +#endif +#ifdef __CYGWIN__ +#define OpenFile WINAPI_OpenFile +#include <windows.h> +#include <sys/cygwin.h> +#undef OpenFile +#endif + +#include "ruby.h" +#include "rubyio.h" +#include "rubysig.h" +#include "util.h" +#include "dln.h" +#include <ctype.h> + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#ifdef HAVE_SYS_FILE_H +# include <sys/file.h> +#else +int flock _((int, int)); +#endif + +#ifdef HAVE_SYS_PARAM_H +# include <sys/param.h> +#endif +#ifndef MAXPATHLEN +# define MAXPATHLEN 1024 +#endif + +#include <time.h> + +VALUE rb_time_new _((time_t, time_t)); + +#ifdef HAVE_UTIME_H +#include <utime.h> +#elif defined HAVE_SYS_UTIME_H +#include <sys/utime.h> +#endif + +#ifdef HAVE_PWD_H +#include <pwd.h> +#endif + +#ifndef HAVE_STRING_H +char *strrchr _((const char*,const char)); +#endif + +#include <sys/types.h> +#include <sys/stat.h> + +#ifdef HAVE_SYS_MKDEV_H +#include <sys/mkdev.h> +#endif + +#if defined(HAVE_FCNTL_H) +#include <fcntl.h> +#endif + +#if !defined HAVE_LSTAT && !defined lstat +#define lstat stat +#endif +#if !HAVE_FSEEKO && !defined(fseeko) +# define fseeko fseek +#endif + +#ifdef __BEOS__ /* should not change ID if -1 */ +static int +be_chown(const char *path, uid_t owner, gid_t group) +{ + if (owner == -1 || group == -1) { + struct stat st; + if (stat(path, &st) < 0) return -1; + if (owner == -1) owner = st.st_uid; + if (group == -1) group = st.st_gid; + } + return chown(path, owner, group); +} +#define chown be_chown +static int +be_fchown(int fd, uid_t owner, gid_t group) +{ + if (owner == -1 || group == -1) { + struct stat st; + if (fstat(fd, &st) < 0) return -1; + if (owner == -1) owner = st.st_uid; + if (group == -1) group = st.st_gid; + } + return fchown(fd, owner, group); +} +#define fchown be_fchown +#endif /* __BEOS__ */ + +VALUE rb_cFile; +VALUE rb_mFileTest; +VALUE rb_cStat; + +static long apply2files _((void (*)(const char *, void *), VALUE, void *)); +static long +apply2files(func, vargs, arg) + void (*func)_((const char *, void *)); + VALUE vargs; + void *arg; +{ + long i; + VALUE path; + struct RArray *args = RARRAY(vargs); + + for (i=0; i<args->len; i++) { + path = args->ptr[i]; + SafeStringValue(path); + (*func)(StringValueCStr(path), arg); + } + + return args->len; +} + +/* + * call-seq: + * file.path -> filename + * + * Returns the pathname used to create <i>file</i> as a string. Does + * not normalize the name. + * + * File.new("testfile").path #=> "testfile" + * File.new("/tmp/../tmp/xxx", "w").path #=> "/tmp/../tmp/xxx" + * + */ + +static VALUE +rb_file_path(obj) + VALUE obj; +{ + OpenFile *fptr; + + fptr = RFILE(rb_io_taint_check(obj))->fptr; + rb_io_check_initialized(fptr); + if (!fptr->path) return Qnil; + return rb_tainted_str_new2(fptr->path); +} + +static VALUE +stat_new_0(klass, st) + VALUE klass; + struct stat *st; +{ + struct stat *nst = 0; + + if (st) { + nst = ALLOC(struct stat); + *nst = *st; + } + return Data_Wrap_Struct(klass, NULL, free, nst); +} + +static VALUE +stat_new(st) + struct stat *st; +{ + return stat_new_0(rb_cStat, st); +} + +static struct stat* +get_stat(self) + VALUE self; +{ + struct stat* st; + Data_Get_Struct(self, struct stat, st); + if (!st) rb_raise(rb_eTypeError, "uninitialized File::Stat"); + return st; +} + +/* + * call-seq: + * stat <=> other_stat => -1, 0, 1 + * + * Compares <code>File::Stat</code> objects by comparing their + * respective modification times. + * + * f1 = File.new("f1", "w") + * sleep 1 + * f2 = File.new("f2", "w") + * f1.stat <=> f2.stat #=> -1 + */ + +static VALUE +rb_stat_cmp(self, other) + VALUE self, other; +{ + if (rb_obj_is_kind_of(other, rb_obj_class(self))) { + time_t t1 = get_stat(self)->st_mtime; + time_t t2 = get_stat(other)->st_mtime; + if (t1 == t2) + return INT2FIX(0); + else if (t1 < t2) + return INT2FIX(-1); + else + return INT2FIX(1); + } + return Qnil; +} + +static VALUE rb_stat_dev _((VALUE)); +static VALUE rb_stat_ino _((VALUE)); +static VALUE rb_stat_mode _((VALUE)); +static VALUE rb_stat_nlink _((VALUE)); +static VALUE rb_stat_uid _((VALUE)); +static VALUE rb_stat_gid _((VALUE)); +static VALUE rb_stat_rdev _((VALUE)); +static VALUE rb_stat_size _((VALUE)); +static VALUE rb_stat_blksize _((VALUE)); +static VALUE rb_stat_blocks _((VALUE)); +static VALUE rb_stat_atime _((VALUE)); +static VALUE rb_stat_mtime _((VALUE)); +static VALUE rb_stat_ctime _((VALUE)); + +/* + * call-seq: + * stat.dev => fixnum + * + * Returns an integer representing the device on which <i>stat</i> + * resides. + * + * File.stat("testfile").dev #=> 774 + */ + +static VALUE +rb_stat_dev(self) + VALUE self; +{ + return INT2NUM(get_stat(self)->st_dev); +} + +/* + * call-seq: + * stat.dev_major => fixnum + * + * Returns the major part of <code>File_Stat#dev</code> or + * <code>nil</code>. + * + * File.stat("/dev/fd1").dev_major #=> 2 + * File.stat("/dev/tty").dev_major #=> 5 + */ + +static VALUE +rb_stat_dev_major(self) + VALUE self; +{ +#if defined(major) + long dev = get_stat(self)->st_dev; + return ULONG2NUM(major(dev)); +#else + return Qnil; +#endif +} + +/* + * call-seq: + * stat.dev_minor => fixnum + * + * Returns the minor part of <code>File_Stat#dev</code> or + * <code>nil</code>. + * + * File.stat("/dev/fd1").dev_minor #=> 1 + * File.stat("/dev/tty").dev_minor #=> 0 + */ + +static VALUE +rb_stat_dev_minor(self) + VALUE self; +{ +#if defined(minor) + long dev = get_stat(self)->st_dev; + return ULONG2NUM(minor(dev)); +#else + return Qnil; +#endif +} + +/* + * call-seq: + * stat.ino => fixnum + * + * Returns the inode number for <i>stat</i>. + * + * File.stat("testfile").ino #=> 1083669 + * + */ + +static VALUE +rb_stat_ino(self) + VALUE self; +{ +#ifdef HUGE_ST_INO + return ULL2NUM(get_stat(self)->st_ino); +#else + return ULONG2NUM(get_stat(self)->st_ino); +#endif +} + +/* + * call-seq: + * stat.mode => fixnum + * + * Returns an integer representing the permission bits of + * <i>stat</i>. The meaning of the bits is platform dependent; on + * Unix systems, see <code>stat(2)</code>. + * + * File.chmod(0644, "testfile") #=> 1 + * s = File.stat("testfile") + * sprintf("%o", s.mode) #=> "100644" + */ + +static VALUE +rb_stat_mode(self) + VALUE self; +{ +#ifdef __BORLANDC__ + return UINT2NUM((unsigned short)(get_stat(self)->st_mode)); +#else + return UINT2NUM(get_stat(self)->st_mode); +#endif +} + +/* + * call-seq: + * stat.nlink => fixnum + * + * Returns the number of hard links to <i>stat</i>. + * + * File.stat("testfile").nlink #=> 1 + * File.link("testfile", "testfile.bak") #=> 0 + * File.stat("testfile").nlink #=> 2 + * + */ + +static VALUE +rb_stat_nlink(self) + VALUE self; +{ + return UINT2NUM(get_stat(self)->st_nlink); +} + +/* + * call-seq: + * stat.uid => fixnum + * + * Returns the numeric user id of the owner of <i>stat</i>. + * + * File.stat("testfile").uid #=> 501 + * + */ + +static VALUE +rb_stat_uid(self) + VALUE self; +{ + return UINT2NUM(get_stat(self)->st_uid); +} + +/* + * call-seq: + * stat.gid => fixnum + * + * Returns the numeric group id of the owner of <i>stat</i>. + * + * File.stat("testfile").gid #=> 500 + * + */ + +static VALUE +rb_stat_gid(self) + VALUE self; +{ + return UINT2NUM(get_stat(self)->st_gid); +} + +/* + * call-seq: + * stat.rdev => fixnum or nil + * + * Returns an integer representing the device type on which + * <i>stat</i> resides. Returns <code>nil</code> if the operating + * system doesn't support this feature. + * + * File.stat("/dev/fd1").rdev #=> 513 + * File.stat("/dev/tty").rdev #=> 1280 + */ + +static VALUE +rb_stat_rdev(self) + VALUE self; +{ +#ifdef HAVE_ST_RDEV + return ULONG2NUM(get_stat(self)->st_rdev); +#else + return Qnil; +#endif +} + +/* + * call-seq: + * stat.rdev_major => fixnum + * + * Returns the major part of <code>File_Stat#rdev</code> or + * <code>nil</code>. + * + * File.stat("/dev/fd1").rdev_major #=> 2 + * File.stat("/dev/tty").rdev_major #=> 5 + */ + +static VALUE +rb_stat_rdev_major(self) + VALUE self; +{ +#if defined(HAVE_ST_RDEV) && defined(major) + long rdev = get_stat(self)->st_rdev; + return ULONG2NUM(major(rdev)); +#else + return Qnil; +#endif +} + +/* + * call-seq: + * stat.rdev_minor => fixnum + * + * Returns the minor part of <code>File_Stat#rdev</code> or + * <code>nil</code>. + * + * File.stat("/dev/fd1").rdev_minor #=> 1 + * File.stat("/dev/tty").rdev_minor #=> 0 + */ + +static VALUE +rb_stat_rdev_minor(self) + VALUE self; +{ +#if defined(HAVE_ST_RDEV) && defined(minor) + long rdev = get_stat(self)->st_rdev; + return ULONG2NUM(minor(rdev)); +#else + return Qnil; +#endif +} + +/* + * call-seq: + * stat.size => fixnum + * + * Returns the size of <i>stat</i> in bytes. + * + * File.stat("testfile").size #=> 66 + */ + +static VALUE +rb_stat_size(self) + VALUE self; +{ + return OFFT2NUM(get_stat(self)->st_size); +} + +/* + * call-seq: + * stat.blksize => integer or nil + * + * Returns the native file system's block size. Will return <code>nil</code> + * on platforms that don't support this information. + * + * File.stat("testfile").blksize #=> 4096 + * + */ + +static VALUE +rb_stat_blksize(self) + VALUE self; +{ +#ifdef HAVE_ST_BLKSIZE + return ULONG2NUM(get_stat(self)->st_blksize); +#else + return Qnil; +#endif +} + +/* + * call-seq: + * stat.blocks => integer or nil + * + * Returns the number of native file system blocks allocated for this + * file, or <code>nil</code> if the operating system doesn't + * support this feature. + * + * File.stat("testfile").blocks #=> 2 + */ + +static VALUE +rb_stat_blocks(self) + VALUE self; +{ +#ifdef HAVE_ST_BLOCKS + return ULONG2NUM(get_stat(self)->st_blocks); +#else + return Qnil; +#endif +} + +/* + * call-seq: + * stat.atime => time + * + * Returns the last access time for this file as an object of class + * <code>Time</code>. + * + * File.stat("testfile").atime #=> Wed Dec 31 18:00:00 CST 1969 + * + */ + +static VALUE +rb_stat_atime(self) + VALUE self; +{ + return rb_time_new(get_stat(self)->st_atime, 0); +} + +/* + * call-seq: + * stat.mtime -> aTime + * + * Returns the modification time of <i>stat</i>. + * + * File.stat("testfile").mtime #=> Wed Apr 09 08:53:14 CDT 2003 + * + */ + +static VALUE +rb_stat_mtime(self) + VALUE self; +{ + return rb_time_new(get_stat(self)->st_mtime, 0); +} + +/* + * call-seq: + * stat.ctime -> aTime + * + * Returns the change time for <i>stat</i> (that is, the time + * directory information about the file was changed, not the file + * itself). + * + * File.stat("testfile").ctime #=> Wed Apr 09 08:53:14 CDT 2003 + * + */ + +static VALUE +rb_stat_ctime(self) + VALUE self; +{ + return rb_time_new(get_stat(self)->st_ctime, 0); +} + +/* + * call-seq: + * stat.inspect => string + * + * Produce a nicely formatted description of <i>stat</i>. + * + * File.stat("/etc/passwd").inspect + * #=> "#<File::Stat dev=0xe000005, ino=1078078, mode=0100644, + * nlink=1, uid=0, gid=0, rdev=0x0, size=1374, blksize=4096, + * blocks=8, atime=Wed Dec 10 10:16:12 CST 2003, + * mtime=Fri Sep 12 15:41:41 CDT 2003, + * ctime=Mon Oct 27 11:20:27 CST 2003>" + */ + +static VALUE +rb_stat_inspect(self) + VALUE self; +{ + VALUE str; + int i; + static const struct { + const char *name; + VALUE (*func)_((VALUE)); + } member[] = { + {"dev", rb_stat_dev}, + {"ino", rb_stat_ino}, + {"mode", rb_stat_mode}, + {"nlink", rb_stat_nlink}, + {"uid", rb_stat_uid}, + {"gid", rb_stat_gid}, + {"rdev", rb_stat_rdev}, + {"size", rb_stat_size}, + {"blksize", rb_stat_blksize}, + {"blocks", rb_stat_blocks}, + {"atime", rb_stat_atime}, + {"mtime", rb_stat_mtime}, + {"ctime", rb_stat_ctime}, + }; + + str = rb_str_buf_new2("#<"); + rb_str_buf_cat2(str, rb_obj_classname(self)); + rb_str_buf_cat2(str, " "); + + for (i = 0; i < sizeof(member)/sizeof(member[0]); i++) { + VALUE v; + + if (i > 0) { + rb_str_buf_cat2(str, ", "); + } + rb_str_buf_cat2(str, member[i].name); + rb_str_buf_cat2(str, "="); + v = (*member[i].func)(self); + if (i == 2) { /* mode */ + char buf[32]; + + sprintf(buf, "0%lo", NUM2ULONG(v)); + rb_str_buf_cat2(str, buf); + } + else if (i == 0 || i == 6) { /* dev/rdev */ + char buf[32]; + + sprintf(buf, "0x%lx", NUM2ULONG(v)); + rb_str_buf_cat2(str, buf); + } + else { + rb_str_append(str, rb_inspect(v)); + } + } + rb_str_buf_cat2(str, ">"); + OBJ_INFECT(str, self); + + return str; +} + +static int +rb_stat(file, st) + VALUE file; + struct stat *st; +{ + VALUE tmp; + + tmp = rb_check_convert_type(file, T_FILE, "IO", "to_io"); + if (!NIL_P(tmp)) { + OpenFile *fptr; + + rb_secure(2); + GetOpenFile(tmp, fptr); + return fstat(fileno(fptr->f), st); + } + SafeStringValue(file); + return stat(StringValueCStr(file), st); +} + +#ifdef _WIN32 +static HANDLE +w32_io_info(file, st) + VALUE *file; + BY_HANDLE_FILE_INFORMATION *st; +{ + VALUE tmp; + HANDLE f, ret = 0; + + tmp = rb_check_convert_type(*file, T_FILE, "IO", "to_io"); + if (!NIL_P(tmp)) { + OpenFile *fptr; + + GetOpenFile(tmp, fptr); + f = (HANDLE)rb_w32_get_osfhandle(fileno(fptr->f)); + if (f == (HANDLE)-1) return INVALID_HANDLE_VALUE; + } + else { + SafeStringValue(*file); + f = CreateFile(StringValueCStr(*file), 0, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + rb_w32_iswin95() ? 0 : FILE_FLAG_BACKUP_SEMANTICS, NULL); + if (f == INVALID_HANDLE_VALUE) return f; + ret = f; + } + if (GetFileType(f) == FILE_TYPE_DISK) { + ZeroMemory(st, sizeof(*st)); + if (GetFileInformationByHandle(f, st)) return ret; + } + if (ret) CloseHandle(ret); + return INVALID_HANDLE_VALUE; +} +#endif + +/* + * call-seq: + * File.stat(file_name) => stat + * + * Returns a <code>File::Stat</code> object for the named file (see + * <code>File::Stat</code>). + * + * File.stat("testfile").mtime #=> Tue Apr 08 12:58:04 CDT 2003 + * + */ + +static VALUE +rb_file_s_stat(klass, fname) + VALUE klass, fname; +{ + struct stat st; + + SafeStringValue(fname); + if (rb_stat(fname, &st) < 0) { + rb_sys_fail(StringValueCStr(fname)); + } + return stat_new(&st); +} + +/* + * call-seq: + * ios.stat => stat + * + * Returns status information for <em>ios</em> as an object of type + * <code>File::Stat</code>. + * + * f = File.new("testfile") + * s = f.stat + * "%o" % s.mode #=> "100644" + * s.blksize #=> 4096 + * s.atime #=> Wed Apr 09 08:53:54 CDT 2003 + * + */ + +static VALUE +rb_io_stat(obj) + VALUE obj; +{ + OpenFile *fptr; + struct stat st; + + GetOpenFile(obj, fptr); + if (fstat(fileno(fptr->f), &st) == -1) { + rb_sys_fail(fptr->path); + } + return stat_new(&st); +} + +/* + * call-seq: + * File.lstat(file_name) => stat + * + * Same as <code>File::stat</code>, but does not follow the last symbolic + * link. Instead, reports on the link itself. + * + * File.symlink("testfile", "link2test") #=> 0 + * File.stat("testfile").size #=> 66 + * File.lstat("link2test").size #=> 8 + * File.stat("link2test").size #=> 66 + * + */ + +static VALUE +rb_file_s_lstat(klass, fname) + VALUE klass, fname; +{ +#ifdef HAVE_LSTAT + struct stat st; + + SafeStringValue(fname); + if (lstat(StringValueCStr(fname), &st) == -1) { + rb_sys_fail(RSTRING(fname)->ptr); + } + return stat_new(&st); +#else + return rb_file_s_stat(klass, fname); +#endif +} + +/* + * call-seq: + * file.lstat => stat + * + * Same as <code>IO#stat</code>, but does not follow the last symbolic + * link. Instead, reports on the link itself. + * + * File.symlink("testfile", "link2test") #=> 0 + * File.stat("testfile").size #=> 66 + * f = File.new("link2test") + * f.lstat.size #=> 8 + * f.stat.size #=> 66 + */ + +static VALUE +rb_file_lstat(obj) + VALUE obj; +{ +#ifdef HAVE_LSTAT + OpenFile *fptr; + struct stat st; + + rb_secure(2); + GetOpenFile(obj, fptr); + if (!fptr->path) return Qnil; + if (lstat(fptr->path, &st) == -1) { + rb_sys_fail(fptr->path); + } + return stat_new(&st); +#else + return rb_io_stat(obj); +#endif +} + +#ifndef HAVE_GROUP_MEMBER +static int +group_member(gid) + GETGROUPS_T gid; +{ +#ifndef _WIN32 + if (getgid() == gid || getegid() == gid) + return Qtrue; + +# ifdef HAVE_GETGROUPS +# ifndef NGROUPS +# ifdef NGROUPS_MAX +# define NGROUPS NGROUPS_MAX +# else +# define NGROUPS 32 +# endif +# endif + { + GETGROUPS_T gary[NGROUPS]; + int anum; + + anum = getgroups(NGROUPS, gary); + while (--anum >= 0) + if (gary[anum] == gid) + return Qtrue; + } +# endif +#endif + return Qfalse; +} +#endif + +#ifndef S_IXUGO +# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) +#endif + +#if defined(S_IXGRP) && !defined(_WIN32) && !defined(__CYGWIN__) +#define USE_GETEUID 1 +#endif + +#ifndef HAVE_EACCESS +int +eaccess(path, mode) + const char *path; + int mode; +{ +#ifdef USE_GETEUID + struct stat st; + int euid; + + if (stat(path, &st) < 0) return -1; + + euid = geteuid(); + + if (euid == 0) { + /* Root can read or write any file. */ + if (!(mode & X_OK)) + return 0; + + /* Root can execute any file that has any one of the execute + bits set. */ + if (st.st_mode & S_IXUGO) + return 0; + + return -1; + } + + if (st.st_uid == euid) /* owner */ + mode <<= 6; + else if (group_member(st.st_gid)) + mode <<= 3; + + if ((st.st_mode & mode) == mode) return 0; + + return -1; +#else +# if _MSC_VER >= 1400 + mode &= 6; +# endif + return access(path, mode); +#endif +} +#endif + + +/* + * Document-class: FileTest + * + * <code>FileTest</code> implements file test operations similar to + * those used in <code>File::Stat</code>. It exists as a standalone + * module, and its methods are also insinuated into the <code>File</code> + * class. (Note that this is not done by inclusion: the interpreter cheats). + * + */ + +/* + * call-seq: + * File.directory?(file_name) => true or false + * + * Returns <code>true</code> if the named file is a directory, + * <code>false</code> otherwise. + * + * File.directory?(".") + */ + +static VALUE +test_d(obj, fname) + VALUE obj, fname; +{ +#ifndef S_ISDIR +# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) +#endif + + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (S_ISDIR(st.st_mode)) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * File.pipe?(file_name) => true or false + * + * Returns <code>true</code> if the named file is a pipe. + */ + +static VALUE +test_p(obj, fname) + VALUE obj, fname; +{ +#ifdef S_IFIFO +# ifndef S_ISFIFO +# define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO) +# endif + + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (S_ISFIFO(st.st_mode)) return Qtrue; + +#endif + return Qfalse; +} + +/* + * call-seq: + * File.symlink?(file_name) => true or false + * + * Returns <code>true</code> if the named file is a symbolic link. + */ + +static VALUE +test_l(obj, fname) + VALUE obj, fname; +{ +#ifndef S_ISLNK +# ifdef _S_ISLNK +# define S_ISLNK(m) _S_ISLNK(m) +# elif defined __BORLANDC__ +# ifdef _S_IFLNK +# define S_ISLNK(m) (((unsigned short)(m) & S_IFMT) == _S_IFLNK) +# else +# ifdef S_IFLNK +# define S_ISLNK(m) (((unsigned short)(m) & S_IFMT) == S_IFLNK) +# endif +# endif +# else +# ifdef _S_IFLNK +# define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK) +# else +# ifdef S_IFLNK +# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK) +# endif +# endif +# endif +#endif + +#ifdef S_ISLNK + struct stat st; + + SafeStringValue(fname); + if (lstat(StringValueCStr(fname), &st) < 0) return Qfalse; + if (S_ISLNK(st.st_mode)) return Qtrue; +#endif + + return Qfalse; +} + +/* + * call-seq: + * File.socket?(file_name) => true or false + * + * Returns <code>true</code> if the named file is a socket. + */ + +static VALUE +test_S(obj, fname) + VALUE obj, fname; +{ +#ifndef S_ISSOCK +# ifdef _S_ISSOCK +# define S_ISSOCK(m) _S_ISSOCK(m) +# elif defined __BORLANDC__ +# ifdef _S_IFSOCK +# define S_ISSOCK(m) (((unsigned short)(m) & S_IFMT) == _S_IFSOCK) +# else +# ifdef S_IFSOCK +# define S_ISSOCK(m) (((unsigned short)(m) & S_IFMT) == S_IFSOCK) +# endif +# endif +# else +# ifdef _S_IFSOCK +# define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK) +# else +# ifdef S_IFSOCK +# define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK) +# endif +# endif +# endif +#endif + +#ifdef S_ISSOCK + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (S_ISSOCK(st.st_mode)) return Qtrue; + +#endif + return Qfalse; +} + +/* + * call-seq: + * File.blockdev?(file_name) => true or false + * + * Returns <code>true</code> if the named file is a block device. + */ + +static VALUE +test_b(obj, fname) + VALUE obj, fname; +{ +#ifndef S_ISBLK +# ifdef S_IFBLK +# define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK) +# else +# define S_ISBLK(m) (0) /* anytime false */ +# endif +#endif + +#ifdef S_ISBLK + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (S_ISBLK(st.st_mode)) return Qtrue; + +#endif + return Qfalse; +} + +/* + * call-seq: + * File.chardev?(file_name) => true or false + * + * Returns <code>true</code> if the named file is a character device. + */ +static VALUE +test_c(obj, fname) + VALUE obj, fname; +{ +#ifndef S_ISCHR +# define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR) +#endif + + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (S_ISCHR(st.st_mode)) return Qtrue; + + return Qfalse; +} + +/* + * call-seq: + * File.exist?(file_name) => true or false + * File.exists?(file_name) => true or false (obsolete) + * + * Return <code>true</code> if the named file exists. + */ + +static VALUE +test_e(obj, fname) + VALUE obj, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * File.readable?(file_name) => true or false + * + * Returns <code>true</code> if the named file is readable by the effective + * user id of this process. + */ + +static VALUE +test_r(obj, fname) + VALUE obj, fname; +{ + SafeStringValue(fname); + if (eaccess(StringValueCStr(fname), R_OK) < 0) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * File.readable_real?(file_name) => true or false + * + * Returns <code>true</code> if the named file is readable by the real + * user id of this process. + */ + +static VALUE +test_R(obj, fname) + VALUE obj, fname; +{ + SafeStringValue(fname); + if (access(StringValueCStr(fname), R_OK) < 0) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * File.writable?(file_name) => true or false + * + * Returns <code>true</code> if the named file is writable by the effective + * user id of this process. + */ + +static VALUE +test_w(obj, fname) + VALUE obj, fname; +{ + SafeStringValue(fname); + if (eaccess(StringValueCStr(fname), W_OK) < 0) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * File.writable_real?(file_name) => true or false + * + * Returns <code>true</code> if the named file is writable by the real + * user id of this process. + */ + +static VALUE +test_W(obj, fname) + VALUE obj, fname; +{ + SafeStringValue(fname); + if (access(StringValueCStr(fname), W_OK) < 0) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * File.executable?(file_name) => true or false + * + * Returns <code>true</code> if the named file is executable by the effective + * user id of this process. + */ + +static VALUE +test_x(obj, fname) + VALUE obj, fname; +{ + SafeStringValue(fname); + if (eaccess(StringValueCStr(fname), X_OK) < 0) return Qfalse; + return Qtrue; +} + +/* + * call-seq: + * File.executable_real?(file_name) => true or false + * + * Returns <code>true</code> if the named file is executable by the real + * user id of this process. + */ + +static VALUE +test_X(obj, fname) + VALUE obj, fname; +{ + SafeStringValue(fname); + if (access(StringValueCStr(fname), X_OK) < 0) return Qfalse; + return Qtrue; +} + +#ifndef S_ISREG +# define S_ISREG(m) ((m & S_IFMT) == S_IFREG) +#endif + +/* + * call-seq: + * File.file?(file_name) => true or false + * + * Returns <code>true</code> if the named file exists and is a + * regular file. + */ + +static VALUE +test_f(obj, fname) + VALUE obj, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (S_ISREG(st.st_mode)) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * File.zero?(file_name) => true or false + * + * Returns <code>true</code> if the named file exists and has + * a zero size. + */ + +static VALUE +test_z(obj, fname) + VALUE obj, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (st.st_size == 0) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * File.size?(file_name) => Integer or nil + * + * Returns +nil+ if +file_name+ doesn't exist or has zero size, the size of the + * file otherwise. + */ + +static VALUE +test_s(obj, fname) + VALUE obj, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qnil; + if (st.st_size == 0) return Qnil; + return OFFT2NUM(st.st_size); +} + +/* + * call-seq: + * File.owned?(file_name) => true or false + * + * Returns <code>true</code> if the named file exists and the + * effective used id of the calling process is the owner of + * the file. + */ + +static VALUE +test_owned(obj, fname) + VALUE obj, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (st.st_uid == geteuid()) return Qtrue; + return Qfalse; +} + +static VALUE +test_rowned(obj, fname) + VALUE obj, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (st.st_uid == getuid()) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * File.grpowned?(file_name) => true or false + * + * Returns <code>true</code> if the named file exists and the + * effective group id of the calling process is the owner of + * the file. Returns <code>false</code> on Windows. + */ + +static VALUE +test_grpowned(obj, fname) + VALUE obj, fname; +{ +#ifndef _WIN32 + struct stat st; + + if (rb_stat(fname, &st) < 0) return Qfalse; + if (group_member(st.st_gid)) return Qtrue; +#endif + return Qfalse; +} + +#if defined(S_ISUID) || defined(S_ISGID) || defined(S_ISVTX) +static VALUE +check3rdbyte(fname, mode) + VALUE fname; + int mode; +{ + struct stat st; + + SafeStringValue(fname); + if (stat(StringValueCStr(fname), &st) < 0) return Qfalse; + if (st.st_mode & mode) return Qtrue; + return Qfalse; +} +#endif + +/* + * call-seq: + * File.setuid?(file_name) => true or false + * + * Returns <code>true</code> if the named file has the setuid bit set. + */ + +static VALUE +test_suid(obj, fname) + VALUE obj, fname; +{ +#ifdef S_ISUID + return check3rdbyte(fname, S_ISUID); +#else + return Qfalse; +#endif +} + +/* + * call-seq: + * File.setgid?(file_name) => true or false + * + * Returns <code>true</code> if the named file has the setgid bit set. + */ + +static VALUE +test_sgid(obj, fname) + VALUE obj, fname; +{ +#ifdef S_ISGID + return check3rdbyte(fname, S_ISGID); +#else + return Qfalse; +#endif +} + +/* + * call-seq: + * File.sticky?(file_name) => true or false + * + * Returns <code>true</code> if the named file has the sticky bit set. + */ + +static VALUE +test_sticky(obj, fname) + VALUE obj, fname; +{ +#ifdef S_ISVTX + return check3rdbyte(fname, S_ISVTX); +#else + return Qnil; +#endif +} + +/* + * call-seq: + * File.identical?(file_1, file_2) => true or false + * + * Returns <code>true</code> if the named files are identical. + * + * open("a", "w") {} + * p File.identical?("a", "a") #=> true + * p File.identical?("a", "./a") #=> true + * File.link("a", "b") + * p File.identical?("a", "b") #=> true + * File.symlink("a", "c") + * p File.identical?("a", "c") #=> true + * open("d", "w") {} + * p File.identical?("a", "d") #=> false + */ + +static VALUE +test_identical(obj, fname1, fname2) + VALUE obj, fname1, fname2; +{ +#ifndef DOSISH + struct stat st1, st2; + + if (rb_stat(fname1, &st1) < 0) return Qfalse; + if (rb_stat(fname2, &st2) < 0) return Qfalse; + if (st1.st_dev != st2.st_dev) return Qfalse; + if (st1.st_ino != st2.st_ino) return Qfalse; +#else +#ifdef _WIN32 + BY_HANDLE_FILE_INFORMATION st1, st2; + HANDLE f1 = 0, f2 = 0; +#endif + + rb_secure(2); +#ifdef _WIN32 + f1 = w32_io_info(&fname1, &st1); + if (f1 == INVALID_HANDLE_VALUE) return Qfalse; + f2 = w32_io_info(&fname2, &st2); + if (f1) CloseHandle(f1); + if (f2 == INVALID_HANDLE_VALUE) return Qfalse; + if (f2) CloseHandle(f2); + + if (st1.dwVolumeSerialNumber == st2.dwVolumeSerialNumber && + st1.nFileIndexHigh == st2.nFileIndexHigh && + st1.nFileIndexLow == st2.nFileIndexLow) + return Qtrue; + if (!f1 || !f2) return Qfalse; + if (rb_w32_iswin95()) return Qfalse; +#else + SafeStringValue(fname1); + fname1 = rb_str_new4(fname1); + SafeStringValue(fname2); + if (access(RSTRING(fname1)->ptr, 0)) return Qfalse; + if (access(RSTRING(fname2)->ptr, 0)) return Qfalse; +#endif + fname1 = rb_file_expand_path(fname1, Qnil); + fname2 = rb_file_expand_path(fname2, Qnil); + if (RSTRING(fname1)->len != RSTRING(fname2)->len) return Qfalse; + if (rb_memcicmp(RSTRING(fname1)->ptr, RSTRING(fname2)->ptr, RSTRING(fname1)->len)) + return Qfalse; +#endif + return Qtrue; +} + +/* + * call-seq: + * File.size(file_name) => integer + * + * Returns the size of <code>file_name</code>. + */ + +static VALUE +rb_file_s_size(klass, fname) + VALUE klass, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) + rb_sys_fail(StringValueCStr(fname)); + return OFFT2NUM(st.st_size); +} + +static VALUE +rb_file_ftype(st) + struct stat *st; +{ + char *t; + + if (S_ISREG(st->st_mode)) { + t = "file"; + } + else if (S_ISDIR(st->st_mode)) { + t = "directory"; + } + else if (S_ISCHR(st->st_mode)) { + t = "characterSpecial"; + } +#ifdef S_ISBLK + else if (S_ISBLK(st->st_mode)) { + t = "blockSpecial"; + } +#endif +#ifdef S_ISFIFO + else if (S_ISFIFO(st->st_mode)) { + t = "fifo"; + } +#endif +#ifdef S_ISLNK + else if (S_ISLNK(st->st_mode)) { + t = "link"; + } +#endif +#ifdef S_ISSOCK + else if (S_ISSOCK(st->st_mode)) { + t = "socket"; + } +#endif + else { + t = "unknown"; + } + + return rb_str_new2(t); +} + +/* + * call-seq: + * File.ftype(file_name) => string + * + * Identifies the type of the named file; the return string is one of + * ``<code>file</code>'', ``<code>directory</code>'', + * ``<code>characterSpecial</code>'', ``<code>blockSpecial</code>'', + * ``<code>fifo</code>'', ``<code>link</code>'', + * ``<code>socket</code>'', or ``<code>unknown</code>''. + * + * File.ftype("testfile") #=> "file" + * File.ftype("/dev/tty") #=> "characterSpecial" + * File.ftype("/tmp/.X11-unix/X0") #=> "socket" + */ + +static VALUE +rb_file_s_ftype(klass, fname) + VALUE klass, fname; +{ + struct stat st; + + SafeStringValue(fname); + if (lstat(StringValueCStr(fname), &st) == -1) { + rb_sys_fail(RSTRING(fname)->ptr); + } + + return rb_file_ftype(&st); +} + +/* + * call-seq: + * File.atime(file_name) => time + * + * Returns the last access time for the named file as a Time object). + * + * File.atime("testfile") #=> Wed Apr 09 08:51:48 CDT 2003 + * + */ + +static VALUE +rb_file_s_atime(klass, fname) + VALUE klass, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) + rb_sys_fail(StringValueCStr(fname)); + return rb_time_new(st.st_atime, 0); +} + +/* + * call-seq: + * file.atime => time + * + * Returns the last access time (a <code>Time</code> object) + * for <i>file</i>, or epoch if <i>file</i> has not been accessed. + * + * File.new("testfile").atime #=> Wed Dec 31 18:00:00 CST 1969 + * + */ + +static VALUE +rb_file_atime(obj) + VALUE obj; +{ + OpenFile *fptr; + struct stat st; + + GetOpenFile(obj, fptr); + if (fstat(fileno(fptr->f), &st) == -1) { + rb_sys_fail(fptr->path); + } + return rb_time_new(st.st_atime, 0); +} + +/* + * call-seq: + * File.mtime(file_name) => time + * + * Returns the modification time for the named file as a Time object. + * + * File.mtime("testfile") #=> Tue Apr 08 12:58:04 CDT 2003 + * + */ + +static VALUE +rb_file_s_mtime(klass, fname) + VALUE klass, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) + rb_sys_fail(RSTRING(fname)->ptr); + return rb_time_new(st.st_mtime, 0); +} + +/* + * call-seq: + * file.mtime -> time + * + * Returns the modification time for <i>file</i>. + * + * File.new("testfile").mtime #=> Wed Apr 09 08:53:14 CDT 2003 + * + */ + +static VALUE +rb_file_mtime(obj) + VALUE obj; +{ + OpenFile *fptr; + struct stat st; + + GetOpenFile(obj, fptr); + if (fstat(fileno(fptr->f), &st) == -1) { + rb_sys_fail(fptr->path); + } + return rb_time_new(st.st_mtime, 0); +} + +/* + * call-seq: + * File.ctime(file_name) => time + * + * Returns the change time for the named file (the time at which + * directory information about the file was changed, not the file + * itself). + * + * File.ctime("testfile") #=> Wed Apr 09 08:53:13 CDT 2003 + * + */ + +static VALUE +rb_file_s_ctime(klass, fname) + VALUE klass, fname; +{ + struct stat st; + + if (rb_stat(fname, &st) < 0) + rb_sys_fail(RSTRING(fname)->ptr); + return rb_time_new(st.st_ctime, 0); +} + +/* + * call-seq: + * file.ctime -> time + * + * Returns the change time for <i>file</i> (that is, the time directory + * information about the file was changed, not the file itself). + * + * File.new("testfile").ctime #=> Wed Apr 09 08:53:14 CDT 2003 + * + */ + +static VALUE +rb_file_ctime(obj) + VALUE obj; +{ + OpenFile *fptr; + struct stat st; + + GetOpenFile(obj, fptr); + if (fstat(fileno(fptr->f), &st) == -1) { + rb_sys_fail(fptr->path); + } + return rb_time_new(st.st_ctime, 0); +} + +static void chmod_internal _((const char *, void *)); +static void +chmod_internal(path, mode) + const char *path; + void *mode; +{ + if (chmod(path, *(int *)mode) < 0) + rb_sys_fail(path); +} + +/* + * call-seq: + * File.chmod(mode_int, file_name, ... ) -> integer + * + * Changes permission bits on the named file(s) to the bit pattern + * represented by <i>mode_int</i>. Actual effects are operating system + * dependent (see the beginning of this section). On Unix systems, see + * <code>chmod(2)</code> for details. Returns the number of files + * processed. + * + * File.chmod(0644, "testfile", "out") #=> 2 + */ + +static VALUE +rb_file_s_chmod(argc, argv) + int argc; + VALUE *argv; +{ + VALUE vmode; + VALUE rest; + int mode; + long n; + + rb_secure(2); + rb_scan_args(argc, argv, "1*", &vmode, &rest); + mode = NUM2INT(vmode); + + n = apply2files(chmod_internal, rest, &mode); + return LONG2FIX(n); +} + +/* + * call-seq: + * file.chmod(mode_int) => 0 + * + * Changes permission bits on <i>file</i> to the bit pattern + * represented by <i>mode_int</i>. Actual effects are platform + * dependent; on Unix systems, see <code>chmod(2)</code> for details. + * Follows symbolic links. Also see <code>File#lchmod</code>. + * + * f = File.new("out", "w"); + * f.chmod(0644) #=> 0 + */ + +static VALUE +rb_file_chmod(obj, vmode) + VALUE obj, vmode; +{ + OpenFile *fptr; + int mode; + + rb_secure(2); + mode = NUM2INT(vmode); + + GetOpenFile(obj, fptr); +#ifdef HAVE_FCHMOD + if (fchmod(fileno(fptr->f), mode) == -1) + rb_sys_fail(fptr->path); +#else + if (!fptr->path) return Qnil; + if (chmod(fptr->path, mode) == -1) + rb_sys_fail(fptr->path); +#endif + + return INT2FIX(0); +} + +#if defined(HAVE_LCHMOD) +static void lchmod_internal _((const char *, void *)); +static void +lchmod_internal(path, mode) + const char *path; + void *mode; +{ + if (lchmod(path, (int)mode) < 0) + rb_sys_fail(path); +} + +/* + * call-seq: + * File.lchmod(mode_int, file_name, ...) => integer + * + * Equivalent to <code>File::chmod</code>, but does not follow symbolic + * links (so it will change the permissions associated with the link, + * not the file referenced by the link). Often not available. + * + */ + +static VALUE +rb_file_s_lchmod(argc, argv) + int argc; + VALUE *argv; +{ + VALUE vmode; + VALUE rest; + long mode, n; + + rb_secure(2); + rb_scan_args(argc, argv, "1*", &vmode, &rest); + mode = NUM2INT(vmode); + + n = apply2files(lchmod_internal, rest, (void *)(long)mode); + return LONG2FIX(n); +} +#else +static VALUE +rb_file_s_lchmod(argc, argv) + int argc; + VALUE *argv; +{ + rb_notimplement(); + return Qnil; /* not reached */ +} +#endif + +struct chown_args { + int owner, group; +}; + +static void chown_internal _((const char *, void *)); +static void +chown_internal(path, argp) + const char *path; + void *argp; +{ + struct chown_args *args = (struct chown_args *)argp; + if (chown(path, args->owner, args->group) < 0) + rb_sys_fail(path); +} + +/* + * call-seq: + * File.chown(owner_int, group_int, file_name,... ) -> integer + * + * Changes the owner and group of the named file(s) to the given + * numeric owner and group id's. Only a process with superuser + * privileges may change the owner of a file. The current owner of a + * file may change the file's group to any group to which the owner + * belongs. A <code>nil</code> or -1 owner or group id is ignored. + * Returns the number of files processed. + * + * File.chown(nil, 100, "testfile") + * + */ + +static VALUE +rb_file_s_chown(argc, argv) + int argc; + VALUE *argv; +{ + VALUE o, g, rest; + struct chown_args arg; + long n; + + rb_secure(2); + rb_scan_args(argc, argv, "2*", &o, &g, &rest); + if (NIL_P(o)) { + arg.owner = -1; + } + else { + arg.owner = NUM2INT(o); + } + if (NIL_P(g)) { + arg.group = -1; + } + else { + arg.group = NUM2INT(g); + } + + n = apply2files(chown_internal, rest, &arg); + return LONG2FIX(n); +} + +/* + * call-seq: + * file.chown(owner_int, group_int ) => 0 + * + * Changes the owner and group of <i>file</i> to the given numeric + * owner and group id's. Only a process with superuser privileges may + * change the owner of a file. The current owner of a file may change + * the file's group to any group to which the owner belongs. A + * <code>nil</code> or -1 owner or group id is ignored. Follows + * symbolic links. See also <code>File#lchown</code>. + * + * File.new("testfile").chown(502, 1000) + * + */ + +static VALUE +rb_file_chown(obj, owner, group) + VALUE obj, owner, group; +{ + OpenFile *fptr; + int o, g; + + rb_secure(2); + o = NIL_P(owner) ? -1 : NUM2INT(owner); + g = NIL_P(group) ? -1 : NUM2INT(group); + GetOpenFile(obj, fptr); +#if defined(DJGPP) || defined(__CYGWIN32__) || defined(_WIN32) || defined(__EMX__) + if (!fptr->path) return Qnil; + if (chown(fptr->path, o, g) == -1) + rb_sys_fail(fptr->path); +#else + if (fchown(fileno(fptr->f), o, g) == -1) + rb_sys_fail(fptr->path); +#endif + + return INT2FIX(0); +} + +#if defined(HAVE_LCHOWN) && !defined(__CHECKER__) +static void lchown_internal _((const char *, void *)); +static void +lchown_internal(path, argp) + const char *path; + void *argp; +{ + struct chown_args *args = (struct chown_args *)argp; + if (lchown(path, args->owner, args->group) < 0) + rb_sys_fail(path); +} + +/* + * call-seq: + * file.lchown(owner_int, group_int, file_name,..) => integer + * + * Equivalent to <code>File::chown</code>, but does not follow symbolic + * links (so it will change the owner associated with the link, not the + * file referenced by the link). Often not available. Returns number + * of files in the argument list. + * + */ + +static VALUE +rb_file_s_lchown(argc, argv) + int argc; + VALUE *argv; +{ + VALUE o, g, rest; + struct chown_args arg; + long n; + + rb_secure(2); + rb_scan_args(argc, argv, "2*", &o, &g, &rest); + if (NIL_P(o)) { + arg.owner = -1; + } + else { + arg.owner = NUM2INT(o); + } + if (NIL_P(g)) { + arg.group = -1; + } + else { + arg.group = NUM2INT(g); + } + + n = apply2files(lchown_internal, rest, &arg); + return LONG2FIX(n); +} +#else +static VALUE +rb_file_s_lchown(argc, argv) + int argc; + VALUE *argv; +{ + rb_notimplement(); +} +#endif + +struct timeval rb_time_timeval(); + +static void utime_internal _((const char *, void *)); + +#if defined(HAVE_UTIMES) && !defined(__CHECKER__) + +static void +utime_internal(path, arg) + const char *path; + void *arg; +{ + struct timeval *tvp = arg; + if (utimes(path, tvp) < 0) + rb_sys_fail(path); +} + +/* + * call-seq: + * File.utime(atime, mtime, file_name,...) => integer + * + * Sets the access and modification times of each + * named file to the first two arguments. Returns + * the number of file names in the argument list. + */ + +static VALUE +rb_file_s_utime(argc, argv) + int argc; + VALUE *argv; +{ + VALUE atime, mtime, rest; + struct timeval tvs[2], *tvp = NULL; + long n; + + rb_scan_args(argc, argv, "2*", &atime, &mtime, &rest); + + if (!NIL_P(atime) || !NIL_P(mtime)) { + tvp = tvs; + tvp[0] = rb_time_timeval(atime); + tvp[1] = rb_time_timeval(mtime); + } + + n = apply2files(utime_internal, rest, tvp); + return LONG2FIX(n); +} + +#else + +#if !defined HAVE_UTIME_H && !defined HAVE_SYS_UTIME_H +struct utimbuf { + long actime; + long modtime; +}; +#endif + +static void +utime_internal(path, arg) + const char *path; + void *arg; +{ + struct utimbuf *utp = arg; + if (utime(path, utp) < 0) + rb_sys_fail(path); +} + +static VALUE +rb_file_s_utime(argc, argv) + int argc; + VALUE *argv; +{ + VALUE atime, mtime, rest; + long n; + struct timeval tv; + struct utimbuf utbuf, *utp = NULL; + + rb_scan_args(argc, argv, "2*", &atime, &mtime, &rest); + + if (!NIL_P(atime) || !NIL_P(mtime)) { + utp = &utbuf; + tv = rb_time_timeval(atime); + utp->actime = tv.tv_sec; + tv = rb_time_timeval(mtime); + utp->modtime = tv.tv_sec; + } + + n = apply2files(utime_internal, rest, utp); + return LONG2FIX(n); +} + +#endif + +NORETURN(static void sys_fail2 _((VALUE,VALUE))); +static void +sys_fail2(s1, s2) + VALUE s1, s2; +{ + char *buf; + int len; + + len = RSTRING(s1)->len + RSTRING(s2)->len + 5; + buf = ALLOCA_N(char, len); + snprintf(buf, len, "%s or %s", RSTRING(s1)->ptr, RSTRING(s2)->ptr); + rb_sys_fail(buf); +} + +/* + * call-seq: + * File.link(old_name, new_name) => 0 + * + * Creates a new name for an existing file using a hard link. Will not + * overwrite <i>new_name</i> if it already exists (raising a subclass + * of <code>SystemCallError</code>). Not available on all platforms. + * + * File.link("testfile", ".testfile") #=> 0 + * IO.readlines(".testfile")[0] #=> "This is line one\n" + */ + +static VALUE +rb_file_s_link(klass, from, to) + VALUE klass, from, to; +{ +#ifdef HAVE_LINK + SafeStringValue(from); + SafeStringValue(to); + + if (link(StringValueCStr(from), StringValueCStr(to)) < 0) { + sys_fail2(from, to); + } + return INT2FIX(0); +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + +/* + * call-seq: + * File.symlink(old_name, new_name) => 0 + * + * Creates a symbolic link called <i>new_name</i> for the existing file + * <i>old_name</i>. Raises a <code>NotImplemented</code> exception on + * platforms that do not support symbolic links. + * + * File.symlink("testfile", "link2test") #=> 0 + * + */ + +static VALUE +rb_file_s_symlink(klass, from, to) + VALUE klass, from, to; +{ +#ifdef HAVE_SYMLINK + SafeStringValue(from); + SafeStringValue(to); + + if (symlink(StringValueCStr(from), StringValueCStr(to)) < 0) { + sys_fail2(from, to); + } + return INT2FIX(0); +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + +/* + * call-seq: + * File.readlink(link_name) -> file_name + * + * Returns the name of the file referenced by the given link. + * Not available on all platforms. + * + * File.symlink("testfile", "link2test") #=> 0 + * File.readlink("link2test") #=> "testfile" + */ + +static VALUE +rb_file_s_readlink(klass, path) + VALUE klass, path; +{ +#ifdef HAVE_READLINK + char *buf; + int size = 100; + int rv; + VALUE v; + + SafeStringValue(path); + buf = xmalloc(size); + while ((rv = readlink(RSTRING(path)->ptr, buf, size)) == size +#ifdef _AIX + || (rv < 0 && errno == ERANGE) /* quirky behavior of GPFS */ +#endif + ) { + size *= 2; + buf = xrealloc(buf, size); + } + if (rv < 0) { + free(buf); + rb_sys_fail(RSTRING(path)->ptr); + } + v = rb_tainted_str_new(buf, rv); + free(buf); + + return v; +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + +static void unlink_internal _((const char *, void *)); +static void +unlink_internal(path, arg) + const char *path; + void *arg; +{ + if (unlink(path) < 0) + rb_sys_fail(path); +} + +/* + * call-seq: + * File.delete(file_name, ...) => integer + * File.unlink(file_name, ...) => integer + * + * Deletes the named files, returning the number of names + * passed as arguments. Raises an exception on any error. + * See also <code>Dir::rmdir</code>. + */ + +static VALUE +rb_file_s_unlink(klass, args) + VALUE klass, args; +{ + long n; + + rb_secure(2); + n = apply2files(unlink_internal, args, 0); + return LONG2FIX(n); +} + +/* + * call-seq: + * File.rename(old_name, new_name) => 0 + * + * Renames the given file to the new name. Raises a + * <code>SystemCallError</code> if the file cannot be renamed. + * + * File.rename("afile", "afile.bak") #=> 0 + */ + +static VALUE +rb_file_s_rename(klass, from, to) + VALUE klass, from, to; +{ + const char *src, *dst; + SafeStringValue(from); + SafeStringValue(to); + + src = StringValueCStr(from); + dst = StringValueCStr(to); +#if defined __CYGWIN__ + errno = 0; +#endif + if (rename(src, dst) < 0) { +#if defined DOSISH && !defined _WIN32 + switch (errno) { + case EEXIST: +#if defined (__EMX__) + case EACCES: +#endif + if (chmod(dst, 0666) == 0 && + unlink(dst) == 0 && + rename(src, dst) == 0) + return INT2FIX(0); + } +#endif + sys_fail2(from, to); + } + + return INT2FIX(0); +} + +/* + * call-seq: + * File.umask() => integer + * File.umask(integer) => integer + * + * Returns the current umask value for this process. If the optional + * argument is given, set the umask to that value and return the + * previous value. Umask values are <em>subtracted</em> from the + * default permissions, so a umask of <code>0222</code> would make a + * file read-only for everyone. + * + * File.umask(0006) #=> 18 + * File.umask #=> 6 + */ + +static VALUE +rb_file_s_umask(argc, argv) + int argc; + VALUE *argv; +{ + int omask = 0; + + rb_secure(2); + if (argc == 0) { + omask = umask(0); + umask(omask); + } + else if (argc == 1) { + omask = umask(NUM2INT(argv[0])); + } + else { + rb_raise(rb_eArgError, "wrong number of arguments"); + } + return INT2FIX(omask); +} + +#ifdef __CYGWIN__ +#undef DOSISH +#endif +#if defined __CYGWIN__ || defined DOSISH +#define DOSISH_UNC +#define DOSISH_DRIVE_LETTER +#define isdirsep(x) ((x) == '/' || (x) == '\\') +#else +#define isdirsep(x) ((x) == '/') +#endif + +#if defined _WIN32 || defined __CYGWIN__ +#define USE_NTFS 1 +#else +#define USE_NTFS 0 +#endif + +#if USE_NTFS +#define istrailinggabage(x) ((x) == '.' || (x) == ' ') +#else +#define istrailinggabage(x) 0 +#endif + +#ifndef CharNext /* defined as CharNext[AW] on Windows. */ +# if defined(DJGPP) +# define CharNext(p) ((p) + mblen(p, MB_CUR_MAX)) +# else +# define CharNext(p) ((p) + 1) +# endif +#endif + +#ifdef DOSISH_DRIVE_LETTER +static inline int +has_drive_letter(buf) + const char *buf; +{ + if (ISALPHA(buf[0]) && buf[1] == ':') { + return 1; + } + else { + return 0; + } +} + +static char* +getcwdofdrv(drv) + int drv; +{ + char drive[4]; + char *drvcwd, *oldcwd; + + drive[0] = drv; + drive[1] = ':'; + drive[2] = '\0'; + + /* the only way that I know to get the current directory + of a particular drive is to change chdir() to that drive, + so save the old cwd before chdir() + */ + oldcwd = my_getcwd(); + if (chdir(drive) == 0) { + drvcwd = my_getcwd(); + chdir(oldcwd); + free(oldcwd); + } + else { + /* perhaps the drive is not exist. we return only drive letter */ + drvcwd = strdup(drive); + } + return drvcwd; +} +#endif + +static inline char * +skiproot(path) + const char *path; +{ +#ifdef DOSISH_DRIVE_LETTER + if (has_drive_letter(path)) path += 2; +#endif + while (isdirsep(*path)) path++; + return (char *)path; +} + +#define nextdirsep rb_path_next +char * +rb_path_next(s) + const char *s; +{ + while (*s && !isdirsep(*s)) { + s = CharNext(s); + } + return (char *)s; +} + +#if defined(DOSISH_UNC) || defined(DOSISH_DRIVE_LETTER) +#define skipprefix rb_path_skip_prefix +#else +#define skipprefix(path) (path) +#endif +char * +rb_path_skip_prefix(path) + const char *path; +{ +#if defined(DOSISH_UNC) || defined(DOSISH_DRIVE_LETTER) +#ifdef DOSISH_UNC + if (isdirsep(path[0]) && isdirsep(path[1])) { + path += 2; + while (isdirsep(*path)) path++; + if (*(path = nextdirsep(path)) && path[1] && !isdirsep(path[1])) + path = nextdirsep(path + 1); + return (char *)path; + } +#endif +#ifdef DOSISH_DRIVE_LETTER + if (has_drive_letter(path)) + return (char *)(path + 2); +#endif +#endif + return (char *)path; +} + +#define strrdirsep rb_path_last_separator +char * +rb_path_last_separator(path) + const char *path; +{ + char *last = NULL; + while (*path) { + if (isdirsep(*path)) { + const char *tmp = path++; + while (isdirsep(*path)) path++; + if (!*path) break; + last = (char *)tmp; + } + else { + path = CharNext(path); + } + } + return last; +} + +static char * +chompdirsep(path) + const char *path; +{ + while (*path) { + if (isdirsep(*path)) { + const char *last = path++; + while (isdirsep(*path)) path++; + if (!*path) return (char *)last; + } + else { + path = CharNext(path); + } + } + return (char *)path; +} + +char * +rb_path_end(path) + const char *path; +{ + if (isdirsep(*path)) path++; + return chompdirsep(path); +} + +#if USE_NTFS +static char * +ntfs_tail(const char *path) +{ + while (*path == '.') path++; + while (*path && *path != ':') { + if (istrailinggabage(*path)) { + const char *last = path++; + while (istrailinggabage(*path)) path++; + if (!*path || *path == ':') return (char *)last; + } + else if (isdirsep(*path)) { + const char *last = path++; + while (isdirsep(*path)) path++; + if (!*path) return (char *)last; + if (*path == ':') path++; + } + else { + path = CharNext(path); + } + } + return (char *)path; +} +#endif + +#define BUFCHECK(cond) do {\ + long bdiff = p - buf;\ + if (cond) {\ + do {buflen *= 2;} while (cond);\ + rb_str_resize(result, buflen);\ + buf = RSTRING(result)->ptr;\ + p = buf + bdiff;\ + pend = buf + buflen;\ + }\ +} while (0) + +#define BUFINIT() (\ + p = buf = RSTRING(result)->ptr,\ + buflen = RSTRING(result)->len,\ + pend = p + buflen) + +#if !defined(TOLOWER) +#define TOLOWER(c) (ISUPPER(c) ? tolower(c) : (c)) +#endif + +static int is_absolute_path _((const char*)); + +static VALUE +file_expand_path(fname, dname, result) + VALUE fname, dname, result; +{ + const char *s, *b; + char *buf, *p, *pend, *root; + long buflen, dirlen; + int tainted; + + s = StringValuePtr(fname); + BUFINIT(); + tainted = OBJ_TAINTED(fname); + + if (s[0] == '~') { + if (isdirsep(s[1]) || s[1] == '\0') { + char *dir = getenv("HOME"); + + if (!dir) { + rb_raise(rb_eArgError, "couldn't find HOME environment -- expanding `%s'", s); + } + dirlen = strlen(dir); + BUFCHECK(dirlen > buflen); + strcpy(buf, dir); +#if defined DOSISH || defined __CYGWIN__ + for (p = buf; *p; p = CharNext(p)) { + if (*p == '\\') { + *p = '/'; + } + } +#else + p = buf + strlen(dir); +#endif + s++; + tainted = 1; + } + else { +#ifdef HAVE_PWD_H + struct passwd *pwPtr; + s++; +#endif + s = nextdirsep(b = s); + BUFCHECK(bdiff + (s-b) >= buflen); + memcpy(p, b, s-b); + p += s-b; + *p = '\0'; +#ifdef HAVE_PWD_H + pwPtr = getpwnam(buf); + if (!pwPtr) { + endpwent(); + rb_raise(rb_eArgError, "user %s doesn't exist", buf); + } + dirlen = strlen(pwPtr->pw_dir); + BUFCHECK(dirlen > buflen); + strcpy(buf, pwPtr->pw_dir); + p = buf + strlen(pwPtr->pw_dir); + endpwent(); +#endif + } + } +#ifdef DOSISH_DRIVE_LETTER + /* skip drive letter */ + else if (has_drive_letter(s)) { + if (isdirsep(s[2])) { + /* specified drive letter, and full path */ + /* skip drive letter */ + BUFCHECK(bdiff + 2 >= buflen); + memcpy(p, s, 2); + p += 2; + s += 2; + } + else { + /* specified drive, but not full path */ + int same = 0; + if (!NIL_P(dname)) { + file_expand_path(dname, Qnil, result); + BUFINIT(); + if (has_drive_letter(p) && TOLOWER(p[0]) == TOLOWER(s[0])) { + /* ok, same drive */ + same = 1; + } + } + if (!same) { + char *dir = getcwdofdrv(*s); + + tainted = 1; + dirlen = strlen(dir); + BUFCHECK(dirlen > buflen); + strcpy(buf, dir); + free(dir); + } + p = chompdirsep(skiproot(buf)); + s += 2; + } + } +#endif + else if (!is_absolute_path(s)) { + if (!NIL_P(dname)) { + file_expand_path(dname, Qnil, result); + BUFINIT(); + } + else { + char *dir = my_getcwd(); + + tainted = 1; + dirlen = strlen(dir); + BUFCHECK(dirlen > buflen); + strcpy(buf, dir); + free(dir); + } +#if defined DOSISH || defined __CYGWIN__ + if (isdirsep(*s)) { + /* specified full path, but not drive letter nor UNC */ + /* we need to get the drive letter or UNC share name */ + p = skipprefix(buf); + } + else +#endif + p = chompdirsep(skiproot(buf)); + } + else { + b = s; + do s++; while (isdirsep(*s)); + p = buf + (s - b); + BUFCHECK(bdiff >= buflen); + memset(buf, '/', p - buf); + } + if (p > buf && p[-1] == '/') + --p; + else + *p = '/'; + + p[1] = 0; + root = skipprefix(buf); + + b = s; + while (*s) { + switch (*s) { + case '.': + if (b == s++) { /* beginning of path element */ + switch (*s) { + case '\0': + b = s; + break; + case '.': + if (*(s+1) == '\0' || isdirsep(*(s+1))) { + /* We must go back to the parent */ + char *n; + *p = '\0'; + if (!(n = strrdirsep(root))) { + *p = '/'; + } + else { + p = n; + } + b = ++s; + } +#if USE_NTFS + else { + do *++s; while (istrailinggabage(*s)); + } +#endif + break; + case '/': +#if defined DOSISH || defined __CYGWIN__ + case '\\': +#endif + b = ++s; + break; + default: + /* ordinary path element, beginning don't move */ + break; + } + } +#if USE_NTFS + else { + --s; + case ' ': { + const char *e = s; + while (istrailinggabage(*s)) s++; + if (!*s) { + s = e; + goto endpath; + } + } + } +#endif + break; + case '/': +#if defined DOSISH || defined __CYGWIN__ + case '\\': +#endif + if (s > b) { + long rootdiff = root - buf; + BUFCHECK(bdiff + (s-b+1) >= buflen); + root = buf + rootdiff; + memcpy(++p, b, s-b); + p += s-b; + *p = '/'; + } + b = ++s; + break; + default: + s = CharNext(s); + break; + } + } + + if (s > b) { +#if USE_NTFS + endpath: + if (s > b + 6 && strncasecmp(s - 6, ":$DATA", 6) == 0) { + /* alias of stream */ + /* get rid of a bug of x64 VC++ */ + if (*(s-7) == ':') s -= 7; /* prime */ + else if (memchr(b, ':', s - 6 - b)) s -= 6; /* alternative */ + } +#endif + BUFCHECK(bdiff + (s-b) >= buflen); + memcpy(++p, b, s-b); + p += s-b; + } + if (p == skiproot(buf) - 1) p++; + +#if USE_NTFS + *p = '\0'; + if ((s = strrdirsep(b = buf)) != 0 && !strpbrk(s, "*?")) { + size_t len; + WIN32_FIND_DATA wfd; +#ifdef __CYGWIN__ + int lnk_added = 0, is_symlink = 0; + struct stat st; + char w32buf[MAXPATHLEN]; + p = (char *)s; + if (lstat(buf, &st) == 0 && S_ISLNK(st.st_mode)) { + is_symlink = 1; + *p = '\0'; + } + if (cygwin_conv_to_win32_path((*buf ? buf : "/"), w32buf) == 0) { + b = w32buf; + } + if (is_symlink && b == w32buf) { + *p = '\\'; + strlcat(w32buf, p, sizeof(w32buf)); + len = strlen(p); + if (len > 4 && strcasecmp(p + len - 4, ".lnk") != 0) { + lnk_added = 1; + strlcat(w32buf, ".lnk", sizeof(w32buf)); + } + } + *p = '/'; +#endif + HANDLE h = FindFirstFile(b, &wfd); + if (h != INVALID_HANDLE_VALUE) { + FindClose(h); + len = strlen(wfd.cFileName); +#ifdef __CYGWIN__ + if (lnk_added && len > 4 && + strcasecmp(wfd.cFileName + len - 4, ".lnk") == 0) { + wfd.cFileName[len -= 4] = '\0'; + } +#else + p = (char *)s; +#endif + ++p; + BUFCHECK(bdiff + len >= buflen); + memcpy(p, wfd.cFileName, len + 1); + p += len; + } +#ifdef __CYGWIN__ + else { + p += strlen(p); + } +#endif + } +#endif + + if (tainted) OBJ_TAINT(result); + RSTRING(result)->len = p - buf; + RSTRING(result)->ptr[p - buf] = '\0'; + return result; +} + +VALUE +rb_file_expand_path(fname, dname) + VALUE fname, dname; +{ + return file_expand_path(fname, dname, rb_str_new(0, MAXPATHLEN + 2)); +} + +/* + * call-seq: + * File.expand_path(file_name [, dir_string] ) -> abs_file_name + * + * Converts a pathname to an absolute pathname. Relative paths are + * referenced from the current working directory of the process unless + * <i>dir_string</i> is given, in which case it will be used as the + * starting point. The given pathname may start with a + * ``<code>~</code>'', which expands to the process owner's home + * directory (the environment variable <code>HOME</code> must be set + * correctly). ``<code>~</code><i>user</i>'' expands to the named + * user's home directory. + * + * File.expand_path("~oracle/bin") #=> "/home/oracle/bin" + * File.expand_path("../../bin", "/tmp/x") #=> "/bin" + */ + +VALUE +rb_file_s_expand_path(argc, argv) + int argc; + VALUE *argv; +{ + VALUE fname, dname; + + if (argc == 1) { + return rb_file_expand_path(argv[0], Qnil); + } + rb_scan_args(argc, argv, "11", &fname, &dname); + + return rb_file_expand_path(fname, dname); +} + +static int +rmext(p, l1, e) + const char *p, *e; + int l1; +{ + int l2; + + if (!e) return 0; + + l2 = strlen(e); + if (l2 == 2 && e[1] == '*') { + unsigned char c = *e; + e = p + l1; + do { + if (e <= p) return 0; + } while (*--e != c); + return e - p; + } + if (l1 < l2) return l1; + +#if CASEFOLD_FILESYSTEM +#define fncomp strncasecmp +#else +#define fncomp strncmp +#endif + if (fncomp(p+l1-l2, e, l2) == 0) { + return l1-l2; + } + return 0; +} + +/* + * call-seq: + * File.basename(file_name [, suffix] ) -> base_name + * + * Returns the last component of the filename given in <i>file_name</i>, + * which must be formed using forward slashes (``<code>/</code>'') + * regardless of the separator used on the local file system. If + * <i>suffix</i> is given and present at the end of <i>file_name</i>, + * it is removed. + * + * File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" + * File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby" + */ + +static VALUE +rb_file_s_basename(argc, argv) + int argc; + VALUE *argv; +{ + VALUE fname, fext, basename; + char *name, *p; +#if defined DOSISH_DRIVE_LETTER || defined DOSISH_UNC + char *root; +#endif + int f, n; + + if (rb_scan_args(argc, argv, "11", &fname, &fext) == 2) { + StringValue(fext); + } + StringValue(fname); + if (RSTRING(fname)->len == 0 || !*(name = RSTRING(fname)->ptr)) + return fname; + name = skipprefix(name); +#if defined DOSISH_DRIVE_LETTER || defined DOSISH_UNC + root = name; +#endif + while (isdirsep(*name)) + name++; + if (!*name) { + p = name - 1; + f = 1; +#if defined DOSISH_DRIVE_LETTER || defined DOSISH_UNC + if (name != root) { + /* has slashes */ + } +#ifdef DOSISH_DRIVE_LETTER + else if (*p == ':') { + p++; + f = 0; + } +#endif +#ifdef DOSISH_UNC + else { + p = "/"; + } +#endif +#endif + } + else { + if (!(p = strrdirsep(name))) { + p = name; + } + else { + while (isdirsep(*p)) p++; /* skip last / */ + } +#if USE_NTFS + n = ntfs_tail(p) - p; +#else + n = chompdirsep(p) - p; +#endif + if (NIL_P(fext) || !(f = rmext(p, n, StringValueCStr(fext)))) { + f = n; + } + if (f == RSTRING_LEN(fname)) return fname; + } + basename = rb_str_new(p, f); + OBJ_INFECT(basename, fname); + return basename; +} + +/* + * call-seq: + * File.dirname(file_name ) -> dir_name + * + * Returns all components of the filename given in <i>file_name</i> + * except the last one. The filename must be formed using forward + * slashes (``<code>/</code>'') regardless of the separator used on the + * local file system. + * + * File.dirname("/home/gumby/work/ruby.rb") #=> "/home/gumby/work" + */ + +static VALUE +rb_file_s_dirname(klass, fname) + VALUE klass, fname; +{ + const char *name, *root, *p; + VALUE dirname; + + name = StringValueCStr(fname); + root = skiproot(name); +#ifdef DOSISH_UNC + if (root > name + 1 && isdirsep(*name)) + root = skipprefix(name = root - 2); +#else + if (root > name + 1) + name = root - 1; +#endif + p = strrdirsep(root); + if (!p) { + p = root; + } + if (p == name) + return rb_str_new2("."); +#ifdef DOSISH_DRIVE_LETTER + if (has_drive_letter(name) && isdirsep(*(name + 2))) { + const char *top = skiproot(name + 2); + dirname = rb_str_new(name, 3); + rb_str_cat(dirname, top, p - top); + } + else +#endif + dirname = rb_str_new(name, p - name); +#ifdef DOSISH_DRIVE_LETTER + if (has_drive_letter(name) && root == name + 2 && p - name == 2) + rb_str_cat(dirname, ".", 1); +#endif + OBJ_INFECT(dirname, fname); + return dirname; +} + +/* + * call-seq: + * File.extname(path) -> string + * + * Returns the extension (the portion of file name in <i>path</i> + * after the period). + * + * File.extname("test.rb") #=> ".rb" + * File.extname("a/b/d/test.rb") #=> ".rb" + * File.extname("test") #=> "" + * File.extname(".profile") #=> "" + * + */ + +static VALUE +rb_file_s_extname(klass, fname) + VALUE klass, fname; +{ + const char *name, *p, *e; + VALUE extname; + + name = StringValueCStr(fname); + p = strrdirsep(name); /* get the last path component */ + if (!p) + p = name; + else + name = ++p; + + e = 0; + while (*p) { + if (*p == '.' || istrailinggabage(*p)) { +#if USE_NTFS + const char *last = p++, *dot = last; + while (istrailinggabage(*p)) { + if (*p == '.') dot = p; + p++; + } + if (!*p || *p == ':') { + p = last; + break; + } + if (*last == '.' || dot > last) e = dot; + continue; +#else + e = p; /* get the last dot of the last component */ +#endif + } +#if USE_NTFS + else if (*p == ':') { + break; + } +#endif + else if (isdirsep(*p)) + break; + p = CharNext(p); + } + if (!e || e == name || e+1 == p) /* no dot, or the only dot is first or end? */ + return rb_str_new(0, 0); + extname = rb_str_new(e, p - e); /* keep the dot, too! */ + OBJ_INFECT(extname, fname); + return extname; +} + +/* + * call-seq: + * File.split(file_name) => array + * + * Splits the given string into a directory and a file component and + * returns them in a two-element array. See also + * <code>File::dirname</code> and <code>File::basename</code>. + * + * File.split("/home/gumby/.profile") #=> ["/home/gumby", ".profile"] + */ + +static VALUE +rb_file_s_split(klass, path) + VALUE klass, path; +{ + StringValue(path); /* get rid of converting twice */ + return rb_assoc_new(rb_file_s_dirname(Qnil, path), rb_file_s_basename(1,&path)); +} + +static VALUE separator; + +static VALUE rb_file_join _((VALUE ary, VALUE sep)); + +static VALUE +file_inspect_join(ary, arg) + VALUE ary; + VALUE *arg; +{ + return rb_file_join(arg[0], arg[1]); +} + +static VALUE +rb_file_join(ary, sep) + VALUE ary, sep; +{ + long len, i; + int taint = 0; + VALUE result, tmp; + char *name, *tail; + + if (RARRAY(ary)->len == 0) return rb_str_new(0, 0); + if (OBJ_TAINTED(ary)) taint = 1; + if (OBJ_TAINTED(sep)) taint = 1; + + len = 1; + for (i=0; i<RARRAY(ary)->len; i++) { + if (TYPE(RARRAY(ary)->ptr[i]) == T_STRING) { + len += RSTRING(RARRAY(ary)->ptr[i])->len; + } + else { + len += 10; + } + } + if (!NIL_P(sep) && TYPE(sep) == T_STRING) { + len += RSTRING(sep)->len * RARRAY(ary)->len - 1; + } + result = rb_str_buf_new(len); + for (i=0; i<RARRAY(ary)->len; i++) { + tmp = RARRAY(ary)->ptr[i]; + switch (TYPE(tmp)) { + case T_STRING: + break; + case T_ARRAY: + if (rb_inspecting_p(tmp)) { + tmp = rb_str_new2("[...]"); + } + else { + VALUE args[2]; + + args[0] = tmp; + args[1] = sep; + tmp = rb_protect_inspect(file_inspect_join, ary, (VALUE)args); + } + break; + default: + StringValueCStr(tmp); + } + name = StringValueCStr(result); + if (i > 0 && !NIL_P(sep)) { + tail = chompdirsep(name); + if (RSTRING(tmp)->ptr && isdirsep(RSTRING(tmp)->ptr[0])) { + RSTRING(result)->len = tail - name; + } + else if (!*tail) { + rb_str_buf_append(result, sep); + } + } + rb_str_buf_append(result, tmp); + if (OBJ_TAINTED(tmp)) taint = 1; + } + + if (taint) OBJ_TAINT(result); + return result; +} + +/* + * call-seq: + * File.join(string, ...) -> path + * + * Returns a new string formed by joining the strings using + * <code>File::SEPARATOR</code>. + * + * File.join("usr", "mail", "gumby") #=> "usr/mail/gumby" + * + */ + +static VALUE +rb_file_s_join(klass, args) + VALUE klass, args; +{ + return rb_file_join(args, separator); +} + +/* + * call-seq: + * File.truncate(file_name, integer) => 0 + * + * Truncates the file <i>file_name</i> to be at most <i>integer</i> + * bytes long. Not available on all platforms. + * + * f = File.new("out", "w") + * f.write("1234567890") #=> 10 + * f.close #=> nil + * File.truncate("out", 5) #=> 0 + * File.size("out") #=> 5 + * + */ + +static VALUE +rb_file_s_truncate(klass, path, len) + VALUE klass, path, len; +{ + off_t pos; + + rb_secure(2); + pos = NUM2OFFT(len); + SafeStringValue(path); + +#ifdef HAVE_TRUNCATE + if (truncate(StringValueCStr(path), pos) < 0) + rb_sys_fail(RSTRING(path)->ptr); +#else +# ifdef HAVE_CHSIZE + { + int tmpfd; + +# ifdef _WIN32 + if ((tmpfd = open(StringValueCStr(path), O_RDWR)) < 0) { + rb_sys_fail(RSTRING(path)->ptr); + } +# else + if ((tmpfd = open(StringValueCStr(path), 0)) < 0) { + rb_sys_fail(RSTRING(path)->ptr); + } +# endif + if (chsize(tmpfd, pos) < 0) { + close(tmpfd); + rb_sys_fail(RSTRING(path)->ptr); + } + close(tmpfd); + } +# else + rb_notimplement(); +# endif +#endif + return INT2FIX(0); +} + +/* + * call-seq: + * file.truncate(integer) => 0 + * + * Truncates <i>file</i> to at most <i>integer</i> bytes. The file + * must be opened for writing. Not available on all platforms. + * + * f = File.new("out", "w") + * f.syswrite("1234567890") #=> 10 + * f.truncate(5) #=> 0 + * f.close() #=> nil + * File.size("out") #=> 5 + */ + +static VALUE +rb_file_truncate(obj, len) + VALUE obj, len; +{ + OpenFile *fptr; + FILE *f; + off_t pos; + + rb_secure(2); + pos = NUM2OFFT(len); + GetOpenFile(obj, fptr); + if (!(fptr->mode & FMODE_WRITABLE)) { + rb_raise(rb_eIOError, "not opened for writing"); + } + f = GetWriteFile(fptr); + fflush(f); + fseeko(f, (off_t)0, SEEK_CUR); +#ifdef HAVE_FTRUNCATE + if (ftruncate(fileno(f), pos) < 0) + rb_sys_fail(fptr->path); +#else +# ifdef HAVE_CHSIZE + if (chsize(fileno(f), pos) < 0) + rb_sys_fail(fptr->path); +# else + rb_notimplement(); +# endif +#endif + return INT2FIX(0); +} + +# ifndef LOCK_SH +# define LOCK_SH 1 +# endif +# ifndef LOCK_EX +# define LOCK_EX 2 +# endif +# ifndef LOCK_NB +# define LOCK_NB 4 +# endif +# ifndef LOCK_UN +# define LOCK_UN 8 +# endif + +#ifdef __CYGWIN__ +#include <winerror.h> +extern unsigned long __attribute__((stdcall)) GetLastError(void); + +static int +cygwin_flock(int fd, int op) +{ + int old_errno = errno; + int ret = flock(fd, op); + if (GetLastError() == ERROR_NOT_LOCKED) { + ret = 0; + errno = old_errno; + } + return ret; +} +# define flock(fd, op) cygwin_flock(fd, op) +#endif + +static int +rb_thread_flock(fd, op, fptr) + int fd, op; + OpenFile *fptr; +{ + if (rb_thread_alone() || (op & LOCK_NB)) { + int ret; + TRAP_BEG; + ret = flock(fd, op); + TRAP_END; + return ret; + } + op |= LOCK_NB; + while (flock(fd, op) < 0) { + switch (errno) { + case EAGAIN: + case EACCES: +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif + rb_thread_polling(); /* busy wait */ + rb_io_check_closed(fptr); + continue; + default: + return -1; + } + } + return 0; +} +#ifdef __CYGWIN__ +# undef flock +#endif +#define flock(fd, op) rb_thread_flock(fd, op, fptr) + +/* + * call-seq: + * file.flock (locking_constant ) => 0 or false + * + * Locks or unlocks a file according to <i>locking_constant</i> (a + * logical <em>or</em> of the values in the table below). + * Returns <code>false</code> if <code>File::LOCK_NB</code> is + * specified and the operation would otherwise have blocked. Not + * available on all platforms. + * + * Locking constants (in class File): + * + * LOCK_EX | Exclusive lock. Only one process may hold an + * | exclusive lock for a given file at a time. + * ----------+------------------------------------------------ + * LOCK_NB | Don't block when locking. May be combined + * | with other lock options using logical or. + * ----------+------------------------------------------------ + * LOCK_SH | Shared lock. Multiple processes may each hold a + * | shared lock for a given file at the same time. + * ----------+------------------------------------------------ + * LOCK_UN | Unlock. + * + * Example: + * + * File.new("testfile").flock(File::LOCK_UN) #=> 0 + * + */ + +static VALUE +rb_file_flock(obj, operation) + VALUE obj; + VALUE operation; +{ +#ifndef __CHECKER__ + OpenFile *fptr; + int op; + + rb_secure(2); + op = NUM2INT(operation); + GetOpenFile(obj, fptr); + + if (fptr->mode & FMODE_WRITABLE) { + fflush(GetWriteFile(fptr)); + } + retry: + if (flock(fileno(fptr->f), op) < 0) { + switch (errno) { + case EAGAIN: + case EACCES: +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif + return Qfalse; + case EINTR: +#if defined(ERESTART) + case ERESTART: +#endif + goto retry; + } + rb_sys_fail(fptr->path); + } +#endif + return INT2FIX(0); +} +#undef flock + +static void +test_check(n, argc, argv) + int n, argc; + VALUE *argv; +{ + int i; + + n+=1; + if (n != argc) rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, n); + for (i=1; i<n; i++) { + switch (TYPE(argv[i])) { + case T_STRING: + default: + SafeStringValue(argv[i]); + break; + case T_FILE: + break; + } + } +} + +#define CHECK(n) test_check((n), argc, argv) + +/* + * call-seq: + * test(int_cmd, file1 [, file2] ) => obj + * + * Uses the integer <i>aCmd</i> to perform various tests on + * <i>file1</i> (first table below) or on <i>file1</i> and + * <i>file2</i> (second table). + * + * File tests on a single file: + * + * Test Returns Meaning + * ?A | Time | Last access time for file1 + * ?b | boolean | True if file1 is a block device + * ?c | boolean | True if file1 is a character device + * ?C | Time | Last change time for file1 + * ?d | boolean | True if file1 exists and is a directory + * ?e | boolean | True if file1 exists + * ?f | boolean | True if file1 exists and is a regular file + * ?g | boolean | True if file1 has the \CF{setgid} bit + * | | set (false under NT) + * ?G | boolean | True if file1 exists and has a group + * | | ownership equal to the caller's group + * ?k | boolean | True if file1 exists and has the sticky bit set + * ?l | boolean | True if file1 exists and is a symbolic link + * ?M | Time | Last modification time for file1 + * ?o | boolean | True if file1 exists and is owned by + * | | the caller's effective uid + * ?O | boolean | True if file1 exists and is owned by + * | | the caller's real uid + * ?p | boolean | True if file1 exists and is a fifo + * ?r | boolean | True if file1 is readable by the effective + * | | uid/gid of the caller + * ?R | boolean | True if file is readable by the real + * | | uid/gid of the caller + * ?s | int/nil | If file1 has nonzero size, return the size, + * | | otherwise return nil + * ?S | boolean | True if file1 exists and is a socket + * ?u | boolean | True if file1 has the setuid bit set + * ?w | boolean | True if file1 exists and is writable by + * | | the effective uid/gid + * ?W | boolean | True if file1 exists and is writable by + * | | the real uid/gid + * ?x | boolean | True if file1 exists and is executable by + * | | the effective uid/gid + * ?X | boolean | True if file1 exists and is executable by + * | | the real uid/gid + * ?z | boolean | True if file1 exists and has a zero length + * + * Tests that take two files: + * + * ?- | boolean | True if file1 and file2 are identical + * ?= | boolean | True if the modification times of file1 + * | | and file2 are equal + * ?< | boolean | True if the modification time of file1 + * | | is prior to that of file2 + * ?> | boolean | True if the modification time of file1 + * | | is after that of file2 + */ + +static VALUE +rb_f_test(argc, argv) + int argc; + VALUE *argv; +{ + int cmd; + + if (argc == 0) rb_raise(rb_eArgError, "wrong number of arguments"); +#if 0 /* 1.7 behavior? */ + if (argc == 1) { + return RTEST(argv[0]) ? Qtrue : Qfalse; + } +#endif + cmd = NUM2CHR(argv[0]); + if (cmd == 0) return Qfalse; + if (strchr("bcdefgGkloOprRsSuwWxXz", cmd)) { + CHECK(1); + switch (cmd) { + case 'b': + return test_b(0, argv[1]); + + case 'c': + return test_c(0, argv[1]); + + case 'd': + return test_d(0, argv[1]); + + case 'a': + case 'e': + return test_e(0, argv[1]); + + case 'f': + return test_f(0, argv[1]); + + case 'g': + return test_sgid(0, argv[1]); + + case 'G': + return test_grpowned(0, argv[1]); + + case 'k': + return test_sticky(0, argv[1]); + + case 'l': + return test_l(0, argv[1]); + + case 'o': + return test_owned(0, argv[1]); + + case 'O': + return test_rowned(0, argv[1]); + + case 'p': + return test_p(0, argv[1]); + + case 'r': + return test_r(0, argv[1]); + + case 'R': + return test_R(0, argv[1]); + + case 's': + return test_s(0, argv[1]); + + case 'S': + return test_S(0, argv[1]); + + case 'u': + return test_suid(0, argv[1]); + + case 'w': + return test_w(0, argv[1]); + + case 'W': + return test_W(0, argv[1]); + + case 'x': + return test_x(0, argv[1]); + + case 'X': + return test_X(0, argv[1]); + + case 'z': + return test_z(0, argv[1]); + } + } + + if (strchr("MAC", cmd)) { + struct stat st; + + CHECK(1); + if (rb_stat(argv[1], &st) == -1) { + rb_sys_fail(RSTRING(argv[1])->ptr); + } + + switch (cmd) { + case 'A': + return rb_time_new(st.st_atime, 0); + case 'M': + return rb_time_new(st.st_mtime, 0); + case 'C': + return rb_time_new(st.st_ctime, 0); + } + } + + if (cmd == '-') { + CHECK(2); + return test_identical(0, argv[1], argv[2]); + } + + if (strchr("=<>", cmd)) { + struct stat st1, st2; + + CHECK(2); + if (rb_stat(argv[1], &st1) < 0) return Qfalse; + if (rb_stat(argv[2], &st2) < 0) return Qfalse; + + switch (cmd) { + case '=': + if (st1.st_mtime == st2.st_mtime) return Qtrue; + return Qfalse; + + case '>': + if (st1.st_mtime > st2.st_mtime) return Qtrue; + return Qfalse; + + case '<': + if (st1.st_mtime < st2.st_mtime) return Qtrue; + return Qfalse; + } + } + /* unknown command */ + rb_raise(rb_eArgError, "unknown command ?%c", cmd); + return Qnil; /* not reached */ +} + + +/* + * Document-class: File::Stat + * + * Objects of class <code>File::Stat</code> encapsulate common status + * information for <code>File</code> objects. The information is + * recorded at the moment the <code>File::Stat</code> object is + * created; changes made to the file after that point will not be + * reflected. <code>File::Stat</code> objects are returned by + * <code>IO#stat</code>, <code>File::stat</code>, + * <code>File#lstat</code>, and <code>File::lstat</code>. Many of these + * methods return platform-specific values, and not all values are + * meaningful on all systems. See also <code>Kernel#test</code>. + */ + +static VALUE rb_stat_s_alloc _((VALUE)); +static VALUE +rb_stat_s_alloc(klass) + VALUE klass; +{ + return stat_new_0(klass, 0); +} + +/* + * call-seq: + * + * File::Stat.new(file_name) => stat + * + * Create a File::Stat object for the given file name (raising an + * exception if the file doesn't exist). + */ + +static VALUE +rb_stat_init(obj, fname) + VALUE obj, fname; +{ + struct stat st, *nst; + + SafeStringValue(fname); + + if (stat(StringValueCStr(fname), &st) == -1) { + rb_sys_fail(RSTRING(fname)->ptr); + } + if (DATA_PTR(obj)) { + free(DATA_PTR(obj)); + DATA_PTR(obj) = NULL; + } + nst = ALLOC(struct stat); + *nst = st; + DATA_PTR(obj) = nst; + + return Qnil; +} + +/* :nodoc: */ +static VALUE +rb_stat_init_copy(copy, orig) + VALUE copy, orig; +{ + struct stat *nst; + + if (copy == orig) return orig; + rb_check_frozen(copy); + /* need better argument type check */ + if (!rb_obj_is_instance_of(orig, rb_obj_class(copy))) { + rb_raise(rb_eTypeError, "wrong argument class"); + } + if (DATA_PTR(copy)) { + free(DATA_PTR(copy)); + DATA_PTR(copy) = 0; + } + if (DATA_PTR(orig)) { + nst = ALLOC(struct stat); + *nst = *(struct stat*)DATA_PTR(orig); + DATA_PTR(copy) = nst; + } + + return copy; +} + +/* + * call-seq: + * stat.ftype => string + * + * Identifies the type of <i>stat</i>. The return string is one of: + * ``<code>file</code>'', ``<code>directory</code>'', + * ``<code>characterSpecial</code>'', ``<code>blockSpecial</code>'', + * ``<code>fifo</code>'', ``<code>link</code>'', + * ``<code>socket</code>'', or ``<code>unknown</code>''. + * + * File.stat("/dev/tty").ftype #=> "characterSpecial" + * + */ + +static VALUE +rb_stat_ftype(obj) + VALUE obj; +{ + return rb_file_ftype(get_stat(obj)); +} + +/* + * call-seq: + * stat.directory? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a directory, + * <code>false</code> otherwise. + * + * File.stat("testfile").directory? #=> false + * File.stat(".").directory? #=> true + */ + +static VALUE +rb_stat_d(obj) + VALUE obj; +{ + if (S_ISDIR(get_stat(obj)->st_mode)) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * stat.pipe? => true or false + * + * Returns <code>true</code> if the operating system supports pipes and + * <i>stat</i> is a pipe; <code>false</code> otherwise. + */ + +static VALUE +rb_stat_p(obj) + VALUE obj; +{ +#ifdef S_IFIFO + if (S_ISFIFO(get_stat(obj)->st_mode)) return Qtrue; + +#endif + return Qfalse; +} + +/* + * call-seq: + * stat.symlink? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a symbolic link, + * <code>false</code> if it isn't or if the operating system doesn't + * support this feature. As <code>File::stat</code> automatically + * follows symbolic links, <code>symlink?</code> will always be + * <code>false</code> for an object returned by + * <code>File::stat</code>. + * + * File.symlink("testfile", "alink") #=> 0 + * File.stat("alink").symlink? #=> false + * File.lstat("alink").symlink? #=> true + * + */ + +static VALUE +rb_stat_l(obj) + VALUE obj; +{ +#ifdef S_ISLNK + if (S_ISLNK(get_stat(obj)->st_mode)) return Qtrue; +#endif + return Qfalse; +} + +/* + * call-seq: + * stat.socket? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a socket, + * <code>false</code> if it isn't or if the operating system doesn't + * support this feature. + * + * File.stat("testfile").socket? #=> false + * + */ + +static VALUE +rb_stat_S(obj) + VALUE obj; +{ +#ifdef S_ISSOCK + if (S_ISSOCK(get_stat(obj)->st_mode)) return Qtrue; + +#endif + return Qfalse; +} + +/* + * call-seq: + * stat.blockdev? => true or false + * + * Returns <code>true</code> if the file is a block device, + * <code>false</code> if it isn't or if the operating system doesn't + * support this feature. + * + * File.stat("testfile").blockdev? #=> false + * File.stat("/dev/hda1").blockdev? #=> true + * + */ + +static VALUE +rb_stat_b(obj) + VALUE obj; +{ +#ifdef S_ISBLK + if (S_ISBLK(get_stat(obj)->st_mode)) return Qtrue; + +#endif + return Qfalse; +} + +/* + * call-seq: + * stat.chardev? => true or false + * + * Returns <code>true</code> if the file is a character device, + * <code>false</code> if it isn't or if the operating system doesn't + * support this feature. + * + * File.stat("/dev/tty").chardev? #=> true + * + */ + +static VALUE +rb_stat_c(obj) + VALUE obj; +{ + if (S_ISCHR(get_stat(obj)->st_mode)) return Qtrue; + + return Qfalse; +} + +/* + * call-seq: + * stat.owned? => true or false + * + * Returns <code>true</code> if the effective user id of the process is + * the same as the owner of <i>stat</i>. + * + * File.stat("testfile").owned? #=> true + * File.stat("/etc/passwd").owned? #=> false + * + */ + +static VALUE +rb_stat_owned(obj) + VALUE obj; +{ + if (get_stat(obj)->st_uid == geteuid()) return Qtrue; + return Qfalse; +} + +static VALUE +rb_stat_rowned(obj) + VALUE obj; +{ + if (get_stat(obj)->st_uid == getuid()) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * stat.grpowned? => true or false + * + * Returns true if the effective group id of the process is the same as + * the group id of <i>stat</i>. On Windows NT, returns <code>false</code>. + * + * File.stat("testfile").grpowned? #=> true + * File.stat("/etc/passwd").grpowned? #=> false + * + */ + +static VALUE +rb_stat_grpowned(obj) + VALUE obj; +{ +#ifndef _WIN32 + if (group_member(get_stat(obj)->st_gid)) return Qtrue; +#endif + return Qfalse; +} + +/* + * call-seq: + * stat.readable? => true or false + * + * Returns <code>true</code> if <i>stat</i> is readable by the + * effective user id of this process. + * + * File.stat("testfile").readable? #=> true + * + */ + +static VALUE +rb_stat_r(obj) + VALUE obj; +{ + struct stat *st = get_stat(obj); + +#ifdef USE_GETEUID + if (geteuid() == 0) return Qtrue; +#endif +#ifdef S_IRUSR + if (rb_stat_owned(obj)) + return st->st_mode & S_IRUSR ? Qtrue : Qfalse; +#endif +#ifdef S_IRGRP + if (rb_stat_grpowned(obj)) + return st->st_mode & S_IRGRP ? Qtrue : Qfalse; +#endif +#ifdef S_IROTH + if (!(st->st_mode & S_IROTH)) return Qfalse; +#endif + return Qtrue; +} + +/* + * call-seq: + * stat.readable_real? -> true or false + * + * Returns <code>true</code> if <i>stat</i> is readable by the real + * user id of this process. + * + * File.stat("testfile").readable_real? #=> true + * + */ + +static VALUE +rb_stat_R(obj) + VALUE obj; +{ + struct stat *st = get_stat(obj); + +#ifdef USE_GETEUID + if (getuid() == 0) return Qtrue; +#endif +#ifdef S_IRUSR + if (rb_stat_rowned(obj)) + return st->st_mode & S_IRUSR ? Qtrue : Qfalse; +#endif +#ifdef S_IRGRP + if (group_member(get_stat(obj)->st_gid)) + return st->st_mode & S_IRGRP ? Qtrue : Qfalse; +#endif +#ifdef S_IROTH + if (!(st->st_mode & S_IROTH)) return Qfalse; +#endif + return Qtrue; +} + +/* + * call-seq: + * stat.writable? -> true or false + * + * Returns <code>true</code> if <i>stat</i> is writable by the + * effective user id of this process. + * + * File.stat("testfile").writable? #=> true + * + */ + +static VALUE +rb_stat_w(obj) + VALUE obj; +{ + struct stat *st = get_stat(obj); + +#ifdef USE_GETEUID + if (geteuid() == 0) return Qtrue; +#endif +#ifdef S_IWUSR + if (rb_stat_owned(obj)) + return st->st_mode & S_IWUSR ? Qtrue : Qfalse; +#endif +#ifdef S_IWGRP + if (rb_stat_grpowned(obj)) + return st->st_mode & S_IWGRP ? Qtrue : Qfalse; +#endif +#ifdef S_IWOTH + if (!(st->st_mode & S_IWOTH)) return Qfalse; +#endif + return Qtrue; +} + +/* + * call-seq: + * stat.writable_real? -> true or false + * + * Returns <code>true</code> if <i>stat</i> is writable by the real + * user id of this process. + * + * File.stat("testfile").writable_real? #=> true + * + */ + +static VALUE +rb_stat_W(obj) + VALUE obj; +{ + struct stat *st = get_stat(obj); + +#ifdef USE_GETEUID + if (getuid() == 0) return Qtrue; +#endif +#ifdef S_IWUSR + if (rb_stat_rowned(obj)) + return st->st_mode & S_IWUSR ? Qtrue : Qfalse; +#endif +#ifdef S_IWGRP + if (group_member(get_stat(obj)->st_gid)) + return st->st_mode & S_IWGRP ? Qtrue : Qfalse; +#endif +#ifdef S_IWOTH + if (!(st->st_mode & S_IWOTH)) return Qfalse; +#endif + return Qtrue; +} + +/* + * call-seq: + * stat.executable? => true or false + * + * Returns <code>true</code> if <i>stat</i> is executable or if the + * operating system doesn't distinguish executable files from + * nonexecutable files. The tests are made using the effective owner of + * the process. + * + * File.stat("testfile").executable? #=> false + * + */ + +static VALUE +rb_stat_x(obj) + VALUE obj; +{ + struct stat *st = get_stat(obj); + +#ifdef USE_GETEUID + if (geteuid() == 0) { + return st->st_mode & S_IXUGO ? Qtrue : Qfalse; + } +#endif +#ifdef S_IXUSR + if (rb_stat_owned(obj)) + return st->st_mode & S_IXUSR ? Qtrue : Qfalse; +#endif +#ifdef S_IXGRP + if (rb_stat_grpowned(obj)) + return st->st_mode & S_IXGRP ? Qtrue : Qfalse; +#endif +#ifdef S_IXOTH + if (!(st->st_mode & S_IXOTH)) return Qfalse; +#endif + return Qtrue; +} + +/* + * call-seq: + * stat.executable_real? => true or false + * + * Same as <code>executable?</code>, but tests using the real owner of + * the process. + */ + +static VALUE +rb_stat_X(obj) + VALUE obj; +{ + struct stat *st = get_stat(obj); + +#ifdef USE_GETEUID + if (getuid() == 0) { + return st->st_mode & S_IXUGO ? Qtrue : Qfalse; + } +#endif +#ifdef S_IXUSR + if (rb_stat_rowned(obj)) + return st->st_mode & S_IXUSR ? Qtrue : Qfalse; +#endif +#ifdef S_IXGRP + if (group_member(get_stat(obj)->st_gid)) + return st->st_mode & S_IXGRP ? Qtrue : Qfalse; +#endif +#ifdef S_IXOTH + if (!(st->st_mode & S_IXOTH)) return Qfalse; +#endif + return Qtrue; +} + +/* + * call-seq: + * stat.file? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a regular file (not + * a device file, pipe, socket, etc.). + * + * File.stat("testfile").file? #=> true + * + */ + +static VALUE +rb_stat_f(obj) + VALUE obj; +{ + if (S_ISREG(get_stat(obj)->st_mode)) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * stat.zero? => true or false + * + * Returns <code>true</code> if <i>stat</i> is a zero-length file; + * <code>false</code> otherwise. + * + * File.stat("testfile").zero? #=> false + * + */ + +static VALUE +rb_stat_z(obj) + VALUE obj; +{ + if (get_stat(obj)->st_size == 0) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * state.size => integer + * + * Returns the size of <i>stat</i> in bytes. + * + * File.stat("testfile").size #=> 66 + * + */ + +static VALUE +rb_stat_s(obj) + VALUE obj; +{ + off_t size = get_stat(obj)->st_size; + + if (size == 0) return Qnil; + return OFFT2NUM(size); +} + +/* + * call-seq: + * stat.setuid? => true or false + * + * Returns <code>true</code> if <i>stat</i> has the set-user-id + * permission bit set, <code>false</code> if it doesn't or if the + * operating system doesn't support this feature. + * + * File.stat("/bin/su").setuid? #=> true + */ + +static VALUE +rb_stat_suid(obj) + VALUE obj; +{ +#ifdef S_ISUID + if (get_stat(obj)->st_mode & S_ISUID) return Qtrue; +#endif + return Qfalse; +} + +/* + * call-seq: + * stat.setgid? => true or false + * + * Returns <code>true</code> if <i>stat</i> has the set-group-id + * permission bit set, <code>false</code> if it doesn't or if the + * operating system doesn't support this feature. + * + * File.stat("/usr/sbin/lpc").setgid? #=> true + * + */ + +static VALUE +rb_stat_sgid(obj) + VALUE obj; +{ +#ifdef S_ISGID + if (get_stat(obj)->st_mode & S_ISGID) return Qtrue; +#endif + return Qfalse; +} + +/* + * call-seq: + * stat.sticky? => true or false + * + * Returns <code>true</code> if <i>stat</i> has its sticky bit set, + * <code>false</code> if it doesn't or if the operating system doesn't + * support this feature. + * + * File.stat("testfile").sticky? #=> false + * + */ + +static VALUE +rb_stat_sticky(obj) + VALUE obj; +{ +#ifdef S_ISVTX + if (get_stat(obj)->st_mode & S_ISVTX) return Qtrue; +#endif + return Qfalse; +} + +VALUE rb_mFConst; + +void +rb_file_const(name, value) + const char *name; + VALUE value; +{ + rb_define_const(rb_mFConst, name, value); +} + +static int +is_absolute_path(path) + const char *path; +{ +#ifdef DOSISH_DRIVE_LETTER + if (has_drive_letter(path) && isdirsep(path[2])) return 1; +#endif +#ifdef DOSISH_UNC + if (isdirsep(path[0]) && isdirsep(path[1])) return 1; +#endif +#ifndef DOSISH + if (path[0] == '/') return 1; +#endif + return 0; +} + +#ifndef ENABLE_PATH_CHECK +# if defined DOSISH || defined __CYGWIN__ +# define ENABLE_PATH_CHECK 0 +# else +# define ENABLE_PATH_CHECK 1 +# endif +#endif + +#if ENABLE_PATH_CHECK +static int +path_check_0(fpath, execpath) + VALUE fpath; + int execpath; +{ + struct stat st; + char *p0 = StringValueCStr(fpath); + char *p = 0, *s; + + if (!is_absolute_path(p0)) { + char *buf = my_getcwd(); + VALUE newpath; + + newpath = rb_str_new2(buf); + free(buf); + + rb_str_cat2(newpath, "/"); + rb_str_cat2(newpath, p0); + p0 = RSTRING(fpath = newpath)->ptr; + } + for (;;) { +#ifndef S_IWOTH +# define S_IWOTH 002 +#endif + if (stat(p0, &st) == 0 && S_ISDIR(st.st_mode) && (st.st_mode & S_IWOTH) +#ifdef S_ISVTX + && !(p && execpath && (st.st_mode & S_ISVTX)) +#endif + ) { + rb_warn("Insecure world writable dir %s in %sPATH, mode 0%o", + p0, (execpath ? "" : "LOAD_"), st.st_mode); + if (p) *p = '/'; + return 0; + } + s = strrdirsep(p0); + if (p) *p = '/'; + if (!s || s == p0) return 1; + p = s; + *p = '\0'; + } +} +#endif + +static int +fpath_check(path) + char *path; +{ +#if ENABLE_PATH_CHECK + return path_check_0(rb_str_new2(path), Qfalse); +#else + return 1; +#endif +} + +int +rb_path_check(path) + char *path; +{ +#if ENABLE_PATH_CHECK + char *p0, *p, *pend; + const char sep = PATH_SEP_CHAR; + + if (!path) return 1; + + pend = path + strlen(path); + p0 = path; + p = strchr(path, sep); + if (!p) p = pend; + + for (;;) { + if (!path_check_0(rb_str_new(p0, p - p0), Qtrue)) { + return 0; /* not safe */ + } + p0 = p + 1; + if (p0 > pend) break; + p = strchr(p0, sep); + if (!p) p = pend; + } +#endif + return 1; +} + +#if defined(__MACOS__) || defined(riscos) +static int +is_macos_native_path(path) + const char *path; +{ + if (strchr(path, ':')) return 1; + return 0; +} +#endif + +static int +file_load_ok(file) + char *file; +{ + int ret = 1; + int fd = open(file, O_RDONLY); + if (fd == -1) return 0; +#if !defined DOSISH + { + struct stat st; + if (fstat(fd, &st) || !S_ISREG(st.st_mode)) { + ret = 0; + } + } +#endif + (void)close(fd); + return ret; +} + +extern VALUE rb_load_path; + +int +rb_find_file_ext(filep, ext) + VALUE *filep; + const char * const *ext; +{ + char *path, *found; + char *f = RSTRING(*filep)->ptr; + VALUE fname; + long i, j; + + if (f[0] == '~') { + fname = rb_file_expand_path(*filep, Qnil); + if (rb_safe_level() >= 2 && OBJ_TAINTED(fname)) { + rb_raise(rb_eSecurityError, "loading from unsafe file %s", f); + } + OBJ_FREEZE(fname); + f = StringValueCStr(fname); + *filep = fname; + } + + if (is_absolute_path(f)) { + for (i=0; ext[i]; i++) { + fname = rb_str_dup(*filep); + rb_str_cat2(fname, ext[i]); + OBJ_FREEZE(fname); + if (file_load_ok(StringValueCStr(fname))) { + *filep = fname; + return i+1; + } + } + return 0; + } + + if (!rb_load_path) return 0; + + Check_Type(rb_load_path, T_ARRAY); + for (i=0;i<RARRAY(rb_load_path)->len;i++) { + VALUE str = RARRAY(rb_load_path)->ptr[i]; + + SafeStringValue(str); + if (RSTRING(str)->len == 0) continue; + path = RSTRING(str)->ptr; + for (j=0; ext[j]; j++) { + fname = rb_str_dup(*filep); + rb_str_cat2(fname, ext[j]); + OBJ_FREEZE(fname); + found = dln_find_file(StringValueCStr(fname), path); + if (found && file_load_ok(found)) { + *filep = fname; + return j+1; + } + } + } + return 0; +} + +VALUE +rb_find_file(path) + VALUE path; +{ + VALUE tmp; + char *f = StringValueCStr(path); + char *lpath; + + if (f[0] == '~') { + path = rb_file_expand_path(path, Qnil); + if (rb_safe_level() >= 1 && OBJ_TAINTED(path)) { + rb_raise(rb_eSecurityError, "loading from unsafe path %s", f); + } + OBJ_FREEZE(path); + f = StringValueCStr(path); + } + +#if defined(__MACOS__) || defined(riscos) + if (is_macos_native_path(f)) { + if (rb_safe_level() >= 1 && !fpath_check(f)) { + rb_raise(rb_eSecurityError, "loading from unsafe file %s", f); + } + if (file_load_ok(f)) return path; + } +#endif + + if (is_absolute_path(f)) { + if (rb_safe_level() >= 1 && !fpath_check(f)) { + rb_raise(rb_eSecurityError, "loading from unsafe file %s", f); + } + if (file_load_ok(f)) return path; + } + + if (rb_safe_level() >= 4) { + rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f); + } + + if (rb_load_path) { + long i; + + Check_Type(rb_load_path, T_ARRAY); + tmp = rb_ary_new(); + for (i=0;i<RARRAY(rb_load_path)->len;i++) { + VALUE str = RARRAY(rb_load_path)->ptr[i]; + SafeStringValue(str); + if (RSTRING(str)->len > 0) { + rb_ary_push(tmp, str); + } + } + tmp = rb_ary_join(tmp, rb_str_new2(PATH_SEP)); + if (RSTRING(tmp)->len == 0) { + lpath = 0; + } + else { + lpath = RSTRING(tmp)->ptr; + } + } + else { + lpath = 0; + } + + if (!lpath) { + return 0; /* no path, no load */ + } + if (!(f = dln_find_file(f, lpath))) { + return 0; + } + if (rb_safe_level() >= 1 && !fpath_check(f)) { + rb_raise(rb_eSecurityError, "loading from unsafe file %s", f); + } + if (file_load_ok(f)) { + tmp = rb_str_new2(f); + OBJ_FREEZE(tmp); + return tmp; + } + return 0; +} + +static void +define_filetest_function(name, func, argc) + const char *name; + VALUE (*func)(); + int argc; +{ + rb_define_module_function(rb_mFileTest, name, func, argc); + rb_define_singleton_method(rb_cFile, name, func, argc); +} + + +/* + * A <code>File</code> is an abstraction of any file object accessible + * by the program and is closely associated with class <code>IO</code> + * <code>File</code> includes the methods of module + * <code>FileTest</code> as class methods, allowing you to write (for + * example) <code>File.exist?("foo")</code>. + * + * In the description of File methods, + * <em>permission bits</em> are a platform-specific + * set of bits that indicate permissions of a file. On Unix-based + * systems, permissions are viewed as a set of three octets, for the + * owner, the group, and the rest of the world. For each of these + * entities, permissions may be set to read, write, or execute the + * file: + * + * The permission bits <code>0644</code> (in octal) would thus be + * interpreted as read/write for owner, and read-only for group and + * other. Higher-order bits may also be used to indicate the type of + * file (plain, directory, pipe, socket, and so on) and various other + * special features. If the permissions are for a directory, the + * meaning of the execute bit changes; when set the directory can be + * searched. + * + * On non-Posix operating systems, there may be only the ability to + * make a file read-only or read-write. In this case, the remaining + * permission bits will be synthesized to resemble typical values. For + * instance, on Windows NT the default permission bits are + * <code>0644</code>, which means read/write for owner, read-only for + * all others. The only change that can be made is to make the file + * read-only, which is reported as <code>0444</code>. + */ + +void +Init_File() +{ + rb_mFileTest = rb_define_module("FileTest"); + rb_cFile = rb_define_class("File", rb_cIO); + + define_filetest_function("directory?", test_d, 1); + define_filetest_function("exist?", test_e, 1); + define_filetest_function("exists?", test_e, 1); /* temporary */ + define_filetest_function("readable?", test_r, 1); + define_filetest_function("readable_real?", test_R, 1); + define_filetest_function("writable?", test_w, 1); + define_filetest_function("writable_real?", test_W, 1); + define_filetest_function("executable?", test_x, 1); + define_filetest_function("executable_real?", test_X, 1); + define_filetest_function("file?", test_f, 1); + define_filetest_function("zero?", test_z, 1); + define_filetest_function("size?", test_s, 1); + define_filetest_function("size", rb_file_s_size, 1); + define_filetest_function("owned?", test_owned, 1); + define_filetest_function("grpowned?", test_grpowned, 1); + + define_filetest_function("pipe?", test_p, 1); + define_filetest_function("symlink?", test_l, 1); + define_filetest_function("socket?", test_S, 1); + + define_filetest_function("blockdev?", test_b, 1); + define_filetest_function("chardev?", test_c, 1); + + define_filetest_function("setuid?", test_suid, 1); + define_filetest_function("setgid?", test_sgid, 1); + define_filetest_function("sticky?", test_sticky, 1); + + define_filetest_function("identical?", test_identical, 2); + + rb_define_singleton_method(rb_cFile, "stat", rb_file_s_stat, 1); + rb_define_singleton_method(rb_cFile, "lstat", rb_file_s_lstat, 1); + rb_define_singleton_method(rb_cFile, "ftype", rb_file_s_ftype, 1); + + rb_define_singleton_method(rb_cFile, "atime", rb_file_s_atime, 1); + rb_define_singleton_method(rb_cFile, "mtime", rb_file_s_mtime, 1); + rb_define_singleton_method(rb_cFile, "ctime", rb_file_s_ctime, 1); + + rb_define_singleton_method(rb_cFile, "utime", rb_file_s_utime, -1); + rb_define_singleton_method(rb_cFile, "chmod", rb_file_s_chmod, -1); + rb_define_singleton_method(rb_cFile, "chown", rb_file_s_chown, -1); + rb_define_singleton_method(rb_cFile, "lchmod", rb_file_s_lchmod, -1); + rb_define_singleton_method(rb_cFile, "lchown", rb_file_s_lchown, -1); + + rb_define_singleton_method(rb_cFile, "link", rb_file_s_link, 2); + rb_define_singleton_method(rb_cFile, "symlink", rb_file_s_symlink, 2); + rb_define_singleton_method(rb_cFile, "readlink", rb_file_s_readlink, 1); + + rb_define_singleton_method(rb_cFile, "unlink", rb_file_s_unlink, -2); + rb_define_singleton_method(rb_cFile, "delete", rb_file_s_unlink, -2); + rb_define_singleton_method(rb_cFile, "rename", rb_file_s_rename, 2); + rb_define_singleton_method(rb_cFile, "umask", rb_file_s_umask, -1); + rb_define_singleton_method(rb_cFile, "truncate", rb_file_s_truncate, 2); + rb_define_singleton_method(rb_cFile, "expand_path", rb_file_s_expand_path, -1); + rb_define_singleton_method(rb_cFile, "basename", rb_file_s_basename, -1); + rb_define_singleton_method(rb_cFile, "dirname", rb_file_s_dirname, 1); + rb_define_singleton_method(rb_cFile, "extname", rb_file_s_extname, 1); + + separator = rb_obj_freeze(rb_str_new2("/")); + rb_define_const(rb_cFile, "Separator", separator); + rb_define_const(rb_cFile, "SEPARATOR", separator); + rb_define_singleton_method(rb_cFile, "split", rb_file_s_split, 1); + rb_define_singleton_method(rb_cFile, "join", rb_file_s_join, -2); + +#ifdef DOSISH + rb_define_const(rb_cFile, "ALT_SEPARATOR", rb_obj_freeze(rb_str_new2("\\"))); +#else + rb_define_const(rb_cFile, "ALT_SEPARATOR", Qnil); +#endif + rb_define_const(rb_cFile, "PATH_SEPARATOR", rb_obj_freeze(rb_str_new2(PATH_SEP))); + + rb_define_method(rb_cIO, "stat", rb_io_stat, 0); /* this is IO's method */ + rb_define_method(rb_cFile, "lstat", rb_file_lstat, 0); + + rb_define_method(rb_cFile, "atime", rb_file_atime, 0); + rb_define_method(rb_cFile, "mtime", rb_file_mtime, 0); + rb_define_method(rb_cFile, "ctime", rb_file_ctime, 0); + + rb_define_method(rb_cFile, "chmod", rb_file_chmod, 1); + rb_define_method(rb_cFile, "chown", rb_file_chown, 2); + rb_define_method(rb_cFile, "truncate", rb_file_truncate, 1); + + rb_define_method(rb_cFile, "flock", rb_file_flock, 1); + + rb_mFConst = rb_define_module_under(rb_cFile, "Constants"); + rb_include_module(rb_cIO, rb_mFConst); + rb_file_const("LOCK_SH", INT2FIX(LOCK_SH)); + rb_file_const("LOCK_EX", INT2FIX(LOCK_EX)); + rb_file_const("LOCK_UN", INT2FIX(LOCK_UN)); + rb_file_const("LOCK_NB", INT2FIX(LOCK_NB)); + + rb_define_method(rb_cFile, "path", rb_file_path, 0); + rb_define_global_function("test", rb_f_test, -1); + + rb_cStat = rb_define_class_under(rb_cFile, "Stat", rb_cObject); + rb_define_alloc_func(rb_cStat, rb_stat_s_alloc); + rb_define_method(rb_cStat, "initialize", rb_stat_init, 1); + rb_define_method(rb_cStat, "initialize_copy", rb_stat_init_copy, 1); + + rb_include_module(rb_cStat, rb_mComparable); + + rb_define_method(rb_cStat, "<=>", rb_stat_cmp, 1); + + rb_define_method(rb_cStat, "dev", rb_stat_dev, 0); + rb_define_method(rb_cStat, "dev_major", rb_stat_dev_major, 0); + rb_define_method(rb_cStat, "dev_minor", rb_stat_dev_minor, 0); + rb_define_method(rb_cStat, "ino", rb_stat_ino, 0); + rb_define_method(rb_cStat, "mode", rb_stat_mode, 0); + rb_define_method(rb_cStat, "nlink", rb_stat_nlink, 0); + rb_define_method(rb_cStat, "uid", rb_stat_uid, 0); + rb_define_method(rb_cStat, "gid", rb_stat_gid, 0); + rb_define_method(rb_cStat, "rdev", rb_stat_rdev, 0); + rb_define_method(rb_cStat, "rdev_major", rb_stat_rdev_major, 0); + rb_define_method(rb_cStat, "rdev_minor", rb_stat_rdev_minor, 0); + rb_define_method(rb_cStat, "size", rb_stat_size, 0); + rb_define_method(rb_cStat, "blksize", rb_stat_blksize, 0); + rb_define_method(rb_cStat, "blocks", rb_stat_blocks, 0); + rb_define_method(rb_cStat, "atime", rb_stat_atime, 0); + rb_define_method(rb_cStat, "mtime", rb_stat_mtime, 0); + rb_define_method(rb_cStat, "ctime", rb_stat_ctime, 0); + + rb_define_method(rb_cStat, "inspect", rb_stat_inspect, 0); + + rb_define_method(rb_cStat, "ftype", rb_stat_ftype, 0); + + rb_define_method(rb_cStat, "directory?", rb_stat_d, 0); + rb_define_method(rb_cStat, "readable?", rb_stat_r, 0); + rb_define_method(rb_cStat, "readable_real?", rb_stat_R, 0); + rb_define_method(rb_cStat, "writable?", rb_stat_w, 0); + rb_define_method(rb_cStat, "writable_real?", rb_stat_W, 0); + rb_define_method(rb_cStat, "executable?", rb_stat_x, 0); + rb_define_method(rb_cStat, "executable_real?", rb_stat_X, 0); + rb_define_method(rb_cStat, "file?", rb_stat_f, 0); + rb_define_method(rb_cStat, "zero?", rb_stat_z, 0); + rb_define_method(rb_cStat, "size?", rb_stat_s, 0); + rb_define_method(rb_cStat, "owned?", rb_stat_owned, 0); + rb_define_method(rb_cStat, "grpowned?", rb_stat_grpowned, 0); + + rb_define_method(rb_cStat, "pipe?", rb_stat_p, 0); + rb_define_method(rb_cStat, "symlink?", rb_stat_l, 0); + rb_define_method(rb_cStat, "socket?", rb_stat_S, 0); + + rb_define_method(rb_cStat, "blockdev?", rb_stat_b, 0); + rb_define_method(rb_cStat, "chardev?", rb_stat_c, 0); + + rb_define_method(rb_cStat, "setuid?", rb_stat_suid, 0); + rb_define_method(rb_cStat, "setgid?", rb_stat_sgid, 0); + rb_define_method(rb_cStat, "sticky?", rb_stat_sticky, 0); +} +/********************************************************************** + + gc.c - + + $Author: wyhaines $ + $Date: 2009-07-10 20:31:58 +0200 (Fri, 10 Jul 2009) $ + created at: Tue Oct 5 09:44:46 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "rubysig.h" +#include "st.h" +#include "node.h" +#include "env.h" +#include "re.h" +#include <stdio.h> +#include <setjmp.h> +#include <sys/types.h> + +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif + +#ifdef HAVE_SYS_RESOURCE_H +#include <sys/resource.h> +#endif + +#if defined _WIN32 || defined __CYGWIN__ +#include <windows.h> +#endif + +void re_free_registers _((struct re_registers*)); +void rb_io_fptr_finalize _((struct OpenFile*)); + +#if !defined(setjmp) && defined(HAVE__SETJMP) +#define setjmp(env) _setjmp(env) +#endif + +/* Make alloca work the best possible way. */ +#ifdef __GNUC__ +# ifndef atarist +# ifndef alloca +# define alloca __builtin_alloca +# endif +# endif /* atarist */ +#else +# ifdef HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifndef _AIX +# ifndef alloca /* predefined by HP cc +Olibcalls */ +void *alloca (); +# endif +# endif /* AIX */ +# endif /* HAVE_ALLOCA_H */ +#endif /* __GNUC__ */ + +#ifndef GC_MALLOC_LIMIT +#if defined(MSDOS) || defined(__human68k__) +#define GC_MALLOC_LIMIT 200000 +#else +#define GC_MALLOC_LIMIT 8000000 +#endif +#endif + +static unsigned long malloc_increase = 0; +static unsigned long malloc_limit = GC_MALLOC_LIMIT; +static void run_final(); +static VALUE nomem_error; +static void garbage_collect(); + +NORETURN(void rb_exc_jump _((VALUE))); + +void +rb_memerror() +{ + rb_thread_t th = rb_curr_thread; + + if (!nomem_error || + (rb_thread_raised_p(th, RAISED_NOMEMORY) && rb_safe_level() < 4)) { + fprintf(stderr, "[FATAL] failed to allocate memory\n"); + exit(1); + } + if (rb_thread_raised_p(th, RAISED_NOMEMORY)) { + rb_exc_jump(nomem_error); + } + rb_thread_raised_set(th, RAISED_NOMEMORY); + rb_exc_raise(nomem_error); +} + +void * +ruby_xmalloc(size) + long size; +{ + void *mem; + + if (size < 0) { + rb_raise(rb_eNoMemError, "negative allocation size (or too big)"); + } + if (size == 0) size = 1; + + if ((malloc_increase+size) > malloc_limit) { + garbage_collect(); + } + RUBY_CRITICAL(mem = malloc(size)); + if (!mem) { + garbage_collect(); + RUBY_CRITICAL(mem = malloc(size)); + if (!mem) { + rb_memerror(); + } + } + malloc_increase += size; + + return mem; +} + +void * +ruby_xcalloc(n, size) + long n, size; +{ + void *mem; + + mem = xmalloc(n * size); + memset(mem, 0, n * size); + + return mem; +} + +void * +ruby_xrealloc(ptr, size) + void *ptr; + long size; +{ + void *mem; + + if (size < 0) { + rb_raise(rb_eArgError, "negative re-allocation size"); + } + if (!ptr) return xmalloc(size); + if (size == 0) size = 1; + RUBY_CRITICAL(mem = realloc(ptr, size)); + if (!mem) { + garbage_collect(); + RUBY_CRITICAL(mem = realloc(ptr, size)); + if (!mem) { + rb_memerror(); + } + } + malloc_increase += size; + + return mem; +} + +void +ruby_xfree(x) + void *x; +{ + if (x) + RUBY_CRITICAL(free(x)); +} + +extern int ruby_in_compile; +static int dont_gc; +static int during_gc; +static int need_call_final = 0; +static st_table *finalizer_table = 0; + + +/* + * call-seq: + * GC.enable => true or false + * + * Enables garbage collection, returning <code>true</code> if garbage + * collection was previously disabled. + * + * GC.disable #=> false + * GC.enable #=> true + * GC.enable #=> false + * + */ + +VALUE +rb_gc_enable() +{ + int old = dont_gc; + + dont_gc = Qfalse; + return old; +} + +/* + * call-seq: + * GC.disable => true or false + * + * Disables garbage collection, returning <code>true</code> if garbage + * collection was already disabled. + * + * GC.disable #=> false + * GC.disable #=> true + * + */ + +VALUE +rb_gc_disable() +{ + int old = dont_gc; + + dont_gc = Qtrue; + return old; +} + +VALUE rb_mGC; + +static struct gc_list { + VALUE *varptr; + struct gc_list *next; +} *global_List = 0; + +void +rb_gc_register_address(addr) + VALUE *addr; +{ + struct gc_list *tmp; + + tmp = ALLOC(struct gc_list); + tmp->next = global_List; + tmp->varptr = addr; + global_List = tmp; +} + +void +rb_gc_unregister_address(addr) + VALUE *addr; +{ + struct gc_list *tmp = global_List; + + if (tmp->varptr == addr) { + global_List = tmp->next; + RUBY_CRITICAL(free(tmp)); + return; + } + while (tmp->next) { + if (tmp->next->varptr == addr) { + struct gc_list *t = tmp->next; + + tmp->next = tmp->next->next; + RUBY_CRITICAL(free(t)); + break; + } + tmp = tmp->next; + } +} + +#undef GC_DEBUG + +void +rb_global_variable(var) + VALUE *var; +{ + rb_gc_register_address(var); +} + +#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CYGWIN__) +#pragma pack(push, 1) /* magic for reducing sizeof(RVALUE): 24 -> 20 */ +#endif + +typedef struct RVALUE { + union { + struct { + unsigned long flags; /* always 0 for freed obj */ + struct RVALUE *next; + } free; + struct RBasic basic; + struct RObject object; + struct RClass klass; + struct RFloat flonum; + struct RString string; + struct RArray array; + struct RRegexp regexp; + struct RHash hash; + struct RData data; + struct RStruct rstruct; + struct RBignum bignum; + struct RFile file; + struct RNode node; + struct RMatch match; + struct RVarmap varmap; + struct SCOPE scope; + } as; +#ifdef GC_DEBUG + char *file; + int line; +#endif +} RVALUE; + +#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CYGWIN__) +#pragma pack(pop) +#endif + +static RVALUE *freelist = 0; +static RVALUE *deferred_final_list = 0; + +#define HEAPS_INCREMENT 10 +static struct heaps_slot { + void *membase; + RVALUE *slot; + int limit; +} *heaps; +static int heaps_length = 0; +static int heaps_used = 0; + +#define HEAP_MIN_SLOTS 10000 +static int heap_slots = HEAP_MIN_SLOTS; + +#define FREE_MIN 4096 + +static RVALUE *himem, *lomem; + +static void +add_heap() +{ + RVALUE *p, *pend; + + if (heaps_used == heaps_length) { + /* Realloc heaps */ + struct heaps_slot *p; + int length; + + heaps_length += HEAPS_INCREMENT; + length = heaps_length*sizeof(struct heaps_slot); + RUBY_CRITICAL( + if (heaps_used > 0) { + p = (struct heaps_slot *)realloc(heaps, length); + if (p) heaps = p; + } + else { + p = heaps = (struct heaps_slot *)malloc(length); + }); + if (p == 0) rb_memerror(); + } + + for (;;) { + RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1))); + if (p == 0) { + if (heap_slots == HEAP_MIN_SLOTS) { + rb_memerror(); + } + heap_slots = HEAP_MIN_SLOTS; + continue; + } + heaps[heaps_used].membase = p; + if ((VALUE)p % sizeof(RVALUE) == 0) + heap_slots += 1; + else + p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE))); + heaps[heaps_used].slot = p; + heaps[heaps_used].limit = heap_slots; + break; + } + pend = p + heap_slots; + if (lomem == 0 || lomem > p) lomem = p; + if (himem < pend) himem = pend; + heaps_used++; + heap_slots *= 1.8; + if (heap_slots <= 0) heap_slots = HEAP_MIN_SLOTS; + + while (p < pend) { + p->as.free.flags = 0; + p->as.free.next = freelist; + freelist = p; + p++; + } +} +#define RANY(o) ((RVALUE*)(o)) + +int +rb_during_gc() +{ + return during_gc; +} + +VALUE +rb_newobj() +{ + VALUE obj; + + if (during_gc) + rb_bug("object allocation during garbage collection phase"); + + if (!freelist) garbage_collect(); + + obj = (VALUE)freelist; + freelist = freelist->as.free.next; + MEMZERO((void*)obj, RVALUE, 1); +#ifdef GC_DEBUG + RANY(obj)->file = ruby_sourcefile; + RANY(obj)->line = ruby_sourceline; +#endif + return obj; +} + +VALUE +rb_data_object_alloc(klass, datap, dmark, dfree) + VALUE klass; + void *datap; + RUBY_DATA_FUNC dmark; + RUBY_DATA_FUNC dfree; +{ + NEWOBJ(data, struct RData); + if (klass) Check_Type(klass, T_CLASS); + OBJSETUP(data, klass, T_DATA); + data->data = datap; + data->dfree = dfree; + data->dmark = dmark; + + return (VALUE)data; +} + +extern st_table *rb_class_tbl; +VALUE *rb_gc_stack_start = 0; +#ifdef __ia64 +VALUE *rb_gc_register_stack_start = 0; +#endif + +#ifdef DJGPP +/* set stack size (http://www.delorie.com/djgpp/v2faq/faq15_9.html) */ +unsigned int _stklen = 0x180000; /* 1.5 kB */ +#endif + +#if defined(DJGPP) || defined(_WIN32_WCE) +static unsigned int STACK_LEVEL_MAX = 65535; +#elif defined(__human68k__) +unsigned int _stacksize = 262144; +# define STACK_LEVEL_MAX (_stacksize - 4096) +# undef HAVE_GETRLIMIT +#elif defined(HAVE_GETRLIMIT) || defined(_WIN32) +static size_t STACK_LEVEL_MAX = 655300; +#else +# define STACK_LEVEL_MAX 655300 +#endif + +#ifdef C_ALLOCA +# define SET_STACK_END VALUE stack_end; alloca(0); +# define STACK_END (&stack_end) +#else +# if defined(__GNUC__) && defined(USE_BUILTIN_FRAME_ADDRESS) && !defined(__ia64) +# if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 +__attribute__ ((noinline)) +# endif +static void +stack_end_address(VALUE **stack_end_p) +{ + VALUE stack_end; + *stack_end_p = &stack_end; +} +# define SET_STACK_END VALUE *stack_end; stack_end_address(&stack_end) +# else +# define SET_STACK_END VALUE *stack_end = alloca(1) +# endif +# define STACK_END (stack_end) +#endif +#if STACK_GROW_DIRECTION < 0 +# define STACK_LENGTH (rb_gc_stack_start - STACK_END) +#elif STACK_GROW_DIRECTION > 0 +# define STACK_LENGTH (STACK_END - rb_gc_stack_start + 1) +#else +# define STACK_LENGTH ((STACK_END < rb_gc_stack_start) ? rb_gc_stack_start - STACK_END\ + : STACK_END - rb_gc_stack_start + 1) +#endif +#if STACK_GROW_DIRECTION > 0 +# define STACK_UPPER(x, a, b) a +#elif STACK_GROW_DIRECTION < 0 +# define STACK_UPPER(x, a, b) b +#else +static int grow_direction; +static int +stack_grow_direction(addr) + VALUE *addr; +{ + SET_STACK_END; + + if (STACK_END > addr) return grow_direction = 1; + return grow_direction = -1; +} +# define stack_growup_p(x) ((grow_direction ? grow_direction : stack_grow_direction(x)) > 0) +# define STACK_UPPER(x, a, b) (stack_growup_p(x) ? a : b) +#endif + +#define GC_WATER_MARK 512 + +#define CHECK_STACK(ret) do {\ + SET_STACK_END;\ + (ret) = (STACK_LENGTH > STACK_LEVEL_MAX + GC_WATER_MARK);\ +} while (0) + +size_t +ruby_stack_length(p) + VALUE **p; +{ + SET_STACK_END; + if (p) *p = STACK_UPPER(STACK_END, rb_gc_stack_start, STACK_END); + return STACK_LENGTH; +} + +int +ruby_stack_check() +{ + int ret; + + CHECK_STACK(ret); + return ret; +} + +#define MARK_STACK_MAX 1024 +static VALUE mark_stack[MARK_STACK_MAX]; +static VALUE *mark_stack_ptr; +static int mark_stack_overflow; + +static void +init_mark_stack() +{ + mark_stack_overflow = 0; + mark_stack_ptr = mark_stack; +} + +#define MARK_STACK_EMPTY (mark_stack_ptr == mark_stack) + +static st_table *source_filenames; + +char * +rb_source_filename(f) + const char *f; +{ + st_data_t name; + + if (!st_lookup(source_filenames, (st_data_t)f, &name)) { + long len = strlen(f) + 1; + char *ptr = ALLOC_N(char, len + 1); + name = (st_data_t)ptr; + *ptr++ = 0; + MEMCPY(ptr, f, char, len); + st_add_direct(source_filenames, (st_data_t)ptr, name); + return ptr; + } + return (char *)name + 1; +} + +static void +mark_source_filename(f) + char *f; +{ + if (f) { + f[-1] = 1; + } +} + +static int +sweep_source_filename(key, value) + char *key, *value; +{ + if (*value) { + *value = 0; + return ST_CONTINUE; + } + else { + free(value); + return ST_DELETE; + } +} + +static void gc_mark _((VALUE ptr, int lev)); +static void gc_mark_children _((VALUE ptr, int lev)); + +static void +gc_mark_all() +{ + RVALUE *p, *pend; + int i; + + init_mark_stack(); + for (i = 0; i < heaps_used; i++) { + p = heaps[i].slot; pend = p + heaps[i].limit; + while (p < pend) { + if ((p->as.basic.flags & FL_MARK) && + (p->as.basic.flags != FL_MARK)) { + gc_mark_children((VALUE)p, 0); + } + p++; + } + } +} + +static void +gc_mark_rest() +{ + VALUE tmp_arry[MARK_STACK_MAX]; + VALUE *p; + + p = (mark_stack_ptr - mark_stack) + tmp_arry; + MEMCPY(tmp_arry, mark_stack, VALUE, MARK_STACK_MAX); + + init_mark_stack(); + while(p != tmp_arry){ + p--; + gc_mark_children(*p, 0); + } +} + +static inline int +is_pointer_to_heap(ptr) + void *ptr; +{ + register RVALUE *p = RANY(ptr); + register RVALUE *heap_org; + register long i; + + if (p < lomem || p > himem) return Qfalse; + if ((VALUE)p % sizeof(RVALUE) != 0) return Qfalse; + + /* check if p looks like a pointer */ + for (i=0; i < heaps_used; i++) { + heap_org = heaps[i].slot; + if (heap_org <= p && p < heap_org + heaps[i].limit) + return Qtrue; + } + return Qfalse; +} + +static void +mark_locations_array(x, n) + register VALUE *x; + register long n; +{ + VALUE v; + while (n--) { + v = *x; + if (is_pointer_to_heap((void *)v)) { + gc_mark(v, 0); + } + x++; + } +} + +void +rb_gc_mark_locations(start, end) + VALUE *start, *end; +{ + long n; + + n = end - start; + mark_locations_array(start,n); +} + +static int +mark_entry(key, value, lev) + ID key; + VALUE value; + int lev; +{ + gc_mark(value, lev); + return ST_CONTINUE; +} + +static void +mark_tbl(tbl, lev) + st_table *tbl; + int lev; +{ + if (!tbl) return; + st_foreach(tbl, mark_entry, lev); +} + +void +rb_mark_tbl(tbl) + st_table *tbl; +{ + mark_tbl(tbl, 0); +} + +static int +mark_key(key, value, lev) + VALUE key, value; + int lev; +{ + gc_mark(key, lev); + return ST_CONTINUE; +} + +static void +mark_set(tbl, lev) + st_table *tbl; + int lev; +{ + if (!tbl) return; + st_foreach(tbl, mark_key, lev); +} + +void +rb_mark_set(tbl) + st_table *tbl; +{ + mark_set(tbl, 0); +} + +static int +mark_keyvalue(key, value, lev) + VALUE key; + VALUE value; + int lev; +{ + gc_mark(key, lev); + gc_mark(value, lev); + return ST_CONTINUE; +} + +static void +mark_hash(tbl, lev) + st_table *tbl; + int lev; +{ + if (!tbl) return; + st_foreach(tbl, mark_keyvalue, lev); +} + +void +rb_mark_hash(tbl) + st_table *tbl; +{ + mark_hash(tbl, 0); +} + +void +rb_gc_mark_maybe(obj) + VALUE obj; +{ + if (is_pointer_to_heap((void *)obj)) { + gc_mark(obj, 0); + } +} + +#define GC_LEVEL_MAX 250 + +static void +gc_mark(ptr, lev) + VALUE ptr; + int lev; +{ + register RVALUE *obj; + + obj = RANY(ptr); + if (rb_special_const_p(ptr)) return; /* special const not marked */ + if (obj->as.basic.flags == 0) return; /* free cell */ + if (obj->as.basic.flags & FL_MARK) return; /* already marked */ + obj->as.basic.flags |= FL_MARK; + + if (lev > GC_LEVEL_MAX || (lev == 0 && ruby_stack_check())) { + if (!mark_stack_overflow) { + if (mark_stack_ptr - mark_stack < MARK_STACK_MAX) { + *mark_stack_ptr = ptr; + mark_stack_ptr++; + } + else { + mark_stack_overflow = 1; + } + } + return; + } + gc_mark_children(ptr, lev+1); +} + +void +rb_gc_mark(ptr) + VALUE ptr; +{ + gc_mark(ptr, 0); +} + +static void +gc_mark_children(ptr, lev) + VALUE ptr; + int lev; +{ + register RVALUE *obj = RANY(ptr); + + goto marking; /* skip */ + + again: + obj = RANY(ptr); + if (rb_special_const_p(ptr)) return; /* special const not marked */ + if (obj->as.basic.flags == 0) return; /* free cell */ + if (obj->as.basic.flags & FL_MARK) return; /* already marked */ + obj->as.basic.flags |= FL_MARK; + + marking: + if (FL_TEST(obj, FL_EXIVAR)) { + rb_mark_generic_ivar(ptr); + } + + switch (obj->as.basic.flags & T_MASK) { + case T_NIL: + case T_FIXNUM: + rb_bug("rb_gc_mark() called for broken object"); + break; + + case T_NODE: + mark_source_filename(obj->as.node.nd_file); + switch (nd_type(obj)) { + case NODE_IF: /* 1,2,3 */ + case NODE_FOR: + case NODE_ITER: + case NODE_CREF: + case NODE_WHEN: + case NODE_MASGN: + case NODE_RESCUE: + case NODE_RESBODY: + case NODE_CLASS: + gc_mark((VALUE)obj->as.node.u2.node, lev); + /* fall through */ + case NODE_BLOCK: /* 1,3 */ + case NODE_ARRAY: + case NODE_DSTR: + case NODE_DXSTR: + case NODE_DREGX: + case NODE_DREGX_ONCE: + case NODE_FBODY: + case NODE_ENSURE: + case NODE_CALL: + case NODE_DEFS: + case NODE_OP_ASGN1: + gc_mark((VALUE)obj->as.node.u1.node, lev); + /* fall through */ + case NODE_SUPER: /* 3 */ + case NODE_FCALL: + case NODE_DEFN: + case NODE_NEWLINE: + ptr = (VALUE)obj->as.node.u3.node; + goto again; + + case NODE_WHILE: /* 1,2 */ + case NODE_UNTIL: + case NODE_AND: + case NODE_OR: + case NODE_CASE: + case NODE_SCLASS: + case NODE_DOT2: + case NODE_DOT3: + case NODE_FLIP2: + case NODE_FLIP3: + case NODE_MATCH2: + case NODE_MATCH3: + case NODE_OP_ASGN_OR: + case NODE_OP_ASGN_AND: + case NODE_MODULE: + case NODE_ALIAS: + case NODE_VALIAS: + case NODE_ARGS: + gc_mark((VALUE)obj->as.node.u1.node, lev); + /* fall through */ + case NODE_METHOD: /* 2 */ + case NODE_NOT: + case NODE_GASGN: + case NODE_LASGN: + case NODE_DASGN: + case NODE_DASGN_CURR: + case NODE_IASGN: + case NODE_CVDECL: + case NODE_CVASGN: + case NODE_COLON3: + case NODE_OPT_N: + case NODE_EVSTR: + case NODE_UNDEF: + ptr = (VALUE)obj->as.node.u2.node; + goto again; + + case NODE_HASH: /* 1 */ + case NODE_LIT: + case NODE_STR: + case NODE_XSTR: + case NODE_DEFINED: + case NODE_MATCH: + case NODE_RETURN: + case NODE_BREAK: + case NODE_NEXT: + case NODE_YIELD: + case NODE_COLON2: + case NODE_SPLAT: + case NODE_TO_ARY: + case NODE_SVALUE: + ptr = (VALUE)obj->as.node.u1.node; + goto again; + + case NODE_SCOPE: /* 2,3 */ + case NODE_BLOCK_PASS: + case NODE_CDECL: + gc_mark((VALUE)obj->as.node.u3.node, lev); + ptr = (VALUE)obj->as.node.u2.node; + goto again; + + case NODE_ZARRAY: /* - */ + case NODE_ZSUPER: + case NODE_CFUNC: + case NODE_VCALL: + case NODE_GVAR: + case NODE_LVAR: + case NODE_DVAR: + case NODE_IVAR: + case NODE_CVAR: + case NODE_NTH_REF: + case NODE_BACK_REF: + case NODE_REDO: + case NODE_RETRY: + case NODE_SELF: + case NODE_NIL: + case NODE_TRUE: + case NODE_FALSE: + case NODE_ATTRSET: + case NODE_BLOCK_ARG: + case NODE_POSTEXE: + break; + case NODE_ALLOCA: + mark_locations_array((VALUE*)obj->as.node.u1.value, + obj->as.node.u3.cnt); + ptr = (VALUE)obj->as.node.u2.node; + goto again; + + default: /* unlisted NODE */ + if (is_pointer_to_heap(obj->as.node.u1.node)) { + gc_mark((VALUE)obj->as.node.u1.node, lev); + } + if (is_pointer_to_heap(obj->as.node.u2.node)) { + gc_mark((VALUE)obj->as.node.u2.node, lev); + } + if (is_pointer_to_heap(obj->as.node.u3.node)) { + gc_mark((VALUE)obj->as.node.u3.node, lev); + } + } + return; /* no need to mark class. */ + } + + gc_mark(obj->as.basic.klass, lev); + switch (obj->as.basic.flags & T_MASK) { + case T_ICLASS: + case T_CLASS: + case T_MODULE: + mark_tbl(obj->as.klass.m_tbl, lev); + mark_tbl(obj->as.klass.iv_tbl, lev); + ptr = obj->as.klass.super; + goto again; + + case T_ARRAY: + if (FL_TEST(obj, ELTS_SHARED)) { + ptr = obj->as.array.aux.shared; + goto again; + } + else { + long i, len = obj->as.array.len; + VALUE *ptr = obj->as.array.ptr; + + for (i=0; i < len; i++) { + gc_mark(*ptr++, lev); + } + } + break; + + case T_HASH: + mark_hash(obj->as.hash.tbl, lev); + ptr = obj->as.hash.ifnone; + goto again; + + case T_STRING: +#define STR_ASSOC FL_USER3 /* copied from string.c */ + if (FL_TEST(obj, ELTS_SHARED|STR_ASSOC)) { + ptr = obj->as.string.aux.shared; + goto again; + } + break; + + case T_DATA: + if (obj->as.data.dmark) (*obj->as.data.dmark)(DATA_PTR(obj)); + break; + + case T_OBJECT: + mark_tbl(obj->as.object.iv_tbl, lev); + break; + + case T_FILE: + case T_REGEXP: + case T_FLOAT: + case T_BIGNUM: + case T_BLKTAG: + break; + + case T_MATCH: + if (obj->as.match.str) { + ptr = obj->as.match.str; + goto again; + } + break; + + case T_VARMAP: + gc_mark(obj->as.varmap.val, lev); + ptr = (VALUE)obj->as.varmap.next; + goto again; + + case T_SCOPE: + if (obj->as.scope.local_vars && (obj->as.scope.flags & SCOPE_MALLOC)) { + int n = obj->as.scope.local_tbl[0]+1; + VALUE *vars = &obj->as.scope.local_vars[-1]; + + while (n--) { + gc_mark(*vars++, lev); + } + } + break; + + case T_STRUCT: + { + long len = obj->as.rstruct.len; + VALUE *ptr = obj->as.rstruct.ptr; + + while (len--) { + gc_mark(*ptr++, lev); + } + } + break; + + default: + rb_bug("rb_gc_mark(): unknown data type 0x%lx(0x%lx) %s", + obj->as.basic.flags & T_MASK, obj, + is_pointer_to_heap(obj) ? "corrupted object" : "non object"); + } +} + +static int obj_free _((VALUE)); + +static inline void +add_freelist(p) + RVALUE *p; +{ + p->as.free.flags = 0; + p->as.free.next = freelist; + freelist = p; +} + +static void +finalize_list(p) + RVALUE *p; +{ + while (p) { + RVALUE *tmp = p->as.free.next; + run_final((VALUE)p); + if (!FL_TEST(p, FL_SINGLETON)) { /* not freeing page */ + add_freelist(p); + } + p = tmp; + } +} + +static void +free_unused_heaps() +{ + int i, j; + + for (i = j = 1; j < heaps_used; i++) { + if (heaps[i].limit == 0) { + free(heaps[i].membase); + heaps_used--; + } + else { + if (i != j) { + heaps[j] = heaps[i]; + } + j++; + } + } +} + +#define T_DEFERRED 0x3a + +void rb_gc_abort_threads(void); + +static void +gc_sweep() +{ + RVALUE *p, *pend, *final_list; + int freed = 0; + int i; + unsigned long live = 0; + unsigned long free_min = 0; + + for (i = 0; i < heaps_used; i++) { + free_min += heaps[i].limit; + } + free_min = free_min * 0.2; + if (free_min < FREE_MIN) + free_min = FREE_MIN; + + if (ruby_in_compile && ruby_parser_stack_on_heap()) { + /* should not reclaim nodes during compilation + if yacc's semantic stack is not allocated on machine stack */ + for (i = 0; i < heaps_used; i++) { + p = heaps[i].slot; pend = p + heaps[i].limit; + while (p < pend) { + if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE) + gc_mark((VALUE)p, 0); + p++; + } + } + } + + mark_source_filename(ruby_sourcefile); + if (source_filenames) { + st_foreach(source_filenames, sweep_source_filename, 0); + } + + freelist = 0; + final_list = deferred_final_list; + deferred_final_list = 0; + for (i = 0; i < heaps_used; i++) { + int n = 0; + RVALUE *free = freelist; + RVALUE *final = final_list; + int deferred; + + p = heaps[i].slot; pend = p + heaps[i].limit; + while (p < pend) { + if (!(p->as.basic.flags & FL_MARK)) { + if (p->as.basic.flags && + ((deferred = obj_free((VALUE)p)) || + ((FL_TEST(p, FL_FINALIZE)) && need_call_final))) { + if (!deferred) { + p->as.free.flags = T_DEFERRED; + RDATA(p)->dfree = 0; + } + p->as.free.flags |= FL_MARK; + p->as.free.next = final_list; + final_list = p; + } + else { + add_freelist(p); + } + n++; + } + else if (BUILTIN_TYPE(p) == T_DEFERRED) { + /* objects to be finalized */ + /* do nothing remain marked */ + } + else { + RBASIC(p)->flags &= ~FL_MARK; + live++; + } + p++; + } + if (n == heaps[i].limit && freed > free_min) { + RVALUE *pp; + + heaps[i].limit = 0; + for (pp = final_list; pp != final; pp = pp->as.free.next) { + pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */ + } + freelist = free; /* cancel this page from freelist */ + } + else { + freed += n; + } + } + if (malloc_increase > malloc_limit) { + malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed); + if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT; + } + malloc_increase = 0; + if (freed < free_min) { + add_heap(); + } + during_gc = 0; + + /* clear finalization list */ + if (final_list) { + deferred_final_list = final_list; + rb_thread_pending = 1; + return; + } + free_unused_heaps(); +} + +void +rb_gc_force_recycle(p) + VALUE p; +{ + add_freelist((RVALUE*)p); +} + +static inline void +make_deferred(p) + RVALUE *p; +{ + p->as.basic.flags = (p->as.basic.flags & ~T_MASK) | T_DEFERRED; +} + +static int +obj_free(obj) + VALUE obj; +{ + switch (BUILTIN_TYPE(obj)) { + case T_NIL: + case T_FIXNUM: + case T_TRUE: + case T_FALSE: + rb_bug("obj_free() called for broken object"); + break; + } + + if (FL_TEST(obj, FL_EXIVAR)) { + rb_free_generic_ivar((VALUE)obj); + } + + switch (BUILTIN_TYPE(obj)) { + case T_OBJECT: + if (RANY(obj)->as.object.iv_tbl) { + st_free_table(RANY(obj)->as.object.iv_tbl); + } + break; + case T_MODULE: + case T_CLASS: + rb_clear_cache_by_class((VALUE)obj); + st_free_table(RANY(obj)->as.klass.m_tbl); + if (RANY(obj)->as.object.iv_tbl) { + st_free_table(RANY(obj)->as.object.iv_tbl); + } + break; + case T_STRING: + if (RANY(obj)->as.string.ptr && !FL_TEST(obj, ELTS_SHARED)) { + RUBY_CRITICAL(free(RANY(obj)->as.string.ptr)); + } + break; + case T_ARRAY: + if (RANY(obj)->as.array.ptr && !FL_TEST(obj, ELTS_SHARED)) { + RUBY_CRITICAL(free(RANY(obj)->as.array.ptr)); + } + break; + case T_HASH: + if (RANY(obj)->as.hash.tbl) { + st_free_table(RANY(obj)->as.hash.tbl); + } + break; + case T_REGEXP: + if (RANY(obj)->as.regexp.ptr) { + re_free_pattern(RANY(obj)->as.regexp.ptr); + } + if (RANY(obj)->as.regexp.str) { + RUBY_CRITICAL(free(RANY(obj)->as.regexp.str)); + } + break; + case T_DATA: + if (DATA_PTR(obj)) { + if ((long)RANY(obj)->as.data.dfree == -1) { + RUBY_CRITICAL(free(DATA_PTR(obj))); + } + else if (RANY(obj)->as.data.dfree) { + make_deferred(RANY(obj)); + return 1; + } + } + break; + case T_MATCH: + if (RANY(obj)->as.match.regs) { + re_free_registers(RANY(obj)->as.match.regs); + RUBY_CRITICAL(free(RANY(obj)->as.match.regs)); + } + break; + case T_FILE: + if (RANY(obj)->as.file.fptr) { + struct rb_io_t *fptr = RANY(obj)->as.file.fptr; + make_deferred(RANY(obj)); + RDATA(obj)->dfree = (void (*)(void*))rb_io_fptr_finalize; + RDATA(obj)->data = fptr; + return 1; + } + break; + case T_ICLASS: + /* iClass shares table with the module */ + break; + + case T_FLOAT: + case T_VARMAP: + case T_BLKTAG: + break; + + case T_BIGNUM: + if (RANY(obj)->as.bignum.digits) { + RUBY_CRITICAL(free(RANY(obj)->as.bignum.digits)); + } + break; + case T_NODE: + switch (nd_type(obj)) { + case NODE_SCOPE: + if (RANY(obj)->as.node.u1.tbl) { + RUBY_CRITICAL(free(RANY(obj)->as.node.u1.tbl)); + } + break; + case NODE_ALLOCA: + RUBY_CRITICAL(free(RANY(obj)->as.node.u1.node)); + break; + } + break; /* no need to free iv_tbl */ + + case T_SCOPE: + if (RANY(obj)->as.scope.local_vars && + RANY(obj)->as.scope.flags != SCOPE_ALLOCA) { + VALUE *vars = RANY(obj)->as.scope.local_vars-1; + if (!(RANY(obj)->as.scope.flags & SCOPE_CLONE) && vars[0] == 0) + RUBY_CRITICAL(free(RANY(obj)->as.scope.local_tbl)); + if ((RANY(obj)->as.scope.flags & (SCOPE_MALLOC|SCOPE_CLONE)) == SCOPE_MALLOC) + RUBY_CRITICAL(free(vars)); + } + break; + + case T_STRUCT: + if (RANY(obj)->as.rstruct.ptr) { + RUBY_CRITICAL(free(RANY(obj)->as.rstruct.ptr)); + } + break; + + default: + rb_bug("gc_sweep(): unknown data type 0x%lx(0x%lx)", + RANY(obj)->as.basic.flags & T_MASK, obj); + } + + return 0; +} + +void +rb_gc_mark_frame(frame) + struct FRAME *frame; +{ + gc_mark((VALUE)frame->node, 0); +} + +#ifdef __GNUC__ +#if defined(__human68k__) || defined(DJGPP) +#if defined(__human68k__) +typedef unsigned long rb_jmp_buf[8]; +__asm__ (".even\n\ +_rb_setjmp:\n\ + move.l 4(sp),a0\n\ + movem.l d3-d7/a3-a5,(a0)\n\ + moveq.l #0,d0\n\ + rts"); +#ifdef setjmp +#undef setjmp +#endif +#else +#if defined(DJGPP) +typedef unsigned long rb_jmp_buf[6]; +__asm__ (".align 4\n\ +_rb_setjmp:\n\ + pushl %ebp\n\ + movl %esp,%ebp\n\ + movl 8(%ebp),%ebp\n\ + movl %eax,(%ebp)\n\ + movl %ebx,4(%ebp)\n\ + movl %ecx,8(%ebp)\n\ + movl %edx,12(%ebp)\n\ + movl %esi,16(%ebp)\n\ + movl %edi,20(%ebp)\n\ + popl %ebp\n\ + xorl %eax,%eax\n\ + ret"); +#endif +#endif +int rb_setjmp (rb_jmp_buf); +#define jmp_buf rb_jmp_buf +#define setjmp rb_setjmp +#endif /* __human68k__ or DJGPP */ +#endif /* __GNUC__ */ + +static void +garbage_collect() +{ + struct gc_list *list; + struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug?? */ + jmp_buf save_regs_gc_mark; + SET_STACK_END; + +#ifdef HAVE_NATIVETHREAD + if (!is_ruby_native_thread()) { + rb_bug("cross-thread violation on rb_gc()"); + } +#endif + if (dont_gc || during_gc) { + if (!freelist) { + add_heap(); + } + return; + } + if (during_gc) return; + during_gc++; + + init_mark_stack(); + + gc_mark((VALUE)ruby_current_node, 0); + + /* mark frame stack */ + for (frame = ruby_frame; frame; frame = frame->prev) { + rb_gc_mark_frame(frame); + if (frame->tmp) { + struct FRAME *tmp = frame->tmp; + while (tmp) { + rb_gc_mark_frame(tmp); + tmp = tmp->prev; + } + } + } + gc_mark((VALUE)ruby_scope, 0); + gc_mark((VALUE)ruby_dyna_vars, 0); + if (finalizer_table) { + mark_tbl(finalizer_table, 0); + } + + FLUSH_REGISTER_WINDOWS; + /* This assumes that all registers are saved into the jmp_buf (and stack) */ + setjmp(save_regs_gc_mark); + mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *)); +#if STACK_GROW_DIRECTION < 0 + rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start); +#elif STACK_GROW_DIRECTION > 0 + rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1); +#else + if ((VALUE*)STACK_END < rb_gc_stack_start) + rb_gc_mark_locations((VALUE*)STACK_END, rb_gc_stack_start); + else + rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END + 1); +#endif +#ifdef __ia64 + /* mark backing store (flushed register window on the stack) */ + /* the basic idea from guile GC code */ + rb_gc_mark_locations(rb_gc_register_stack_start, (VALUE*)rb_ia64_bsp()); +#endif +#if defined(__human68k__) || defined(__mc68000__) + rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2), + (VALUE*)((char*)rb_gc_stack_start + 2)); +#endif + rb_gc_mark_threads(); + + /* mark protected global variables */ + for (list = global_List; list; list = list->next) { + rb_gc_mark_maybe(*list->varptr); + } + rb_mark_end_proc(); + rb_gc_mark_global_tbl(); + + rb_mark_tbl(rb_class_tbl); + rb_gc_mark_trap_list(); + + /* mark generic instance variables for special constants */ + rb_mark_generic_ivar_tbl(); + + rb_gc_mark_parser(); + + /* gc_mark objects whose marking are not completed*/ + do { + while (!MARK_STACK_EMPTY) { + if (mark_stack_overflow){ + gc_mark_all(); + } + else { + gc_mark_rest(); + } + } + rb_gc_abort_threads(); + } while (!MARK_STACK_EMPTY); + + gc_sweep(); +} + +void +rb_gc() +{ + garbage_collect(); + rb_gc_finalize_deferred(); +} + +/* + * call-seq: + * GC.start => nil + * gc.garbage_collect => nil + * ObjectSpace.garbage_collect => nil + * + * Initiates garbage collection, unless manually disabled. + * + */ + +VALUE +rb_gc_start() +{ + rb_gc(); + return Qnil; +} + +void +ruby_set_stack_size(size) + size_t size; +{ +#ifndef STACK_LEVEL_MAX + STACK_LEVEL_MAX = size / sizeof(VALUE); +#endif +} + +void +Init_stack(addr) + VALUE *addr; +{ +#ifdef __ia64 + if (rb_gc_register_stack_start == 0) { +# if defined(__FreeBSD__) + /* + * FreeBSD/ia64 currently does not have a way for a process to get the + * base address for the RSE backing store, so hardcode it. + */ + rb_gc_register_stack_start = (4ULL<<61); +# elif defined(HAVE___LIBC_IA64_REGISTER_BACKING_STORE_BASE) +# pragma weak __libc_ia64_register_backing_store_base + extern unsigned long __libc_ia64_register_backing_store_base; + rb_gc_register_stack_start = (VALUE*)__libc_ia64_register_backing_store_base; +# endif + } + { + VALUE *bsp = (VALUE*)rb_ia64_bsp(); + if (rb_gc_register_stack_start == 0 || + bsp < rb_gc_register_stack_start) { + rb_gc_register_stack_start = bsp; + } + } +#endif +#if defined(_WIN32) || defined(__CYGWIN__) + MEMORY_BASIC_INFORMATION m; + memset(&m, 0, sizeof(m)); + VirtualQuery(&m, &m, sizeof(m)); + rb_gc_stack_start = + STACK_UPPER((VALUE *)&m, (VALUE *)m.BaseAddress, + (VALUE *)((char *)m.BaseAddress + m.RegionSize) - 1); +#elif defined(STACK_END_ADDRESS) + { + extern void *STACK_END_ADDRESS; + rb_gc_stack_start = STACK_END_ADDRESS; + } +#else + if (!addr) addr = (void *)&addr; + STACK_UPPER(&addr, addr, ++addr); + if (rb_gc_stack_start) { + if (STACK_UPPER(&addr, + rb_gc_stack_start > addr, + rb_gc_stack_start < addr)) + rb_gc_stack_start = addr; + return; + } + rb_gc_stack_start = addr; +#endif +#ifdef HAVE_GETRLIMIT + { + struct rlimit rlim; + + if (getrlimit(RLIMIT_STACK, &rlim) == 0) { + unsigned int space = rlim.rlim_cur/5; + + if (space > 1024*1024) space = 1024*1024; + STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE); + } + } +#endif +} + +void ruby_init_stack(VALUE *addr +#ifdef __ia64 + , void *bsp +#endif + ) +{ + if (!rb_gc_stack_start || + STACK_UPPER(&addr, + rb_gc_stack_start > addr, + rb_gc_stack_start < addr)) { + rb_gc_stack_start = addr; + } +#ifdef __ia64 + if (!rb_gc_register_stack_start || + (VALUE*)bsp < rb_gc_register_stack_start) { + rb_gc_register_stack_start = (VALUE*)bsp; + } +#endif +#ifdef HAVE_GETRLIMIT + { + struct rlimit rlim; + + if (getrlimit(RLIMIT_STACK, &rlim) == 0) { + unsigned int space = rlim.rlim_cur/5; + + if (space > 1024*1024) space = 1024*1024; + STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE); + } + } +#elif defined _WIN32 + { + MEMORY_BASIC_INFORMATION mi; + DWORD size; + DWORD space; + + if (VirtualQuery(&mi, &mi, sizeof(mi))) { + size = (char *)mi.BaseAddress - (char *)mi.AllocationBase; + space = size / 5; + if (space > 1024*1024) space = 1024*1024; + STACK_LEVEL_MAX = (size - space) / sizeof(VALUE); + } + } +#endif +} + +/* + * Document-class: ObjectSpace + * + * The <code>ObjectSpace</code> module contains a number of routines + * that interact with the garbage collection facility and allow you to + * traverse all living objects with an iterator. + * + * <code>ObjectSpace</code> also provides support for object + * finalizers, procs that will be called when a specific object is + * about to be destroyed by garbage collection. + * + * include ObjectSpace + * + * + * a = "A" + * b = "B" + * c = "C" + * + * + * define_finalizer(a, proc {|id| puts "Finalizer one on #{id}" }) + * define_finalizer(a, proc {|id| puts "Finalizer two on #{id}" }) + * define_finalizer(b, proc {|id| puts "Finalizer three on #{id}" }) + * + * <em>produces:</em> + * + * Finalizer three on 537763470 + * Finalizer one on 537763480 + * Finalizer two on 537763480 + * + */ + +void +Init_heap() +{ + if (!rb_gc_stack_start) { + Init_stack(0); + } + add_heap(); +} + +static VALUE +os_obj_of(of) + VALUE of; +{ + int i; + int n = 0; + + for (i = 0; i < heaps_used; i++) { + RVALUE *p, *pend; + + p = heaps[i].slot; pend = p + heaps[i].limit; + for (;p < pend; p++) { + if (p->as.basic.flags) { + switch (BUILTIN_TYPE(p)) { + case T_NONE: + case T_ICLASS: + case T_VARMAP: + case T_SCOPE: + case T_NODE: + case T_DEFERRED: + continue; + case T_CLASS: + if (FL_TEST(p, FL_SINGLETON)) continue; + default: + if (!p->as.basic.klass) continue; + if (!of || rb_obj_is_kind_of((VALUE)p, of)) { + rb_yield((VALUE)p); + n++; + } + } + } + } + } + + return INT2FIX(n); +} + +/* + * call-seq: + * ObjectSpace.each_object([module]) {|obj| ... } => fixnum + * + * Calls the block once for each living, nonimmediate object in this + * Ruby process. If <i>module</i> is specified, calls the block + * for only those classes or modules that match (or are a subclass of) + * <i>module</i>. Returns the number of objects found. Immediate + * objects (<code>Fixnum</code>s, <code>Symbol</code>s + * <code>true</code>, <code>false</code>, and <code>nil</code>) are + * never returned. In the example below, <code>each_object</code> + * returns both the numbers we defined and several constants defined in + * the <code>Math</code> module. + * + * a = 102.7 + * b = 95 # Won't be returned + * c = 12345678987654321 + * count = ObjectSpace.each_object(Numeric) {|x| p x } + * puts "Total count: #{count}" + * + * <em>produces:</em> + * + * 12345678987654321 + * 102.7 + * 2.71828182845905 + * 3.14159265358979 + * 2.22044604925031e-16 + * 1.7976931348623157e+308 + * 2.2250738585072e-308 + * Total count: 7 + * + */ + +static VALUE +os_each_obj(argc, argv) + int argc; + VALUE *argv; +{ + VALUE of; + + rb_secure(4); + if (rb_scan_args(argc, argv, "01", &of) == 0) { + of = 0; + } + return os_obj_of(of); +} + +static VALUE finalizers; + +/* deprecated + */ + +static VALUE +add_final(os, block) + VALUE os, block; +{ + rb_warn("ObjectSpace::add_finalizer is deprecated; use define_finalizer"); + if (!rb_respond_to(block, rb_intern("call"))) { + rb_raise(rb_eArgError, "wrong type argument %s (should be callable)", + rb_obj_classname(block)); + } + rb_ary_push(finalizers, block); + return block; +} + +/* + * deprecated + */ +static VALUE +rm_final(os, block) + VALUE os, block; +{ + rb_warn("ObjectSpace::remove_finalizer is deprecated; use undefine_finalizer"); + rb_ary_delete(finalizers, block); + return block; +} + +/* + * deprecated + */ +static VALUE +finals() +{ + rb_warn("ObjectSpace::finalizers is deprecated"); + return finalizers; +} + +/* + * deprecated + */ + +static VALUE +call_final(os, obj) + VALUE os, obj; +{ + rb_warn("ObjectSpace::call_finalizer is deprecated; use define_finalizer"); + need_call_final = 1; + FL_SET(obj, FL_FINALIZE); + return obj; +} + +/* + * call-seq: + * ObjectSpace.undefine_finalizer(obj) + * + * Removes all finalizers for <i>obj</i>. + * + */ + +static VALUE +undefine_final(os, obj) + VALUE os, obj; +{ + if (finalizer_table) { + st_delete(finalizer_table, (st_data_t*)&obj, 0); + } + return obj; +} + +/* + * call-seq: + * ObjectSpace.define_finalizer(obj, aProc=proc()) + * + * Adds <i>aProc</i> as a finalizer, to be called after <i>obj</i> + * was destroyed. + * + */ + +static VALUE +define_final(argc, argv, os) + int argc; + VALUE *argv; + VALUE os; +{ + VALUE obj, block, table; + + rb_scan_args(argc, argv, "11", &obj, &block); + if (argc == 1) { + block = rb_block_proc(); + } + else if (!rb_respond_to(block, rb_intern("call"))) { + rb_raise(rb_eArgError, "wrong type argument %s (should be callable)", + rb_obj_classname(block)); + } + need_call_final = 1; + if (!FL_ABLE(obj)) { + rb_raise(rb_eArgError, "cannot define finalizer for %s", + rb_obj_classname(obj)); + } + RBASIC(obj)->flags |= FL_FINALIZE; + + block = rb_ary_new3(2, INT2FIX(ruby_safe_level), block); + OBJ_FREEZE(block); + + if (!finalizer_table) { + finalizer_table = st_init_numtable(); + } + if (st_lookup(finalizer_table, obj, &table)) { + rb_ary_push(table, block); + } + else { + table = rb_ary_new3(1, block); + RBASIC(table)->klass = 0; + st_add_direct(finalizer_table, obj, table); + } + return block; +} + +void +rb_gc_copy_finalizer(dest, obj) + VALUE dest, obj; +{ + VALUE table; + + if (!finalizer_table) return; + if (!FL_TEST(obj, FL_FINALIZE)) return; + if (st_lookup(finalizer_table, obj, &table)) { + st_insert(finalizer_table, dest, table); + } + RBASIC(dest)->flags |= FL_FINALIZE; +} + +static VALUE +run_single_final(args) + VALUE *args; +{ + rb_eval_cmd(args[0], args[1], (int)args[2]); + return Qnil; +} + +static void +run_final(obj) + VALUE obj; +{ + long i; + int status, critical_save = rb_thread_critical; + VALUE args[3], table, objid; + + objid = rb_obj_id(obj); /* make obj into id */ + rb_thread_critical = Qtrue; + /* NOTE: This change below, adding DATA_PTR(obj) to the if line, is a stopgap fix for segfaults; the reason for DATA_PTR(obj) == 0 needs to be found and fixed. */ + if (BUILTIN_TYPE(obj) == T_DEFERRED && RDATA(obj)->dfree && DATA_PTR(obj)) { + (*RDATA(obj)->dfree)(DATA_PTR(obj)); + } + args[1] = 0; + args[2] = (VALUE)ruby_safe_level; + for (i=0; i<RARRAY(finalizers)->len; i++) { + args[0] = RARRAY(finalizers)->ptr[i]; + if (!args[1]) args[1] = rb_ary_new3(1, objid); + rb_protect((VALUE(*)_((VALUE)))run_single_final, (VALUE)args, &status); + } + if (finalizer_table && st_delete(finalizer_table, (st_data_t*)&obj, &table)) { + for (i=0; i<RARRAY(table)->len; i++) { + VALUE final = RARRAY(table)->ptr[i]; + args[0] = RARRAY(final)->ptr[1]; + if (!args[1]) args[1] = rb_ary_new3(1, objid); + args[2] = FIX2INT(RARRAY(final)->ptr[0]); + rb_protect((VALUE(*)_((VALUE)))run_single_final, (VALUE)args, &status); + } + } + rb_thread_critical = critical_save; +} + +void +rb_gc_finalize_deferred() +{ + RVALUE *p = deferred_final_list; + + deferred_final_list = 0; + if (p) { + finalize_list(p); + free_unused_heaps(); + } +} + +static int +chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg) +{ + RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg; + if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) { + if (BUILTIN_TYPE(p) != T_DEFERRED) { + p->as.free.flags = FL_MARK | T_DEFERRED; /* remain marked */ + RDATA(p)->dfree = 0; + } + p->as.free.next = *final_list; + *final_list = p; + } + return ST_CONTINUE; +} + +void +rb_gc_call_finalizer_at_exit() +{ + RVALUE *p, *pend; + int i; + + /* run finalizers */ + if (need_call_final) { + do { + p = deferred_final_list; + deferred_final_list = 0; + finalize_list(p); + mark_tbl(finalizer_table, 0); + st_foreach(finalizer_table, chain_finalized_object, + (st_data_t)&deferred_final_list); + } while (deferred_final_list); + } + /* run data object's finalizers */ + for (i = 0; i < heaps_used; i++) { + p = heaps[i].slot; pend = p + heaps[i].limit; + while (p < pend) { + if (BUILTIN_TYPE(p) == T_DATA && + DATA_PTR(p) && RANY(p)->as.data.dfree && + RANY(p)->as.basic.klass != rb_cThread) { + p->as.free.flags = 0; + if ((long)RANY(p)->as.data.dfree == -1) { + RUBY_CRITICAL(free(DATA_PTR(p))); + } + else if (RANY(p)->as.data.dfree) { + (*RANY(p)->as.data.dfree)(DATA_PTR(p)); + } + } + else if (BUILTIN_TYPE(p) == T_FILE) { + p->as.free.flags = 0; + rb_io_fptr_finalize(RANY(p)->as.file.fptr); + } + p++; + } + } +} + +/* + * call-seq: + * ObjectSpace._id2ref(object_id) -> an_object + * + * Converts an object id to a reference to the object. May not be + * called on an object id passed as a parameter to a finalizer. + * + * s = "I am a string" #=> "I am a string" + * r = ObjectSpace._id2ref(s.object_id) #=> "I am a string" + * r == s #=> true + * + */ + +static VALUE +id2ref(obj, objid) + VALUE obj, objid; +{ + unsigned long ptr, p0; + int type; + + rb_secure(4); + p0 = ptr = NUM2ULONG(objid); + if (ptr == Qtrue) return Qtrue; + if (ptr == Qfalse) return Qfalse; + if (ptr == Qnil) return Qnil; + if (FIXNUM_P(ptr)) return (VALUE)ptr; + ptr = objid ^ FIXNUM_FLAG; /* unset FIXNUM_FLAG */ + + if ((ptr % sizeof(RVALUE)) == (4 << 2)) { + ID symid = ptr / sizeof(RVALUE); + if (rb_id2name(symid) == 0) + rb_raise(rb_eRangeError, "%p is not symbol id value", p0); + return ID2SYM(symid); + } + + if (!is_pointer_to_heap((void *)ptr)|| + (type = BUILTIN_TYPE(ptr)) > T_SYMBOL || type == T_ICLASS) { + rb_raise(rb_eRangeError, "0x%lx is not id value", p0); + } + if (BUILTIN_TYPE(ptr) == 0 || RBASIC(ptr)->klass == 0) { + rb_raise(rb_eRangeError, "0x%lx is recycled object", p0); + } + return (VALUE)ptr; +} + +/* + * Document-method: __id__ + * Document-method: object_id + * + * call-seq: + * obj.__id__ => fixnum + * obj.object_id => fixnum + * + * Returns an integer identifier for <i>obj</i>. The same number will + * be returned on all calls to <code>id</code> for a given object, and + * no two active objects will share an id. + * <code>Object#object_id</code> is a different concept from the + * <code>:name</code> notation, which returns the symbol id of + * <code>name</code>. Replaces the deprecated <code>Object#id</code>. + */ + +/* + * call-seq: + * obj.hash => fixnum + * + * Generates a <code>Fixnum</code> hash value for this object. This + * function must have the property that <code>a.eql?(b)</code> implies + * <code>a.hash == b.hash</code>. The hash value is used by class + * <code>Hash</code>. Any hash value that exceeds the capacity of a + * <code>Fixnum</code> will be truncated before being used. + */ + +VALUE +rb_obj_id(VALUE obj) +{ + /* + * 32-bit VALUE space + * MSB ------------------------ LSB + * false 00000000000000000000000000000000 + * true 00000000000000000000000000000010 + * nil 00000000000000000000000000000100 + * undef 00000000000000000000000000000110 + * symbol ssssssssssssssssssssssss00001110 + * object oooooooooooooooooooooooooooooo00 = 0 (mod sizeof(RVALUE)) + * fixnum fffffffffffffffffffffffffffffff1 + * + * object_id space + * LSB + * false 00000000000000000000000000000000 + * true 00000000000000000000000000000010 + * nil 00000000000000000000000000000100 + * undef 00000000000000000000000000000110 + * symbol 000SSSSSSSSSSSSSSSSSSSSSSSSSSS0 S...S % A = 4 (S...S = s...s * A + 4) + * object oooooooooooooooooooooooooooooo0 o...o % A = 0 + * fixnum fffffffffffffffffffffffffffffff1 bignum if required + * + * where A = sizeof(RVALUE)/4 + * + * sizeof(RVALUE) is + * 20 if 32-bit, double is 4-byte aligned + * 24 if 32-bit, double is 8-byte aligned + * 40 if 64-bit + */ + if (TYPE(obj) == T_SYMBOL) { + return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG; + } + if (SPECIAL_CONST_P(obj)) { + return LONG2NUM((long)obj); + } + return (VALUE)((long)obj|FIXNUM_FLAG); +} + +/* + * The <code>GC</code> module provides an interface to Ruby's mark and + * sweep garbage collection mechanism. Some of the underlying methods + * are also available via the <code>ObjectSpace</code> module. + */ + +void +Init_GC() +{ + VALUE rb_mObSpace; + + rb_mGC = rb_define_module("GC"); + rb_define_singleton_method(rb_mGC, "start", rb_gc_start, 0); + rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0); + rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0); + rb_define_method(rb_mGC, "garbage_collect", rb_gc_start, 0); + + rb_mObSpace = rb_define_module("ObjectSpace"); + rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1); + rb_define_module_function(rb_mObSpace, "garbage_collect", rb_gc_start, 0); + rb_define_module_function(rb_mObSpace, "add_finalizer", add_final, 1); + rb_define_module_function(rb_mObSpace, "remove_finalizer", rm_final, 1); + rb_define_module_function(rb_mObSpace, "finalizers", finals, 0); + rb_define_module_function(rb_mObSpace, "call_finalizer", call_final, 1); + + rb_define_module_function(rb_mObSpace, "define_finalizer", define_final, -1); + rb_define_module_function(rb_mObSpace, "undefine_finalizer", undefine_final, 1); + + rb_define_module_function(rb_mObSpace, "_id2ref", id2ref, 1); + + rb_gc_register_address(&rb_mObSpace); + rb_global_variable(&finalizers); + rb_gc_unregister_address(&rb_mObSpace); + finalizers = rb_ary_new(); + + source_filenames = st_init_strtable(); + + rb_global_variable(&nomem_error); + nomem_error = rb_exc_new3(rb_eNoMemError, + rb_obj_freeze(rb_str_new2("failed to allocate memory"))); + OBJ_TAINT(nomem_error); + OBJ_FREEZE(nomem_error); + + rb_define_method(rb_mKernel, "hash", rb_obj_id, 0); + rb_define_method(rb_mKernel, "__id__", rb_obj_id, 0); + rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0); +} +/********************************************************************** + + hash.c - + + $Author: shyouhei $ + $Date: 2007-08-22 05:42:36 +0200 (Wed, 22 Aug 2007) $ + created at: Mon Nov 22 18:51:18 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "st.h" +#include "util.h" +#include "rubysig.h" + +#ifdef __APPLE__ +#include <crt_externs.h> +#endif + +#define HASH_DELETED FL_USER1 +#define HASH_PROC_DEFAULT FL_USER2 + +static void +rb_hash_modify(hash) + VALUE hash; +{ + if (!RHASH(hash)->tbl) rb_raise(rb_eTypeError, "uninitialized Hash"); + if (OBJ_FROZEN(hash)) rb_error_frozen("hash"); + if (!OBJ_TAINTED(hash) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify hash"); +} + +VALUE +rb_hash_freeze(hash) + VALUE hash; +{ + return rb_obj_freeze(hash); +} + +VALUE rb_cHash; + +static VALUE envtbl; +static ID id_hash, id_call, id_default; + +static VALUE +eql(args) + VALUE *args; +{ + return (VALUE)rb_eql(args[0], args[1]); +} + +static int +rb_any_cmp(a, b) + VALUE a, b; +{ + VALUE args[2]; + + if (a == b) return 0; + if (FIXNUM_P(a) && FIXNUM_P(b)) { + return a != b; + } + if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString && + TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) { + return rb_str_cmp(a, b); + } + if (a == Qundef || b == Qundef) return -1; + if (SYMBOL_P(a) && SYMBOL_P(b)) { + return a != b; + } + + args[0] = a; + args[1] = b; + return !rb_with_disable_interrupt(eql, (VALUE)args); +} + +VALUE +rb_hash(obj) + VALUE obj; +{ + return rb_funcall(obj, id_hash, 0); +} + +static int +rb_any_hash(a) + VALUE a; +{ + VALUE hval; + + switch (TYPE(a)) { + case T_FIXNUM: + case T_SYMBOL: + return (int)a; + break; + + case T_STRING: + return rb_str_hash(a); + break; + + default: + hval = rb_funcall(a, id_hash, 0); + if (!FIXNUM_P(hval)) { + hval = rb_funcall(hval, '%', 1, INT2FIX(536870923)); + } + return (int)FIX2LONG(hval); + } +} + +static struct st_hash_type objhash = { + rb_any_cmp, + rb_any_hash, +}; + +struct foreach_safe_arg { + st_table *tbl; + int (*func)(); + st_data_t arg; +}; + +static int +foreach_safe_i(key, value, arg) + st_data_t key, value; + struct foreach_safe_arg *arg; +{ + int status; + + if (key == Qundef) return ST_CONTINUE; + status = (*arg->func)(key, value, arg->arg); + if (status == ST_CONTINUE) { + return ST_CHECK; + } + return status; +} + +void +st_foreach_safe(table, func, a) + st_table *table; + int (*func)(); + st_data_t a; +{ + struct foreach_safe_arg arg; + + arg.tbl = table; + arg.func = func; + arg.arg = a; + if (st_foreach(table, foreach_safe_i, (st_data_t)&arg)) { + rb_raise(rb_eRuntimeError, "hash modified during iteration"); + } +} + +struct hash_foreach_arg { + VALUE hash; + int (*func)(); + VALUE arg; +}; + +static int +hash_foreach_iter(key, value, arg) + VALUE key, value; + struct hash_foreach_arg *arg; +{ + int status; + st_table *tbl; + + tbl = RHASH(arg->hash)->tbl; + if (key == Qundef) return ST_CONTINUE; + status = (*arg->func)(key, value, arg->arg); + if (RHASH(arg->hash)->tbl != tbl) { + rb_raise(rb_eRuntimeError, "rehash occurred during iteration"); + } + switch (status) { + case ST_DELETE: + st_delete_safe(tbl, (st_data_t*)&key, 0, Qundef); + FL_SET(arg->hash, HASH_DELETED); + case ST_CONTINUE: + break; + case ST_STOP: + return ST_STOP; + } + return ST_CHECK; +} + +static VALUE +hash_foreach_ensure(hash) + VALUE hash; +{ + RHASH(hash)->iter_lev--; + + if (RHASH(hash)->iter_lev == 0) { + if (FL_TEST(hash, HASH_DELETED)) { + st_cleanup_safe(RHASH(hash)->tbl, Qundef); + FL_UNSET(hash, HASH_DELETED); + } + } + return 0; +} + +static VALUE +hash_foreach_call(arg) + struct hash_foreach_arg *arg; +{ + if (st_foreach(RHASH(arg->hash)->tbl, hash_foreach_iter, (st_data_t)arg)) { + rb_raise(rb_eRuntimeError, "hash modified during iteration"); + } + return Qnil; +} + +void +rb_hash_foreach(hash, func, farg) + VALUE hash; + int (*func)(); + VALUE farg; +{ + struct hash_foreach_arg arg; + + RHASH(hash)->iter_lev++; + arg.hash = hash; + arg.func = func; + arg.arg = farg; + rb_ensure(hash_foreach_call, (VALUE)&arg, hash_foreach_ensure, hash); +} + +static VALUE hash_alloc0 _((VALUE)); +static VALUE hash_alloc _((VALUE)); +static VALUE +hash_alloc0(klass) + VALUE klass; +{ + NEWOBJ(hash, struct RHash); + OBJSETUP(hash, klass, T_HASH); + + hash->ifnone = Qnil; + + return (VALUE)hash; +} + +static VALUE +hash_alloc(klass) + VALUE klass; +{ + VALUE hash = hash_alloc0(klass); + + RHASH(hash)->tbl = st_init_table(&objhash); + + return hash; +} + +VALUE +rb_hash_new() +{ + return hash_alloc(rb_cHash); +} + +/* + * call-seq: + * Hash.new => hash + * Hash.new(obj) => aHash + * Hash.new {|hash, key| block } => aHash + * + * Returns a new, empty hash. If this hash is subsequently accessed by + * a key that doesn't correspond to a hash entry, the value returned + * depends on the style of <code>new</code> used to create the hash. In + * the first form, the access returns <code>nil</code>. If + * <i>obj</i> is specified, this single object will be used for + * all <em>default values</em>. If a block is specified, it will be + * called with the hash object and the key, and should return the + * default value. It is the block's responsibility to store the value + * in the hash if required. + * + * h = Hash.new("Go Fish") + * h["a"] = 100 + * h["b"] = 200 + * h["a"] #=> 100 + * h["c"] #=> "Go Fish" + * # The following alters the single default object + * h["c"].upcase! #=> "GO FISH" + * h["d"] #=> "GO FISH" + * h.keys #=> ["a", "b"] + * + * # While this creates a new default object each time + * h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" } + * h["c"] #=> "Go Fish: c" + * h["c"].upcase! #=> "GO FISH: C" + * h["d"] #=> "Go Fish: d" + * h.keys #=> ["c", "d"] + * + */ + +static VALUE +rb_hash_initialize(argc, argv, hash) + int argc; + VALUE *argv; + VALUE hash; +{ + VALUE ifnone; + + rb_hash_modify(hash); + if (rb_block_given_p()) { + if (argc > 0) { + rb_raise(rb_eArgError, "wrong number of arguments"); + } + RHASH(hash)->ifnone = rb_block_proc(); + FL_SET(hash, HASH_PROC_DEFAULT); + } + else { + rb_scan_args(argc, argv, "01", &ifnone); + RHASH(hash)->ifnone = ifnone; + } + + return hash; +} + +/* + * call-seq: + * Hash[ [key =>|, value]* ] => hash + * + * Creates a new hash populated with the given objects. Equivalent to + * the literal <code>{ <i>key</i>, <i>value</i>, ... }</code>. Keys and + * values occur in pairs, so there must be an even number of arguments. + * + * Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200} + * Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200} + * { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200} + */ + +static VALUE +rb_hash_s_create(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + VALUE hash; + int i; + + if (argc == 1 && TYPE(argv[0]) == T_HASH) { + hash = hash_alloc0(klass); + RHASH(hash)->tbl = st_copy(RHASH(argv[0])->tbl); + + return hash; + } + + if (argc % 2 != 0) { + rb_raise(rb_eArgError, "odd number of arguments for Hash"); + } + + hash = hash_alloc(klass); + for (i=0; i<argc; i+=2) { + rb_hash_aset(hash, argv[i], argv[i + 1]); + } + + return hash; +} + +static VALUE +to_hash(hash) + VALUE hash; +{ + return rb_convert_type(hash, T_HASH, "Hash", "to_hash"); +} + +static int +rb_hash_rehash_i(key, value, tbl) + VALUE key, value; + st_table *tbl; +{ + if (key != Qundef) st_insert(tbl, key, value); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.rehash -> hsh + * + * Rebuilds the hash based on the current hash values for each key. If + * values of key objects have changed since they were inserted, this + * method will reindex <i>hsh</i>. If <code>Hash#rehash</code> is + * called while an iterator is traversing the hash, an + * <code>IndexError</code> will be raised in the iterator. + * + * a = [ "a", "b" ] + * c = [ "c", "d" ] + * h = { a => 100, c => 300 } + * h[a] #=> 100 + * a[0] = "z" + * h[a] #=> nil + * h.rehash #=> {["z", "b"]=>100, ["c", "d"]=>300} + * h[a] #=> 100 + */ + +static VALUE +rb_hash_rehash(hash) + VALUE hash; +{ + st_table *tbl; + + rb_hash_modify(hash); + tbl = st_init_table_with_size(&objhash, RHASH(hash)->tbl->num_entries); + rb_hash_foreach(hash, rb_hash_rehash_i, (st_data_t)tbl); + st_free_table(RHASH(hash)->tbl); + RHASH(hash)->tbl = tbl; + + return hash; +} + +/* + * call-seq: + * hsh[key] => value + * + * Element Reference---Retrieves the <i>value</i> object corresponding + * to the <i>key</i> object. If not found, returns the a default value (see + * <code>Hash::new</code> for details). + * + * h = { "a" => 100, "b" => 200 } + * h["a"] #=> 100 + * h["c"] #=> nil + * + */ + +VALUE +rb_hash_aref(hash, key) + VALUE hash, key; +{ + VALUE val; + + if (!st_lookup(RHASH(hash)->tbl, key, &val)) { + return rb_funcall(hash, id_default, 1, key); + } + return val; +} + +/* + * call-seq: + * hsh.fetch(key [, default] ) => obj + * hsh.fetch(key) {| key | block } => obj + * + * Returns a value from the hash for the given key. If the key can't be + * found, there are several options: With no other arguments, it will + * raise an <code>IndexError</code> exception; if <i>default</i> is + * given, then that will be returned; if the optional code block is + * specified, then that will be run and its result returned. + * + * h = { "a" => 100, "b" => 200 } + * h.fetch("a") #=> 100 + * h.fetch("z", "go fish") #=> "go fish" + * h.fetch("z") { |el| "go fish, #{el}"} #=> "go fish, z" + * + * The following example shows that an exception is raised if the key + * is not found and a default value is not supplied. + * + * h = { "a" => 100, "b" => 200 } + * h.fetch("z") + * + * <em>produces:</em> + * + * prog.rb:2:in `fetch': key not found (IndexError) + * from prog.rb:2 + * + */ + +static VALUE +rb_hash_fetch(argc, argv, hash) + int argc; + VALUE *argv; + VALUE hash; +{ + VALUE key, if_none; + VALUE val; + long block_given; + + rb_scan_args(argc, argv, "11", &key, &if_none); + + block_given = rb_block_given_p(); + if (block_given && argc == 2) { + rb_warn("block supersedes default value argument"); + } + if (!st_lookup(RHASH(hash)->tbl, key, &val)) { + if (block_given) return rb_yield(key); + if (argc == 1) { + rb_raise(rb_eIndexError, "key not found"); + } + return if_none; + } + return val; +} + +/* + * call-seq: + * hsh.default(key=nil) => obj + * + * Returns the default value, the value that would be returned by + * <i>hsh</i>[<i>key</i>] if <i>key</i> did not exist in <i>hsh</i>. + * See also <code>Hash::new</code> and <code>Hash#default=</code>. + * + * h = Hash.new #=> {} + * h.default #=> nil + * h.default(2) #=> nil + * + * h = Hash.new("cat") #=> {} + * h.default #=> "cat" + * h.default(2) #=> "cat" + * + * h = Hash.new {|h,k| h[k] = k.to_i*10} #=> {} + * h.default #=> 0 + * h.default(2) #=> 20 + */ + +static VALUE +rb_hash_default(argc, argv, hash) + int argc; + VALUE *argv; + VALUE hash; +{ + VALUE key; + + rb_scan_args(argc, argv, "01", &key); + if (FL_TEST(hash, HASH_PROC_DEFAULT)) { + if (argc == 0) return Qnil; + return rb_funcall(RHASH(hash)->ifnone, id_call, 2, hash, key); + } + return RHASH(hash)->ifnone; +} + +/* + * call-seq: + * hsh.default = obj => hsh + * + * Sets the default value, the value returned for a key that does not + * exist in the hash. It is not possible to set the a default to a + * <code>Proc</code> that will be executed on each key lookup. + * + * h = { "a" => 100, "b" => 200 } + * h.default = "Go fish" + * h["a"] #=> 100 + * h["z"] #=> "Go fish" + * # This doesn't do what you might hope... + * h.default = proc do |hash, key| + * hash[key] = key + key + * end + * h[2] #=> #<Proc:0x401b3948@-:6> + * h["cat"] #=> #<Proc:0x401b3948@-:6> + */ + +static VALUE +rb_hash_set_default(hash, ifnone) + VALUE hash, ifnone; +{ + rb_hash_modify(hash); + RHASH(hash)->ifnone = ifnone; + FL_UNSET(hash, HASH_PROC_DEFAULT); + return ifnone; +} + +/* + * call-seq: + * hsh.default_proc -> anObject + * + * If <code>Hash::new</code> was invoked with a block, return that + * block, otherwise return <code>nil</code>. + * + * h = Hash.new {|h,k| h[k] = k*k } #=> {} + * p = h.default_proc #=> #<Proc:0x401b3d08@-:1> + * a = [] #=> [] + * p.call(a, 2) + * a #=> [nil, nil, 4] + */ + + +static VALUE +rb_hash_default_proc(hash) + VALUE hash; +{ + if (FL_TEST(hash, HASH_PROC_DEFAULT)) { + return RHASH(hash)->ifnone; + } + return Qnil; +} + +static int +index_i(key, value, args) + VALUE key, value; + VALUE *args; +{ + if (rb_equal(value, args[0])) { + args[1] = key; + return ST_STOP; + } + return ST_CONTINUE; +} + +static VALUE +rb_hash_delete_key(hash, key) + VALUE hash, key; +{ + st_data_t ktmp = (st_data_t)key, val; + + if (RHASH(hash)->iter_lev > 0) { + if (st_delete_safe(RHASH(hash)->tbl, &ktmp, &val, Qundef)) { + FL_SET(hash, HASH_DELETED); + return (VALUE)val; + } + } + else if (st_delete(RHASH(hash)->tbl, &ktmp, &val)) + return (VALUE)val; + return Qundef; +} + +/* + * call-seq: + * hsh.index(value) => key + * + * Returns the key for a given value. If not found, returns <code>nil</code>. + * + * h = { "a" => 100, "b" => 200 } + * h.index(200) #=> "b" + * h.index(999) #=> nil + * + */ + +static VALUE +rb_hash_index(hash, value) + VALUE hash, value; +{ + VALUE args[2]; + + args[0] = value; + args[1] = Qnil; + + rb_hash_foreach(hash, index_i, (st_data_t)args); + + return args[1]; +} + +/* + * call-seq: + * hsh.indexes(key, ...) => array + * hsh.indices(key, ...) => array + * + * Deprecated in favor of <code>Hash#select</code>. + * + */ + +static VALUE +rb_hash_indexes(argc, argv, hash) + int argc; + VALUE *argv; + VALUE hash; +{ + VALUE indexes; + int i; + + rb_warn("Hash#%s is deprecated; use Hash#values_at", + rb_id2name(rb_frame_last_func())); + indexes = rb_ary_new2(argc); + for (i=0; i<argc; i++) { + RARRAY(indexes)->ptr[i] = rb_hash_aref(hash, argv[i]); + RARRAY(indexes)->len++; + } + return indexes; +} + +/* + * call-seq: + * hsh.delete(key) => value + * hsh.delete(key) {| key | block } => value + * + * Deletes and returns a key-value pair from <i>hsh</i> whose key is + * equal to <i>key</i>. If the key is not found, returns the + * <em>default value</em>. If the optional code block is given and the + * key is not found, pass in the key and return the result of + * <i>block</i>. + * + * h = { "a" => 100, "b" => 200 } + * h.delete("a") #=> 100 + * h.delete("z") #=> nil + * h.delete("z") { |el| "#{el} not found" } #=> "z not found" + * + */ + +VALUE +rb_hash_delete(hash, key) + VALUE hash, key; +{ + VALUE val; + + rb_hash_modify(hash); + val = rb_hash_delete_key(hash, key); + if (val != Qundef) return val; + if (rb_block_given_p()) { + return rb_yield(key); + } + return Qnil; +} + +struct shift_var { + VALUE key; + VALUE val; +}; + +static int +shift_i(key, value, var) + VALUE key, value; + struct shift_var *var; +{ + if (key == Qundef) return ST_CONTINUE; + if (var->key != Qundef) return ST_STOP; + var->key = key; + var->val = value; + return ST_DELETE; +} + +static int +shift_i_safe(key, value, var) + VALUE key, value; + struct shift_var *var; +{ + if (key == Qundef) return ST_CONTINUE; + var->key = key; + var->val = value; + return ST_STOP; +} + +/* + * call-seq: + * hsh.shift -> anArray or obj + * + * Removes a key-value pair from <i>hsh</i> and returns it as the + * two-item array <code>[</code> <i>key, value</i> <code>]</code>, or + * the hash's default value if the hash is empty. + * + * h = { 1 => "a", 2 => "b", 3 => "c" } + * h.shift #=> [1, "a"] + * h #=> {2=>"b", 3=>"c"} + */ + +static VALUE +rb_hash_shift(hash) + VALUE hash; +{ + struct shift_var var; + + rb_hash_modify(hash); + var.key = Qundef; + if (RHASH(hash)->iter_lev > 0) { + rb_hash_foreach(hash, shift_i_safe, (st_data_t)&var); + if (var.key != Qundef) { + st_data_t key = var.key; + if (st_delete_safe(RHASH(hash)->tbl, &key, 0, Qundef)) { + FL_SET(hash, HASH_DELETED); + } + } + } + else { + rb_hash_foreach(hash, shift_i, (st_data_t)&var); + } + + if (var.key != Qundef) { + return rb_assoc_new(var.key, var.val); + } + else if (FL_TEST(hash, HASH_PROC_DEFAULT)) { + return rb_funcall(RHASH(hash)->ifnone, id_call, 2, hash, Qnil); + } + else { + return RHASH(hash)->ifnone; + } +} + +static int +delete_if_i(key, value, hash) + VALUE key, value, hash; +{ + if (key == Qundef) return ST_CONTINUE; + if (RTEST(rb_yield_values(2, key, value))) { + rb_hash_delete_key(hash, key); + } + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.delete_if {| key, value | block } -> hsh + * + * Deletes every key-value pair from <i>hsh</i> for which <i>block</i> + * evaluates to <code>true</code>. + * + * h = { "a" => 100, "b" => 200, "c" => 300 } + * h.delete_if {|key, value| key >= "b" } #=> {"a"=>100} + * + */ + +VALUE +rb_hash_delete_if(hash) + VALUE hash; +{ + rb_hash_modify(hash); + rb_hash_foreach(hash, delete_if_i, hash); + return hash; +} + +/* + * call-seq: + * hsh.reject! {| key, value | block } -> hsh or nil + * + * Equivalent to <code>Hash#delete_if</code>, but returns + * <code>nil</code> if no changes were made. + */ + +VALUE +rb_hash_reject_bang(hash) + VALUE hash; +{ + int n = RHASH(hash)->tbl->num_entries; + rb_hash_delete_if(hash); + if (n == RHASH(hash)->tbl->num_entries) return Qnil; + return hash; +} + +/* + * call-seq: + * hsh.reject {| key, value | block } -> a_hash + * + * Same as <code>Hash#delete_if</code>, but works on (and returns) a + * copy of the <i>hsh</i>. Equivalent to + * <code><i>hsh</i>.dup.delete_if</code>. + * + */ + +static VALUE +rb_hash_reject(hash) + VALUE hash; +{ + return rb_hash_delete_if(rb_obj_dup(hash)); +} + +static int +select_i(key, value, result) + VALUE key, value, result; +{ + if (key == Qundef) return ST_CONTINUE; + if (RTEST(rb_yield_values(2, key, value))) + rb_ary_push(result, rb_assoc_new(key, value)); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.values_at(key, ...) => array + * + * Return an array containing the values associated with the given keys. + * Also see <code>Hash.select</code>. + * + * h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" } + * h.values_at("cow", "cat") #=> ["bovine", "feline"] +*/ + +VALUE +rb_hash_values_at(argc, argv, hash) + int argc; + VALUE *argv; + VALUE hash; +{ + VALUE result = rb_ary_new(); + long i; + + for (i=0; i<argc; i++) { + rb_ary_push(result, rb_hash_aref(hash, argv[i])); + } + return result; +} + +/* + * call-seq: + * hsh.select {|key, value| block} => array + * + * Returns a new array consisting of <code>[key,value]</code> + * pairs for which the block returns true. + * Also see <code>Hash.values_at</code>. + * + * h = { "a" => 100, "b" => 200, "c" => 300 } + * h.select {|k,v| k > "a"} #=> [["b", 200], ["c", 300]] + * h.select {|k,v| v < 200} #=> [["a", 100]] + */ + +VALUE +rb_hash_select(argc, argv, hash) + int argc; + VALUE *argv; + VALUE hash; +{ + VALUE result; + + if (argc > 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); + } + result = rb_ary_new(); + rb_hash_foreach(hash, select_i, result); + return result; +} + +static int +clear_i(key, value, dummy) + VALUE key, value, dummy; +{ + return ST_DELETE; +} + +/* + * call-seq: + * hsh.clear -> hsh + * + * Removes all key-value pairs from <i>hsh</i>. + * + * h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200} + * h.clear #=> {} + * + */ + +static VALUE +rb_hash_clear(hash) + VALUE hash; +{ + rb_hash_modify(hash); + if (RHASH(hash)->tbl->num_entries > 0) { + rb_hash_foreach(hash, clear_i, 0); + } + + return hash; +} + +/* + * call-seq: + * hsh[key] = value => value + * hsh.store(key, value) => value + * + * Element Assignment---Associates the value given by + * <i>value</i> with the key given by <i>key</i>. + * <i>key</i> should not have its value changed while it is in + * use as a key (a <code>String</code> passed as a key will be + * duplicated and frozen). + * + * h = { "a" => 100, "b" => 200 } + * h["a"] = 9 + * h["c"] = 4 + * h #=> {"a"=>9, "b"=>200, "c"=>4} + * + */ + +VALUE +rb_hash_aset(hash, key, val) + VALUE hash, key, val; +{ + rb_hash_modify(hash); + if (TYPE(key) != T_STRING || st_lookup(RHASH(hash)->tbl, key, 0)) { + st_insert(RHASH(hash)->tbl, key, val); + } + else { + st_add_direct(RHASH(hash)->tbl, rb_str_new4(key), val); + } + return val; +} + +static int +replace_i(key, val, hash) + VALUE key, val, hash; +{ + if (key != Qundef) { + rb_hash_aset(hash, key, val); + } + + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.replace(other_hash) -> hsh + * + * Replaces the contents of <i>hsh</i> with the contents of + * <i>other_hash</i>. + * + * h = { "a" => 100, "b" => 200 } + * h.replace({ "c" => 300, "d" => 400 }) #=> {"c"=>300, "d"=>400} + * + */ + +static VALUE +rb_hash_replace(hash, hash2) + VALUE hash, hash2; +{ + hash2 = to_hash(hash2); + if (hash == hash2) return hash; + rb_hash_clear(hash); + rb_hash_foreach(hash2, replace_i, hash); + RHASH(hash)->ifnone = RHASH(hash2)->ifnone; + if (FL_TEST(hash2, HASH_PROC_DEFAULT)) { + FL_SET(hash, HASH_PROC_DEFAULT); + } + else { + FL_UNSET(hash, HASH_PROC_DEFAULT); + } + + return hash; +} + +/* + * call-seq: + * hsh.length => fixnum + * hsh.size => fixnum + * + * Returns the number of key-value pairs in the hash. + * + * h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 } + * h.length #=> 4 + * h.delete("a") #=> 200 + * h.length #=> 3 + */ + +static VALUE +rb_hash_size(hash) + VALUE hash; +{ + return INT2FIX(RHASH(hash)->tbl->num_entries); +} + + +/* + * call-seq: + * hsh.empty? => true or false + * + * Returns <code>true</code> if <i>hsh</i> contains no key-value pairs. + * + * {}.empty? #=> true + * + */ + +static VALUE +rb_hash_empty_p(hash) + VALUE hash; +{ + if (RHASH(hash)->tbl->num_entries == 0) + return Qtrue; + return Qfalse; +} + +static int +each_value_i(key, value) + VALUE key, value; +{ + if (key == Qundef) return ST_CONTINUE; + rb_yield(value); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.each_value {| value | block } -> hsh + * + * Calls <i>block</i> once for each key in <i>hsh</i>, passing the + * value as a parameter. + * + * h = { "a" => 100, "b" => 200 } + * h.each_value {|value| puts value } + * + * <em>produces:</em> + * + * 100 + * 200 + */ + +static VALUE +rb_hash_each_value(hash) + VALUE hash; +{ + rb_hash_foreach(hash, each_value_i, 0); + return hash; +} + +static int +each_key_i(key, value) + VALUE key, value; +{ + if (key == Qundef) return ST_CONTINUE; + rb_yield(key); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.each_key {| key | block } -> hsh + * + * Calls <i>block</i> once for each key in <i>hsh</i>, passing the key + * as a parameter. + * + * h = { "a" => 100, "b" => 200 } + * h.each_key {|key| puts key } + * + * <em>produces:</em> + * + * a + * b + */ +static VALUE +rb_hash_each_key(hash) + VALUE hash; +{ + rb_hash_foreach(hash, each_key_i, 0); + return hash; +} + +static int +each_pair_i(key, value) + VALUE key, value; +{ + if (key == Qundef) return ST_CONTINUE; + rb_yield_values(2, key, value); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.each_pair {| key_value_array | block } -> hsh + * + * Calls <i>block</i> once for each key in <i>hsh</i>, passing the key + * and value as parameters. + * + * h = { "a" => 100, "b" => 200 } + * h.each_pair {|key, value| puts "#{key} is #{value}" } + * + * <em>produces:</em> + * + * a is 100 + * b is 200 + * + */ + +static VALUE +rb_hash_each_pair(hash) + VALUE hash; +{ + rb_hash_foreach(hash, each_pair_i, 0); + return hash; +} + +static int +each_i(key, value) + VALUE key, value; +{ + if (key == Qundef) return ST_CONTINUE; + rb_yield(rb_assoc_new(key, value)); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.each {| key, value | block } -> hsh + * + * Calls <i>block</i> once for each key in <i>hsh</i>, passing the key + * and value to the block as a two-element array. Because of the assignment + * semantics of block parameters, these elements will be split out if the + * block has two formal parameters. Also see <code>Hash.each_pair</code>, which + * will be marginally more efficient for blocks with two parameters. + * + * h = { "a" => 100, "b" => 200 } + * h.each {|key, value| puts "#{key} is #{value}" } + * + * <em>produces:</em> + * + * a is 100 + * b is 200 + * + */ + +static VALUE +rb_hash_each(hash) + VALUE hash; +{ + rb_hash_foreach(hash, each_i, 0); + return hash; +} + +static int +to_a_i(key, value, ary) + VALUE key, value, ary; +{ + if (key == Qundef) return ST_CONTINUE; + rb_ary_push(ary, rb_assoc_new(key, value)); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.to_a -> array + * + * Converts <i>hsh</i> to a nested array of <code>[</code> <i>key, + * value</i> <code>]</code> arrays. + * + * h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 } + * h.to_a #=> [["a", 100], ["c", 300], ["d", 400]] + */ + +static VALUE +rb_hash_to_a(hash) + VALUE hash; +{ + VALUE ary; + + ary = rb_ary_new(); + rb_hash_foreach(hash, to_a_i, ary); + if (OBJ_TAINTED(hash)) OBJ_TAINT(ary); + + return ary; +} + +/* + * call-seq: + * hsh.sort => array + * hsh.sort {| a, b | block } => array + * + * Converts <i>hsh</i> to a nested array of <code>[</code> <i>key, + * value</i> <code>]</code> arrays and sorts it, using + * <code>Array#sort</code>. + * + * h = { "a" => 20, "b" => 30, "c" => 10 } + * h.sort #=> [["a", 20], ["b", 30], ["c", 10]] + * h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]] + * + */ + +static VALUE +rb_hash_sort(hash) + VALUE hash; +{ + VALUE entries = rb_hash_to_a(hash); + rb_ary_sort_bang(entries); + return entries; +} + +static int +inspect_i(key, value, str) + VALUE key, value, str; +{ + VALUE str2; + + if (key == Qundef) return ST_CONTINUE; + if (RSTRING(str)->len > 1) { + rb_str_cat2(str, ", "); + } + str2 = rb_inspect(key); + rb_str_buf_append(str, str2); + OBJ_INFECT(str, str2); + rb_str_buf_cat2(str, "=>"); + str2 = rb_inspect(value); + rb_str_buf_append(str, str2); + OBJ_INFECT(str, str2); + + return ST_CONTINUE; +} + +static VALUE +inspect_hash(hash) + VALUE hash; +{ + VALUE str; + + str = rb_str_buf_new2("{"); + rb_hash_foreach(hash, inspect_i, str); + rb_str_buf_cat2(str, "}"); + OBJ_INFECT(str, hash); + + return str; +} + +/* + * call-seq: + * hsh.inspect => string + * + * Return the contents of this hash as a string. + */ + +static VALUE +rb_hash_inspect(hash) + VALUE hash; +{ + if (RHASH(hash)->tbl == 0 || RHASH(hash)->tbl->num_entries == 0) + return rb_str_new2("{}"); + if (rb_inspecting_p(hash)) return rb_str_new2("{...}"); + return rb_protect_inspect(inspect_hash, hash, 0); +} + +static VALUE +to_s_hash(hash) + VALUE hash; +{ + return rb_ary_to_s(rb_hash_to_a(hash)); +} + +/* + * call-seq: + * hsh.to_s => string + * + * Converts <i>hsh</i> to a string by converting the hash to an array + * of <code>[</code> <i>key, value</i> <code>]</code> pairs and then + * converting that array to a string using <code>Array#join</code> with + * the default separator. + * + * h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 } + * h.to_s #=> "a100c300d400" + */ + +static VALUE +rb_hash_to_s(hash) + VALUE hash; +{ + if (rb_inspecting_p(hash)) return rb_str_new2("{...}"); + return rb_protect_inspect(to_s_hash, hash, 0); +} + +/* + * call-seq: + * hsh.to_hash => hsh + * + * Returns <i>self</i>. + */ + +static VALUE +rb_hash_to_hash(hash) + VALUE hash; +{ + return hash; +} + +static int +keys_i(key, value, ary) + VALUE key, value, ary; +{ + if (key == Qundef) return ST_CONTINUE; + rb_ary_push(ary, key); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.keys => array + * + * Returns a new array populated with the keys from this hash. See also + * <code>Hash#values</code>. + * + * h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 } + * h.keys #=> ["a", "b", "c", "d"] + * + */ + +static VALUE +rb_hash_keys(hash) + VALUE hash; +{ + VALUE ary; + + ary = rb_ary_new(); + rb_hash_foreach(hash, keys_i, ary); + + return ary; +} + +static int +values_i(key, value, ary) + VALUE key, value, ary; +{ + if (key == Qundef) return ST_CONTINUE; + rb_ary_push(ary, value); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.values => array + * + * Returns a new array populated with the values from <i>hsh</i>. See + * also <code>Hash#keys</code>. + * + * h = { "a" => 100, "b" => 200, "c" => 300 } + * h.values #=> [100, 200, 300] + * + */ + +static VALUE +rb_hash_values(hash) + VALUE hash; +{ + VALUE ary; + + ary = rb_ary_new(); + rb_hash_foreach(hash, values_i, ary); + + return ary; +} + +/* + * call-seq: + * hsh.has_key?(key) => true or false + * hsh.include?(key) => true or false + * hsh.key?(key) => true or false + * hsh.member?(key) => true or false + * + * Returns <code>true</code> if the given key is present in <i>hsh</i>. + * + * h = { "a" => 100, "b" => 200 } + * h.has_key?("a") #=> true + * h.has_key?("z") #=> false + * + */ + +static VALUE +rb_hash_has_key(hash, key) + VALUE hash; + VALUE key; +{ + if (st_lookup(RHASH(hash)->tbl, key, 0)) { + return Qtrue; + } + return Qfalse; +} + +static int +rb_hash_search_value(key, value, data) + VALUE key, value, *data; +{ + if (key == Qundef) return ST_CONTINUE; + if (rb_equal(value, data[1])) { + data[0] = Qtrue; + return ST_STOP; + } + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.has_value?(value) => true or false + * hsh.value?(value) => true or false + * + * Returns <code>true</code> if the given value is present for some key + * in <i>hsh</i>. + * + * h = { "a" => 100, "b" => 200 } + * h.has_value?(100) #=> true + * h.has_value?(999) #=> false + */ + +static VALUE +rb_hash_has_value(hash, val) + VALUE hash; + VALUE val; +{ + VALUE data[2]; + + data[0] = Qfalse; + data[1] = val; + rb_hash_foreach(hash, rb_hash_search_value, (st_data_t)data); + return data[0]; +} + +struct equal_data { + int result; + st_table *tbl; +}; + +static int +equal_i(key, val1, data) + VALUE key, val1; + struct equal_data *data; +{ + VALUE val2; + + if (key == Qundef) return ST_CONTINUE; + if (!st_lookup(data->tbl, key, &val2)) { + data->result = Qfalse; + return ST_STOP; + } + if (!rb_equal(val1, val2)) { + data->result = Qfalse; + return ST_STOP; + } + return ST_CONTINUE; +} + +static VALUE +hash_equal(hash1, hash2, eql) + VALUE hash1, hash2; + int eql; /* compare default value if true */ +{ + struct equal_data data; + + if (hash1 == hash2) return Qtrue; + if (TYPE(hash2) != T_HASH) { + if (!rb_respond_to(hash2, rb_intern("to_hash"))) { + return Qfalse; + } + return rb_equal(hash2, hash1); + } + if (RHASH(hash1)->tbl->num_entries != RHASH(hash2)->tbl->num_entries) + return Qfalse; + if (eql) { + if (!(rb_equal(RHASH(hash1)->ifnone, RHASH(hash2)->ifnone) && + FL_TEST(hash1, HASH_PROC_DEFAULT) == FL_TEST(hash2, HASH_PROC_DEFAULT))) + return Qfalse; + } + + data.tbl = RHASH(hash2)->tbl; + data.result = Qtrue; + rb_hash_foreach(hash1, equal_i, (st_data_t)&data); + + return data.result; +} + +/* + * call-seq: + * hsh == other_hash => true or false + * + * Equality---Two hashes are equal if they each contain the same number + * of keys and if each key-value pair is equal to (according to + * <code>Object#==</code>) the corresponding elements in the other + * hash. + * + * h1 = { "a" => 1, "c" => 2 } + * h2 = { 7 => 35, "c" => 2, "a" => 1 } + * h3 = { "a" => 1, "c" => 2, 7 => 35 } + * h4 = { "a" => 1, "d" => 2, "f" => 35 } + * h1 == h2 #=> false + * h2 == h3 #=> true + * h3 == h4 #=> false + * + */ + +static VALUE +rb_hash_equal(hash1, hash2) + VALUE hash1, hash2; +{ + return hash_equal(hash1, hash2, Qfalse); +} + +static int +rb_hash_invert_i(key, value, hash) + VALUE key, value; + VALUE hash; +{ + if (key == Qundef) return ST_CONTINUE; + rb_hash_aset(hash, value, key); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.invert -> aHash + * + * Returns a new hash created by using <i>hsh</i>'s values as keys, and + * the keys as values. + * + * h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 } + * h.invert #=> {0=>"a", 100=>"n", 200=>"d", 300=>"y"} + * + */ + +static VALUE +rb_hash_invert(hash) + VALUE hash; +{ + VALUE h = rb_hash_new(); + + rb_hash_foreach(hash, rb_hash_invert_i, h); + return h; +} + +static int +rb_hash_update_i(key, value, hash) + VALUE key, value; + VALUE hash; +{ + if (key == Qundef) return ST_CONTINUE; + rb_hash_aset(hash, key, value); + return ST_CONTINUE; +} + +static int +rb_hash_update_block_i(key, value, hash) + VALUE key, value; + VALUE hash; +{ + if (key == Qundef) return ST_CONTINUE; + if (rb_hash_has_key(hash, key)) { + value = rb_yield_values(3, key, rb_hash_aref(hash, key), value); + } + rb_hash_aset(hash, key, value); + return ST_CONTINUE; +} + +/* + * call-seq: + * hsh.merge!(other_hash) => hsh + * hsh.update(other_hash) => hsh + * hsh.merge!(other_hash){|key, oldval, newval| block} => hsh + * hsh.update(other_hash){|key, oldval, newval| block} => hsh + * + * Adds the contents of <i>other_hash</i> to <i>hsh</i>, overwriting + * entries with duplicate keys with those from <i>other_hash</i>. + * + * h1 = { "a" => 100, "b" => 200 } + * h2 = { "b" => 254, "c" => 300 } + * h1.merge!(h2) #=> {"a"=>100, "b"=>254, "c"=>300} + */ + +static VALUE +rb_hash_update(hash1, hash2) + VALUE hash1, hash2; +{ + hash2 = to_hash(hash2); + if (rb_block_given_p()) { + rb_hash_foreach(hash2, rb_hash_update_block_i, hash1); + } + else { + rb_hash_foreach(hash2, rb_hash_update_i, hash1); + } + return hash1; +} + +/* + * call-seq: + * hsh.merge(other_hash) -> a_hash + * hsh.merge(other_hash){|key, oldval, newval| block} -> a_hash + * + * Returns a new hash containing the contents of <i>other_hash</i> and + * the contents of <i>hsh</i>, overwriting entries in <i>hsh</i> with + * duplicate keys with those from <i>other_hash</i>. + * + * h1 = { "a" => 100, "b" => 200 } + * h2 = { "b" => 254, "c" => 300 } + * h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300} + * h1 #=> {"a"=>100, "b"=>200} + * + */ + +static VALUE +rb_hash_merge(hash1, hash2) + VALUE hash1, hash2; +{ + return rb_hash_update(rb_obj_dup(hash1), hash2); +} + +static int path_tainted = -1; + +static char **origenviron; +#ifdef _WIN32 +#define GET_ENVIRON(e) (e = rb_w32_get_environ()) +#define FREE_ENVIRON(e) rb_w32_free_environ(e) +static char **my_environ; +#undef environ +#define environ my_environ +#elif defined(__APPLE__) +#undef environ +#define environ (*_NSGetEnviron()) +#define GET_ENVIRON(e) (e) +#define FREE_ENVIRON(e) +#else +extern char **environ; +#define GET_ENVIRON(e) (e) +#define FREE_ENVIRON(e) +#endif + +static VALUE +env_str_new(ptr, len) + const char *ptr; + long len; +{ + VALUE str = rb_tainted_str_new(ptr, len); + + rb_obj_freeze(str); + return str; +} + +static VALUE +env_str_new2(ptr) + const char *ptr; +{ + if (!ptr) return Qnil; + return env_str_new(ptr, strlen(ptr)); +} + +static VALUE +env_delete(obj, name) + VALUE obj, name; +{ + char *nam, *val; + + rb_secure(4); + SafeStringValue(name); + nam = RSTRING(name)->ptr; + if (strlen(nam) != RSTRING(name)->len) { + rb_raise(rb_eArgError, "bad environment variable name"); + } + val = getenv(nam); + if (val) { + VALUE value = env_str_new2(val); + + ruby_setenv(nam, 0); +#ifdef ENV_IGNORECASE + if (strcasecmp(nam, PATH_ENV) == 0) +#else + if (strcmp(nam, PATH_ENV) == 0) +#endif + { + path_tainted = 0; + } + return value; + } + return Qnil; +} + +static VALUE +env_delete_m(obj, name) + VALUE obj, name; +{ + VALUE val; + + val = env_delete(obj, name); + if (NIL_P(val) && rb_block_given_p()) rb_yield(name); + return val; +} + +static VALUE +rb_f_getenv(obj, name) + VALUE obj, name; +{ + char *nam, *env; + + StringValue(name); + nam = RSTRING(name)->ptr; + if (strlen(nam) != RSTRING(name)->len) { + rb_raise(rb_eArgError, "bad environment variable name"); + } + env = getenv(nam); + if (env) { +#ifdef ENV_IGNORECASE + if (strcasecmp(nam, PATH_ENV) == 0 && !rb_env_path_tainted()) +#else + if (strcmp(nam, PATH_ENV) == 0 && !rb_env_path_tainted()) +#endif + { + VALUE str = rb_str_new2(env); + + rb_obj_freeze(str); + return str; + } + return env_str_new2(env); + } + return Qnil; +} + +static VALUE +env_fetch(argc, argv) + int argc; + VALUE *argv; +{ + VALUE key, if_none; + long block_given; + char *nam, *env; + + rb_scan_args(argc, argv, "11", &key, &if_none); + block_given = rb_block_given_p(); + if (block_given && argc == 2) { + rb_warn("block supersedes default value argument"); + } + StringValue(key); + nam = RSTRING(key)->ptr; + if (strlen(nam) != RSTRING(key)->len) { + rb_raise(rb_eArgError, "bad environment variable name"); + } + env = getenv(nam); + if (!env) { + if (block_given) return rb_yield(key); + if (argc == 1) { + rb_raise(rb_eIndexError, "key not found"); + } + return if_none; + } +#ifdef ENV_IGNORECASE + if (strcasecmp(nam, PATH_ENV) == 0 && !rb_env_path_tainted()) +#else + if (strcmp(nam, PATH_ENV) == 0 && !rb_env_path_tainted()) +#endif + return rb_str_new2(env); + return env_str_new2(env); +} + +static void +path_tainted_p(path) + char *path; +{ + path_tainted = rb_path_check(path)?0:1; +} + +int +rb_env_path_tainted() +{ + if (path_tainted < 0) { + path_tainted_p(getenv(PATH_ENV)); + } + return path_tainted; +} + +static int +envix(nam) + const char *nam; +{ + register int i, len = strlen(nam); + char **env; + + env = GET_ENVIRON(environ); + for (i = 0; env[i]; i++) { + if ( +#ifdef ENV_IGNORECASE + strncasecmp(env[i],nam,len) == 0 +#else + memcmp(env[i],nam,len) == 0 +#endif + && env[i][len] == '=') + break; /* memcmp must come first to avoid */ + } /* potential SEGV's */ + FREE_ENVIRON(environ); + return i; +} + +void +ruby_setenv(name, value) + const char *name; + const char *value; +{ +#if defined(_WIN32) + /* The sane way to deal with the environment. + * Has these advantages over putenv() & co.: + * * enables us to store a truly empty value in the + * environment (like in UNIX). + * * we don't have to deal with RTL globals, bugs and leaks. + * * Much faster. + * Why you may want to enable USE_WIN32_RTL_ENV: + * * environ[] and RTL functions will not reflect changes, + * which might be an issue if extensions want to access + * the env. via RTL. This cuts both ways, since RTL will + * not see changes made by extensions that call the Win32 + * functions directly, either. + * GSAR 97-06-07 + * + * REMARK: USE_WIN32_RTL_ENV is already obsoleted since we don't use + * RTL's environ global variable directly yet. + */ + SetEnvironmentVariable(name,value); +#elif defined(HAVE_SETENV) && defined(HAVE_UNSETENV) +#undef setenv +#undef unsetenv + if (value) + setenv(name,value,1); + else + unsetenv(name); +#else /* WIN32 */ + size_t len; + int i=envix(name); /* where does it go? */ + + if (environ == origenviron) { /* need we copy environment? */ + int j; + int max; + char **tmpenv; + + for (max = i; environ[max]; max++) ; + tmpenv = ALLOC_N(char*, max+2); + for (j=0; j<max; j++) /* copy environment */ + tmpenv[j] = strdup(environ[j]); + tmpenv[max] = 0; + environ = tmpenv; /* tell exec where it is now */ + } + if (environ[i]) { + char **envp = origenviron; + while (*envp && *envp != environ[i]) envp++; + if (!*envp) + free(environ[i]); + if (!value) { + while (environ[i]) { + environ[i] = environ[i+1]; + i++; + } + return; + } + } + else { /* does not exist yet */ + if (!value) return; + REALLOC_N(environ, char*, i+2); /* just expand it a bit */ + environ[i+1] = 0; /* make sure it's null terminated */ + } + len = strlen(name) + strlen(value) + 2; + environ[i] = ALLOC_N(char, len); +#ifndef MSDOS + snprintf(environ[i],len,"%s=%s",name,value); /* all that work just for this */ +#else + /* MS-DOS requires environment variable names to be in uppercase */ + /* [Tom Dinger, 27 August 1990: Well, it doesn't _require_ it, but + * some utilities and applications may break because they only look + * for upper case strings. (Fixed strupr() bug here.)] + */ + strcpy(environ[i],name); strupr(environ[i]); + sprintf(environ[i] + strlen(name),"=%s", value); +#endif /* MSDOS */ + +#endif /* WIN32 */ +} + +void +ruby_unsetenv(name) + const char *name; +{ + ruby_setenv(name, 0); +} + +static VALUE +env_aset(obj, nm, val) + VALUE obj, nm, val; +{ + char *name, *value; + + if (rb_safe_level() >= 4) { + rb_raise(rb_eSecurityError, "can't change environment variable"); + } + + if (NIL_P(val)) { + env_delete(obj, nm); + return Qnil; + } + + StringValue(nm); + StringValue(val); + name = RSTRING(nm)->ptr; + value = RSTRING(val)->ptr; + if (strlen(name) != RSTRING(nm)->len) + rb_raise(rb_eArgError, "bad environment variable name"); + if (strlen(value) != RSTRING(val)->len) + rb_raise(rb_eArgError, "bad environment variable value"); + + ruby_setenv(name, value); +#ifdef ENV_IGNORECASE + if (strcasecmp(name, PATH_ENV) == 0) { +#else + if (strcmp(name, PATH_ENV) == 0) { +#endif + if (OBJ_TAINTED(val)) { + /* already tainted, no check */ + path_tainted = 1; + return val; + } + else { + path_tainted_p(value); + } + } + return val; +} + +static VALUE +env_keys() +{ + char **env; + VALUE ary = rb_ary_new(); + + env = GET_ENVIRON(environ); + while (*env) { + char *s = strchr(*env, '='); + if (s) { + rb_ary_push(ary, env_str_new(*env, s-*env)); + } + env++; + } + FREE_ENVIRON(environ); + return ary; +} + +static VALUE +env_each_key(ehash) + VALUE ehash; +{ + VALUE keys = env_keys(); + long i; + + for (i=0; i<RARRAY(keys)->len; i++) { + rb_yield(RARRAY(keys)->ptr[i]); + } + return ehash; +} + +static VALUE +env_values() +{ + char **env; + VALUE ary = rb_ary_new(); + + env = GET_ENVIRON(environ); + while (*env) { + char *s = strchr(*env, '='); + if (s) { + rb_ary_push(ary, env_str_new2(s+1)); + } + env++; + } + FREE_ENVIRON(environ); + return ary; +} + +static VALUE +env_each_value(ehash) + VALUE ehash; +{ + VALUE values = env_values(); + long i; + + for (i=0; i<RARRAY(values)->len; i++) { + rb_yield(RARRAY(values)->ptr[i]); + } + return ehash; +} + +static VALUE +env_each_i(ehash, values) + VALUE ehash; + int values; +{ + char **env; + VALUE ary = rb_ary_new(); + long i; + + env = GET_ENVIRON(environ); + while (*env) { + char *s = strchr(*env, '='); + if (s) { + rb_ary_push(ary, env_str_new(*env, s-*env)); + rb_ary_push(ary, env_str_new2(s+1)); + } + env++; + } + FREE_ENVIRON(environ); + + for (i=0; i<RARRAY(ary)->len; i+=2) { + if (values) { + rb_yield_values(2, RARRAY(ary)->ptr[i], RARRAY(ary)->ptr[i+1]); + } + else { + rb_yield(rb_assoc_new(RARRAY(ary)->ptr[i], RARRAY(ary)->ptr[i+1])); + } + } + return ehash; +} + +static VALUE +env_each(ehash) + VALUE ehash; +{ + return env_each_i(ehash, Qfalse); +} + +static VALUE +env_each_pair(ehash) + VALUE ehash; +{ + return env_each_i(ehash, Qtrue); +} + +static VALUE +env_reject_bang() +{ + volatile VALUE keys; + long i; + int del = 0; + + rb_secure(4); + keys = env_keys(); + + for (i=0; i<RARRAY(keys)->len; i++) { + VALUE val = rb_f_getenv(Qnil, RARRAY(keys)->ptr[i]); + if (!NIL_P(val)) { + if (RTEST(rb_yield_values(2, RARRAY(keys)->ptr[i], val))) { + FL_UNSET(RARRAY(keys)->ptr[i], FL_TAINT); + env_delete(Qnil, RARRAY(keys)->ptr[i]); + del++; + } + } + } + if (del == 0) return Qnil; + return envtbl; +} + +static VALUE +env_delete_if() +{ + env_reject_bang(); + return envtbl; +} + +static VALUE +env_values_at(argc, argv) + int argc; + VALUE *argv; +{ + VALUE result = rb_ary_new(); + long i; + + for (i=0; i<argc; i++) { + rb_ary_push(result, rb_f_getenv(Qnil, argv[i])); + } + return result; +} + +static VALUE +env_select(argc, argv) + int argc; + VALUE *argv; +{ + VALUE result; + char **env; + + if (argc > 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); + } + result = rb_ary_new(); + env = GET_ENVIRON(environ); + while (*env) { + char *s = strchr(*env, '='); + if (s) { + VALUE k = env_str_new(*env, s-*env); + VALUE v = env_str_new2(s+1); + if (RTEST(rb_yield_values(2, k, v))) { + rb_ary_push(result, rb_assoc_new(k, v)); + } + } + env++; + } + FREE_ENVIRON(environ); + + return result; +} + +static VALUE +env_clear() +{ + volatile VALUE keys; + long i; + + rb_secure(4); + keys = env_keys(); + + for (i=0; i<RARRAY(keys)->len; i++) { + VALUE val = rb_f_getenv(Qnil, RARRAY(keys)->ptr[i]); + if (!NIL_P(val)) { + env_delete(Qnil, RARRAY(keys)->ptr[i]); + } + } + return envtbl; +} + +static VALUE +env_to_s() +{ + return rb_str_new2("ENV"); +} + +static VALUE +env_inspect() +{ + char **env; + VALUE str = rb_str_buf_new2("{"); + VALUE i; + + env = GET_ENVIRON(environ); + while (*env) { + char *s = strchr(*env, '='); + + if (env != environ) { + rb_str_buf_cat2(str, ", "); + } + if (s) { + rb_str_buf_cat2(str, "\""); + rb_str_buf_cat(str, *env, s-*env); + rb_str_buf_cat2(str, "\"=>"); + i = rb_inspect(rb_str_new2(s+1)); + rb_str_buf_append(str, i); + } + env++; + } + FREE_ENVIRON(environ); + rb_str_buf_cat2(str, "}"); + OBJ_TAINT(str); + + return str; +} + +static VALUE +env_to_a() +{ + char **env; + VALUE ary = rb_ary_new(); + + env = GET_ENVIRON(environ); + while (*env) { + char *s = strchr(*env, '='); + if (s) { + rb_ary_push(ary, rb_assoc_new(env_str_new(*env, s-*env), + env_str_new2(s+1))); + } + env++; + } + FREE_ENVIRON(environ); + return ary; +} + +static VALUE +env_none() +{ + return Qnil; +} + +static VALUE +env_size() +{ + int i; + char **env; + + env = GET_ENVIRON(environ); + for(i=0; env[i]; i++) + ; + FREE_ENVIRON(environ); + return INT2FIX(i); +} + +static VALUE +env_empty_p() +{ + char **env; + + env = GET_ENVIRON(environ); + if (env[0] == 0) { + FREE_ENVIRON(environ); + return Qtrue; + } + FREE_ENVIRON(environ); + return Qfalse; +} + +static VALUE +env_has_key(env, key) + VALUE env, key; +{ + char *s; + + s = StringValuePtr(key); + if (strlen(s) != RSTRING(key)->len) + rb_raise(rb_eArgError, "bad environment variable name"); + if (getenv(s)) return Qtrue; + return Qfalse; +} + +static VALUE +env_has_value(dmy, value) + VALUE dmy, value; +{ + char **env; + + if (TYPE(value) != T_STRING) return Qfalse; + env = GET_ENVIRON(environ); + while (*env) { + char *s = strchr(*env, '='); + if (s++) { + long len = strlen(s); + if (RSTRING(value)->len == len && strncmp(s, RSTRING(value)->ptr, len) == 0) { + FREE_ENVIRON(environ); + return Qtrue; + } + } + env++; + } + FREE_ENVIRON(environ); + return Qfalse; +} + +static VALUE +env_index(dmy, value) + VALUE dmy, value; +{ + char **env; + VALUE str; + + StringValue(value); + env = GET_ENVIRON(environ); + while (*env) { + char *s = strchr(*env, '='); + if (s++) { + long len = strlen(s); + if (RSTRING(value)->len == len && strncmp(s, RSTRING(value)->ptr, len) == 0) { + str = env_str_new(*env, s-*env-1); + FREE_ENVIRON(environ); + return str; + } + } + env++; + } + FREE_ENVIRON(environ); + return Qnil; +} + +static VALUE +env_indexes(argc, argv) + int argc; + VALUE *argv; +{ + int i; + VALUE indexes = rb_ary_new2(argc); + + rb_warn("ENV.%s is deprecated; use ENV.values_at", + rb_id2name(rb_frame_last_func())); + for (i=0;i<argc;i++) { + VALUE tmp = rb_check_string_type(argv[i]); + if (NIL_P(tmp)) { + RARRAY(indexes)->ptr[i] = Qnil; + } + else { + RARRAY(indexes)->ptr[i] = env_str_new2(getenv(RSTRING(tmp)->ptr)); + } + RARRAY(indexes)->len = i+1; + } + + return indexes; +} + +static VALUE +env_to_hash() +{ + char **env; + VALUE hash = rb_hash_new(); + + env = GET_ENVIRON(environ); + while (*env) { + char *s = strchr(*env, '='); + if (s) { + rb_hash_aset(hash, env_str_new(*env, s-*env), + env_str_new2(s+1)); + } + env++; + } + FREE_ENVIRON(environ); + return hash; +} + +static VALUE +env_reject() +{ + return rb_hash_delete_if(env_to_hash()); +} + +static VALUE +env_shift() +{ + char **env; + + env = GET_ENVIRON(environ); + if (*env) { + char *s = strchr(*env, '='); + if (s) { + VALUE key = env_str_new(*env, s-*env); + VALUE val = env_str_new2(getenv(RSTRING(key)->ptr)); + env_delete(Qnil, key); + return rb_assoc_new(key, val); + } + } + FREE_ENVIRON(environ); + return Qnil; +} + +static VALUE +env_invert() +{ + return rb_hash_invert(env_to_hash()); +} + +static int +env_replace_i(key, val, keys) + VALUE key, val, keys; +{ + if (key != Qundef) { + env_aset(Qnil, key, val); + if (rb_ary_includes(keys, key)) { + rb_ary_delete(keys, key); + } + } + return ST_CONTINUE; +} + +static VALUE +env_replace(env, hash) + VALUE env, hash; +{ + volatile VALUE keys = env_keys(); + long i; + + if (env == hash) return env; + hash = to_hash(hash); + rb_hash_foreach(hash, env_replace_i, keys); + + for (i=0; i<RARRAY(keys)->len; i++) { + env_delete(env, RARRAY(keys)->ptr[i]); + } + return env; +} + +static int +env_update_i(key, val) + VALUE key, val; +{ + if (key != Qundef) { + if (rb_block_given_p()) { + val = rb_yield_values(3, key, rb_f_getenv(Qnil, key), val); + } + env_aset(Qnil, key, val); + } + return ST_CONTINUE; +} + +static VALUE +env_update(env, hash) + VALUE env, hash; +{ + if (env == hash) return env; + hash = to_hash(hash); + rb_hash_foreach(hash, env_update_i, 0); + return env; +} + +/* + * A <code>Hash</code> is a collection of key-value pairs. It is + * similar to an <code>Array</code>, except that indexing is done via + * arbitrary keys of any object type, not an integer index. The order + * in which you traverse a hash by either key or value may seem + * arbitrary, and will generally not be in the insertion order. + * + * Hashes have a <em>default value</em> that is returned when accessing + * keys that do not exist in the hash. By default, that value is + * <code>nil</code>. + * + * <code>Hash</code> uses <code>key.eql?</code> to test keys for equality. + * If you need to use instances of your own classes as keys in a <code>Hash</code>, + * it is recommended that you define both the <code>eql?</code> and <code>hash</code> + * methods. The <code>hash</code> method must have the property that + * <code>a.eql?(b)</code> implies <code>a.hash == b.hash</code>. + * + * class MyClass + * attr_reader :str + * def initialize(str) + * @str = str + * end + * def eql?(o) + * o.is_a?(MyClass) && str == o.str + * end + * def hash + * @str.hash + * end + * end + * + * a = MyClass.new("some string") + * b = MyClass.new("some string") + * a.eql? b #=> true + * + * h = {} + * + * h[a] = 1 + * h[a] #=> 1 + * h[b] #=> 1 + * + * h[b] = 2 + * h[a] #=> 2 + * h[b] #=> 2 + */ + +void +Init_Hash() +{ + id_hash = rb_intern("hash"); + id_call = rb_intern("call"); + id_default = rb_intern("default"); + + rb_cHash = rb_define_class("Hash", rb_cObject); + + rb_include_module(rb_cHash, rb_mEnumerable); + + rb_define_alloc_func(rb_cHash, hash_alloc); + rb_define_singleton_method(rb_cHash, "[]", rb_hash_s_create, -1); + rb_define_method(rb_cHash,"initialize", rb_hash_initialize, -1); + rb_define_method(rb_cHash,"initialize_copy", rb_hash_replace, 1); + rb_define_method(rb_cHash,"rehash", rb_hash_rehash, 0); + + rb_define_method(rb_cHash,"to_hash", rb_hash_to_hash, 0); + rb_define_method(rb_cHash,"to_a", rb_hash_to_a, 0); + rb_define_method(rb_cHash,"to_s", rb_hash_to_s, 0); + rb_define_method(rb_cHash,"inspect", rb_hash_inspect, 0); + + rb_define_method(rb_cHash,"==", rb_hash_equal, 1); + rb_define_method(rb_cHash,"[]", rb_hash_aref, 1); + rb_define_method(rb_cHash,"fetch", rb_hash_fetch, -1); + rb_define_method(rb_cHash,"[]=", rb_hash_aset, 2); + rb_define_method(rb_cHash,"store", rb_hash_aset, 2); + rb_define_method(rb_cHash,"default", rb_hash_default, -1); + rb_define_method(rb_cHash,"default=", rb_hash_set_default, 1); + rb_define_method(rb_cHash,"default_proc", rb_hash_default_proc, 0); + rb_define_method(rb_cHash,"index", rb_hash_index, 1); + rb_define_method(rb_cHash,"indexes", rb_hash_indexes, -1); + rb_define_method(rb_cHash,"indices", rb_hash_indexes, -1); + rb_define_method(rb_cHash,"size", rb_hash_size, 0); + rb_define_method(rb_cHash,"length", rb_hash_size, 0); + rb_define_method(rb_cHash,"empty?", rb_hash_empty_p, 0); + + rb_define_method(rb_cHash,"each", rb_hash_each, 0); + rb_define_method(rb_cHash,"each_value", rb_hash_each_value, 0); + rb_define_method(rb_cHash,"each_key", rb_hash_each_key, 0); + rb_define_method(rb_cHash,"each_pair", rb_hash_each_pair, 0); + rb_define_method(rb_cHash,"sort", rb_hash_sort, 0); + + rb_define_method(rb_cHash,"keys", rb_hash_keys, 0); + rb_define_method(rb_cHash,"values", rb_hash_values, 0); + rb_define_method(rb_cHash,"values_at", rb_hash_values_at, -1); + + rb_define_method(rb_cHash,"shift", rb_hash_shift, 0); + rb_define_method(rb_cHash,"delete", rb_hash_delete, 1); + rb_define_method(rb_cHash,"delete_if", rb_hash_delete_if, 0); + rb_define_method(rb_cHash,"select", rb_hash_select, -1); + rb_define_method(rb_cHash,"reject", rb_hash_reject, 0); + rb_define_method(rb_cHash,"reject!", rb_hash_reject_bang, 0); + rb_define_method(rb_cHash,"clear", rb_hash_clear, 0); + rb_define_method(rb_cHash,"invert", rb_hash_invert, 0); + rb_define_method(rb_cHash,"update", rb_hash_update, 1); + rb_define_method(rb_cHash,"replace", rb_hash_replace, 1); + rb_define_method(rb_cHash,"merge!", rb_hash_update, 1); + rb_define_method(rb_cHash,"merge", rb_hash_merge, 1); + + rb_define_method(rb_cHash,"include?", rb_hash_has_key, 1); + rb_define_method(rb_cHash,"member?", rb_hash_has_key, 1); + rb_define_method(rb_cHash,"has_key?", rb_hash_has_key, 1); + rb_define_method(rb_cHash,"has_value?", rb_hash_has_value, 1); + rb_define_method(rb_cHash,"key?", rb_hash_has_key, 1); + rb_define_method(rb_cHash,"value?", rb_hash_has_value, 1); + +#ifndef __MACOS__ /* environment variables nothing on MacOS. */ + origenviron = environ; + envtbl = rb_obj_alloc(rb_cObject); + rb_extend_object(envtbl, rb_mEnumerable); + + rb_define_singleton_method(envtbl,"[]", rb_f_getenv, 1); + rb_define_singleton_method(envtbl,"fetch", env_fetch, -1); + rb_define_singleton_method(envtbl,"[]=", env_aset, 2); + rb_define_singleton_method(envtbl,"store", env_aset, 2); + rb_define_singleton_method(envtbl,"each", env_each, 0); + rb_define_singleton_method(envtbl,"each_pair", env_each_pair, 0); + rb_define_singleton_method(envtbl,"each_key", env_each_key, 0); + rb_define_singleton_method(envtbl,"each_value", env_each_value, 0); + rb_define_singleton_method(envtbl,"delete", env_delete_m, 1); + rb_define_singleton_method(envtbl,"delete_if", env_delete_if, 0); + rb_define_singleton_method(envtbl,"clear", env_clear, 0); + rb_define_singleton_method(envtbl,"reject", env_reject, 0); + rb_define_singleton_method(envtbl,"reject!", env_reject_bang, 0); + rb_define_singleton_method(envtbl,"select", env_select, -1); + rb_define_singleton_method(envtbl,"shift", env_shift, 0); + rb_define_singleton_method(envtbl,"invert", env_invert, 0); + rb_define_singleton_method(envtbl,"replace", env_replace, 1); + rb_define_singleton_method(envtbl,"update", env_update, 1); + rb_define_singleton_method(envtbl,"inspect", env_inspect, 0); + rb_define_singleton_method(envtbl,"rehash", env_none, 0); + rb_define_singleton_method(envtbl,"to_a", env_to_a, 0); + rb_define_singleton_method(envtbl,"to_s", env_to_s, 0); + rb_define_singleton_method(envtbl,"index", env_index, 1); + rb_define_singleton_method(envtbl,"indexes", env_indexes, -1); + rb_define_singleton_method(envtbl,"indices", env_indexes, -1); + rb_define_singleton_method(envtbl,"size", env_size, 0); + rb_define_singleton_method(envtbl,"length", env_size, 0); + rb_define_singleton_method(envtbl,"empty?", env_empty_p, 0); + rb_define_singleton_method(envtbl,"keys", env_keys, 0); + rb_define_singleton_method(envtbl,"values", env_values, 0); + rb_define_singleton_method(envtbl,"values_at", env_values_at, -1); + rb_define_singleton_method(envtbl,"include?", env_has_key, 1); + rb_define_singleton_method(envtbl,"member?", env_has_key, 1); + rb_define_singleton_method(envtbl,"has_key?", env_has_key, 1); + rb_define_singleton_method(envtbl,"has_value?", env_has_value, 1); + rb_define_singleton_method(envtbl,"key?", env_has_key, 1); + rb_define_singleton_method(envtbl,"value?", env_has_value, 1); + rb_define_singleton_method(envtbl,"to_hash", env_to_hash, 0); + + rb_define_global_const("ENV", envtbl); +#else /* __MACOS__ */ + envtbl = rb_hash_s_new(0, NULL, rb_cHash); + rb_define_global_const("ENV", envtbl); +#endif /* ifndef __MACOS__ environment variables nothing on MacOS. */ +} +/********************************************************************** + + inits.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Tue Dec 28 16:01:58 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" + +void Init_Array _((void)); +void Init_Bignum _((void)); +void Init_Binding _((void)); +void Init_Comparable _((void)); +void Init_Dir _((void)); +void Init_Enumerable _((void)); +void Init_Exception _((void)); +void Init_syserr _((void)); +void Init_eval _((void)); +void Init_load _((void)); +void Init_Proc _((void)); +void Init_Thread _((void)); +void Init_File _((void)); +void Init_GC _((void)); +void Init_Hash _((void)); +void Init_IO _((void)); +void Init_Math _((void)); +void Init_marshal _((void)); +void Init_Numeric _((void)); +void Init_Object _((void)); +void Init_pack _((void)); +void Init_Precision _((void)); +void Init_sym _((void)); +void Init_process _((void)); +void Init_Random _((void)); +void Init_Range _((void)); +void Init_Regexp _((void)); +void Init_signal _((void)); +void Init_String _((void)); +void Init_Struct _((void)); +void Init_Time _((void)); +void Init_var_tables _((void)); +void Init_version _((void)); + +void +rb_call_inits() +{ + Init_sym(); + Init_var_tables(); + Init_Object(); + Init_Comparable(); + Init_Enumerable(); + Init_Precision(); + Init_eval(); + Init_String(); + Init_Exception(); + Init_Thread(); + Init_Numeric(); + Init_Bignum(); + Init_syserr(); + Init_Array(); + Init_Hash(); + Init_Struct(); + Init_Regexp(); + Init_pack(); + Init_Range(); + Init_IO(); + Init_Dir(); + Init_Time(); + Init_Random(); + Init_signal(); + Init_process(); + Init_load(); + Init_Proc(); + Init_Binding(); + Init_Math(); + Init_GC(); + Init_marshal(); + Init_version(); +} +/********************************************************************** + + io.c - + + $Author: shyouhei $ + $Date: 2009-03-09 01:52:15 +0100 (Mon, 09 Mar 2009) $ + created at: Fri Oct 15 18:08:59 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#if defined(__VMS) +#define _XOPEN_SOURCE +#define _POSIX_C_SOURCE 2 +#endif + +#include "ruby.h" +#include "rubyio.h" +#include "rubysig.h" +#include "env.h" +#include <ctype.h> +#include <errno.h> + +#if defined(MSDOS) || defined(__BOW__) || defined(__CYGWIN__) || defined(_WIN32) || defined(__human68k__) || defined(__EMX__) || defined(__BEOS__) +# define NO_SAFE_RENAME +#endif + +#if defined(MSDOS) || defined(__CYGWIN__) || defined(_WIN32) +# define NO_LONG_FNAME +#endif + +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(sun) || defined(_nec_ews) +# define USE_SETVBUF +#endif + +#ifdef __QNXNTO__ +#include "unix.h" +#endif + +#include <sys/types.h> +#if defined(HAVE_SYS_IOCTL_H) && !defined(DJGPP) && !defined(_WIN32) && !defined(__human68k__) +#include <sys/ioctl.h> +#endif +#if defined(HAVE_FCNTL_H) || defined(_WIN32) +#include <fcntl.h> +#elif defined(HAVE_SYS_FCNTL_H) +#include <sys/fcntl.h> +#endif + +#if !HAVE_OFF_T && !defined(off_t) +# define off_t long +#endif +#if !HAVE_FSEEKO && !defined(fseeko) +# define fseeko fseek +#endif +#if !HAVE_FTELLO && !defined(ftello) +# define ftello ftell +#endif + +#include <sys/stat.h> + +/* EMX has sys/param.h, but.. */ +#if defined(HAVE_SYS_PARAM_H) && !(defined(__EMX__) || defined(__HIUX_MPP__)) +# include <sys/param.h> +#endif + +#if !defined NOFILE +# define NOFILE 64 +#endif + +#ifdef HAVE_UNISTD_H +#ifdef HAVE_SYSCALL_H +#include <syscall.h> +#elif defined HAVE_SYS_SYSCALL_H +#include <sys/syscall.h> +#endif + +#include <unistd.h> +#endif + +extern void Init_File _((void)); + +#ifdef __BEOS__ +# ifndef NOFILE +# define NOFILE (OPEN_MAX) +# endif +#include <net/socket.h> +#endif + +#include "util.h" + +#ifndef O_ACCMODE +#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR) +#endif + +#if SIZEOF_OFF_T > SIZEOF_LONG && !defined(HAVE_LONG_LONG) +# error off_t is bigger than long, but you have no long long... +#endif + +#ifndef PIPE_BUF +# ifdef _POSIX_PIPE_BUF +# define PIPE_BUF _POSIX_PIPE_BUF +# else +# define PIPE_BUF 512 /* is this ok? */ +# endif +#endif + +VALUE rb_cIO; +VALUE rb_eEOFError; +VALUE rb_eIOError; + +VALUE rb_stdin, rb_stdout, rb_stderr; +VALUE rb_deferr; /* rescue VIM plugin */ +static VALUE orig_stdout, orig_stderr; + +VALUE rb_output_fs; +VALUE rb_rs; +VALUE rb_output_rs; +VALUE rb_default_rs; + +static VALUE argf; + +static ID id_write, id_read, id_getc; + +extern char *ruby_inplace_mode; + +struct timeval rb_time_interval _((VALUE)); + +static VALUE filename, current_file; +static int gets_lineno; +static int init_p = 0, next_p = 0; +static VALUE lineno = INT2FIX(0); + +#ifdef _STDIO_USES_IOSTREAM /* GNU libc */ +# ifdef _IO_fpos_t +# define READ_DATA_PENDING(fp) ((fp)->_IO_read_ptr != (fp)->_IO_read_end) +# define READ_DATA_PENDING_COUNT(fp) ((fp)->_IO_read_end - (fp)->_IO_read_ptr) +# define READ_DATA_PENDING_PTR(fp) ((fp)->_IO_read_ptr) +# else +# define READ_DATA_PENDING(fp) ((fp)->_gptr < (fp)->_egptr) +# define READ_DATA_PENDING_COUNT(fp) ((fp)->_egptr - (fp)->_gptr) +# define READ_DATA_PENDING_PTR(fp) ((fp)->_gptr) +# endif +#elif defined(_LP64) && (defined(__sun__) || defined(__sun)) +typedef struct _FILE64 { + unsigned char *_ptr; /* next character from/to here in buffer */ + unsigned char *_base; /* the buffer */ + unsigned char *_end; /* the end of the buffer */ + ssize_t _cnt; /* number of available characters in buffer */ + int _file; /* UNIX System file descriptor */ + unsigned int _flag; /* the state of the stream */ + char __fill[80]; /* filler to bring size to 128 bytes */ +} FILE64; +# define READ_DATA_PENDING(fp) (((FILE64*)(fp))->_cnt > 0) +# define READ_DATA_PENDING_COUNT(fp) (((FILE64*)(fp))->_cnt) +# define READ_DATA_PENDING_PTR(fp) ((char *)((FILE64*)(fp))->_ptr) +#elif defined(FILE_COUNT) +# define READ_DATA_PENDING(fp) ((fp)->FILE_COUNT > 0) +# define READ_DATA_PENDING_COUNT(fp) ((fp)->FILE_COUNT) +#elif defined(FILE_READEND) +# define READ_DATA_PENDING(fp) ((fp)->FILE_READPTR < (fp)->FILE_READEND) +# define READ_DATA_PENDING_COUNT(fp) ((fp)->FILE_READEND - (fp)->FILE_READPTR) +#elif defined(__BEOS__) +# define READ_DATA_PENDING(fp) (fp->_state._eof == 0) +#elif defined(__VMS) +# define READ_DATA_PENDING_COUNT(fp) ((unsigned int)(*(fp))->_cnt) +# define READ_DATA_PENDING(fp) (((unsigned int)(*(fp))->_cnt) > 0) +# define READ_DATA_BUFFERED(fp) 0 +#elif defined(__DragonFly__) +/* FILE is an incomplete struct type since DragonFly BSD 1.4.0 */ +# define READ_DATA_PENDING(fp) (((struct __FILE_public *)(fp))->_r > 0) +# define READ_DATA_PENDING_COUNT(fp) (((struct __FILE_public *)(fp))->_r) +#else +/* requires systems own version of the ReadDataPending() */ +extern int ReadDataPending(); +# define READ_DATA_PENDING(fp) (!feof(fp)) +# define READ_DATA_BUFFERED(fp) 0 +#endif +#ifndef READ_DATA_BUFFERED +# define READ_DATA_BUFFERED(fp) READ_DATA_PENDING(fp) +#endif + +#ifndef READ_DATA_PENDING_PTR +# ifdef FILE_READPTR +# define READ_DATA_PENDING_PTR(fp) ((char *)(fp)->FILE_READPTR) +# endif +#endif + +#if defined __DJGPP__ +# undef READ_DATA_PENDING_COUNT +# undef READ_DATA_PENDING_PTR +#endif + +#define READ_CHECK(fp) do {\ + if (!READ_DATA_PENDING(fp)) {\ + rb_thread_wait_fd(fileno(fp));\ + rb_io_check_closed(fptr);\ + }\ +} while(0) + +void +rb_eof_error() +{ + rb_raise(rb_eEOFError, "end of file reached"); +} + +VALUE +rb_io_taint_check(io) + VALUE io; +{ + if (!OBJ_TAINTED(io) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO"); + rb_check_frozen(io); + return io; +} + +void +rb_io_check_initialized(fptr) + OpenFile *fptr; +{ + if (!fptr) { + rb_raise(rb_eIOError, "uninitialized stream"); + } +} + +void +rb_io_check_closed(fptr) + OpenFile *fptr; +{ + rb_io_check_initialized(fptr); + if (!fptr->f && !fptr->f2) { + rb_raise(rb_eIOError, "closed stream"); + } +} + +static void io_fflush _((FILE *, OpenFile *)); + +static OpenFile * +flush_before_seek(fptr) + OpenFile *fptr; +{ + if (fptr->mode & FMODE_WBUF) { + io_fflush(GetWriteFile(fptr), fptr); + } + errno = 0; + return fptr; +} + +#define io_seek(fptr, ofs, whence) fseeko(flush_before_seek(fptr)->f, ofs, whence) +#define io_tell(fptr) ftello(flush_before_seek(fptr)->f) + +#ifndef SEEK_CUR +# define SEEK_SET 0 +# define SEEK_CUR 1 +# define SEEK_END 2 +#endif + +#define FMODE_SYNCWRITE (FMODE_SYNC|FMODE_WRITABLE) + +void +rb_io_check_readable(fptr) + OpenFile *fptr; +{ + rb_io_check_closed(fptr); + if (!(fptr->mode & FMODE_READABLE)) { + rb_raise(rb_eIOError, "not opened for reading"); + } +#ifdef NEED_IO_SEEK_BETWEEN_RW + if (((fptr->mode & FMODE_WBUF) || + (fptr->mode & (FMODE_SYNCWRITE|FMODE_RBUF)) == FMODE_SYNCWRITE) && + !feof(fptr->f) && + !fptr->f2) { + io_seek(fptr, 0, SEEK_CUR); + } +#endif + fptr->mode |= FMODE_RBUF; +} + +void +rb_io_check_writable(fptr) + OpenFile *fptr; +{ + rb_io_check_closed(fptr); + if (!(fptr->mode & FMODE_WRITABLE)) { + rb_raise(rb_eIOError, "not opened for writing"); + } + if ((fptr->mode & FMODE_RBUF) && !feof(fptr->f) && !fptr->f2) { + io_seek(fptr, 0, SEEK_CUR); + } + if (!fptr->f2) { + fptr->mode &= ~FMODE_RBUF; + } +} + +int +rb_read_pending(fp) + FILE *fp; +{ + return READ_DATA_PENDING(fp); +} + +void +rb_read_check(fp) + FILE *fp; +{ + if (!READ_DATA_PENDING(fp)) { + rb_thread_wait_fd(fileno(fp)); + } +} + +static int +ruby_dup(orig) + int orig; +{ + int fd; + + fd = dup(orig); + if (fd < 0) { + if (errno == EMFILE || errno == ENFILE || errno == ENOMEM) { + rb_gc(); + fd = dup(orig); + } + if (fd < 0) { + rb_sys_fail(0); + } + } + return fd; +} + +static VALUE io_alloc _((VALUE)); +static VALUE +io_alloc(klass) + VALUE klass; +{ + NEWOBJ(io, struct RFile); + OBJSETUP(io, klass, T_FILE); + + io->fptr = 0; + + return (VALUE)io; +} + +static void +io_fflush(f, fptr) + FILE *f; + OpenFile *fptr; +{ + int n; + + if (!rb_thread_fd_writable(fileno(f))) { + rb_io_check_closed(fptr); + } + for (;;) { + TRAP_BEG; + n = fflush(f); + TRAP_END; + if (n != EOF) break; + if (!rb_io_wait_writable(fileno(f))) + rb_sys_fail(fptr->path); + } + fptr->mode &= ~FMODE_WBUF; +} + +int +rb_io_wait_readable(f) + int f; +{ + fd_set rfds; + + switch (errno) { + case EINTR: +#if defined(ERESTART) + case ERESTART: +#endif + rb_thread_wait_fd(f); + return Qtrue; + + case EAGAIN: +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif + FD_ZERO(&rfds); + FD_SET(f, &rfds); + rb_thread_select(f + 1, &rfds, NULL, NULL, NULL); + return Qtrue; + + default: + return Qfalse; + } +} + +int +rb_io_wait_writable(f) + int f; +{ + fd_set wfds; + + switch (errno) { + case EINTR: +#if defined(ERESTART) + case ERESTART: +#endif + rb_thread_fd_writable(f); + return Qtrue; + + case EAGAIN: +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif + FD_ZERO(&wfds); + FD_SET(f, &wfds); + rb_thread_select(f + 1, NULL, &wfds, NULL, NULL); + return Qtrue; + + default: + return Qfalse; + } +} + +#ifndef S_ISREG +# define S_ISREG(m) ((m & S_IFMT) == S_IFREG) +#endif + +static int +wsplit_p(OpenFile *fptr) +{ + FILE *f = GetWriteFile(fptr); + int r; + if (!(fptr->mode & FMODE_WSPLIT_INITIALIZED)) { + struct stat buf; + if (fstat(fileno(f), &buf) == 0 && + !S_ISREG(buf.st_mode) +#if defined(HAVE_FCNTL) && defined(F_GETFL) && defined(O_NONBLOCK) + && (r = fcntl(fileno(f), F_GETFL)) != -1 && + !(r & O_NONBLOCK) +#endif + ) { + fptr->mode |= FMODE_WSPLIT; + } + fptr->mode |= FMODE_WSPLIT_INITIALIZED; + } + return fptr->mode & FMODE_WSPLIT; +} + +/* writing functions */ +static long +io_fwrite(str, fptr) + VALUE str; + OpenFile *fptr; +{ + long len, n, r, l, offset = 0; + FILE *f = GetWriteFile(fptr); + + len = RSTRING(str)->len; + if ((n = len) <= 0) return n; + if (fptr->mode & FMODE_SYNC) { + io_fflush(f, fptr); + if (!rb_thread_fd_writable(fileno(f))) { + rb_io_check_closed(fptr); + } + retry: + l = n; + if (PIPE_BUF < l && + !rb_thread_critical && + !rb_thread_alone() && + wsplit_p(fptr)) { + l = PIPE_BUF; + } + TRAP_BEG; + r = write(fileno(f), RSTRING(str)->ptr+offset, l); + TRAP_END; + if (r == n) return len; + if (0 <= r) { + offset += r; + n -= r; + errno = EAGAIN; + } + if (rb_io_wait_writable(fileno(f))) { + rb_io_check_closed(fptr); + if (offset < RSTRING(str)->len) + goto retry; + } + return -1L; + } +#if defined(__human68k__) || defined(__vms) + do { + if (fputc(RSTRING(str)->ptr[offset++], f) == EOF) { + if (ferror(f)) return -1L; + break; + } + } while (--n > 0); +#else + while (errno = 0, offset += (r = fwrite(RSTRING(str)->ptr+offset, 1, n, f)), (n -= r) > 0) { + if (ferror(f) +#if defined __BORLANDC__ + || errno +#endif + ) { +#ifdef __hpux + if (!errno) errno = EAGAIN; +#elif defined(_WIN32) && !defined(__BORLANDC__) + /* workaround for MSVCRT's bug */ + if (!errno) { + if (GetLastError() == ERROR_NO_DATA) + errno = EPIPE; + else + errno = EBADF; + } +#endif + if (rb_io_wait_writable(fileno(f))) { + rb_io_check_closed(fptr); + clearerr(f); + if (offset < RSTRING(str)->len) + continue; + } + return -1L; + } + } +#endif + return len - n; +} + +long +rb_io_fwrite(ptr, len, f) + const char *ptr; + long len; + FILE *f; +{ + OpenFile of; + + of.f = f; + of.f2 = NULL; + of.mode = FMODE_WRITABLE; + of.path = NULL; + return io_fwrite(rb_str_new(ptr, len), &of); +} + +/* + * call-seq: + * ios.write(string) => integer + * + * Writes the given string to <em>ios</em>. The stream must be opened + * for writing. If the argument is not a string, it will be converted + * to a string using <code>to_s</code>. Returns the number of bytes + * written. + * + * count = $stdout.write( "This is a test\n" ) + * puts "That was #{count} bytes of data" + * + * <em>produces:</em> + * + * This is a test + * That was 15 bytes of data + */ + +static VALUE +io_write(io, str) + VALUE io, str; +{ + OpenFile *fptr; + long n; + + rb_secure(4); + if (TYPE(str) != T_STRING) + str = rb_obj_as_string(str); + + if (TYPE(io) != T_FILE) { + /* port is not IO, call write method for it. */ + return rb_funcall(io, id_write, 1, str); + } + if (RSTRING(str)->len == 0) return INT2FIX(0); + + GetOpenFile(io, fptr); + rb_io_check_writable(fptr); + + n = io_fwrite(str, fptr); + if (n == -1L) rb_sys_fail(fptr->path); + if (!(fptr->mode & FMODE_SYNC)) { + fptr->mode |= FMODE_WBUF; + } + + return LONG2FIX(n); +} + +VALUE +rb_io_write(io, str) + VALUE io, str; +{ + return rb_funcall(io, id_write, 1, str); +} + +/* + * call-seq: + * ios << obj => ios + * + * String Output---Writes <i>obj</i> to <em>ios</em>. + * <i>obj</i> will be converted to a string using + * <code>to_s</code>. + * + * $stdout << "Hello " << "world!\n" + * + * <em>produces:</em> + * + * Hello world! + */ + +VALUE +rb_io_addstr(io, str) + VALUE io, str; +{ + rb_io_write(io, str); + return io; +} + +/* + * call-seq: + * ios.flush => ios + * + * Flushes any buffered data within <em>ios</em> to the underlying + * operating system (note that this is Ruby internal buffering only; + * the OS may buffer the data as well). + * + * $stdout.print "no newline" + * $stdout.flush + * + * <em>produces:</em> + * + * no newline + */ + +static VALUE +rb_io_flush(io) + VALUE io; +{ + OpenFile *fptr; + FILE *f; + + GetOpenFile(io, fptr); + rb_io_check_writable(fptr); + f = GetWriteFile(fptr); + + io_fflush(f, fptr); + + return io; +} + +/* + * call-seq: + * ios.pos => integer + * ios.tell => integer + * + * Returns the current offset (in bytes) of <em>ios</em>. + * + * f = File.new("testfile") + * f.pos #=> 0 + * f.gets #=> "This is line one\n" + * f.pos #=> 17 + */ + +static VALUE +rb_io_tell(io) + VALUE io; +{ + OpenFile *fptr; + off_t pos; + + GetOpenFile(io, fptr); + pos = io_tell(fptr); + if (pos < 0 && errno) rb_sys_fail(fptr->path); + return OFFT2NUM(pos); +} + +static VALUE +rb_io_seek(io, offset, whence) + VALUE io, offset; + int whence; +{ + OpenFile *fptr; + off_t pos; + + pos = NUM2OFFT(offset); + GetOpenFile(io, fptr); + pos = io_seek(fptr, pos, whence); + if (pos < 0 && errno) rb_sys_fail(fptr->path); + clearerr(fptr->f); + + return INT2FIX(0); +} + +/* + * call-seq: + * ios.seek(amount, whence=SEEK_SET) -> 0 + * + * Seeks to a given offset <i>anInteger</i> in the stream according to + * the value of <i>whence</i>: + * + * IO::SEEK_CUR | Seeks to _amount_ plus current position + * --------------+---------------------------------------------------- + * IO::SEEK_END | Seeks to _amount_ plus end of stream (you probably + * | want a negative value for _amount_) + * --------------+---------------------------------------------------- + * IO::SEEK_SET | Seeks to the absolute location given by _amount_ + * + * Example: + * + * f = File.new("testfile") + * f.seek(-13, IO::SEEK_END) #=> 0 + * f.readline #=> "And so on...\n" + */ + +static VALUE +rb_io_seek_m(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE offset, ptrname; + int whence = SEEK_SET; + + if (rb_scan_args(argc, argv, "11", &offset, &ptrname) == 2) { + whence = NUM2INT(ptrname); + } + + return rb_io_seek(io, offset, whence); +} + +/* + * call-seq: + * ios.pos = integer => integer + * + * Seeks to the given position (in bytes) in <em>ios</em>. + * + * f = File.new("testfile") + * f.pos = 17 + * f.gets #=> "This is line two\n" + */ + +static VALUE +rb_io_set_pos(io, offset) + VALUE io, offset; +{ + OpenFile *fptr; + off_t pos; + + pos = NUM2OFFT(offset); + GetOpenFile(io, fptr); + pos = io_seek(fptr, pos, SEEK_SET); + if (pos != 0) rb_sys_fail(fptr->path); + clearerr(fptr->f); + + return OFFT2NUM(pos); +} + +/* + * call-seq: + * ios.rewind => 0 + * + * Positions <em>ios</em> to the beginning of input, resetting + * <code>lineno</code> to zero. + * + * f = File.new("testfile") + * f.readline #=> "This is line one\n" + * f.rewind #=> 0 + * f.lineno #=> 0 + * f.readline #=> "This is line one\n" + */ + +static VALUE +rb_io_rewind(io) + VALUE io; +{ + OpenFile *fptr; + + GetOpenFile(io, fptr); + if (io_seek(fptr, 0L, 0) != 0) rb_sys_fail(fptr->path); + clearerr(fptr->f); + if (io == current_file) { + gets_lineno -= fptr->lineno; + } + fptr->lineno = 0; + + return INT2FIX(0); +} + +/* + * call-seq: + * ios.eof => true or false + * ios.eof? => true or false + * + * Returns true if <em>ios</em> is at end of file that means + * there are no more data to read. + * The stream must be opened for reading or an <code>IOError</code> will be + * raised. + * + * f = File.new("testfile") + * dummy = f.readlines + * f.eof #=> true + * + * If <em>ios</em> is a stream such as pipe or socket, <code>IO#eof?</code> + * blocks until the other end sends some data or closes it. + * + * r, w = IO.pipe + * Thread.new { sleep 1; w.close } + * r.eof? #=> true after 1 second blocking + * + * r, w = IO.pipe + * Thread.new { sleep 1; w.puts "a" } + * r.eof? #=> false after 1 second blocking + * + * r, w = IO.pipe + * r.eof? # blocks forever + * + * Note that <code>IO#eof?</code> reads data to a input buffer. + * So <code>IO#sysread</code> doesn't work with <code>IO#eof?</code>. + */ + +VALUE +rb_io_eof(io) + VALUE io; +{ + OpenFile *fptr; + int ch; + + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + + if (feof(fptr->f)) return Qtrue; + if (READ_DATA_PENDING(fptr->f)) return Qfalse; + READ_CHECK(fptr->f); + clearerr(fptr->f); + TRAP_BEG; + ch = getc(fptr->f); + TRAP_END; + + if (ch != EOF) { + ungetc(ch, fptr->f); + return Qfalse; + } + rb_io_check_closed(fptr); + clearerr(fptr->f); + return Qtrue; +} + +/* + * call-seq: + * ios.sync => true or false + * + * Returns the current ``sync mode'' of <em>ios</em>. When sync mode is + * true, all output is immediately flushed to the underlying operating + * system and is not buffered by Ruby internally. See also + * <code>IO#fsync</code>. + * + * f = File.new("testfile") + * f.sync #=> false + */ + +static VALUE +rb_io_sync(io) + VALUE io; +{ + OpenFile *fptr; + + GetOpenFile(io, fptr); + return (fptr->mode & FMODE_SYNC) ? Qtrue : Qfalse; +} + +/* + * call-seq: + * ios.sync = boolean => boolean + * + * Sets the ``sync mode'' to <code>true</code> or <code>false</code>. + * When sync mode is true, all output is immediately flushed to the + * underlying operating system and is not buffered internally. Returns + * the new state. See also <code>IO#fsync</code>. + * + * f = File.new("testfile") + * f.sync = true + * + * <em>(produces no output)</em> + */ + +static VALUE +rb_io_set_sync(io, mode) + VALUE io, mode; +{ + OpenFile *fptr; + + GetOpenFile(io, fptr); + if (RTEST(mode)) { + fptr->mode |= FMODE_SYNC; + } + else { + fptr->mode &= ~FMODE_SYNC; + } + return mode; +} + +/* + * call-seq: + * ios.fsync => 0 or nil + * + * Immediately writes all buffered data in <em>ios</em> to disk. + * Returns <code>nil</code> if the underlying operating system does not + * support <em>fsync(2)</em>. Note that <code>fsync</code> differs from + * using <code>IO#sync=</code>. The latter ensures that data is flushed + * from Ruby's buffers, but doesn't not guarantee that the underlying + * operating system actually writes it to disk. + */ + +static VALUE +rb_io_fsync(io) + VALUE io; +{ +#ifdef HAVE_FSYNC + OpenFile *fptr; + FILE *f; + + GetOpenFile(io, fptr); + f = GetWriteFile(fptr); + + io_fflush(f, fptr); + if (fsync(fileno(f)) < 0) + rb_sys_fail(fptr->path); + return INT2FIX(0); +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + +/* + * call-seq: + * ios.fileno => fixnum + * ios.to_i => fixnum + * + * Returns an integer representing the numeric file descriptor for + * <em>ios</em>. + * + * $stdin.fileno #=> 0 + * $stdout.fileno #=> 1 + */ + +static VALUE +rb_io_fileno(io) + VALUE io; +{ + OpenFile *fptr; + int fd; + + GetOpenFile(io, fptr); + fd = fileno(fptr->f); + return INT2FIX(fd); +} + +/* + * call-seq: + * ios.pid => fixnum + * + * Returns the process ID of a child process associated with + * <em>ios</em>. This will be set by <code>IO::popen</code>. + * + * pipe = IO.popen("-") + * if pipe + * $stderr.puts "In parent, child pid is #{pipe.pid}" + * else + * $stderr.puts "In child, pid is #{$$}" + * end + * + * <em>produces:</em> + * + * In child, pid is 26209 + * In parent, child pid is 26209 + */ + +static VALUE +rb_io_pid(io) + VALUE io; +{ + OpenFile *fptr; + + GetOpenFile(io, fptr); + if (!fptr->pid) + return Qnil; + return INT2FIX(fptr->pid); +} + +/* + * call-seq: + * ios.inspect => string + * + * Return a string describing this IO object. + */ + +static VALUE +rb_io_inspect(obj) + VALUE obj; +{ + OpenFile *fptr; + char *buf, *cname, *st = ""; + long len; + + fptr = RFILE(rb_io_taint_check(obj))->fptr; + if (!fptr || !fptr->path) return rb_any_to_s(obj); + cname = rb_obj_classname(obj); + len = strlen(cname) + strlen(fptr->path) + 5; + if (!(fptr->f || fptr->f2)) { + st = " (closed)"; + len += 9; + } + buf = ALLOCA_N(char, len); + snprintf(buf, len, "#<%s:%s%s>", cname, fptr->path, st); + return rb_str_new2(buf); +} + +/* + * call-seq: + * ios.to_io -> ios + * + * Returns <em>ios</em>. + */ + +static VALUE +rb_io_to_io(io) + VALUE io; +{ + return io; +} + +/* reading functions */ +static long +read_buffered_data(ptr, len, f) + char *ptr; + long len; + FILE *f; +{ + long n; + +#ifdef READ_DATA_PENDING_COUNT + n = READ_DATA_PENDING_COUNT(f); + if (n <= 0) return 0; + if (n > len) n = len; + return fread(ptr, 1, n, f); +#else + int c; + + for (n = 0; n < len && READ_DATA_PENDING(f) && (c = getc(f)) != EOF; ++n) { + *ptr++ = c; + } + return n; +#endif +} + +static long +io_fread(ptr, len, fptr) + char *ptr; + long len; + OpenFile *fptr; +{ + long n = len; + int c; + int saved_errno; + + while (n > 0) { + c = read_buffered_data(ptr, n, fptr->f); + if (c < 0) goto eof; + if (c > 0) { + ptr += c; + if ((n -= c) <= 0) break; + } + rb_thread_wait_fd(fileno(fptr->f)); + rb_io_check_closed(fptr); + clearerr(fptr->f); + TRAP_BEG; + c = getc(fptr->f); + TRAP_END; + if (c == EOF) { + eof: + if (ferror(fptr->f)) { + switch (errno) { + case EINTR: +#if defined(ERESTART) + case ERESTART: +#endif + clearerr(fptr->f); + continue; + case EAGAIN: +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif + if (len > n) { + clearerr(fptr->f); + } + saved_errno = errno; + rb_warning("nonblocking IO#read is obsolete; use IO#readpartial or IO#sysread"); + errno = saved_errno; + } + if (len == n) return 0; + } + break; + } + *ptr++ = c; + n--; + } + return len - n; +} + +long +rb_io_fread(ptr, len, f) + char *ptr; + long len; + FILE *f; +{ + OpenFile of; + + of.f = f; + of.f2 = NULL; + return io_fread(ptr, len, &of); +} + +#define SMALLBUF 100 + +static long +remain_size(fptr) + OpenFile *fptr; +{ + struct stat st; + off_t siz = BUFSIZ; + off_t pos; + + if (feof(fptr->f)) return 0; + if (fstat(fileno(fptr->f), &st) == 0 && S_ISREG(st.st_mode) +#ifdef __BEOS__ + && (st.st_dev > 3) +#endif + ) + { + pos = io_tell(fptr); + if (st.st_size >= pos && pos >= 0) { + siz = st.st_size - pos + 1; + if (siz > LONG_MAX) { + rb_raise(rb_eIOError, "file too big for single read"); + } + } + } + return (long)siz; +} + +static VALUE +read_all(fptr, siz, str) + OpenFile *fptr; + long siz; + VALUE str; +{ + long bytes = 0; + long n; + + if (siz == 0) siz = BUFSIZ; + if (NIL_P(str)) { + str = rb_str_new(0, siz); + } + else { + rb_str_resize(str, siz); + } + for (;;) { + rb_str_locktmp(str); + READ_CHECK(fptr->f); + n = io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr); + rb_str_unlocktmp(str); + if (n == 0 && bytes == 0) { + if (!fptr->f) break; + if (feof(fptr->f)) break; + if (!ferror(fptr->f)) break; + rb_sys_fail(fptr->path); + } + bytes += n; + if (bytes < siz) break; + siz += BUFSIZ; + rb_str_resize(str, siz); + } + if (bytes != siz) rb_str_resize(str, bytes); + OBJ_TAINT(str); + + return str; +} + +void rb_io_set_nonblock(OpenFile *fptr) +{ + int flags; +#ifdef F_GETFL + flags = fcntl(fileno(fptr->f), F_GETFL); + if (flags == -1) { + rb_sys_fail(fptr->path); + } +#else + flags = 0; +#endif + if ((flags & O_NONBLOCK) == 0) { + flags |= O_NONBLOCK; + if (fcntl(fileno(fptr->f), F_SETFL, flags) == -1) { + rb_sys_fail(fptr->path); + } + } + if (fptr->f2) { +#ifdef F_GETFL + flags = fcntl(fileno(fptr->f2), F_GETFL); + if (flags == -1) { + rb_sys_fail(fptr->path); + } +#else + flags = 0; +#endif + if ((flags & O_NONBLOCK) == 0) { + flags |= O_NONBLOCK; + if (fcntl(fileno(fptr->f2), F_SETFL, flags) == -1) { + rb_sys_fail(fptr->path); + } + } + } +} + +static VALUE +io_getpartial(int argc, VALUE *argv, VALUE io, int nonblock) +{ + OpenFile *fptr; + VALUE length, str; + long n, len; + + rb_scan_args(argc, argv, "11", &length, &str); + + if ((len = NUM2LONG(length)) < 0) { + rb_raise(rb_eArgError, "negative length %ld given", len); + } + + if (NIL_P(str)) { + str = rb_str_new(0, len); + } + else { + StringValue(str); + rb_str_modify(str); + rb_str_resize(str, len); + } + OBJ_TAINT(str); + + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + + if (len == 0) + return str; + + if (!nonblock) { + READ_CHECK(fptr->f); + } + if (RSTRING(str)->len != len) { + modified: + rb_raise(rb_eRuntimeError, "buffer string modified"); + } + n = read_buffered_data(RSTRING(str)->ptr, len, fptr->f); + if (n <= 0) { + again: + if (RSTRING(str)->len != len) goto modified; + if (nonblock) { + rb_io_set_nonblock(fptr); + n = read(fileno(fptr->f), RSTRING(str)->ptr, len); + } + else { + TRAP_BEG; + n = read(fileno(fptr->f), RSTRING(str)->ptr, len); + TRAP_END; + } + if (n < 0) { + if (!nonblock && rb_io_wait_readable(fileno(fptr->f))) + goto again; + rb_sys_fail(fptr->path); + } + if (fptr->f) /* update pos in FILE structure [ruby-core:21561] */ + fflush(fptr->f); + } + rb_str_resize(str, n); + + if (n == 0) + return Qnil; + else + return str; +} + +/* + * call-seq: + * ios.readpartial(maxlen) => string + * ios.readpartial(maxlen, outbuf) => outbuf + * + * Reads at most <i>maxlen</i> bytes from the I/O stream. + * It blocks only if <em>ios</em> has no data immediately available. + * It doesn't block if some data available. + * If the optional <i>outbuf</i> argument is present, + * it must reference a String, which will receive the data. + * It raises <code>EOFError</code> on end of file. + * + * readpartial is designed for streams such as pipe, socket, tty, etc. + * It blocks only when no data immediately available. + * This means that it blocks only when following all conditions hold. + * * the buffer in the IO object is empty. + * * the content of the stream is empty. + * * the stream is not reached to EOF. + * + * When readpartial blocks, it waits data or EOF on the stream. + * If some data is reached, readpartial returns with the data. + * If EOF is reached, readpartial raises EOFError. + * + * When readpartial doesn't blocks, it returns or raises immediately. + * If the buffer is not empty, it returns the data in the buffer. + * Otherwise if the stream has some content, + * it returns the data in the stream. + * Otherwise if the stream is reached to EOF, it raises EOFError. + * + * r, w = IO.pipe # buffer pipe content + * w << "abc" # "" "abc". + * r.readpartial(4096) #=> "abc" "" "" + * r.readpartial(4096) # blocks because buffer and pipe is empty. + * + * r, w = IO.pipe # buffer pipe content + * w << "abc" # "" "abc" + * w.close # "" "abc" EOF + * r.readpartial(4096) #=> "abc" "" EOF + * r.readpartial(4096) # raises EOFError + * + * r, w = IO.pipe # buffer pipe content + * w << "abc\ndef\n" # "" "abc\ndef\n" + * r.gets #=> "abc\n" "def\n" "" + * w << "ghi\n" # "def\n" "ghi\n" + * r.readpartial(4096) #=> "def\n" "" "ghi\n" + * r.readpartial(4096) #=> "ghi\n" "" "" + * + * Note that readpartial behaves similar to sysread. + * The differences are: + * * If the buffer is not empty, read from the buffer instead of "sysread for buffered IO (IOError)". + * * It doesn't cause Errno::EAGAIN and Errno::EINTR. When readpartial meets EAGAIN and EINTR by read system call, readpartial retry the system call. + * + * The later means that readpartial is nonblocking-flag insensitive. + * It blocks on the situation IO#sysread causes Errno::EAGAIN as if the fd is blocking mode. + * + */ + +static VALUE +io_readpartial(int argc, VALUE *argv, VALUE io) +{ + VALUE ret; + + ret = io_getpartial(argc, argv, io, 0); + if (NIL_P(ret)) + rb_eof_error(); + else + return ret; +} + +/* + * call-seq: + * ios.read_nonblock(maxlen) => string + * ios.read_nonblock(maxlen, outbuf) => outbuf + * + * Reads at most <i>maxlen</i> bytes from <em>ios</em> using + * read(2) system call after O_NONBLOCK is set for + * the underlying file descriptor. + * + * If the optional <i>outbuf</i> argument is present, + * it must reference a String, which will receive the data. + * + * read_nonblock just calls read(2). + * It causes all errors read(2) causes: EAGAIN, EINTR, etc. + * The caller should care such errors. + * + * read_nonblock causes EOFError on EOF. + * + * If the read buffer is not empty, + * read_nonblock reads from the buffer like readpartial. + * In this case, read(2) is not called. + * + */ + +static VALUE +io_read_nonblock(int argc, VALUE *argv, VALUE io) +{ + VALUE ret; + + ret = io_getpartial(argc, argv, io, 1); + if (NIL_P(ret)) + rb_eof_error(); + else + return ret; +} + +/* + * call-seq: + * ios.write_nonblock(string) => integer + * + * Writes the given string to <em>ios</em> using + * write(2) system call after O_NONBLOCK is set for + * the underlying file descriptor. + * + * write_nonblock just calls write(2). + * It causes all errors write(2) causes: EAGAIN, EINTR, etc. + * The result may also be smaller than string.length (partial write). + * The caller should care such errors and partial write. + * + */ + +static VALUE +rb_io_write_nonblock(VALUE io, VALUE str) +{ + OpenFile *fptr; + FILE *f; + long n; + + rb_secure(4); + if (TYPE(str) != T_STRING) + str = rb_obj_as_string(str); + + GetOpenFile(io, fptr); + rb_io_check_writable(fptr); + + f = GetWriteFile(fptr); + + rb_io_set_nonblock(fptr); + n = write(fileno(f), RSTRING(str)->ptr, RSTRING(str)->len); + + if (n == -1) rb_sys_fail(fptr->path); + + return LONG2FIX(n); +} + +/* + * call-seq: + * ios.read([length [, buffer]]) => string, buffer, or nil + * + * Reads at most <i>length</i> bytes from the I/O stream, or to the + * end of file if <i>length</i> is omitted or is <code>nil</code>. + * <i>length</i> must be a non-negative integer or nil. + * If the optional <i>buffer</i> argument is present, it must reference + * a String, which will receive the data. + * + * At end of file, it returns <code>nil</code> or <code>""</code> + * depend on <i>length</i>. + * <code><i>ios</i>.read()</code> and + * <code><i>ios</i>.read(nil)</code> returns <code>""</code>. + * <code><i>ios</i>.read(<i>positive-integer</i>)</code> returns nil. + * + * f = File.new("testfile") + * f.read(16) #=> "This is line one" + */ + +static VALUE +io_read(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + OpenFile *fptr; + long n, len; + VALUE length, str; + + rb_scan_args(argc, argv, "02", &length, &str); + + if (NIL_P(length)) { + if (!NIL_P(str)) StringValue(str); + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + return read_all(fptr, remain_size(fptr), str); + } + len = NUM2LONG(length); + if (len < 0) { + rb_raise(rb_eArgError, "negative length %ld given", len); + } + + if (NIL_P(str)) { + str = rb_tainted_str_new(0, len); + } + else { + StringValue(str); + rb_str_modify(str); + rb_str_resize(str,len); + } + + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + if (feof(fptr->f)) return Qnil; + if (len == 0) return str; + + rb_str_locktmp(str); + READ_CHECK(fptr->f); + if (RSTRING(str)->len != len) { + rb_raise(rb_eRuntimeError, "buffer string modified"); + } + n = io_fread(RSTRING(str)->ptr, len, fptr); + rb_str_unlocktmp(str); + if (n == 0) { + if (!fptr->f) return Qnil; + if (feof(fptr->f)) { + rb_str_resize(str, 0); + return Qnil; + } + if (len > 0) rb_sys_fail(fptr->path); + } + rb_str_resize(str, n); + RSTRING(str)->len = n; + RSTRING(str)->ptr[n] = '\0'; + OBJ_TAINT(str); + + return str; +} + +static int +appendline(fptr, delim, strp) + OpenFile *fptr; + int delim; + VALUE *strp; +{ + FILE *f = fptr->f; + VALUE str = *strp; + int c = EOF; +#ifndef READ_DATA_PENDING_PTR + char buf[8192]; + char *bp = buf, *bpe = buf + sizeof buf - 3; + int update = Qfalse; +#endif + + do { +#ifdef READ_DATA_PENDING_PTR + long pending = READ_DATA_PENDING_COUNT(f); + if (pending > 0) { + const char *p = READ_DATA_PENDING_PTR(f); + const char *e = memchr(p, delim, pending); + long last = 0, len = (c != EOF); + if (e) pending = e - p + 1; + len += pending; + if (!NIL_P(str)) { + last = RSTRING(str)->len; + rb_str_resize(str, last + len); + } + else { + *strp = str = rb_str_buf_new(len); + RSTRING(str)->len = len; + RSTRING(str)->ptr[len] = '\0'; + } + if (c != EOF) { + RSTRING(str)->ptr[last++] = c; + } + fread(RSTRING(str)->ptr + last, 1, pending, f); /* must not fail */ + if (e) return delim; + } + else if (c != EOF) { + if (!NIL_P(str)) { + char ch = c; + rb_str_buf_cat(str, &ch, 1); + } + else { + *strp = str = rb_str_buf_new(1); + RSTRING(str)->ptr[RSTRING(str)->len++] = c; + } + } + rb_thread_wait_fd(fileno(f)); + rb_io_check_closed(fptr); +#else + READ_CHECK(f); +#endif + clearerr(f); + TRAP_BEG; + c = getc(f); + TRAP_END; + if (c == EOF) { + if (ferror(f)) { + clearerr(f); + if (!rb_io_wait_readable(fileno(f))) + rb_sys_fail(fptr->path); + continue; + } +#ifdef READ_DATA_PENDING_PTR + return c; +#endif + } +#ifndef READ_DATA_PENDING_PTR + if (c == EOF || (*bp++ = c) == delim || bp == bpe) { + int cnt = bp - buf; + + if (cnt > 0) { + if (!NIL_P(str)) + rb_str_cat(str, buf, cnt); + else + *strp = str = rb_str_new(buf, cnt); + } + if (c == EOF) { + if (update) + return (int)RSTRING(str)->ptr[RSTRING(str)->len-1]; + return c; + } + bp = buf; + } + update = Qtrue; +#endif + } while (c != delim); + +#ifdef READ_DATA_PENDING_PTR + { + char ch = c; + if (!NIL_P(str)) { + rb_str_cat(str, &ch, 1); + } + else { + *strp = str = rb_str_new(&ch, 1); + } + } +#endif + + return c; +} + +static inline int +swallow(fptr, term) + OpenFile *fptr; + int term; +{ + FILE *f = fptr->f; + int c; + + do { +#ifdef READ_DATA_PENDING_PTR + long cnt; + while ((cnt = READ_DATA_PENDING_COUNT(f)) > 0) { + char buf[1024]; + const char *p = READ_DATA_PENDING_PTR(f); + int i; + if (cnt > sizeof buf) cnt = sizeof buf; + if (*p != term) return Qtrue; + i = cnt; + while (--i && *++p == term); + if (!fread(buf, 1, cnt - i, f)) /* must not fail */ + rb_sys_fail(fptr->path); + } + rb_thread_wait_fd(fileno(f)); + rb_io_check_closed(fptr); +#else + READ_CHECK(f); +#endif + clearerr(f); + TRAP_BEG; + c = getc(f); + TRAP_END; + if (c != term) { + ungetc(c, f); + return Qtrue; + } + } while (c != EOF); + return Qfalse; +} + +static VALUE +rb_io_getline_fast(fptr, delim) + OpenFile *fptr; + unsigned char delim; +{ + VALUE str = Qnil; + int c; + + while ((c = appendline(fptr, delim, &str)) != EOF && c != delim); + + if (!NIL_P(str)) { + fptr->lineno++; + lineno = INT2FIX(fptr->lineno); + OBJ_TAINT(str); + } + + return str; +} + +static int +rscheck(rsptr, rslen, rs) + char *rsptr; + long rslen; + VALUE rs; +{ + if (RSTRING(rs)->ptr != rsptr && RSTRING(rs)->len != rslen) + rb_raise(rb_eRuntimeError, "rs modified"); + return 1; +} + +static VALUE rb_io_getline(VALUE rs, VALUE io); + +static VALUE +rb_io_getline(rs, io) + VALUE rs, io; +{ + VALUE str = Qnil; + OpenFile *fptr; + + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + if (NIL_P(rs)) { + str = read_all(fptr, 0, Qnil); + if (RSTRING(str)->len == 0) return Qnil; + } + else if (rs == rb_default_rs) { + return rb_io_getline_fast(fptr, '\n'); + } + else { + int c, newline; + char *rsptr; + long rslen; + int rspara = 0; + + rslen = RSTRING(rs)->len; + if (rslen == 0) { + rsptr = "\n\n"; + rslen = 2; + rspara = 1; + swallow(fptr, '\n'); + } + else if (rslen == 1) { + return rb_io_getline_fast(fptr, (unsigned char)RSTRING(rs)->ptr[0]); + } + else { + rsptr = RSTRING(rs)->ptr; + } + newline = rsptr[rslen - 1]; + + while ((c = appendline(fptr, newline, &str)) != EOF && + (c != newline || RSTRING(str)->len < rslen || + ((rspara || rscheck(rsptr,rslen,rs)) && 0) || + memcmp(RSTRING(str)->ptr+RSTRING(str)->len-rslen,rsptr,rslen))); + + if (rspara) { + if (c != EOF) { + swallow(fptr, '\n'); + } + } + } + + if (!NIL_P(str)) { + fptr->lineno++; + lineno = INT2FIX(fptr->lineno); + OBJ_TAINT(str); + } + + return str; +} + +VALUE +rb_io_gets(io) + VALUE io; +{ + OpenFile *fptr; + + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + return rb_io_getline_fast(fptr, '\n'); +} + +/* + * call-seq: + * ios.gets(sep_string=$/) => string or nil + * + * Reads the next ``line'' from the I/O stream; lines are separated by + * <i>sep_string</i>. A separator of <code>nil</code> reads the entire + * contents, and a zero-length separator reads the input a paragraph at + * a time (two successive newlines in the input separate paragraphs). + * The stream must be opened for reading or an <code>IOError</code> + * will be raised. The line read in will be returned and also assigned + * to <code>$_</code>. Returns <code>nil</code> if called at end of + * file. + * + * File.new("testfile").gets #=> "This is line one\n" + * $_ #=> "This is line one\n" + */ + +static VALUE +rb_io_gets_m(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE rs, str; + + if (argc == 0) { + rs = rb_rs; + } + else { + rb_scan_args(argc, argv, "1", &rs); + if (!NIL_P(rs)) StringValue(rs); + } + str = rb_io_getline(rs, io); + rb_lastline_set(str); + + return str; +} + +/* + * call-seq: + * ios.lineno => integer + * + * Returns the current line number in <em>ios</em>. The stream must be + * opened for reading. <code>lineno</code> counts the number of times + * <code>gets</code> is called, rather than the number of newlines + * encountered. The two values will differ if <code>gets</code> is + * called with a separator other than newline. See also the + * <code>$.</code> variable. + * + * f = File.new("testfile") + * f.lineno #=> 0 + * f.gets #=> "This is line one\n" + * f.lineno #=> 1 + * f.gets #=> "This is line two\n" + * f.lineno #=> 2 + */ + +static VALUE +rb_io_lineno(io) + VALUE io; +{ + OpenFile *fptr; + + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + return INT2NUM(fptr->lineno); +} + +/* + * call-seq: + * ios.lineno = integer => integer + * + * Manually sets the current line number to the given value. + * <code>$.</code> is updated only on the next read. + * + * f = File.new("testfile") + * f.gets #=> "This is line one\n" + * $. #=> 1 + * f.lineno = 1000 + * f.lineno #=> 1000 + * $. # lineno of last read #=> 1 + * f.gets #=> "This is line two\n" + * $. # lineno of last read #=> 1001 + */ + +static VALUE +rb_io_set_lineno(io, lineno) + VALUE io, lineno; +{ + OpenFile *fptr; + + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + fptr->lineno = NUM2INT(lineno); + return lineno; +} + +static void +lineno_setter(val, id, var) + VALUE val; + ID id; + VALUE *var; +{ + gets_lineno = NUM2INT(val); + *var = INT2FIX(gets_lineno); +} + +static VALUE +argf_set_lineno(argf, val) + VALUE argf, val; +{ + gets_lineno = NUM2INT(val); + lineno = INT2FIX(gets_lineno); + return Qnil; +} + +static VALUE +argf_lineno() +{ + return lineno; +} + +/* + * call-seq: + * ios.readline(sep_string=$/) => string + * + * Reads a line as with <code>IO#gets</code>, but raises an + * <code>EOFError</code> on end of file. + */ + +static VALUE +rb_io_readline(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE line = rb_io_gets_m(argc, argv, io); + + if (NIL_P(line)) { + rb_eof_error(); + } + return line; +} + +/* + * call-seq: + * ios.readlines(sep_string=$/) => array + * + * Reads all of the lines in <em>ios</em>, and returns them in + * <i>anArray</i>. Lines are separated by the optional + * <i>sep_string</i>. If <i>sep_string</i> is <code>nil</code>, the + * rest of the stream is returned as a single record. + * The stream must be opened for reading or an + * <code>IOError</code> will be raised. + * + * f = File.new("testfile") + * f.readlines[0] #=> "This is line one\n" + */ + +static VALUE +rb_io_readlines(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE line, ary; + VALUE rs; + + if (argc == 0) { + rs = rb_rs; + } + else { + rb_scan_args(argc, argv, "1", &rs); + if (!NIL_P(rs)) StringValue(rs); + } + ary = rb_ary_new(); + while (!NIL_P(line = rb_io_getline(rs, io))) { + rb_ary_push(ary, line); + } + return ary; +} + +/* + * call-seq: + * ios.each(sep_string=$/) {|line| block } => ios + * ios.each_line(sep_string=$/) {|line| block } => ios + * + * Executes the block for every line in <em>ios</em>, where lines are + * separated by <i>sep_string</i>. <em>ios</em> must be opened for + * reading or an <code>IOError</code> will be raised. + * + * f = File.new("testfile") + * f.each {|line| puts "#{f.lineno}: #{line}" } + * + * <em>produces:</em> + * + * 1: This is line one + * 2: This is line two + * 3: This is line three + * 4: And so on... + */ + +static VALUE +rb_io_each_line(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE str; + VALUE rs; + + if (argc == 0) { + rs = rb_rs; + } + else { + rb_scan_args(argc, argv, "1", &rs); + if (!NIL_P(rs)) StringValue(rs); + } + while (!NIL_P(str = rb_io_getline(rs, io))) { + rb_yield(str); + } + return io; +} + +/* + * call-seq: + * ios.each_byte {|byte| block } => nil + * + * Calls the given block once for each byte (0..255) in <em>ios</em>, + * passing the byte as an argument. The stream must be opened for + * reading or an <code>IOError</code> will be raised. + * + * f = File.new("testfile") + * checksum = 0 + * f.each_byte {|x| checksum ^= x } #=> #<File:testfile> + * checksum #=> 12 + */ + +static VALUE +rb_io_each_byte(io) + VALUE io; +{ + OpenFile *fptr; + FILE *f; + int c; + + GetOpenFile(io, fptr); + + for (;;) { + rb_io_check_readable(fptr); + f = fptr->f; + READ_CHECK(f); + clearerr(f); + TRAP_BEG; + c = getc(f); + TRAP_END; + if (c == EOF) { + if (ferror(f)) { + clearerr(f); + if (!rb_io_wait_readable(fileno(f))) + rb_sys_fail(fptr->path); + continue; + } + break; + } + rb_yield(INT2FIX(c & 0xff)); + } + if (ferror(f)) rb_sys_fail(fptr->path); + return io; +} + +/* + * call-seq: + * ios.getc => fixnum or nil + * + * Gets the next 8-bit byte (0..255) from <em>ios</em>. Returns + * <code>nil</code> if called at end of file. + * + * f = File.new("testfile") + * f.getc #=> 84 + * f.getc #=> 104 + */ + +VALUE +rb_io_getc(io) + VALUE io; +{ + OpenFile *fptr; + FILE *f; + int c; + + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + f = fptr->f; + + retry: + READ_CHECK(f); + clearerr(f); + TRAP_BEG; + c = getc(f); + TRAP_END; + + if (c == EOF) { + if (ferror(f)) { + clearerr(f); + if (!rb_io_wait_readable(fileno(f))) + rb_sys_fail(fptr->path); + goto retry; + } + return Qnil; + } + return INT2FIX(c & 0xff); +} + +int +rb_getc(f) + FILE *f; +{ + int c; + + if (!READ_DATA_PENDING(f)) { + rb_thread_wait_fd(fileno(f)); + } + clearerr(f); + TRAP_BEG; + c = getc(f); + TRAP_END; + + return c; +} + +/* + * call-seq: + * ios.readchar => fixnum + * + * Reads a character as with <code>IO#getc</code>, but raises an + * <code>EOFError</code> on end of file. + */ + +static VALUE +rb_io_readchar(io) + VALUE io; +{ + VALUE c = rb_io_getc(io); + + if (NIL_P(c)) { + rb_eof_error(); + } + return c; +} + +/* + * call-seq: + * ios.ungetc(integer) => nil + * + * Pushes back one character (passed as a parameter) onto <em>ios</em>, + * such that a subsequent buffered read will return it. Only one character + * may be pushed back before a subsequent read operation (that is, + * you will be able to read only the last of several characters that have been pushed + * back). Has no effect with unbuffered reads (such as <code>IO#sysread</code>). + * + * f = File.new("testfile") #=> #<File:testfile> + * c = f.getc #=> 84 + * f.ungetc(c) #=> nil + * f.getc #=> 84 + */ + +VALUE +rb_io_ungetc(io, c) + VALUE io, c; +{ + OpenFile *fptr; + int cc = NUM2INT(c); + + GetOpenFile(io, fptr); + if (!(fptr->mode & FMODE_RBUF)) + rb_raise(rb_eIOError, "unread stream"); + rb_io_check_readable(fptr); + + if (ungetc(cc, fptr->f) == EOF && cc != EOF) { + rb_raise(rb_eIOError, "ungetc failed"); + } + return Qnil; +} + +/* + * call-seq: + * ios.isatty => true or false + * ios.tty? => true or false + * + * Returns <code>true</code> if <em>ios</em> is associated with a + * terminal device (tty), <code>false</code> otherwise. + * + * File.new("testfile").isatty #=> false + * File.new("/dev/tty").isatty #=> true + */ + +static VALUE +rb_io_isatty(io) + VALUE io; +{ + OpenFile *fptr; + + GetOpenFile(io, fptr); + if (isatty(fileno(fptr->f)) == 0) + return Qfalse; + return Qtrue; +} + +static void +fptr_finalize(fptr, noraise) + OpenFile *fptr; + int noraise; +{ + int n1 = 0, n2 = 0, f1, f2 = -1; + + errno = 0; + if (fptr->f2) { + f2 = fileno(fptr->f2); + while (n2 = 0, fflush(fptr->f2) < 0) { + n2 = errno; + if (!rb_io_wait_writable(f2)) { + break; + } + if (!fptr->f2) break; + } + if (fclose(fptr->f2) < 0 && n2 == 0) { + n2 = errno; + } + fptr->f2 = 0; + } + if (fptr->f) { + f1 = fileno(fptr->f); + if ((f2 == -1) && (fptr->mode & FMODE_WBUF)) { + while (n1 = 0, fflush(fptr->f) < 0) { + n1 = errno; + if (!rb_io_wait_writable(f1)) break; + if (!fptr->f) break; + } + } + if (fclose(fptr->f) < 0 && n1 == 0) { + n1 = errno; + } + fptr->f = 0; + if (n1 == EBADF && f1 == f2) { + n1 = 0; + } + } + if (!noraise && (n1 || n2)) { + errno = (n1 ? n1 : n2); + rb_sys_fail(fptr->path); + } +} + +static void +rb_io_fptr_cleanup(fptr, noraise) + OpenFile *fptr; + int noraise; +{ + if (fptr->finalize) { + (*fptr->finalize)(fptr, noraise); + } + else { + fptr_finalize(fptr, noraise); + } +} + +void +rb_io_fptr_finalize(fptr) + OpenFile *fptr; +{ + if (!fptr) return; + if (fptr->path) { + free(fptr->path); + } + if (!fptr->f && !fptr->f2) return; + if (fileno(fptr->f) < 3) return; + + rb_io_fptr_cleanup(fptr, Qtrue); +} + +VALUE +rb_io_close(io) + VALUE io; +{ + OpenFile *fptr; + int fd, fd2; + + fptr = RFILE(io)->fptr; + if (!fptr) return Qnil; + if (fptr->f2) { + fd2 = fileno(fptr->f2); + } + else { + if (!fptr->f) return Qnil; + fd2 = -1; + } + + fd = fileno(fptr->f); + rb_io_fptr_cleanup(fptr, Qfalse); + rb_thread_fd_close(fd); + if (fd2 >= 0) rb_thread_fd_close(fd2); + + if (fptr->pid) { + rb_syswait(fptr->pid); + fptr->pid = 0; + } + + return Qnil; +} + +/* + * call-seq: + * ios.close => nil + * + * Closes <em>ios</em> and flushes any pending writes to the operating + * system. The stream is unavailable for any further data operations; + * an <code>IOError</code> is raised if such an attempt is made. I/O + * streams are automatically closed when they are claimed by the + * garbage collector. + * + * If <em>ios</em> is opened by <code>IO.popen</code>, + * <code>close</code> sets <code>$?</code>. + */ + +static VALUE +rb_io_close_m(io) + VALUE io; +{ + if (rb_safe_level() >= 4 && !OBJ_TAINTED(io)) { + rb_raise(rb_eSecurityError, "Insecure: can't close"); + } + rb_io_check_closed(RFILE(io)->fptr); + rb_io_close(io); + return Qnil; +} + +static VALUE +io_call_close(io) + VALUE io; +{ + return rb_funcall(io, rb_intern("close"), 0, 0); +} + +static VALUE +io_close(io) + VALUE io; +{ + return rb_rescue(io_call_close, io, 0, 0); +} + +/* + * call-seq: + * ios.closed? => true or false + * + * Returns <code>true</code> if <em>ios</em> is completely closed (for + * duplex streams, both reader and writer), <code>false</code> + * otherwise. + * + * f = File.new("testfile") + * f.close #=> nil + * f.closed? #=> true + * f = IO.popen("/bin/sh","r+") + * f.close_write #=> nil + * f.closed? #=> false + * f.close_read #=> nil + * f.closed? #=> true + */ + +static VALUE +rb_io_closed(io) + VALUE io; +{ + OpenFile *fptr; + + fptr = RFILE(io)->fptr; + rb_io_check_initialized(fptr); + return (fptr->f || fptr->f2)?Qfalse:Qtrue; +} + +/* + * call-seq: + * ios.close_read => nil + * + * Closes the read end of a duplex I/O stream (i.e., one that contains + * both a read and a write stream, such as a pipe). Will raise an + * <code>IOError</code> if the stream is not duplexed. + * + * f = IO.popen("/bin/sh","r+") + * f.close_read + * f.readlines + * + * <em>produces:</em> + * + * prog.rb:3:in `readlines': not opened for reading (IOError) + * from prog.rb:3 + */ + +static VALUE +rb_io_close_read(io) + VALUE io; +{ + OpenFile *fptr; + int n; + + if (rb_safe_level() >= 4 && !OBJ_TAINTED(io)) { + rb_raise(rb_eSecurityError, "Insecure: can't close"); + } + GetOpenFile(io, fptr); + if (fptr->f2 == 0 && (fptr->mode & FMODE_WRITABLE)) { + rb_raise(rb_eIOError, "closing non-duplex IO for reading"); + } + if (fptr->f2 == 0) { + return rb_io_close(io); + } + n = fclose(fptr->f); + fptr->mode &= ~FMODE_READABLE; + fptr->f = fptr->f2; + fptr->f2 = 0; + if (n != 0) rb_sys_fail(fptr->path); + + return Qnil; +} + +/* + * call-seq: + * ios.close_write => nil + * + * Closes the write end of a duplex I/O stream (i.e., one that contains + * both a read and a write stream, such as a pipe). Will raise an + * <code>IOError</code> if the stream is not duplexed. + * + * f = IO.popen("/bin/sh","r+") + * f.close_write + * f.print "nowhere" + * + * <em>produces:</em> + * + * prog.rb:3:in `write': not opened for writing (IOError) + * from prog.rb:3:in `print' + * from prog.rb:3 + */ + +static VALUE +rb_io_close_write(io) + VALUE io; +{ + OpenFile *fptr; + int n; + + if (rb_safe_level() >= 4 && !OBJ_TAINTED(io)) { + rb_raise(rb_eSecurityError, "Insecure: can't close"); + } + GetOpenFile(io, fptr); + if (fptr->f2 == 0 && (fptr->mode & FMODE_READABLE)) { + rb_raise(rb_eIOError, "closing non-duplex IO for writing"); + } + if (fptr->f2 == 0) { + return rb_io_close(io); + } + n = fclose(fptr->f2); + fptr->f2 = 0; + fptr->mode &= ~FMODE_WRITABLE; + if (n != 0) rb_sys_fail(fptr->path); + + return Qnil; +} + +/* + * call-seq: + * ios.sysseek(offset, whence=SEEK_SET) => integer + * + * Seeks to a given <i>offset</i> in the stream according to the value + * of <i>whence</i> (see <code>IO#seek</code> for values of + * <i>whence</i>). Returns the new offset into the file. + * + * f = File.new("testfile") + * f.sysseek(-13, IO::SEEK_END) #=> 53 + * f.sysread(10) #=> "And so on." + */ + +static VALUE +rb_io_sysseek(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE offset, ptrname; + int whence = SEEK_SET; + OpenFile *fptr; + off_t pos; + + if (rb_scan_args(argc, argv, "11", &offset, &ptrname) == 2) { + whence = NUM2INT(ptrname); + } + pos = NUM2OFFT(offset); + GetOpenFile(io, fptr); + if ((fptr->mode & FMODE_READABLE) && READ_DATA_BUFFERED(fptr->f)) { + rb_raise(rb_eIOError, "sysseek for buffered IO"); + } + if ((fptr->mode & FMODE_WRITABLE) && (fptr->mode & FMODE_WBUF)) { + rb_warn("sysseek for buffered IO"); + } + pos = lseek(fileno(fptr->f), pos, whence); + if (pos == -1) rb_sys_fail(fptr->path); + clearerr(fptr->f); + + return OFFT2NUM(pos); +} + +/* + * call-seq: + * ios.syswrite(string) => integer + * + * Writes the given string to <em>ios</em> using a low-level write. + * Returns the number of bytes written. Do not mix with other methods + * that write to <em>ios</em> or you may get unpredictable results. + * Raises <code>SystemCallError</code> on error. + * + * f = File.new("out", "w") + * f.syswrite("ABCDEF") #=> 6 + */ + +static VALUE +rb_io_syswrite(io, str) + VALUE io, str; +{ + OpenFile *fptr; + FILE *f; + long n; + + rb_secure(4); + if (TYPE(str) != T_STRING) + str = rb_obj_as_string(str); + + GetOpenFile(io, fptr); + rb_io_check_writable(fptr); + f = GetWriteFile(fptr); + + if (fptr->mode & FMODE_WBUF) { + rb_warn("syswrite for buffered IO"); + } + if (!rb_thread_fd_writable(fileno(f))) { + rb_io_check_closed(fptr); + } + TRAP_BEG; + n = write(fileno(f), RSTRING(str)->ptr, RSTRING(str)->len); + TRAP_END; + + if (n == -1) rb_sys_fail(fptr->path); + + return LONG2FIX(n); +} + +/* + * call-seq: + * ios.sysread(integer ) => string + * + * Reads <i>integer</i> bytes from <em>ios</em> using a low-level + * read and returns them as a string. Do not mix with other methods + * that read from <em>ios</em> or you may get unpredictable results. + * Raises <code>SystemCallError</code> on error and + * <code>EOFError</code> at end of file. + * + * f = File.new("testfile") + * f.sysread(16) #=> "This is line one" + */ + +static VALUE +rb_io_sysread(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE len, str; + OpenFile *fptr; + long n, ilen; + + rb_scan_args(argc, argv, "11", &len, &str); + ilen = NUM2LONG(len); + + if (NIL_P(str)) { + str = rb_str_new(0, ilen); + } + else { + StringValue(str); + rb_str_modify(str); + rb_str_resize(str, ilen); + } + if (ilen == 0) return str; + + GetOpenFile(io, fptr); + rb_io_check_readable(fptr); + + if (READ_DATA_BUFFERED(fptr->f)) { + rb_raise(rb_eIOError, "sysread for buffered IO"); + } + rb_str_locktmp(str); + + n = fileno(fptr->f); + rb_thread_wait_fd(fileno(fptr->f)); + rb_io_check_closed(fptr); + if (RSTRING(str)->len != ilen) { + rb_raise(rb_eRuntimeError, "buffer string modified"); + } + TRAP_BEG; + n = read(fileno(fptr->f), RSTRING(str)->ptr, ilen); + TRAP_END; + + rb_str_unlocktmp(str); + if (n == -1) { + rb_sys_fail(fptr->path); + } + rb_str_resize(str, n); + if (n == 0 && ilen > 0) { + rb_eof_error(); + } + RSTRING(str)->len = n; + RSTRING(str)->ptr[n] = '\0'; + OBJ_TAINT(str); + + return str; +} + +/* + * call-seq: + * ios.binmode => ios + * + * Puts <em>ios</em> into binary mode. This is useful only in + * MS-DOS/Windows environments. Once a stream is in binary mode, it + * cannot be reset to nonbinary mode. + */ + +VALUE +rb_io_binmode(io) + VALUE io; +{ +#if defined(_WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__) || defined(__EMX__) + OpenFile *fptr; + + GetOpenFile(io, fptr); +#ifdef __human68k__ + if (fptr->f) + fmode(fptr->f, _IOBIN); + if (fptr->f2) + fmode(fptr->f2, _IOBIN); +#else + if (fptr->f && setmode(fileno(fptr->f), O_BINARY) == -1) + rb_sys_fail(fptr->path); + if (fptr->f2 && setmode(fileno(fptr->f2), O_BINARY) == -1) + rb_sys_fail(fptr->path); +#endif + + fptr->mode |= FMODE_BINMODE; +#endif + return io; +} + +char* +rb_io_flags_mode(flags) + int flags; +{ +#ifdef O_BINARY +# define MODE_BINMODE(a,b) ((flags & FMODE_BINMODE) ? (b) : (a)) +#else +# define MODE_BINMODE(a,b) (a) +#endif + if (flags & FMODE_APPEND) { + if ((flags & FMODE_READWRITE) == FMODE_READWRITE) { + return MODE_BINMODE("a+", "ab+"); + } + return MODE_BINMODE("a", "ab"); + } + switch (flags & FMODE_READWRITE) { + case FMODE_READABLE: + return MODE_BINMODE("r", "rb"); + case FMODE_WRITABLE: + return MODE_BINMODE("w", "wb"); + case FMODE_READWRITE: + if (flags & FMODE_CREATE) { + return MODE_BINMODE("w+", "wb+"); + } + return MODE_BINMODE("r+", "rb+"); + } + rb_raise(rb_eArgError, "illegal access modenum %o", flags); + return NULL; /* not reached */ +} + +int +rb_io_mode_flags(mode) + const char *mode; +{ + int flags = 0; + const char *m = mode; + + switch (*m++) { + case 'r': + flags |= FMODE_READABLE; + break; + case 'w': + flags |= FMODE_WRITABLE | FMODE_CREATE; + break; + case 'a': + flags |= FMODE_WRITABLE | FMODE_APPEND | FMODE_CREATE; + break; + default: + error: + rb_raise(rb_eArgError, "illegal access mode %s", mode); + } + + while (*m) { + switch (*m++) { + case 'b': + flags |= FMODE_BINMODE; + break; + case '+': + flags |= FMODE_READWRITE; + break; + default: + goto error; + } + } + + return flags; +} + +int +rb_io_modenum_flags(mode) + int mode; +{ + int flags = 0; + + switch (mode & (O_RDONLY|O_WRONLY|O_RDWR)) { + case O_RDONLY: + flags = FMODE_READABLE; + break; + case O_WRONLY: + flags = FMODE_WRITABLE; + break; + case O_RDWR: + flags = FMODE_READWRITE; + break; + } + + if (mode & O_APPEND) { + flags |= FMODE_APPEND; + } + if (mode & O_CREAT) { + flags |= FMODE_CREATE; + } +#ifdef O_BINARY + if (mode & O_BINARY) { + flags |= FMODE_BINMODE; + } +#endif + + return flags; +} + +static int +rb_io_mode_modenum(mode) + const char *mode; +{ + int flags = 0; + const char *m = mode; + + switch (*m++) { + case 'r': + flags |= O_RDONLY; + break; + case 'w': + flags |= O_WRONLY | O_CREAT | O_TRUNC; + break; + case 'a': + flags |= O_WRONLY | O_CREAT | O_APPEND; + break; + default: + error: + rb_raise(rb_eArgError, "illegal access mode %s", mode); + } + + while (*m) { + switch (*m++) { + case 'b': +#ifdef O_BINARY + flags |= O_BINARY; +#endif + break; + case '+': + flags = (flags & ~O_ACCMODE) | O_RDWR; + break; + default: + goto error; + } + } + + return flags; +} + +#define MODENUM_MAX 4 + +static char* +rb_io_modenum_mode(flags) + int flags; +{ +#ifdef O_BINARY +# define MODE_BINARY(a,b) ((flags & O_BINARY) ? (b) : (a)) +#else +# define MODE_BINARY(a,b) (a) +#endif + if (flags & O_APPEND) { + if ((flags & O_RDWR) == O_RDWR) { + return MODE_BINARY("a+", "ab+"); + } + return MODE_BINARY("a", "ab"); + } + switch (flags & (O_RDONLY|O_WRONLY|O_RDWR)) { + case O_RDONLY: + return MODE_BINARY("r", "rb"); + case O_WRONLY: + return MODE_BINARY("w", "wb"); + case O_RDWR: + return MODE_BINARY("r+", "rb+"); + } + rb_raise(rb_eArgError, "illegal access modenum %o", flags); + return NULL; /* not reached */ +} + +static int +rb_sysopen(fname, flags, mode) + char *fname; + int flags; + unsigned int mode; +{ + int fd; + + fd = open(fname, flags, mode); + if (fd < 0) { + if (errno == EMFILE || errno == ENFILE) { + rb_gc(); + fd = open(fname, flags, mode); + } + if (fd < 0) { + rb_sys_fail(fname); + } + } + return fd; +} + +FILE * +rb_fopen(fname, mode) + const char *fname; + const char *mode; +{ + FILE *file; + + file = fopen(fname, mode); + if (!file) { + if (errno == EMFILE || errno == ENFILE) { + rb_gc(); + file = fopen(fname, mode); + } + if (!file) { + rb_sys_fail(fname); + } + } +#ifdef USE_SETVBUF + if (setvbuf(file, NULL, _IOFBF, 0) != 0) + rb_warn("setvbuf() can't be honoured for %s", fname); +#endif +#ifdef __human68k__ + fmode(file, _IOTEXT); +#endif + return file; +} + +FILE * +rb_fdopen(fd, mode) + int fd; + const char *mode; +{ + FILE *file; + +#if defined(sun) + errno = 0; +#endif + file = fdopen(fd, mode); + if (!file) { +#if defined(sun) + if (errno == 0 || errno == EMFILE || errno == ENFILE) { +#else + if (errno == EMFILE || errno == ENFILE) { +#endif + rb_gc(); +#if defined(sun) + errno = 0; +#endif + file = fdopen(fd, mode); + } + if (!file) { +#ifdef _WIN32 + if (errno == 0) errno = EINVAL; +#endif +#if defined(sun) + if (errno == 0) errno = EMFILE; +#endif + rb_sys_fail(0); + } + } + +#ifdef USE_SETVBUF + if (setvbuf(file, NULL, _IOFBF, 0) != 0) + rb_warn("setvbuf() can't be honoured (fd=%d)", fd); +#endif + return file; +} + +static VALUE +rb_file_open_internal(io, fname, mode) + VALUE io; + const char *fname, *mode; +{ + OpenFile *fptr; + + MakeOpenFile(io, fptr); + + fptr->mode = rb_io_mode_flags(mode); + fptr->path = strdup(fname); + fptr->f = rb_fopen(fptr->path, rb_io_flags_mode(fptr->mode)); + + return io; +} + +VALUE +rb_file_open(fname, mode) + const char *fname, *mode; +{ + return rb_file_open_internal(io_alloc(rb_cFile), fname, mode); +} + +static VALUE +rb_file_sysopen_internal(io, fname, flags, mode) + VALUE io; + char *fname; + int flags, mode; +{ + OpenFile *fptr; + int fd; + char *m; + + MakeOpenFile(io, fptr); + + fptr->path = strdup(fname); + m = rb_io_modenum_mode(flags); + fptr->mode = rb_io_modenum_flags(flags); + fd = rb_sysopen(fptr->path, flags, mode); + fptr->f = rb_fdopen(fd, m); + + return io; +} + +VALUE +rb_file_sysopen(fname, flags, mode) + const char *fname; + int flags, mode; +{ + return rb_file_sysopen_internal(io_alloc(rb_cFile), fname, flags, mode); +} + +#if defined (_WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__) || defined(__VMS) +static struct pipe_list { + OpenFile *fptr; + struct pipe_list *next; +} *pipe_list; + +static void +pipe_add_fptr(fptr) + OpenFile *fptr; +{ + struct pipe_list *list; + + list = ALLOC(struct pipe_list); + list->fptr = fptr; + list->next = pipe_list; + pipe_list = list; +} + +static void +pipe_del_fptr(fptr) + OpenFile *fptr; +{ + struct pipe_list *list = pipe_list; + struct pipe_list *tmp; + + if (list->fptr == fptr) { + pipe_list = list->next; + free(list); + return; + } + + while (list->next) { + if (list->next->fptr == fptr) { + tmp = list->next; + list->next = list->next->next; + free(tmp); + return; + } + list = list->next; + } +} + +static void +pipe_atexit _((void)) +{ + struct pipe_list *list = pipe_list; + struct pipe_list *tmp; + + while (list) { + tmp = list->next; + rb_io_fptr_finalize(list->fptr); + list = tmp; + } +} + +static void pipe_finalize _((OpenFile *fptr,int)); + +static void +pipe_finalize(fptr, noraise) + OpenFile *fptr; + int noraise; +{ +#if !defined (__CYGWIN__) && !defined(_WIN32) + extern VALUE rb_last_status; + int status; + if (fptr->f) { + status = pclose(fptr->f); + } + if (fptr->f2) { + status = pclose(fptr->f2); + } + fptr->f = fptr->f2 = 0; +#if defined DJGPP + status <<= 8; +#endif + rb_last_status = INT2FIX(status); +#else + fptr_finalize(fptr, noraise); +#endif + pipe_del_fptr(fptr); +} +#endif + +void +rb_io_synchronized(fptr) + OpenFile *fptr; +{ + fptr->mode |= FMODE_SYNC; +} + +void +rb_io_unbuffered(fptr) + OpenFile *fptr; +{ + rb_io_synchronized(fptr); +} + +static VALUE pipe_open(VALUE pstr, char *pname, char *mode); + +static VALUE +pipe_open(pstr, pname, mode) + VALUE pstr; + char *pname, *mode; +{ + int modef = rb_io_mode_flags(mode); + OpenFile *fptr; +#if defined(DJGPP) || defined(__human68k__) || defined(__VMS) + FILE *f; +#else + int pid; +#ifdef _WIN32 + FILE *fpr, *fpw; +#else + int pr[2], pw[2]; +#endif +#endif + volatile int doexec; + + if (!pname) pname = StringValueCStr(pstr); + doexec = (strcmp("-", pname) != 0); + +#if defined(DJGPP) || defined(__human68k__) || defined(__VMS) || defined(_WIN32) + if (!doexec) { + rb_raise(rb_eNotImpError, + "fork() function is unimplemented on this machine"); + } +#endif + +#if defined(DJGPP) || defined(__human68k__) || defined(__VMS) + f = popen(pname, mode); + + if (!f) rb_sys_fail(pname); + else { + VALUE port = io_alloc(rb_cIO); + + MakeOpenFile(port, fptr); + fptr->finalize = pipe_finalize; + fptr->mode = modef; + + pipe_add_fptr(fptr); + if (modef & FMODE_READABLE) fptr->f = f; + if (modef & FMODE_WRITABLE) { + if (fptr->f) fptr->f2 = f; + else fptr->f = f; + rb_io_synchronized(fptr); + } + return (VALUE)port; + } +#else +#ifdef _WIN32 +retry: + pid = pipe_exec(pname, rb_io_mode_modenum(mode), &fpr, &fpw); + if (pid == -1) { /* exec failed */ + if (errno == EAGAIN) { + rb_thread_sleep(1); + goto retry; + } + rb_sys_fail(pname); + } + else { + VALUE port = io_alloc(rb_cIO); + + MakeOpenFile(port, fptr); + fptr->mode = modef; + fptr->mode |= FMODE_SYNC; + fptr->pid = pid; + + if (modef & FMODE_READABLE) { + fptr->f = fpr; + } + if (modef & FMODE_WRITABLE) { + if (fptr->f) fptr->f2 = fpw; + else fptr->f = fpw; + } + fptr->finalize = pipe_finalize; + pipe_add_fptr(fptr); + return (VALUE)port; + } +#else + if (((modef & FMODE_READABLE) && pipe(pr) == -1) || + ((modef & FMODE_WRITABLE) && pipe(pw) == -1)) + rb_sys_fail(pname); + + if (!doexec) { + fflush(stdin); /* is it really needed? */ + fflush(stdout); + fflush(stderr); + } + + retry: + switch ((pid = fork())) { + case 0: /* child */ + if (modef & FMODE_READABLE) { + close(pr[0]); + if (pr[1] != 1) { + dup2(pr[1], 1); + close(pr[1]); + } + } + if (modef & FMODE_WRITABLE) { + close(pw[1]); + if (pw[0] != 0) { + dup2(pw[0], 0); + close(pw[0]); + } + } + + if (doexec) { + int fd; + + for (fd = 3; fd < NOFILE; fd++) + close(fd); + rb_proc_exec(pname); + fprintf(stderr, "%s:%d: command not found: %s\n", + ruby_sourcefile, ruby_sourceline, pname); + _exit(127); + } + rb_io_synchronized(RFILE(orig_stdout)->fptr); + rb_io_synchronized(RFILE(orig_stderr)->fptr); + return Qnil; + + case -1: /* fork failed */ + if (errno == EAGAIN) { + rb_thread_sleep(1); + goto retry; + } + else { + int e = errno; + if ((modef & FMODE_READABLE)) { + close(pr[0]); + close(pr[1]); + } + if ((modef & FMODE_WRITABLE)) { + close(pw[0]); + close(pw[1]); + } + errno = e; + rb_sys_fail(pname); + } + break; + + default: /* parent */ + if (pid < 0) rb_sys_fail(pname); + else { + VALUE port = io_alloc(rb_cIO); + + MakeOpenFile(port, fptr); + fptr->mode = modef; + fptr->mode |= FMODE_SYNC; + fptr->pid = pid; + + if (modef & FMODE_READABLE) { + close(pr[1]); + fptr->f = rb_fdopen(pr[0], "r"); + } + if (modef & FMODE_WRITABLE) { + FILE *f = rb_fdopen(pw[1], "w"); + + close(pw[0]); + if (fptr->f) fptr->f2 = f; + else fptr->f = f; + } +#if defined (__CYGWIN__) + fptr->finalize = pipe_finalize; + pipe_add_fptr(fptr); +#endif + return port; + } + } +#endif +#endif +} + +/* + * call-seq: + * IO.popen(cmd_string, mode="r" ) => io + * IO.popen(cmd_string, mode="r" ) {|io| block } => obj + * + * Runs the specified command string as a subprocess; the subprocess's + * standard input and output will be connected to the returned + * <code>IO</code> object. If <i>cmd_string</i> starts with a + * ``<code>-</code>'', then a new instance of Ruby is started as the + * subprocess. The default mode for the new file object is ``r'', but + * <i>mode</i> may be set to any of the modes listed in the description + * for class IO. + * + * If a block is given, Ruby will run the command as a child connected + * to Ruby with a pipe. Ruby's end of the pipe will be passed as a + * parameter to the block. + * At the end of block, Ruby close the pipe and sets <code>$?</code>. + * In this case <code>IO::popen</code> returns + * the value of the block. + * + * If a block is given with a <i>cmd_string</i> of ``<code>-</code>'', + * the block will be run in two separate processes: once in the parent, + * and once in a child. The parent process will be passed the pipe + * object as a parameter to the block, the child version of the block + * will be passed <code>nil</code>, and the child's standard in and + * standard out will be connected to the parent through the pipe. Not + * available on all platforms. + * + * f = IO.popen("uname") + * p f.readlines + * puts "Parent is #{Process.pid}" + * IO.popen ("date") { |f| puts f.gets } + * IO.popen("-") {|f| $stderr.puts "#{Process.pid} is here, f is #{f}"} + * p $? + * + * <em>produces:</em> + * + * ["Linux\n"] + * Parent is 26166 + * Wed Apr 9 08:53:52 CDT 2003 + * 26169 is here, f is + * 26166 is here, f is #<IO:0x401b3d44> + * #<Process::Status: pid=26166,exited(0)> + */ + +static VALUE +rb_io_s_popen(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + char *mode; + VALUE pname, pmode, port; + + if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) { + mode = "r"; + } + else if (FIXNUM_P(pmode)) { + mode = rb_io_modenum_mode(FIX2INT(pmode)); + } + else { + mode = rb_io_flags_mode(rb_io_mode_flags(StringValueCStr(pmode))); + } + SafeStringValue(pname); + port = pipe_open(pname, 0, mode); + if (NIL_P(port)) { + /* child */ + if (rb_block_given_p()) { + rb_yield(Qnil); + fflush(stdout); + fflush(stderr); + _exit(0); + } + return Qnil; + } + RBASIC(port)->klass = klass; + if (rb_block_given_p()) { + return rb_ensure(rb_yield, port, io_close, port); + } + return port; +} + +static VALUE +rb_open_file(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE fname, vmode, perm; + char *path, *mode; + int flags; + unsigned int fmode; + + rb_scan_args(argc, argv, "12", &fname, &vmode, &perm); + SafeStringValue(fname); + + path = StringValueCStr(fname); + if (FIXNUM_P(vmode) || !NIL_P(perm)) { + if (FIXNUM_P(vmode)) { + flags = FIX2INT(vmode); + } + else { + SafeStringValue(vmode); + flags = rb_io_mode_modenum(RSTRING(vmode)->ptr); + } + fmode = NIL_P(perm) ? 0666 : NUM2UINT(perm); + + rb_file_sysopen_internal(io, path, flags, fmode); + } + else { + mode = NIL_P(vmode) ? "r" : StringValueCStr(vmode); + rb_file_open_internal(io, path, mode); + } + return io; +} + +/* + * call-seq: + * IO.open(fd, mode_string="r" ) => io + * IO.open(fd, mode_string="r" ) {|io| block } => obj + * + * With no associated block, <code>open</code> is a synonym for + * <code>IO::new</code>. If the optional code block is given, it will + * be passed <i>io</i> as an argument, and the IO object will + * automatically be closed when the block terminates. In this instance, + * <code>IO::open</code> returns the value of the block. + * + */ + +static VALUE +rb_io_s_open(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + VALUE io = rb_class_new_instance(argc, argv, klass); + + if (rb_block_given_p()) { + return rb_ensure(rb_yield, io, io_close, io); + } + + return io; +} + +/* + * call-seq: + * IO.sysopen(path, [mode, [perm]]) => fixnum + * + * Opens the given path, returning the underlying file descriptor as a + * <code>Fixnum</code>. + * + * IO.sysopen("testfile") #=> 3 + * + */ + +static VALUE +rb_io_s_sysopen(argc, argv) + int argc; + VALUE *argv; +{ + VALUE fname, vmode, perm; + int flags, fd; + unsigned int fmode; + char *path; + + rb_scan_args(argc, argv, "12", &fname, &vmode, &perm); + SafeStringValue(fname); + + if (NIL_P(vmode)) flags = O_RDONLY; + else if (FIXNUM_P(vmode)) flags = FIX2INT(vmode); + else { + SafeStringValue(vmode); + flags = rb_io_mode_modenum(RSTRING(vmode)->ptr); + } + if (NIL_P(perm)) fmode = 0666; + else fmode = NUM2UINT(perm); + + path = ALLOCA_N(char, strlen(RSTRING(fname)->ptr)+1); + strcpy(path, RSTRING(fname)->ptr); + fd = rb_sysopen(path, flags, fmode); + return INT2NUM(fd); +} + +/* + * call-seq: + * open(path [, mode [, perm]] ) => io or nil + * open(path [, mode [, perm]] ) {|io| block } => obj + * + * Creates an <code>IO</code> object connected to the given stream, + * file, or subprocess. + * + * If <i>path</i> does not start with a pipe character + * (``<code>|</code>''), treat it as the name of a file to open using + * the specified mode (defaulting to ``<code>r</code>''). (See the table + * of valid modes on page 331.) If a file is being created, its initial + * permissions may be set using the integer third parameter. + * + * If a block is specified, it will be invoked with the + * <code>File</code> object as a parameter, and the file will be + * automatically closed when the block terminates. The call + * returns the value of the block. + * + * If <i>path</i> starts with a pipe character, a subprocess is + * created, connected to the caller by a pair of pipes. The returned + * <code>IO</code> object may be used to write to the standard input + * and read from the standard output of this subprocess. If the command + * following the ``<code>|</code>'' is a single minus sign, Ruby forks, + * and this subprocess is connected to the parent. In the subprocess, + * the <code>open</code> call returns <code>nil</code>. If the command + * is not ``<code>-</code>'', the subprocess runs the command. If a + * block is associated with an <code>open("|-")</code> call, that block + * will be run twice---once in the parent and once in the child. The + * block parameter will be an <code>IO</code> object in the parent and + * <code>nil</code> in the child. The parent's <code>IO</code> object + * will be connected to the child's <code>$stdin</code> and + * <code>$stdout</code>. The subprocess will be terminated at the end + * of the block. + * + * open("testfile") do |f| + * print f.gets + * end + * + * <em>produces:</em> + * + * This is line one + * + * Open a subprocess and read its output: + * + * cmd = open("|date") + * print cmd.gets + * cmd.close + * + * <em>produces:</em> + * + * Wed Apr 9 08:56:31 CDT 2003 + * + * Open a subprocess running the same Ruby program: + * + * f = open("|-", "w+") + * if f == nil + * puts "in Child" + * exit + * else + * puts "Got: #{f.gets}" + * end + * + * <em>produces:</em> + * + * Got: in Child + * + * Open a subprocess using a block to receive the I/O object: + * + * open("|-") do |f| + * if f == nil + * puts "in Child" + * else + * puts "Got: #{f.gets}" + * end + * end + * + * <em>produces:</em> + * + * Got: in Child + */ + +static VALUE +rb_f_open(argc, argv) + int argc; + VALUE *argv; +{ + if (argc >= 1) { + char *str = StringValuePtr(argv[0]); + + if (str[0] == '|') { + VALUE tmp = rb_str_new(str+1, RSTRING(argv[0])->len-1); + OBJ_INFECT(tmp, argv[0]); + argv[0] = tmp; + return rb_io_s_popen(argc, argv, rb_cIO); + } + } + return rb_io_s_open(argc, argv, rb_cFile); +} + +static VALUE +rb_io_open(fname, mode) + char *fname, *mode; +{ + if (fname[0] == '|') { + return pipe_open(0, fname+1, mode); + } + else { + return rb_file_open(fname, mode); + } +} + +static VALUE +rb_io_get_io(io) + VALUE io; +{ + return rb_convert_type(io, T_FILE, "IO", "to_io"); +} + +static VALUE +rb_io_check_io(io) + VALUE io; +{ + return rb_check_convert_type(io, T_FILE, "IO", "to_io"); +} + +static char* +rb_io_mode_string(fptr) + OpenFile *fptr; +{ + switch (fptr->mode & FMODE_READWRITE) { + case FMODE_READABLE: + default: + return "r"; + case FMODE_WRITABLE: + return "w"; + case FMODE_READWRITE: + return "r+"; + } +} + +static VALUE +io_reopen(io, nfile) + VALUE io, nfile; +{ + OpenFile *fptr, *orig; + char *mode; + int fd, fd2; + off_t pos = 0; + + nfile = rb_io_get_io(nfile); + if (rb_safe_level() >= 4 && (!OBJ_TAINTED(io) || !OBJ_TAINTED(nfile))) { + rb_raise(rb_eSecurityError, "Insecure: can't reopen"); + } + GetOpenFile(io, fptr); + GetOpenFile(nfile, orig); + + if (fptr == orig) return io; + if (orig->mode & FMODE_READABLE) { + pos = io_tell(orig); + } + if (orig->f2) { + io_fflush(orig->f2, orig); + } + else if (orig->mode & FMODE_WRITABLE) { + io_fflush(orig->f, orig); + } + if (fptr->mode & FMODE_WRITABLE) { + io_fflush(GetWriteFile(fptr), fptr); + } + + /* copy OpenFile structure */ + fptr->mode = orig->mode; + fptr->pid = orig->pid; + fptr->lineno = orig->lineno; + if (fptr->path) free(fptr->path); + if (orig->path) fptr->path = strdup(orig->path); + else fptr->path = 0; + fptr->finalize = orig->finalize; + + mode = rb_io_mode_string(fptr); + fd = fileno(fptr->f); + fd2 = fileno(orig->f); + if (fd != fd2) { + if (fptr->f == stdin || fptr->f == stdout || fptr->f == stderr) { + clearerr(fptr->f); + /* need to keep stdio objects */ + if (dup2(fd2, fd) < 0) + rb_sys_fail(orig->path); + } + else { + FILE *f2 = fptr->f2; + int m = fptr->mode; + fclose(fptr->f); + fptr->f = f2; + fptr->f2 = NULL; + fptr->mode &= (m & FMODE_READABLE) ? ~FMODE_READABLE : ~FMODE_WRITABLE; + if (dup2(fd2, fd) < 0) + rb_sys_fail(orig->path); + if (f2) { + fptr->f = rb_fdopen(fd, "r"); + fptr->f2 = f2; + } + else { + fptr->f = rb_fdopen(fd, mode); + } + fptr->mode = m; + } + rb_thread_fd_close(fd); + if ((orig->mode & FMODE_READABLE) && pos >= 0) { + io_seek(fptr, pos, SEEK_SET); + io_seek(orig, pos, SEEK_SET); + } + } + + if (fptr->f2 && fd != fileno(fptr->f2)) { + fd = fileno(fptr->f2); + if (!orig->f2) { + fclose(fptr->f2); + rb_thread_fd_close(fd); + fptr->f2 = 0; + } + else if (fd != (fd2 = fileno(orig->f2))) { + fclose(fptr->f2); + rb_thread_fd_close(fd); + if (dup2(fd2, fd) < 0) + rb_sys_fail(orig->path); + fptr->f2 = rb_fdopen(fd, "w"); + } + } + + if (fptr->mode & FMODE_BINMODE) { + rb_io_binmode(io); + } + + RBASIC(io)->klass = RBASIC(nfile)->klass; + return io; +} + +/* + * call-seq: + * ios.reopen(other_IO) => ios + * ios.reopen(path, mode_str) => ios + * + * Reassociates <em>ios</em> with the I/O stream given in + * <i>other_IO</i> or to a new stream opened on <i>path</i>. This may + * dynamically change the actual class of this stream. + * + * f1 = File.new("testfile") + * f2 = File.new("testfile") + * f2.readlines[0] #=> "This is line one\n" + * f2.reopen(f1) #=> #<File:testfile> + * f2.readlines[0] #=> "This is line one\n" + */ + +static VALUE +rb_io_reopen(argc, argv, file) + int argc; + VALUE *argv; + VALUE file; +{ + VALUE fname, nmode; + char *mode; + OpenFile *fptr; + + rb_secure(4); + if (rb_scan_args(argc, argv, "11", &fname, &nmode) == 1) { + VALUE tmp = rb_io_check_io(fname); + if (!NIL_P(tmp)) { + return io_reopen(file, tmp); + } + } + + SafeStringValue(fname); + rb_io_taint_check(file); + fptr = RFILE(file)->fptr; + if (!fptr) { + fptr = RFILE(file)->fptr = ALLOC(OpenFile); + MEMZERO(fptr, OpenFile, 1); + } + + if (!NIL_P(nmode)) { + fptr->mode = rb_io_mode_flags(StringValueCStr(nmode)); + } + + if (fptr->path) { + free(fptr->path); + fptr->path = 0; + } + + fptr->path = strdup(StringValueCStr(fname)); + mode = rb_io_flags_mode(fptr->mode); + if (!fptr->f) { + fptr->f = rb_fopen(fptr->path, mode); + if (fptr->f2) { + fclose(fptr->f2); + fptr->f2 = 0; + } + return file; + } + + if (freopen(fptr->path, mode, fptr->f) == 0) { + rb_sys_fail(fptr->path); + } +#ifdef USE_SETVBUF + if (setvbuf(fptr->f, NULL, _IOFBF, 0) != 0) + rb_warn("setvbuf() can't be honoured for %s", fptr->path); +#endif + + if (fptr->f2) { + if (freopen(fptr->path, "w", fptr->f2) == 0) { + rb_sys_fail(fptr->path); + } + } + + return file; +} + +/* :nodoc: */ +static VALUE +rb_io_init_copy(dest, io) + VALUE dest, io; +{ + OpenFile *fptr, *orig; + int fd; + char *mode; + + io = rb_io_get_io(io); + if (dest == io) return dest; + GetOpenFile(io, orig); + MakeOpenFile(dest, fptr); + + if (orig->f2) { + io_fflush(orig->f2, orig); + fseeko(orig->f, 0L, SEEK_CUR); + } + else if (orig->mode & FMODE_WRITABLE) { + io_fflush(orig->f, orig); + } + else { + fseeko(orig->f, 0L, SEEK_CUR); + } + + /* copy OpenFile structure */ + fptr->mode = orig->mode; + fptr->pid = orig->pid; + fptr->lineno = orig->lineno; + if (orig->path) fptr->path = strdup(orig->path); + fptr->finalize = orig->finalize; + + switch (fptr->mode & FMODE_READWRITE) { + case FMODE_READABLE: + default: + mode = "r"; break; + case FMODE_WRITABLE: + mode = "w"; break; + case FMODE_READWRITE: + if (orig->f2) mode = "r"; + else mode = "r+"; + break; + } + fd = ruby_dup(fileno(orig->f)); + fptr->f = rb_fdopen(fd, mode); + fseeko(fptr->f, ftello(orig->f), SEEK_SET); + if (orig->f2) { + if (fileno(orig->f) != fileno(orig->f2)) { + fd = ruby_dup(fileno(orig->f2)); + } + fptr->f2 = rb_fdopen(fd, "w"); + fseeko(fptr->f2, ftello(orig->f2), SEEK_SET); + } + if (fptr->mode & FMODE_BINMODE) { + rb_io_binmode(dest); + } + + return dest; +} + +/* + * call-seq: + * ios.printf(format_string [, obj, ...] ) => nil + * + * Formats and writes to <em>ios</em>, converting parameters under + * control of the format string. See <code>Kernel#sprintf</code> + * for details. + */ + +VALUE +rb_io_printf(argc, argv, out) + int argc; + VALUE argv[]; + VALUE out; +{ + rb_io_write(out, rb_f_sprintf(argc, argv)); + return Qnil; +} + +/* + * call-seq: + * printf(io, string [, obj ... ] ) => nil + * printf(string [, obj ... ] ) => nil + * + * Equivalent to: + * io.write(sprintf(string, obj, ...) + * or + * $stdout.write(sprintf(string, obj, ...) + */ + +static VALUE +rb_f_printf(argc, argv) + int argc; + VALUE argv[]; +{ + VALUE out; + + if (argc == 0) return Qnil; + if (TYPE(argv[0]) == T_STRING) { + out = rb_stdout; + } + else { + out = argv[0]; + argv++; + argc--; + } + rb_io_write(out, rb_f_sprintf(argc, argv)); + + return Qnil; +} + +/* + * call-seq: + * ios.print() => nil + * ios.print(obj, ...) => nil + * + * Writes the given object(s) to <em>ios</em>. The stream must be + * opened for writing. If the output record separator (<code>$\\</code>) + * is not <code>nil</code>, it will be appended to the output. If no + * arguments are given, prints <code>$_</code>. Objects that aren't + * strings will be converted by calling their <code>to_s</code> method. + * With no argument, prints the contents of the variable <code>$_</code>. + * Returns <code>nil</code>. + * + * $stdout.print("This is ", 100, " percent.\n") + * + * <em>produces:</em> + * + * This is 100 percent. + */ + +VALUE +rb_io_print(argc, argv, out) + int argc; + VALUE *argv; + VALUE out; +{ + int i; + VALUE line; + + /* if no argument given, print `$_' */ + if (argc == 0) { + argc = 1; + line = rb_lastline_get(); + argv = &line; + } + for (i=0; i<argc; i++) { + if (!NIL_P(rb_output_fs) && i>0) { + rb_io_write(out, rb_output_fs); + } + switch (TYPE(argv[i])) { + case T_NIL: + rb_io_write(out, rb_str_new2("nil")); + break; + default: + rb_io_write(out, argv[i]); + break; + } + } + if (!NIL_P(rb_output_rs)) { + rb_io_write(out, rb_output_rs); + } + + return Qnil; +} + +/* + * call-seq: + * print(obj, ...) => nil + * + * Prints each object in turn to <code>$stdout</code>. If the output + * field separator (<code>$,</code>) is not +nil+, its + * contents will appear between each field. If the output record + * separator (<code>$\\</code>) is not +nil+, it will be + * appended to the output. If no arguments are given, prints + * <code>$_</code>. Objects that aren't strings will be converted by + * calling their <code>to_s</code> method. + * + * print "cat", [1,2,3], 99, "\n" + * $, = ", " + * $\ = "\n" + * print "cat", [1,2,3], 99 + * + * <em>produces:</em> + * + * cat12399 + * cat, 1, 2, 3, 99 + */ + +static VALUE +rb_f_print(argc, argv) + int argc; + VALUE *argv; +{ + rb_io_print(argc, argv, rb_stdout); + return Qnil; +} + +/* + * call-seq: + * ios.putc(obj) => obj + * + * If <i>obj</i> is <code>Numeric</code>, write the character whose + * code is <i>obj</i>, otherwise write the first character of the + * string representation of <i>obj</i> to <em>ios</em>. + * + * $stdout.putc "A" + * $stdout.putc 65 + * + * <em>produces:</em> + * + * AA + */ + +static VALUE +rb_io_putc(io, ch) + VALUE io, ch; +{ + char c = NUM2CHR(ch); + + rb_io_write(io, rb_str_new(&c, 1)); + return ch; +} + +/* + * call-seq: + * putc(int) => int + * + * Equivalent to: + * + * $stdout.putc(int) + */ + +static VALUE +rb_f_putc(recv, ch) + VALUE recv, ch; +{ + return rb_io_putc(rb_stdout, ch); +} + +static VALUE +io_puts_ary(ary, out) + VALUE ary, out; +{ + VALUE tmp; + long i; + + for (i=0; i<RARRAY(ary)->len; i++) { + tmp = RARRAY(ary)->ptr[i]; + if (rb_inspecting_p(tmp)) { + tmp = rb_str_new2("[...]"); + } + rb_io_puts(1, &tmp, out); + } + return Qnil; +} + +/* + * call-seq: + * ios.puts(obj, ...) => nil + * + * Writes the given objects to <em>ios</em> as with + * <code>IO#print</code>. Writes a record separator (typically a + * newline) after any that do not already end with a newline sequence. + * If called with an array argument, writes each element on a new line. + * If called without arguments, outputs a single record separator. + * + * $stdout.puts("this", "is", "a", "test") + * + * <em>produces:</em> + * + * this + * is + * a + * test + */ + +VALUE +rb_io_puts(argc, argv, out) + int argc; + VALUE *argv; + VALUE out; +{ + int i; + VALUE line; + + /* if no argument given, print newline. */ + if (argc == 0) { + rb_io_write(out, rb_default_rs); + return Qnil; + } + for (i=0; i<argc; i++) { + if (NIL_P(argv[i])) { + line = rb_str_new2("nil"); + } + else { + line = rb_check_array_type(argv[i]); + if (!NIL_P(line)) { + rb_protect_inspect(io_puts_ary, line, out); + continue; + } + line = rb_obj_as_string(argv[i]); + } + rb_io_write(out, line); + if (RSTRING(line)->len == 0 || + RSTRING(line)->ptr[RSTRING(line)->len-1] != '\n') { + rb_io_write(out, rb_default_rs); + } + } + + return Qnil; +} + +/* + * call-seq: + * puts(obj, ...) => nil + * + * Equivalent to + * + * $stdout.puts(obj, ...) + */ + +static VALUE +rb_f_puts(argc, argv) + int argc; + VALUE *argv; +{ + rb_io_puts(argc, argv, rb_stdout); + return Qnil; +} + +void +rb_p(obj) /* for debug print within C code */ + VALUE obj; +{ + rb_io_write(rb_stdout, rb_obj_as_string(rb_inspect(obj))); + rb_io_write(rb_stdout, rb_default_rs); +} + +/* + * call-seq: + * p(obj, ...) => nil + * + * For each object, directly writes + * _obj_.+inspect+ followed by the current output + * record separator to the program's standard output. + * + * S = Struct.new(:name, :state) + * s = S['dave', 'TX'] + * p s + * + * <em>produces:</em> + * + * #<S name="dave", state="TX"> + */ + +static VALUE +rb_f_p(argc, argv) + int argc; + VALUE *argv; +{ + int i; + + for (i=0; i<argc; i++) { + rb_p(argv[i]); + } + if (TYPE(rb_stdout) == T_FILE) { + rb_io_flush(rb_stdout); + } + return Qnil; +} + +/* + * call-seq: + * obj.display(port=$>) => nil + * + * Prints <i>obj</i> on the given port (default <code>$></code>). + * Equivalent to: + * + * def display(port=$>) + * port.write self + * end + * + * For example: + * + * 1.display + * "cat".display + * [ 4, 5, 6 ].display + * puts + * + * <em>produces:</em> + * + * 1cat456 + */ + +static VALUE +rb_obj_display(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + VALUE out; + + if (rb_scan_args(argc, argv, "01", &out) == 0) { + out = rb_stdout; + } + + rb_io_write(out, self); + + return Qnil; +} + +void +rb_write_error2(mesg, len) + const char *mesg; + long len; +{ + rb_io_write(rb_stderr, rb_str_new(mesg, len)); +} + +void +rb_write_error(mesg) + const char *mesg; +{ + rb_write_error2(mesg, strlen(mesg)); +} + +static void +must_respond_to(mid, val, id) + ID mid; + VALUE val; + ID id; +{ + if (!rb_respond_to(val, mid)) { + rb_raise(rb_eTypeError, "%s must have %s method, %s given", + rb_id2name(id), rb_id2name(mid), + rb_obj_classname(val)); + } +} + +static void +stdout_setter(val, id, variable) + VALUE val; + ID id; + VALUE *variable; +{ + must_respond_to(id_write, val, id); + *variable = val; +} + +static void +defout_setter(val, id, variable) + VALUE val; + ID id; + VALUE *variable; +{ + stdout_setter(val, id, variable); + rb_warn("$defout is obsolete; use $stdout instead"); +} + +static void +deferr_setter(val, id, variable) + VALUE val; + ID id; + VALUE *variable; +{ + stdout_setter(val, id, variable); + rb_warn("$deferr is obsolete; use $stderr instead"); +} + +static VALUE +prep_stdio(f, mode, klass) + FILE *f; + int mode; + VALUE klass; +{ + OpenFile *fp; + VALUE io = io_alloc(klass); + + MakeOpenFile(io, fp); +#ifdef __CYGWIN__ + if (!isatty(fileno(f))) { + mode |= O_BINARY; + setmode(fileno(f), O_BINARY); + } +#endif + fp->f = f; + fp->mode = mode; + + return io; +} + +static void +prep_path(io, path) + VALUE io; + char *path; +{ + OpenFile *fptr; + + GetOpenFile(io, fptr); + if (fptr->path) rb_bug("illegal prep_path() call"); + fptr->path = strdup(path); +} + +/* + * call-seq: + * IO.new(fd, mode) => io + * + * Returns a new <code>IO</code> object (a stream) for the given + * integer file descriptor and mode string. See also + * <code>IO#fileno</code> and <code>IO::for_fd</code>. + * + * a = IO.new(2,"w") # '2' is standard error + * $stderr.puts "Hello" + * a.puts "World" + * + * <em>produces:</em> + * + * Hello + * World + */ + +static VALUE +rb_io_initialize(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE fnum, mode; + OpenFile *fp; + int fd, flags; + + rb_secure(4); + rb_scan_args(argc, argv, "11", &fnum, &mode); + fd = NUM2INT(fnum); + if (argc == 2) { + if (FIXNUM_P(mode)) { + flags = FIX2LONG(mode); + } + else { + SafeStringValue(mode); + flags = rb_io_mode_modenum(StringValueCStr(mode)); + } + } + else { +#if defined(HAVE_FCNTL) && defined(F_GETFL) + flags = fcntl(fd, F_GETFL); + if (flags == -1) rb_sys_fail(0); +#else + flags = O_RDONLY; +#endif + } + MakeOpenFile(io, fp); + fp->mode = rb_io_modenum_flags(flags); + fp->f = rb_fdopen(fd, rb_io_modenum_mode(flags)); + + return io; +} + +/* + * call-seq: + * File.new(filename, mode="r") => file + * File.new(filename [, mode [, perm]]) => file + * + + * Opens the file named by _filename_ according to + * _mode_ (default is ``r'') and returns a new + * <code>File</code> object. See the description of class +IO+ for + * a description of _mode_. The file mode may optionally be + * specified as a +Fixnum+ by _or_-ing together the + * flags (O_RDONLY etc, again described under +IO+). Optional + * permission bits may be given in _perm_. These mode and permission + * bits are platform dependent; on Unix systems, see + * <code>open(2)</code> for details. + * + * f = File.new("testfile", "r") + * f = File.new("newfile", "w+") + * f = File.new("newfile", File::CREAT|File::TRUNC|File::RDWR, 0644) + */ + +static VALUE +rb_file_initialize(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + if (RFILE(io)->fptr) { + rb_raise(rb_eRuntimeError, "reinitializing File"); + } + if (0 < argc && argc < 3) { + VALUE fd = rb_check_convert_type(argv[0], T_FIXNUM, "Fixnum", "to_int"); + + if (!NIL_P(fd)) { + argv[0] = fd; + return rb_io_initialize(argc, argv, io); + } + } + rb_open_file(argc, argv, io); + + return io; +} + +/* + * call-seq: + * IO.new(fd, mode_string) => io + * + * Returns a new <code>IO</code> object (a stream) for the given + * integer file descriptor and mode string. See also + * <code>IO#fileno</code> and <code>IO::for_fd</code>. + * + * a = IO.new(2,"w") # '2' is standard error + * $stderr.puts "Hello" + * a.puts "World" + * + * <em>produces:</em> + * + * Hello + * World + */ + +static VALUE +rb_io_s_new(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + if (rb_block_given_p()) { + char *cname = rb_class2name(klass); + + rb_warn("%s::new() does not take block; use %s::open() instead", + cname, cname); + } + return rb_class_new_instance(argc, argv, klass); +} + +/* + * call-seq: + * IO.for_fd(fd, mode) => io + * + * Synonym for <code>IO::new</code>. + * + */ + +static VALUE +rb_io_s_for_fd(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + VALUE io = rb_obj_alloc(klass); + rb_io_initialize(argc, argv, io); + return io; +} + +static int binmode = 0; + +static VALUE +argf_forward(int argc, VALUE *argv) +{ + return rb_funcall3(current_file, ruby_frame->last_func, argc, argv); +} + +#define ARGF_FORWARD(argc, argv) do {\ + if (TYPE(current_file) != T_FILE)\ + return argf_forward(argc, argv);\ +} while (0) +#define NEXT_ARGF_FORWARD(argc, argv) do {\ + if (!next_argv()) return Qnil;\ + ARGF_FORWARD(argc, argv);\ +} while (0) + +static void +argf_close(file) + VALUE file; +{ + if (TYPE(file) == T_FILE) + rb_io_close(file); + else + rb_funcall3(file, rb_intern("close"), 0, 0); +} + +static int +next_argv() +{ + extern VALUE rb_argv; + char *fn; + OpenFile *fptr; + int stdout_binmode = 0; + + if (TYPE(rb_stdout) == T_FILE) { + GetOpenFile(rb_stdout, fptr); + if (fptr->mode & FMODE_BINMODE) + stdout_binmode = 1; + } + + if (init_p == 0) { + if (RARRAY(rb_argv)->len > 0) { + next_p = 1; + } + else { + next_p = -1; + } + init_p = 1; + gets_lineno = 0; + } + + if (next_p == 1) { + next_p = 0; + retry: + if (RARRAY(rb_argv)->len > 0) { + filename = rb_ary_shift(rb_argv); + fn = StringValueCStr(filename); + if (strlen(fn) == 1 && fn[0] == '-') { + current_file = rb_stdin; + if (ruby_inplace_mode) { + rb_warn("Can't do inplace edit for stdio; skipping"); + goto retry; + } + } + else { + FILE *fr = rb_fopen(fn, "r"); + + if (ruby_inplace_mode) { + struct stat st, st2; + VALUE str; + FILE *fw; + + if (TYPE(rb_stdout) == T_FILE && rb_stdout != orig_stdout) { + rb_io_close(rb_stdout); + } + fstat(fileno(fr), &st); + if (*ruby_inplace_mode) { + str = rb_str_new2(fn); +#ifdef NO_LONG_FNAME + ruby_add_suffix(str, ruby_inplace_mode); +#else + rb_str_cat2(str, ruby_inplace_mode); +#endif +#ifdef NO_SAFE_RENAME + (void)fclose(fr); + (void)unlink(RSTRING(str)->ptr); + (void)rename(fn, RSTRING(str)->ptr); + fr = rb_fopen(RSTRING(str)->ptr, "r"); +#else + if (rename(fn, RSTRING(str)->ptr) < 0) { + rb_warn("Can't rename %s to %s: %s, skipping file", + fn, RSTRING(str)->ptr, strerror(errno)); + fclose(fr); + goto retry; + } +#endif + } + else { +#ifdef NO_SAFE_RENAME + rb_fatal("Can't do inplace edit without backup"); +#else + if (unlink(fn) < 0) { + rb_warn("Can't remove %s: %s, skipping file", + fn, strerror(errno)); + fclose(fr); + goto retry; + } +#endif + } + fw = rb_fopen(fn, "w"); +#ifndef NO_SAFE_RENAME + fstat(fileno(fw), &st2); +#ifdef HAVE_FCHMOD + fchmod(fileno(fw), st.st_mode); +#else + chmod(fn, st.st_mode); +#endif + if (st.st_uid!=st2.st_uid || st.st_gid!=st2.st_gid) { + fchown(fileno(fw), st.st_uid, st.st_gid); + } +#endif + rb_stdout = prep_stdio(fw, FMODE_WRITABLE, rb_cFile); + prep_path(rb_stdout, fn); + if (stdout_binmode) rb_io_binmode(rb_stdout); + } + current_file = prep_stdio(fr, FMODE_READABLE, rb_cFile); + prep_path(current_file, fn); + } + if (binmode) rb_io_binmode(current_file); + } + else { + next_p = 1; + return Qfalse; + } + } + else if (next_p == -1) { + current_file = rb_stdin; + filename = rb_str_new2("-"); + if (ruby_inplace_mode) { + rb_warn("Can't do inplace edit for stdio"); + rb_stdout = orig_stdout; + } + } + return Qtrue; +} + +static VALUE +argf_getline(argc, argv) + int argc; + VALUE *argv; +{ + VALUE line; + + retry: + if (!next_argv()) return Qnil; + if (argc == 0 && rb_rs == rb_default_rs) { + line = rb_io_gets(current_file); + } + else { + VALUE rs; + + if (argc == 0) { + rs = rb_rs; + } + else { + rb_scan_args(argc, argv, "1", &rs); + if (!NIL_P(rs)) StringValue(rs); + } + line = rb_io_getline(rs, current_file); + } + if (NIL_P(line) && next_p != -1) { + argf_close(current_file); + next_p = 1; + goto retry; + } + if (!NIL_P(line)) { + gets_lineno++; + lineno = INT2FIX(gets_lineno); + } + return line; +} + +/* + * call-seq: + * gets(separator=$/) => string or nil + * + * Returns (and assigns to <code>$_</code>) the next line from the list + * of files in +ARGV+ (or <code>$*</code>), or from standard + * input if no files are present on the command line. Returns + * +nil+ at end of file. The optional argument specifies the + * record separator. The separator is included with the contents of + * each record. A separator of +nil+ reads the entire + * contents, and a zero-length separator reads the input one paragraph + * at a time, where paragraphs are divided by two consecutive newlines. + * If multiple filenames are present in +ARGV+, + * +gets(nil)+ will read the contents one file at a time. + * + * ARGV << "testfile" + * print while gets + * + * <em>produces:</em> + * + * This is line one + * This is line two + * This is line three + * And so on... + * + * The style of programming using <code>$_</code> as an implicit + * parameter is gradually losing favor in the Ruby community. + */ + +static VALUE +rb_f_gets(argc, argv) + int argc; + VALUE *argv; +{ + VALUE line; + + if (!next_argv()) return Qnil; + if (TYPE(current_file) != T_FILE) { + line = rb_funcall3(current_file, rb_intern("gets"), argc, argv); + } + else { + line = argf_getline(argc, argv); + } + rb_lastline_set(line); + return line; +} + +VALUE +rb_gets() +{ + VALUE line; + + if (rb_rs != rb_default_rs) { + return rb_f_gets(0, 0); + } + + retry: + if (!next_argv()) return Qnil; + line = rb_io_gets(current_file); + if (NIL_P(line) && next_p != -1) { + argf_close(current_file); + next_p = 1; + goto retry; + } + rb_lastline_set(line); + if (!NIL_P(line)) { + gets_lineno++; + lineno = INT2FIX(gets_lineno); + } + + return line; +} + +/* + * call-seq: + * readline(separator=$/) => string + * + * Equivalent to <code>Kernel::gets</code>, except + * +readline+ raises +EOFError+ at end of file. + */ + +static VALUE +rb_f_readline(argc, argv) + int argc; + VALUE *argv; +{ + VALUE line; + + if (!next_argv()) rb_eof_error(); + ARGF_FORWARD(argc, argv); + line = rb_f_gets(argc, argv); + if (NIL_P(line)) { + rb_eof_error(); + } + + return line; +} + +/* + * obsolete + */ + +static VALUE +rb_f_getc() +{ + rb_warn("getc is obsolete; use STDIN.getc instead"); + if (TYPE(rb_stdin) != T_FILE) { + return rb_funcall3(rb_stdin, rb_intern("getc"), 0, 0); + } + return rb_io_getc(rb_stdin); +} + +/* + * call-seq: + * readlines(separator=$/) => array + * + * Returns an array containing the lines returned by calling + * <code>Kernel.gets(<i>separator</i>)</code> until the end of file. + */ + +static VALUE +rb_f_readlines(argc, argv) + int argc; + VALUE *argv; +{ + VALUE line, ary; + + NEXT_ARGF_FORWARD(argc, argv); + ary = rb_ary_new(); + while (!NIL_P(line = argf_getline(argc, argv))) { + rb_ary_push(ary, line); + } + + return ary; +} + +/* + * call-seq: + * `cmd` => string + * + * Returns the standard output of running _cmd_ in a subshell. + * The built-in syntax <code>%x{...}</code> uses + * this method. Sets <code>$?</code> to the process status. + * + * `date` #=> "Wed Apr 9 08:56:30 CDT 2003\n" + * `ls testdir`.split[1] #=> "main.rb" + * `echo oops && exit 99` #=> "oops\n" + * $?.exitstatus #=> 99 + */ + +static VALUE +rb_f_backquote(obj, str) + VALUE obj, str; +{ + volatile VALUE port; + VALUE result; + OpenFile *fptr; + + SafeStringValue(str); + port = pipe_open(str, 0, "r"); + if (NIL_P(port)) return rb_str_new(0,0); + + GetOpenFile(port, fptr); + result = read_all(fptr, remain_size(fptr), Qnil); + rb_io_close(port); + + return result; +} + +#ifdef HAVE_SYS_SELECT_H +#include <sys/select.h> +#endif + +/* + * call-seq: + * IO.select(read_array + * [, write_array + * [, error_array + * [, timeout]]] ) => array or nil + * + * See <code>Kernel#select</code>. + */ + +static VALUE +rb_f_select(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE read, write, except, timeout, res, list; + fd_set rset, wset, eset, pset; + fd_set *rp, *wp, *ep; + struct timeval *tp, timerec; + OpenFile *fptr; + long i; + int max = 0, n; + int interrupt_flag = 0; + int pending = 0; + + rb_scan_args(argc, argv, "13", &read, &write, &except, &timeout); + if (NIL_P(timeout)) { + tp = 0; + } + else { + timerec = rb_time_interval(timeout); + tp = &timerec; + } + + FD_ZERO(&pset); + if (!NIL_P(read)) { + Check_Type(read, T_ARRAY); + rp = &rset; + FD_ZERO(rp); + for (i=0; i<RARRAY(read)->len; i++) { + GetOpenFile(rb_io_get_io(RARRAY(read)->ptr[i]), fptr); + FD_SET(fileno(fptr->f), rp); + if (READ_DATA_PENDING(fptr->f)) { /* check for buffered data */ + pending++; + FD_SET(fileno(fptr->f), &pset); + } + if (max < fileno(fptr->f)) max = fileno(fptr->f); + } + if (pending) { /* no blocking if there's buffered data */ + timerec.tv_sec = timerec.tv_usec = 0; + tp = &timerec; + } + } + else + rp = 0; + + if (!NIL_P(write)) { + Check_Type(write, T_ARRAY); + wp = &wset; + FD_ZERO(wp); + for (i=0; i<RARRAY(write)->len; i++) { + GetOpenFile(rb_io_get_io(RARRAY(write)->ptr[i]), fptr); + FD_SET(fileno(fptr->f), wp); + if (max < fileno(fptr->f)) max = fileno(fptr->f); + if (fptr->f2) { + FD_SET(fileno(fptr->f2), wp); + if (max < fileno(fptr->f2)) max = fileno(fptr->f2); + } + } + } + else + wp = 0; + + if (!NIL_P(except)) { + Check_Type(except, T_ARRAY); + ep = &eset; + FD_ZERO(ep); + for (i=0; i<RARRAY(except)->len; i++) { + GetOpenFile(rb_io_get_io(RARRAY(except)->ptr[i]), fptr); + FD_SET(fileno(fptr->f), ep); + if (max < fileno(fptr->f)) max = fileno(fptr->f); + if (fptr->f2) { + FD_SET(fileno(fptr->f2), ep); + if (max < fileno(fptr->f2)) max = fileno(fptr->f2); + } + } + } + else { + ep = 0; + } + + max++; + + n = rb_thread_select(max, rp, wp, ep, tp); + if (n < 0) { + rb_sys_fail(0); + } + if (!pending && n == 0) return Qnil; /* returns nil on timeout */ + + res = rb_ary_new2(3); + rb_ary_push(res, rp?rb_ary_new():rb_ary_new2(0)); + rb_ary_push(res, wp?rb_ary_new():rb_ary_new2(0)); + rb_ary_push(res, ep?rb_ary_new():rb_ary_new2(0)); + + if (interrupt_flag == 0) { + if (rp) { + list = RARRAY(res)->ptr[0]; + for (i=0; i< RARRAY(read)->len; i++) { + GetOpenFile(rb_io_get_io(RARRAY(read)->ptr[i]), fptr); + if (FD_ISSET(fileno(fptr->f), rp) + || FD_ISSET(fileno(fptr->f), &pset)) { + rb_ary_push(list, rb_ary_entry(read, i)); + } + } + } + + if (wp) { + list = RARRAY(res)->ptr[1]; + for (i=0; i< RARRAY(write)->len; i++) { + GetOpenFile(rb_io_get_io(RARRAY(write)->ptr[i]), fptr); + if (FD_ISSET(fileno(fptr->f), wp)) { + rb_ary_push(list, rb_ary_entry(write, i)); + } + else if (fptr->f2 && FD_ISSET(fileno(fptr->f2), wp)) { + rb_ary_push(list, rb_ary_entry(write, i)); + } + } + } + + if (ep) { + list = RARRAY(res)->ptr[2]; + for (i=0; i< RARRAY(except)->len; i++) { + GetOpenFile(rb_io_get_io(RARRAY(except)->ptr[i]), fptr); + if (FD_ISSET(fileno(fptr->f), ep)) { + rb_ary_push(list, rb_ary_entry(except, i)); + } + else if (fptr->f2 && FD_ISSET(fileno(fptr->f2), ep)) { + rb_ary_push(list, rb_ary_entry(except, i)); + } + } + } + } + + return res; /* returns an empty array on interrupt */ +} + +#if !defined(MSDOS) && !defined(__human68k__) +static int +io_cntl(fd, cmd, narg, io_p) + int fd, cmd, io_p; + long narg; +{ + int retval; + +#ifdef HAVE_FCNTL + TRAP_BEG; +# if defined(__CYGWIN__) + retval = io_p?ioctl(fd, cmd, (void*)narg):fcntl(fd, cmd, narg); +# else + retval = io_p?ioctl(fd, cmd, narg):fcntl(fd, cmd, narg); +# endif + TRAP_END; +#else + if (!io_p) { + rb_notimplement(); + } + TRAP_BEG; + retval = ioctl(fd, cmd, narg); + TRAP_END; +#endif + return retval; +} +#endif + +static VALUE +rb_io_ctl(io, req, arg, io_p) + VALUE io, req, arg; + int io_p; +{ +#if !defined(MSDOS) && !defined(__human68k__) + int cmd = NUM2ULONG(req); + OpenFile *fptr; + long len = 0; + long narg = 0; + int retval; + + rb_secure(2); + + if (NIL_P(arg) || arg == Qfalse) { + narg = 0; + } + else if (FIXNUM_P(arg)) { + narg = FIX2LONG(arg); + } + else if (arg == Qtrue) { + narg = 1; + } + else { + VALUE tmp = rb_check_string_type(arg); + + if (NIL_P(tmp)) { + narg = NUM2LONG(arg); + } + else { + arg = tmp; +#ifdef IOCPARM_MASK +#ifndef IOCPARM_LEN +#define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK) +#endif +#endif +#ifdef IOCPARM_LEN + len = IOCPARM_LEN(cmd); /* on BSDish systems we're safe */ +#else + len = 256; /* otherwise guess at what's safe */ +#endif + rb_str_modify(arg); + + if (len <= RSTRING(arg)->len) { + len = RSTRING(arg)->len; + } + if (RSTRING(arg)->len < len) { + rb_str_resize(arg, len+1); + } + RSTRING(arg)->ptr[len] = 17; /* a little sanity check here */ + narg = (long)RSTRING(arg)->ptr; + } + } + GetOpenFile(io, fptr); + retval = io_cntl(fileno(fptr->f), cmd, narg, io_p); + if (retval < 0) rb_sys_fail(fptr->path); + if (TYPE(arg) == T_STRING && RSTRING(arg)->ptr[len] != 17) { + rb_raise(rb_eArgError, "return value overflowed string"); + } + + if (fptr->f2 && fileno(fptr->f) != fileno(fptr->f2)) { + /* call on f2 too; ignore result */ + io_cntl(fileno(fptr->f2), cmd, narg, io_p); + } + + if (!io_p && cmd == F_SETFL) { + if (narg & O_NONBLOCK) { + fptr->mode |= FMODE_WSPLIT_INITIALIZED; + fptr->mode &= ~FMODE_WSPLIT; + } + else { + fptr->mode &= ~(FMODE_WSPLIT_INITIALIZED|FMODE_WSPLIT); + } + } + + return INT2NUM(retval); +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + +/* + * call-seq: + * ios.ioctl(integer_cmd, arg) => integer + * + * Provides a mechanism for issuing low-level commands to control or + * query I/O devices. Arguments and results are platform dependent. If + * <i>arg</i> is a number, its value is passed directly. If it is a + * string, it is interpreted as a binary sequence of bytes. On Unix + * platforms, see <code>ioctl(2)</code> for details. Not implemented on + * all platforms. + */ + +static VALUE +rb_io_ioctl(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE req, arg; + + rb_scan_args(argc, argv, "11", &req, &arg); + return rb_io_ctl(io, req, arg, 1); +} + +/* + * call-seq: + * ios.fcntl(integer_cmd, arg) => integer + * + * Provides a mechanism for issuing low-level commands to control or + * query file-oriented I/O streams. Arguments and results are platform + * dependent. If <i>arg</i> is a number, its value is passed + * directly. If it is a string, it is interpreted as a binary sequence + * of bytes (<code>Array#pack</code> might be a useful way to build this + * string). On Unix platforms, see <code>fcntl(2)</code> for details. + * Not implemented on all platforms. + */ + +static VALUE +rb_io_fcntl(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ +#ifdef HAVE_FCNTL + VALUE req, arg; + + rb_scan_args(argc, argv, "11", &req, &arg); + return rb_io_ctl(io, req, arg, 0); +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + +/* + * call-seq: + * syscall(fixnum [, args...]) => integer + * + * Calls the operating system function identified by _fixnum_, + * passing in the arguments, which must be either +String+ + * objects, or +Integer+ objects that ultimately fit within + * a native +long+. Up to nine parameters may be passed (14 + * on the Atari-ST). The function identified by _fixnum_ is system + * dependent. On some Unix systems, the numbers may be obtained from a + * header file called <code>syscall.h</code>. + * + * syscall 4, 1, "hello\n", 6 # '4' is write(2) on our box + * + * <em>produces:</em> + * + * hello + */ + +static VALUE +rb_f_syscall(argc, argv) + int argc; + VALUE *argv; +{ +#if defined(HAVE_SYSCALL) && !defined(__CHECKER__) +#ifdef atarist + unsigned long arg[14]; /* yes, we really need that many ! */ +#else + unsigned long arg[8]; +#endif + int retval = -1; + int i = 1; + int items = argc - 1; + + /* This probably won't work on machines where sizeof(long) != sizeof(int) + * or where sizeof(long) != sizeof(char*). But such machines will + * not likely have syscall implemented either, so who cares? + */ + + rb_secure(2); + if (argc == 0) + rb_raise(rb_eArgError, "too few arguments for syscall"); + if (argc > sizeof(arg) / sizeof(arg[0])) + rb_raise(rb_eArgError, "too many arguments for syscall"); + arg[0] = NUM2LONG(argv[0]); argv++; + while (items--) { + VALUE v = rb_check_string_type(*argv); + + if (!NIL_P(v)) { + StringValue(v); + rb_str_modify(v); + arg[i] = (unsigned long)StringValueCStr(v); + } + else { + arg[i] = (unsigned long)NUM2LONG(*argv); + } + argv++; + i++; + } + TRAP_BEG; + switch (argc) { + case 1: + retval = syscall(arg[0]); + break; + case 2: + retval = syscall(arg[0],arg[1]); + break; + case 3: + retval = syscall(arg[0],arg[1],arg[2]); + break; + case 4: + retval = syscall(arg[0],arg[1],arg[2],arg[3]); + break; + case 5: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4]); + break; + case 6: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5]); + break; + case 7: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6]); + break; + case 8: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6], + arg[7]); + break; +#ifdef atarist + case 9: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6], + arg[7], arg[8]); + break; + case 10: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6], + arg[7], arg[8], arg[9]); + break; + case 11: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6], + arg[7], arg[8], arg[9], arg[10]); + break; + case 12: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6], + arg[7], arg[8], arg[9], arg[10], arg[11]); + break; + case 13: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6], + arg[7], arg[8], arg[9], arg[10], arg[11], arg[12]); + break; + case 14: + retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6], + arg[7], arg[8], arg[9], arg[10], arg[11], arg[12], arg[13]); + break; +#endif /* atarist */ + } + TRAP_END; + if (retval < 0) rb_sys_fail(0); + return INT2NUM(retval); +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + +static VALUE io_new_instance _((VALUE)); +static VALUE +io_new_instance(args) + VALUE args; +{ + return rb_class_new_instance(2, (VALUE*)args+1, *(VALUE*)args); +} + +/* + * call-seq: + * IO.pipe -> array + * + * Creates a pair of pipe endpoints (connected to each other) and + * returns them as a two-element array of <code>IO</code> objects: + * <code>[</code> <i>read_file</i>, <i>write_file</i> <code>]</code>. Not + * available on all platforms. + * + * In the example below, the two processes close the ends of the pipe + * that they are not using. This is not just a cosmetic nicety. The + * read end of a pipe will not generate an end of file condition if + * there are any writers with the pipe still open. In the case of the + * parent process, the <code>rd.read</code> will never return if it + * does not first issue a <code>wr.close</code>. + * + * rd, wr = IO.pipe + * + * if fork + * wr.close + * puts "Parent got: <#{rd.read}>" + * rd.close + * Process.wait + * else + * rd.close + * puts "Sending message to parent" + * wr.write "Hi Dad" + * wr.close + * end + * + * <em>produces:</em> + * + * Sending message to parent + * Parent got: <Hi Dad> + */ + +static VALUE +rb_io_s_pipe(klass) + VALUE klass; +{ +#ifndef __human68k__ + int pipes[2], state; + VALUE r, w, args[3]; + +#ifdef _WIN32 + if (_pipe(pipes, 1024, O_BINARY) == -1) +#else + if (pipe(pipes) == -1) +#endif + rb_sys_fail(0); + + args[0] = klass; + args[1] = INT2NUM(pipes[0]); + args[2] = INT2FIX(O_RDONLY); + r = rb_protect(io_new_instance, (VALUE)args, &state); + if (state) { + close(pipes[0]); + close(pipes[1]); + rb_jump_tag(state); + } + args[1] = INT2NUM(pipes[1]); + args[2] = INT2FIX(O_WRONLY); + w = rb_protect(io_new_instance, (VALUE)args, &state); + if (state) { + close(pipes[1]); + if (!NIL_P(r)) rb_io_close(r); + rb_jump_tag(state); + } + rb_io_synchronized(RFILE(w)->fptr); + + return rb_assoc_new(r, w); +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + +struct foreach_arg { + int argc; + VALUE sep; + VALUE io; +}; + +static VALUE +io_s_foreach(arg) + struct foreach_arg *arg; +{ + VALUE str; + + while (!NIL_P(str = rb_io_getline(arg->sep, arg->io))) { + rb_yield(str); + } + return Qnil; +} + +/* + * call-seq: + * IO.foreach(name, sep_string=$/) {|line| block } => nil + * + * Executes the block for every line in the named I/O port, where lines + * are separated by <em>sep_string</em>. + * + * IO.foreach("testfile") {|x| print "GOT ", x } + * + * <em>produces:</em> + * + * GOT This is line one + * GOT This is line two + * GOT This is line three + * GOT And so on... + */ + +static VALUE +rb_io_s_foreach(argc, argv) + int argc; + VALUE *argv; +{ + VALUE fname; + struct foreach_arg arg; + + rb_scan_args(argc, argv, "11", &fname, &arg.sep); + SafeStringValue(fname); + + if (argc == 1) { + arg.sep = rb_default_rs; + } + else if (!NIL_P(arg.sep)) { + StringValue(arg.sep); + } + arg.io = rb_io_open(StringValueCStr(fname), "r"); + if (NIL_P(arg.io)) return Qnil; + + return rb_ensure(io_s_foreach, (VALUE)&arg, rb_io_close, arg.io); +} + +static VALUE +io_s_readlines(arg) + struct foreach_arg *arg; +{ + return rb_io_readlines(arg->argc, &arg->sep, arg->io); +} + +/* + * call-seq: + * IO.readlines(name, sep_string=$/) => array + * + * Reads the entire file specified by <i>name</i> as individual + * lines, and returns those lines in an array. Lines are separated by + * <i>sep_string</i>. + * + * a = IO.readlines("testfile") + * a[0] #=> "This is line one\n" + * + */ + +static VALUE +rb_io_s_readlines(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE fname; + struct foreach_arg arg; + + rb_scan_args(argc, argv, "11", &fname, &arg.sep); + SafeStringValue(fname); + + arg.argc = argc - 1; + arg.io = rb_io_open(StringValueCStr(fname), "r"); + if (NIL_P(arg.io)) return Qnil; + return rb_ensure(io_s_readlines, (VALUE)&arg, rb_io_close, arg.io); +} + +static VALUE +io_s_read(arg) + struct foreach_arg *arg; +{ + return io_read(arg->argc, &arg->sep, arg->io); +} + +/* + * call-seq: + * IO.read(name, [length [, offset]] ) => string + * + * Opens the file, optionally seeks to the given offset, then returns + * <i>length</i> bytes (defaulting to the rest of the file). + * <code>read</code> ensures the file is closed before returning. + * + * IO.read("testfile") #=> "This is line one\nThis is line two\nThis is line three\nAnd so on...\n" + * IO.read("testfile", 20) #=> "This is line one\nThi" + * IO.read("testfile", 20, 10) #=> "ne one\nThis is line " + */ + +static VALUE +rb_io_s_read(argc, argv, io) + int argc; + VALUE *argv; + VALUE io; +{ + VALUE fname, offset; + struct foreach_arg arg; + + rb_scan_args(argc, argv, "12", &fname, &arg.sep, &offset); + SafeStringValue(fname); + + arg.argc = argc ? 1 : 0; + arg.io = rb_io_open(StringValueCStr(fname), "r"); + if (NIL_P(arg.io)) return Qnil; + if (!NIL_P(offset)) { + rb_io_seek(arg.io, offset, SEEK_SET); + } + return rb_ensure(io_s_read, (VALUE)&arg, rb_io_close, arg.io); +} + +static VALUE +argf_tell() +{ + if (!next_argv()) { + rb_raise(rb_eArgError, "no stream to tell"); + } + ARGF_FORWARD(0, 0); + return rb_io_tell(current_file); +} + +static VALUE +argf_seek_m(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + if (!next_argv()) { + rb_raise(rb_eArgError, "no stream to seek"); + } + ARGF_FORWARD(argc, argv); + return rb_io_seek_m(argc, argv, current_file); +} + +static VALUE +argf_set_pos(self, offset) + VALUE self, offset; +{ + if (!next_argv()) { + rb_raise(rb_eArgError, "no stream to set position"); + } + ARGF_FORWARD(1, &offset); + return rb_io_set_pos(current_file, offset); +} + +static VALUE +argf_rewind() +{ + if (!next_argv()) { + rb_raise(rb_eArgError, "no stream to rewind"); + } + ARGF_FORWARD(0, 0); + return rb_io_rewind(current_file); +} + +static VALUE +argf_fileno() +{ + if (!next_argv()) { + rb_raise(rb_eArgError, "no stream"); + } + ARGF_FORWARD(0, 0); + return rb_io_fileno(current_file); +} + +static VALUE +argf_to_io() +{ + next_argv(); + ARGF_FORWARD(0, 0); + return current_file; +} + +static VALUE +argf_eof() +{ + if (current_file) { + if (init_p == 0) return Qtrue; + ARGF_FORWARD(0, 0); + if (rb_io_eof(current_file)) { + return Qtrue; + } + } + return Qfalse; +} + +static VALUE +argf_read(argc, argv) + int argc; + VALUE *argv; +{ + VALUE tmp, str, length; + long len = 0; + + rb_scan_args(argc, argv, "02", &length, &str); + if (!NIL_P(length)) { + len = NUM2LONG(argv[0]); + } + if (!NIL_P(str)) { + StringValue(str); + rb_str_resize(str,0); + argv[1] = Qnil; + } + + retry: + if (!next_argv()) { + return str; + } + if (TYPE(current_file) != T_FILE) { + tmp = argf_forward(argc, argv); + } + else { + tmp = io_read(argc, argv, current_file); + } + if (NIL_P(str)) str = tmp; + else if (!NIL_P(tmp)) rb_str_append(str, tmp); + if (NIL_P(tmp) || NIL_P(length)) { + if (next_p != -1) { + argf_close(current_file); + next_p = 1; + goto retry; + } + } + else if (argc >= 1) { + if (RSTRING(str)->len < len) { + len -= RSTRING(str)->len; + argv[0] = INT2NUM(len); + goto retry; + } + } + return str; +} + +static VALUE +argf_getc() +{ + VALUE byte; + + retry: + if (!next_argv()) return Qnil; + if (TYPE(current_file) != T_FILE) { + byte = rb_funcall3(current_file, rb_intern("getc"), 0, 0); + } + else { + byte = rb_io_getc(current_file); + } + if (NIL_P(byte) && next_p != -1) { + argf_close(current_file); + next_p = 1; + goto retry; + } + + return byte; +} + +static VALUE +argf_readchar() +{ + VALUE c; + + NEXT_ARGF_FORWARD(0, 0); + c = argf_getc(); + if (NIL_P(c)) { + rb_eof_error(); + } + return c; +} + +static VALUE +argf_each_line(argc, argv) + int argc; + VALUE *argv; +{ + VALUE str; + + if (!next_argv()) return Qnil; + if (TYPE(current_file) != T_FILE) { + for (;;) { + if (!next_argv()) return argf; + rb_iterate(rb_each, current_file, rb_yield, 0); + next_p = 1; + } + } + while (!NIL_P(str = argf_getline(argc, argv))) { + rb_yield(str); + } + return argf; +} + +static VALUE +argf_each_byte() +{ + VALUE byte; + + while (!NIL_P(byte = argf_getc())) { + rb_yield(byte); + } + return argf; +} + +static VALUE +argf_filename() +{ + next_argv(); + return filename; +} + +static VALUE +argf_file() +{ + next_argv(); + return current_file; +} + +static VALUE +argf_binmode() +{ + binmode = 1; + next_argv(); + ARGF_FORWARD(0, 0); + rb_io_binmode(current_file); + return argf; +} + +static VALUE +argf_skip() +{ + if (next_p != -1) { + argf_close(current_file); + next_p = 1; + } + return argf; +} + +static VALUE +argf_close_m() +{ + next_argv(); + argf_close(current_file); + if (next_p != -1) { + next_p = 1; + } + gets_lineno = 0; + return argf; +} + +static VALUE +argf_closed() +{ + next_argv(); + ARGF_FORWARD(0, 0); + return rb_io_closed(current_file); +} + +static VALUE +argf_to_s() +{ + return rb_str_new2("ARGF"); +} + +static VALUE +opt_i_get() +{ + if (!ruby_inplace_mode) return Qnil; + return rb_str_new2(ruby_inplace_mode); +} + +static void +opt_i_set(val) + VALUE val; +{ + if (!RTEST(val)) { + if (ruby_inplace_mode) free(ruby_inplace_mode); + ruby_inplace_mode = 0; + return; + } + StringValue(val); + if (ruby_inplace_mode) free(ruby_inplace_mode); + ruby_inplace_mode = 0; + ruby_inplace_mode = strdup(StringValueCStr(val)); +} + +/* + * Class <code>IO</code> is the basis for all input and output in Ruby. + * An I/O stream may be <em>duplexed</em> (that is, bidirectional), and + * so may use more than one native operating system stream. + * + * Many of the examples in this section use class <code>File</code>, + * the only standard subclass of <code>IO</code>. The two classes are + * closely associated. + * + * As used in this section, <em>portname</em> may take any of the + * following forms. + * + * * A plain string represents a filename suitable for the underlying + * operating system. + * + * * A string starting with ``<code>|</code>'' indicates a subprocess. + * The remainder of the string following the ``<code>|</code>'' is + * invoked as a process with appropriate input/output channels + * connected to it. + * + * * A string equal to ``<code>|-</code>'' will create another Ruby + * instance as a subprocess. + * + * Ruby will convert pathnames between different operating system + * conventions if possible. For instance, on a Windows system the + * filename ``<code>/gumby/ruby/test.rb</code>'' will be opened as + * ``<code>\gumby\ruby\test.rb</code>''. When specifying a + * Windows-style filename in a Ruby string, remember to escape the + * backslashes: + * + * "c:\\gumby\\ruby\\test.rb" + * + * Our examples here will use the Unix-style forward slashes; + * <code>File::SEPARATOR</code> can be used to get the + * platform-specific separator character. + * + * I/O ports may be opened in any one of several different modes, which + * are shown in this section as <em>mode</em>. The mode may + * either be a Fixnum or a String. If numeric, it should be + * one of the operating system specific constants (O_RDONLY, + * O_WRONLY, O_RDWR, O_APPEND and so on). See man open(2) for + * more information. + * + * If the mode is given as a String, it must be one of the + * values listed in the following table. + * + * Mode | Meaning + * -----+-------------------------------------------------------- + * "r" | Read-only, starts at beginning of file (default mode). + * -----+-------------------------------------------------------- + * "r+" | Read-write, starts at beginning of file. + * -----+-------------------------------------------------------- + * "w" | Write-only, truncates existing file + * | to zero length or creates a new file for writing. + * -----+-------------------------------------------------------- + * "w+" | Read-write, truncates existing file to zero length + * | or creates a new file for reading and writing. + * -----+-------------------------------------------------------- + * "a" | Write-only, starts at end of file if file exists, + * | otherwise creates a new file for writing. + * -----+-------------------------------------------------------- + * "a+" | Read-write, starts at end of file if file exists, + * | otherwise creates a new file for reading and + * | writing. + * -----+-------------------------------------------------------- + * "b" | (DOS/Windows only) Binary file mode (may appear with + * | any of the key letters listed above). + * + * + * The global constant ARGF (also accessible as $<) provides an + * IO-like stream which allows access to all files mentioned on the + * command line (or STDIN if no files are mentioned). ARGF provides + * the methods <code>#path</code> and <code>#filename</code> to access + * the name of the file currently being read. + */ + +void +Init_IO() +{ +#ifdef __CYGWIN__ +#include <sys/cygwin.h> + static struct __cygwin_perfile pf[] = + { + {"", O_RDONLY | O_BINARY}, + {"", O_WRONLY | O_BINARY}, + {"", O_RDWR | O_BINARY}, + {"", O_APPEND | O_BINARY}, + {NULL, 0} + }; + cygwin_internal(CW_PERFILE, pf); +#endif + + rb_eIOError = rb_define_class("IOError", rb_eStandardError); + rb_eEOFError = rb_define_class("EOFError", rb_eIOError); + + id_write = rb_intern("write"); + id_read = rb_intern("read"); + id_getc = rb_intern("getc"); + + rb_define_global_function("syscall", rb_f_syscall, -1); + + rb_define_global_function("open", rb_f_open, -1); + rb_define_global_function("printf", rb_f_printf, -1); + rb_define_global_function("print", rb_f_print, -1); + rb_define_global_function("putc", rb_f_putc, 1); + rb_define_global_function("puts", rb_f_puts, -1); + rb_define_global_function("gets", rb_f_gets, -1); + rb_define_global_function("readline", rb_f_readline, -1); + rb_define_global_function("getc", rb_f_getc, 0); + rb_define_global_function("select", rb_f_select, -1); + + rb_define_global_function("readlines", rb_f_readlines, -1); + + rb_define_global_function("`", rb_f_backquote, 1); + + rb_define_global_function("p", rb_f_p, -1); + rb_define_method(rb_mKernel, "display", rb_obj_display, -1); + + rb_cIO = rb_define_class("IO", rb_cObject); + rb_include_module(rb_cIO, rb_mEnumerable); + + rb_define_alloc_func(rb_cIO, io_alloc); + rb_define_singleton_method(rb_cIO, "new", rb_io_s_new, -1); + rb_define_singleton_method(rb_cIO, "open", rb_io_s_open, -1); + rb_define_singleton_method(rb_cIO, "sysopen", rb_io_s_sysopen, -1); + rb_define_singleton_method(rb_cIO, "for_fd", rb_io_s_for_fd, -1); + rb_define_singleton_method(rb_cIO, "popen", rb_io_s_popen, -1); + rb_define_singleton_method(rb_cIO, "foreach", rb_io_s_foreach, -1); + rb_define_singleton_method(rb_cIO, "readlines", rb_io_s_readlines, -1); + rb_define_singleton_method(rb_cIO, "read", rb_io_s_read, -1); + rb_define_singleton_method(rb_cIO, "select", rb_f_select, -1); + rb_define_singleton_method(rb_cIO, "pipe", rb_io_s_pipe, 0); + + rb_define_method(rb_cIO, "initialize", rb_io_initialize, -1); + + rb_output_fs = Qnil; + rb_define_hooked_variable("$,", &rb_output_fs, 0, rb_str_setter); + + rb_global_variable(&rb_default_rs); + rb_rs = rb_default_rs = rb_str_new2("\n"); + rb_output_rs = Qnil; + OBJ_FREEZE(rb_default_rs); /* avoid modifying RS_default */ + rb_define_hooked_variable("$/", &rb_rs, 0, rb_str_setter); + rb_define_hooked_variable("$-0", &rb_rs, 0, rb_str_setter); + rb_define_hooked_variable("$\\", &rb_output_rs, 0, rb_str_setter); + + rb_define_hooked_variable("$.", &lineno, 0, lineno_setter); + rb_define_virtual_variable("$_", rb_lastline_get, rb_lastline_set); + + rb_define_method(rb_cIO, "initialize_copy", rb_io_init_copy, 1); + rb_define_method(rb_cIO, "reopen", rb_io_reopen, -1); + + rb_define_method(rb_cIO, "print", rb_io_print, -1); + rb_define_method(rb_cIO, "putc", rb_io_putc, 1); + rb_define_method(rb_cIO, "puts", rb_io_puts, -1); + rb_define_method(rb_cIO, "printf", rb_io_printf, -1); + + rb_define_method(rb_cIO, "each", rb_io_each_line, -1); + rb_define_method(rb_cIO, "each_line", rb_io_each_line, -1); + rb_define_method(rb_cIO, "each_byte", rb_io_each_byte, 0); + + rb_define_method(rb_cIO, "syswrite", rb_io_syswrite, 1); + rb_define_method(rb_cIO, "sysread", rb_io_sysread, -1); + + rb_define_method(rb_cIO, "fileno", rb_io_fileno, 0); + rb_define_alias(rb_cIO, "to_i", "fileno"); + rb_define_method(rb_cIO, "to_io", rb_io_to_io, 0); + + rb_define_method(rb_cIO, "fsync", rb_io_fsync, 0); + rb_define_method(rb_cIO, "sync", rb_io_sync, 0); + rb_define_method(rb_cIO, "sync=", rb_io_set_sync, 1); + + rb_define_method(rb_cIO, "lineno", rb_io_lineno, 0); + rb_define_method(rb_cIO, "lineno=", rb_io_set_lineno, 1); + + rb_define_method(rb_cIO, "readlines", rb_io_readlines, -1); + + rb_define_method(rb_cIO, "read_nonblock", io_read_nonblock, -1); + rb_define_method(rb_cIO, "write_nonblock", rb_io_write_nonblock, 1); + rb_define_method(rb_cIO, "readpartial", io_readpartial, -1); + rb_define_method(rb_cIO, "read", io_read, -1); + rb_define_method(rb_cIO, "write", io_write, 1); + rb_define_method(rb_cIO, "gets", rb_io_gets_m, -1); + rb_define_method(rb_cIO, "readline", rb_io_readline, -1); + rb_define_method(rb_cIO, "getc", rb_io_getc, 0); + rb_define_method(rb_cIO, "readchar", rb_io_readchar, 0); + rb_define_method(rb_cIO, "ungetc",rb_io_ungetc, 1); + rb_define_method(rb_cIO, "<<", rb_io_addstr, 1); + rb_define_method(rb_cIO, "flush", rb_io_flush, 0); + rb_define_method(rb_cIO, "tell", rb_io_tell, 0); + rb_define_method(rb_cIO, "seek", rb_io_seek_m, -1); + rb_define_const(rb_cIO, "SEEK_SET", INT2FIX(SEEK_SET)); + rb_define_const(rb_cIO, "SEEK_CUR", INT2FIX(SEEK_CUR)); + rb_define_const(rb_cIO, "SEEK_END", INT2FIX(SEEK_END)); + rb_define_method(rb_cIO, "rewind", rb_io_rewind, 0); + rb_define_method(rb_cIO, "pos", rb_io_tell, 0); + rb_define_method(rb_cIO, "pos=", rb_io_set_pos, 1); + rb_define_method(rb_cIO, "eof", rb_io_eof, 0); + rb_define_method(rb_cIO, "eof?", rb_io_eof, 0); + + rb_define_method(rb_cIO, "close", rb_io_close_m, 0); + rb_define_method(rb_cIO, "closed?", rb_io_closed, 0); + rb_define_method(rb_cIO, "close_read", rb_io_close_read, 0); + rb_define_method(rb_cIO, "close_write", rb_io_close_write, 0); + + rb_define_method(rb_cIO, "isatty", rb_io_isatty, 0); + rb_define_method(rb_cIO, "tty?", rb_io_isatty, 0); + rb_define_method(rb_cIO, "binmode", rb_io_binmode, 0); + rb_define_method(rb_cIO, "sysseek", rb_io_sysseek, -1); + + rb_define_method(rb_cIO, "ioctl", rb_io_ioctl, -1); + rb_define_method(rb_cIO, "fcntl", rb_io_fcntl, -1); + rb_define_method(rb_cIO, "pid", rb_io_pid, 0); + rb_define_method(rb_cIO, "inspect", rb_io_inspect, 0); + + rb_define_variable("$stdin", &rb_stdin); + rb_stdin = prep_stdio(stdin, FMODE_READABLE, rb_cIO); + rb_define_hooked_variable("$stdout", &rb_stdout, 0, stdout_setter); + rb_stdout = prep_stdio(stdout, FMODE_WRITABLE, rb_cIO); + rb_define_hooked_variable("$stderr", &rb_stderr, 0, stdout_setter); + rb_stderr = prep_stdio(stderr, FMODE_WRITABLE, rb_cIO); + rb_define_hooked_variable("$>", &rb_stdout, 0, stdout_setter); + orig_stdout = rb_stdout; + rb_deferr = orig_stderr = rb_stderr; + + /* variables to be removed in 1.8.1 */ + rb_define_hooked_variable("$defout", &rb_stdout, 0, defout_setter); + rb_define_hooked_variable("$deferr", &rb_stderr, 0, deferr_setter); + + /* constants to hold original stdin/stdout/stderr */ + rb_define_global_const("STDIN", rb_stdin); + rb_define_global_const("STDOUT", rb_stdout); + rb_define_global_const("STDERR", rb_stderr); + + rb_define_readonly_variable("$<", &argf); + argf = rb_obj_alloc(rb_cObject); + rb_extend_object(argf, rb_mEnumerable); + rb_define_global_const("ARGF", argf); + + rb_define_singleton_method(argf, "to_s", argf_to_s, 0); + + rb_define_singleton_method(argf, "fileno", argf_fileno, 0); + rb_define_singleton_method(argf, "to_i", argf_fileno, 0); + rb_define_singleton_method(argf, "to_io", argf_to_io, 0); + rb_define_singleton_method(argf, "each", argf_each_line, -1); + rb_define_singleton_method(argf, "each_line", argf_each_line, -1); + rb_define_singleton_method(argf, "each_byte", argf_each_byte, 0); + + rb_define_singleton_method(argf, "read", argf_read, -1); + rb_define_singleton_method(argf, "readlines", rb_f_readlines, -1); + rb_define_singleton_method(argf, "to_a", rb_f_readlines, -1); + rb_define_singleton_method(argf, "gets", rb_f_gets, -1); + rb_define_singleton_method(argf, "readline", rb_f_readline, -1); + rb_define_singleton_method(argf, "getc", argf_getc, 0); + rb_define_singleton_method(argf, "readchar", argf_readchar, 0); + rb_define_singleton_method(argf, "tell", argf_tell, 0); + rb_define_singleton_method(argf, "seek", argf_seek_m, -1); + rb_define_singleton_method(argf, "rewind", argf_rewind, 0); + rb_define_singleton_method(argf, "pos", argf_tell, 0); + rb_define_singleton_method(argf, "pos=", argf_set_pos, 1); + rb_define_singleton_method(argf, "eof", argf_eof, 0); + rb_define_singleton_method(argf, "eof?", argf_eof, 0); + rb_define_singleton_method(argf, "binmode", argf_binmode, 0); + + rb_define_singleton_method(argf, "filename", argf_filename, 0); + rb_define_singleton_method(argf, "path", argf_filename, 0); + rb_define_singleton_method(argf, "file", argf_file, 0); + rb_define_singleton_method(argf, "skip", argf_skip, 0); + rb_define_singleton_method(argf, "close", argf_close_m, 0); + rb_define_singleton_method(argf, "closed?", argf_closed, 0); + + rb_define_singleton_method(argf, "lineno", argf_lineno, 0); + rb_define_singleton_method(argf, "lineno=", argf_set_lineno, 1); + + rb_global_variable(¤t_file); + rb_define_readonly_variable("$FILENAME", &filename); + filename = rb_str_new2("-"); + + rb_define_virtual_variable("$-i", opt_i_get, opt_i_set); + +#if defined (_WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__) + atexit(pipe_atexit); +#endif + + Init_File(); + + rb_define_method(rb_cFile, "initialize", rb_file_initialize, -1); + + rb_file_const("RDONLY", INT2FIX(O_RDONLY)); + rb_file_const("WRONLY", INT2FIX(O_WRONLY)); + rb_file_const("RDWR", INT2FIX(O_RDWR)); + rb_file_const("APPEND", INT2FIX(O_APPEND)); + rb_file_const("CREAT", INT2FIX(O_CREAT)); + rb_file_const("EXCL", INT2FIX(O_EXCL)); +#if defined(O_NDELAY) || defined(O_NONBLOCK) +# ifdef O_NONBLOCK + rb_file_const("NONBLOCK", INT2FIX(O_NONBLOCK)); +# else + rb_file_const("NONBLOCK", INT2FIX(O_NDELAY)); +# endif +#endif + rb_file_const("TRUNC", INT2FIX(O_TRUNC)); +#ifdef O_NOCTTY + rb_file_const("NOCTTY", INT2FIX(O_NOCTTY)); +#endif +#ifdef O_BINARY + rb_file_const("BINARY", INT2FIX(O_BINARY)); +#endif +#ifdef O_SYNC + rb_file_const("SYNC", INT2FIX(O_SYNC)); +#endif +} +/* C code produced by gperf version 2.7.2 */ +/* Command-line: gperf -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' ./keywords */ +struct kwtable {char *name; int id[2]; enum lex_state state;}; + +#define TOTAL_KEYWORDS 40 +#define MIN_WORD_LENGTH 2 +#define MAX_WORD_LENGTH 8 +#define MIN_HASH_VALUE 6 +#define MAX_HASH_VALUE 55 +/* maximum key range = 50, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +hash (str, len) + register const char *str; + register unsigned int len; +{ + static unsigned char asso_values[] = + { + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 11, 56, 56, 36, 56, 1, 37, + 31, 1, 56, 56, 56, 56, 29, 56, 1, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 1, 56, 32, 1, 2, + 1, 1, 4, 23, 56, 17, 56, 20, 9, 2, + 9, 26, 14, 56, 5, 1, 1, 16, 56, 21, + 20, 9, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56 + }; + register int hval = len; + + switch (hval) + { + default: + case 3: + hval += asso_values[(unsigned char)str[2]]; + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval + asso_values[(unsigned char)str[len - 1]]; +} + +#ifdef __GNUC__ +__inline +#endif +struct kwtable * +rb_reserved_word (str, len) + register const char *str; + register unsigned int len; +{ + static struct kwtable wordlist[] = + { + {""}, {""}, {""}, {""}, {""}, {""}, + {"end", {kEND, kEND}, EXPR_END}, + {"else", {kELSE, kELSE}, EXPR_BEG}, + {"case", {kCASE, kCASE}, EXPR_BEG}, + {"ensure", {kENSURE, kENSURE}, EXPR_BEG}, + {"module", {kMODULE, kMODULE}, EXPR_BEG}, + {"elsif", {kELSIF, kELSIF}, EXPR_BEG}, + {"def", {kDEF, kDEF}, EXPR_FNAME}, + {"rescue", {kRESCUE, kRESCUE_MOD}, EXPR_MID}, + {"not", {kNOT, kNOT}, EXPR_BEG}, + {"then", {kTHEN, kTHEN}, EXPR_BEG}, + {"yield", {kYIELD, kYIELD}, EXPR_ARG}, + {"for", {kFOR, kFOR}, EXPR_BEG}, + {"self", {kSELF, kSELF}, EXPR_END}, + {"false", {kFALSE, kFALSE}, EXPR_END}, + {"retry", {kRETRY, kRETRY}, EXPR_END}, + {"return", {kRETURN, kRETURN}, EXPR_MID}, + {"true", {kTRUE, kTRUE}, EXPR_END}, + {"if", {kIF, kIF_MOD}, EXPR_BEG}, + {"defined?", {kDEFINED, kDEFINED}, EXPR_ARG}, + {"super", {kSUPER, kSUPER}, EXPR_ARG}, + {"undef", {kUNDEF, kUNDEF}, EXPR_FNAME}, + {"break", {kBREAK, kBREAK}, EXPR_MID}, + {"in", {kIN, kIN}, EXPR_BEG}, + {"do", {kDO, kDO}, EXPR_BEG}, + {"nil", {kNIL, kNIL}, EXPR_END}, + {"until", {kUNTIL, kUNTIL_MOD}, EXPR_BEG}, + {"unless", {kUNLESS, kUNLESS_MOD}, EXPR_BEG}, + {"or", {kOR, kOR}, EXPR_BEG}, + {"next", {kNEXT, kNEXT}, EXPR_MID}, + {"when", {kWHEN, kWHEN}, EXPR_BEG}, + {"redo", {kREDO, kREDO}, EXPR_END}, + {"and", {kAND, kAND}, EXPR_BEG}, + {"begin", {kBEGIN, kBEGIN}, EXPR_BEG}, + {"__LINE__", {k__LINE__, k__LINE__}, EXPR_END}, + {"class", {kCLASS, kCLASS}, EXPR_CLASS}, + {"__FILE__", {k__FILE__, k__FILE__}, EXPR_END}, + {"END", {klEND, klEND}, EXPR_END}, + {"BEGIN", {klBEGIN, klBEGIN}, EXPR_END}, + {"while", {kWHILE, kWHILE_MOD}, EXPR_BEG}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"alias", {kALIAS, kALIAS}, EXPR_FNAME} + }; + + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register const char *s = wordlist[key].name; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return &wordlist[key]; + } + } + return 0; +} +/********************************************************************** + + main.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Fri Aug 19 13:19:58 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" + +#ifdef __human68k__ +int _stacksize = 262144; +#endif + +#if defined __MINGW32__ +int _CRT_glob = 0; +#endif + +#if defined(__MACOS__) && defined(__MWERKS__) +#include <console.h> +#endif + +/* to link startup code with ObjC support */ +#if (defined(__APPLE__) || defined(__NeXT__)) && defined(__MACH__) +static void objcdummyfunction( void ) { objc_msgSend(); } +#endif + +int +main(argc, argv, envp) + int argc; + char **argv, **envp; +{ +#ifdef _WIN32 + NtInitialize(&argc, &argv); +#endif +#if defined(__MACOS__) && defined(__MWERKS__) + argc = ccommand(&argv); +#endif + + { + RUBY_INIT_STACK + ruby_init(); + ruby_options(argc, argv); + ruby_run(); + } + return 0; +} +/********************************************************************** + + marshal.c - + + $Author: shyouhei $ + $Date: 2009-01-28 12:59:58 +0100 (Wed, 28 Jan 2009) $ + created at: Thu Apr 27 16:30:01 JST 1995 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "rubyio.h" +#include "st.h" +#include "util.h" + +#include <math.h> +#ifdef HAVE_FLOAT_H +#include <float.h> +#endif +#ifdef HAVE_IEEEFP_H +#include <ieeefp.h> +#endif + +#define BITSPERSHORT (2*CHAR_BIT) +#define SHORTMASK ((1<<BITSPERSHORT)-1) +#define SHORTDN(x) RSHIFT(x,BITSPERSHORT) + +#if SIZEOF_SHORT == SIZEOF_BDIGITS +#define SHORTLEN(x) (x) +#else +static int +shortlen(len, ds) + long len; + BDIGIT *ds; +{ + BDIGIT num; + int offset = 0; + + num = ds[len-1]; + while (num) { + num = SHORTDN(num); + offset++; + } + return (len - 1)*sizeof(BDIGIT)/2 + offset; +} +#define SHORTLEN(x) shortlen((x),d) +#endif + +#define MARSHAL_MAJOR 4 +#define MARSHAL_MINOR 8 + +#define TYPE_NIL '0' +#define TYPE_TRUE 'T' +#define TYPE_FALSE 'F' +#define TYPE_FIXNUM 'i' + +#define TYPE_EXTENDED 'e' +#define TYPE_UCLASS 'C' +#define TYPE_OBJECT 'o' +#define TYPE_DATA 'd' +#define TYPE_USERDEF 'u' +#define TYPE_USRMARSHAL 'U' +#define TYPE_FLOAT 'f' +#define TYPE_BIGNUM 'l' +#define TYPE_STRING '"' +#define TYPE_REGEXP '/' +#define TYPE_ARRAY '[' +#define TYPE_HASH '{' +#define TYPE_HASH_DEF '}' +#define TYPE_STRUCT 'S' +#define TYPE_MODULE_OLD 'M' +#define TYPE_CLASS 'c' +#define TYPE_MODULE 'm' + +#define TYPE_SYMBOL ':' +#define TYPE_SYMLINK ';' + +#define TYPE_IVAR 'I' +#define TYPE_LINK '@' + +static ID s_dump, s_load, s_mdump, s_mload; +static ID s_dump_data, s_load_data, s_alloc, s_call; +static ID s_getc, s_read, s_write, s_binmode; + +struct dump_arg { + VALUE obj; + VALUE str, dest; + st_table *symbols; + st_table *data; + int taint; + VALUE wrapper; +}; + +struct dump_call_arg { + VALUE obj; + struct dump_arg *arg; + int limit; +}; + +static void +check_dump_arg(arg, sym) + struct dump_arg *arg; + ID sym; +{ + if (!DATA_PTR(arg->wrapper)) { + rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s", + rb_id2name(sym)); + } +} + +static void +mark_dump_arg(ptr) + void *ptr; +{ + struct dump_arg *p = ptr; + if (!ptr) + return; + rb_mark_set(p->data); +} + +static VALUE +class2path(klass) + VALUE klass; +{ + VALUE path = rb_class_path(klass); + char *n = RSTRING(path)->ptr; + + if (n[0] == '#') { + rb_raise(rb_eTypeError, "can't dump anonymous %s %s", + (TYPE(klass) == T_CLASS ? "class" : "module"), + n); + } + if (rb_path2class(n) != rb_class_real(klass)) { + rb_raise(rb_eTypeError, "%s can't be referred", n); + } + return path; +} + +static void w_long _((long, struct dump_arg*)); + +static void +w_nbyte(s, n, arg) + char *s; + int n; + struct dump_arg *arg; +{ + VALUE buf = arg->str; + rb_str_buf_cat(buf, s, n); + if (arg->dest && RSTRING(buf)->len >= BUFSIZ) { + if (arg->taint) OBJ_TAINT(buf); + rb_io_write(arg->dest, buf); + rb_str_resize(buf, 0); + } +} + +static void +w_byte(c, arg) + char c; + struct dump_arg *arg; +{ + w_nbyte(&c, 1, arg); +} + +static void +w_bytes(s, n, arg) + char *s; + int n; + struct dump_arg *arg; +{ + w_long(n, arg); + w_nbyte(s, n, arg); +} + +static void +w_short(x, arg) + int x; + struct dump_arg *arg; +{ + w_byte((x >> 0) & 0xff, arg); + w_byte((x >> 8) & 0xff, arg); +} + +static void +w_long(x, arg) + long x; + struct dump_arg *arg; +{ + char buf[sizeof(long)+1]; + int i, len = 0; + +#if SIZEOF_LONG > 4 + if (!(RSHIFT(x, 31) == 0 || RSHIFT(x, 31) == -1)) { + /* big long does not fit in 4 bytes */ + rb_raise(rb_eTypeError, "long too big to dump"); + } +#endif + + if (x == 0) { + w_byte(0, arg); + return; + } + if (0 < x && x < 123) { + w_byte(x + 5, arg); + return; + } + if (-124 < x && x < 0) { + w_byte((x - 5)&0xff, arg); + return; + } + for (i=1;i<sizeof(long)+1;i++) { + buf[i] = x & 0xff; + x = RSHIFT(x,8); + if (x == 0) { + buf[0] = i; + break; + } + if (x == -1) { + buf[0] = -i; + break; + } + } + len = i; + for (i=0;i<=len;i++) { + w_byte(buf[i], arg); + } +} + +#ifdef DBL_MANT_DIG +#define DECIMAL_MANT (53-16) /* from IEEE754 double precision */ + +#if DBL_MANT_DIG > 32 +#define MANT_BITS 32 +#elif DBL_MANT_DIG > 24 +#define MANT_BITS 24 +#elif DBL_MANT_DIG > 16 +#define MANT_BITS 16 +#else +#define MANT_BITS 8 +#endif + +static int +save_mantissa(d, buf) + double d; + char *buf; +{ + int e, i = 0; + unsigned long m; + double n; + + d = modf(ldexp(frexp(fabs(d), &e), DECIMAL_MANT), &d); + if (d > 0) { + buf[i++] = 0; + do { + d = modf(ldexp(d, MANT_BITS), &n); + m = (unsigned long)n; +#if MANT_BITS > 24 + buf[i++] = m >> 24; +#endif +#if MANT_BITS > 16 + buf[i++] = m >> 16; +#endif +#if MANT_BITS > 8 + buf[i++] = m >> 8; +#endif + buf[i++] = m; + } while (d > 0); + while (!buf[i - 1]) --i; + } + return i; +} + +static double +load_mantissa(d, buf, len) + double d; + const char *buf; + int len; +{ + if (--len > 0 && !*buf++) { /* binary mantissa mark */ + int e, s = d < 0, dig = 0; + unsigned long m; + + modf(ldexp(frexp(fabs(d), &e), DECIMAL_MANT), &d); + do { + m = 0; + switch (len) { + default: m = *buf++ & 0xff; +#if MANT_BITS > 24 + case 3: m = (m << 8) | (*buf++ & 0xff); +#endif +#if MANT_BITS > 16 + case 2: m = (m << 8) | (*buf++ & 0xff); +#endif +#if MANT_BITS > 8 + case 1: m = (m << 8) | (*buf++ & 0xff); +#endif + } + dig -= len < MANT_BITS / 8 ? 8 * (unsigned)len : MANT_BITS; + d += ldexp((double)m, dig); + } while ((len -= MANT_BITS / 8) > 0); + d = ldexp(d, e - DECIMAL_MANT); + if (s) d = -d; + } + return d; +} +#else +#define load_mantissa(d, buf, len) (d) +#define save_mantissa(d, buf) 0 +#endif + +#ifdef DBL_DIG +#define FLOAT_DIG (DBL_DIG+2) +#else +#define FLOAT_DIG 17 +#endif + +static void +w_float(d, arg) + double d; + struct dump_arg *arg; +{ + char buf[100]; + + if (isinf(d)) { + if (d < 0) strcpy(buf, "-inf"); + else strcpy(buf, "inf"); + } + else if (isnan(d)) { + strcpy(buf, "nan"); + } + else if (d == 0.0) { + if (1.0/d < 0) strcpy(buf, "-0"); + else strcpy(buf, "0"); + } + else { + int len; + + /* xxx: should not use system's sprintf(3) */ + sprintf(buf, "%.*g", FLOAT_DIG, d); + len = strlen(buf); + w_bytes(buf, len + save_mantissa(d, buf + len), arg); + return; + } + w_bytes(buf, strlen(buf), arg); +} + +static void +w_symbol(id, arg) + ID id; + struct dump_arg *arg; +{ + char *sym = rb_id2name(id); + st_data_t num; + + if (st_lookup(arg->symbols, id, &num)) { + w_byte(TYPE_SYMLINK, arg); + w_long((long)num, arg); + } + else { + w_byte(TYPE_SYMBOL, arg); + w_bytes(sym, strlen(sym), arg); + st_add_direct(arg->symbols, id, arg->symbols->num_entries); + } +} + +static void +w_unique(s, arg) + char *s; + struct dump_arg *arg; +{ + if (s[0] == '#') { + rb_raise(rb_eTypeError, "can't dump anonymous class %s", s); + } + w_symbol(rb_intern(s), arg); +} + +static void w_object _((VALUE,struct dump_arg*,int)); + +static int +hash_each(key, value, arg) + VALUE key, value; + struct dump_call_arg *arg; +{ + w_object(key, arg->arg, arg->limit); + w_object(value, arg->arg, arg->limit); + return ST_CONTINUE; +} + +static void +w_extended(klass, arg, check) + VALUE klass; + struct dump_arg *arg; + int check; +{ + char *path; + + if (check && FL_TEST(klass, FL_SINGLETON)) { + if (RCLASS(klass)->m_tbl->num_entries || + (RCLASS(klass)->iv_tbl && RCLASS(klass)->iv_tbl->num_entries > 1)) { + rb_raise(rb_eTypeError, "singleton can't be dumped"); + } + klass = RCLASS(klass)->super; + } + while (BUILTIN_TYPE(klass) == T_ICLASS) { + path = rb_class2name(RBASIC(klass)->klass); + w_byte(TYPE_EXTENDED, arg); + w_unique(path, arg); + klass = RCLASS(klass)->super; + } +} + +static void +w_class(type, obj, arg, check) + int type; + VALUE obj; + struct dump_arg *arg; + int check; +{ + char *path; + + VALUE klass = CLASS_OF(obj); + w_extended(klass, arg, check); + w_byte(type, arg); + path = RSTRING(class2path(rb_class_real(klass)))->ptr; + w_unique(path, arg); +} + +static void +w_uclass(obj, base_klass, arg) + VALUE obj, base_klass; + struct dump_arg *arg; +{ + VALUE klass = CLASS_OF(obj); + + w_extended(klass, arg, Qtrue); + klass = rb_class_real(klass); + if (klass != base_klass) { + w_byte(TYPE_UCLASS, arg); + w_unique(RSTRING(class2path(klass))->ptr, arg); + } +} + +static int +w_obj_each(id, value, arg) + ID id; + VALUE value; + struct dump_call_arg *arg; +{ + w_symbol(id, arg->arg); + w_object(value, arg->arg, arg->limit); + return ST_CONTINUE; +} + +static void +w_ivar(tbl, arg) + st_table *tbl; + struct dump_call_arg *arg; +{ + if (tbl) { + w_long(tbl->num_entries, arg->arg); + st_foreach_safe(tbl, w_obj_each, (st_data_t)arg); + } + else { + w_long(0, arg->arg); + } +} + +static void +w_object(obj, arg, limit) + VALUE obj; + struct dump_arg *arg; + int limit; +{ + struct dump_call_arg c_arg; + st_table *ivtbl = 0; + st_data_t num; + + if (limit == 0) { + rb_raise(rb_eArgError, "exceed depth limit"); + } + + limit--; + c_arg.limit = limit; + c_arg.arg = arg; + + if (st_lookup(arg->data, obj, &num)) { + w_byte(TYPE_LINK, arg); + w_long((long)num, arg); + return; + } + + if ((ivtbl = rb_generic_ivar_table(obj)) != 0) { + w_byte(TYPE_IVAR, arg); + } + if (obj == Qnil) { + w_byte(TYPE_NIL, arg); + } + else if (obj == Qtrue) { + w_byte(TYPE_TRUE, arg); + } + else if (obj == Qfalse) { + w_byte(TYPE_FALSE, arg); + } + else if (FIXNUM_P(obj)) { +#if SIZEOF_LONG <= 4 + w_byte(TYPE_FIXNUM, arg); + w_long(FIX2INT(obj), arg); +#else + if (RSHIFT((long)obj, 31) == 0 || RSHIFT((long)obj, 31) == -1) { + w_byte(TYPE_FIXNUM, arg); + w_long(FIX2LONG(obj), arg); + } + else { + w_object(rb_int2big(FIX2LONG(obj)), arg, limit); + } +#endif + } + else if (SYMBOL_P(obj)) { + w_symbol(SYM2ID(obj), arg); + } + else { + if (OBJ_TAINTED(obj)) arg->taint = Qtrue; + + st_add_direct(arg->data, obj, arg->data->num_entries); + if (rb_respond_to(obj, s_mdump)) { + volatile VALUE v; + + v = rb_funcall(obj, s_mdump, 0, 0); + check_dump_arg(arg, s_mdump); + w_class(TYPE_USRMARSHAL, obj, arg, Qfalse); + w_object(v, arg, limit); + if (ivtbl) w_ivar(0, &c_arg); + return; + } + if (rb_respond_to(obj, s_dump)) { + VALUE v; + + v = rb_funcall(obj, s_dump, 1, INT2NUM(limit)); + check_dump_arg(arg, s_dump); + if (TYPE(v) != T_STRING) { + rb_raise(rb_eTypeError, "_dump() must return string"); + } + if (!ivtbl && (ivtbl = rb_generic_ivar_table(v))) { + w_byte(TYPE_IVAR, arg); + } + w_class(TYPE_USERDEF, obj, arg, Qfalse); + w_bytes(RSTRING(v)->ptr, RSTRING(v)->len, arg); + if (ivtbl) { + w_ivar(ivtbl, &c_arg); + } + return; + } + + switch (BUILTIN_TYPE(obj)) { + case T_CLASS: + if (FL_TEST(obj, FL_SINGLETON)) { + rb_raise(rb_eTypeError, "singleton class can't be dumped"); + } + w_byte(TYPE_CLASS, arg); + { + VALUE path = class2path(obj); + w_bytes(RSTRING(path)->ptr, RSTRING(path)->len, arg); + } + break; + + case T_MODULE: + w_byte(TYPE_MODULE, arg); + { + VALUE path = class2path(obj); + w_bytes(RSTRING(path)->ptr, RSTRING(path)->len, arg); + } + break; + + case T_FLOAT: + w_byte(TYPE_FLOAT, arg); + w_float(RFLOAT(obj)->value, arg); + break; + + case T_BIGNUM: + w_byte(TYPE_BIGNUM, arg); + { + char sign = RBIGNUM(obj)->sign ? '+' : '-'; + long len = RBIGNUM(obj)->len; + BDIGIT *d = RBIGNUM(obj)->digits; + + w_byte(sign, arg); + w_long(SHORTLEN(len), arg); /* w_short? */ + while (len--) { +#if SIZEOF_BDIGITS > SIZEOF_SHORT + BDIGIT num = *d; + int i; + + for (i=0; i<SIZEOF_BDIGITS; i+=SIZEOF_SHORT) { + w_short(num & SHORTMASK, arg); + num = SHORTDN(num); + if (len == 0 && num == 0) break; + } +#else + w_short(*d, arg); +#endif + d++; + } + } + break; + + case T_STRING: + w_uclass(obj, rb_cString, arg); + w_byte(TYPE_STRING, arg); + w_bytes(RSTRING(obj)->ptr, RSTRING(obj)->len, arg); + break; + + case T_REGEXP: + w_uclass(obj, rb_cRegexp, arg); + w_byte(TYPE_REGEXP, arg); + w_bytes(RREGEXP(obj)->str, RREGEXP(obj)->len, arg); + w_byte(rb_reg_options(obj), arg); + break; + + case T_ARRAY: + w_uclass(obj, rb_cArray, arg); + w_byte(TYPE_ARRAY, arg); + { + long len = RARRAY(obj)->len; + VALUE *ptr = RARRAY(obj)->ptr; + + w_long(len, arg); + while (len--) { + w_object(*ptr, arg, limit); + ptr++; + } + } + break; + + case T_HASH: + w_uclass(obj, rb_cHash, arg); + if (NIL_P(RHASH(obj)->ifnone)) { + w_byte(TYPE_HASH, arg); + } + else if (FL_TEST(obj, FL_USER2)) { + /* FL_USER2 means HASH_PROC_DEFAULT (see hash.c) */ + rb_raise(rb_eTypeError, "can't dump hash with default proc"); + } + else { + w_byte(TYPE_HASH_DEF, arg); + } + w_long(RHASH(obj)->tbl->num_entries, arg); + rb_hash_foreach(obj, hash_each, (st_data_t)&c_arg); + if (!NIL_P(RHASH(obj)->ifnone)) { + w_object(RHASH(obj)->ifnone, arg, limit); + } + break; + + case T_STRUCT: + w_class(TYPE_STRUCT, obj, arg, Qtrue); + { + long len = RSTRUCT(obj)->len; + VALUE mem; + long i; + + w_long(len, arg); + mem = rb_struct_members(obj); + for (i=0; i<len; i++) { + w_symbol(SYM2ID(RARRAY(mem)->ptr[i]), arg); + w_object(RSTRUCT(obj)->ptr[i], arg, limit); + } + } + break; + + case T_OBJECT: + w_class(TYPE_OBJECT, obj, arg, Qtrue); + w_ivar(ROBJECT(obj)->iv_tbl, &c_arg); + break; + + case T_DATA: + { + VALUE v; + + if (!rb_respond_to(obj, s_dump_data)) { + rb_raise(rb_eTypeError, + "no marshal_dump is defined for class %s", + rb_obj_classname(obj)); + } + v = rb_funcall(obj, s_dump_data, 0); + check_dump_arg(arg, s_dump_data); + w_class(TYPE_DATA, obj, arg, Qtrue); + w_object(v, arg, limit); + } + break; + + default: + rb_raise(rb_eTypeError, "can't dump %s", + rb_obj_classname(obj)); + break; + } + } + if (ivtbl) { + w_ivar(ivtbl, &c_arg); + } +} + +static VALUE +dump(arg) + struct dump_call_arg *arg; +{ + w_object(arg->obj, arg->arg, arg->limit); + if (arg->arg->dest) { + rb_io_write(arg->arg->dest, arg->arg->str); + rb_str_resize(arg->arg->str, 0); + } + return 0; +} + +static VALUE +dump_ensure(arg) + struct dump_arg *arg; +{ + if (!DATA_PTR(arg->wrapper)) return 0; + st_free_table(arg->symbols); + st_free_table(arg->data); + DATA_PTR(arg->wrapper) = 0; + arg->wrapper = 0; + if (arg->taint) { + OBJ_TAINT(arg->str); + } + + return 0; +} + +/* + * call-seq: + * dump( obj [, anIO] , limit=--1 ) => anIO + * + * Serializes obj and all descendent objects. If anIO is + * specified, the serialized data will be written to it, otherwise the + * data will be returned as a String. If limit is specified, the + * traversal of subobjects will be limited to that depth. If limit is + * negative, no checking of depth will be performed. + * + * class Klass + * def initialize(str) + * @str = str + * end + * def sayHello + * @str + * end + * end + * + * (produces no output) + * + * o = Klass.new("hello\n") + * data = Marshal.dump(o) + * obj = Marshal.load(data) + * obj.sayHello #=> "hello\n" + */ +static VALUE +marshal_dump(argc, argv) + int argc; + VALUE* argv; +{ + VALUE obj, port, a1, a2; + int limit = -1; + struct dump_arg arg; + struct dump_call_arg c_arg; + + port = Qnil; + rb_scan_args(argc, argv, "12", &obj, &a1, &a2); + if (argc == 3) { + if (!NIL_P(a2)) limit = NUM2INT(a2); + if (NIL_P(a1)) goto type_error; + port = a1; + } + else if (argc == 2) { + if (FIXNUM_P(a1)) limit = FIX2INT(a1); + else if (NIL_P(a1)) goto type_error; + else port = a1; + } + arg.dest = 0; + arg.symbols = st_init_numtable(); + arg.data = st_init_numtable(); + arg.taint = Qfalse; + arg.str = rb_str_buf_new(0); + RBASIC(arg.str)->klass = 0; + arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg); + if (!NIL_P(port)) { + if (!rb_respond_to(port, s_write)) { + type_error: + rb_raise(rb_eTypeError, "instance of IO needed"); + } + arg.dest = port; + if (rb_respond_to(port, s_binmode)) { + rb_funcall2(port, s_binmode, 0, 0); + check_dump_arg(&arg, s_binmode); + } + } + else { + port = arg.str; + } + + c_arg.obj = obj; + c_arg.arg = &arg; + c_arg.limit = limit; + + w_byte(MARSHAL_MAJOR, &arg); + w_byte(MARSHAL_MINOR, &arg); + + rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg); + RBASIC(arg.str)->klass = rb_cString; + + return port; +} + +struct load_arg { + VALUE src; + long offset; + st_table *symbols; + st_table *data; + VALUE proc; + int taint; + VALUE wrapper; +}; + +static void +check_load_arg(arg, sym) + struct load_arg *arg; + ID sym; +{ + if (!DATA_PTR(arg->wrapper)) { + rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s", + rb_id2name(sym)); + } +} + +static void +mark_load_arg(ptr) + void *ptr; +{ + struct load_arg *p = ptr; + if (!ptr) + return; + rb_mark_tbl(p->data); +} + +static VALUE r_object _((struct load_arg *arg)); + +static int +r_byte(arg) + struct load_arg *arg; +{ + int c; + + if (TYPE(arg->src) == T_STRING) { + if (RSTRING(arg->src)->len > arg->offset) { + c = (unsigned char)RSTRING(arg->src)->ptr[arg->offset++]; + } + else { + rb_raise(rb_eArgError, "marshal data too short"); + } + } + else { + VALUE src = arg->src; + VALUE v = rb_funcall2(src, s_getc, 0, 0); + check_load_arg(arg, s_getc); + if (NIL_P(v)) rb_eof_error(); + c = (unsigned char)FIX2INT(v); + } + return c; +} + +static void +long_toobig(size) + int size; +{ + rb_raise(rb_eTypeError, "long too big for this architecture (size %d, given %d)", + sizeof(long), size); +} + +#undef SIGN_EXTEND_CHAR +#if __STDC__ +# define SIGN_EXTEND_CHAR(c) ((signed char)(c)) +#else /* not __STDC__ */ +/* As in Harbison and Steele. */ +# define SIGN_EXTEND_CHAR(c) ((((unsigned char)(c)) ^ 128) - 128) +#endif + +static long +r_long(arg) + struct load_arg *arg; +{ + register long x; + int c = SIGN_EXTEND_CHAR(r_byte(arg)); + long i; + + if (c == 0) return 0; + if (c > 0) { + if (4 < c && c < 128) { + return c - 5; + } + if (c > sizeof(long)) long_toobig(c); + x = 0; + for (i=0;i<c;i++) { + x |= (long)r_byte(arg) << (8*i); + } + } + else { + if (-129 < c && c < -4) { + return c + 5; + } + c = -c; + if (c > sizeof(long)) long_toobig(c); + x = -1; + for (i=0;i<c;i++) { + x &= ~((long)0xff << (8*i)); + x |= (long)r_byte(arg) << (8*i); + } + } + return x; +} + +#define r_bytes(arg) r_bytes0(r_long(arg), (arg)) + +static VALUE +r_bytes0(len, arg) + long len; + struct load_arg *arg; +{ + VALUE str; + + if (len == 0) return rb_str_new(0, 0); + if (TYPE(arg->src) == T_STRING) { + if (RSTRING(arg->src)->len - arg->offset >= len) { + str = rb_str_new(RSTRING(arg->src)->ptr+arg->offset, len); + arg->offset += len; + } + else { + too_short: + rb_raise(rb_eArgError, "marshal data too short"); + } + } + else { + VALUE src = arg->src; + VALUE n = LONG2NUM(len); + str = rb_funcall2(src, s_read, 1, &n); + check_load_arg(arg, s_read); + if (NIL_P(str)) goto too_short; + StringValue(str); + if (RSTRING(str)->len != len) goto too_short; + if (OBJ_TAINTED(str)) arg->taint = Qtrue; + } + return str; +} + +static ID +r_symlink(arg) + struct load_arg *arg; +{ + ID id; + long num = r_long(arg); + + if (st_lookup(arg->symbols, num, &id)) { + return id; + } + rb_raise(rb_eArgError, "bad symbol"); +} + +static ID +r_symreal(arg) + struct load_arg *arg; +{ + ID id; + + id = rb_intern(RSTRING(r_bytes(arg))->ptr); + st_insert(arg->symbols, arg->symbols->num_entries, id); + + return id; +} + +static ID +r_symbol(arg) + struct load_arg *arg; +{ + if (r_byte(arg) == TYPE_SYMLINK) { + return r_symlink(arg); + } + return r_symreal(arg); +} + +static char* +r_unique(arg) + struct load_arg *arg; +{ + return rb_id2name(r_symbol(arg)); +} + +static VALUE +r_string(arg) + struct load_arg *arg; +{ + return r_bytes(arg); +} + +static VALUE +r_entry(v, arg) + VALUE v; + struct load_arg *arg; +{ + st_insert(arg->data, arg->data->num_entries, (st_data_t)v); + if (arg->taint) OBJ_TAINT(v); + return v; +} + +static void +r_ivar(obj, arg) + VALUE obj; + struct load_arg *arg; +{ + long len; + + len = r_long(arg); + if (len > 0) { + while (len--) { + ID id = r_symbol(arg); + VALUE val = r_object(arg); + rb_ivar_set(obj, id, val); + } + } +} + +static VALUE +path2class(path) + char *path; +{ + VALUE v = rb_path2class(path); + + if (TYPE(v) != T_CLASS) { + rb_raise(rb_eArgError, "%s does not refer class", path); + } + return v; +} + +static VALUE +path2module(path) + char *path; +{ + VALUE v = rb_path2class(path); + + if (TYPE(v) != T_MODULE) { + rb_raise(rb_eArgError, "%s does not refer module", path); + } + return v; +} + +static VALUE +r_object0(arg, proc, ivp, extmod) + struct load_arg *arg; + VALUE proc; + int *ivp; + VALUE extmod; +{ + VALUE v = Qnil; + int type = r_byte(arg); + long id; + st_data_t link; + + switch (type) { + case TYPE_LINK: + id = r_long(arg); + if (!st_lookup(arg->data, (st_data_t)id, &link)) { + rb_raise(rb_eArgError, "dump format error (unlinked)"); + } + v = (st_data_t)link; + return v; + + case TYPE_IVAR: + { + int ivar = Qtrue; + + v = r_object0(arg, 0, &ivar, extmod); + if (ivar) r_ivar(v, arg); + } + break; + + case TYPE_EXTENDED: + { + VALUE m = path2module(r_unique(arg)); + + if (NIL_P(extmod)) extmod = rb_ary_new2(0); + rb_ary_push(extmod, m); + + v = r_object0(arg, 0, 0, extmod); + while (RARRAY(extmod)->len > 0) { + m = rb_ary_pop(extmod); + rb_extend_object(v, m); + } + } + break; + + case TYPE_UCLASS: + { + VALUE c = path2class(r_unique(arg)); + + if (FL_TEST(c, FL_SINGLETON)) { + rb_raise(rb_eTypeError, "singleton can't be loaded"); + } + v = r_object0(arg, 0, 0, extmod); + if (rb_special_const_p(v) || TYPE(v) == T_OBJECT || TYPE(v) == T_CLASS) { + format_error: + rb_raise(rb_eArgError, "dump format error (user class)"); + } + if (TYPE(v) == T_MODULE || !RTEST(rb_class_inherited_p(c, RBASIC(v)->klass))) { + VALUE tmp = rb_obj_alloc(c); + + if (TYPE(v) != TYPE(tmp)) goto format_error; + } + RBASIC(v)->klass = c; + } + break; + + case TYPE_NIL: + v = Qnil; + break; + + case TYPE_TRUE: + v = Qtrue; + break; + + case TYPE_FALSE: + v = Qfalse; + break; + + case TYPE_FIXNUM: + { + long i = r_long(arg); + v = LONG2FIX(i); + } + break; + + case TYPE_FLOAT: + { + double d, t = 0.0; + VALUE str = r_bytes(arg); + const char *ptr = RSTRING(str)->ptr; + + if (strcmp(ptr, "nan") == 0) { + d = t / t; + } + else if (strcmp(ptr, "inf") == 0) { + d = 1.0 / t; + } + else if (strcmp(ptr, "-inf") == 0) { + d = -1.0 / t; + } + else { + char *e; + d = strtod(ptr, &e); + d = load_mantissa(d, e, RSTRING(str)->len - (e - ptr)); + } + v = rb_float_new(d); + r_entry(v, arg); + } + break; + + case TYPE_BIGNUM: + { + long len; + BDIGIT *digits; + volatile VALUE data; + + NEWOBJ(big, struct RBignum); + OBJSETUP(big, rb_cBignum, T_BIGNUM); + big->sign = (r_byte(arg) == '+'); + len = r_long(arg); + data = r_bytes0(len * 2, arg); +#if SIZEOF_BDIGITS == SIZEOF_SHORT + big->len = len; +#else + big->len = (len + 1) * 2 / sizeof(BDIGIT); +#endif + big->digits = digits = ALLOC_N(BDIGIT, big->len); + MEMCPY(digits, RSTRING(data)->ptr, char, len * 2); +#if SIZEOF_BDIGITS > SIZEOF_SHORT + MEMZERO((char *)digits + len * 2, char, + big->len * sizeof(BDIGIT) - len * 2); +#endif + len = big->len; + while (len > 0) { + unsigned char *p = (unsigned char *)digits; + BDIGIT num = 0; +#if SIZEOF_BDIGITS > SIZEOF_SHORT + int shift = 0; + int i; + + for (i=0; i<SIZEOF_BDIGITS; i++) { + num |= (int)p[i] << shift; + shift += 8; + } +#else + num = p[0] | (p[1] << 8); +#endif + *digits++ = num; + len--; + } + v = rb_big_norm((VALUE)big); + r_entry(v, arg); + } + break; + + case TYPE_STRING: + v = r_entry(r_string(arg), arg); + break; + + case TYPE_REGEXP: + { + volatile VALUE str = r_bytes(arg); + int options = r_byte(arg); + v = r_entry(rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, options), arg); + } + break; + + case TYPE_ARRAY: + { + volatile long len = r_long(arg); /* gcc 2.7.2.3 -O2 bug?? */ + + v = rb_ary_new2(len); + r_entry(v, arg); + while (len--) { + rb_ary_push(v, r_object(arg)); + } + } + break; + + case TYPE_HASH: + case TYPE_HASH_DEF: + { + long len = r_long(arg); + + v = rb_hash_new(); + r_entry(v, arg); + while (len--) { + VALUE key = r_object(arg); + VALUE value = r_object(arg); + rb_hash_aset(v, key, value); + } + if (type == TYPE_HASH_DEF) { + RHASH(v)->ifnone = r_object(arg); + } + } + break; + + case TYPE_STRUCT: + { + VALUE klass, mem, values; + volatile long i; /* gcc 2.7.2.3 -O2 bug?? */ + long len; + ID slot; + + klass = path2class(r_unique(arg)); + mem = rb_struct_s_members(klass); + if (mem == Qnil) { + rb_raise(rb_eTypeError, "uninitialized struct"); + } + len = r_long(arg); + + values = rb_ary_new2(len); + for (i=0; i<len; i++) { + rb_ary_push(values, Qnil); + } + v = rb_struct_alloc(klass, values); + r_entry(v, arg); + for (i=0; i<len; i++) { + slot = r_symbol(arg); + + if (RARRAY(mem)->ptr[i] != ID2SYM(slot)) { + rb_raise(rb_eTypeError, "struct %s not compatible (:%s for :%s)", + rb_class2name(klass), + rb_id2name(slot), + rb_id2name(SYM2ID(RARRAY(mem)->ptr[i]))); + } + rb_struct_aset(v, LONG2FIX(i), r_object(arg)); + } + } + break; + + case TYPE_USERDEF: + { + VALUE klass = path2class(r_unique(arg)); + VALUE data; + + if (!rb_respond_to(klass, s_load)) { + rb_raise(rb_eTypeError, "class %s needs to have method `_load'", + rb_class2name(klass)); + } + data = r_string(arg); + if (ivp) { + r_ivar(data, arg); + *ivp = Qfalse; + } + v = rb_funcall(klass, s_load, 1, data); + check_load_arg(arg, s_load); + r_entry(v, arg); + } + break; + + case TYPE_USRMARSHAL: + { + VALUE klass = path2class(r_unique(arg)); + VALUE data; + + v = rb_obj_alloc(klass); + if (! NIL_P(extmod)) { + while (RARRAY(extmod)->len > 0) { + VALUE m = rb_ary_pop(extmod); + rb_extend_object(v, m); + } + } + if (!rb_respond_to(v, s_mload)) { + rb_raise(rb_eTypeError, "instance of %s needs to have method `marshal_load'", + rb_class2name(klass)); + } + r_entry(v, arg); + data = r_object(arg); + rb_funcall(v, s_mload, 1, data); + check_load_arg(arg, s_mload); + } + break; + + case TYPE_OBJECT: + { + VALUE klass = path2class(r_unique(arg)); + + v = rb_obj_alloc(klass); + if (TYPE(v) != T_OBJECT) { + rb_raise(rb_eArgError, "dump format error"); + } + r_entry(v, arg); + r_ivar(v, arg); + } + break; + + case TYPE_DATA: + { + VALUE klass = path2class(r_unique(arg)); + if (rb_respond_to(klass, s_alloc)) { + static int warn = Qtrue; + if (warn) { + rb_warn("define `allocate' instead of `_alloc'"); + warn = Qfalse; + } + v = rb_funcall(klass, s_alloc, 0); + check_load_arg(arg, s_alloc); + } + else { + v = rb_obj_alloc(klass); + } + if (TYPE(v) != T_DATA) { + rb_raise(rb_eArgError, "dump format error"); + } + r_entry(v, arg); + if (!rb_respond_to(v, s_load_data)) { + rb_raise(rb_eTypeError, + "class %s needs to have instance method `_load_data'", + rb_class2name(klass)); + } + rb_funcall(v, s_load_data, 1, r_object0(arg, 0, 0, extmod)); + check_load_arg(arg, s_load_data); + } + break; + + case TYPE_MODULE_OLD: + { + volatile VALUE str = r_bytes(arg); + + v = rb_path2class(RSTRING(str)->ptr); + r_entry(v, arg); + } + break; + + case TYPE_CLASS: + { + volatile VALUE str = r_bytes(arg); + + v = path2class(RSTRING(str)->ptr); + r_entry(v, arg); + } + break; + + case TYPE_MODULE: + { + volatile VALUE str = r_bytes(arg); + + v = path2module(RSTRING(str)->ptr); + r_entry(v, arg); + } + break; + + case TYPE_SYMBOL: + v = ID2SYM(r_symreal(arg)); + break; + + case TYPE_SYMLINK: + return ID2SYM(r_symlink(arg)); + + default: + rb_raise(rb_eArgError, "dump format error(0x%x)", type); + break; + } + if (proc) { + rb_funcall(proc, s_call, 1, v); + check_load_arg(arg, s_call); + } + return v; +} + +static VALUE +r_object(arg) + struct load_arg *arg; +{ + return r_object0(arg, arg->proc, 0, Qnil); +} + +static VALUE +load(arg) + struct load_arg *arg; +{ + return r_object(arg); +} + +static VALUE +load_ensure(arg) + struct load_arg *arg; +{ + if (!DATA_PTR(arg->wrapper)) return 0; + st_free_table(arg->symbols); + st_free_table(arg->data); + DATA_PTR(arg->wrapper) = 0; + arg->wrapper = 0; + return 0; +} + +/* + * call-seq: + * load( source [, proc] ) => obj + * restore( source [, proc] ) => obj + * + * Returns the result of converting the serialized data in source into a + * Ruby object (possibly with associated subordinate objects). source + * may be either an instance of IO or an object that responds to + * to_str. If proc is specified, it will be passed each object as it + * is deserialized. + */ +static VALUE +marshal_load(argc, argv) + int argc; + VALUE *argv; +{ + VALUE port, proc; + int major, minor; + VALUE v; + struct load_arg arg; + + rb_scan_args(argc, argv, "11", &port, &proc); + v = rb_check_string_type(port); + if (!NIL_P(v)) { + arg.taint = OBJ_TAINTED(port); /* original taintedness */ + port = v; + } + else if (rb_respond_to(port, s_getc) && rb_respond_to(port, s_read)) { + if (rb_respond_to(port, s_binmode)) { + rb_funcall2(port, s_binmode, 0, 0); + } + arg.taint = Qtrue; + } + else { + rb_raise(rb_eTypeError, "instance of IO needed"); + } + arg.src = port; + arg.offset = 0; + arg.symbols = st_init_numtable(); + arg.data = st_init_numtable(); + arg.proc = 0; + arg.wrapper = Data_Wrap_Struct(rb_cData, mark_load_arg, 0, &arg); + + major = r_byte(&arg); + minor = r_byte(&arg); + if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) { + rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\ +\tformat version %d.%d required; %d.%d given", + MARSHAL_MAJOR, MARSHAL_MINOR, major, minor); + } + if (RTEST(ruby_verbose) && minor != MARSHAL_MINOR) { + rb_warn("incompatible marshal file format (can be read)\n\ +\tformat version %d.%d required; %d.%d given", + MARSHAL_MAJOR, MARSHAL_MINOR, major, minor); + } + + if (!NIL_P(proc)) arg.proc = proc; + v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg); + + return v; +} + +/* + * The marshaling library converts collections of Ruby objects into a + * byte stream, allowing them to be stored outside the currently + * active script. This data may subsequently be read and the original + * objects reconstituted. + * Marshaled data has major and minor version numbers stored along + * with the object information. In normal use, marshaling can only + * load data written with the same major version number and an equal + * or lower minor version number. If Ruby's ``verbose'' flag is set + * (normally using -d, -v, -w, or --verbose) the major and minor + * numbers must match exactly. Marshal versioning is independent of + * Ruby's version numbers. You can extract the version by reading the + * first two bytes of marshaled data. + * + * str = Marshal.dump("thing") + * RUBY_VERSION #=> "1.8.0" + * str[0] #=> 4 + * str[1] #=> 8 + * + * Some objects cannot be dumped: if the objects to be dumped include + * bindings, procedure or method objects, instances of class IO, or + * singleton objects, a TypeError will be raised. + * If your class has special serialization needs (for example, if you + * want to serialize in some specific format), or if it contains + * objects that would otherwise not be serializable, you can implement + * your own serialization strategy by defining two methods, _dump and + * _load: + * The instance method _dump should return a String object containing + * all the information necessary to reconstitute objects of this class + * and all referenced objects up to a maximum depth given as an integer + * parameter (a value of -1 implies that you should disable depth checking). + * The class method _load should take a String and return an object of this class. + */ +void +Init_marshal() +{ + VALUE rb_mMarshal = rb_define_module("Marshal"); + + s_dump = rb_intern("_dump"); + s_load = rb_intern("_load"); + s_mdump = rb_intern("marshal_dump"); + s_mload = rb_intern("marshal_load"); + s_dump_data = rb_intern("_dump_data"); + s_load_data = rb_intern("_load_data"); + s_alloc = rb_intern("_alloc"); + s_call = rb_intern("call"); + s_getc = rb_intern("getc"); + s_read = rb_intern("read"); + s_write = rb_intern("write"); + s_binmode = rb_intern("binmode"); + + rb_define_module_function(rb_mMarshal, "dump", marshal_dump, -1); + rb_define_module_function(rb_mMarshal, "load", marshal_load, -1); + rb_define_module_function(rb_mMarshal, "restore", marshal_load, -1); + + rb_define_const(rb_mMarshal, "MAJOR_VERSION", INT2FIX(MARSHAL_MAJOR)); + rb_define_const(rb_mMarshal, "MINOR_VERSION", INT2FIX(MARSHAL_MINOR)); +} + +VALUE +rb_marshal_dump(obj, port) + VALUE obj, port; +{ + int argc = 1; + VALUE argv[2]; + + argv[0] = obj; + argv[1] = port; + if (!NIL_P(port)) argc = 2; + return marshal_dump(argc, argv); +} + +VALUE +rb_marshal_load(port) + VALUE port; +{ + return marshal_load(1, &port); +} +/********************************************************************** + + math.c - + + $Author: shyouhei $ + $Date: 2008-07-02 11:25:48 +0200 (Wed, 02 Jul 2008) $ + created at: Tue Jan 25 14:12:56 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include <math.h> +#include <errno.h> + +VALUE rb_mMath; + +#define Need_Float(x) (x) = rb_Float(x) +#define Need_Float2(x,y) do {\ + Need_Float(x);\ + Need_Float(y);\ +} while (0) + +static void +domain_check(x, msg) + double x; + char *msg; +{ + while(1) { + if (errno) { + rb_sys_fail(msg); + } + if (isnan(x)) { +#if defined(EDOM) + errno = EDOM; +#elif defined(ERANGE) + errno = ERANGE; +#endif + continue; + } + break; + } +} + + +/* + * call-seq: + * Math.atan2(y, x) => float + * + * Computes the arc tangent given <i>y</i> and <i>x</i>. Returns + * -PI..PI. + * + */ + +static VALUE +math_atan2(obj, y, x) + VALUE obj, x, y; +{ + Need_Float2(y, x); + return rb_float_new(atan2(RFLOAT(y)->value, RFLOAT(x)->value)); +} + + +/* + * call-seq: + * Math.cos(x) => float + * + * Computes the cosine of <i>x</i> (expressed in radians). Returns + * -1..1. + */ + +static VALUE +math_cos(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(cos(RFLOAT(x)->value)); +} + +/* + * call-seq: + * Math.sin(x) => float + * + * Computes the sine of <i>x</i> (expressed in radians). Returns + * -1..1. + */ + +static VALUE +math_sin(obj, x) + VALUE obj, x; +{ + Need_Float(x); + + return rb_float_new(sin(RFLOAT(x)->value)); +} + + +/* + * call-seq: + * Math.tan(x) => float + * + * Returns the tangent of <i>x</i> (expressed in radians). + */ + +static VALUE +math_tan(obj, x) + VALUE obj, x; +{ + Need_Float(x); + + return rb_float_new(tan(RFLOAT(x)->value)); +} + +/* + * call-seq: + * Math.acos(x) => float + * + * Computes the arc cosine of <i>x</i>. Returns 0..PI. + */ + +static VALUE +math_acos(obj, x) + VALUE obj, x; +{ + double d; + + Need_Float(x); + errno = 0; + d = acos(RFLOAT(x)->value); + domain_check(d, "acos"); + return rb_float_new(d); +} + +/* + * call-seq: + * Math.asin(x) => float + * + * Computes the arc sine of <i>x</i>. Returns 0..PI. + */ + +static VALUE +math_asin(obj, x) + VALUE obj, x; +{ + double d; + + Need_Float(x); + errno = 0; + d = asin(RFLOAT(x)->value); + domain_check(d, "asin"); + return rb_float_new(d); +} + +/* + * call-seq: + * Math.atan(x) => float + * + * Computes the arc tangent of <i>x</i>. Returns -{PI/2} .. {PI/2}. + */ + +static VALUE +math_atan(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(atan(RFLOAT(x)->value)); +} + +#ifndef HAVE_COSH +double +cosh(x) + double x; +{ + return (exp(x) + exp(-x)) / 2; +} +#endif + +/* + * call-seq: + * Math.cosh(x) => float + * + * Computes the hyperbolic cosine of <i>x</i> (expressed in radians). + */ + +static VALUE +math_cosh(obj, x) + VALUE obj, x; +{ + Need_Float(x); + + return rb_float_new(cosh(RFLOAT(x)->value)); +} + +#ifndef HAVE_SINH +double +sinh(x) + double x; +{ + return (exp(x) - exp(-x)) / 2; +} +#endif + +/* + * call-seq: + * Math.sinh(x) => float + * + * Computes the hyperbolic sine of <i>x</i> (expressed in + * radians). + */ + +static VALUE +math_sinh(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(sinh(RFLOAT(x)->value)); +} + +#ifndef HAVE_TANH +double +tanh(x) + double x; +{ + return sinh(x) / cosh(x); +} +#endif + +/* + * call-seq: + * Math.tanh() => float + * + * Computes the hyperbolic tangent of <i>x</i> (expressed in + * radians). + */ + +static VALUE +math_tanh(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(tanh(RFLOAT(x)->value)); +} + +/* + * call-seq: + * Math.acosh(x) => float + * + * Computes the inverse hyperbolic cosine of <i>x</i>. + */ + +static VALUE +math_acosh(obj, x) + VALUE obj, x; +{ + double d; + + Need_Float(x); + errno = 0; + d = acosh(RFLOAT(x)->value); + domain_check(d, "acosh"); + return rb_float_new(d); +} + +/* + * call-seq: + * Math.asinh(x) => float + * + * Computes the inverse hyperbolic sine of <i>x</i>. + */ + +static VALUE +math_asinh(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(asinh(RFLOAT(x)->value)); +} + +/* + * call-seq: + * Math.atanh(x) => float + * + * Computes the inverse hyperbolic tangent of <i>x</i>. + */ + +static VALUE +math_atanh(obj, x) + VALUE obj, x; +{ + double d; + + Need_Float(x); + errno = 0; + d = atanh(RFLOAT(x)->value); + domain_check(d, "atanh"); + return rb_float_new(d); +} + +/* + * call-seq: + * Math.exp(x) => float + * + * Returns e**x. + */ + +static VALUE +math_exp(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(exp(RFLOAT(x)->value)); +} + +#if defined __CYGWIN__ +# include <cygwin/version.h> +# if CYGWIN_VERSION_DLL_MAJOR < 1005 +# define nan(x) nan() +# endif +# define log(x) ((x) < 0.0 ? nan("") : log(x)) +# define log10(x) ((x) < 0.0 ? nan("") : log10(x)) +#endif + +/* + * call-seq: + * Math.log(numeric) => float + * + * Returns the natural logarithm of <i>numeric</i>. + */ + +static VALUE +math_log(obj, x) + VALUE obj, x; +{ + double d; + + Need_Float(x); + errno = 0; + d = log(RFLOAT(x)->value); + domain_check(d, "log"); + return rb_float_new(d); +} + +/* + * call-seq: + * Math.log10(numeric) => float + * + * Returns the base 10 logarithm of <i>numeric</i>. + */ + +static VALUE +math_log10(obj, x) + VALUE obj, x; +{ + double d; + + Need_Float(x); + errno = 0; + d = log10(RFLOAT(x)->value); + domain_check(d, "log10"); + return rb_float_new(d); +} + +/* + * call-seq: + * Math.sqrt(numeric) => float + * + * Returns the non-negative square root of <i>numeric</i>. + */ + +static VALUE +math_sqrt(obj, x) + VALUE obj, x; +{ + double d; + + Need_Float(x); + errno = 0; + d = sqrt(RFLOAT(x)->value); + domain_check(d, "sqrt"); + return rb_float_new(d); +} + +/* + * call-seq: + * Math.frexp(numeric) => [ fraction, exponent ] + * + * Returns a two-element array containing the normalized fraction (a + * <code>Float</code>) and exponent (a <code>Fixnum</code>) of + * <i>numeric</i>. + * + * fraction, exponent = Math.frexp(1234) #=> [0.6025390625, 11] + * fraction * 2**exponent #=> 1234.0 + */ + +static VALUE +math_frexp(obj, x) + VALUE obj, x; +{ + double d; + int exp; + + Need_Float(x); + + d = frexp(RFLOAT(x)->value, &exp); + return rb_assoc_new(rb_float_new(d), INT2NUM(exp)); +} + +/* + * call-seq: + * Math.ldexp(flt, int) -> float + * + * Returns the value of <i>flt</i>*(2**<i>int</i>). + * + * fraction, exponent = Math.frexp(1234) + * Math.ldexp(fraction, exponent) #=> 1234.0 + */ + +static VALUE +math_ldexp(obj, x, n) + VALUE obj, x, n; +{ + Need_Float(x); + return rb_float_new(ldexp(RFLOAT(x)->value, NUM2INT(n))); +} + +/* + * call-seq: + * Math.hypot(x, y) => float + * + * Returns sqrt(x**2 + y**2), the hypotenuse of a right-angled triangle + * with sides <i>x</i> and <i>y</i>. + * + * Math.hypot(3, 4) #=> 5.0 + */ + +static VALUE +math_hypot(obj, x, y) + VALUE obj, x, y; +{ + Need_Float2(x, y); + return rb_float_new(hypot(RFLOAT(x)->value, RFLOAT(y)->value)); +} + +/* + * call-seq: + * Math.erf(x) => float + * + * Calculates the error function of x. + */ + +static VALUE +math_erf(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(erf(RFLOAT(x)->value)); +} + +/* + * call-seq: + * Math.erfc(x) => float + * + * Calculates the complementary error function of x. + */ + +static VALUE +math_erfc(obj, x) + VALUE obj, x; +{ + Need_Float(x); + return rb_float_new(erfc(RFLOAT(x)->value)); +} + +/* + * The <code>Math</code> module contains module functions for basic + * trigonometric and transcendental functions. See class + * <code>Float</code> for a list of constants that + * define Ruby's floating point accuracy. + */ + + +void +Init_Math() +{ + rb_mMath = rb_define_module("Math"); + +#ifdef M_PI + rb_define_const(rb_mMath, "PI", rb_float_new(M_PI)); +#else + rb_define_const(rb_mMath, "PI", rb_float_new(atan(1.0)*4.0)); +#endif + +#ifdef M_E + rb_define_const(rb_mMath, "E", rb_float_new(M_E)); +#else + rb_define_const(rb_mMath, "E", rb_float_new(exp(1.0))); +#endif + + rb_define_module_function(rb_mMath, "atan2", math_atan2, 2); + rb_define_module_function(rb_mMath, "cos", math_cos, 1); + rb_define_module_function(rb_mMath, "sin", math_sin, 1); + rb_define_module_function(rb_mMath, "tan", math_tan, 1); + + rb_define_module_function(rb_mMath, "acos", math_acos, 1); + rb_define_module_function(rb_mMath, "asin", math_asin, 1); + rb_define_module_function(rb_mMath, "atan", math_atan, 1); + + rb_define_module_function(rb_mMath, "cosh", math_cosh, 1); + rb_define_module_function(rb_mMath, "sinh", math_sinh, 1); + rb_define_module_function(rb_mMath, "tanh", math_tanh, 1); + + rb_define_module_function(rb_mMath, "acosh", math_acosh, 1); + rb_define_module_function(rb_mMath, "asinh", math_asinh, 1); + rb_define_module_function(rb_mMath, "atanh", math_atanh, 1); + + rb_define_module_function(rb_mMath, "exp", math_exp, 1); + rb_define_module_function(rb_mMath, "log", math_log, 1); + rb_define_module_function(rb_mMath, "log10", math_log10, 1); + rb_define_module_function(rb_mMath, "sqrt", math_sqrt, 1); + + rb_define_module_function(rb_mMath, "frexp", math_frexp, 1); + rb_define_module_function(rb_mMath, "ldexp", math_ldexp, 2); + + rb_define_module_function(rb_mMath, "hypot", math_hypot, 2); + + rb_define_module_function(rb_mMath, "erf", math_erf, 1); + rb_define_module_function(rb_mMath, "erfc", math_erfc, 1); +} +/********************************************************************** + + numeric.c - + + $Author: wyhaines $ + $Date: 2009-07-14 17:05:27 +0200 (Tue, 14 Jul 2009) $ + created at: Fri Aug 13 18:33:09 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "env.h" +#include <ctype.h> +#include <math.h> +#include <stdio.h> + +#if defined(__FreeBSD__) && __FreeBSD__ < 4 +#include <floatingpoint.h> +#endif + +#ifdef HAVE_FLOAT_H +#include <float.h> +#endif + +#ifdef HAVE_IEEEFP_H +#include <ieeefp.h> +#endif + +/* use IEEE 64bit values if not defined */ +#ifndef FLT_RADIX +#define FLT_RADIX 2 +#endif +#ifndef FLT_ROUNDS +#define FLT_ROUNDS 1 +#endif +#ifndef DBL_MIN +#define DBL_MIN 2.2250738585072014e-308 +#endif +#ifndef DBL_MAX +#define DBL_MAX 1.7976931348623157e+308 +#endif +#ifndef DBL_MIN_EXP +#define DBL_MIN_EXP (-1021) +#endif +#ifndef DBL_MAX_EXP +#define DBL_MAX_EXP 1024 +#endif +#ifndef DBL_MIN_10_EXP +#define DBL_MIN_10_EXP (-307) +#endif +#ifndef DBL_MAX_10_EXP +#define DBL_MAX_10_EXP 308 +#endif +#ifndef DBL_DIG +#define DBL_DIG 15 +#endif +#ifndef DBL_MANT_DIG +#define DBL_MANT_DIG 53 +#endif +#ifndef DBL_EPSILON +#define DBL_EPSILON 2.2204460492503131e-16 +#endif + +#ifndef HAVE_ROUND +double +round(x) + double x; +{ + double f; + + if (x > 0.0) { + f = floor(x); + x = f + (x - f >= 0.5); + } + else if (x < 0.0) { + f = ceil(x); + x = f - (f - x >= 0.5); + } + return x; +} +#endif + +static ID id_coerce, id_to_i, id_eq; + +VALUE rb_cNumeric; +VALUE rb_cFloat; +VALUE rb_cInteger; +VALUE rb_cFixnum; + +VALUE rb_eZeroDivError; +VALUE rb_eFloatDomainError; + +void +rb_num_zerodiv() +{ + rb_raise(rb_eZeroDivError, "divided by 0"); +} + + +/* + * call-seq: + * num.coerce(numeric) => array + * + * If <i>aNumeric</i> is the same type as <i>num</i>, returns an array + * containing <i>aNumeric</i> and <i>num</i>. Otherwise, returns an + * array with both <i>aNumeric</i> and <i>num</i> represented as + * <code>Float</code> objects. This coercion mechanism is used by + * Ruby to handle mixed-type numeric operations: it is intended to + * find a compatible common type between the two operands of the operator. + * + * 1.coerce(2.5) #=> [2.5, 1.0] + * 1.2.coerce(3) #=> [3.0, 1.2] + * 1.coerce(2) #=> [2, 1] + */ + +static VALUE +num_coerce(x, y) + VALUE x, y; +{ + if (CLASS_OF(x) == CLASS_OF(y)) + return rb_assoc_new(y, x); + x = rb_Float(x); + y = rb_Float(y); + return rb_assoc_new(y, x); +} + +static VALUE +coerce_body(x) + VALUE *x; +{ + return rb_funcall(x[1], id_coerce, 1, x[0]); +} + +static VALUE +coerce_rescue(x) + VALUE *x; +{ + volatile VALUE v = rb_inspect(x[1]); + + rb_raise(rb_eTypeError, "%s can't be coerced into %s", + rb_special_const_p(x[1])? + RSTRING(v)->ptr: + rb_obj_classname(x[1]), + rb_obj_classname(x[0])); + return Qnil; /* dummy */ +} + +static int +do_coerce(x, y, err) + VALUE *x, *y; + int err; +{ + VALUE ary; + VALUE a[2]; + + a[0] = *x; a[1] = *y; + + ary = rb_rescue(coerce_body, (VALUE)a, err?coerce_rescue:0, (VALUE)a); + if (TYPE(ary) != T_ARRAY || RARRAY(ary)->len != 2) { + if (err) { + rb_raise(rb_eTypeError, "coerce must return [x, y]"); + } + return Qfalse; + } + + *x = RARRAY(ary)->ptr[0]; + *y = RARRAY(ary)->ptr[1]; + return Qtrue; +} + +VALUE +rb_num_coerce_bin(x, y) + VALUE x, y; +{ + do_coerce(&x, &y, Qtrue); + return rb_funcall(x, ruby_frame->orig_func, 1, y); +} + +VALUE +rb_num_coerce_cmp(x, y) + VALUE x, y; +{ + if (do_coerce(&x, &y, Qfalse)) + return rb_funcall(x, ruby_frame->orig_func, 1, y); + return Qnil; +} + +VALUE +rb_num_coerce_relop(x, y) + VALUE x, y; +{ + VALUE c, x0 = x, y0 = y; + + if (!do_coerce(&x, &y, Qfalse) || + NIL_P(c = rb_funcall(x, ruby_frame->orig_func, 1, y))) { + rb_cmperr(x0, y0); + return Qnil; /* not reached */ + } + return c; +} + +/* + * Trap attempts to add methods to <code>Numeric</code> objects. Always + * raises a <code>TypeError</code> + */ + +static VALUE +num_sadded(x, name) + VALUE x, name; +{ + ruby_frame = ruby_frame->prev; /* pop frame for "singleton_method_added" */ + /* Numerics should be values; singleton_methods should not be added to them */ + rb_raise(rb_eTypeError, + "can't define singleton method \"%s\" for %s", + rb_id2name(rb_to_id(name)), + rb_obj_classname(x)); + return Qnil; /* not reached */ +} + +/* :nodoc: */ +static VALUE +num_init_copy(x, y) + VALUE x, y; +{ + /* Numerics are immutable values, which should not be copied */ + rb_raise(rb_eTypeError, "can't copy %s", rb_obj_classname(x)); + return Qnil; /* not reached */ +} + +/* + * call-seq: + * +num => num + * + * Unary Plus---Returns the receiver's value. + */ + +static VALUE +num_uplus(num) + VALUE num; +{ + return num; +} + +/* + * call-seq: + * -num => numeric + * + * Unary Minus---Returns the receiver's value, negated. + */ + +static VALUE +num_uminus(num) + VALUE num; +{ + VALUE zero; + + zero = INT2FIX(0); + do_coerce(&zero, &num, Qtrue); + + return rb_funcall(zero, '-', 1, num); +} + +/* + * call-seq: + * num.quo(numeric) => result + * + * Equivalent to <code>Numeric#/</code>, but overridden in subclasses. + */ + +static VALUE +num_quo(x, y) + VALUE x, y; +{ + return rb_funcall(x, '/', 1, y); +} + + +static VALUE num_floor(VALUE num); + +/* + * call-seq: + * num.div(numeric) => integer + * + * Uses <code>/</code> to perform division, then converts the result to + * an integer. <code>Numeric</code> does not define the <code>/</code> + * operator; this is left to subclasses. + */ + +static VALUE +num_div(x, y) + VALUE x, y; +{ + return num_floor(rb_funcall(x, '/', 1, y)); +} + + + +/* + * call-seq: + * num.divmod( aNumeric ) -> anArray + * + * Returns an array containing the quotient and modulus obtained by + * dividing <i>num</i> by <i>aNumeric</i>. If <code>q, r = + * x.divmod(y)</code>, then + * + * q = floor(float(x)/float(y)) + * x = q*y + r + * + * The quotient is rounded toward -infinity, as shown in the following table: + * + * a | b | a.divmod(b) | a/b | a.modulo(b) | a.remainder(b) + * ------+-----+---------------+---------+-------------+--------------- + * 13 | 4 | 3, 1 | 3 | 1 | 1 + * ------+-----+---------------+---------+-------------+--------------- + * 13 | -4 | -4, -3 | -3 | -3 | 1 + * ------+-----+---------------+---------+-------------+--------------- + * -13 | 4 | -4, 3 | -4 | 3 | -1 + * ------+-----+---------------+---------+-------------+--------------- + * -13 | -4 | 3, -1 | 3 | -1 | -1 + * ------+-----+---------------+---------+-------------+--------------- + * 11.5 | 4 | 2, 3.5 | 2.875 | 3.5 | 3.5 + * ------+-----+---------------+---------+-------------+--------------- + * 11.5 | -4 | -3, -0.5 | -2.875 | -0.5 | 3.5 + * ------+-----+---------------+---------+-------------+--------------- + * -11.5 | 4 | -3, 0.5 | -2.875 | 0.5 | -3.5 + * ------+-----+---------------+---------+-------------+--------------- + * -11.5 | -4 | 2 -3.5 | 2.875 | -3.5 | -3.5 + * + * + * Examples + * 11.divmod(3) #=> [3, 2] + * 11.divmod(-3) #=> [-4, -1] + * 11.divmod(3.5) #=> [3, 0.5] + * (-11).divmod(3.5) #=> [-4, 3.0] + * (11.5).divmod(3.5) #=> [3, 1.0] + */ + +static VALUE +num_divmod(x, y) + VALUE x, y; +{ + return rb_assoc_new(num_div(x, y), rb_funcall(x, '%', 1, y)); +} + +/* + * call-seq: + * num.modulo(numeric) => result + * + * Equivalent to + * <i>num</i>.<code>divmod(</code><i>aNumeric</i><code>)[1]</code>. + */ + +static VALUE +num_modulo(x, y) + VALUE x, y; +{ + return rb_funcall(x, '%', 1, y); +} + +/* + * call-seq: + * num.remainder(numeric) => result + * + * If <i>num</i> and <i>numeric</i> have different signs, returns + * <em>mod</em>-<i>numeric</i>; otherwise, returns <em>mod</em>. In + * both cases <em>mod</em> is the value + * <i>num</i>.<code>modulo(</code><i>numeric</i><code>)</code>. The + * differences between <code>remainder</code> and modulo + * (<code>%</code>) are shown in the table under <code>Numeric#divmod</code>. + */ + +static VALUE +num_remainder(x, y) + VALUE x, y; +{ + VALUE z = rb_funcall(x, '%', 1, y); + + if ((!rb_equal(z, INT2FIX(0))) && + ((RTEST(rb_funcall(x, '<', 1, INT2FIX(0))) && + RTEST(rb_funcall(y, '>', 1, INT2FIX(0)))) || + (RTEST(rb_funcall(x, '>', 1, INT2FIX(0))) && + RTEST(rb_funcall(y, '<', 1, INT2FIX(0)))))) { + return rb_funcall(z, '-', 1, y); + } + return z; +} + +/* + * call-seq: + * num.integer? -> true or false + * + * Returns <code>true</code> if <i>num</i> is an <code>Integer</code> + * (including <code>Fixnum</code> and <code>Bignum</code>). + */ + +static VALUE +num_int_p(num) + VALUE num; +{ + return Qfalse; +} + +/* + * call-seq: + * num.abs => num or numeric + * + * Returns the absolute value of <i>num</i>. + * + * 12.abs #=> 12 + * (-34.56).abs #=> 34.56 + * -34.56.abs #=> 34.56 + */ + +static VALUE +num_abs(num) + VALUE num; +{ + if (RTEST(rb_funcall(num, '<', 1, INT2FIX(0)))) { + return rb_funcall(num, rb_intern("-@"), 0); + } + return num; +} + + +/* + * call-seq: + * num.zero? => true or false + * + * Returns <code>true</code> if <i>num</i> has a zero value. + */ + +static VALUE +num_zero_p(num) + VALUE num; +{ + if (rb_equal(num, INT2FIX(0))) { + return Qtrue; + } + return Qfalse; +} + + +/* + * call-seq: + * num.nonzero? => num or nil + * + * Returns <i>num</i> if <i>num</i> is not zero, <code>nil</code> + * otherwise. This behavior is useful when chaining comparisons: + * + * a = %w( z Bb bB bb BB a aA Aa AA A ) + * b = a.sort {|a,b| (a.downcase <=> b.downcase).nonzero? || a <=> b } + * b #=> ["A", "a", "AA", "Aa", "aA", "BB", "Bb", "bB", "bb", "z"] + */ + +static VALUE +num_nonzero_p(num) + VALUE num; +{ + if (RTEST(rb_funcall(num, rb_intern("zero?"), 0, 0))) { + return Qnil; + } + return num; +} + +/* + * call-seq: + * num.to_int => integer + * + * Invokes the child class's <code>to_i</code> method to convert + * <i>num</i> to an integer. + */ + +static VALUE +num_to_int(num) + VALUE num; +{ + return rb_funcall(num, id_to_i, 0, 0); +} + + +/******************************************************************** + * + * Document-class: Float + * + * <code>Float</code> objects represent real numbers using the native + * architecture's double-precision floating point representation. + */ + +VALUE +rb_float_new(d) + double d; +{ + NEWOBJ(flt, struct RFloat); + OBJSETUP(flt, rb_cFloat, T_FLOAT); + + flt->value = d; + return (VALUE)flt; +} + +/* + * call-seq: + * flt.to_s => string + * + * Returns a string containing a representation of self. As well as a + * fixed or exponential form of the number, the call may return + * ``<code>NaN</code>'', ``<code>Infinity</code>'', and + * ``<code>-Infinity</code>''. + */ + +static VALUE +flo_to_s(flt) + VALUE flt; +{ + char buf[32]; + double value = RFLOAT(flt)->value; + char *p, *e; + + if (isinf(value)) + return rb_str_new2(value < 0 ? "-Infinity" : "Infinity"); + else if(isnan(value)) + return rb_str_new2("NaN"); + + sprintf(buf, "%#.15g", value); /* ensure to print decimal point */ + if (!(e = strchr(buf, 'e'))) { + e = buf + strlen(buf); + } + if (!ISDIGIT(e[-1])) { /* reformat if ended with decimal point (ex 111111111111111.) */ + sprintf(buf, "%#.14e", value); + if (!(e = strchr(buf, 'e'))) { + e = buf + strlen(buf); + } + } + p = e; + while (p[-1]=='0' && ISDIGIT(p[-2])) + p--; + memmove(p, e, strlen(e)+1); + return rb_str_new2(buf); +} + +/* + * MISSING: documentation + */ + +static VALUE +flo_coerce(x, y) + VALUE x, y; +{ + return rb_assoc_new(rb_Float(y), x); +} + +/* + * call-seq: + * -float => float + * + * Returns float, negated. + */ + +static VALUE +flo_uminus(flt) + VALUE flt; +{ + return rb_float_new(-RFLOAT(flt)->value); +} + +/* + * call-seq: + * float + other => float + * + * Returns a new float which is the sum of <code>float</code> + * and <code>other</code>. + */ + +static VALUE +flo_plus(x, y) + VALUE x, y; +{ + switch (TYPE(y)) { + case T_FIXNUM: + return rb_float_new(RFLOAT(x)->value + (double)FIX2LONG(y)); + case T_BIGNUM: + return rb_float_new(RFLOAT(x)->value + rb_big2dbl(y)); + case T_FLOAT: + return rb_float_new(RFLOAT(x)->value + RFLOAT(y)->value); + default: + return rb_num_coerce_bin(x, y); + } +} + +/* + * call-seq: + * float + other => float + * + * Returns a new float which is the difference of <code>float</code> + * and <code>other</code>. + */ + +static VALUE +flo_minus(x, y) + VALUE x, y; +{ + switch (TYPE(y)) { + case T_FIXNUM: + return rb_float_new(RFLOAT(x)->value - (double)FIX2LONG(y)); + case T_BIGNUM: + return rb_float_new(RFLOAT(x)->value - rb_big2dbl(y)); + case T_FLOAT: + return rb_float_new(RFLOAT(x)->value - RFLOAT(y)->value); + default: + return rb_num_coerce_bin(x, y); + } +} + +/* + * call-seq: + * float * other => float + * + * Returns a new float which is the product of <code>float</code> + * and <code>other</code>. + */ + +static VALUE +flo_mul(x, y) + VALUE x, y; +{ + switch (TYPE(y)) { + case T_FIXNUM: + return rb_float_new(RFLOAT(x)->value * (double)FIX2LONG(y)); + case T_BIGNUM: + return rb_float_new(RFLOAT(x)->value * rb_big2dbl(y)); + case T_FLOAT: + return rb_float_new(RFLOAT(x)->value * RFLOAT(y)->value); + default: + return rb_num_coerce_bin(x, y); + } +} + +/* + * call-seq: + * float / other => float + * + * Returns a new float which is the result of dividing + * <code>float</code> by <code>other</code>. + */ + +static VALUE +flo_div(x, y) + VALUE x, y; +{ + long f_y; + double d; + + switch (TYPE(y)) { + case T_FIXNUM: + f_y = FIX2LONG(y); + return rb_float_new(RFLOAT(x)->value / (double)f_y); + case T_BIGNUM: + d = rb_big2dbl(y); + return rb_float_new(RFLOAT(x)->value / d); + case T_FLOAT: + return rb_float_new(RFLOAT(x)->value / RFLOAT(y)->value); + default: + return rb_num_coerce_bin(x, y); + } +} + + +static void +flodivmod(x, y, divp, modp) + double x, y; + double *divp, *modp; +{ + double div, mod; + +#ifdef HAVE_FMOD + mod = fmod(x, y); +#else + { + double z; + + modf(x/y, &z); + mod = x - z * y; + } +#endif + if (isinf(x) && !isinf(y) && !isnan(y)) + div = x; + else + div = (x - mod) / y; + if (y*mod < 0) { + mod += y; + div -= 1.0; + } + if (modp) *modp = mod; + if (divp) *divp = div; +} + + +/* + * call-seq: + * flt % other => float + * flt.modulo(other) => float + * + * Return the modulo after division of <code>flt</code> by <code>other</code>. + * + * 6543.21.modulo(137) #=> 104.21 + * 6543.21.modulo(137.24) #=> 92.9299999999996 + */ + +static VALUE +flo_mod(x, y) + VALUE x, y; +{ + double fy, mod; + + switch (TYPE(y)) { + case T_FIXNUM: + fy = (double)FIX2LONG(y); + break; + case T_BIGNUM: + fy = rb_big2dbl(y); + break; + case T_FLOAT: + fy = RFLOAT(y)->value; + break; + default: + return rb_num_coerce_bin(x, y); + } + flodivmod(RFLOAT(x)->value, fy, 0, &mod); + return rb_float_new(mod); +} + +/* + * call-seq: + * flt.divmod(numeric) => array + * + * See <code>Numeric#divmod</code>. + */ + +static VALUE +flo_divmod(x, y) + VALUE x, y; +{ + double fy, div, mod, val; + volatile VALUE a, b; + + switch (TYPE(y)) { + case T_FIXNUM: + fy = (double)FIX2LONG(y); + break; + case T_BIGNUM: + fy = rb_big2dbl(y); + break; + case T_FLOAT: + fy = RFLOAT(y)->value; + break; + default: + return rb_num_coerce_bin(x, y); + } + flodivmod(RFLOAT(x)->value, fy, &div, &mod); + if (FIXABLE(div)) { + val = round(div); + a = LONG2FIX(val); + } + else { + a = rb_dbl2big(div); + } + b = rb_float_new(mod); + return rb_assoc_new(a, b); +} + +/* + * call-seq: + * + * flt ** other => float + * + * Raises <code>float</code> the <code>other</code> power. + */ + +static VALUE +flo_pow(x, y) + VALUE x, y; +{ + switch (TYPE(y)) { + case T_FIXNUM: + return rb_float_new(pow(RFLOAT(x)->value, (double)FIX2LONG(y))); + case T_BIGNUM: + return rb_float_new(pow(RFLOAT(x)->value, rb_big2dbl(y))); + case T_FLOAT: + return rb_float_new(pow(RFLOAT(x)->value, RFLOAT(y)->value)); + default: + return rb_num_coerce_bin(x, y); + } +} + +/* + * call-seq: + * num.eql?(numeric) => true or false + * + * Returns <code>true</code> if <i>num</i> and <i>numeric</i> are the + * same type and have equal values. + * + * 1 == 1.0 #=> true + * 1.eql?(1.0) #=> false + * (1.0).eql?(1.0) #=> true + */ + +static VALUE +num_eql(x, y) + VALUE x, y; +{ + if (TYPE(x) != TYPE(y)) return Qfalse; + + return rb_equal(x, y); +} + +/* + * call-seq: + * num <=> other -> 0 or nil + * + * Returns zero if <i>num</i> equals <i>other</i>, <code>nil</code> + * otherwise. + */ + +static VALUE +num_cmp(x, y) + VALUE x, y; +{ + if (x == y) return INT2FIX(0); + return Qnil; +} + +static VALUE +num_equal(x, y) + VALUE x, y; +{ + if (x == y) return Qtrue; + return rb_funcall(y, id_eq, 1, x); +} + +/* + * call-seq: + * flt == obj => true or false + * + * Returns <code>true</code> only if <i>obj</i> has the same value + * as <i>flt</i>. Contrast this with <code>Float#eql?</code>, which + * requires <i>obj</i> to be a <code>Float</code>. + * + * 1.0 == 1 #=> true + * + */ + +static VALUE +flo_eq(x, y) + VALUE x, y; +{ + volatile double a, b; + + switch (TYPE(y)) { + case T_FIXNUM: + b = FIX2LONG(y); + break; + case T_BIGNUM: + b = rb_big2dbl(y); + break; + case T_FLOAT: + b = RFLOAT(y)->value; + if (isnan(b)) return Qfalse; + break; + default: + return num_equal(x, y); + } + a = RFLOAT(x)->value; + if (isnan(a)) return Qfalse; + return (a == b)?Qtrue:Qfalse; +} + +/* + * call-seq: + * flt.hash => integer + * + * Returns a hash code for this float. + */ + +static VALUE +flo_hash(num) + VALUE num; +{ + double d; + char *c; + int i, hash; + + d = RFLOAT(num)->value; + if (d == 0) d = fabs(d); + c = (char*)&d; + for (hash=0, i=0; i<sizeof(double);i++) { + hash = (hash * 971) ^ (unsigned char)c[i]; + } + if (hash < 0) hash = -hash; + return INT2FIX(hash); +} + +VALUE +rb_dbl_cmp(a, b) + double a, b; +{ + if (isnan(a) || isnan(b)) return Qnil; + if (a == b) return INT2FIX(0); + if (a > b) return INT2FIX(1); + if (a < b) return INT2FIX(-1); + return Qnil; +} + +/* + * call-seq: + * flt <=> numeric => -1, 0, +1 + * + * Returns -1, 0, or +1 depending on whether <i>flt</i> is less than, + * equal to, or greater than <i>numeric</i>. This is the basis for the + * tests in <code>Comparable</code>. + */ + +static VALUE +flo_cmp(x, y) + VALUE x, y; +{ + double a, b; + + a = RFLOAT(x)->value; + switch (TYPE(y)) { + case T_FIXNUM: + b = (double)FIX2LONG(y); + break; + + case T_BIGNUM: + if (isinf(a)) { + if (a > 0.0) return INT2FIX(1); + else return INT2FIX(-1); + } + b = rb_big2dbl(y); + break; + + case T_FLOAT: + b = RFLOAT(y)->value; + break; + + default: + return rb_num_coerce_cmp(x, y); + } + return rb_dbl_cmp(a, b); +} + +/* + * call-seq: + * flt > other => true or false + * + * <code>true</code> if <code>flt</code> is greater than <code>other</code>. + */ + +static VALUE +flo_gt(x, y) + VALUE x, y; +{ + double a, b; + + a = RFLOAT(x)->value; + switch (TYPE(y)) { + case T_FIXNUM: + b = (double)FIX2LONG(y); + break; + + case T_BIGNUM: + b = rb_big2dbl(y); + break; + + case T_FLOAT: + b = RFLOAT(y)->value; + if (isnan(b)) return Qfalse; + break; + + default: + return rb_num_coerce_relop(x, y); + } + if (isnan(a)) return Qfalse; + return (a > b)?Qtrue:Qfalse; +} + +/* + * call-seq: + * flt >= other => true or false + * + * <code>true</code> if <code>flt</code> is greater than + * or equal to <code>other</code>. + */ + +static VALUE +flo_ge(x, y) + VALUE x, y; +{ + double a, b; + + a = RFLOAT(x)->value; + switch (TYPE(y)) { + case T_FIXNUM: + b = (double)FIX2LONG(y); + break; + + case T_BIGNUM: + b = rb_big2dbl(y); + break; + + case T_FLOAT: + b = RFLOAT(y)->value; + if (isnan(b)) return Qfalse; + break; + + default: + return rb_num_coerce_relop(x, y); + } + if (isnan(a)) return Qfalse; + return (a >= b)?Qtrue:Qfalse; +} + +/* + * call-seq: + * flt < other => true or false + * + * <code>true</code> if <code>flt</code> is less than <code>other</code>. + */ + +static VALUE +flo_lt(x, y) + VALUE x, y; +{ + double a, b; + + a = RFLOAT(x)->value; + switch (TYPE(y)) { + case T_FIXNUM: + b = (double)FIX2LONG(y); + break; + + case T_BIGNUM: + b = rb_big2dbl(y); + break; + + case T_FLOAT: + b = RFLOAT(y)->value; + if (isnan(b)) return Qfalse; + break; + + default: + return rb_num_coerce_relop(x, y); + } + if (isnan(a)) return Qfalse; + return (a < b)?Qtrue:Qfalse; +} + +/* + * call-seq: + * flt <= other => true or false + * + * <code>true</code> if <code>flt</code> is less than + * or equal to <code>other</code>. + */ + +static VALUE +flo_le(x, y) + VALUE x, y; +{ + double a, b; + + a = RFLOAT(x)->value; + switch (TYPE(y)) { + case T_FIXNUM: + b = (double)FIX2LONG(y); + break; + + case T_BIGNUM: + b = rb_big2dbl(y); + break; + + case T_FLOAT: + b = RFLOAT(y)->value; + if (isnan(b)) return Qfalse; + break; + + default: + return rb_num_coerce_relop(x, y); + } + if (isnan(a)) return Qfalse; + return (a <= b)?Qtrue:Qfalse; +} + +/* + * call-seq: + * flt.eql?(obj) => true or false + * + * Returns <code>true</code> only if <i>obj</i> is a + * <code>Float</code> with the same value as <i>flt</i>. Contrast this + * with <code>Float#==</code>, which performs type conversions. + * + * 1.0.eql?(1) #=> false + */ + +static VALUE +flo_eql(x, y) + VALUE x, y; +{ + if (TYPE(y) == T_FLOAT) { + double a = RFLOAT(x)->value; + double b = RFLOAT(y)->value; + + if (isnan(a) || isnan(b)) return Qfalse; + if (a == b) return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * flt.to_f => flt + * + * As <code>flt</code> is already a float, returns <i>self</i>. + */ + +static VALUE +flo_to_f(num) + VALUE num; +{ + return num; +} + +/* + * call-seq: + * flt.abs => float + * + * Returns the absolute value of <i>flt</i>. + * + * (-34.56).abs #=> 34.56 + * -34.56.abs #=> 34.56 + * + */ + +static VALUE +flo_abs(flt) + VALUE flt; +{ + double val = fabs(RFLOAT(flt)->value); + return rb_float_new(val); +} + +/* + * call-seq: + * flt.zero? -> true or false + * + * Returns <code>true</code> if <i>flt</i> is 0.0. + * + */ + +static VALUE +flo_zero_p(num) + VALUE num; +{ + if (RFLOAT(num)->value == 0.0) { + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * flt.nan? -> true or false + * + * Returns <code>true</code> if <i>flt</i> is an invalid IEEE floating + * point number. + * + * a = -1.0 #=> -1.0 + * a.nan? #=> false + * a = 0.0/0.0 #=> NaN + * a.nan? #=> true + */ + +static VALUE +flo_is_nan_p(num) + VALUE num; +{ + double value = RFLOAT(num)->value; + + return isnan(value) ? Qtrue : Qfalse; +} + +/* + * call-seq: + * flt.infinite? -> nil, -1, +1 + * + * Returns <code>nil</code>, -1, or +1 depending on whether <i>flt</i> + * is finite, -infinity, or +infinity. + * + * (0.0).infinite? #=> nil + * (-1.0/0.0).infinite? #=> -1 + * (+1.0/0.0).infinite? #=> 1 + */ + +static VALUE +flo_is_infinite_p(num) + VALUE num; +{ + double value = RFLOAT(num)->value; + + if (isinf(value)) { + return INT2FIX( value < 0 ? -1 : 1 ); + } + + return Qnil; +} + +/* + * call-seq: + * flt.finite? -> true or false + * + * Returns <code>true</code> if <i>flt</i> is a valid IEEE floating + * point number (it is not infinite, and <code>nan?</code> is + * <code>false</code>). + * + */ + +static VALUE +flo_is_finite_p(num) + VALUE num; +{ + double value = RFLOAT(num)->value; + +#if HAVE_FINITE + if (!finite(value)) + return Qfalse; +#else + if (isinf(value) || isnan(value)) + return Qfalse; +#endif + + return Qtrue; +} + +/* + * call-seq: + * flt.floor => integer + * + * Returns the largest integer less than or equal to <i>flt</i>. + * + * 1.2.floor #=> 1 + * 2.0.floor #=> 2 + * (-1.2).floor #=> -2 + * (-2.0).floor #=> -2 + */ + +static VALUE +flo_floor(num) + VALUE num; +{ + double f = floor(RFLOAT(num)->value); + long val; + + if (!FIXABLE(f)) { + return rb_dbl2big(f); + } + val = f; + return LONG2FIX(val); +} + +/* + * call-seq: + * flt.ceil => integer + * + * Returns the smallest <code>Integer</code> greater than or equal to + * <i>flt</i>. + * + * 1.2.ceil #=> 2 + * 2.0.ceil #=> 2 + * (-1.2).ceil #=> -1 + * (-2.0).ceil #=> -2 + */ + +static VALUE +flo_ceil(num) + VALUE num; +{ + double f = ceil(RFLOAT(num)->value); + long val; + + if (!FIXABLE(f)) { + return rb_dbl2big(f); + } + val = f; + return LONG2FIX(val); +} + +/* + * call-seq: + * flt.round => integer + * + * Rounds <i>flt</i> to the nearest integer. Equivalent to: + * + * def round + * return (self+0.5).floor if self > 0.0 + * return (self-0.5).ceil if self < 0.0 + * return 0 + * end + * + * 1.5.round #=> 2 + * (-1.5).round #=> -2 + * + */ + +static VALUE +flo_round(num) + VALUE num; +{ + double f = RFLOAT(num)->value; + long val; + + f = round(f); + + if (!FIXABLE(f)) { + return rb_dbl2big(f); + } + val = f; + return LONG2FIX(val); +} + +/* + * call-seq: + * flt.to_i => integer + * flt.to_int => integer + * flt.truncate => integer + * + * Returns <i>flt</i> truncated to an <code>Integer</code>. + */ + +static VALUE +flo_truncate(num) + VALUE num; +{ + double f = RFLOAT(num)->value; + long val; + + if (f > 0.0) f = floor(f); + if (f < 0.0) f = ceil(f); + + if (!FIXABLE(f)) { + return rb_dbl2big(f); + } + val = f; + return LONG2FIX(val); +} + + +/* + * call-seq: + * num.floor => integer + * + * Returns the largest integer less than or equal to <i>num</i>. + * <code>Numeric</code> implements this by converting <i>anInteger</i> + * to a <code>Float</code> and invoking <code>Float#floor</code>. + * + * 1.floor #=> 1 + * (-1).floor #=> -1 + */ + +static VALUE +num_floor(num) + VALUE num; +{ + return flo_floor(rb_Float(num)); +} + + +/* + * call-seq: + * num.ceil => integer + * + * Returns the smallest <code>Integer</code> greater than or equal to + * <i>num</i>. Class <code>Numeric</code> achieves this by converting + * itself to a <code>Float</code> then invoking + * <code>Float#ceil</code>. + * + * 1.ceil #=> 1 + * 1.2.ceil #=> 2 + * (-1.2).ceil #=> -1 + * (-1.0).ceil #=> -1 + */ + +static VALUE +num_ceil(num) + VALUE num; +{ + return flo_ceil(rb_Float(num)); +} + +/* + * call-seq: + * num.round => integer + * + * Rounds <i>num</i> to the nearest integer. <code>Numeric</code> + * implements this by converting itself to a + * <code>Float</code> and invoking <code>Float#round</code>. + */ + +static VALUE +num_round(num) + VALUE num; +{ + return flo_round(rb_Float(num)); +} + +/* + * call-seq: + * num.truncate => integer + * + * Returns <i>num</i> truncated to an integer. <code>Numeric</code> + * implements this by converting its value to a float and invoking + * <code>Float#truncate</code>. + */ + +static VALUE +num_truncate(num) + VALUE num; +{ + return flo_truncate(rb_Float(num)); +} + + +/* + * call-seq: + * num.step(limit, step ) {|i| block } => num + * + * Invokes <em>block</em> with the sequence of numbers starting at + * <i>num</i>, incremented by <i>step</i> on each call. The loop + * finishes when the value to be passed to the block is greater than + * <i>limit</i> (if <i>step</i> is positive) or less than + * <i>limit</i> (if <i>step</i> is negative). If all the arguments are + * integers, the loop operates using an integer counter. If any of the + * arguments are floating point numbers, all are converted to floats, + * and the loop is executed <i>floor(n + n*epsilon)+ 1</i> times, + * where <i>n = (limit - num)/step</i>. Otherwise, the loop + * starts at <i>num</i>, uses either the <code><</code> or + * <code>></code> operator to compare the counter against + * <i>limit</i>, and increments itself using the <code>+</code> + * operator. + * + * 1.step(10, 2) { |i| print i, " " } + * Math::E.step(Math::PI, 0.2) { |f| print f, " " } + * + * <em>produces:</em> + * + * 1 3 5 7 9 + * 2.71828182845905 2.91828182845905 3.11828182845905 + */ + +static VALUE +num_step(argc, argv, from) + int argc; + VALUE *argv; + VALUE from; +{ + VALUE to, step; + + if (argc == 1) { + to = argv[0]; + step = INT2FIX(1); + } + else { + if (argc == 2) { + to = argv[0]; + step = argv[1]; + } + else { + rb_raise(rb_eArgError, "wrong number of arguments"); + } + if (rb_equal(step, INT2FIX(0))) { + rb_raise(rb_eArgError, "step can't be 0"); + } + } + + if (FIXNUM_P(from) && FIXNUM_P(to) && FIXNUM_P(step)) { + long i, end, diff; + + i = FIX2LONG(from); + end = FIX2LONG(to); + diff = FIX2LONG(step); + + if (diff > 0) { + while (i <= end) { + rb_yield(LONG2FIX(i)); + i += diff; + } + } + else { + while (i >= end) { + rb_yield(LONG2FIX(i)); + i += diff; + } + } + } + else if (TYPE(from) == T_FLOAT || TYPE(to) == T_FLOAT || TYPE(step) == T_FLOAT) { + const double epsilon = DBL_EPSILON; + double beg = NUM2DBL(from); + double end = NUM2DBL(to); + double unit = NUM2DBL(step); + double n = (end - beg)/unit; + double err = (fabs(beg) + fabs(end) + fabs(end-beg)) / fabs(unit) * epsilon; + long i; + + if (err>0.5) err=0.5; + n = floor(n + err) + 1; + for (i=0; i<n; i++) { + rb_yield(rb_float_new(i*unit+beg)); + } + } + else { + VALUE i = from; + ID cmp; + + if (RTEST(rb_funcall(step, '>', 1, INT2FIX(0)))) { + cmp = '>'; + } + else { + cmp = '<'; + } + for (;;) { + if (RTEST(rb_funcall(i, cmp, 1, to))) break; + rb_yield(i); + i = rb_funcall(i, '+', 1, step); + } + } + return from; +} + +long +rb_num2long(val) + VALUE val; +{ + again: + if (NIL_P(val)) { + rb_raise(rb_eTypeError, "no implicit conversion from nil to integer"); + } + + if (FIXNUM_P(val)) return FIX2LONG(val); + + switch (TYPE(val)) { + case T_FLOAT: + if (RFLOAT(val)->value <= (double)LONG_MAX + && RFLOAT(val)->value >= (double)LONG_MIN) { + return (long)(RFLOAT(val)->value); + } + else { + char buf[24]; + char *s; + + sprintf(buf, "%-.10g", RFLOAT(val)->value); + if ((s = strchr(buf, ' ')) != 0) *s = '\0'; + rb_raise(rb_eRangeError, "float %s out of range of integer", buf); + } + + case T_BIGNUM: + return rb_big2long(val); + + default: + val = rb_to_int(val); + goto again; + } +} + +unsigned long +rb_num2ulong(val) + VALUE val; +{ + if (TYPE(val) == T_BIGNUM) { + return rb_big2ulong(val); + } + return (unsigned long)rb_num2long(val); +} + +#if SIZEOF_INT < SIZEOF_LONG +static void +check_int(num) + long num; +{ + const char *s; + + if (num < INT_MIN) { + s = "small"; + } + else if (num > INT_MAX) { + s = "big"; + } + else { + return; + } + rb_raise(rb_eRangeError, "integer %ld too %s to convert to `int'", num, s); +} + +static void +check_uint(num, sign) + unsigned long num; + VALUE sign; +{ + static const unsigned long mask = ~(unsigned long)UINT_MAX; + + if (RTEST(sign)) { + /* minus */ + if ((num & mask) != mask || (num & ~mask) <= INT_MAX + 1UL) + rb_raise(rb_eRangeError, "integer %ld too small to convert to `unsigned int'", num); + } + else { + /* plus */ + if ((num & mask) != 0) + rb_raise(rb_eRangeError, "integer %lu too big to convert to `unsigned int'", num); + } +} + +long +rb_num2int(val) + VALUE val; +{ + long num = rb_num2long(val); + + check_int(num); + return num; +} + +long +rb_fix2int(val) + VALUE val; +{ + long num = FIXNUM_P(val)?FIX2LONG(val):rb_num2long(val); + + check_int(num); + return num; +} + +unsigned long +rb_num2uint(val) + VALUE val; +{ + unsigned long num = rb_num2ulong(val); + + check_uint(num, rb_funcall(val, '<', 1, INT2FIX(0))); + return num; +} + +unsigned long +rb_fix2uint(val) + VALUE val; +{ + unsigned long num; + + if (!FIXNUM_P(val)) { + return rb_num2uint(val); + } + num = FIX2ULONG(val); + + check_uint(num, rb_funcall(val, '<', 1, INT2FIX(0))); + return num; +} +#else +long +rb_num2int(val) + VALUE val; +{ + return rb_num2long(val); +} + +long +rb_fix2int(val) + VALUE val; +{ + return FIX2INT(val); +} +#endif + +VALUE +rb_num2fix(val) + VALUE val; +{ + long v; + + if (FIXNUM_P(val)) return val; + + v = rb_num2long(val); + if (!FIXABLE(v)) + rb_raise(rb_eRangeError, "integer %ld out of range of fixnum", v); + return LONG2FIX(v); +} + +#if HAVE_LONG_LONG + +LONG_LONG +rb_num2ll(val) + VALUE val; +{ + if (NIL_P(val)) { + rb_raise(rb_eTypeError, "no implicit conversion from nil"); + } + + if (FIXNUM_P(val)) return (LONG_LONG)FIX2LONG(val); + + switch (TYPE(val)) { + case T_FLOAT: + if (RFLOAT(val)->value <= (double)LLONG_MAX + && RFLOAT(val)->value >= (double)LLONG_MIN) { + return (LONG_LONG)(RFLOAT(val)->value); + } + else { + char buf[24]; + char *s; + + sprintf(buf, "%-.10g", RFLOAT(val)->value); + if ((s = strchr(buf, ' ')) != 0) *s = '\0'; + rb_raise(rb_eRangeError, "float %s out of range of long long", buf); + } + + case T_BIGNUM: + return rb_big2ll(val); + + case T_STRING: + rb_raise(rb_eTypeError, "no implicit conversion from string"); + return Qnil; /* not reached */ + + case T_TRUE: + case T_FALSE: + rb_raise(rb_eTypeError, "no implicit conversion from boolean"); + return Qnil; /* not reached */ + + default: + val = rb_to_int(val); + return NUM2LL(val); + } +} + +unsigned LONG_LONG +rb_num2ull(val) + VALUE val; +{ + if (TYPE(val) == T_BIGNUM) { + return rb_big2ull(val); + } + return (unsigned LONG_LONG)rb_num2ll(val); +} + +#endif /* HAVE_LONG_LONG */ + + +/* + * Document-class: Integer + * + * <code>Integer</code> is the basis for the two concrete classes that + * hold whole numbers, <code>Bignum</code> and <code>Fixnum</code>. + * + */ + + +/* + * call-seq: + * int.to_i => int + * int.to_int => int + * int.floor => int + * int.ceil => int + * int.round => int + * int.truncate => int + * + * As <i>int</i> is already an <code>Integer</code>, all these + * methods simply return the receiver. + */ + +static VALUE +int_to_i(num) + VALUE num; +{ + return num; +} + +/* + * call-seq: + * int.integer? -> true + * + * Always returns <code>true</code>. + */ + +static VALUE +int_int_p(num) + VALUE num; +{ + return Qtrue; +} + +/* + * call-seq: + * int.next => integer + * int.succ => integer + * + * Returns the <code>Integer</code> equal to <i>int</i> + 1. + * + * 1.next #=> 2 + * (-1).next #=> 0 + */ + +static VALUE +int_succ(num) + VALUE num; +{ + if (FIXNUM_P(num)) { + long i = FIX2LONG(num) + 1; + return LONG2NUM(i); + } + return rb_funcall(num, '+', 1, INT2FIX(1)); +} + +/* + * call-seq: + * int.chr => string + * + * Returns a string containing the ASCII character represented by the + * receiver's value. + * + * 65.chr #=> "A" + * ?a.chr #=> "a" + * 230.chr #=> "\346" + */ + +static VALUE +int_chr(num) + VALUE num; +{ + char c; + long i = NUM2LONG(num); + + if (i < 0 || 0xff < i) + rb_raise(rb_eRangeError, "%ld out of char range", i); + c = i; + return rb_str_new(&c, 1); +} + +/******************************************************************** + * + * Document-class: Fixnum + * + * A <code>Fixnum</code> holds <code>Integer</code> values that can be + * represented in a native machine word (minus 1 bit). If any operation + * on a <code>Fixnum</code> exceeds this range, the value is + * automatically converted to a <code>Bignum</code>. + * + * <code>Fixnum</code> objects have immediate value. This means that + * when they are assigned or passed as parameters, the actual object is + * passed, rather than a reference to that object. Assignment does not + * alias <code>Fixnum</code> objects. There is effectively only one + * <code>Fixnum</code> object instance for any given integer value, so, + * for example, you cannot add a singleton method to a + * <code>Fixnum</code>. + */ + + +/* + * call-seq: + * Fixnum.induced_from(obj) => fixnum + * + * Convert <code>obj</code> to a Fixnum. Works with numeric parameters. + * Also works with Symbols, but this is deprecated. + */ + +static VALUE +rb_fix_induced_from(klass, x) + VALUE klass, x; +{ + return rb_num2fix(x); +} + +/* + * call-seq: + * Integer.induced_from(obj) => fixnum, bignum + * + * Convert <code>obj</code> to an Integer. + */ + +static VALUE +rb_int_induced_from(klass, x) + VALUE klass, x; +{ + switch (TYPE(x)) { + case T_FIXNUM: + case T_BIGNUM: + return x; + case T_FLOAT: + return rb_funcall(x, id_to_i, 0); + default: + rb_raise(rb_eTypeError, "failed to convert %s into Integer", + rb_obj_classname(x)); + } +} + +/* + * call-seq: + * Float.induced_from(obj) => float + * + * Convert <code>obj</code> to a float. + */ + +static VALUE +rb_flo_induced_from(klass, x) + VALUE klass, x; +{ + switch (TYPE(x)) { + case T_FIXNUM: + case T_BIGNUM: + return rb_funcall(x, rb_intern("to_f"), 0); + case T_FLOAT: + return x; + default: + rb_raise(rb_eTypeError, "failed to convert %s into Float", + rb_obj_classname(x)); + } +} + +/* + * call-seq: + * -fix => integer + * + * Negates <code>fix</code> (which might return a Bignum). + */ + +static VALUE +fix_uminus(num) + VALUE num; +{ + return LONG2NUM(-FIX2LONG(num)); +} + +VALUE +rb_fix2str(x, base) + VALUE x; + int base; +{ + extern const char ruby_digitmap[]; + char buf[SIZEOF_LONG*CHAR_BIT + 2], *b = buf + sizeof buf; + long val = FIX2LONG(x); + int neg = 0; + + if (base < 2 || 36 < base) { + rb_raise(rb_eArgError, "illegal radix %d", base); + } + if (val == 0) { + return rb_str_new2("0"); + } + if (val < 0) { + val = -val; + neg = 1; + } + *--b = '\0'; + do { + *--b = ruby_digitmap[(int)(val % base)]; + } while (val /= base); + if (neg) { + *--b = '-'; + } + + return rb_str_new2(b); +} + +/* + * call-seq: + * fix.to_s( base=10 ) -> aString + * + * Returns a string containing the representation of <i>fix</i> radix + * <i>base</i> (between 2 and 36). + * + * 12345.to_s #=> "12345" + * 12345.to_s(2) #=> "11000000111001" + * 12345.to_s(8) #=> "30071" + * 12345.to_s(10) #=> "12345" + * 12345.to_s(16) #=> "3039" + * 12345.to_s(36) #=> "9ix" + * + */ +static VALUE +fix_to_s(argc, argv, x) + int argc; + VALUE *argv; + VALUE x; +{ + VALUE b; + int base; + + rb_scan_args(argc, argv, "01", &b); + if (argc == 0) base = 10; + else base = NUM2INT(b); + + return rb_fix2str(x, base); +} + +/* + * call-seq: + * fix + numeric => numeric_result + * + * Performs addition: the class of the resulting object depends on + * the class of <code>numeric</code> and on the magnitude of the + * result. + */ + +static VALUE +fix_plus(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + long a, b, c; + VALUE r; + + a = FIX2LONG(x); + b = FIX2LONG(y); + c = a + b; + r = LONG2NUM(c); + + return r; + } + if (TYPE(y) == T_FLOAT) { + return rb_float_new((double)FIX2LONG(x) + RFLOAT(y)->value); + } + return rb_num_coerce_bin(x, y); +} + +/* + * call-seq: + * fix - numeric => numeric_result + * + * Performs subtraction: the class of the resulting object depends on + * the class of <code>numeric</code> and on the magnitude of the + * result. + */ + +static VALUE +fix_minus(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + long a, b, c; + VALUE r; + + a = FIX2LONG(x); + b = FIX2LONG(y); + c = a - b; + r = LONG2NUM(c); + + return r; + } + if (TYPE(y) == T_FLOAT) { + return rb_float_new((double)FIX2LONG(x) - RFLOAT(y)->value); + } + return rb_num_coerce_bin(x, y); +} + +/* + * call-seq: + * fix * numeric => numeric_result + * + * Performs multiplication: the class of the resulting object depends on + * the class of <code>numeric</code> and on the magnitude of the + * result. + */ + +static VALUE +fix_mul(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { +#ifdef __HP_cc + /* avoids an optimization bug of HP aC++/ANSI C B3910B A.06.05 [Jul 25 2005] */ + volatile +#endif + long a, b, c; + VALUE r; + + a = FIX2LONG(x); + if (a == 0) return x; + + b = FIX2LONG(y); + c = a * b; + r = LONG2FIX(c); + + if (FIX2LONG(r) != c || c/a != b) { + r = rb_big_mul(rb_int2big(a), rb_int2big(b)); + } + return r; + } + if (TYPE(y) == T_FLOAT) { + return rb_float_new((double)FIX2LONG(x) * RFLOAT(y)->value); + } + return rb_num_coerce_bin(x, y); +} + +static void +fixdivmod(x, y, divp, modp) + long x, y; + long *divp, *modp; +{ + long div, mod; + + if (y == 0) rb_num_zerodiv(); + if (y < 0) { + if (x < 0) + div = -x / -y; + else + div = - (x / -y); + } + else { + if (x < 0) + div = - (-x / y); + else + div = x / y; + } + mod = x - div*y; + if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) { + mod += y; + div -= 1; + } + if (divp) *divp = div; + if (modp) *modp = mod; +} + +/* + * call-seq: + * fix.quo(numeric) => float + * + * Returns the floating point result of dividing <i>fix</i> by + * <i>numeric</i>. + * + * 654321.quo(13731) #=> 47.6528293642124 + * 654321.quo(13731.24) #=> 47.6519964693647 + * + */ + +static VALUE +fix_quo(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + return rb_float_new((double)FIX2LONG(x) / (double)FIX2LONG(y)); + } + return rb_num_coerce_bin(x, y); +} + +/* + * call-seq: + * fix / numeric => numeric_result + * fix.div(numeric) => numeric_result + * + * Performs division: the class of the resulting object depends on + * the class of <code>numeric</code> and on the magnitude of the + * result. + */ + +static VALUE +fix_div(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + long div; + + fixdivmod(FIX2LONG(x), FIX2LONG(y), &div, 0); + return LONG2NUM(div); + } + return rb_num_coerce_bin(x, y); +} + +/* + * call-seq: + * fix % other => Numeric + * fix.modulo(other) => Numeric + * + * Returns <code>fix</code> modulo <code>other</code>. + * See <code>Numeric.divmod</code> for more information. + */ + +static VALUE +fix_mod(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + long mod; + + fixdivmod(FIX2LONG(x), FIX2LONG(y), 0, &mod); + return LONG2NUM(mod); + } + return rb_num_coerce_bin(x, y); +} + +/* + * call-seq: + * fix.divmod(numeric) => array + * + * See <code>Numeric#divmod</code>. + */ +static VALUE +fix_divmod(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + long div, mod; + + fixdivmod(FIX2LONG(x), FIX2LONG(y), &div, &mod); + + return rb_assoc_new(LONG2NUM(div), LONG2NUM(mod)); + } + return rb_num_coerce_bin(x, y); +} + +static VALUE +int_even_p(VALUE num) +{ + if (rb_funcall(num, '%', 1, INT2FIX(2)) == INT2FIX(0)) { + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * fix ** other => Numeric + * + * Raises <code>fix</code> to the <code>other</code> power, which may + * be negative or fractional. + * + * 2 ** 3 #=> 8 + * 2 ** -1 #=> 0.5 + * 2 ** 0.5 #=> 1.4142135623731 + */ + +static VALUE +fix_pow(x, y) + VALUE x, y; +{ + static const double zero = 0.0; + long a = FIX2LONG(x); + + if (FIXNUM_P(y)) { + long b; + + b = FIX2LONG(y); + if (b == 0) return INT2FIX(1); + if (b == 1) return x; + a = FIX2LONG(x); + if (a == 0) { + if (b > 0) return INT2FIX(0); + return rb_float_new(1.0 / zero); + } + if (a == 1) return INT2FIX(1); + if (a == -1) { + if (b % 2 == 0) + return INT2FIX(1); + else + return INT2FIX(-1); + } + if (b > 0) { + return rb_big_pow(rb_int2big(a), y); + } + return rb_float_new(pow((double)a, (double)b)); + } + switch (TYPE(y)) { + case T_BIGNUM: + if (a == 0) return INT2FIX(0); + if (a == 1) return INT2FIX(1); + if (a == -1) { + if (int_even_p(y)) return INT2FIX(1); + else return INT2FIX(-1); + } + x = rb_int2big(FIX2LONG(x)); + return rb_big_pow(x, y); + case T_FLOAT: + if (a == 0) { + return rb_float_new(RFLOAT(y)->value < 0 ? (1.0 / zero) : 0.0); + } + if (a == 1) return rb_float_new(1.0); + return rb_float_new(pow((double)a, RFLOAT(y)->value)); + default: + return rb_num_coerce_bin(x, y); + } +} + +/* + * call-seq: + * fix == other + * + * Return <code>true</code> if <code>fix</code> equals <code>other</code> + * numerically. + * + * 1 == 2 #=> false + * 1 == 1.0 #=> true + */ + +static VALUE +fix_equal(x, y) + VALUE x, y; +{ + if (x == y) return Qtrue; + if (FIXNUM_P(y)) return Qfalse; + return num_equal(x, y); +} + +/* + * call-seq: + * fix <=> numeric => -1, 0, +1 + * + * Comparison---Returns -1, 0, or +1 depending on whether <i>fix</i> is + * less than, equal to, or greater than <i>numeric</i>. This is the + * basis for the tests in <code>Comparable</code>. + */ + +static VALUE +fix_cmp(x, y) + VALUE x, y; +{ + if (x == y) return INT2FIX(0); + if (FIXNUM_P(y)) { + long a = FIX2LONG(x), b = FIX2LONG(y); + + if (a > b) return INT2FIX(1); + return INT2FIX(-1); + } + else { + return rb_num_coerce_cmp(x, y); + } +} + +/* + * call-seq: + * fix > other => true or false + * + * Returns <code>true</code> if the value of <code>fix</code> is + * greater than that of <code>other</code>. + */ + +static VALUE +fix_gt(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + long a = FIX2LONG(x), b = FIX2LONG(y); + + if (a > b) return Qtrue; + return Qfalse; + } + else { + return rb_num_coerce_relop(x, y); + } +} + +/* + * call-seq: + * fix >= other => true or false + * + * Returns <code>true</code> if the value of <code>fix</code> is + * greater than or equal to that of <code>other</code>. + */ + +static VALUE +fix_ge(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + long a = FIX2LONG(x), b = FIX2LONG(y); + + if (a >= b) return Qtrue; + return Qfalse; + } + else { + return rb_num_coerce_relop(x, y); + } +} + +/* + * call-seq: + * fix < other => true or false + * + * Returns <code>true</code> if the value of <code>fix</code> is + * less than that of <code>other</code>. + */ + +static VALUE +fix_lt(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + long a = FIX2LONG(x), b = FIX2LONG(y); + + if (a < b) return Qtrue; + return Qfalse; + } + else { + return rb_num_coerce_relop(x, y); + } +} + +/* + * call-seq: + * fix <= other => true or false + * + * Returns <code>true</code> if the value of <code>fix</code> is + * less thanor equal to that of <code>other</code>. + */ + +static VALUE +fix_le(x, y) + VALUE x, y; +{ + if (FIXNUM_P(y)) { + long a = FIX2LONG(x), b = FIX2LONG(y); + + if (a <= b) return Qtrue; + return Qfalse; + } + else { + return rb_num_coerce_relop(x, y); + } +} + +/* + * call-seq: + * ~fix => integer + * + * One's complement: returns a number where each bit is flipped. + */ + +static VALUE +fix_rev(num) + VALUE num; +{ + long val = FIX2LONG(num); + + val = ~val; + return LONG2NUM(val); +} + +static VALUE +fix_coerce(x) + VALUE x; +{ + while (!FIXNUM_P(x) && TYPE(x) != T_BIGNUM) { + x = rb_to_int(x); + } + return x; +} + +/* + * call-seq: + * fix & other => integer + * + * Bitwise AND. + */ + +static VALUE +fix_and(x, y) + VALUE x, y; +{ + long val; + + if (!FIXNUM_P(y = fix_coerce(y))) { + return rb_big_and(y, x); + } + val = FIX2LONG(x) & FIX2LONG(y); + return LONG2NUM(val); +} + +/* + * call-seq: + * fix | other => integer + * + * Bitwise OR. + */ + +static VALUE +fix_or(x, y) + VALUE x, y; +{ + long val; + + if (!FIXNUM_P(y = fix_coerce(y))) { + return rb_big_or(y, x); + } + val = FIX2LONG(x) | FIX2LONG(y); + return LONG2NUM(val); +} + +/* + * call-seq: + * fix ^ other => integer + * + * Bitwise EXCLUSIVE OR. + */ + +static VALUE +fix_xor(x, y) + VALUE x, y; +{ + long val; + + if (!FIXNUM_P(y = fix_coerce(y))) { + return rb_big_xor(y, x); + } + val = FIX2LONG(x) ^ FIX2LONG(y); + return LONG2NUM(val); +} + +static VALUE fix_lshift _((long, unsigned long)); +static VALUE fix_rshift _((long, unsigned long)); + +/* + * call-seq: + * fix << count => integer + * + * Shifts _fix_ left _count_ positions (right if _count_ is negative). + */ + +static VALUE +rb_fix_lshift(x, y) + VALUE x, y; +{ + long val, width; + + val = NUM2LONG(x); + if (!FIXNUM_P(y)) + return rb_big_lshift(rb_int2big(val), y); + width = FIX2LONG(y); + if (width < 0) + return fix_rshift(val, (unsigned long)-width); + return fix_lshift(val, width); +} + +static VALUE +fix_lshift(val, width) + long val; + unsigned long width; +{ + if (width > (sizeof(VALUE)*CHAR_BIT-1) + || ((unsigned long)val)>>(sizeof(VALUE)*CHAR_BIT-1-width) > 0) { + return rb_big_lshift(rb_int2big(val), ULONG2NUM(width)); + } + val = val << width; + return LONG2NUM(val); +} + +/* + * call-seq: + * fix >> count => integer + * + * Shifts _fix_ right _count_ positions (left if _count_ is negative). + */ + +static VALUE +rb_fix_rshift(x, y) + VALUE x, y; +{ + long i, val; + + val = FIX2LONG(x); + if (!FIXNUM_P(y)) + return rb_big_rshift(rb_int2big(val), y); + i = FIX2LONG(y); + if (i == 0) return x; + if (i < 0) + return fix_lshift(val, (unsigned long)-i); + return fix_rshift(val, i); +} + +static VALUE +fix_rshift(long val, unsigned long i) +{ + if (i >= sizeof(long)*CHAR_BIT-1) { + if (val < 0) return INT2FIX(-1); + return INT2FIX(0); + } + val = RSHIFT(val, i); + return LONG2FIX(val); +} + +/* + * call-seq: + * fix[n] => 0, 1 + * + * Bit Reference---Returns the <em>n</em>th bit in the binary + * representation of <i>fix</i>, where <i>fix</i>[0] is the least + * significant bit. + * + * a = 0b11001100101010 + * 30.downto(0) do |n| print a[n] end + * + * <em>produces:</em> + * + * 0000000000000000011001100101010 + */ + +static VALUE +fix_aref(fix, idx) + VALUE fix, idx; +{ + long val = FIX2LONG(fix); + long i; + + if (!FIXNUM_P(idx = fix_coerce(idx))) { + idx = rb_big_norm(idx); + if (!FIXNUM_P(idx)) { + if (!RBIGNUM(idx)->sign || val >= 0) + return INT2FIX(0); + return INT2FIX(1); + } + } + i = FIX2LONG(idx); + + if (i < 0) return INT2FIX(0); + if (sizeof(VALUE)*CHAR_BIT-1 < i) { + if (val < 0) return INT2FIX(1); + return INT2FIX(0); + } + if (val & (1L<<i)) + return INT2FIX(1); + return INT2FIX(0); +} + +/* + * call-seq: + * fix.to_f -> float + * + * Converts <i>fix</i> to a <code>Float</code>. + * + */ + +static VALUE +fix_to_f(num) + VALUE num; +{ + double val; + + val = (double)FIX2LONG(num); + + return rb_float_new(val); +} + +/* + * call-seq: + * fix.abs -> aFixnum + * + * Returns the absolute value of <i>fix</i>. + * + * -12345.abs #=> 12345 + * 12345.abs #=> 12345 + * + */ + +static VALUE +fix_abs(fix) + VALUE fix; +{ + long i = FIX2LONG(fix); + + if (i < 0) i = -i; + + return LONG2NUM(i); +} + +/* + * call-seq: + * fix.id2name -> string or nil + * + * Returns the name of the object whose symbol id is <i>fix</i>. If + * there is no symbol in the symbol table with this value, returns + * <code>nil</code>. <code>id2name</code> has nothing to do with the + * <code>Object.id</code> method. See also <code>Fixnum#to_sym</code>, + * <code>String#intern</code>, and class <code>Symbol</code>. + * + * symbol = :@inst_var #=> :@inst_var + * id = symbol.to_i #=> 9818 + * id.id2name #=> "@inst_var" + */ + +static VALUE +fix_id2name(fix) + VALUE fix; +{ + char *name = rb_id2name(FIX2UINT(fix)); + if (name) return rb_str_new2(name); + return Qnil; +} + + +/* + * call-seq: + * fix.to_sym -> aSymbol + * + * Returns the symbol whose integer value is <i>fix</i>. See also + * <code>Fixnum#id2name</code>. + * + * fred = :fred.to_i + * fred.id2name #=> "fred" + * fred.to_sym #=> :fred + */ + +static VALUE +fix_to_sym(fix) + VALUE fix; +{ + ID id = FIX2UINT(fix); + + if (rb_id2name(id)) { + return ID2SYM(id); + } + return Qnil; +} + + +/* + * call-seq: + * fix.size -> fixnum + * + * Returns the number of <em>bytes</em> in the machine representation + * of a <code>Fixnum</code>. + * + * 1.size #=> 4 + * -1.size #=> 4 + * 2147483647.size #=> 4 + */ + +static VALUE +fix_size(fix) + VALUE fix; +{ + return INT2FIX(sizeof(long)); +} + +/* + * call-seq: + * int.upto(limit) {|i| block } => int + * + * Iterates <em>block</em>, passing in integer values from <i>int</i> + * up to and including <i>limit</i>. + * + * 5.upto(10) { |i| print i, " " } + * + * <em>produces:</em> + * + * 5 6 7 8 9 10 + */ + +static VALUE +int_upto(from, to) + VALUE from, to; +{ + if (FIXNUM_P(from) && FIXNUM_P(to)) { + long i, end; + + end = FIX2LONG(to); + for (i = FIX2LONG(from); i <= end; i++) { + rb_yield(LONG2FIX(i)); + } + } + else { + VALUE i = from, c; + + while (!(c = rb_funcall(i, '>', 1, to))) { + rb_yield(i); + i = rb_funcall(i, '+', 1, INT2FIX(1)); + } + if (NIL_P(c)) rb_cmperr(i, to); + } + return from; +} + +/* + * call-seq: + * int.downto(limit) {|i| block } => int + * + * Iterates <em>block</em>, passing decreasing values from <i>int</i> + * down to and including <i>limit</i>. + * + * 5.downto(1) { |n| print n, ".. " } + * print " Liftoff!\n" + * + * <em>produces:</em> + * + * 5.. 4.. 3.. 2.. 1.. Liftoff! + */ + +static VALUE +int_downto(from, to) + VALUE from, to; +{ + if (FIXNUM_P(from) && FIXNUM_P(to)) { + long i, end; + + end = FIX2LONG(to); + for (i=FIX2LONG(from); i >= end; i--) { + rb_yield(LONG2FIX(i)); + } + } + else { + VALUE i = from, c; + + while (!(c = rb_funcall(i, '<', 1, to))) { + rb_yield(i); + i = rb_funcall(i, '-', 1, INT2FIX(1)); + } + if (NIL_P(c)) rb_cmperr(i, to); + } + return from; +} + +/* + * call-seq: + * int.times {|i| block } => int + * + * Iterates block <i>int</i> times, passing in values from zero to + * <i>int</i> - 1. + * + * 5.times do |i| + * print i, " " + * end + * + * <em>produces:</em> + * + * 0 1 2 3 4 + */ + +static VALUE +int_dotimes(num) + VALUE num; +{ + if (FIXNUM_P(num)) { + long i, end; + + end = FIX2LONG(num); + for (i=0; i<end; i++) { + rb_yield(LONG2FIX(i)); + } + } + else { + VALUE i = INT2FIX(0); + + for (;;) { + if (!RTEST(rb_funcall(i, '<', 1, num))) break; + rb_yield(i); + i = rb_funcall(i, '+', 1, INT2FIX(1)); + } + } + return num; +} + +/* + * call-seq: + * fix.zero? => true or false + * + * Returns <code>true</code> if <i>fix</i> is zero. + * + */ + +static VALUE +fix_zero_p(num) + VALUE num; +{ + if (FIX2LONG(num) == 0) { + return Qtrue; + } + return Qfalse; +} + +void +Init_Numeric() +{ +#if defined(__FreeBSD__) && __FreeBSD__ < 4 + /* allow divide by zero -- Inf */ + fpsetmask(fpgetmask() & ~(FP_X_DZ|FP_X_INV|FP_X_OFL)); +#elif defined(_UNICOSMP) + /* Turn off floating point exceptions for divide by zero, etc. */ + _set_Creg(0, 0); +#elif defined(__BORLANDC__) + /* Turn off floating point exceptions for overflow, etc. */ + _control87(MCW_EM, MCW_EM); +#endif + id_coerce = rb_intern("coerce"); + id_to_i = rb_intern("to_i"); + id_eq = rb_intern("=="); + + rb_eZeroDivError = rb_define_class("ZeroDivisionError", rb_eStandardError); + rb_eFloatDomainError = rb_define_class("FloatDomainError", rb_eRangeError); + rb_cNumeric = rb_define_class("Numeric", rb_cObject); + + rb_define_method(rb_cNumeric, "singleton_method_added", num_sadded, 1); + rb_include_module(rb_cNumeric, rb_mComparable); + rb_define_method(rb_cNumeric, "initialize_copy", num_init_copy, 1); + rb_define_method(rb_cNumeric, "coerce", num_coerce, 1); + + rb_define_method(rb_cNumeric, "+@", num_uplus, 0); + rb_define_method(rb_cNumeric, "-@", num_uminus, 0); + rb_define_method(rb_cNumeric, "<=>", num_cmp, 1); + rb_define_method(rb_cNumeric, "eql?", num_eql, 1); + rb_define_method(rb_cNumeric, "quo", num_quo, 1); + rb_define_method(rb_cNumeric, "div", num_div, 1); + rb_define_method(rb_cNumeric, "divmod", num_divmod, 1); + rb_define_method(rb_cNumeric, "modulo", num_modulo, 1); + rb_define_method(rb_cNumeric, "remainder", num_remainder, 1); + rb_define_method(rb_cNumeric, "abs", num_abs, 0); + rb_define_method(rb_cNumeric, "to_int", num_to_int, 0); + + rb_define_method(rb_cNumeric, "integer?", num_int_p, 0); + rb_define_method(rb_cNumeric, "zero?", num_zero_p, 0); + rb_define_method(rb_cNumeric, "nonzero?", num_nonzero_p, 0); + + rb_define_method(rb_cNumeric, "floor", num_floor, 0); + rb_define_method(rb_cNumeric, "ceil", num_ceil, 0); + rb_define_method(rb_cNumeric, "round", num_round, 0); + rb_define_method(rb_cNumeric, "truncate", num_truncate, 0); + rb_define_method(rb_cNumeric, "step", num_step, -1); + + rb_cInteger = rb_define_class("Integer", rb_cNumeric); + rb_undef_alloc_func(rb_cInteger); + rb_undef_method(CLASS_OF(rb_cInteger), "new"); + + rb_define_method(rb_cInteger, "integer?", int_int_p, 0); + rb_define_method(rb_cInteger, "upto", int_upto, 1); + rb_define_method(rb_cInteger, "downto", int_downto, 1); + rb_define_method(rb_cInteger, "times", int_dotimes, 0); + rb_include_module(rb_cInteger, rb_mPrecision); + rb_define_method(rb_cInteger, "succ", int_succ, 0); + rb_define_method(rb_cInteger, "next", int_succ, 0); + rb_define_method(rb_cInteger, "chr", int_chr, 0); + rb_define_method(rb_cInteger, "to_i", int_to_i, 0); + rb_define_method(rb_cInteger, "to_int", int_to_i, 0); + rb_define_method(rb_cInteger, "floor", int_to_i, 0); + rb_define_method(rb_cInteger, "ceil", int_to_i, 0); + rb_define_method(rb_cInteger, "round", int_to_i, 0); + rb_define_method(rb_cInteger, "truncate", int_to_i, 0); + + rb_cFixnum = rb_define_class("Fixnum", rb_cInteger); + rb_include_module(rb_cFixnum, rb_mPrecision); + rb_define_singleton_method(rb_cFixnum, "induced_from", rb_fix_induced_from, 1); + rb_define_singleton_method(rb_cInteger, "induced_from", rb_int_induced_from, 1); + + rb_define_method(rb_cFixnum, "to_s", fix_to_s, -1); + + rb_define_method(rb_cFixnum, "id2name", fix_id2name, 0); + rb_define_method(rb_cFixnum, "to_sym", fix_to_sym, 0); + + rb_define_method(rb_cFixnum, "-@", fix_uminus, 0); + rb_define_method(rb_cFixnum, "+", fix_plus, 1); + rb_define_method(rb_cFixnum, "-", fix_minus, 1); + rb_define_method(rb_cFixnum, "*", fix_mul, 1); + rb_define_method(rb_cFixnum, "/", fix_div, 1); + rb_define_method(rb_cFixnum, "div", fix_div, 1); + rb_define_method(rb_cFixnum, "%", fix_mod, 1); + rb_define_method(rb_cFixnum, "modulo", fix_mod, 1); + rb_define_method(rb_cFixnum, "divmod", fix_divmod, 1); + rb_define_method(rb_cFixnum, "quo", fix_quo, 1); + rb_define_method(rb_cFixnum, "**", fix_pow, 1); + + rb_define_method(rb_cFixnum, "abs", fix_abs, 0); + + rb_define_method(rb_cFixnum, "==", fix_equal, 1); + rb_define_method(rb_cFixnum, "<=>", fix_cmp, 1); + rb_define_method(rb_cFixnum, ">", fix_gt, 1); + rb_define_method(rb_cFixnum, ">=", fix_ge, 1); + rb_define_method(rb_cFixnum, "<", fix_lt, 1); + rb_define_method(rb_cFixnum, "<=", fix_le, 1); + + rb_define_method(rb_cFixnum, "~", fix_rev, 0); + rb_define_method(rb_cFixnum, "&", fix_and, 1); + rb_define_method(rb_cFixnum, "|", fix_or, 1); + rb_define_method(rb_cFixnum, "^", fix_xor, 1); + rb_define_method(rb_cFixnum, "[]", fix_aref, 1); + + rb_define_method(rb_cFixnum, "<<", rb_fix_lshift, 1); + rb_define_method(rb_cFixnum, ">>", rb_fix_rshift, 1); + + rb_define_method(rb_cFixnum, "to_f", fix_to_f, 0); + rb_define_method(rb_cFixnum, "size", fix_size, 0); + rb_define_method(rb_cFixnum, "zero?", fix_zero_p, 0); + + rb_cFloat = rb_define_class("Float", rb_cNumeric); + + rb_undef_alloc_func(rb_cFloat); + rb_undef_method(CLASS_OF(rb_cFloat), "new"); + + rb_define_singleton_method(rb_cFloat, "induced_from", rb_flo_induced_from, 1); + rb_include_module(rb_cFloat, rb_mPrecision); + + rb_define_const(rb_cFloat, "ROUNDS", INT2FIX(FLT_ROUNDS)); + rb_define_const(rb_cFloat, "RADIX", INT2FIX(FLT_RADIX)); + rb_define_const(rb_cFloat, "MANT_DIG", INT2FIX(DBL_MANT_DIG)); + rb_define_const(rb_cFloat, "DIG", INT2FIX(DBL_DIG)); + rb_define_const(rb_cFloat, "MIN_EXP", INT2FIX(DBL_MIN_EXP)); + rb_define_const(rb_cFloat, "MAX_EXP", INT2FIX(DBL_MAX_EXP)); + rb_define_const(rb_cFloat, "MIN_10_EXP", INT2FIX(DBL_MIN_10_EXP)); + rb_define_const(rb_cFloat, "MAX_10_EXP", INT2FIX(DBL_MAX_10_EXP)); + rb_define_const(rb_cFloat, "MIN", rb_float_new(DBL_MIN)); + rb_define_const(rb_cFloat, "MAX", rb_float_new(DBL_MAX)); + rb_define_const(rb_cFloat, "EPSILON", rb_float_new(DBL_EPSILON)); + + rb_define_method(rb_cFloat, "to_s", flo_to_s, 0); + rb_define_method(rb_cFloat, "coerce", flo_coerce, 1); + rb_define_method(rb_cFloat, "-@", flo_uminus, 0); + rb_define_method(rb_cFloat, "+", flo_plus, 1); + rb_define_method(rb_cFloat, "-", flo_minus, 1); + rb_define_method(rb_cFloat, "*", flo_mul, 1); + rb_define_method(rb_cFloat, "/", flo_div, 1); + rb_define_method(rb_cFloat, "%", flo_mod, 1); + rb_define_method(rb_cFloat, "modulo", flo_mod, 1); + rb_define_method(rb_cFloat, "divmod", flo_divmod, 1); + rb_define_method(rb_cFloat, "**", flo_pow, 1); + rb_define_method(rb_cFloat, "==", flo_eq, 1); + rb_define_method(rb_cFloat, "<=>", flo_cmp, 1); + rb_define_method(rb_cFloat, ">", flo_gt, 1); + rb_define_method(rb_cFloat, ">=", flo_ge, 1); + rb_define_method(rb_cFloat, "<", flo_lt, 1); + rb_define_method(rb_cFloat, "<=", flo_le, 1); + rb_define_method(rb_cFloat, "eql?", flo_eql, 1); + rb_define_method(rb_cFloat, "hash", flo_hash, 0); + rb_define_method(rb_cFloat, "to_f", flo_to_f, 0); + rb_define_method(rb_cFloat, "abs", flo_abs, 0); + rb_define_method(rb_cFloat, "zero?", flo_zero_p, 0); + + rb_define_method(rb_cFloat, "to_i", flo_truncate, 0); + rb_define_method(rb_cFloat, "to_int", flo_truncate, 0); + rb_define_method(rb_cFloat, "floor", flo_floor, 0); + rb_define_method(rb_cFloat, "ceil", flo_ceil, 0); + rb_define_method(rb_cFloat, "round", flo_round, 0); + rb_define_method(rb_cFloat, "truncate", flo_truncate, 0); + + rb_define_method(rb_cFloat, "nan?", flo_is_nan_p, 0); + rb_define_method(rb_cFloat, "infinite?", flo_is_infinite_p, 0); + rb_define_method(rb_cFloat, "finite?", flo_is_finite_p, 0); +} +/********************************************************************** + + object.c - + + $Author: shyouhei $ + $Date: 2008-06-18 08:21:30 +0200 (Wed, 18 Jun 2008) $ + created at: Thu Jul 15 12:01:24 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "st.h" +#include "util.h" +#include <stdio.h> +#include <errno.h> +#include <ctype.h> +#include <math.h> + +VALUE rb_mKernel; +VALUE rb_cObject; +VALUE rb_cModule; +VALUE rb_cClass; +VALUE rb_cData; + +VALUE rb_cNilClass; +VALUE rb_cTrueClass; +VALUE rb_cFalseClass; +VALUE rb_cSymbol; + +static ID id_eq, id_eql, id_inspect, id_init_copy; + +/* + * call-seq: + * obj === other => true or false + * + * Case Equality---For class <code>Object</code>, effectively the same + * as calling <code>#==</code>, but typically overridden by descendents + * to provide meaningful semantics in <code>case</code> statements. + */ + +VALUE +rb_equal(obj1, obj2) + VALUE obj1, obj2; +{ + VALUE result; + + if (obj1 == obj2) return Qtrue; + result = rb_funcall(obj1, id_eq, 1, obj2); + if (RTEST(result)) return Qtrue; + return Qfalse; +} + +int +rb_eql(obj1, obj2) + VALUE obj1, obj2; +{ + return RTEST(rb_funcall(obj1, id_eql, 1, obj2)); +} + +/* + * call-seq: + * obj == other => true or false + * obj.equal?(other) => true or false + * obj.eql?(other) => true or false + * + * Equality---At the <code>Object</code> level, <code>==</code> returns + * <code>true</code> only if <i>obj</i> and <i>other</i> are the + * same object. Typically, this method is overridden in descendent + * classes to provide class-specific meaning. + * + * Unlike <code>==</code>, the <code>equal?</code> method should never be + * overridden by subclasses: it is used to determine object identity + * (that is, <code>a.equal?(b)</code> iff <code>a</code> is the same + * object as <code>b</code>). + * + * The <code>eql?</code> method returns <code>true</code> if + <i>obj</i> and <i>anObject</i> have the + * same value. Used by <code>Hash</code> to test members for equality. + * For objects of class <code>Object</code>, <code>eql?</code> is + * synonymous with <code>==</code>. Subclasses normally continue this + * tradition, but there are exceptions. <code>Numeric</code> types, for + * example, perform type conversion across <code>==</code>, but not + * across <code>eql?</code>, so: + * + * 1 == 1.0 #=> true + * 1.eql? 1.0 #=> false + */ + +static VALUE +rb_obj_equal(obj1, obj2) + VALUE obj1, obj2; +{ + if (obj1 == obj2) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * obj.id => fixnum + * + * Soon-to-be deprecated version of <code>Object#object_id</code>. + */ + +VALUE +rb_obj_id_obsolete(obj) + VALUE obj; +{ + rb_warn("Object#id will be deprecated; use Object#object_id"); + return rb_obj_id(obj); +} + +VALUE +rb_class_real(cl) + VALUE cl; +{ + while (FL_TEST(cl, FL_SINGLETON) || TYPE(cl) == T_ICLASS) { + cl = RCLASS(cl)->super; + } + return cl; +} + +/* + * call-seq: + * obj.type => class + * + * Deprecated synonym for <code>Object#class</code>. + */ + +VALUE +rb_obj_type(obj) + VALUE obj; +{ + rb_warn("Object#type is deprecated; use Object#class"); + return rb_class_real(CLASS_OF(obj)); +} + + +/* + * call-seq: + * obj.class => class + * + * Returns the class of <i>obj</i>, now preferred over + * <code>Object#type</code>, as an object's type in Ruby is only + * loosely tied to that object's class. This method must always be + * called with an explicit receiver, as <code>class</code> is also a + * reserved word in Ruby. + * + * 1.class #=> Fixnum + * self.class #=> Object + */ + +VALUE +rb_obj_class(obj) + VALUE obj; +{ + return rb_class_real(CLASS_OF(obj)); +} + +static void +init_copy(dest, obj) + VALUE dest, obj; +{ + if (OBJ_FROZEN(dest)) { + rb_raise(rb_eTypeError, "[bug] frozen object (%s) allocated", rb_obj_classname(dest)); + } + RBASIC(dest)->flags &= ~(T_MASK|FL_EXIVAR); + RBASIC(dest)->flags |= RBASIC(obj)->flags & (T_MASK|FL_EXIVAR|FL_TAINT); + if (FL_TEST(obj, FL_EXIVAR)) { + rb_copy_generic_ivar(dest, obj); + } + rb_gc_copy_finalizer(dest, obj); + switch (TYPE(obj)) { + case T_OBJECT: + case T_CLASS: + case T_MODULE: + if (ROBJECT(dest)->iv_tbl) { + st_free_table(ROBJECT(dest)->iv_tbl); + ROBJECT(dest)->iv_tbl = 0; + } + if (ROBJECT(obj)->iv_tbl) { + ROBJECT(dest)->iv_tbl = st_copy(ROBJECT(obj)->iv_tbl); + } + } + rb_funcall(dest, id_init_copy, 1, obj); +} + +/* + * call-seq: + * obj.clone -> an_object + * + * Produces a shallow copy of <i>obj</i>---the instance variables of + * <i>obj</i> are copied, but not the objects they reference. Copies + * the frozen and tainted state of <i>obj</i>. See also the discussion + * under <code>Object#dup</code>. + * + * class Klass + * attr_accessor :str + * end + * s1 = Klass.new #=> #<Klass:0x401b3a38> + * s1.str = "Hello" #=> "Hello" + * s2 = s1.clone #=> #<Klass:0x401b3998 @str="Hello"> + * s2.str[1,4] = "i" #=> "i" + * s1.inspect #=> "#<Klass:0x401b3a38 @str=\"Hi\">" + * s2.inspect #=> "#<Klass:0x401b3998 @str=\"Hi\">" + * + * This method may have class-specific behavior. If so, that + * behavior will be documented under the #+initialize_copy+ method of + * the class. + */ + +VALUE +rb_obj_clone(obj) + VALUE obj; +{ + VALUE clone; + + if (rb_special_const_p(obj)) { + rb_raise(rb_eTypeError, "can't clone %s", rb_obj_classname(obj)); + } + clone = rb_obj_alloc(rb_obj_class(obj)); + RBASIC(clone)->klass = rb_singleton_class_clone(obj); + RBASIC(clone)->flags = (RBASIC(obj)->flags | FL_TEST(clone, FL_TAINT)) & ~(FL_FREEZE|FL_FINALIZE); + init_copy(clone, obj); + RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE; + + return clone; +} + +/* + * call-seq: + * obj.dup -> an_object + * + * Produces a shallow copy of <i>obj</i>---the instance variables of + * <i>obj</i> are copied, but not the objects they reference. + * <code>dup</code> copies the tainted state of <i>obj</i>. See also + * the discussion under <code>Object#clone</code>. In general, + * <code>clone</code> and <code>dup</code> may have different semantics + * in descendent classes. While <code>clone</code> is used to duplicate + * an object, including its internal state, <code>dup</code> typically + * uses the class of the descendent object to create the new instance. + * + * This method may have class-specific behavior. If so, that + * behavior will be documented under the #+initialize_copy+ method of + * the class. + */ + +VALUE +rb_obj_dup(obj) + VALUE obj; +{ + VALUE dup; + + if (rb_special_const_p(obj)) { + rb_raise(rb_eTypeError, "can't dup %s", rb_obj_classname(obj)); + } + dup = rb_obj_alloc(rb_obj_class(obj)); + init_copy(dup, obj); + + return dup; +} + +/* :nodoc: */ +VALUE +rb_obj_init_copy(obj, orig) + VALUE obj, orig; +{ + if (obj == orig) return obj; + rb_check_frozen(obj); + if (TYPE(obj) != TYPE(orig) || rb_obj_class(obj) != rb_obj_class(orig)) { + rb_raise(rb_eTypeError, "initialize_copy should take same class object"); + } + return obj; +} + +/* + * call-seq: + * obj.to_a -> anArray + * + * Returns an array representation of <i>obj</i>. For objects of class + * <code>Object</code> and others that don't explicitly override the + * method, the return value is an array containing <code>self</code>. + * However, this latter behavior will soon be obsolete. + * + * self.to_a #=> -:1: warning: default `to_a' will be obsolete + * "hello".to_a #=> ["hello"] + * Time.new.to_a #=> [39, 54, 8, 9, 4, 2003, 3, 99, true, "CDT"] + */ + + +static VALUE +rb_any_to_a(obj) + VALUE obj; +{ + rb_warn("default `to_a' will be obsolete"); + return rb_ary_new3(1, obj); +} + + +/* + * call-seq: + * obj.to_s => string + * + * Returns a string representing <i>obj</i>. The default + * <code>to_s</code> prints the object's class and an encoding of the + * object id. As a special case, the top-level object that is the + * initial execution context of Ruby programs returns ``main.'' + */ + +VALUE +rb_any_to_s(obj) + VALUE obj; +{ + char *cname = rb_obj_classname(obj); + size_t len; + VALUE str; + + len = strlen(cname)+6+16; + str = rb_str_new(0, len); /* 6:tags 16:addr */ + snprintf(RSTRING(str)->ptr, len+1, "#<%s:0x%lx>", cname, obj); + RSTRING(str)->len = strlen(RSTRING(str)->ptr); + if (OBJ_TAINTED(obj)) OBJ_TAINT(str); + + return str; +} + +VALUE +rb_inspect(obj) + VALUE obj; +{ + return rb_obj_as_string(rb_funcall(obj, id_inspect, 0, 0)); +} + +static int +inspect_i(id, value, str) + ID id; + VALUE value; + VALUE str; +{ + VALUE str2; + char *ivname; + + /* need not to show internal data */ + if (CLASS_OF(value) == 0) return ST_CONTINUE; + if (!rb_is_instance_id(id)) return ST_CONTINUE; + if (RSTRING(str)->ptr[0] == '-') { /* first element */ + RSTRING(str)->ptr[0] = '#'; + rb_str_cat2(str, " "); + } + else { + rb_str_cat2(str, ", "); + } + ivname = rb_id2name(id); + rb_str_cat2(str, ivname); + rb_str_cat2(str, "="); + str2 = rb_inspect(value); + rb_str_append(str, str2); + OBJ_INFECT(str, str2); + + return ST_CONTINUE; +} + +static VALUE +inspect_obj(obj, str) + VALUE obj, str; +{ + st_foreach_safe(ROBJECT(obj)->iv_tbl, inspect_i, str); + rb_str_cat2(str, ">"); + RSTRING(str)->ptr[0] = '#'; + OBJ_INFECT(str, obj); + + return str; +} + +/* + * call-seq: + * obj.inspect => string + * + * Returns a string containing a human-readable representation of + * <i>obj</i>. If not overridden, uses the <code>to_s</code> method to + * generate the string. + * + * [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]" + * Time.new.inspect #=> "Wed Apr 09 08:54:39 CDT 2003" + */ + + +static VALUE +rb_obj_inspect(obj) + VALUE obj; +{ + if (TYPE(obj) == T_OBJECT + && ROBJECT(obj)->iv_tbl + && ROBJECT(obj)->iv_tbl->num_entries > 0) { + VALUE str; + size_t len; + char *c; + + c = rb_obj_classname(obj); + if (rb_inspecting_p(obj)) { + len = strlen(c)+10+16+1; + str = rb_str_new(0, len); /* 10:tags 16:addr 1:nul */ + snprintf(RSTRING(str)->ptr, len, "#<%s:0x%lx ...>", c, obj); + RSTRING(str)->len = strlen(RSTRING(str)->ptr); + return str; + } + len = strlen(c)+6+16+1; + str = rb_str_new(0, len); /* 6:tags 16:addr 1:nul */ + snprintf(RSTRING(str)->ptr, len, "-<%s:0x%lx", c, obj); + RSTRING(str)->len = strlen(RSTRING(str)->ptr); + return rb_protect_inspect(inspect_obj, obj, str); + } + return rb_funcall(obj, rb_intern("to_s"), 0, 0); +} + + +/* + * call-seq: + * obj.instance_of?(class) => true or false + * + * Returns <code>true</code> if <i>obj</i> is an instance of the given + * class. See also <code>Object#kind_of?</code>. + */ + +VALUE +rb_obj_is_instance_of(obj, c) + VALUE obj, c; +{ + switch (TYPE(c)) { + case T_MODULE: + case T_CLASS: + case T_ICLASS: + break; + default: + rb_raise(rb_eTypeError, "class or module required"); + } + + if (rb_obj_class(obj) == c) return Qtrue; + return Qfalse; +} + + +/* + * call-seq: + * obj.is_a?(class) => true or false + * obj.kind_of?(class) => true or false + * + * Returns <code>true</code> if <i>class</i> is the class of + * <i>obj</i>, or if <i>class</i> is one of the superclasses of + * <i>obj</i> or modules included in <i>obj</i>. + * + * module M; end + * class A + * include M + * end + * class B < A; end + * class C < B; end + * b = B.new + * b.instance_of? A #=> false + * b.instance_of? B #=> true + * b.instance_of? C #=> false + * b.instance_of? M #=> false + * b.kind_of? A #=> true + * b.kind_of? B #=> true + * b.kind_of? C #=> false + * b.kind_of? M #=> true + */ + +VALUE +rb_obj_is_kind_of(obj, c) + VALUE obj, c; +{ + VALUE cl = CLASS_OF(obj); + + switch (TYPE(c)) { + case T_MODULE: + case T_CLASS: + case T_ICLASS: + break; + + default: + rb_raise(rb_eTypeError, "class or module required"); + } + + while (cl) { + if (cl == c || RCLASS(cl)->m_tbl == RCLASS(c)->m_tbl) + return Qtrue; + cl = RCLASS(cl)->super; + } + return Qfalse; +} + + +/* + * Document-method: inherited + * + * call-seq: + * inherited(subclass) + * + * Callback invoked whenever a subclass of the current class is created. + * + * Example: + * + * class Foo + * def self.inherited(subclass) + * puts "New subclass: #{subclass}" + * end + * end + * + * class Bar < Foo + * end + * + * class Baz < Bar + * end + * + * produces: + * + * New subclass: Bar + * New subclass: Baz + */ + +/* + * Document-method: singleton_method_added + * + * call-seq: + * singleton_method_added(symbol) + * + * Invoked as a callback whenever a singleton method is added to the + * receiver. + * + * module Chatty + * def Chatty.singleton_method_added(id) + * puts "Adding #{id.id2name}" + * end + * def self.one() end + * def two() end + * def Chatty.three() end + * end + * + * <em>produces:</em> + * + * Adding singleton_method_added + * Adding one + * Adding three + * + */ + +/* + * Document-method: singleton_method_removed + * + * call-seq: + * singleton_method_removed(symbol) + * + * Invoked as a callback whenever a singleton method is removed from + * the receiver. + * + * module Chatty + * def Chatty.singleton_method_removed(id) + * puts "Removing #{id.id2name}" + * end + * def self.one() end + * def two() end + * def Chatty.three() end + * class <<self + * remove_method :three + * remove_method :one + * end + * end + * + * <em>produces:</em> + * + * Removing three + * Removing one + */ + +/* + * Document-method: singleton_method_undefined + * + * call-seq: + * singleton_method_undefined(symbol) + * + * Invoked as a callback whenever a singleton method is undefined in + * the receiver. + * + * module Chatty + * def Chatty.singleton_method_undefined(id) + * puts "Undefining #{id.id2name}" + * end + * def Chatty.one() end + * class << self + * undef_method(:one) + * end + * end + * + * <em>produces:</em> + * + * Undefining one + */ + + +/* + * Document-method: included + * + * call-seq: + * included( othermod ) + * + * Callback invoked whenever the receiver is included in another + * module or class. This should be used in preference to + * <tt>Module.append_features</tt> if your code wants to perform some + * action when a module is included in another. + * + * module A + * def A.included(mod) + * puts "#{self} included in #{mod}" + * end + * end + * module Enumerable + * include A + * end + */ + + +/* + * Not documented + */ + +static VALUE +rb_obj_dummy() +{ + return Qnil; +} + +/* + * call-seq: + * obj.tainted? => true or false + * + * Returns <code>true</code> if the object is tainted. + */ + +VALUE +rb_obj_tainted(obj) + VALUE obj; +{ + if (OBJ_TAINTED(obj)) + return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * obj.taint -> obj + * + * Marks <i>obj</i> as tainted---if the <code>$SAFE</code> level is + * set appropriately, many method calls which might alter the running + * programs environment will refuse to accept tainted strings. + */ + +VALUE +rb_obj_taint(obj) + VALUE obj; +{ + rb_secure(4); + if (!OBJ_TAINTED(obj)) { + if (OBJ_FROZEN(obj)) { + rb_error_frozen("object"); + } + OBJ_TAINT(obj); + } + return obj; +} + + +/* + * call-seq: + * obj.untaint => obj + * + * Removes the taint from <i>obj</i>. + */ + +VALUE +rb_obj_untaint(obj) + VALUE obj; +{ + rb_secure(3); + if (OBJ_TAINTED(obj)) { + if (OBJ_FROZEN(obj)) { + rb_error_frozen("object"); + } + FL_UNSET(obj, FL_TAINT); + } + return obj; +} + +void +rb_obj_infect(obj1, obj2) + VALUE obj1, obj2; +{ + OBJ_INFECT(obj1, obj2); +} + + +/* + * call-seq: + * obj.freeze => obj + * + * Prevents further modifications to <i>obj</i>. A + * <code>TypeError</code> will be raised if modification is attempted. + * There is no way to unfreeze a frozen object. See also + * <code>Object#frozen?</code>. + * + * a = [ "a", "b", "c" ] + * a.freeze + * a << "z" + * + * <em>produces:</em> + * + * prog.rb:3:in `<<': can't modify frozen array (TypeError) + * from prog.rb:3 + */ + +VALUE +rb_obj_freeze(obj) + VALUE obj; +{ + if (!OBJ_FROZEN(obj)) { + if (rb_safe_level() >= 4 && !OBJ_TAINTED(obj)) { + rb_raise(rb_eSecurityError, "Insecure: can't freeze object"); + } + OBJ_FREEZE(obj); + } + return obj; +} + +/* + * call-seq: + * obj.frozen? => true or false + * + * Returns the freeze status of <i>obj</i>. + * + * a = [ "a", "b", "c" ] + * a.freeze #=> ["a", "b", "c"] + * a.frozen? #=> true + */ + +static VALUE +rb_obj_frozen_p(obj) + VALUE obj; +{ + if (OBJ_FROZEN(obj)) return Qtrue; + return Qfalse; +} + + +/* + * Document-class: NilClass + * + * The class of the singleton object <code>nil</code>. + */ + +/* + * call-seq: + * nil.to_i => 0 + * + * Always returns zero. + * + * nil.to_i #=> 0 + */ + + +static VALUE +nil_to_i(obj) + VALUE obj; +{ + return INT2FIX(0); +} + +/* + * call-seq: + * nil.to_f => 0.0 + * + * Always returns zero. + * + * nil.to_f #=> 0.0 + */ + +static VALUE +nil_to_f(obj) + VALUE obj; +{ + return rb_float_new(0.0); +} + +/* + * call-seq: + * nil.to_s => "" + * + * Always returns the empty string. + * + * nil.to_s #=> "" + */ + +static VALUE +nil_to_s(obj) + VALUE obj; +{ + return rb_str_new2(""); +} + +/* + * call-seq: + * nil.to_a => [] + * + * Always returns an empty array. + * + * nil.to_a #=> [] + */ + +static VALUE +nil_to_a(obj) + VALUE obj; +{ + return rb_ary_new2(0); +} + +/* + * call-seq: + * nil.inspect => "nil" + * + * Always returns the string "nil". + */ + +static VALUE +nil_inspect(obj) + VALUE obj; +{ + return rb_str_new2("nil"); +} + +static VALUE +main_to_s(obj) + VALUE obj; +{ + return rb_str_new2("main"); +} + + +/*********************************************************************** + * Document-class: TrueClass + * + * The global value <code>true</code> is the only instance of class + * <code>TrueClass</code> and represents a logically true value in + * boolean expressions. The class provides operators allowing + * <code>true</code> to be used in logical expressions. + */ + + +/* + * call-seq: + * true.to_s => "true" + * + * The string representation of <code>true</code> is "true". + */ + +static VALUE +true_to_s(obj) + VALUE obj; +{ + return rb_str_new2("true"); +} + + +/* + * call-seq: + * true & obj => true or false + * + * And---Returns <code>false</code> if <i>obj</i> is + * <code>nil</code> or <code>false</code>, <code>true</code> otherwise. + */ + +static VALUE +true_and(obj, obj2) + VALUE obj, obj2; +{ + return RTEST(obj2)?Qtrue:Qfalse; +} + +/* + * call-seq: + * true | obj => true + * + * Or---Returns <code>true</code>. As <i>anObject</i> is an argument to + * a method call, it is always evaluated; there is no short-circuit + * evaluation in this case. + * + * true | puts("or") + * true || puts("logical or") + * + * <em>produces:</em> + * + * or + */ + +static VALUE +true_or(obj, obj2) + VALUE obj, obj2; +{ + return Qtrue; +} + + +/* + * call-seq: + * true ^ obj => !obj + * + * Exclusive Or---Returns <code>true</code> if <i>obj</i> is + * <code>nil</code> or <code>false</code>, <code>false</code> + * otherwise. + */ + +static VALUE +true_xor(obj, obj2) + VALUE obj, obj2; +{ + return RTEST(obj2)?Qfalse:Qtrue; +} + + +/* + * Document-class: FalseClass + * + * The global value <code>false</code> is the only instance of class + * <code>FalseClass</code> and represents a logically false value in + * boolean expressions. The class provides operators allowing + * <code>false</code> to participate correctly in logical expressions. + * + */ + +/* + * call-seq: + * false.to_s => "false" + * + * 'nuf said... + */ + +static VALUE +false_to_s(obj) + VALUE obj; +{ + return rb_str_new2("false"); +} + +/* + * call-seq: + * false & obj => false + * nil & obj => false + * + * And---Returns <code>false</code>. <i>obj</i> is always + * evaluated as it is the argument to a method call---there is no + * short-circuit evaluation in this case. + */ + +static VALUE +false_and(obj, obj2) + VALUE obj, obj2; +{ + return Qfalse; +} + + +/* + * call-seq: + * false | obj => true or false + * nil | obj => true or false + * + * Or---Returns <code>false</code> if <i>obj</i> is + * <code>nil</code> or <code>false</code>; <code>true</code> otherwise. + */ + +static VALUE +false_or(obj, obj2) + VALUE obj, obj2; +{ + return RTEST(obj2)?Qtrue:Qfalse; +} + + + +/* + * call-seq: + * false ^ obj => true or false + * nil ^ obj => true or false + * + * Exclusive Or---If <i>obj</i> is <code>nil</code> or + * <code>false</code>, returns <code>false</code>; otherwise, returns + * <code>true</code>. + * + */ + +static VALUE +false_xor(obj, obj2) + VALUE obj, obj2; +{ + return RTEST(obj2)?Qtrue:Qfalse; +} + +/* + * call_seq: + * nil.nil? => true + * + * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>. + */ + +static VALUE +rb_true(obj) + VALUE obj; +{ + return Qtrue; +} + +/* + * call_seq: + * nil.nil? => true + * <anything_else>.nil? => false + * + * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>. + */ + + +static VALUE +rb_false(obj) + VALUE obj; +{ + return Qfalse; +} + + +/* + * call-seq: + * obj =~ other => false + * + * Pattern Match---Overridden by descendents (notably + * <code>Regexp</code> and <code>String</code>) to provide meaningful + * pattern-match semantics. + */ + +static VALUE +rb_obj_pattern_match(obj1, obj2) + VALUE obj1, obj2; +{ + return Qfalse; +} + +/********************************************************************** + * Document-class: Symbol + * + * <code>Symbol</code> objects represent names and some strings + * inside the Ruby + * interpreter. They are generated using the <code>:name</code> and + * <code>:"string"</code> literals + * syntax, and by the various <code>to_sym</code> methods. The same + * <code>Symbol</code> object will be created for a given name or string + * for the duration of a program's execution, regardless of the context + * or meaning of that name. Thus if <code>Fred</code> is a constant in + * one context, a method in another, and a class in a third, the + * <code>Symbol</code> <code>:Fred</code> will be the same object in + * all three contexts. + * + * module One + * class Fred + * end + * $f1 = :Fred + * end + * module Two + * Fred = 1 + * $f2 = :Fred + * end + * def Fred() + * end + * $f3 = :Fred + * $f1.id #=> 2514190 + * $f2.id #=> 2514190 + * $f3.id #=> 2514190 + * + */ + +/* + * call-seq: + * sym.to_i => fixnum + * + * Returns an integer that is unique for each symbol within a + * particular execution of a program. + * + * :fred.to_i #=> 9809 + * "fred".to_sym.to_i #=> 9809 + */ + +static VALUE +sym_to_i(sym) + VALUE sym; +{ + ID id = SYM2ID(sym); + + return LONG2FIX(id); +} + + +/* :nodoc: */ + +static VALUE +sym_to_int(sym) + VALUE sym; +{ + rb_warning("treating Symbol as an integer"); + return sym_to_i(sym); +} + + +/* + * call-seq: + * sym.inspect => string + * + * Returns the representation of <i>sym</i> as a symbol literal. + * + * :fred.inspect #=> ":fred" + */ + +static VALUE +sym_inspect(sym) + VALUE sym; +{ + VALUE str; + char *name; + ID id = SYM2ID(sym); + + name = rb_id2name(id); + str = rb_str_new(0, strlen(name)+1); + RSTRING(str)->ptr[0] = ':'; + strcpy(RSTRING(str)->ptr+1, name); + if (!rb_symname_p(name)) { + str = rb_str_dump(str); + strncpy(RSTRING(str)->ptr, ":\"", 2); + } + return str; +} + + +/* + * call-seq: + * sym.id2name => string + * sym.to_s => string + * + * Returns the name or string corresponding to <i>sym</i>. + * + * :fred.id2name #=> "fred" + */ + + +static VALUE +sym_to_s(sym) + VALUE sym; +{ + return rb_str_new2(rb_id2name(SYM2ID(sym))); +} + + +/* + * call-seq: + * sym.to_sym => sym + * + * In general, <code>to_sym</code> returns the <code>Symbol</code> corresponding + * to an object. As <i>sym</i> is already a symbol, <code>self</code> is returned + * in this case. + */ + +static VALUE +sym_to_sym(sym) + VALUE sym; +{ + return sym; +} + + +/*********************************************************************** + * + * Document-class: Module + * + * A <code>Module</code> is a collection of methods and constants. The + * methods in a module may be instance methods or module methods. + * Instance methods appear as methods in a class when the module is + * included, module methods do not. Conversely, module methods may be + * called without creating an encapsulating object, while instance + * methods may not. (See <code>Module#module_function</code>) + * + * In the descriptions that follow, the parameter <i>syml</i> refers + * to a symbol, which is either a quoted string or a + * <code>Symbol</code> (such as <code>:name</code>). + * + * module Mod + * include Math + * CONST = 1 + * def meth + * # ... + * end + * end + * Mod.class #=> Module + * Mod.constants #=> ["E", "PI", "CONST"] + * Mod.instance_methods #=> ["meth"] + * + */ + +/* + * call-seq: + * mod.to_s => string + * + * Return a string representing this module or class. For basic + * classes and modules, this is the name. For singletons, we + * show information on the thing we're attached to as well. + */ + +static VALUE +rb_mod_to_s(klass) + VALUE klass; + +{ + if (FL_TEST(klass, FL_SINGLETON)) { + VALUE s = rb_str_new2("#<"); + VALUE v = rb_iv_get(klass, "__attached__"); + + rb_str_cat2(s, "Class:"); + switch (TYPE(v)) { + case T_CLASS: case T_MODULE: + rb_str_append(s, rb_inspect(v)); + break; + default: + rb_str_append(s, rb_any_to_s(v)); + break; + } + rb_str_cat2(s, ">"); + + return s; + } + return rb_str_dup(rb_class_name(klass)); +} + +/* + * call-seq: + * mod.freeze + * + * Prevents further modifications to <i>mod</i>. + */ + +static VALUE +rb_mod_freeze(mod) + VALUE mod; +{ + rb_mod_to_s(mod); + return rb_obj_freeze(mod); +} + +/* + * call-seq: + * mod === obj => true or false + * + * Case Equality---Returns <code>true</code> if <i>anObject</i> is an + * instance of <i>mod</i> or one of <i>mod</i>'s descendents. Of + * limited use for modules, but can be used in <code>case</code> + * statements to classify objects by class. + */ + +static VALUE +rb_mod_eqq(mod, arg) + VALUE mod, arg; +{ + return rb_obj_is_kind_of(arg, mod); +} + +/* + * call-seq: + * mod <= other => true, false, or nil + * + * Returns true if <i>mod</i> is a subclass of <i>other</i> or + * is the same as <i>other</i>. Returns + * <code>nil</code> if there's no relationship between the two. + * (Think of the relationship in terms of the class definition: + * "class A<B" implies "A<B"). + * + */ + +VALUE +rb_class_inherited_p(mod, arg) + VALUE mod, arg; +{ + VALUE start = mod; + + if (mod == arg) return Qtrue; + switch (TYPE(arg)) { + case T_MODULE: + case T_CLASS: + break; + default: + rb_raise(rb_eTypeError, "compared with non class/module"); + } + + if (FL_TEST(mod, FL_SINGLETON)) { + if (RCLASS(mod)->m_tbl == RCLASS(arg)->m_tbl) + return Qtrue; + mod = RBASIC(mod)->klass; + } + while (mod) { + if (RCLASS(mod)->m_tbl == RCLASS(arg)->m_tbl) + return Qtrue; + mod = RCLASS(mod)->super; + } + /* not mod < arg; check if mod > arg */ + while (arg) { + if (RCLASS(arg)->m_tbl == RCLASS(start)->m_tbl) + return Qfalse; + arg = RCLASS(arg)->super; + } + return Qnil; +} + +/* + * call-seq: + * mod < other => true, false, or nil + * + * Returns true if <i>mod</i> is a subclass of <i>other</i>. Returns + * <code>nil</code> if there's no relationship between the two. + * (Think of the relationship in terms of the class definition: + * "class A<B" implies "A<B"). + * + */ + +static VALUE +rb_mod_lt(mod, arg) + VALUE mod, arg; +{ + if (mod == arg) return Qfalse; + return rb_class_inherited_p(mod, arg); +} + + +/* + * call-seq: + * mod >= other => true, false, or nil + * + * Returns true if <i>mod</i> is an ancestor of <i>other</i>, or the + * two modules are the same. Returns + * <code>nil</code> if there's no relationship between the two. + * (Think of the relationship in terms of the class definition: + * "class A<B" implies "B>A"). + * + */ + +static VALUE +rb_mod_ge(mod, arg) + VALUE mod, arg; +{ + switch (TYPE(arg)) { + case T_MODULE: + case T_CLASS: + break; + default: + rb_raise(rb_eTypeError, "compared with non class/module"); + } + + return rb_class_inherited_p(arg, mod); +} + +/* + * call-seq: + * mod > other => true, false, or nil + * + * Returns true if <i>mod</i> is an ancestor of <i>other</i>. Returns + * <code>nil</code> if there's no relationship between the two. + * (Think of the relationship in terms of the class definition: + * "class A<B" implies "B>A"). + * + */ + +static VALUE +rb_mod_gt(mod, arg) + VALUE mod, arg; +{ + if (mod == arg) return Qfalse; + return rb_mod_ge(mod, arg); +} + +/* + * call-seq: + * mod <=> other_mod => -1, 0, +1, or nil + * + * Comparison---Returns -1 if <i>mod</i> includes <i>other_mod</i>, 0 if + * <i>mod</i> is the same as <i>other_mod</i>, and +1 if <i>mod</i> is + * included by <i>other_mod</i> or if <i>mod</i> has no relationship with + * <i>other_mod</i>. Returns <code>nil</code> if <i>other_mod</i> is + * not a module. + */ + +static VALUE +rb_mod_cmp(mod, arg) + VALUE mod, arg; +{ + VALUE cmp; + + if (mod == arg) return INT2FIX(0); + switch (TYPE(arg)) { + case T_MODULE: + case T_CLASS: + break; + default: + return Qnil; + } + + cmp = rb_class_inherited_p(mod, arg); + if (NIL_P(cmp)) return Qnil; + if (cmp) { + return INT2FIX(-1); + } + return INT2FIX(1); +} + +static VALUE rb_module_s_alloc _((VALUE)); +static VALUE +rb_module_s_alloc(klass) + VALUE klass; +{ + VALUE mod = rb_module_new(); + + RBASIC(mod)->klass = klass; + return mod; +} + +static VALUE rb_class_s_alloc _((VALUE)); +static VALUE +rb_class_s_alloc(klass) + VALUE klass; +{ + return rb_class_boot(0); +} + +/* + * call-seq: + * Module.new => mod + * Module.new {|mod| block } => mod + * + * Creates a new anonymous module. If a block is given, it is passed + * the module object, and the block is evaluated in the context of this + * module using <code>module_eval</code>. + * + * Fred = Module.new do + * def meth1 + * "hello" + * end + * def meth2 + * "bye" + * end + * end + * a = "my string" + * a.extend(Fred) #=> "my string" + * a.meth1 #=> "hello" + * a.meth2 #=> "bye" + */ + +static VALUE +rb_mod_initialize(module) + VALUE module; +{ + if (rb_block_given_p()) { + rb_mod_module_eval(0, 0, module); + } + return Qnil; +} + +/* + * call-seq: + * Class.new(super_class=Object) => a_class + * + * Creates a new anonymous (unnamed) class with the given superclass + * (or <code>Object</code> if no parameter is given). You can give a + * class a name by assigning the class object to a constant. + * + */ + +static VALUE +rb_class_initialize(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + VALUE super; + + if (RCLASS(klass)->super != 0) { + rb_raise(rb_eTypeError, "already initialized class"); + } + if (rb_scan_args(argc, argv, "01", &super) == 0) { + super = rb_cObject; + } + else { + rb_check_inheritable(super); + } + RCLASS(klass)->super = super; + rb_make_metaclass(klass, RBASIC(super)->klass); + rb_mod_initialize(klass); + rb_class_inherited(super, klass); + + return klass; +} + +/* + * call-seq: + * class.allocate() => obj + * + * Allocates space for a new object of <i>class</i>'s class. The + * returned object must be an instance of <i>class</i>. + * + */ + +VALUE +rb_obj_alloc(klass) + VALUE klass; +{ + VALUE obj; + + if (RCLASS(klass)->super == 0) { + rb_raise(rb_eTypeError, "can't instantiate uninitialized class"); + } + if (FL_TEST(klass, FL_SINGLETON)) { + rb_raise(rb_eTypeError, "can't create instance of virtual class"); + } + obj = rb_funcall(klass, ID_ALLOCATOR, 0, 0); + if (rb_obj_class(obj) != rb_class_real(klass)) { + rb_raise(rb_eTypeError, "wrong instance allocation"); + } + return obj; +} + +static VALUE rb_class_allocate_instance _((VALUE)); +static VALUE +rb_class_allocate_instance(klass) + VALUE klass; +{ + NEWOBJ(obj, struct RObject); + OBJSETUP(obj, klass, T_OBJECT); + return (VALUE)obj; +} + +/* + * call-seq: + * class.new(args, ...) => obj + * + * Calls <code>allocate</code> to create a new object of + * <i>class</i>'s class, then invokes that object's + * <code>initialize</code> method, passing it <i>args</i>. + * This is the method that ends up getting called whenever + * an object is constructed using .new. + * + */ + +VALUE +rb_class_new_instance(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + VALUE obj; + + obj = rb_obj_alloc(klass); + rb_obj_call_init(obj, argc, argv); + + return obj; +} + +/* + * call-seq: + * class.superclass -> a_super_class or nil + * + * Returns the superclass of <i>class</i>, or <code>nil</code>. + * + * File.superclass #=> IO + * IO.superclass #=> Object + * Object.superclass #=> nil + * + */ + +static VALUE +rb_class_superclass(klass) + VALUE klass; +{ + VALUE super = RCLASS(klass)->super; + + if (!super) { + rb_raise(rb_eTypeError, "uninitialized class"); + } + if (FL_TEST(klass, FL_SINGLETON)) { + super = RBASIC(klass)->klass; + } + while (TYPE(super) == T_ICLASS) { + super = RCLASS(super)->super; + } + if (!super) { + return Qnil; + } + return super; +} + +static ID +str_to_id(str) + VALUE str; +{ + VALUE sym = rb_str_intern(str); + + return SYM2ID(sym); +} + +ID +rb_to_id(name) + VALUE name; +{ + VALUE tmp; + ID id; + + switch (TYPE(name)) { + case T_STRING: + return str_to_id(name); + case T_FIXNUM: + rb_warn("do not use Fixnums as Symbols"); + id = FIX2LONG(name); + if (!rb_id2name(id)) { + rb_raise(rb_eArgError, "%ld is not a symbol", id); + } + break; + case T_SYMBOL: + id = SYM2ID(name); + break; + default: + tmp = rb_check_string_type(name); + if (!NIL_P(tmp)) { + return str_to_id(tmp); + } + rb_raise(rb_eTypeError, "%s is not a symbol", RSTRING(rb_inspect(name))->ptr); + } + return id; +} + +/* + * call-seq: + * attr(symbol, writable=false) => nil + * + * Defines a named attribute for this module, where the name is + * <i>symbol.</i><code>id2name</code>, creating an instance variable + * (<code>@name</code>) and a corresponding access method to read it. + * If the optional <i>writable</i> argument is <code>true</code>, also + * creates a method called <code>name=</code> to set the attribute. + * + * module Mod + * attr :size, true + * end + * + * <em>is equivalent to:</em> + * + * module Mod + * def size + * @size + * end + * def size=(val) + * @size = val + * end + * end + */ + +static VALUE +rb_mod_attr(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + VALUE name, pub; + + rb_scan_args(argc, argv, "11", &name, &pub); + rb_attr(klass, rb_to_id(name), 1, RTEST(pub), Qtrue); + return Qnil; +} + +/* + * call-seq: + * attr_reader(symbol, ...) => nil + * + * Creates instance variables and corresponding methods that return the + * value of each instance variable. Equivalent to calling + * ``<code>attr</code><i>:name</i>'' on each name in turn. + */ + +static VALUE +rb_mod_attr_reader(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + int i; + + for (i=0; i<argc; i++) { + rb_attr(klass, rb_to_id(argv[i]), 1, 0, Qtrue); + } + return Qnil; +} + +/* + * call-seq: + * attr_writer(symbol, ...) => nil + * + * Creates an accessor method to allow assignment to the attribute + * <i>aSymbol</i><code>.id2name</code>. + */ + +static VALUE +rb_mod_attr_writer(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + int i; + + for (i=0; i<argc; i++) { + rb_attr(klass, rb_to_id(argv[i]), 0, 1, Qtrue); + } + return Qnil; +} + +/* + * call-seq: + * attr_accessor(symbol, ...) => nil + * + * Equivalent to calling ``<code>attr</code><i>symbol</i><code>, + * true</code>'' on each <i>symbol</i> in turn. + * + * module Mod + * attr_accessor(:one, :two) + * end + * Mod.instance_methods.sort #=> ["one", "one=", "two", "two="] + */ + +static VALUE +rb_mod_attr_accessor(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + int i; + + for (i=0; i<argc; i++) { + rb_attr(klass, rb_to_id(argv[i]), 1, 1, Qtrue); + } + return Qnil; +} + +/* + * call-seq: + * mod.const_get(sym) => obj + * + * Returns the value of the named constant in <i>mod</i>. + * + * Math.const_get(:PI) #=> 3.14159265358979 + */ + +static VALUE +rb_mod_const_get(mod, name) + VALUE mod, name; +{ + ID id = rb_to_id(name); + + if (!rb_is_const_id(id)) { + rb_name_error(id, "wrong constant name %s", rb_id2name(id)); + } + return rb_const_get(mod, id); +} + +/* + * call-seq: + * mod.const_set(sym, obj) => obj + * + * Sets the named constant to the given object, returning that object. + * Creates a new constant if no constant with the given name previously + * existed. + * + * Math.const_set("HIGH_SCHOOL_PI", 22.0/7.0) #=> 3.14285714285714 + * Math::HIGH_SCHOOL_PI - Math::PI #=> 0.00126448926734968 + */ + +static VALUE +rb_mod_const_set(mod, name, value) + VALUE mod, name, value; +{ + ID id = rb_to_id(name); + + if (!rb_is_const_id(id)) { + rb_name_error(id, "wrong constant name %s", rb_id2name(id)); + } + rb_const_set(mod, id, value); + return value; +} + +/* + * call-seq: + * mod.const_defined?(sym) => true or false + * + * Returns <code>true</code> if a constant with the given name is + * defined by <i>mod</i>. + * + * Math.const_defined? "PI" #=> true + */ + +static VALUE +rb_mod_const_defined(mod, name) + VALUE mod, name; +{ + ID id = rb_to_id(name); + + if (!rb_is_const_id(id)) { + rb_name_error(id, "wrong constant name %s", rb_id2name(id)); + } + return rb_const_defined_at(mod, id); +} + +/* + * call-seq: + * obj.methods => array + * + * Returns a list of the names of methods publicly accessible in + * <i>obj</i>. This will include all the methods accessible in + * <i>obj</i>'s ancestors. + * + * class Klass + * def kMethod() + * end + * end + * k = Klass.new + * k.methods[0..9] #=> ["kMethod", "freeze", "nil?", "is_a?", + * "class", "instance_variable_set", + * "methods", "extend", "__send__", "instance_eval"] + * k.methods.length #=> 42 + */ + +static VALUE +rb_obj_methods(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + retry: + if (argc == 0) { + VALUE args[1]; + + args[0] = Qtrue; + return rb_class_instance_methods(1, args, CLASS_OF(obj)); + } + else { + VALUE recur; + + rb_scan_args(argc, argv, "1", &recur); + if (RTEST(recur)) { + argc = 0; + goto retry; + } + return rb_obj_singleton_methods(argc, argv, obj); + } +} + +/* + * call-seq: + * obj.protected_methods(all=true) => array + * + * Returns the list of protected methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + */ + +static VALUE +rb_obj_protected_methods(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + if (argc == 0) { /* hack to stop warning */ + VALUE args[1]; + + args[0] = Qtrue; + return rb_class_protected_instance_methods(1, args, CLASS_OF(obj)); + } + return rb_class_protected_instance_methods(argc, argv, CLASS_OF(obj)); +} + +/* + * call-seq: + * obj.private_methods(all=true) => array + * + * Returns the list of private methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + */ + +static VALUE +rb_obj_private_methods(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + if (argc == 0) { /* hack to stop warning */ + VALUE args[1]; + + args[0] = Qtrue; + return rb_class_private_instance_methods(1, args, CLASS_OF(obj)); + } + return rb_class_private_instance_methods(argc, argv, CLASS_OF(obj)); +} + +/* + * call-seq: + * obj.public_methods(all=true) => array + * + * Returns the list of public methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + */ + +static VALUE +rb_obj_public_methods(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + if (argc == 0) { /* hack to stop warning */ + VALUE args[1]; + + args[0] = Qtrue; + return rb_class_public_instance_methods(1, args, CLASS_OF(obj)); + } + return rb_class_public_instance_methods(argc, argv, CLASS_OF(obj)); +} + +/* + * call-seq: + * obj.instance_variable_get(symbol) => obj + * + * Returns the value of the given instance variable, or nil if the + * instance variable is not set. The <code>@</code> part of the + * variable name should be included for regular instance + * variables. Throws a <code>NameError</code> exception if the + * supplied symbol is not valid as an instance variable name. + * + * class Fred + * def initialize(p1, p2) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99) + * fred.instance_variable_get(:@a) #=> "cat" + * fred.instance_variable_get("@b") #=> 99 + */ + +static VALUE +rb_obj_ivar_get(obj, iv) + VALUE obj, iv; +{ + ID id = rb_to_id(iv); + + if (!rb_is_instance_id(id)) { + rb_name_error(id, "`%s' is not allowed as an instance variable name", rb_id2name(id)); + } + return rb_ivar_get(obj, id); +} + +/* + * call-seq: + * obj.instance_variable_set(symbol, obj) => obj + * + * Sets the instance variable names by <i>symbol</i> to + * <i>object</i>, thereby frustrating the efforts of the class's + * author to attempt to provide proper encapsulation. The variable + * did not have to exist prior to this call. + * + * class Fred + * def initialize(p1, p2) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99) + * fred.instance_variable_set(:@a, 'dog') #=> "dog" + * fred.instance_variable_set(:@c, 'cat') #=> "cat" + * fred.inspect #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">" + */ + +static VALUE +rb_obj_ivar_set(obj, iv, val) + VALUE obj, iv, val; +{ + ID id = rb_to_id(iv); + + if (!rb_is_instance_id(id)) { + rb_name_error(id, "`%s' is not allowed as an instance variable name", rb_id2name(id)); + } + return rb_ivar_set(obj, id, val); +} + +/* + * call-seq: + * obj.instance_variable_defined?(symbol) => true or false + * + * Returns <code>true</code> if the given instance variable is + * defined in <i>obj</i>. + * + * class Fred + * def initialize(p1, p2) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99) + * fred.instance_variable_defined?(:@a) #=> true + * fred.instance_variable_defined?("@b") #=> true + * fred.instance_variable_defined?("@c") #=> false + */ + +static VALUE +rb_obj_ivar_defined(obj, iv) + VALUE obj, iv; +{ + ID id = rb_to_id(iv); + + if (!rb_is_instance_id(id)) { + rb_name_error(id, "`%s' is not allowed as an instance variable name", rb_id2name(id)); + } + return rb_ivar_defined(obj, id); +} + +/* + * call-seq: + * mod.class_variable_get(symbol) => obj + * + * Returns the value of the given class variable (or throws a + * <code>NameError</code> exception). The <code>@@</code> part of the + * variable name should be included for regular class variables + * + * class Fred + * @@foo = 99 + * end + * + * def Fred.foo + * class_variable_get(:@@foo) #=> 99 + * end + */ + +static VALUE +rb_mod_cvar_get(obj, iv) + VALUE obj, iv; +{ + ID id = rb_to_id(iv); + + if (!rb_is_class_id(id)) { + rb_name_error(id, "`%s' is not allowed as a class variable name", rb_id2name(id)); + } + return rb_cvar_get(obj, id); +} + +/* + * call-seq: + * obj.class_variable_set(symbol, obj) => obj + * + * Sets the class variable names by <i>symbol</i> to + * <i>object</i>. + * + * class Fred + * @@foo = 99 + * def foo + * @@foo + * end + * end + * + * def Fred.foo + * class_variable_set(:@@foo, 101) #=> 101 + * end + * Fred.foo + * Fred.new.foo #=> 101 + */ + +static VALUE +rb_mod_cvar_set(obj, iv, val) + VALUE obj, iv, val; +{ + ID id = rb_to_id(iv); + + if (!rb_is_class_id(id)) { + rb_name_error(id, "`%s' is not allowed as a class variable name", rb_id2name(id)); + } + rb_cvar_set(obj, id, val, Qfalse); + return val; +} + +/* + * call-seq: + * obj.class_variable_defined?(symbol) => true or false + * + * Returns <code>true</code> if the given class variable is defined + * in <i>obj</i>. + * + * class Fred + * @@foo = 99 + * end + * Fred.class_variable_defined?(:@@foo) #=> true + * Fred.class_variable_defined?(:@@bar) #=> false + */ + +static VALUE +rb_mod_cvar_defined(obj, iv) + VALUE obj, iv; +{ + ID id = rb_to_id(iv); + + if (!rb_is_class_id(id)) { + rb_name_error(id, "`%s' is not allowed as a class variable name", rb_id2name(id)); + } + return rb_cvar_defined(obj, id); +} + +static VALUE +convert_type(val, tname, method, raise) + VALUE val; + const char *tname, *method; + int raise; +{ + ID m; + + m = rb_intern(method); + if (!rb_respond_to(val, m)) { + if (raise) { + rb_raise(rb_eTypeError, "can't convert %s into %s", + NIL_P(val) ? "nil" : + val == Qtrue ? "true" : + val == Qfalse ? "false" : + rb_obj_classname(val), + tname); + } + else { + return Qnil; + } + } + return rb_funcall(val, m, 0); +} + +VALUE +rb_convert_type(val, type, tname, method) + VALUE val; + int type; + const char *tname, *method; +{ + VALUE v; + + if (TYPE(val) == type) return val; + v = convert_type(val, tname, method, Qtrue); + if (TYPE(v) != type) { + rb_raise(rb_eTypeError, "%s#%s should return %s", + rb_obj_classname(val), method, tname); + } + return v; +} + +VALUE +rb_check_convert_type(val, type, tname, method) + VALUE val; + int type; + const char *tname, *method; +{ + VALUE v; + + /* always convert T_DATA */ + if (TYPE(val) == type && type != T_DATA) return val; + v = convert_type(val, tname, method, Qfalse); + if (NIL_P(v)) return Qnil; + if (TYPE(v) != type) { + rb_raise(rb_eTypeError, "%s#%s should return %s", + rb_obj_classname(val), method, tname); + } + return v; +} + + +static VALUE +rb_to_integer(val, method) + VALUE val; + const char *method; +{ + VALUE v = convert_type(val, "Integer", method, Qtrue); + if (!rb_obj_is_kind_of(v, rb_cInteger)) { + rb_raise(rb_eTypeError, "%s#%s should return Integer", + rb_obj_classname(val), method); + } + return v; +} + +VALUE +rb_to_int(val) + VALUE val; +{ + return rb_to_integer(val, "to_int"); +} + +VALUE +rb_Integer(val) + VALUE val; +{ + VALUE tmp; + + switch (TYPE(val)) { + case T_FLOAT: + if (RFLOAT(val)->value <= (double)FIXNUM_MAX + && RFLOAT(val)->value >= (double)FIXNUM_MIN) { + break; + } + return rb_dbl2big(RFLOAT(val)->value); + + case T_FIXNUM: + case T_BIGNUM: + return val; + + case T_STRING: + return rb_str_to_inum(val, 0, Qtrue); + + default: + break; + } + tmp = convert_type(val, "Integer", "to_int", Qfalse); + if (NIL_P(tmp)) { + return rb_to_integer(val, "to_i"); + } + return tmp; +} + +/* + * call-seq: + * Integer(arg) => integer + * + * Converts <i>arg</i> to a <code>Fixnum</code> or <code>Bignum</code>. + * Numeric types are converted directly (with floating point numbers + * being truncated). If <i>arg</i> is a <code>String</code>, leading + * radix indicators (<code>0</code>, <code>0b</code>, and + * <code>0x</code>) are honored. Others are converted using + * <code>to_int</code> and <code>to_i</code>. This behavior is + * different from that of <code>String#to_i</code>. + * + * Integer(123.999) #=> 123 + * Integer("0x1a") #=> 26 + * Integer(Time.new) #=> 1049896590 + */ + +static VALUE +rb_f_integer(obj, arg) + VALUE obj, arg; +{ + return rb_Integer(arg); +} + +double +rb_cstr_to_dbl(p, badcheck) + const char *p; + int badcheck; +{ + const char *q; + char *end; + double d; + const char *ellipsis = ""; + int w; +#define OutOfRange() (((w = end - p) > 20) ? (w = 20, ellipsis = "...") : (ellipsis = "")) + + if (!p) return 0.0; + q = p; + if (badcheck) { + while (ISSPACE(*p)) p++; + } + else { + while (ISSPACE(*p) || *p == '_') p++; + } + errno = 0; + d = strtod(p, &end); + if (errno == ERANGE) { + OutOfRange(); + rb_warn("Float %.*s%s out of range", w, p, ellipsis); + errno = 0; + } + if (p == end) { + if (badcheck) { + bad: + rb_invalid_str(q, "Float()"); + } + return d; + } + if (*end) { + char *buf = ALLOCA_N(char, strlen(p)+1); + char *n = buf; + + while (p < end) *n++ = *p++; + while (*p) { + if (*p == '_') { + /* remove underscores between digits */ + if (badcheck) { + if (n == buf || !ISDIGIT(n[-1])) goto bad; + ++p; + if (!ISDIGIT(*p)) goto bad; + } + else { + while (*++p == '_'); + continue; + } + } + *n++ = *p++; + } + *n = '\0'; + p = buf; + d = strtod(p, &end); + if (errno == ERANGE) { + OutOfRange(); + rb_warn("Float %.*s%s out of range", w, p, ellipsis); + errno = 0; + } + if (badcheck) { + if (!end || p == end) goto bad; + while (*end && ISSPACE(*end)) end++; + if (*end) goto bad; + } + } + if (errno == ERANGE) { + errno = 0; + OutOfRange(); + rb_raise(rb_eArgError, "Float %.*s%s out of range", w, q, ellipsis); + } + return d; +} + +double +rb_str_to_dbl(str, badcheck) + VALUE str; + int badcheck; +{ + char *s; + long len; + + StringValue(str); + s = RSTRING(str)->ptr; + len = RSTRING(str)->len; + if (s) { + if (s[len]) { /* no sentinel somehow */ + char *p = ALLOCA_N(char, len+1); + + MEMCPY(p, s, char, len); + p[len] = '\0'; + s = p; + } + if (badcheck && len != strlen(s)) { + rb_raise(rb_eArgError, "string for Float contains null byte"); + } + } + return rb_cstr_to_dbl(s, badcheck); +} + +VALUE +rb_Float(val) + VALUE val; +{ + switch (TYPE(val)) { + case T_FIXNUM: + return rb_float_new((double)FIX2LONG(val)); + + case T_FLOAT: + return val; + + case T_BIGNUM: + return rb_float_new(rb_big2dbl(val)); + + case T_STRING: + return rb_float_new(rb_str_to_dbl(val, Qtrue)); + + case T_NIL: + rb_raise(rb_eTypeError, "can't convert nil into Float"); + break; + + default: + { + VALUE f = rb_convert_type(val, T_FLOAT, "Float", "to_f"); + if (isnan(RFLOAT(f)->value)) { + rb_raise(rb_eArgError, "invalid value for Float()"); + } + return f; + } + } +} + +/* + * call-seq: + * Float(arg) => float + * + * Returns <i>arg</i> converted to a float. Numeric types are converted + * directly, the rest are converted using <i>arg</i>.to_f. As of Ruby + * 1.8, converting <code>nil</code> generates a <code>TypeError</code>. + * + * Float(1) #=> 1.0 + * Float("123.456") #=> 123.456 + */ + +static VALUE +rb_f_float(obj, arg) + VALUE obj, arg; +{ + return rb_Float(arg); +} + +double +rb_num2dbl(val) + VALUE val; +{ + switch (TYPE(val)) { + case T_FLOAT: + return RFLOAT(val)->value; + + case T_STRING: + rb_raise(rb_eTypeError, "no implicit conversion to float from string"); + break; + + case T_NIL: + rb_raise(rb_eTypeError, "no implicit conversion to float from nil"); + break; + + default: + break; + } + + return RFLOAT(rb_Float(val))->value; +} + +char* +rb_str2cstr(str, len) + VALUE str; + long *len; +{ + StringValue(str); + if (len) *len = RSTRING(str)->len; + else if (RTEST(ruby_verbose) && RSTRING(str)->len != strlen(RSTRING(str)->ptr)) { + rb_warn("string contains \\0 character"); + } + return RSTRING(str)->ptr; +} + +VALUE +rb_String(val) + VALUE val; +{ + return rb_convert_type(val, T_STRING, "String", "to_s"); +} + + +/* + * call-seq: + * String(arg) => string + * + * Converts <i>arg</i> to a <code>String</code> by calling its + * <code>to_s</code> method. + * + * String(self) #=> "main" + * String(self.class #=> "Object" + * String(123456) #=> "123456" + */ + +static VALUE +rb_f_string(obj, arg) + VALUE obj, arg; +{ + return rb_String(arg); +} + +#if 0 +VALUE +rb_Array(val) + VALUE val; +{ + VALUE tmp = rb_check_array_type(val); + + if (NIL_P(tmp)) { + tmp = rb_check_convert_type(val, T_ARRAY, "Array", "to_a"); + if (NIL_P(tmp)) { + return rb_ary_new3(1, val); + } + } + return tmp; +} +#endif + +/* + * call-seq: + * Array(arg) => array + * + * Returns <i>arg</i> as an <code>Array</code>. First tries to call + * <i>arg</i><code>.to_ary</code>, then <i>arg</i><code>.to_a</code>. + * If both fail, creates a single element array containing <i>arg</i> + * (unless <i>arg</i> is <code>nil</code>). + * + * Array(1..5) #=> [1, 2, 3, 4, 5] + */ + +static VALUE +rb_f_array(obj, arg) + VALUE obj, arg; +{ + return rb_Array(arg); +} + +static VALUE +boot_defclass(name, super) + char *name; + VALUE super; +{ + extern st_table *rb_class_tbl; + VALUE obj = rb_class_boot(super); + ID id = rb_intern(name); + + rb_name_class(obj, id); + st_add_direct(rb_class_tbl, id, obj); + rb_const_set((rb_cObject ? rb_cObject : obj), id, obj); + return obj; +} + +VALUE ruby_top_self; + +/* + * Document-class: Class + * + * Classes in Ruby are first-class objects---each is an instance of + * class <code>Class</code>. + * + * When a new class is created (typically using <code>class Name ... + * end</code>), an object of type <code>Class</code> is created and + * assigned to a global constant (<code>Name</code> in this case). When + * <code>Name.new</code> is called to create a new object, the + * <code>new</code> method in <code>Class</code> is run by default. + * This can be demonstrated by overriding <code>new</code> in + * <code>Class</code>: + * + * class Class + * alias oldNew new + * def new(*args) + * print "Creating a new ", self.name, "\n" + * oldNew(*args) + * end + * end + * + * + * class Name + * end + * + * + * n = Name.new + * + * <em>produces:</em> + * + * Creating a new Name + * + * Classes, modules, and objects are interrelated. In the diagram + * that follows, the vertical arrows represent inheritance, and the + * parentheses meta-classes. All metaclasses are instances + * of the class `Class'. + * + * +------------------+ + * | | + * Object---->(Object) | + * ^ ^ ^ ^ | + * | | | | | + * | | +-----+ +---------+ | + * | | | | | + * | +-----------+ | | + * | | | | | + * +------+ | Module--->(Module) | + * | | ^ ^ | + * OtherClass-->(OtherClass) | | | + * | | | + * Class---->(Class) | + * ^ | + * | | + * +----------------+ + */ + + +/* + * <code>Object</code> is the parent class of all classes in Ruby. Its + * methods are therefore available to all objects unless explicitly + * overridden. + * + * <code>Object</code> mixes in the <code>Kernel</code> module, making + * the built-in kernel functions globally accessible. Although the + * instance methods of <code>Object</code> are defined by the + * <code>Kernel</code> module, we have chosen to document them here for + * clarity. + * + * In the descriptions of Object's methods, the parameter <i>symbol</i> refers + * to a symbol, which is either a quoted string or a + * <code>Symbol</code> (such as <code>:name</code>). + */ + +void +Init_Object() +{ + VALUE metaclass; + + rb_cObject = boot_defclass("Object", 0); + rb_cModule = boot_defclass("Module", rb_cObject); + rb_cClass = boot_defclass("Class", rb_cModule); + + metaclass = rb_make_metaclass(rb_cObject, rb_cClass); + metaclass = rb_make_metaclass(rb_cModule, metaclass); + metaclass = rb_make_metaclass(rb_cClass, metaclass); + + rb_mKernel = rb_define_module("Kernel"); + rb_include_module(rb_cObject, rb_mKernel); + rb_define_alloc_func(rb_cObject, rb_class_allocate_instance); + rb_define_private_method(rb_cObject, "initialize", rb_obj_dummy, 0); + rb_define_private_method(rb_cClass, "inherited", rb_obj_dummy, 1); + rb_define_private_method(rb_cModule, "included", rb_obj_dummy, 1); + rb_define_private_method(rb_cModule, "extended", rb_obj_dummy, 1); + rb_define_private_method(rb_cModule, "method_added", rb_obj_dummy, 1); + rb_define_private_method(rb_cModule, "method_removed", rb_obj_dummy, 1); + rb_define_private_method(rb_cModule, "method_undefined", rb_obj_dummy, 1); + + + rb_define_method(rb_mKernel, "nil?", rb_false, 0); + rb_define_method(rb_mKernel, "==", rb_obj_equal, 1); + rb_define_method(rb_mKernel, "equal?", rb_obj_equal, 1); + rb_define_method(rb_mKernel, "===", rb_equal, 1); + rb_define_method(rb_mKernel, "=~", rb_obj_pattern_match, 1); + + rb_define_method(rb_mKernel, "eql?", rb_obj_equal, 1); + + rb_define_method(rb_mKernel, "id", rb_obj_id_obsolete, 0); + rb_define_method(rb_mKernel, "type", rb_obj_type, 0); + rb_define_method(rb_mKernel, "class", rb_obj_class, 0); + + rb_define_method(rb_mKernel, "clone", rb_obj_clone, 0); + rb_define_method(rb_mKernel, "dup", rb_obj_dup, 0); + rb_define_method(rb_mKernel, "initialize_copy", rb_obj_init_copy, 1); + + rb_define_method(rb_mKernel, "taint", rb_obj_taint, 0); + rb_define_method(rb_mKernel, "tainted?", rb_obj_tainted, 0); + rb_define_method(rb_mKernel, "untaint", rb_obj_untaint, 0); + rb_define_method(rb_mKernel, "freeze", rb_obj_freeze, 0); + rb_define_method(rb_mKernel, "frozen?", rb_obj_frozen_p, 0); + + rb_define_method(rb_mKernel, "to_a", rb_any_to_a, 0); /* to be removed */ + rb_define_method(rb_mKernel, "to_s", rb_any_to_s, 0); + rb_define_method(rb_mKernel, "inspect", rb_obj_inspect, 0); + rb_define_method(rb_mKernel, "methods", rb_obj_methods, -1); + rb_define_method(rb_mKernel, "singleton_methods", + rb_obj_singleton_methods, -1); /* in class.c */ + rb_define_method(rb_mKernel, "protected_methods", + rb_obj_protected_methods, -1); + rb_define_method(rb_mKernel, "private_methods", rb_obj_private_methods, -1); + rb_define_method(rb_mKernel, "public_methods", rb_obj_public_methods, -1); + rb_define_method(rb_mKernel, "instance_variables", + rb_obj_instance_variables, 0); /* in variable.c */ + rb_define_method(rb_mKernel, "instance_variable_get", rb_obj_ivar_get, 1); + rb_define_method(rb_mKernel, "instance_variable_set", rb_obj_ivar_set, 2); + rb_define_method(rb_mKernel, "instance_variable_defined?", rb_obj_ivar_defined, 1); + rb_define_private_method(rb_mKernel, "remove_instance_variable", + rb_obj_remove_instance_variable, 1); /* in variable.c */ + + rb_define_method(rb_mKernel, "instance_of?", rb_obj_is_instance_of, 1); + rb_define_method(rb_mKernel, "kind_of?", rb_obj_is_kind_of, 1); + rb_define_method(rb_mKernel, "is_a?", rb_obj_is_kind_of, 1); + + rb_define_private_method(rb_mKernel, "singleton_method_added", rb_obj_dummy, 1); + rb_define_private_method(rb_mKernel, "singleton_method_removed", rb_obj_dummy, 1); + rb_define_private_method(rb_mKernel, "singleton_method_undefined", rb_obj_dummy, 1); + + rb_define_global_function("sprintf", rb_f_sprintf, -1); /* in sprintf.c */ + rb_define_global_function("format", rb_f_sprintf, -1); /* in sprintf.c */ + + rb_define_global_function("Integer", rb_f_integer, 1); + rb_define_global_function("Float", rb_f_float, 1); + + rb_define_global_function("String", rb_f_string, 1); + rb_define_global_function("Array", rb_f_array, 1); + + rb_cNilClass = rb_define_class("NilClass", rb_cObject); + rb_define_method(rb_cNilClass, "to_i", nil_to_i, 0); + rb_define_method(rb_cNilClass, "to_f", nil_to_f, 0); + rb_define_method(rb_cNilClass, "to_s", nil_to_s, 0); + rb_define_method(rb_cNilClass, "to_a", nil_to_a, 0); + rb_define_method(rb_cNilClass, "inspect", nil_inspect, 0); + rb_define_method(rb_cNilClass, "&", false_and, 1); + rb_define_method(rb_cNilClass, "|", false_or, 1); + rb_define_method(rb_cNilClass, "^", false_xor, 1); + + rb_define_method(rb_cNilClass, "nil?", rb_true, 0); + rb_undef_alloc_func(rb_cNilClass); + rb_undef_method(CLASS_OF(rb_cNilClass), "new"); + rb_define_global_const("NIL", Qnil); + + rb_cSymbol = rb_define_class("Symbol", rb_cObject); + rb_define_singleton_method(rb_cSymbol, "all_symbols", + rb_sym_all_symbols, 0); /* in parse.y */ + rb_undef_alloc_func(rb_cSymbol); + rb_undef_method(CLASS_OF(rb_cSymbol), "new"); + + rb_define_method(rb_cSymbol, "to_i", sym_to_i, 0); + rb_define_method(rb_cSymbol, "to_int", sym_to_int, 0); + rb_define_method(rb_cSymbol, "inspect", sym_inspect, 0); + rb_define_method(rb_cSymbol, "to_s", sym_to_s, 0); + rb_define_method(rb_cSymbol, "id2name", sym_to_s, 0); + rb_define_method(rb_cSymbol, "to_sym", sym_to_sym, 0); + rb_define_method(rb_cSymbol, "===", rb_obj_equal, 1); + + rb_define_method(rb_cModule, "freeze", rb_mod_freeze, 0); + rb_define_method(rb_cModule, "===", rb_mod_eqq, 1); + rb_define_method(rb_cModule, "==", rb_obj_equal, 1); + rb_define_method(rb_cModule, "<=>", rb_mod_cmp, 1); + rb_define_method(rb_cModule, "<", rb_mod_lt, 1); + rb_define_method(rb_cModule, "<=", rb_class_inherited_p, 1); + rb_define_method(rb_cModule, ">", rb_mod_gt, 1); + rb_define_method(rb_cModule, ">=", rb_mod_ge, 1); + rb_define_method(rb_cModule, "initialize_copy", rb_mod_init_copy, 1); /* in class.c */ + rb_define_method(rb_cModule, "to_s", rb_mod_to_s, 0); + rb_define_method(rb_cModule, "included_modules", + rb_mod_included_modules, 0); /* in class.c */ + rb_define_method(rb_cModule, "include?", rb_mod_include_p, 1); /* in class.c */ + rb_define_method(rb_cModule, "name", rb_mod_name, 0); /* in variable.c */ + rb_define_method(rb_cModule, "ancestors", rb_mod_ancestors, 0); /* in class.c */ + + rb_define_private_method(rb_cModule, "attr", rb_mod_attr, -1); + rb_define_private_method(rb_cModule, "attr_reader", rb_mod_attr_reader, -1); + rb_define_private_method(rb_cModule, "attr_writer", rb_mod_attr_writer, -1); + rb_define_private_method(rb_cModule, "attr_accessor", rb_mod_attr_accessor, -1); + + rb_define_alloc_func(rb_cModule, rb_module_s_alloc); + rb_define_method(rb_cModule, "initialize", rb_mod_initialize, 0); + rb_define_method(rb_cModule, "instance_methods", + rb_class_instance_methods, -1); /* in class.c */ + rb_define_method(rb_cModule, "public_instance_methods", + rb_class_public_instance_methods, -1); /* in class.c */ + rb_define_method(rb_cModule, "protected_instance_methods", + rb_class_protected_instance_methods, -1); /* in class.c */ + rb_define_method(rb_cModule, "private_instance_methods", + rb_class_private_instance_methods, -1); /* in class.c */ + + rb_define_method(rb_cModule, "class_variable_defined?", rb_mod_cvar_defined, 1); + rb_define_method(rb_cModule, "constants", rb_mod_constants, 0); /* in variable.c */ + rb_define_method(rb_cModule, "const_get", rb_mod_const_get, 1); + rb_define_method(rb_cModule, "const_set", rb_mod_const_set, 2); + rb_define_method(rb_cModule, "const_defined?", rb_mod_const_defined, 1); + rb_define_private_method(rb_cModule, "remove_const", + rb_mod_remove_const, 1); /* in variable.c */ + rb_define_method(rb_cModule, "const_missing", + rb_mod_const_missing, 1); /* in variable.c */ + rb_define_method(rb_cModule, "class_variables", + rb_mod_class_variables, 0); /* in variable.c */ + rb_define_private_method(rb_cModule, "remove_class_variable", + rb_mod_remove_cvar, 1); /* in variable.c */ + rb_define_private_method(rb_cModule, "class_variable_get", rb_mod_cvar_get, 1); + rb_define_private_method(rb_cModule, "class_variable_set", rb_mod_cvar_set, 2); + + rb_define_method(rb_cClass, "allocate", rb_obj_alloc, 0); + rb_define_method(rb_cClass, "new", rb_class_new_instance, -1); + rb_define_method(rb_cClass, "initialize", rb_class_initialize, -1); + rb_define_method(rb_cClass, "initialize_copy", rb_class_init_copy, 1); /* in class.c */ + rb_define_method(rb_cClass, "superclass", rb_class_superclass, 0); + rb_define_alloc_func(rb_cClass, rb_class_s_alloc); + rb_undef_method(rb_cClass, "extend_object"); + rb_undef_method(rb_cClass, "append_features"); + + rb_cData = rb_define_class("Data", rb_cObject); + rb_undef_alloc_func(rb_cData); + + rb_global_variable(&ruby_top_self); + ruby_top_self = rb_obj_alloc(rb_cObject); + rb_define_singleton_method(ruby_top_self, "to_s", main_to_s, 0); + + rb_cTrueClass = rb_define_class("TrueClass", rb_cObject); + rb_define_method(rb_cTrueClass, "to_s", true_to_s, 0); + rb_define_method(rb_cTrueClass, "&", true_and, 1); + rb_define_method(rb_cTrueClass, "|", true_or, 1); + rb_define_method(rb_cTrueClass, "^", true_xor, 1); + rb_undef_alloc_func(rb_cTrueClass); + rb_undef_method(CLASS_OF(rb_cTrueClass), "new"); + rb_define_global_const("TRUE", Qtrue); + + rb_cFalseClass = rb_define_class("FalseClass", rb_cObject); + rb_define_method(rb_cFalseClass, "to_s", false_to_s, 0); + rb_define_method(rb_cFalseClass, "&", false_and, 1); + rb_define_method(rb_cFalseClass, "|", false_or, 1); + rb_define_method(rb_cFalseClass, "^", false_xor, 1); + rb_undef_alloc_func(rb_cFalseClass); + rb_undef_method(CLASS_OF(rb_cFalseClass), "new"); + rb_define_global_const("FALSE", Qfalse); + + id_eq = rb_intern("=="); + id_eql = rb_intern("eql?"); + id_inspect = rb_intern("inspect"); + id_init_copy = rb_intern("initialize_copy"); +} +/********************************************************************** + + pack.c - + + $Author: shyouhei $ + $Date: 2009-02-19 10:01:35 +0100 (Thu, 19 Feb 2009) $ + created at: Thu Feb 10 15:17:05 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include <sys/types.h> +#include <ctype.h> + +#define SIZE16 2 +#define SIZE32 4 + +#if SIZEOF_SHORT != 2 || SIZEOF_LONG != 4 +# define NATINT_PACK +#endif + +#ifdef NATINT_PACK +# define OFF16B(p) ((char*)(p) + (natint?0:(sizeof(short) - SIZE16))) +# define OFF32B(p) ((char*)(p) + (natint?0:(sizeof(long) - SIZE32))) +# define NATINT_LEN(type,len) (natint?sizeof(type):(len)) +# ifdef WORDS_BIGENDIAN +# define OFF16(p) OFF16B(p) +# define OFF32(p) OFF32B(p) +# endif +# define NATINT_HTOVS(x) (natint?htovs(x):htov16(x)) +# define NATINT_HTOVL(x) (natint?htovl(x):htov32(x)) +# define NATINT_HTONS(x) (natint?htons(x):hton16(x)) +# define NATINT_HTONL(x) (natint?htonl(x):hton32(x)) +#else +# define NATINT_LEN(type,len) sizeof(type) +# define NATINT_HTOVS(x) htovs(x) +# define NATINT_HTOVL(x) htovl(x) +# define NATINT_HTONS(x) htons(x) +# define NATINT_HTONL(x) htonl(x) +#endif + +#ifndef OFF16 +# define OFF16(p) (char*)(p) +# define OFF32(p) (char*)(p) +#endif +#ifndef OFF16B +# define OFF16B(p) (char*)(p) +# define OFF32B(p) (char*)(p) +#endif + +#define define_swapx(x, xtype) \ +static xtype \ +TOKEN_PASTE(swap,x)(z) \ + xtype z; \ +{ \ + xtype r; \ + xtype *zp; \ + unsigned char *s, *t; \ + int i; \ + \ + zp = xmalloc(sizeof(xtype)); \ + *zp = z; \ + s = (unsigned char*)zp; \ + t = xmalloc(sizeof(xtype)); \ + for (i=0; i<sizeof(xtype); i++) { \ + t[sizeof(xtype)-i-1] = s[i]; \ + } \ + r = *(xtype *)t; \ + free(t); \ + free(zp); \ + return r; \ +} + +#ifndef swap16 +#define swap16(x) ((((x)&0xFF)<<8) | (((x)>>8)&0xFF)) +#endif +#if SIZEOF_SHORT == 2 +#define swaps(x) swap16(x) +#else +#if SIZEOF_SHORT == 4 +#define swaps(x) ((((x)&0xFF)<<24) \ + |(((x)>>24)&0xFF) \ + |(((x)&0x0000FF00)<<8) \ + |(((x)&0x00FF0000)>>8) ) +#else +define_swapx(s,short) +#endif +#endif + +#ifndef swap32 +#define swap32(x) ((((x)&0xFF)<<24) \ + |(((x)>>24)&0xFF) \ + |(((x)&0x0000FF00)<<8) \ + |(((x)&0x00FF0000)>>8) ) +#endif +#if SIZEOF_LONG == 4 +#define swapl(x) swap32(x) +#else +#if SIZEOF_LONG == 8 +#define swapl(x) ((((x)&0x00000000000000FF)<<56) \ + |(((x)&0xFF00000000000000)>>56) \ + |(((x)&0x000000000000FF00)<<40) \ + |(((x)&0x00FF000000000000)>>40) \ + |(((x)&0x0000000000FF0000)<<24) \ + |(((x)&0x0000FF0000000000)>>24) \ + |(((x)&0x00000000FF000000)<<8) \ + |(((x)&0x000000FF00000000)>>8)) +#else +define_swapx(l,long) +#endif +#endif + +#if SIZEOF_FLOAT == 4 +#if SIZEOF_LONG == 4 /* SIZEOF_FLOAT == 4 == SIZEOF_LONG */ +#define swapf(x) swapl(x) +#define FLOAT_SWAPPER unsigned long +#else +#if SIZEOF_SHORT == 4 /* SIZEOF_FLOAT == 4 == SIZEOF_SHORT */ +#define swapf(x) swaps(x) +#define FLOAT_SWAPPER unsigned short +#else /* SIZEOF_FLOAT == 4 but undivide by known size of int */ +define_swapx(f,float) +#endif /* #if SIZEOF_SHORT == 4 */ +#endif /* #if SIZEOF_LONG == 4 */ +#else /* SIZEOF_FLOAT != 4 */ +define_swapx(f,float) +#endif /* #if SIZEOF_FLOAT == 4 */ + +#if SIZEOF_DOUBLE == 8 +#if SIZEOF_LONG == 8 /* SIZEOF_DOUBLE == 8 == SIZEOF_LONG */ +#define swapd(x) swapl(x) +#define DOUBLE_SWAPPER unsigned long +#else +#if SIZEOF_LONG == 4 /* SIZEOF_DOUBLE == 8 && 4 == SIZEOF_LONG */ +static double +swapd(d) + const double d; +{ + double dtmp = d; + unsigned long utmp[2]; + unsigned long utmp0; + + utmp[0] = 0; utmp[1] = 0; + memcpy(utmp,&dtmp,sizeof(double)); + utmp0 = utmp[0]; + utmp[0] = swapl(utmp[1]); + utmp[1] = swapl(utmp0); + memcpy(&dtmp,utmp,sizeof(double)); + return dtmp; +} +#else +#if SIZEOF_SHORT == 4 /* SIZEOF_DOUBLE == 8 && 4 == SIZEOF_SHORT */ +static double +swapd(d) + const double d; +{ + double dtmp = d; + unsigned short utmp[2]; + unsigned short utmp0; + + utmp[0] = 0; utmp[1] = 0; + memcpy(utmp,&dtmp,sizeof(double)); + utmp0 = utmp[0]; + utmp[0] = swaps(utmp[1]); + utmp[1] = swaps(utmp0); + memcpy(&dtmp,utmp,sizeof(double)); + return dtmp; +} +#else /* SIZEOF_DOUBLE == 8 but undivied by known size of int */ +define_swapx(d, double) +#endif /* #if SIZEOF_SHORT == 4 */ +#endif /* #if SIZEOF_LONG == 4 */ +#endif /* #if SIZEOF_LONG == 8 */ +#else /* SIZEOF_DOUBLE != 8 */ +define_swapx(d, double) +#endif /* #if SIZEOF_DOUBLE == 8 */ + +#undef define_swapx + +#ifdef DYNAMIC_ENDIAN +#ifdef ntohs +#undef ntohs +#undef ntohl +#undef htons +#undef htonl +#endif +static int +endian() +{ + static int init = 0; + static int endian_value; + char *p; + + if (init) return endian_value; + init = 1; + p = (char*)&init; + return endian_value = p[0]?0:1; +} + +#define ntohs(x) (endian()?(x):swaps(x)) +#define ntohl(x) (endian()?(x):swapl(x)) +#define ntohf(x) (endian()?(x):swapf(x)) +#define ntohd(x) (endian()?(x):swapd(x)) +#define htons(x) (endian()?(x):swaps(x)) +#define htonl(x) (endian()?(x):swapl(x)) +#define htonf(x) (endian()?(x):swapf(x)) +#define htond(x) (endian()?(x):swapd(x)) +#define htovs(x) (endian()?swaps(x):(x)) +#define htovl(x) (endian()?swapl(x):(x)) +#define htovf(x) (endian()?swapf(x):(x)) +#define htovd(x) (endian()?swapd(x):(x)) +#define vtohs(x) (endian()?swaps(x):(x)) +#define vtohl(x) (endian()?swapl(x):(x)) +#define vtohf(x) (endian()?swapf(x):(x)) +#define vtohd(x) (endian()?swapd(x):(x)) +# ifdef NATINT_PACK +#define htov16(x) (endian()?swap16(x):(x)) +#define htov32(x) (endian()?swap32(x):(x)) +#define hton16(x) (endian()?(x):swap16(x)) +#define hton32(x) (endian()?(x):swap32(x)) +# endif +#else +#ifdef WORDS_BIGENDIAN +#ifndef ntohs +#define ntohs(x) (x) +#define ntohl(x) (x) +#define htons(x) (x) +#define htonl(x) (x) +#endif +#define ntohf(x) (x) +#define ntohd(x) (x) +#define htonf(x) (x) +#define htond(x) (x) +#define htovs(x) swaps(x) +#define htovl(x) swapl(x) +#define htovf(x) swapf(x) +#define htovd(x) swapd(x) +#define vtohs(x) swaps(x) +#define vtohl(x) swapl(x) +#define vtohf(x) swapf(x) +#define vtohd(x) swapd(x) +# ifdef NATINT_PACK +#define htov16(x) swap16(x) +#define htov32(x) swap32(x) +#define hton16(x) (x) +#define hton32(x) (x) +# endif +#else /* LITTLE ENDIAN */ +#ifdef ntohs +#undef ntohs +#undef ntohl +#undef htons +#undef htonl +#endif +#define ntohs(x) swaps(x) +#define ntohl(x) swapl(x) +#define htons(x) swaps(x) +#define htonl(x) swapl(x) +#define ntohf(x) swapf(x) +#define ntohd(x) swapd(x) +#define htonf(x) swapf(x) +#define htond(x) swapd(x) +#define htovs(x) (x) +#define htovl(x) (x) +#define htovf(x) (x) +#define htovd(x) (x) +#define vtohs(x) (x) +#define vtohl(x) (x) +#define vtohf(x) (x) +#define vtohd(x) (x) +# ifdef NATINT_PACK +#define htov16(x) (x) +#define htov32(x) (x) +#define hton16(x) swap16(x) +#define hton32(x) swap32(x) +# endif +#endif +#endif + +#ifdef FLOAT_SWAPPER +#define FLOAT_CONVWITH(y) FLOAT_SWAPPER y; +#define HTONF(x,y) (memcpy(&y,&x,sizeof(float)), \ + y = htonf((FLOAT_SWAPPER)y), \ + memcpy(&x,&y,sizeof(float)), \ + x) +#define HTOVF(x,y) (memcpy(&y,&x,sizeof(float)), \ + y = htovf((FLOAT_SWAPPER)y), \ + memcpy(&x,&y,sizeof(float)), \ + x) +#define NTOHF(x,y) (memcpy(&y,&x,sizeof(float)), \ + y = ntohf((FLOAT_SWAPPER)y), \ + memcpy(&x,&y,sizeof(float)), \ + x) +#define VTOHF(x,y) (memcpy(&y,&x,sizeof(float)), \ + y = vtohf((FLOAT_SWAPPER)y), \ + memcpy(&x,&y,sizeof(float)), \ + x) +#else +#define FLOAT_CONVWITH(y) +#define HTONF(x,y) htonf(x) +#define HTOVF(x,y) htovf(x) +#define NTOHF(x,y) ntohf(x) +#define VTOHF(x,y) vtohf(x) +#endif + +#ifdef DOUBLE_SWAPPER +#define DOUBLE_CONVWITH(y) DOUBLE_SWAPPER y; +#define HTOND(x,y) (memcpy(&y,&x,sizeof(double)), \ + y = htond((DOUBLE_SWAPPER)y), \ + memcpy(&x,&y,sizeof(double)), \ + x) +#define HTOVD(x,y) (memcpy(&y,&x,sizeof(double)), \ + y = htovd((DOUBLE_SWAPPER)y), \ + memcpy(&x,&y,sizeof(double)), \ + x) +#define NTOHD(x,y) (memcpy(&y,&x,sizeof(double)), \ + y = ntohd((DOUBLE_SWAPPER)y), \ + memcpy(&x,&y,sizeof(double)), \ + x) +#define VTOHD(x,y) (memcpy(&y,&x,sizeof(double)), \ + y = vtohd((DOUBLE_SWAPPER)y), \ + memcpy(&x,&y,sizeof(double)), \ + x) +#else +#define DOUBLE_CONVWITH(y) +#define HTOND(x,y) htond(x) +#define HTOVD(x,y) htovd(x) +#define NTOHD(x,y) ntohd(x) +#define VTOHD(x,y) vtohd(x) +#endif + +unsigned long rb_big2ulong_pack _((VALUE x)); + +static unsigned long +num2i32(x) + VALUE x; +{ + x = rb_to_int(x); /* is nil OK? (should not) */ + + if (FIXNUM_P(x)) return FIX2LONG(x); + if (TYPE(x) == T_BIGNUM) { + return rb_big2ulong_pack(x); + } + rb_raise(rb_eTypeError, "can't convert %s to `integer'", rb_obj_classname(x)); + return 0; /* not reached */ +} + +#if SIZEOF_LONG == SIZE32 +# define EXTEND32(x) +#else +/* invariant in modulo 1<<31 */ +# define EXTEND32(x) do { if (!natint) {(x) = (((1L<<31)-1-(x))^~(~0L<<31));}} while(0) +#endif +#if SIZEOF_SHORT == SIZE16 +# define EXTEND16(x) +#else +# define EXTEND16(x) do { if (!natint) {(x) = (short)(((1<<15)-1-(x))^~(~0<<15));}} while(0) +#endif + +#ifdef HAVE_LONG_LONG +# define QUAD_SIZE sizeof(LONG_LONG) +#else +# define QUAD_SIZE 8 +#endif +static const char toofew[] = "too few arguments"; + +static void encodes _((VALUE,char*,long,int)); +static void qpencode _((VALUE,VALUE,long)); + +static int uv_to_utf8 _((char*,unsigned long)); +static unsigned long utf8_to_uv _((char*,long*)); + +/* + * call-seq: + * arr.pack ( aTemplateString ) -> aBinaryString + * + * Packs the contents of <i>arr</i> into a binary sequence according to + * the directives in <i>aTemplateString</i> (see the table below) + * Directives ``A,'' ``a,'' and ``Z'' may be followed by a count, + * which gives the width of the resulting field. The remaining + * directives also may take a count, indicating the number of array + * elements to convert. If the count is an asterisk + * (``<code>*</code>''), all remaining array elements will be + * converted. Any of the directives ``<code>sSiIlL</code>'' may be + * followed by an underscore (``<code>_</code>'') to use the underlying + * platform's native size for the specified type; otherwise, they use a + * platform-independent size. Spaces are ignored in the template + * string. See also <code>String#unpack</code>. + * + * a = [ "a", "b", "c" ] + * n = [ 65, 66, 67 ] + * a.pack("A3A3A3") #=> "a b c " + * a.pack("a3a3a3") #=> "a\000\000b\000\000c\000\000" + * n.pack("ccc") #=> "ABC" + * + * Directives for +pack+. + * + * Directive Meaning + * --------------------------------------------------------------- + * @ | Moves to absolute position + * A | ASCII string (space padded, count is width) + * a | ASCII string (null padded, count is width) + * B | Bit string (descending bit order) + * b | Bit string (ascending bit order) + * C | Unsigned char + * c | Char + * D, d | Double-precision float, native format + * E | Double-precision float, little-endian byte order + * e | Single-precision float, little-endian byte order + * F, f | Single-precision float, native format + * G | Double-precision float, network (big-endian) byte order + * g | Single-precision float, network (big-endian) byte order + * H | Hex string (high nibble first) + * h | Hex string (low nibble first) + * I | Unsigned integer + * i | Integer + * L | Unsigned long + * l | Long + * M | Quoted printable, MIME encoding (see RFC2045) + * m | Base64 encoded string + * N | Long, network (big-endian) byte order + * n | Short, network (big-endian) byte-order + * P | Pointer to a structure (fixed-length string) + * p | Pointer to a null-terminated string + * Q, q | 64-bit number + * S | Unsigned short + * s | Short + * U | UTF-8 + * u | UU-encoded string + * V | Long, little-endian byte order + * v | Short, little-endian byte order + * w | BER-compressed integer\fnm + * X | Back up a byte + * x | Null byte + * Z | Same as ``a'', except that null is added with * + */ + +static VALUE +pack_pack(ary, fmt) + VALUE ary, fmt; +{ + static char *nul10 = "\0\0\0\0\0\0\0\0\0\0"; + static char *spc10 = " "; + char *p, *pend; + VALUE res, from, associates = 0; + char type; + long items, len, idx, plen; + char *ptr; +#ifdef NATINT_PACK + int natint; /* native integer */ +#endif + + StringValue(fmt); + p = RSTRING(fmt)->ptr; + pend = p + RSTRING(fmt)->len; + res = rb_str_buf_new(0); + + items = RARRAY(ary)->len; + idx = 0; + +#define TOO_FEW (rb_raise(rb_eArgError, toofew), 0) +#define THISFROM (items > 0 ? RARRAY(ary)->ptr[idx] : TOO_FEW) +#define NEXTFROM (items-- > 0 ? RARRAY(ary)->ptr[idx++] : TOO_FEW) + + while (p < pend) { + if (RSTRING(fmt)->ptr + RSTRING(fmt)->len != pend) { + rb_raise(rb_eRuntimeError, "format string modified"); + } + type = *p++; /* get data type */ +#ifdef NATINT_PACK + natint = 0; +#endif + + if (ISSPACE(type)) continue; + if (type == '#') { + while ((p < pend) && (*p != '\n')) { + p++; + } + continue; + } + if (*p == '_' || *p == '!') { + const char *natstr = "sSiIlL"; + + if (strchr(natstr, type)) { +#ifdef NATINT_PACK + natint = 1; +#endif + p++; + } + else { + rb_raise(rb_eArgError, "'%c' allowed only after types %s", *p, natstr); + } + } + if (*p == '*') { /* set data length */ + len = strchr("@Xxu", type) ? 0 + : strchr("PMm", type) ? 1 + : items; + p++; + } + else if (ISDIGIT(*p)) { + len = strtoul(p, (char**)&p, 10); + } + else { + len = 1; + } + + switch (type) { + case 'A': case 'a': case 'Z': + case 'B': case 'b': + case 'H': case 'h': + from = NEXTFROM; + if (NIL_P(from)) { + ptr = ""; + plen = 0; + } + else { + StringValue(from); + ptr = RSTRING(from)->ptr; + plen = RSTRING(from)->len; + OBJ_INFECT(res, from); + } + + if (p[-1] == '*') + len = plen; + + switch (type) { + case 'a': /* arbitrary binary string (null padded) */ + case 'A': /* ASCII string (space padded) */ + case 'Z': /* null terminated ASCII string */ + if (plen >= len) { + rb_str_buf_cat(res, ptr, len); + if (p[-1] == '*' && type == 'Z') + rb_str_buf_cat(res, nul10, 1); + } + else { + rb_str_buf_cat(res, ptr, plen); + len -= plen; + while (len >= 10) { + rb_str_buf_cat(res, (type == 'A')?spc10:nul10, 10); + len -= 10; + } + rb_str_buf_cat(res, (type == 'A')?spc10:nul10, len); + } + break; + + case 'b': /* bit string (ascending) */ + { + int byte = 0; + long i, j = 0; + + if (len > plen) { + j = (len - plen + 1)/2; + len = plen; + } + for (i=0; i++ < len; ptr++) { + if (*ptr & 1) + byte |= 128; + if (i & 7) + byte >>= 1; + else { + char c = byte & 0xff; + rb_str_buf_cat(res, &c, 1); + byte = 0; + } + } + if (len & 7) { + char c; + byte >>= 7 - (len & 7); + c = byte & 0xff; + rb_str_buf_cat(res, &c, 1); + } + len = j; + goto grow; + } + break; + + case 'B': /* bit string (descending) */ + { + int byte = 0; + long i, j = 0; + + if (len > plen) { + j = (len - plen + 1)/2; + len = plen; + } + for (i=0; i++ < len; ptr++) { + byte |= *ptr & 1; + if (i & 7) + byte <<= 1; + else { + char c = byte & 0xff; + rb_str_buf_cat(res, &c, 1); + byte = 0; + } + } + if (len & 7) { + char c; + byte <<= 7 - (len & 7); + c = byte & 0xff; + rb_str_buf_cat(res, &c, 1); + } + len = j; + goto grow; + } + break; + + case 'h': /* hex string (low nibble first) */ + { + int byte = 0; + long i, j = 0; + + if (len > plen) { + j = (len + 1) / 2 - (plen + 1) / 2; + len = plen; + } + for (i=0; i++ < len; ptr++) { + if (ISALPHA(*ptr)) + byte |= (((*ptr & 15) + 9) & 15) << 4; + else + byte |= (*ptr & 15) << 4; + if (i & 1) + byte >>= 4; + else { + char c = byte & 0xff; + rb_str_buf_cat(res, &c, 1); + byte = 0; + } + } + if (len & 1) { + char c = byte & 0xff; + rb_str_buf_cat(res, &c, 1); + } + len = j; + goto grow; + } + break; + + case 'H': /* hex string (high nibble first) */ + { + int byte = 0; + long i, j = 0; + + if (len > plen) { + j = (len + 1) / 2 - (plen + 1) / 2; + len = plen; + } + for (i=0; i++ < len; ptr++) { + if (ISALPHA(*ptr)) + byte |= ((*ptr & 15) + 9) & 15; + else + byte |= *ptr & 15; + if (i & 1) + byte <<= 4; + else { + char c = byte & 0xff; + rb_str_buf_cat(res, &c, 1); + byte = 0; + } + } + if (len & 1) { + char c = byte & 0xff; + rb_str_buf_cat(res, &c, 1); + } + len = j; + goto grow; + } + break; + } + break; + + case 'c': /* signed char */ + case 'C': /* unsigned char */ + while (len-- > 0) { + char c; + + from = NEXTFROM; + c = num2i32(from); + rb_str_buf_cat(res, &c, sizeof(char)); + } + break; + + case 's': /* signed short */ + case 'S': /* unsigned short */ + while (len-- > 0) { + short s; + + from = NEXTFROM; + s = num2i32(from); + rb_str_buf_cat(res, OFF16(&s), NATINT_LEN(short,2)); + } + break; + + case 'i': /* signed int */ + case 'I': /* unsigned int */ + while (len-- > 0) { + long i; + + from = NEXTFROM; + i = num2i32(from); + rb_str_buf_cat(res, OFF32(&i), NATINT_LEN(int,4)); + } + break; + + case 'l': /* signed long */ + case 'L': /* unsigned long */ + while (len-- > 0) { + long l; + + from = NEXTFROM; + l = num2i32(from); + rb_str_buf_cat(res, OFF32(&l), NATINT_LEN(long,4)); + } + break; + + case 'q': /* signed quad (64bit) int */ + case 'Q': /* unsigned quad (64bit) int */ + while (len-- > 0) { + char tmp[QUAD_SIZE]; + + from = NEXTFROM; + rb_quad_pack(tmp, from); + rb_str_buf_cat(res, (char*)&tmp, QUAD_SIZE); + } + break; + + case 'n': /* unsigned short (network byte-order) */ + while (len-- > 0) { + unsigned short s; + + from = NEXTFROM; + s = num2i32(from); + s = NATINT_HTONS(s); + rb_str_buf_cat(res, OFF16(&s), NATINT_LEN(short,2)); + } + break; + + case 'N': /* unsigned long (network byte-order) */ + while (len-- > 0) { + unsigned long l; + + from = NEXTFROM; + l = num2i32(from); + l = NATINT_HTONL(l); + rb_str_buf_cat(res, OFF32(&l), NATINT_LEN(long,4)); + } + break; + + case 'v': /* unsigned short (VAX byte-order) */ + while (len-- > 0) { + unsigned short s; + + from = NEXTFROM; + s = num2i32(from); + s = NATINT_HTOVS(s); + rb_str_buf_cat(res, OFF16(&s), NATINT_LEN(short,2)); + } + break; + + case 'V': /* unsigned long (VAX byte-order) */ + while (len-- > 0) { + unsigned long l; + + from = NEXTFROM; + l = num2i32(from); + l = NATINT_HTOVL(l); + rb_str_buf_cat(res, OFF32(&l), NATINT_LEN(long,4)); + } + break; + + case 'f': /* single precision float in native format */ + case 'F': /* ditto */ + while (len-- > 0) { + float f; + + from = NEXTFROM; + f = RFLOAT(rb_Float(from))->value; + rb_str_buf_cat(res, (char*)&f, sizeof(float)); + } + break; + + case 'e': /* single precision float in VAX byte-order */ + while (len-- > 0) { + float f; + FLOAT_CONVWITH(ftmp); + + from = NEXTFROM; + f = RFLOAT(rb_Float(from))->value; + f = HTOVF(f,ftmp); + rb_str_buf_cat(res, (char*)&f, sizeof(float)); + } + break; + + case 'E': /* double precision float in VAX byte-order */ + while (len-- > 0) { + double d; + DOUBLE_CONVWITH(dtmp); + + from = NEXTFROM; + d = RFLOAT(rb_Float(from))->value; + d = HTOVD(d,dtmp); + rb_str_buf_cat(res, (char*)&d, sizeof(double)); + } + break; + + case 'd': /* double precision float in native format */ + case 'D': /* ditto */ + while (len-- > 0) { + double d; + + from = NEXTFROM; + d = RFLOAT(rb_Float(from))->value; + rb_str_buf_cat(res, (char*)&d, sizeof(double)); + } + break; + + case 'g': /* single precision float in network byte-order */ + while (len-- > 0) { + float f; + FLOAT_CONVWITH(ftmp); + + from = NEXTFROM; + f = RFLOAT(rb_Float(from))->value; + f = HTONF(f,ftmp); + rb_str_buf_cat(res, (char*)&f, sizeof(float)); + } + break; + + case 'G': /* double precision float in network byte-order */ + while (len-- > 0) { + double d; + DOUBLE_CONVWITH(dtmp); + + from = NEXTFROM; + d = RFLOAT(rb_Float(from))->value; + d = HTOND(d,dtmp); + rb_str_buf_cat(res, (char*)&d, sizeof(double)); + } + break; + + case 'x': /* null byte */ + grow: + while (len >= 10) { + rb_str_buf_cat(res, nul10, 10); + len -= 10; + } + rb_str_buf_cat(res, nul10, len); + break; + + case 'X': /* back up byte */ + shrink: + plen = RSTRING(res)->len; + if (plen < len) + rb_raise(rb_eArgError, "X outside of string"); + RSTRING(res)->len = plen - len; + RSTRING(res)->ptr[plen - len] = '\0'; + break; + + case '@': /* null fill to absolute position */ + len -= RSTRING(res)->len; + if (len > 0) goto grow; + len = -len; + if (len > 0) goto shrink; + break; + + case '%': + rb_raise(rb_eArgError, "%% is not supported"); + break; + + case 'U': /* Unicode character */ + while (len-- > 0) { + long l; + char buf[8]; + int le; + + from = NEXTFROM; + from = rb_to_int(from); + l = NUM2INT(from); + if (l < 0) { + rb_raise(rb_eRangeError, "pack(U): value out of range"); + } + le = uv_to_utf8(buf, l); + rb_str_buf_cat(res, (char*)buf, le); + } + break; + + case 'u': /* uuencoded string */ + case 'm': /* base64 encoded string */ + from = NEXTFROM; + StringValue(from); + ptr = RSTRING(from)->ptr; + plen = RSTRING(from)->len; + + if (len <= 2) + len = 45; + else + len = len / 3 * 3; + while (plen > 0) { + long todo; + + if (plen > len) + todo = len; + else + todo = plen; + encodes(res, ptr, todo, type); + plen -= todo; + ptr += todo; + } + break; + + case 'M': /* quoted-printable encoded string */ + from = rb_obj_as_string(NEXTFROM); + if (len <= 1) + len = 72; + qpencode(res, from, len); + break; + + case 'P': /* pointer to packed byte string */ + from = THISFROM; + if (!NIL_P(from)) { + StringValue(from); + if (RSTRING(from)->len < len) { + rb_raise(rb_eArgError, "too short buffer for P(%ld for %ld)", + RSTRING(from)->len, len); + } + } + len = 1; + /* FALL THROUGH */ + case 'p': /* pointer to string */ + while (len-- > 0) { + char *t; + from = NEXTFROM; + if (NIL_P(from)) { + t = 0; + } + else { + t = StringValuePtr(from); + } + if (!associates) { + associates = rb_ary_new(); + } + rb_ary_push(associates, from); + rb_obj_taint(from); + rb_str_buf_cat(res, (char*)&t, sizeof(char*)); + } + break; + + case 'w': /* BER compressed integer */ + while (len-- > 0) { + unsigned long ul; + VALUE buf = rb_str_new(0, 0); + char c, *bufs, *bufe; + + from = NEXTFROM; + if (TYPE(from) == T_BIGNUM) { + VALUE big128 = rb_uint2big(128); + while (TYPE(from) == T_BIGNUM) { + from = rb_big_divmod(from, big128); + c = NUM2INT(RARRAY(from)->ptr[1]) | 0x80; /* mod */ + rb_str_buf_cat(buf, &c, sizeof(char)); + from = RARRAY(from)->ptr[0]; /* div */ + } + } + + { + long l = NUM2LONG(from); + if (l < 0) { + rb_raise(rb_eArgError, "can't compress negative numbers"); + } + ul = l; + } + + while (ul) { + c = ((ul & 0x7f) | 0x80); + rb_str_buf_cat(buf, &c, sizeof(char)); + ul >>= 7; + } + + if (RSTRING(buf)->len) { + bufs = RSTRING(buf)->ptr; + bufe = bufs + RSTRING(buf)->len - 1; + *bufs &= 0x7f; /* clear continue bit */ + while (bufs < bufe) { /* reverse */ + c = *bufs; + *bufs++ = *bufe; + *bufe-- = c; + } + rb_str_buf_cat(res, RSTRING(buf)->ptr, RSTRING(buf)->len); + } + else { + c = 0; + rb_str_buf_cat(res, &c, sizeof(char)); + } + } + break; + + default: + break; + } + } + + if (associates) { + rb_str_associate(res, associates); + } + OBJ_INFECT(res, fmt); + return res; +} + +static char uu_table[] = +"`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; +static char b64_table[] = +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static void +encodes(str, s, len, type) + VALUE str; + char *s; + long len; + int type; +{ + char *buff = ALLOCA_N(char, len * 4 / 3 + 6); + long i = 0; + char *trans = type == 'u' ? uu_table : b64_table; + int padding; + + if (type == 'u') { + buff[i++] = len + ' '; + padding = '`'; + } + else { + padding = '='; + } + while (len >= 3) { + buff[i++] = trans[077 & (*s >> 2)]; + buff[i++] = trans[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))]; + buff[i++] = trans[077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03))]; + buff[i++] = trans[077 & s[2]]; + s += 3; + len -= 3; + } + if (len == 2) { + buff[i++] = trans[077 & (*s >> 2)]; + buff[i++] = trans[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))]; + buff[i++] = trans[077 & (((s[1] << 2) & 074) | (('\0' >> 6) & 03))]; + buff[i++] = padding; + } + else if (len == 1) { + buff[i++] = trans[077 & (*s >> 2)]; + buff[i++] = trans[077 & (((*s << 4) & 060) | (('\0' >> 4) & 017))]; + buff[i++] = padding; + buff[i++] = padding; + } + buff[i++] = '\n'; + rb_str_buf_cat(str, buff, i); +} + +static char hex_table[] = "0123456789ABCDEF"; + +static void +qpencode(str, from, len) + VALUE str, from; + long len; +{ + char buff[1024]; + long i = 0, n = 0, prev = EOF; + unsigned char *s = (unsigned char*)RSTRING(from)->ptr; + unsigned char *send = s + RSTRING(from)->len; + + while (s < send) { + if ((*s > 126) || + (*s < 32 && *s != '\n' && *s != '\t') || + (*s == '=')) { + buff[i++] = '='; + buff[i++] = hex_table[*s >> 4]; + buff[i++] = hex_table[*s & 0x0f]; + n += 3; + prev = EOF; + } + else if (*s == '\n') { + if (prev == ' ' || prev == '\t') { + buff[i++] = '='; + buff[i++] = *s; + } + buff[i++] = *s; + n = 0; + prev = *s; + } + else { + buff[i++] = *s; + n++; + prev = *s; + } + if (n > len) { + buff[i++] = '='; + buff[i++] = '\n'; + n = 0; + prev = '\n'; + } + if (i > 1024 - 5) { + rb_str_buf_cat(str, buff, i); + i = 0; + } + s++; + } + if (n > 0) { + buff[i++] = '='; + buff[i++] = '\n'; + } + if (i > 0) { + rb_str_buf_cat(str, buff, i); + } +} + +static inline int +hex2num(c) + char c; +{ + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + return c - '0'; + case 'a': case 'b': case 'c': + case 'd': case 'e': case 'f': + return c - 'a' + 10; + case 'A': case 'B': case 'C': + case 'D': case 'E': case 'F': + return c - 'A' + 10; + default: + return -1; + } +} + +#define PACK_LENGTH_ADJUST_SIZE(sz) do { \ + tmp = 0; \ + if (len > (send-s)/sz) { \ + if (!star) { \ + tmp = len-(send-s)/sz; \ + } \ + len = (send-s)/sz; \ + } \ +} while (0) + +#ifdef NATINT_PACK +#define PACK_LENGTH_ADJUST(type,sz) do { \ + int t__len = NATINT_LEN(type,(sz)); \ + PACK_LENGTH_ADJUST_SIZE(t__len); \ +} while (0) +#else +#define PACK_LENGTH_ADJUST(type,sz) \ + PACK_LENGTH_ADJUST_SIZE(sizeof(type)) +#endif + +#define PACK_ITEM_ADJUST() while (tmp--) rb_ary_push(ary, Qnil) + +static VALUE +infected_str_new(ptr, len, str) + const char *ptr; + long len; + VALUE str; +{ + VALUE s = rb_str_new(ptr, len); + + OBJ_INFECT(s, str); + return s; +} + +/* + * call-seq: + * str.unpack(format) => anArray + * + * Decodes <i>str</i> (which may contain binary data) according to the + * format string, returning an array of each value extracted. The + * format string consists of a sequence of single-character directives, + * summarized in the table at the end of this entry. + * Each directive may be followed + * by a number, indicating the number of times to repeat with this + * directive. An asterisk (``<code>*</code>'') will use up all + * remaining elements. The directives <code>sSiIlL</code> may each be + * followed by an underscore (``<code>_</code>'') to use the underlying + * platform's native size for the specified type; otherwise, it uses a + * platform-independent consistent size. Spaces are ignored in the + * format string. See also <code>Array#pack</code>. + * + * "abc \0\0abc \0\0".unpack('A6Z6') #=> ["abc", "abc "] + * "abc \0\0".unpack('a3a3') #=> ["abc", " \000\000"] + * "abc \0abc \0".unpack('Z*Z*') #=> ["abc ", "abc "] + * "aa".unpack('b8B8') #=> ["10000110", "01100001"] + * "aaa".unpack('h2H2c') #=> ["16", "61", 97] + * "\xfe\xff\xfe\xff".unpack('sS') #=> [-2, 65534] + * "now=20is".unpack('M*') #=> ["now is"] + * "whole".unpack('xax2aX2aX1aX2a') #=> ["h", "e", "l", "l", "o"] + * + * This table summarizes the various formats and the Ruby classes + * returned by each. + * + * Format | Returns | Function + * -------+---------+----------------------------------------- + * A | String | with trailing nulls and spaces removed + * -------+---------+----------------------------------------- + * a | String | string + * -------+---------+----------------------------------------- + * B | String | extract bits from each character (msb first) + * -------+---------+----------------------------------------- + * b | String | extract bits from each character (lsb first) + * -------+---------+----------------------------------------- + * C | Fixnum | extract a character as an unsigned integer + * -------+---------+----------------------------------------- + * c | Fixnum | extract a character as an integer + * -------+---------+----------------------------------------- + * d,D | Float | treat sizeof(double) characters as + * | | a native double + * -------+---------+----------------------------------------- + * E | Float | treat sizeof(double) characters as + * | | a double in little-endian byte order + * -------+---------+----------------------------------------- + * e | Float | treat sizeof(float) characters as + * | | a float in little-endian byte order + * -------+---------+----------------------------------------- + * f,F | Float | treat sizeof(float) characters as + * | | a native float + * -------+---------+----------------------------------------- + * G | Float | treat sizeof(double) characters as + * | | a double in network byte order + * -------+---------+----------------------------------------- + * g | Float | treat sizeof(float) characters as a + * | | float in network byte order + * -------+---------+----------------------------------------- + * H | String | extract hex nibbles from each character + * | | (most significant first) + * -------+---------+----------------------------------------- + * h | String | extract hex nibbles from each character + * | | (least significant first) + * -------+---------+----------------------------------------- + * I | Integer | treat sizeof(int) (modified by _) + * | | successive characters as an unsigned + * | | native integer + * -------+---------+----------------------------------------- + * i | Integer | treat sizeof(int) (modified by _) + * | | successive characters as a signed + * | | native integer + * -------+---------+----------------------------------------- + * L | Integer | treat four (modified by _) successive + * | | characters as an unsigned native + * | | long integer + * -------+---------+----------------------------------------- + * l | Integer | treat four (modified by _) successive + * | | characters as a signed native + * | | long integer + * -------+---------+----------------------------------------- + * M | String | quoted-printable + * -------+---------+----------------------------------------- + * m | String | base64-encoded + * -------+---------+----------------------------------------- + * N | Integer | treat four characters as an unsigned + * | | long in network byte order + * -------+---------+----------------------------------------- + * n | Fixnum | treat two characters as an unsigned + * | | short in network byte order + * -------+---------+----------------------------------------- + * P | String | treat sizeof(char *) characters as a + * | | pointer, and return \emph{len} characters + * | | from the referenced location + * -------+---------+----------------------------------------- + * p | String | treat sizeof(char *) characters as a + * | | pointer to a null-terminated string + * -------+---------+----------------------------------------- + * Q | Integer | treat 8 characters as an unsigned + * | | quad word (64 bits) + * -------+---------+----------------------------------------- + * q | Integer | treat 8 characters as a signed + * | | quad word (64 bits) + * -------+---------+----------------------------------------- + * S | Fixnum | treat two (different if _ used) + * | | successive characters as an unsigned + * | | short in native byte order + * -------+---------+----------------------------------------- + * s | Fixnum | Treat two (different if _ used) + * | | successive characters as a signed short + * | | in native byte order + * -------+---------+----------------------------------------- + * U | Integer | UTF-8 characters as unsigned integers + * -------+---------+----------------------------------------- + * u | String | UU-encoded + * -------+---------+----------------------------------------- + * V | Fixnum | treat four characters as an unsigned + * | | long in little-endian byte order + * -------+---------+----------------------------------------- + * v | Fixnum | treat two characters as an unsigned + * | | short in little-endian byte order + * -------+---------+----------------------------------------- + * w | Integer | BER-compressed integer (see Array.pack) + * -------+---------+----------------------------------------- + * X | --- | skip backward one character + * -------+---------+----------------------------------------- + * x | --- | skip forward one character + * -------+---------+----------------------------------------- + * Z | String | with trailing nulls removed + * | | upto first null with * + * -------+---------+----------------------------------------- + * @ | --- | skip to the offset given by the + * | | length argument + * -------+---------+----------------------------------------- + */ + +static VALUE +pack_unpack(str, fmt) + VALUE str, fmt; +{ + static char *hexdigits = "0123456789abcdef0123456789ABCDEFx"; + char *s, *send; + char *p, *pend; + VALUE ary; + char type; + long len; + int tmp, star; +#ifdef NATINT_PACK + int natint; /* native integer */ +#endif + + StringValue(str); + StringValue(fmt); + s = RSTRING(str)->ptr; + send = s + RSTRING(str)->len; + p = RSTRING(fmt)->ptr; + pend = p + RSTRING(fmt)->len; + + ary = rb_ary_new(); + while (p < pend) { + type = *p++; +#ifdef NATINT_PACK + natint = 0; +#endif + + if (ISSPACE(type)) continue; + if (type == '#') { + while ((p < pend) && (*p != '\n')) { + p++; + } + continue; + } + star = 0; + if (*p == '_' || *p == '!') { + char *natstr = "sSiIlL"; + + if (strchr(natstr, type)) { +#ifdef NATINT_PACK + natint = 1; +#endif + p++; + } + else { + rb_raise(rb_eArgError, "'%c' allowed only after types %s", *p, natstr); + } + } + if (p >= pend) + len = 1; + else if (*p == '*') { + star = 1; + len = send - s; + p++; + } + else if (ISDIGIT(*p)) { + len = strtoul(p, (char**)&p, 10); + } + else { + len = (type != '@'); + } + + switch (type) { + case '%': + rb_raise(rb_eArgError, "%% is not supported"); + break; + + case 'A': + if (len > send - s) len = send - s; + { + long end = len; + char *t = s + len - 1; + + while (t >= s) { + if (*t != ' ' && *t != '\0') break; + t--; len--; + } + rb_ary_push(ary, infected_str_new(s, len, str)); + s += end; + } + break; + + case 'Z': + { + char *t = s; + + if (len > send-s) len = send-s; + while (t < s+len && *t) t++; + rb_ary_push(ary, infected_str_new(s, t-s, str)); + if (t < send) t++; + s = star ? t : s+len; + } + break; + + case 'a': + if (len > send - s) len = send - s; + rb_ary_push(ary, infected_str_new(s, len, str)); + s += len; + break; + + case 'b': + { + VALUE bitstr; + char *t; + int bits; + long i; + + if (p[-1] == '*' || len > (send - s) * 8) + len = (send - s) * 8; + bits = 0; + rb_ary_push(ary, bitstr = rb_str_new(0, len)); + t = RSTRING(bitstr)->ptr; + for (i=0; i<len; i++) { + if (i & 7) bits >>= 1; + else bits = *s++; + *t++ = (bits & 1) ? '1' : '0'; + } + } + break; + + case 'B': + { + VALUE bitstr; + char *t; + int bits; + long i; + + if (p[-1] == '*' || len > (send - s) * 8) + len = (send - s) * 8; + bits = 0; + rb_ary_push(ary, bitstr = rb_str_new(0, len)); + t = RSTRING(bitstr)->ptr; + for (i=0; i<len; i++) { + if (i & 7) bits <<= 1; + else bits = *s++; + *t++ = (bits & 128) ? '1' : '0'; + } + } + break; + + case 'h': + { + VALUE bitstr; + char *t; + int bits; + long i; + + if (p[-1] == '*' || len > (send - s) * 2) + len = (send - s) * 2; + bits = 0; + rb_ary_push(ary, bitstr = rb_str_new(0, len)); + t = RSTRING(bitstr)->ptr; + for (i=0; i<len; i++) { + if (i & 1) + bits >>= 4; + else + bits = *s++; + *t++ = hexdigits[bits & 15]; + } + } + break; + + case 'H': + { + VALUE bitstr; + char *t; + int bits; + long i; + + if (p[-1] == '*' || len > (send - s) * 2) + len = (send - s) * 2; + bits = 0; + rb_ary_push(ary, bitstr = rb_str_new(0, len)); + t = RSTRING(bitstr)->ptr; + for (i=0; i<len; i++) { + if (i & 1) + bits <<= 4; + else + bits = *s++; + *t++ = hexdigits[(bits >> 4) & 15]; + } + } + break; + + case 'c': + PACK_LENGTH_ADJUST(char,sizeof(char)); + while (len-- > 0) { + int c = *s++; + if (c > (char)127) c-=256; + rb_ary_push(ary, INT2FIX(c)); + } + PACK_ITEM_ADJUST(); + break; + + case 'C': + PACK_LENGTH_ADJUST(unsigned char,sizeof(unsigned char)); + while (len-- > 0) { + unsigned char c = *s++; + rb_ary_push(ary, INT2FIX(c)); + } + PACK_ITEM_ADJUST(); + break; + + case 's': + PACK_LENGTH_ADJUST(short,2); + while (len-- > 0) { + short tmp = 0; + memcpy(OFF16(&tmp), s, NATINT_LEN(short,2)); + EXTEND16(tmp); + s += NATINT_LEN(short,2); + rb_ary_push(ary, INT2FIX(tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'S': + PACK_LENGTH_ADJUST(unsigned short,2); + while (len-- > 0) { + unsigned short tmp = 0; + memcpy(OFF16(&tmp), s, NATINT_LEN(unsigned short,2)); + s += NATINT_LEN(unsigned short,2); + rb_ary_push(ary, INT2FIX(tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'i': + PACK_LENGTH_ADJUST(int,sizeof(int)); + while (len-- > 0) { + int tmp; + memcpy(&tmp, s, sizeof(int)); + s += sizeof(int); + rb_ary_push(ary, INT2NUM(tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'I': + PACK_LENGTH_ADJUST(unsigned int,sizeof(unsigned int)); + while (len-- > 0) { + unsigned int tmp; + memcpy(&tmp, s, sizeof(unsigned int)); + s += sizeof(unsigned int); + rb_ary_push(ary, UINT2NUM(tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'l': + PACK_LENGTH_ADJUST(long,4); + while (len-- > 0) { + long tmp = 0; + memcpy(OFF32(&tmp), s, NATINT_LEN(long,4)); + EXTEND32(tmp); + s += NATINT_LEN(long,4); + rb_ary_push(ary, LONG2NUM(tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'L': + PACK_LENGTH_ADJUST(unsigned long,4); + while (len-- > 0) { + unsigned long tmp = 0; + memcpy(OFF32(&tmp), s, NATINT_LEN(unsigned long,4)); + s += NATINT_LEN(unsigned long,4); + rb_ary_push(ary, ULONG2NUM(tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'q': + PACK_LENGTH_ADJUST_SIZE(QUAD_SIZE); + while (len-- > 0) { + char *tmp = (char*)s; + s += QUAD_SIZE; + rb_ary_push(ary, rb_quad_unpack(tmp, 1)); + } + PACK_ITEM_ADJUST(); + break; + + case 'Q': + PACK_LENGTH_ADJUST_SIZE(QUAD_SIZE); + while (len-- > 0) { + char *tmp = (char*)s; + s += QUAD_SIZE; + rb_ary_push(ary, rb_quad_unpack(tmp, 0)); + } + break; + + case 'n': + PACK_LENGTH_ADJUST(unsigned short,2); + while (len-- > 0) { + unsigned short tmp = 0; + memcpy(OFF16B(&tmp), s, NATINT_LEN(unsigned short,2)); + s += NATINT_LEN(unsigned short,2); + rb_ary_push(ary, UINT2NUM(ntohs(tmp))); + } + PACK_ITEM_ADJUST(); + break; + + case 'N': + PACK_LENGTH_ADJUST(unsigned long,4); + while (len-- > 0) { + unsigned long tmp = 0; + memcpy(OFF32B(&tmp), s, NATINT_LEN(unsigned long,4)); + s += NATINT_LEN(unsigned long,4); + rb_ary_push(ary, ULONG2NUM(ntohl(tmp))); + } + PACK_ITEM_ADJUST(); + break; + + case 'v': + PACK_LENGTH_ADJUST(unsigned short,2); + while (len-- > 0) { + unsigned short tmp = 0; + memcpy(OFF16(&tmp), s, NATINT_LEN(unsigned short,2)); + s += NATINT_LEN(unsigned short,2); + rb_ary_push(ary, UINT2NUM(vtohs(tmp))); + } + PACK_ITEM_ADJUST(); + break; + + case 'V': + PACK_LENGTH_ADJUST(unsigned long,4); + while (len-- > 0) { + unsigned long tmp = 0; + memcpy(OFF32(&tmp), s, NATINT_LEN(long,4)); + s += NATINT_LEN(long,4); + rb_ary_push(ary, ULONG2NUM(vtohl(tmp))); + } + PACK_ITEM_ADJUST(); + break; + + case 'f': + case 'F': + PACK_LENGTH_ADJUST(float,sizeof(float)); + while (len-- > 0) { + float tmp; + memcpy(&tmp, s, sizeof(float)); + s += sizeof(float); + rb_ary_push(ary, rb_float_new((double)tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'e': + PACK_LENGTH_ADJUST(float,sizeof(float)); + while (len-- > 0) { + float tmp; + FLOAT_CONVWITH(ftmp); + + memcpy(&tmp, s, sizeof(float)); + s += sizeof(float); + tmp = VTOHF(tmp,ftmp); + rb_ary_push(ary, rb_float_new((double)tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'E': + PACK_LENGTH_ADJUST(double,sizeof(double)); + while (len-- > 0) { + double tmp; + DOUBLE_CONVWITH(dtmp); + + memcpy(&tmp, s, sizeof(double)); + s += sizeof(double); + tmp = VTOHD(tmp,dtmp); + rb_ary_push(ary, rb_float_new(tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'D': + case 'd': + PACK_LENGTH_ADJUST(double,sizeof(double)); + while (len-- > 0) { + double tmp; + memcpy(&tmp, s, sizeof(double)); + s += sizeof(double); + rb_ary_push(ary, rb_float_new(tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'g': + PACK_LENGTH_ADJUST(float,sizeof(float)); + while (len-- > 0) { + float tmp; + FLOAT_CONVWITH(ftmp;) + + memcpy(&tmp, s, sizeof(float)); + s += sizeof(float); + tmp = NTOHF(tmp,ftmp); + rb_ary_push(ary, rb_float_new((double)tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'G': + PACK_LENGTH_ADJUST(double,sizeof(double)); + while (len-- > 0) { + double tmp; + DOUBLE_CONVWITH(dtmp); + + memcpy(&tmp, s, sizeof(double)); + s += sizeof(double); + tmp = NTOHD(tmp,dtmp); + rb_ary_push(ary, rb_float_new(tmp)); + } + PACK_ITEM_ADJUST(); + break; + + case 'U': + if (len > send - s) len = send - s; + while (len > 0 && s < send) { + long alen = send - s; + unsigned long l; + + l = utf8_to_uv(s, &alen); + s += alen; len--; + rb_ary_push(ary, ULONG2NUM(l)); + } + break; + + case 'u': + { + VALUE buf = infected_str_new(0, (send - s)*3/4, str); + char *ptr = RSTRING(buf)->ptr; + long total = 0; + + while (s < send && *s > ' ' && *s < 'a') { + long a,b,c,d; + char hunk[4]; + + hunk[3] = '\0'; + len = (*s++ - ' ') & 077; + total += len; + if (total > RSTRING(buf)->len) { + len -= total - RSTRING(buf)->len; + total = RSTRING(buf)->len; + } + + while (len > 0) { + long mlen = len > 3 ? 3 : len; + + if (s < send && *s >= ' ') + a = (*s++ - ' ') & 077; + else + a = 0; + if (s < send && *s >= ' ') + b = (*s++ - ' ') & 077; + else + b = 0; + if (s < send && *s >= ' ') + c = (*s++ - ' ') & 077; + else + c = 0; + if (s < send && *s >= ' ') + d = (*s++ - ' ') & 077; + else + d = 0; + hunk[0] = a << 2 | b >> 4; + hunk[1] = b << 4 | c >> 2; + hunk[2] = c << 6 | d; + memcpy(ptr, hunk, mlen); + ptr += mlen; + len -= mlen; + } + if (*s == '\r') s++; + if (*s == '\n') s++; + else if (s < send && (s+1 == send || s[1] == '\n')) + s += 2; /* possible checksum byte */ + } + + RSTRING(buf)->ptr[total] = '\0'; + RSTRING(buf)->len = total; + rb_ary_push(ary, buf); + } + break; + + case 'm': + { + VALUE buf = infected_str_new(0, (send - s)*3/4, str); + char *ptr = RSTRING(buf)->ptr; + int a = -1,b = -1,c = 0,d; + static int first = 1; + static int b64_xtable[256]; + + if (first) { + int i; + first = 0; + + for (i = 0; i < 256; i++) { + b64_xtable[i] = -1; + } + for (i = 0; i < 64; i++) { + b64_xtable[(int)b64_table[i]] = i; + } + } + while (s < send) { + a = b = c = d = -1; + while((a = b64_xtable[(int)(*(unsigned char*)s)]) == -1 && s < send) { s++; } + if( s >= send ) break; + s++; + while((b = b64_xtable[(int)(*(unsigned char*)s)]) == -1 && s < send) { s++; } + if( s >= send ) break; + s++; + while((c = b64_xtable[(int)(*(unsigned char*)s)]) == -1 && s < send) { if( *s == '=' ) break; s++; } + if( *s == '=' || s >= send ) break; + s++; + while((d = b64_xtable[(int)(*(unsigned char*)s)]) == -1 && s < send) { if( *s == '=' ) break; s++; } + if( *s == '=' || s >= send ) break; + s++; + *ptr++ = a << 2 | b >> 4; + *ptr++ = b << 4 | c >> 2; + *ptr++ = c << 6 | d; + } + if (a != -1 && b != -1) { + if (c == -1 && *s == '=') + *ptr++ = a << 2 | b >> 4; + else if (c != -1 && *s == '=') { + *ptr++ = a << 2 | b >> 4; + *ptr++ = b << 4 | c >> 2; + } + } + *ptr = '\0'; + RSTRING(buf)->len = ptr - RSTRING(buf)->ptr; + rb_ary_push(ary, buf); + } + break; + + case 'M': + { + VALUE buf = infected_str_new(0, send - s, str); + char *ptr = RSTRING(buf)->ptr; + int c1, c2; + + while (s < send) { + if (*s == '=') { + if (++s == send) break; + if (s+1 < send && *s == '\r' && *(s+1) == '\n') + s++; + if (*s != '\n') { + if ((c1 = hex2num(*s)) == -1) break; + if (++s == send) break; + if ((c2 = hex2num(*s)) == -1) break; + *ptr++ = c1 << 4 | c2; + } + } + else { + *ptr++ = *s; + } + s++; + } + *ptr = '\0'; + RSTRING(buf)->len = ptr - RSTRING(buf)->ptr; + rb_ary_push(ary, buf); + } + break; + + case '@': + if (len > RSTRING(str)->len) + rb_raise(rb_eArgError, "@ outside of string"); + s = RSTRING(str)->ptr + len; + break; + + case 'X': + if (len > s - RSTRING(str)->ptr) + rb_raise(rb_eArgError, "X outside of string"); + s -= len; + break; + + case 'x': + if (len > send - s) + rb_raise(rb_eArgError, "x outside of string"); + s += len; + break; + + case 'P': + if (sizeof(char *) <= send - s) { + char *t; + VALUE tmp; + + memcpy(&t, s, sizeof(char *)); + s += sizeof(char *); + + if (t) { + VALUE a, *p, *pend; + + if (!(a = rb_str_associated(str))) { + rb_raise(rb_eArgError, "no associated pointer"); + } + p = RARRAY(a)->ptr; + pend = p + RARRAY(a)->len; + while (p < pend) { + if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) { + if (len < RSTRING(*p)->len) { + tmp = rb_tainted_str_new(t, len); + rb_str_associate(tmp, a); + } + else { + tmp = *p; + } + break; + } + p++; + } + if (p == pend) { + rb_raise(rb_eArgError, "non associated pointer"); + } + } + else { + tmp = Qnil; + } + rb_ary_push(ary, tmp); + } + break; + + case 'p': + if (len > (send - s) / sizeof(char *)) + len = (send - s) / sizeof(char *); + while (len-- > 0) { + if (send - s < sizeof(char *)) + break; + else { + VALUE tmp; + char *t; + + memcpy(&t, s, sizeof(char *)); + s += sizeof(char *); + + if (t) { + VALUE a, *p, *pend; + + if (!(a = rb_str_associated(str))) { + rb_raise(rb_eArgError, "no associated pointer"); + } + p = RARRAY(a)->ptr; + pend = p + RARRAY(a)->len; + while (p < pend) { + if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) { + tmp = *p; + break; + } + p++; + } + if (p == pend) { + rb_raise(rb_eArgError, "non associated pointer"); + } + } + else { + tmp = Qnil; + } + rb_ary_push(ary, tmp); + } + } + break; + + case 'w': + { + unsigned long ul = 0; + unsigned long ulmask = 0xfeUL << ((sizeof(unsigned long) - 1) * 8); + + while (len > 0 && s < send) { + ul <<= 7; + ul |= (*s & 0x7f); + if (!(*s++ & 0x80)) { + rb_ary_push(ary, ULONG2NUM(ul)); + len--; + ul = 0; + } + else if (ul & ulmask) { + VALUE big = rb_uint2big(ul); + VALUE big128 = rb_uint2big(128); + while (s < send) { + big = rb_big_mul(big, big128); + big = rb_big_plus(big, rb_uint2big(*s & 0x7f)); + if (!(*s++ & 0x80)) { + rb_ary_push(ary, big); + len--; + ul = 0; + break; + } + } + } + } + } + break; + + default: + break; + } + } + + return ary; +} + +#define BYTEWIDTH 8 + +static int +uv_to_utf8(buf, uv) + char *buf; + unsigned long uv; +{ + if (uv <= 0x7f) { + buf[0] = (char)uv; + return 1; + } + if (uv <= 0x7ff) { + buf[0] = ((uv>>6)&0xff)|0xc0; + buf[1] = (uv&0x3f)|0x80; + return 2; + } + if (uv <= 0xffff) { + buf[0] = ((uv>>12)&0xff)|0xe0; + buf[1] = ((uv>>6)&0x3f)|0x80; + buf[2] = (uv&0x3f)|0x80; + return 3; + } + if (uv <= 0x1fffff) { + buf[0] = ((uv>>18)&0xff)|0xf0; + buf[1] = ((uv>>12)&0x3f)|0x80; + buf[2] = ((uv>>6)&0x3f)|0x80; + buf[3] = (uv&0x3f)|0x80; + return 4; + } + if (uv <= 0x3ffffff) { + buf[0] = ((uv>>24)&0xff)|0xf8; + buf[1] = ((uv>>18)&0x3f)|0x80; + buf[2] = ((uv>>12)&0x3f)|0x80; + buf[3] = ((uv>>6)&0x3f)|0x80; + buf[4] = (uv&0x3f)|0x80; + return 5; + } + if (uv <= 0x7fffffff) { + buf[0] = ((uv>>30)&0xff)|0xfc; + buf[1] = ((uv>>24)&0x3f)|0x80; + buf[2] = ((uv>>18)&0x3f)|0x80; + buf[3] = ((uv>>12)&0x3f)|0x80; + buf[4] = ((uv>>6)&0x3f)|0x80; + buf[5] = (uv&0x3f)|0x80; + return 6; + } + rb_raise(rb_eRangeError, "pack(U): value out of range"); +} + +static const unsigned long utf8_limits[] = { + 0x0, /* 1 */ + 0x80, /* 2 */ + 0x800, /* 3 */ + 0x10000, /* 4 */ + 0x200000, /* 5 */ + 0x4000000, /* 6 */ + 0x80000000, /* 7 */ +}; + +static unsigned long +utf8_to_uv(p, lenp) + char *p; + long *lenp; +{ + int c = *p++ & 0xff; + unsigned long uv = c; + long n; + + if (!(uv & 0x80)) { + *lenp = 1; + return uv; + } + if (!(uv & 0x40)) { + *lenp = 1; + rb_raise(rb_eArgError, "malformed UTF-8 character"); + } + + if (!(uv & 0x20)) { n = 2; uv &= 0x1f; } + else if (!(uv & 0x10)) { n = 3; uv &= 0x0f; } + else if (!(uv & 0x08)) { n = 4; uv &= 0x07; } + else if (!(uv & 0x04)) { n = 5; uv &= 0x03; } + else if (!(uv & 0x02)) { n = 6; uv &= 0x01; } + else { + *lenp = 1; + rb_raise(rb_eArgError, "malformed UTF-8 character"); + } + if (n > *lenp) { + rb_raise(rb_eArgError, "malformed UTF-8 character (expected %d bytes, given %d bytes)", + n, *lenp); + } + *lenp = n--; + if (n != 0) { + while (n--) { + c = *p++ & 0xff; + if ((c & 0xc0) != 0x80) { + *lenp -= n + 1; + rb_raise(rb_eArgError, "malformed UTF-8 character"); + } + else { + c &= 0x3f; + uv = uv << 6 | c; + } + } + } + n = *lenp - 1; + if (uv < utf8_limits[n]) { + rb_raise(rb_eArgError, "redundant UTF-8 sequence"); + } + return uv; +} + +void +Init_pack() +{ + rb_define_method(rb_cArray, "pack", pack_pack, 1); + rb_define_method(rb_cString, "unpack", pack_unpack, 1); +} +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.3" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + kCLASS = 258, + kMODULE = 259, + kDEF = 260, + kUNDEF = 261, + kBEGIN = 262, + kRESCUE = 263, + kENSURE = 264, + kEND = 265, + kIF = 266, + kUNLESS = 267, + kTHEN = 268, + kELSIF = 269, + kELSE = 270, + kCASE = 271, + kWHEN = 272, + kWHILE = 273, + kUNTIL = 274, + kFOR = 275, + kBREAK = 276, + kNEXT = 277, + kREDO = 278, + kRETRY = 279, + kIN = 280, + kDO = 281, + kDO_COND = 282, + kDO_BLOCK = 283, + kRETURN = 284, + kYIELD = 285, + kSUPER = 286, + kSELF = 287, + kNIL = 288, + kTRUE = 289, + kFALSE = 290, + kAND = 291, + kOR = 292, + kNOT = 293, + kIF_MOD = 294, + kUNLESS_MOD = 295, + kWHILE_MOD = 296, + kUNTIL_MOD = 297, + kRESCUE_MOD = 298, + kALIAS = 299, + kDEFINED = 300, + klBEGIN = 301, + klEND = 302, + k__LINE__ = 303, + k__FILE__ = 304, + tIDENTIFIER = 305, + tFID = 306, + tGVAR = 307, + tIVAR = 308, + tCONSTANT = 309, + tCVAR = 310, + tINTEGER = 311, + tFLOAT = 312, + tSTRING_CONTENT = 313, + tNTH_REF = 314, + tBACK_REF = 315, + tREGEXP_END = 316, + tUPLUS = 317, + tUMINUS = 318, + tPOW = 319, + tCMP = 320, + tEQ = 321, + tEQQ = 322, + tNEQ = 323, + tGEQ = 324, + tLEQ = 325, + tANDOP = 326, + tOROP = 327, + tMATCH = 328, + tNMATCH = 329, + tDOT2 = 330, + tDOT3 = 331, + tAREF = 332, + tASET = 333, + tLSHFT = 334, + tRSHFT = 335, + tCOLON2 = 336, + tCOLON3 = 337, + tOP_ASGN = 338, + tASSOC = 339, + tLPAREN = 340, + tLPAREN_ARG = 341, + tRPAREN = 342, + tLBRACK = 343, + tLBRACE = 344, + tLBRACE_ARG = 345, + tSTAR = 346, + tAMPER = 347, + tSYMBEG = 348, + tSTRING_BEG = 349, + tXSTRING_BEG = 350, + tREGEXP_BEG = 351, + tWORDS_BEG = 352, + tQWORDS_BEG = 353, + tSTRING_DBEG = 354, + tSTRING_DVAR = 355, + tSTRING_END = 356, + tLOWEST = 357, + tUMINUS_NUM = 358, + tLAST_TOKEN = 359 + }; +#endif +/* Tokens. */ +#define kCLASS 258 +#define kMODULE 259 +#define kDEF 260 +#define kUNDEF 261 +#define kBEGIN 262 +#define kRESCUE 263 +#define kENSURE 264 +#define kEND 265 +#define kIF 266 +#define kUNLESS 267 +#define kTHEN 268 +#define kELSIF 269 +#define kELSE 270 +#define kCASE 271 +#define kWHEN 272 +#define kWHILE 273 +#define kUNTIL 274 +#define kFOR 275 +#define kBREAK 276 +#define kNEXT 277 +#define kREDO 278 +#define kRETRY 279 +#define kIN 280 +#define kDO 281 +#define kDO_COND 282 +#define kDO_BLOCK 283 +#define kRETURN 284 +#define kYIELD 285 +#define kSUPER 286 +#define kSELF 287 +#define kNIL 288 +#define kTRUE 289 +#define kFALSE 290 +#define kAND 291 +#define kOR 292 +#define kNOT 293 +#define kIF_MOD 294 +#define kUNLESS_MOD 295 +#define kWHILE_MOD 296 +#define kUNTIL_MOD 297 +#define kRESCUE_MOD 298 +#define kALIAS 299 +#define kDEFINED 300 +#define klBEGIN 301 +#define klEND 302 +#define k__LINE__ 303 +#define k__FILE__ 304 +#define tIDENTIFIER 305 +#define tFID 306 +#define tGVAR 307 +#define tIVAR 308 +#define tCONSTANT 309 +#define tCVAR 310 +#define tINTEGER 311 +#define tFLOAT 312 +#define tSTRING_CONTENT 313 +#define tNTH_REF 314 +#define tBACK_REF 315 +#define tREGEXP_END 316 +#define tUPLUS 317 +#define tUMINUS 318 +#define tPOW 319 +#define tCMP 320 +#define tEQ 321 +#define tEQQ 322 +#define tNEQ 323 +#define tGEQ 324 +#define tLEQ 325 +#define tANDOP 326 +#define tOROP 327 +#define tMATCH 328 +#define tNMATCH 329 +#define tDOT2 330 +#define tDOT3 331 +#define tAREF 332 +#define tASET 333 +#define tLSHFT 334 +#define tRSHFT 335 +#define tCOLON2 336 +#define tCOLON3 337 +#define tOP_ASGN 338 +#define tASSOC 339 +#define tLPAREN 340 +#define tLPAREN_ARG 341 +#define tRPAREN 342 +#define tLBRACK 343 +#define tLBRACE 344 +#define tLBRACE_ARG 345 +#define tSTAR 346 +#define tAMPER 347 +#define tSYMBEG 348 +#define tSTRING_BEG 349 +#define tXSTRING_BEG 350 +#define tREGEXP_BEG 351 +#define tWORDS_BEG 352 +#define tQWORDS_BEG 353 +#define tSTRING_DBEG 354 +#define tSTRING_DVAR 355 +#define tSTRING_END 356 +#define tLOWEST 357 +#define tUMINUS_NUM 358 +#define tLAST_TOKEN 359 + + + + +/* Copy the first part of user declarations. */ +#line 13 "parse.y" + + +#define YYDEBUG 1 +#define YYERROR_VERBOSE 1 +#ifndef YYSTACK_USE_ALLOCA +#define YYSTACK_USE_ALLOCA 0 +#endif + +#include "ruby.h" +#include "env.h" +#include "intern.h" +#include "node.h" +#include "st.h" +#include <stdio.h> +#include <errno.h> +#include <ctype.h> + +#define YYMALLOC rb_parser_malloc +#define YYREALLOC rb_parser_realloc +#define YYCALLOC rb_parser_calloc +#define YYFREE rb_parser_free +#define malloc YYMALLOC +#define realloc YYREALLOC +#define calloc YYCALLOC +#define free YYFREE +static void *rb_parser_malloc _((size_t)); +static void *rb_parser_realloc _((void *, size_t)); +static void *rb_parser_calloc _((size_t, size_t)); +static void rb_parser_free _((void *)); + +#define yyparse ruby_yyparse +#define yylex ruby_yylex +#define yyerror ruby_yyerror +#define yylval ruby_yylval +#define yychar ruby_yychar +#define yydebug ruby_yydebug + +#define ID_SCOPE_SHIFT 3 +#define ID_SCOPE_MASK 0x07 +#define ID_LOCAL 0x01 +#define ID_INSTANCE 0x02 +#define ID_GLOBAL 0x03 +#define ID_ATTRSET 0x04 +#define ID_CONST 0x05 +#define ID_CLASS 0x06 +#define ID_JUNK 0x07 +#define ID_INTERNAL ID_JUNK + +#define is_notop_id(id) ((id)>tLAST_TOKEN) +#define is_local_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_LOCAL) +#define is_global_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_GLOBAL) +#define is_instance_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_INSTANCE) +#define is_attrset_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_ATTRSET) +#define is_const_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_CONST) +#define is_class_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_CLASS) +#define is_junk_id(id) (is_notop_id(id)&&((id)&ID_SCOPE_MASK)==ID_JUNK) + +#define is_asgn_or_id(id) ((is_notop_id(id)) && \ + (((id)&ID_SCOPE_MASK) == ID_GLOBAL || \ + ((id)&ID_SCOPE_MASK) == ID_INSTANCE || \ + ((id)&ID_SCOPE_MASK) == ID_CLASS)) + +NODE *ruby_eval_tree_begin = 0; +NODE *ruby_eval_tree = 0; + +char *ruby_sourcefile; /* current source file */ +int ruby_sourceline; /* current line no. */ + +static int yylex(); +static int yyerror(); + +static enum lex_state { + EXPR_BEG, /* ignore newline, +/- is a sign. */ + EXPR_END, /* newline significant, +/- is an operator. */ + EXPR_ARG, /* newline significant, +/- is an operator. */ + EXPR_CMDARG, /* newline significant, +/- is an operator. */ + EXPR_ENDARG, /* newline significant, +/- is an operator. */ + EXPR_MID, /* newline significant, +/- is an operator. */ + EXPR_FNAME, /* ignore newline, no reserved words. */ + EXPR_DOT, /* right after `.' or `::', no reserved words. */ + EXPR_CLASS, /* immediate after `class', no here document. */ +} lex_state; +static NODE *lex_strterm; + +#ifdef HAVE_LONG_LONG +typedef unsigned LONG_LONG stack_type; +#else +typedef unsigned long stack_type; +#endif + +#define BITSTACK_PUSH(stack, n) (stack = (stack<<1)|((n)&1)) +#define BITSTACK_POP(stack) (stack >>= 1) +#define BITSTACK_LEXPOP(stack) (stack = (stack >> 1) | (stack & 1)) +#define BITSTACK_SET_P(stack) (stack&1) + +static stack_type cond_stack = 0; +#define COND_PUSH(n) BITSTACK_PUSH(cond_stack, n) +#define COND_POP() BITSTACK_POP(cond_stack) +#define COND_LEXPOP() BITSTACK_LEXPOP(cond_stack) +#define COND_P() BITSTACK_SET_P(cond_stack) + +static stack_type cmdarg_stack = 0; +#define CMDARG_PUSH(n) BITSTACK_PUSH(cmdarg_stack, n) +#define CMDARG_POP() BITSTACK_POP(cmdarg_stack) +#define CMDARG_LEXPOP() BITSTACK_LEXPOP(cmdarg_stack) +#define CMDARG_P() BITSTACK_SET_P(cmdarg_stack) + +static int class_nest = 0; +static int in_single = 0; +static int in_def = 0; +static int compile_for_eval = 0; +static ID cur_mid = 0; +static int command_start = Qtrue; + +static NODE *deferred_nodes; + +static NODE *cond(); +static NODE *logop(); +static int cond_negative(); + +static NODE *newline_node(); +static void fixpos(); + +static int value_expr0(); +static void void_expr0(); +static void void_stmts(); +static NODE *remove_begin(); +#define value_expr(node) value_expr0((node) = remove_begin(node)) +#define void_expr(node) void_expr0((node) = remove_begin(node)) + +static NODE *block_append(); +static NODE *list_append(); +static NODE *list_concat(); +static NODE *arg_concat(); +static NODE *arg_prepend(); +static NODE *literal_concat(); +static NODE *new_evstr(); +static NODE *evstr2dstr(); +static NODE *call_op(); +static int in_defined = 0; + +static NODE *negate_lit(); +static NODE *ret_args(); +static NODE *arg_blk_pass(); +static NODE *new_call(); +static NODE *new_fcall(); +static NODE *new_super(); +static NODE *new_yield(); + +static NODE *gettable(); +static NODE *assignable(); +static NODE *aryset(); +static NODE *attrset(); +static void rb_backref_error(); +static NODE *node_assign(); + +static NODE *match_gen(); +static void local_push(); +static void local_pop(); +static int local_append(); +static int local_cnt(); +static int local_id(); +static ID *local_tbl(); +static ID internal_id(); + +static struct RVarmap *dyna_push(); +static void dyna_pop(); +static int dyna_in_block(); +static NODE *dyna_init(); + +static void top_local_init(); +static void top_local_setup(); + +static void fixup_nodes(); + +#define RE_OPTION_ONCE 0x80 + +#define NODE_STRTERM NODE_ZARRAY /* nothing to gc */ +#define NODE_HEREDOC NODE_ARRAY /* 1, 3 to gc */ +#define SIGN_EXTEND(x,n) (((1<<(n)-1)^((x)&~(~0<<(n))))-(1<<(n)-1)) +#define nd_func u1.id +#if SIZEOF_SHORT == 2 +#define nd_term(node) ((signed short)(node)->u2.id) +#else +#define nd_term(node) SIGN_EXTEND((node)->u2.id, CHAR_BIT*2) +#endif +#define nd_paren(node) (char)((node)->u2.id >> CHAR_BIT*2) +#define nd_nest u3.id + +/* Older versions of Yacc set YYMAXDEPTH to a very low value by default (150, + for instance). This is too low for Ruby to parse some files, such as + date/format.rb, therefore bump the value up to at least Bison's default. */ +#ifdef OLD_YACC +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif +#endif + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +#line 213 "parse.y" +{ + NODE *node; + ID id; + int num; + struct RVarmap *vars; +} +/* Line 193 of yacc.c. */ +#line 511 "parse.c" + YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 216 of yacc.c. */ +#line 524 "parse.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int i) +#else +static int +YYID (i) + int i; +#endif +{ + return i; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 9550 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 132 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 144 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 501 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 895 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 359 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 129, 117, 2, 2, 2, 115, 110, 2, + 128, 125, 113, 111, 126, 112, 124, 114, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 105, 131, + 107, 103, 106, 104, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 122, 2, 123, 109, 2, 127, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 120, 108, 121, 118, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 116, 119 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 4, 7, 12, 15, 17, 19, 23, + 26, 27, 32, 36, 40, 44, 47, 51, 55, 59, + 63, 67, 68, 74, 79, 83, 87, 91, 98, 104, + 110, 116, 120, 124, 128, 132, 134, 136, 140, 144, + 147, 150, 152, 154, 156, 158, 161, 164, 167, 169, + 174, 179, 180, 181, 188, 191, 195, 200, 206, 211, + 217, 220, 223, 225, 229, 231, 235, 237, 240, 244, + 247, 250, 252, 254, 258, 261, 265, 267, 272, 276, + 280, 284, 288, 291, 293, 295, 300, 304, 308, 312, + 316, 319, 321, 323, 325, 328, 330, 334, 336, 338, + 340, 342, 344, 346, 348, 350, 352, 354, 355, 360, + 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, + 382, 384, 386, 388, 390, 392, 394, 396, 398, 400, + 402, 404, 406, 408, 410, 412, 414, 416, 418, 420, + 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, + 442, 444, 446, 448, 450, 452, 454, 456, 458, 460, + 462, 464, 466, 468, 470, 472, 474, 476, 478, 480, + 482, 484, 486, 488, 490, 492, 496, 502, 506, 513, + 519, 525, 531, 537, 542, 546, 550, 554, 558, 562, + 566, 570, 574, 578, 583, 588, 591, 594, 598, 602, + 606, 610, 614, 618, 622, 626, 630, 634, 638, 642, + 646, 649, 652, 656, 660, 664, 668, 669, 674, 680, + 682, 684, 686, 689, 692, 698, 701, 705, 709, 714, + 719, 726, 728, 730, 732, 735, 741, 744, 750, 755, + 763, 767, 769, 774, 778, 784, 792, 795, 801, 806, + 813, 821, 831, 835, 837, 838, 841, 843, 844, 848, + 849, 854, 857, 860, 862, 864, 868, 872, 877, 880, + 882, 884, 886, 888, 890, 892, 894, 896, 898, 899, + 904, 905, 911, 915, 919, 922, 927, 931, 935, 937, + 942, 946, 948, 949, 956, 959, 961, 964, 971, 978, + 979, 980, 988, 989, 990, 998, 1004, 1009, 1015, 1016, + 1017, 1027, 1028, 1035, 1036, 1037, 1046, 1047, 1053, 1054, + 1061, 1062, 1063, 1073, 1075, 1077, 1079, 1081, 1083, 1085, + 1087, 1089, 1092, 1094, 1096, 1098, 1100, 1106, 1108, 1111, + 1113, 1115, 1117, 1120, 1122, 1126, 1127, 1128, 1135, 1138, + 1143, 1148, 1151, 1156, 1161, 1165, 1168, 1170, 1171, 1172, + 1179, 1180, 1181, 1188, 1194, 1196, 1201, 1204, 1206, 1208, + 1215, 1217, 1219, 1221, 1223, 1226, 1228, 1231, 1233, 1235, + 1237, 1239, 1241, 1243, 1246, 1250, 1254, 1258, 1262, 1266, + 1267, 1271, 1273, 1276, 1280, 1284, 1285, 1289, 1290, 1293, + 1294, 1297, 1299, 1300, 1304, 1305, 1310, 1312, 1314, 1316, + 1318, 1321, 1323, 1325, 1327, 1329, 1333, 1335, 1337, 1340, + 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, 1359, 1361, + 1363, 1365, 1367, 1369, 1371, 1373, 1375, 1376, 1381, 1384, + 1389, 1392, 1399, 1404, 1409, 1412, 1417, 1420, 1423, 1425, + 1426, 1428, 1430, 1432, 1434, 1436, 1438, 1442, 1446, 1448, + 1452, 1454, 1456, 1459, 1461, 1463, 1465, 1468, 1471, 1473, + 1475, 1476, 1482, 1484, 1487, 1490, 1492, 1496, 1500, 1502, + 1504, 1506, 1508, 1510, 1512, 1514, 1516, 1518, 1520, 1522, + 1524, 1525, 1527, 1528, 1530, 1531, 1533, 1535, 1537, 1539, + 1541, 1544 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int16 yyrhs[] = +{ + 133, 0, -1, -1, 134, 136, -1, 136, 219, 203, + 222, -1, 137, 270, -1, 275, -1, 138, -1, 137, + 274, 138, -1, 1, 138, -1, -1, 44, 160, 139, + 160, -1, 44, 52, 52, -1, 44, 52, 60, -1, + 44, 52, 59, -1, 6, 161, -1, 138, 39, 142, + -1, 138, 40, 142, -1, 138, 41, 142, -1, 138, + 42, 142, -1, 138, 43, 138, -1, -1, 46, 140, + 120, 136, 121, -1, 47, 120, 136, 121, -1, 155, + 103, 143, -1, 149, 103, 143, -1, 246, 83, 143, + -1, 199, 122, 168, 123, 83, 143, -1, 199, 124, + 50, 83, 143, -1, 199, 124, 54, 83, 143, -1, + 199, 81, 50, 83, 143, -1, 247, 83, 143, -1, + 155, 103, 181, -1, 149, 103, 167, -1, 149, 103, + 181, -1, 141, -1, 143, -1, 141, 36, 141, -1, + 141, 37, 141, -1, 38, 141, -1, 117, 143, -1, + 165, -1, 141, -1, 148, -1, 144, -1, 29, 171, + -1, 21, 171, -1, 22, 171, -1, 209, -1, 209, + 124, 267, 173, -1, 209, 81, 267, 173, -1, -1, + -1, 90, 146, 205, 147, 136, 121, -1, 266, 173, + -1, 266, 173, 145, -1, 199, 124, 267, 173, -1, + 199, 124, 267, 173, 145, -1, 199, 81, 267, 173, + -1, 199, 81, 267, 173, 145, -1, 31, 173, -1, + 30, 173, -1, 151, -1, 85, 150, 125, -1, 151, + -1, 85, 150, 125, -1, 153, -1, 153, 152, -1, + 153, 91, 154, -1, 153, 91, -1, 91, 154, -1, + 91, -1, 154, -1, 85, 150, 125, -1, 152, 126, + -1, 153, 152, 126, -1, 244, -1, 199, 122, 168, + 123, -1, 199, 124, 50, -1, 199, 81, 50, -1, + 199, 124, 54, -1, 199, 81, 54, -1, 82, 54, + -1, 247, -1, 244, -1, 199, 122, 168, 123, -1, + 199, 124, 50, -1, 199, 81, 50, -1, 199, 124, + 54, -1, 199, 81, 54, -1, 82, 54, -1, 247, + -1, 50, -1, 54, -1, 82, 156, -1, 156, -1, + 199, 81, 156, -1, 50, -1, 54, -1, 51, -1, + 163, -1, 164, -1, 158, -1, 240, -1, 159, -1, + 242, -1, 160, -1, -1, 161, 126, 162, 160, -1, + 108, -1, 109, -1, 110, -1, 65, -1, 66, -1, + 67, -1, 73, -1, 106, -1, 69, -1, 107, -1, + 70, -1, 79, -1, 80, -1, 111, -1, 112, -1, + 113, -1, 91, -1, 114, -1, 115, -1, 64, -1, + 118, -1, 62, -1, 63, -1, 77, -1, 78, -1, + 127, -1, 48, -1, 49, -1, 46, -1, 47, -1, + 44, -1, 36, -1, 7, -1, 21, -1, 16, -1, + 3, -1, 5, -1, 45, -1, 26, -1, 15, -1, + 14, -1, 10, -1, 9, -1, 35, -1, 20, -1, + 25, -1, 4, -1, 22, -1, 33, -1, 38, -1, + 37, -1, 23, -1, 8, -1, 24, -1, 29, -1, + 32, -1, 31, -1, 13, -1, 34, -1, 6, -1, + 17, -1, 30, -1, 11, -1, 12, -1, 18, -1, + 19, -1, 155, 103, 165, -1, 155, 103, 165, 43, + 165, -1, 246, 83, 165, -1, 199, 122, 168, 123, + 83, 165, -1, 199, 124, 50, 83, 165, -1, 199, + 124, 54, 83, 165, -1, 199, 81, 50, 83, 165, + -1, 199, 81, 54, 83, 165, -1, 82, 54, 83, + 165, -1, 247, 83, 165, -1, 165, 75, 165, -1, + 165, 76, 165, -1, 165, 111, 165, -1, 165, 112, + 165, -1, 165, 113, 165, -1, 165, 114, 165, -1, + 165, 115, 165, -1, 165, 64, 165, -1, 116, 56, + 64, 165, -1, 116, 57, 64, 165, -1, 62, 165, + -1, 63, 165, -1, 165, 108, 165, -1, 165, 109, + 165, -1, 165, 110, 165, -1, 165, 65, 165, -1, + 165, 106, 165, -1, 165, 69, 165, -1, 165, 107, + 165, -1, 165, 70, 165, -1, 165, 66, 165, -1, + 165, 67, 165, -1, 165, 68, 165, -1, 165, 73, + 165, -1, 165, 74, 165, -1, 117, 165, -1, 118, + 165, -1, 165, 79, 165, -1, 165, 80, 165, -1, + 165, 71, 165, -1, 165, 72, 165, -1, -1, 45, + 271, 166, 165, -1, 165, 104, 165, 105, 165, -1, + 182, -1, 165, -1, 275, -1, 148, 271, -1, 180, + 272, -1, 180, 126, 91, 165, 271, -1, 264, 272, + -1, 91, 165, 271, -1, 128, 275, 125, -1, 128, + 171, 271, 125, -1, 128, 209, 271, 125, -1, 128, + 180, 126, 209, 271, 125, -1, 275, -1, 169, -1, + 148, -1, 180, 179, -1, 180, 126, 91, 167, 179, + -1, 264, 179, -1, 264, 126, 91, 167, 179, -1, + 180, 126, 264, 179, -1, 180, 126, 264, 126, 91, + 165, 179, -1, 91, 167, 179, -1, 178, -1, 167, + 126, 180, 179, -1, 167, 126, 178, -1, 167, 126, + 91, 167, 179, -1, 167, 126, 180, 126, 91, 167, + 179, -1, 264, 179, -1, 264, 126, 91, 167, 179, + -1, 167, 126, 264, 179, -1, 167, 126, 180, 126, + 264, 179, -1, 167, 126, 264, 126, 91, 167, 179, + -1, 167, 126, 180, 126, 264, 126, 91, 167, 179, + -1, 91, 167, 179, -1, 178, -1, -1, 174, 175, + -1, 171, -1, -1, 86, 176, 125, -1, -1, 86, + 172, 177, 125, -1, 92, 167, -1, 126, 178, -1, + 275, -1, 167, -1, 180, 126, 167, -1, 180, 126, + 167, -1, 180, 126, 91, 167, -1, 91, 167, -1, + 223, -1, 224, -1, 227, -1, 228, -1, 229, -1, + 232, -1, 245, -1, 247, -1, 51, -1, -1, 7, + 183, 135, 10, -1, -1, 86, 141, 184, 271, 125, + -1, 85, 136, 125, -1, 199, 81, 54, -1, 82, + 54, -1, 199, 122, 168, 123, -1, 88, 168, 123, + -1, 89, 263, 121, -1, 29, -1, 30, 128, 171, + 125, -1, 30, 128, 125, -1, 30, -1, -1, 45, + 271, 128, 185, 141, 125, -1, 266, 211, -1, 210, + -1, 210, 211, -1, 11, 142, 200, 136, 202, 10, + -1, 12, 142, 200, 136, 203, 10, -1, -1, -1, + 18, 186, 142, 201, 187, 136, 10, -1, -1, -1, + 19, 188, 142, 201, 189, 136, 10, -1, 16, 142, + 270, 216, 10, -1, 16, 270, 216, 10, -1, 16, + 270, 15, 136, 10, -1, -1, -1, 20, 204, 25, + 190, 142, 201, 191, 136, 10, -1, -1, 3, 157, + 248, 192, 135, 10, -1, -1, -1, 3, 79, 141, + 193, 273, 194, 135, 10, -1, -1, 4, 157, 195, + 135, 10, -1, -1, 5, 158, 196, 250, 135, 10, + -1, -1, -1, 5, 261, 269, 197, 158, 198, 250, + 135, 10, -1, 21, -1, 22, -1, 23, -1, 24, + -1, 182, -1, 273, -1, 105, -1, 13, -1, 273, + 13, -1, 273, -1, 105, -1, 27, -1, 203, -1, + 14, 142, 200, 136, 202, -1, 275, -1, 15, 136, + -1, 155, -1, 149, -1, 275, -1, 108, 108, -1, + 72, -1, 108, 204, 108, -1, -1, -1, 28, 207, + 205, 208, 136, 10, -1, 148, 206, -1, 209, 124, + 267, 170, -1, 209, 81, 267, 170, -1, 266, 169, + -1, 199, 124, 267, 170, -1, 199, 81, 267, 169, + -1, 199, 81, 268, -1, 31, 169, -1, 31, -1, + -1, -1, 120, 212, 205, 213, 136, 121, -1, -1, + -1, 26, 214, 205, 215, 136, 10, -1, 17, 217, + 200, 136, 218, -1, 180, -1, 180, 126, 91, 167, + -1, 91, 167, -1, 203, -1, 216, -1, 8, 220, + 221, 200, 136, 219, -1, 275, -1, 167, -1, 181, + -1, 275, -1, 84, 155, -1, 275, -1, 9, 136, + -1, 275, -1, 243, -1, 240, -1, 242, -1, 225, + -1, 226, -1, 225, 226, -1, 94, 234, 101, -1, + 95, 235, 101, -1, 96, 235, 61, -1, 97, 129, + 101, -1, 97, 230, 101, -1, -1, 230, 231, 129, + -1, 236, -1, 231, 236, -1, 98, 129, 101, -1, + 98, 233, 101, -1, -1, 233, 58, 129, -1, -1, + 234, 236, -1, -1, 235, 236, -1, 58, -1, -1, + 100, 237, 239, -1, -1, 99, 238, 136, 121, -1, + 52, -1, 53, -1, 55, -1, 247, -1, 93, 241, + -1, 158, -1, 53, -1, 52, -1, 55, -1, 93, + 235, 101, -1, 56, -1, 57, -1, 116, 56, -1, + 116, 57, -1, 50, -1, 53, -1, 52, -1, 54, + -1, 55, -1, 33, -1, 32, -1, 34, -1, 35, + -1, 49, -1, 48, -1, 244, -1, 244, -1, 59, + -1, 60, -1, 273, -1, -1, 107, 249, 142, 273, + -1, 1, 273, -1, 128, 251, 271, 125, -1, 251, + 273, -1, 253, 126, 255, 126, 257, 260, -1, 253, + 126, 255, 260, -1, 253, 126, 257, 260, -1, 253, + 260, -1, 255, 126, 257, 260, -1, 255, 260, -1, + 257, 260, -1, 259, -1, -1, 54, -1, 53, -1, + 52, -1, 55, -1, 50, -1, 252, -1, 253, 126, + 252, -1, 50, 103, 167, -1, 254, -1, 255, 126, + 254, -1, 113, -1, 91, -1, 256, 50, -1, 256, + -1, 110, -1, 92, -1, 258, 50, -1, 126, 259, + -1, 275, -1, 245, -1, -1, 128, 262, 141, 271, + 125, -1, 275, -1, 264, 272, -1, 180, 272, -1, + 265, -1, 264, 126, 265, -1, 167, 84, 167, -1, + 50, -1, 54, -1, 51, -1, 50, -1, 54, -1, + 51, -1, 163, -1, 50, -1, 51, -1, 163, -1, + 124, -1, 81, -1, -1, 274, -1, -1, 130, -1, + -1, 130, -1, 126, -1, 131, -1, 130, -1, 273, + -1, 274, 131, -1, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 350, 350, 350, 375, 395, 403, 404, 408, 412, + 418, 418, 422, 426, 433, 438, 442, 451, 460, 472, + 484, 490, 489, 503, 511, 515, 521, 546, 562, 574, + 586, 598, 603, 607, 612, 617, 620, 621, 625, 629, + 633, 637, 640, 647, 648, 649, 653, 657, 663, 664, + 668, 675, 679, 674, 689, 694, 706, 711, 723, 728, + 740, 745, 752, 753, 759, 760, 766, 770, 774, 778, + 782, 786, 792, 793, 799, 803, 809, 813, 817, 821, + 825, 829, 835, 841, 848, 852, 856, 860, 864, 868, + 874, 880, 887, 891, 894, 898, 902, 908, 909, 910, + 911, 916, 923, 924, 927, 931, 934, 938, 938, 944, + 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, + 965, 966, 967, 968, 969, 972, 972, 972, 972, 973, + 973, 973, 973, 973, 973, 973, 974, 974, 974, 974, + 974, 974, 974, 975, 975, 975, 975, 975, 975, 976, + 976, 976, 976, 976, 976, 976, 977, 977, 977, 977, + 977, 978, 978, 978, 978, 981, 985, 989, 1014, 1030, + 1042, 1054, 1066, 1071, 1076, 1081, 1091, 1101, 1105, 1109, + 1113, 1117, 1121, 1125, 1129, 1133, 1142, 1146, 1150, 1154, + 1158, 1162, 1166, 1170, 1174, 1178, 1182, 1186, 1190, 1194, + 1198, 1202, 1206, 1210, 1214, 1218, 1222, 1222, 1227, 1232, + 1238, 1245, 1246, 1251, 1255, 1260, 1264, 1271, 1275, 1279, + 1284, 1291, 1292, 1295, 1300, 1304, 1309, 1314, 1319, 1324, + 1330, 1334, 1337, 1341, 1345, 1350, 1355, 1360, 1365, 1370, + 1375, 1380, 1385, 1389, 1392, 1392, 1404, 1405, 1405, 1410, + 1410, 1417, 1423, 1427, 1430, 1434, 1440, 1444, 1448, 1454, + 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1467, 1466, + 1479, 1479, 1484, 1489, 1493, 1497, 1505, 1514, 1518, 1522, + 1526, 1530, 1534, 1534, 1539, 1545, 1546, 1555, 1568, 1581, + 1581, 1581, 1591, 1591, 1591, 1601, 1608, 1612, 1616, 1616, + 1616, 1624, 1623, 1640, 1645, 1639, 1662, 1661, 1678, 1677, + 1695, 1696, 1695, 1710, 1714, 1718, 1722, 1728, 1735, 1736, + 1737, 1738, 1741, 1742, 1743, 1746, 1747, 1756, 1757, 1763, + 1764, 1767, 1768, 1772, 1776, 1783, 1787, 1782, 1797, 1806, + 1810, 1816, 1821, 1826, 1831, 1835, 1839, 1846, 1850, 1845, + 1858, 1862, 1857, 1871, 1878, 1879, 1883, 1889, 1890, 1893, + 1904, 1907, 1911, 1912, 1915, 1919, 1922, 1930, 1933, 1934, + 1938, 1941, 1954, 1955, 1961, 1967, 1990, 2023, 2027, 2034, + 2037, 2043, 2044, 2050, 2054, 2061, 2064, 2071, 2074, 2081, + 2084, 2090, 2092, 2091, 2103, 2102, 2123, 2124, 2125, 2126, + 2129, 2136, 2137, 2138, 2139, 2142, 2176, 2177, 2178, 2182, + 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, + 2198, 2201, 2207, 2213, 2214, 2217, 2222, 2221, 2229, 2232, + 2238, 2244, 2248, 2252, 2256, 2260, 2264, 2268, 2272, 2277, + 2282, 2286, 2290, 2294, 2298, 2309, 2310, 2316, 2326, 2331, + 2337, 2338, 2341, 2352, 2363, 2364, 2367, 2377, 2381, 2384, + 2389, 2389, 2414, 2415, 2419, 2428, 2429, 2435, 2441, 2442, + 2443, 2446, 2447, 2448, 2449, 2452, 2453, 2454, 2457, 2458, + 2461, 2462, 2465, 2466, 2469, 2470, 2471, 2474, 2475, 2478, + 2479, 2482 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "kCLASS", "kMODULE", "kDEF", "kUNDEF", + "kBEGIN", "kRESCUE", "kENSURE", "kEND", "kIF", "kUNLESS", "kTHEN", + "kELSIF", "kELSE", "kCASE", "kWHEN", "kWHILE", "kUNTIL", "kFOR", + "kBREAK", "kNEXT", "kREDO", "kRETRY", "kIN", "kDO", "kDO_COND", + "kDO_BLOCK", "kRETURN", "kYIELD", "kSUPER", "kSELF", "kNIL", "kTRUE", + "kFALSE", "kAND", "kOR", "kNOT", "kIF_MOD", "kUNLESS_MOD", "kWHILE_MOD", + "kUNTIL_MOD", "kRESCUE_MOD", "kALIAS", "kDEFINED", "klBEGIN", "klEND", + "k__LINE__", "k__FILE__", "tIDENTIFIER", "tFID", "tGVAR", "tIVAR", + "tCONSTANT", "tCVAR", "tINTEGER", "tFLOAT", "tSTRING_CONTENT", + "tNTH_REF", "tBACK_REF", "tREGEXP_END", "tUPLUS", "tUMINUS", "tPOW", + "tCMP", "tEQ", "tEQQ", "tNEQ", "tGEQ", "tLEQ", "tANDOP", "tOROP", + "tMATCH", "tNMATCH", "tDOT2", "tDOT3", "tAREF", "tASET", "tLSHFT", + "tRSHFT", "tCOLON2", "tCOLON3", "tOP_ASGN", "tASSOC", "tLPAREN", + "tLPAREN_ARG", "tRPAREN", "tLBRACK", "tLBRACE", "tLBRACE_ARG", "tSTAR", + "tAMPER", "tSYMBEG", "tSTRING_BEG", "tXSTRING_BEG", "tREGEXP_BEG", + "tWORDS_BEG", "tQWORDS_BEG", "tSTRING_DBEG", "tSTRING_DVAR", + "tSTRING_END", "tLOWEST", "'='", "'?'", "':'", "'>'", "'<'", "'|'", + "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'", "tUMINUS_NUM", "'!'", + "'~'", "tLAST_TOKEN", "'{'", "'}'", "'['", "']'", "'.'", "')'", "','", + "'`'", "'('", "' '", "'\\n'", "';'", "$accept", "program", "@1", + "bodystmt", "compstmt", "stmts", "stmt", "@2", "@3", "expr", + "expr_value", "command_call", "block_command", "cmd_brace_block", "@4", + "@5", "command", "mlhs", "mlhs_entry", "mlhs_basic", "mlhs_item", + "mlhs_head", "mlhs_node", "lhs", "cname", "cpath", "fname", "fsym", + "fitem", "undef_list", "@6", "op", "reswords", "arg", "@7", "arg_value", + "aref_args", "paren_args", "opt_paren_args", "call_args", "call_args2", + "command_args", "@8", "open_args", "@9", "@10", "block_arg", + "opt_block_arg", "args", "mrhs", "primary", "@11", "@12", "@13", "@14", + "@15", "@16", "@17", "@18", "@19", "@20", "@21", "@22", "@23", "@24", + "@25", "@26", "primary_value", "then", "do", "if_tail", "opt_else", + "block_var", "opt_block_var", "do_block", "@27", "@28", "block_call", + "method_call", "brace_block", "@29", "@30", "@31", "@32", "case_body", + "when_args", "cases", "opt_rescue", "exc_list", "exc_var", "opt_ensure", + "literal", "strings", "string", "string1", "xstring", "regexp", "words", + "word_list", "word", "qwords", "qword_list", "string_contents", + "xstring_contents", "string_content", "@33", "@34", "string_dvar", + "symbol", "sym", "dsym", "numeric", "variable", "var_ref", "var_lhs", + "backref", "superclass", "@35", "f_arglist", "f_args", "f_norm_arg", + "f_arg", "f_opt", "f_optarg", "restarg_mark", "f_rest_arg", + "blkarg_mark", "f_block_arg", "opt_f_block_arg", "singleton", "@36", + "assoc_list", "assocs", "assoc", "operation", "operation2", "operation3", + "dot_or_colon", "opt_terms", "opt_nl", "trailer", "term", "terms", + "none", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 61, 63, 58, 62, 60, 124, 94, + 38, 43, 45, 42, 47, 37, 358, 33, 126, 359, + 123, 125, 91, 93, 46, 41, 44, 96, 40, 32, + 10, 59 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint16 yyr1[] = +{ + 0, 132, 134, 133, 135, 136, 137, 137, 137, 137, + 139, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 140, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 141, 141, 141, 141, + 141, 141, 142, 143, 143, 143, 143, 143, 144, 144, + 144, 146, 147, 145, 148, 148, 148, 148, 148, 148, + 148, 148, 149, 149, 150, 150, 151, 151, 151, 151, + 151, 151, 152, 152, 153, 153, 154, 154, 154, 154, + 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, + 155, 155, 156, 156, 157, 157, 157, 158, 158, 158, + 158, 158, 159, 159, 160, 160, 161, 162, 161, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 166, 165, 165, 165, + 167, 168, 168, 168, 168, 168, 168, 169, 169, 169, + 169, 170, 170, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 172, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 174, 173, 175, 176, 175, 177, + 175, 178, 179, 179, 180, 180, 181, 181, 181, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 183, 182, + 184, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 185, 182, 182, 182, 182, 182, 182, 186, + 187, 182, 188, 189, 182, 182, 182, 182, 190, 191, + 182, 192, 182, 193, 194, 182, 195, 182, 196, 182, + 197, 198, 182, 182, 182, 182, 182, 199, 200, 200, + 200, 200, 201, 201, 201, 202, 202, 203, 203, 204, + 204, 205, 205, 205, 205, 207, 208, 206, 209, 209, + 209, 210, 210, 210, 210, 210, 210, 212, 213, 211, + 214, 215, 211, 216, 217, 217, 217, 218, 218, 219, + 219, 220, 220, 220, 221, 221, 222, 222, 223, 223, + 223, 224, 225, 225, 226, 227, 228, 229, 229, 230, + 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, + 235, 236, 237, 236, 238, 236, 239, 239, 239, 239, + 240, 241, 241, 241, 241, 242, 243, 243, 243, 243, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 245, 246, 247, 247, 248, 249, 248, 248, 250, + 250, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 252, 252, 252, 252, 252, 253, 253, 254, 255, 255, + 256, 256, 257, 257, 258, 258, 259, 260, 260, 261, + 262, 261, 263, 263, 263, 264, 264, 265, 266, 266, + 266, 267, 267, 267, 267, 268, 268, 268, 269, 269, + 270, 270, 271, 271, 272, 272, 272, 273, 273, 274, + 274, 275 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 0, 2, 4, 2, 1, 1, 3, 2, + 0, 4, 3, 3, 3, 2, 3, 3, 3, 3, + 3, 0, 5, 4, 3, 3, 3, 6, 5, 5, + 5, 3, 3, 3, 3, 1, 1, 3, 3, 2, + 2, 1, 1, 1, 1, 2, 2, 2, 1, 4, + 4, 0, 0, 6, 2, 3, 4, 5, 4, 5, + 2, 2, 1, 3, 1, 3, 1, 2, 3, 2, + 2, 1, 1, 3, 2, 3, 1, 4, 3, 3, + 3, 3, 2, 1, 1, 4, 3, 3, 3, 3, + 2, 1, 1, 1, 2, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 4, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 5, 3, 6, 5, + 5, 5, 5, 4, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 4, 4, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 3, 3, 3, 3, 0, 4, 5, 1, + 1, 1, 2, 2, 5, 2, 3, 3, 4, 4, + 6, 1, 1, 1, 2, 5, 2, 5, 4, 7, + 3, 1, 4, 3, 5, 7, 2, 5, 4, 6, + 7, 9, 3, 1, 0, 2, 1, 0, 3, 0, + 4, 2, 2, 1, 1, 3, 3, 4, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, + 0, 5, 3, 3, 2, 4, 3, 3, 1, 4, + 3, 1, 0, 6, 2, 1, 2, 6, 6, 0, + 0, 7, 0, 0, 7, 5, 4, 5, 0, 0, + 9, 0, 6, 0, 0, 8, 0, 5, 0, 6, + 0, 0, 9, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 5, 1, 2, 1, + 1, 1, 2, 1, 3, 0, 0, 6, 2, 4, + 4, 2, 4, 4, 3, 2, 1, 0, 0, 6, + 0, 0, 6, 5, 1, 4, 2, 1, 1, 6, + 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 2, 3, 3, 3, 3, 3, 0, + 3, 1, 2, 3, 3, 0, 3, 0, 2, 0, + 2, 1, 0, 3, 0, 4, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 3, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 4, 2, 4, + 2, 6, 4, 4, 2, 4, 2, 2, 1, 0, + 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, + 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, + 0, 5, 1, 2, 2, 1, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 2, 0 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint16 yydefact[] = +{ + 2, 0, 0, 1, 0, 0, 0, 0, 0, 278, + 0, 0, 490, 299, 302, 0, 323, 324, 325, 326, + 288, 291, 356, 426, 425, 427, 428, 0, 0, 492, + 21, 0, 430, 429, 420, 277, 422, 421, 423, 424, + 416, 417, 433, 434, 0, 0, 0, 0, 0, 501, + 501, 71, 399, 397, 399, 399, 389, 395, 0, 0, + 0, 3, 490, 7, 35, 36, 44, 43, 0, 62, + 0, 66, 72, 0, 41, 219, 0, 48, 295, 269, + 270, 381, 382, 271, 272, 273, 274, 379, 380, 378, + 431, 275, 0, 276, 254, 6, 9, 323, 324, 288, + 291, 356, 492, 92, 93, 0, 0, 0, 0, 95, + 0, 327, 0, 431, 276, 0, 316, 144, 155, 145, + 168, 141, 161, 151, 150, 171, 172, 166, 149, 148, + 143, 169, 173, 174, 153, 142, 156, 160, 162, 154, + 147, 163, 170, 165, 164, 157, 167, 152, 140, 159, + 158, 139, 146, 137, 138, 135, 136, 97, 99, 98, + 130, 131, 128, 112, 113, 114, 117, 119, 115, 132, + 133, 120, 121, 125, 116, 118, 109, 110, 111, 122, + 123, 124, 126, 127, 129, 134, 470, 318, 100, 101, + 469, 0, 164, 157, 167, 152, 135, 136, 97, 98, + 102, 104, 106, 15, 103, 105, 0, 0, 42, 0, + 0, 0, 431, 0, 276, 0, 498, 497, 490, 0, + 499, 491, 0, 0, 0, 340, 339, 0, 0, 431, + 276, 0, 0, 0, 233, 220, 264, 46, 241, 501, + 501, 475, 47, 45, 0, 61, 0, 501, 355, 60, + 39, 0, 10, 493, 216, 0, 0, 195, 0, 196, + 284, 0, 0, 0, 62, 280, 0, 492, 0, 494, + 494, 221, 494, 0, 494, 472, 0, 70, 0, 76, + 83, 413, 412, 414, 411, 0, 410, 0, 0, 0, + 0, 0, 0, 0, 418, 419, 40, 210, 211, 5, + 491, 0, 0, 0, 0, 0, 0, 0, 345, 348, + 0, 74, 0, 69, 67, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 501, 0, 0, 0, 360, 357, 296, + 383, 0, 0, 351, 54, 294, 0, 313, 92, 93, + 94, 418, 419, 0, 436, 311, 435, 0, 501, 0, + 0, 0, 449, 489, 488, 320, 107, 0, 501, 284, + 330, 329, 0, 328, 0, 0, 501, 0, 0, 0, + 0, 0, 0, 0, 0, 500, 0, 0, 284, 0, + 501, 0, 308, 501, 261, 0, 0, 234, 263, 0, + 236, 290, 0, 257, 256, 255, 233, 492, 501, 492, + 0, 12, 14, 13, 0, 292, 0, 0, 0, 0, + 0, 0, 0, 282, 63, 492, 492, 222, 286, 496, + 495, 223, 496, 225, 496, 474, 287, 473, 82, 0, + 501, 0, 401, 404, 402, 415, 400, 384, 398, 385, + 386, 387, 388, 0, 391, 393, 0, 394, 0, 0, + 8, 16, 17, 18, 19, 20, 37, 38, 501, 0, + 25, 33, 0, 34, 0, 68, 75, 24, 175, 264, + 32, 192, 200, 205, 206, 207, 202, 204, 214, 215, + 208, 209, 185, 186, 212, 213, 0, 201, 203, 197, + 198, 199, 187, 188, 189, 190, 191, 481, 486, 482, + 487, 254, 354, 0, 481, 483, 482, 484, 501, 481, + 482, 254, 254, 501, 501, 26, 177, 31, 184, 51, + 55, 0, 438, 0, 0, 92, 93, 96, 0, 0, + 501, 0, 492, 454, 452, 451, 450, 453, 461, 465, + 464, 460, 449, 0, 0, 455, 501, 458, 501, 463, + 501, 0, 448, 0, 0, 279, 501, 501, 370, 501, + 331, 175, 485, 283, 0, 481, 482, 501, 0, 0, + 0, 364, 0, 306, 334, 333, 300, 332, 303, 485, + 283, 0, 481, 482, 0, 0, 240, 477, 0, 265, + 262, 501, 0, 0, 476, 289, 0, 41, 0, 259, + 0, 253, 501, 0, 0, 0, 0, 0, 227, 11, + 0, 217, 0, 23, 183, 63, 0, 226, 0, 265, + 79, 81, 0, 481, 482, 0, 0, 390, 392, 396, + 193, 194, 343, 0, 346, 341, 268, 0, 73, 0, + 0, 0, 0, 353, 58, 285, 0, 0, 232, 352, + 56, 231, 350, 50, 349, 49, 361, 358, 501, 314, + 0, 0, 285, 317, 0, 0, 492, 0, 440, 0, + 444, 468, 0, 446, 462, 0, 447, 466, 321, 108, + 371, 372, 501, 373, 0, 501, 337, 0, 0, 335, + 0, 285, 0, 0, 0, 305, 307, 366, 0, 0, + 0, 0, 285, 0, 501, 0, 238, 501, 501, 0, + 0, 258, 0, 246, 228, 0, 492, 501, 501, 229, + 0, 22, 281, 492, 77, 0, 406, 407, 408, 403, + 409, 342, 0, 0, 0, 266, 176, 218, 30, 181, + 182, 59, 0, 28, 179, 29, 180, 57, 0, 0, + 52, 0, 437, 312, 471, 457, 0, 319, 456, 501, + 501, 467, 0, 459, 501, 449, 0, 0, 375, 338, + 0, 4, 377, 0, 297, 0, 298, 0, 501, 0, + 0, 309, 235, 0, 237, 252, 0, 243, 501, 501, + 260, 0, 0, 293, 224, 405, 344, 0, 267, 27, + 178, 0, 0, 0, 0, 439, 0, 442, 443, 445, + 0, 0, 374, 0, 84, 91, 0, 376, 0, 365, + 367, 368, 363, 301, 304, 0, 501, 501, 0, 242, + 0, 248, 501, 230, 347, 362, 359, 0, 315, 501, + 0, 90, 0, 501, 0, 501, 501, 0, 239, 244, + 0, 501, 0, 247, 53, 441, 322, 485, 89, 0, + 481, 482, 369, 336, 310, 501, 0, 249, 501, 85, + 245, 0, 250, 501, 251 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 1, 2, 377, 378, 62, 63, 424, 255, 64, + 209, 65, 66, 540, 678, 823, 67, 68, 263, 69, + 70, 71, 72, 210, 109, 110, 200, 201, 202, 203, + 574, 527, 189, 74, 426, 236, 268, 668, 669, 237, + 619, 245, 246, 415, 620, 730, 610, 407, 269, 483, + 75, 206, 435, 630, 222, 720, 223, 721, 604, 845, + 544, 541, 771, 370, 372, 573, 785, 258, 382, 596, + 708, 709, 228, 654, 309, 478, 753, 77, 78, 355, + 534, 769, 533, 768, 394, 592, 842, 577, 702, 787, + 791, 79, 80, 81, 82, 83, 84, 85, 291, 463, + 86, 293, 287, 285, 456, 646, 645, 749, 87, 286, + 88, 89, 212, 91, 213, 214, 365, 543, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 781, 690, 191, + 371, 273, 270, 241, 115, 548, 522, 375, 219, 254, + 441, 383, 221, 95 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -654 +static const yytype_int16 yypact[] = +{ + -654, 73, 2254, -654, 5471, 7939, 8236, 3906, 5121, -654, + 6810, 6810, 3777, -654, -654, 8038, 5677, 5677, -654, -654, + 5677, 4436, 4539, -654, -654, -654, -654, 6810, 4996, -44, + -654, -3, -654, -654, 2117, 4024, -654, -654, 4127, -654, + -654, -654, -654, -654, 7634, 7634, 50, 3187, 6810, 6913, + 7634, 8335, 4871, -654, -654, -654, -18, -1, 94, 7737, + 7634, -654, 124, 757, 249, -654, -654, 104, 74, -654, + 57, 8137, -654, 96, 9349, 171, 485, 11, 32, -654, + -654, 120, -654, -654, -654, -654, -654, -654, -654, -654, + 10, -654, 64, 38, 42, -654, 757, -654, -654, -654, + 99, 111, -44, 129, 140, 6810, 90, 3318, 325, -654, + 78, -654, 549, -654, -654, 42, -654, -654, -654, -654, + -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, + -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, + -654, -654, -654, -654, 95, 148, 282, 333, -654, -654, + -654, -654, -654, -654, -654, 336, 337, 465, -654, 473, + -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, + -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, + -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, + -654, 495, -654, -654, -654, -654, -654, -654, -654, -654, + -654, -654, -654, 147, -654, -654, 2615, 225, 249, 48, + 188, 558, 31, 213, 258, 48, -654, -654, 124, 88, + -654, 209, 6810, 6810, 288, -654, -654, 559, 324, 66, + 245, 7634, 7634, 7634, -654, 9349, 274, -654, -654, 262, + 269, -654, -654, -654, 5363, -654, 5780, 5677, -654, -654, + -654, 222, -654, -654, 275, 285, 3449, -654, 571, 366, + 476, 3187, 310, 315, 342, 249, 7634, -44, 371, 392, + 401, -654, 480, 375, 401, -654, 470, -654, 586, 595, + 618, -654, -654, -654, -654, 231, -654, 482, 515, 674, + 425, 565, 444, 30, 493, 499, -654, -654, -654, -654, + 3674, 6810, 6810, 6810, 6810, 5471, 6810, 6810, -654, -654, + 7016, -654, 3187, 8335, 438, 7016, 7634, 7634, 7634, 7634, + 7634, 7634, 7634, 7634, 7634, 7634, 7634, 7634, 7634, 7634, + 7634, 7634, 7634, 7634, 7634, 7634, 7634, 7634, 7634, 7634, + 7634, 7634, 1612, 6913, 8489, 8555, 8555, -654, -654, -654, + -654, 7737, 7737, -654, 501, -654, 275, 249, -654, 623, + -654, -654, -654, 124, -654, -654, -654, 8621, 6913, 8555, + 2615, 6810, 419, -654, -654, -654, -654, 583, 596, 283, + -654, -654, 2737, 590, 7634, 8687, 6913, 8753, 7634, 7634, + 2981, 601, 3571, 7119, 611, -654, 18, 18, 252, 8819, + 6913, 8885, -654, 498, -654, 7634, 5883, -654, -654, 5986, + -654, -654, 503, 5574, -654, -654, 104, -44, 510, 9, + 512, -654, -654, -654, 5121, -654, 7634, 3449, 528, 8687, + 8753, 7634, 529, -654, 527, -44, 9213, -654, -654, 7222, + -654, -654, 7634, -654, 7634, -654, -654, -654, 623, 8951, + 6913, 9017, -654, -654, -654, -654, -654, -654, -654, -654, + -654, -654, -654, 25, -654, -654, 534, -654, 7634, 7634, + 757, -654, -654, -654, -654, -654, -654, -654, 37, 7634, + -654, 544, 546, -654, 550, -654, -654, -654, 1775, -654, + -654, 366, 9418, 9418, 9418, 9418, 547, 547, 9435, 1667, + 9418, 9418, 9366, 9366, 394, 394, 2464, 547, 547, 714, + 714, 437, 43, 43, 366, 366, 366, 2365, 4642, 2484, + 4745, 111, -654, 554, 487, -654, 585, -654, 4539, -654, + -654, 1899, 1899, 37, 37, -654, 9349, -654, 9349, -654, + -654, 124, -654, 6810, 2615, 141, 477, -654, 111, 562, + 111, 681, 35, 597, -654, -654, -654, -654, -654, -654, + -654, -654, 429, 2615, 124, -654, 575, -654, 577, 655, + 588, 665, -654, 5246, 5121, -654, 7325, 703, -654, 398, + -654, 2345, 4230, 4333, 599, 344, 416, 703, 726, 734, + 7634, 626, 48, -654, -654, -654, -654, -654, -654, 60, + 85, 635, 259, 354, 6810, 657, -654, -654, 7634, 274, + -654, 628, 7634, 274, -654, -654, 7634, 9265, 16, -654, + 636, -654, 634, 643, 6089, 8555, 8555, 645, -654, -654, + 6810, 9349, 656, -654, 9349, 296, 658, -654, 7634, -654, + 141, 477, 661, 340, 351, 3449, 671, -654, -654, -654, + 366, 366, -654, 7840, -654, -654, -654, 7428, -654, 7634, + 7634, 7737, 7634, -654, 501, 624, 7737, 7737, -654, -654, + 501, -654, -654, -654, -654, -654, -654, -654, 37, -654, + 124, 776, -654, -654, 663, 7634, -44, 781, -654, 429, + -654, -654, 452, -654, -654, -12, -654, -654, -654, -654, + 544, -654, 708, -654, 3084, 792, -654, 6810, 797, -654, + 7634, 432, 7634, 7634, 798, -654, -654, -654, 7531, 2859, + 3571, 3571, 367, 18, 498, 6192, -654, 498, 498, 6295, + 685, -654, 6398, -654, -654, 104, 9, 111, 111, -654, + 101, -654, -654, 9213, 631, 690, -654, -654, -654, -654, + -654, -654, 709, 3571, 7634, 692, 9349, 9349, -654, 9349, + 9349, -654, 7737, -654, 9349, -654, 9349, -654, 3571, 3449, + -654, 2615, -654, -654, -654, -654, 691, -654, -654, 693, + 588, -654, 597, -654, 588, 419, 8434, 48, -654, -654, + 3571, -654, -654, 48, -654, 7634, -654, 7634, 165, 810, + 812, -654, -654, 7634, -654, -654, 7634, -654, 705, 710, + -654, 7634, 712, -654, -654, -654, -654, 825, -654, -654, + 9349, 830, 720, 3449, 832, -654, 452, -654, -654, -654, + 2615, 789, -654, 640, 595, 618, 2615, -654, 2737, -654, + -654, -654, -654, -654, -654, 3571, 9286, 498, 6501, -654, + 6604, -654, 498, -654, -654, -654, -654, 724, -654, 588, + 838, 623, 9083, 6913, 9149, 596, 398, 839, -654, -654, + 7634, 727, 7634, -654, -654, -654, -654, 41, 477, 732, + 76, 93, -654, -654, -654, 498, 6707, -654, 498, 631, + -654, 7634, -654, 498, -654 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -654, -654, -654, -360, 431, -654, 59, -654, -654, 958, + 44, 23, -654, -569, -654, -654, 1, -6, -183, 22, + 779, -654, -25, 927, -70, 853, 7, -654, 21, -654, + -654, -5, -654, -16, -654, 1378, -338, -7, -479, 82, + -654, 2, -654, -654, -654, -654, -9, 158, 110, -278, + 26, -654, -654, -654, -654, -654, -654, -654, -654, -654, + -654, -654, -654, -654, -654, -654, -654, 185, -209, -372, + 0, -520, 208, -458, -654, -654, -654, -228, -654, 785, + -654, -654, -654, -654, -356, -654, -654, 3, -654, -654, + -654, -654, -654, -654, 784, -654, -654, -654, -654, -654, + -654, -654, -654, 458, -217, -654, -654, -654, 12, -654, + 14, -654, 627, 860, 1246, 1107, -654, -654, 84, 309, + 183, -654, -653, 184, -654, -608, -654, -321, -504, -654, + -654, -654, -4, -382, 755, -226, -654, -654, -24, 20, + 467, 53, 814, 756 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -502 +static const yytype_int16 yytable[] = +{ + 235, 235, 188, 188, 235, 523, 390, 238, 238, 225, + 551, 238, 240, 240, 187, 248, 240, 234, 234, 419, + 204, 234, 205, 188, 249, 598, 277, 614, 257, 259, + 549, 111, 111, 235, 235, 588, 360, 490, 299, 783, + 204, 111, 205, 297, 298, 594, 274, 188, 584, 252, + 267, 572, 672, 674, -87, 215, 218, 705, 347, 284, + 614, 380, 601, 96, 693, 220, 696, 714, 347, 264, + 458, 306, 307, 3, 464, 676, 677, 111, 432, 363, + 559, 780, 296, 452, 784, -87, 253, 353, 466, -86, + 625, -84, 345, -432, 248, 761, 354, 111, 560, 242, + 405, 767, 243, 392, 260, 393, -88, 316, 353, 652, + -89, 290, 642, -84, -432, 220, 521, 256, 528, 531, + 532, 352, 356, 595, 453, 454, 239, 239, 292, 484, + 239, 467, 308, 626, -84, 346, -76, 306, 307, 253, + 358, -91, 729, 550, 359, 653, -87, 351, 216, 217, + 294, 295, 348, 381, 647, -478, 339, 340, 341, 521, + 272, 528, 348, 366, -83, 253, -479, -485, -87, -481, + 247, -87, -87, 783, -84, 550, -426, 310, 216, 217, + 704, -86, 393, 311, 681, 364, -79, 76, -481, 76, + 112, 112, -76, -89, 391, 211, 211, 211, -88, 315, + 227, 211, 211, 687, 550, 211, -86, -86, 216, 217, + -420, -81, 211, -482, 53, 235, 235, 297, 859, -426, + 770, -423, -485, -88, -88, 550, 813, 244, 235, -425, + 235, 235, 76, 211, 211, 238, 278, 238, 238, 247, + 240, 572, 240, 240, 211, 234, 648, 234, 416, -478, + 436, -420, -327, -420, 216, 217, 278, -478, 672, 674, + -479, -485, -423, -485, -423, -485, 396, 397, -479, -481, + -91, 220, -425, 376, 421, 827, 828, -90, 840, 379, + 829, 422, 423, 264, -86, 306, 307, 437, 485, 452, + 211, 384, 76, -327, 235, -327, 388, 547, 701, 488, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 412, 235, 414, 417, + 453, 454, 455, 480, 264, 536, 538, 520, 487, 111, + 395, 389, 398, 614, 267, 471, 472, 473, 474, 402, + 614, 801, 235, -91, 239, 875, 239, 418, 405, 470, + -90, -91, 520, -427, 475, -78, 431, -86, 581, 267, + 235, -83, 536, 538, 535, 537, -80, 235, -82, -88, + 520, 361, 362, 719, 235, -78, -90, 267, 406, 235, + 235, 76, -85, 235, 520, 409, 736, 617, 410, 737, + 738, 267, 611, 425, 621, 427, -427, 211, 211, 622, + 631, 824, 707, 704, -428, 634, 542, -430, -429, 188, + 482, -65, -73, 235, 520, 482, 235, 712, 235, 211, + 316, 211, 211, 61, 235, 433, 204, 623, 205, 627, + 434, 76, 841, -78, 520, 629, 76, -86, -78, 597, + 597, 267, 650, 651, -80, 636, 637, -428, 316, -80, + -430, -429, -88, 235, 572, -78, -78, -64, 614, 553, + 860, 554, 555, 556, 557, -85, -80, -80, 262, 553, + -80, 554, 555, 556, 557, 76, 211, 211, 211, 211, + 76, 211, 211, -77, 438, 211, 446, 76, 278, 713, + 211, 316, 782, 591, 614, 337, 338, 339, 340, 341, + 558, 559, 288, 289, 663, 795, 329, 330, 439, -88, + 558, 559, 440, 664, 448, 879, 461, 442, 211, 560, + 670, 440, 561, 673, 675, -85, 211, 211, 262, 560, + 452, 663, 561, 558, 559, 465, -420, 562, 337, 338, + 339, 340, 341, 211, -423, 76, 211, 468, -283, 431, + 235, 606, 560, 469, 486, 561, 342, 76, 188, 188, + 666, 211, 684, 452, 235, 76, 373, 76, 836, -90, + 698, 453, 454, 457, 838, 211, 204, 680, 205, -420, + -86, 539, 235, 575, 679, 699, 235, -423, 211, -283, + 235, -283, -82, 580, 576, -482, 444, 343, 235, 344, + 440, 316, 76, -78, 453, 454, 459, 688, 393, 374, + 611, 593, 743, 452, 605, 735, 329, 330, 615, 90, + 367, 90, 113, 113, 113, 211, 624, 628, 550, 385, + 399, 235, 229, 756, 757, 759, 760, 225, 723, 633, + 764, 766, 429, -73, 635, 334, 335, 336, 337, 338, + 339, 340, 341, 649, 453, 454, 462, 449, 667, 235, + -264, 368, 657, 369, 90, 658, -431, 665, 279, 111, + 386, 400, 387, 401, 758, 682, 482, 428, -88, 763, + 765, 683, 262, 386, 759, 430, 764, 766, 279, -276, + 685, 689, 235, 692, -284, 694, 776, 762, 450, 235, + 451, -80, -285, 235, 695, 697, 235, -431, 704, -431, + 807, 862, 711, 746, 747, 809, 748, -85, 211, 76, + 42, 43, 452, 772, 90, 460, 715, 443, 235, 445, + -276, 447, -276, 262, 716, -284, 820, -284, 76, 232, + -77, 793, 718, -285, 725, -285, 812, 94, 722, 94, + 732, 731, 863, 814, 864, 94, 94, 94, 734, 726, + 739, 94, 94, 453, 454, 94, 597, 741, 316, 820, + 733, 235, 94, 742, 744, 819, 773, 846, 774, 211, + 235, 777, 786, 329, 330, 235, 301, 302, 303, 304, + 305, 790, 94, 94, 94, 271, 275, 794, 796, 211, + 810, 815, 111, 579, 94, 211, 825, 816, -265, 826, + 843, 587, 844, 589, 336, 337, 338, 339, 340, 341, + 76, 848, 235, 90, 235, 854, 850, 853, 227, 808, + 855, 856, 858, 861, 871, 874, 211, 235, 876, 884, + 314, 211, 211, 886, 235, 889, 235, 520, 632, 116, + 94, 752, 94, 349, 267, 350, 883, 190, 882, 830, + 235, 686, 778, 779, 0, 235, 300, 0, 0, 0, + 0, 0, 802, 90, 0, 804, 805, 0, 90, 76, + 0, 0, 211, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 76, 76, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 0, 73, + 0, 73, 90, 0, 0, 0, 0, 0, 76, 90, + 279, 0, 226, 0, 0, 0, 0, 211, 0, 0, + 0, 0, 0, 76, 76, 0, 76, 0, 0, 0, + 0, 94, 0, 0, 0, 0, 849, 851, 208, 208, + 208, 833, 0, 0, 73, 76, 0, 94, 94, 0, + 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 408, 408, 90, 0, 94, + 0, 94, 94, 420, 868, 869, 265, 0, 76, 90, + 873, 94, 0, 0, 0, 76, 94, 90, 0, 90, + 0, 76, 0, 76, 0, 0, 0, 0, 0, 887, + 76, 0, 0, 0, 73, 0, 0, 0, 0, 0, + 0, 0, 0, 890, 0, 0, 892, 0, 211, 0, + 0, 894, 0, 0, 90, 94, 94, 94, 94, 94, + 94, 94, 94, 357, 0, 94, 0, 94, 0, 0, + 94, 0, 0, 0, 0, 0, 745, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 94, 271, + 0, 0, 0, 0, 0, 0, 94, 94, 0, 93, + 0, 93, 114, 114, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 94, 271, 94, 94, 0, 0, 0, + 0, 0, 0, 73, 578, 789, 0, 94, 0, 0, + 0, 94, 271, 0, 0, 94, 0, 94, 0, 0, + 798, 799, 800, 0, 93, 94, 271, 0, 280, 408, + 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, + 0, 90, 0, 0, 408, 0, 0, 0, 280, 0, + 208, 208, 94, 73, 817, 0, 0, 0, 73, 0, + 90, 0, 0, 0, 0, 0, 0, 0, 0, 821, + 822, 0, 0, 0, 0, 94, 271, 0, 0, 0, + 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, + 0, 837, 0, 0, 0, 0, 0, 73, 0, 0, + 0, 0, 73, 0, 655, 0, 0, 0, 0, 73, + 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, + 92, 0, 0, 0, 857, 0, 0, 0, 0, 208, + 208, 208, 208, 0, 476, 477, 0, 865, 0, 866, + 0, 0, 90, 0, 0, 0, 867, 0, 0, 0, + 229, 0, 0, 0, 671, 0, 0, 671, 671, 655, + 655, 0, 0, 92, 0, 0, 0, 73, 94, 94, + 0, 0, 0, 0, 0, 0, 671, 0, 0, 73, + 0, 0, 0, 93, 0, 0, 0, 73, 94, 73, + 0, 0, 691, 0, 691, 0, 691, 0, 0, 552, + 0, 90, 703, 706, 0, 706, 0, 0, 0, 0, + 0, 0, 0, 706, 0, 0, 90, 90, 90, 0, + 0, 0, 0, 92, 73, 0, 0, 0, 0, 94, + 0, 0, 0, 93, 0, 0, 0, 408, 93, 0, + 0, 265, 0, 0, 0, 0, 0, 0, 408, 94, + 90, 0, 0, 0, 0, 94, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 90, 90, 0, 90, 0, + 94, 0, 0, 0, 0, 0, 0, 93, 0, 0, + 0, 0, 93, 834, 0, 0, 94, 90, 0, 93, + 280, 94, 94, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 655, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 90, 0, 92, 0, 0, 0, 0, 90, 788, 94, + 0, 792, 94, 90, 0, 90, 0, 0, 0, 0, + 0, 73, 90, 0, 94, 94, 94, 93, 0, 0, + 408, 0, 0, 408, 408, 0, 0, 0, 0, 93, + 73, 0, 0, 671, 671, 0, 0, 93, 0, 93, + 0, 208, 92, 0, 0, 0, 0, 92, 94, 0, + 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, + 0, 0, 0, 94, 94, 0, 94, 0, 0, 0, + 0, 0, 0, 0, 93, 691, 691, 0, 0, 0, + 691, 0, 0, 0, 0, 94, 92, 0, 0, 0, + 0, 92, 0, 0, 706, 0, 0, 0, 92, 0, + 0, 0, 208, 0, 408, 408, 0, 0, 0, 0, + 0, 0, 73, 0, 0, 0, 0, 0, 94, 0, + 226, 0, 0, 0, 0, 94, 0, 0, 740, 0, + 0, 94, 0, 94, 0, 0, 0, 0, 0, 0, + 94, 0, 408, 408, 0, 0, 0, 0, 408, 403, + 404, 0, 0, 0, 0, 691, 92, 0, 94, 271, + 0, 578, 706, 0, 0, 0, 0, 408, 92, 0, + 0, 73, 0, 0, 0, 0, 92, 0, 92, 0, + 0, 408, 0, 0, 408, 0, 73, 73, 73, 408, + 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 517, 518, 0, 208, 519, 0, 0, 0, + 93, 0, 0, 92, 160, 161, 162, 163, 164, 165, + 73, 166, 167, 0, 0, 168, 0, 0, 481, 169, + 170, 171, 172, 489, 0, 73, 73, 0, 73, 0, + 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 832, 0, 0, 0, 73, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 0, 0, + 184, 316, 317, 318, 319, 320, 321, 322, 323, 185, + 325, 326, 0, 0, 0, 0, 329, 330, 0, 0, + 73, 0, 93, 750, 0, 0, 0, 73, 0, 0, + 230, 0, 0, 73, 0, 73, 0, 0, 0, 0, + 0, 489, 73, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 607, 609, 0, 0, 613, 0, 0, + 92, 618, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, + 0, 93, 0, 0, 0, 0, 0, 639, 659, 0, + 613, 0, 639, 0, 0, 0, 93, 93, 93, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 0, 0, 329, 330, 0, 656, 0, 0, + 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 93, 93, 0, 93, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 92, 0, 835, 0, 0, 0, 93, 0, -501, + 0, -220, 0, 0, 0, 0, 0, -501, -501, -501, + 0, 0, -501, -501, -501, 0, -501, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -501, 0, 0, 0, + 93, 0, 0, 0, 0, -501, -501, 93, -501, -501, + -501, -501, -501, 93, 0, 93, 0, 0, 0, 0, + 92, 0, 93, 0, 700, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 92, 92, 92, 717, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -501, 0, 0, 0, 0, 0, 724, 0, 0, 0, + 727, 0, 0, 0, 728, 0, 0, 0, 0, 92, + 0, 0, 609, 0, -501, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 92, 92, 0, 92, 0, 0, + -501, 0, 0, -501, -501, 0, 0, 247, 0, -501, + -501, 0, 0, 0, 0, 755, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 775, 0, 0, 0, 0, 0, 92, + 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, + 0, 0, 92, 0, 92, 0, 0, 0, 0, 0, + 0, 92, 0, 0, 0, 0, 639, 0, 0, 0, + 0, 0, 0, 613, 0, 0, 0, 0, 0, 0, + 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -478, -478, -478, 0, -478, 0, 0, 0, -478, -478, + 0, 0, 818, -478, 0, -478, -478, -478, -478, -478, + -478, -478, 0, -478, 0, 0, -478, -478, -478, -478, + -478, -478, -478, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -478, 0, 0, -478, -478, -478, -478, -478, + -478, -478, -478, -478, -478, 839, -478, -478, 0, -478, + -478, 0, 0, 0, 847, 0, 0, 0, 0, 852, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -478, + 0, 0, -478, -478, 0, -478, -478, 0, -478, -478, + -478, -478, -478, -478, -478, -478, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 609, 0, 613, 0, + 0, 0, 0, -478, -478, -478, 0, -478, 0, 0, + 0, 0, 0, 0, 0, -478, 0, 0, 885, 0, + 888, 0, 0, 0, -501, 4, 0, 5, 6, 7, + 8, 9, 0, 0, 613, 10, 11, 0, 0, 893, + 12, 0, 13, 14, 15, 16, 17, 18, 19, 0, + 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, + 0, 0, 27, 0, 0, 0, 0, 0, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 0, 42, 43, 0, 44, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 0, 0, 47, + 48, 0, 49, 50, 0, 51, 0, 52, 53, 54, + 55, 56, 57, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -485, 0, 0, 0, 0, + 58, 59, 60, -485, -485, -485, 0, 0, 0, -485, + -485, 0, -485, 0, -501, -501, 0, 0, 659, 0, + 0, -485, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -485, -485, 0, -485, -485, -485, -485, -485, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 0, 0, 329, 330, 0, 0, 0, -485, + -485, -485, -485, -485, -485, -485, -485, -485, -485, -485, + -485, -485, 0, 0, -485, -485, -485, 0, 661, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 0, 0, 0, 0, 0, 0, 0, -87, -485, + 0, -485, -485, -485, -485, -485, -485, -485, -485, -485, + -485, 0, 0, 0, -283, -485, -485, -485, 0, -485, + -485, -79, -283, -283, -283, -485, -485, 0, -283, -283, + 0, -283, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -283, -283, 0, -283, -283, -283, -283, -283, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 0, 0, 329, 330, 0, 0, 0, -283, -283, + -283, -283, -283, -283, -283, -283, -283, -283, -283, -283, + -283, 0, 0, -283, -283, -283, 0, 662, 331, 660, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 0, 0, 0, 0, 0, 0, 0, -89, -283, 0, + -283, -283, -283, -283, -283, -283, -283, -283, -283, -283, + 0, 0, 0, 0, 0, -283, -283, 0, -283, -283, + -81, 0, 0, 0, -283, -283, 4, 0, 5, 6, + 7, 8, 9, -501, -501, -501, 10, 11, 0, 0, + -501, 12, 0, 13, 14, 15, 16, 17, 18, 19, + 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, + 26, 0, 0, 27, 0, 0, 0, 0, 0, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 0, 42, 43, 0, 44, 45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, + 47, 48, 0, 49, 50, 0, 51, 0, 52, 53, + 54, 55, 56, 57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 58, 59, 60, 0, 0, 0, 0, 4, 0, + 5, 6, 7, 8, 9, -501, -501, -501, 10, 11, + 0, -501, -501, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 0, 0, 0, 0, 20, 21, 22, 23, + 24, 25, 26, 0, 0, 27, 0, 0, 0, 0, + 0, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 0, 42, 43, 0, 44, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, + 0, 0, 47, 48, 0, 49, 50, 0, 51, 0, + 52, 53, 54, 55, 56, 57, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 58, 59, 60, 0, 0, 0, 0, + 4, 0, 5, 6, 7, 8, 9, -501, -501, -501, + 10, 11, 0, 0, -501, 12, -501, 13, 14, 15, + 16, 17, 18, 19, 0, 0, 0, 0, 20, 21, + 22, 23, 24, 25, 26, 0, 0, 27, 0, 0, + 0, 0, 0, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 0, 42, 43, + 0, 44, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 46, 0, 0, 47, 48, 0, 49, 50, 0, + 51, 0, 52, 53, 54, 55, 56, 57, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 58, 59, 60, 0, 0, + 0, 0, 4, 0, 5, 6, 7, 8, 9, -501, + -501, -501, 10, 11, 0, 0, -501, 12, 0, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, + 20, 21, 22, 23, 24, 25, 26, 0, 0, 27, + 0, 0, 0, 0, 0, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 0, + 42, 43, 0, 44, 45, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 46, 0, 0, 47, 48, 0, 49, + 50, 0, 51, 0, 52, 53, 54, 55, 56, 57, + 0, 0, 0, 0, 0, 4, 0, 5, 6, 7, + 8, 9, 0, -501, -501, 10, 11, 58, 59, 60, + 12, 0, 13, 14, 15, 16, 17, 18, 19, 0, + 0, -501, -501, 20, 21, 22, 23, 24, 25, 26, + 0, 0, 27, 0, 0, 0, 0, 0, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 0, 42, 43, 0, 44, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 0, 0, 47, + 48, 0, 49, 50, 0, 51, 0, 52, 53, 54, + 55, 56, 57, 0, 0, 0, 0, 0, 4, 0, + 5, 6, 7, 8, 9, 0, 0, 0, 10, 11, + 58, 59, 60, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 0, 0, -501, -501, 20, 21, 22, 23, + 24, 25, 26, 0, 0, 27, 0, 0, 0, 0, + 0, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 0, 42, 43, 0, 44, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, + 0, 0, 261, 48, 0, 49, 50, 0, 51, 0, + 52, 53, 54, 55, 56, 57, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 58, 59, 60, 0, 0, 0, 0, + 0, 0, -501, 0, 0, 0, 0, -501, -501, 4, + 0, 5, 6, 7, 8, 9, 0, 0, 0, 10, + 11, 0, 0, 0, 12, 0, 13, 14, 15, 16, + 17, 18, 19, 0, 0, 0, 0, 20, 21, 22, + 23, 24, 25, 26, 0, 0, 27, 0, 0, 0, + 0, 0, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 0, 42, 43, 0, + 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 46, 0, 0, 47, 48, 0, 49, 50, 0, 51, + 0, 52, 53, 54, 55, 56, 57, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 59, 60, 0, 0, 0, + 0, 0, 0, -501, 0, 0, 0, 0, -501, -501, + 4, 0, 5, 6, 7, 8, 9, 0, 0, 0, + 10, 11, 0, 0, 0, 12, 0, 13, 14, 15, + 16, 17, 18, 19, 0, 0, 0, 0, 20, 21, + 22, 23, 24, 25, 26, 0, 0, 27, 0, 0, + 0, 0, 0, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 0, 42, 43, + 0, 44, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 46, 0, 0, 47, 48, 0, 49, 50, 0, + 51, 0, 52, 53, 54, 55, 56, 57, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 58, 59, 60, 0, 0, + -501, 0, 4, 0, 5, 6, 7, 8, 9, -501, + -501, -501, 10, 11, 0, 0, 0, 12, 0, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, + 20, 21, 22, 23, 24, 25, 26, 0, 0, 27, + 0, 0, 0, 0, 0, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 0, + 42, 43, 0, 44, 45, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 46, 0, 0, 47, 48, 0, 49, + 50, 0, 51, 0, 52, 53, 54, 55, 56, 57, + 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, + 8, 9, 0, 0, 0, 10, 11, 58, 59, 60, + 12, 0, 13, 14, 15, 16, 17, 18, 19, 0, + 0, -501, -501, 20, 21, 22, 23, 24, 25, 26, + 0, 0, 27, 0, 0, 0, 0, 0, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 0, 42, 43, 0, 44, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 0, 0, 47, + 48, 0, 49, 50, 0, 51, 0, 52, 53, 54, + 55, 56, 57, 0, 0, 0, 0, 0, 0, 0, + 5, 6, 7, 0, 9, 0, 0, 0, 10, 11, + 58, 59, 60, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 0, 0, 0, 395, 20, 21, 22, 23, + 24, 25, 26, 0, 0, 27, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 0, 42, 43, 0, 44, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, + 0, 0, 107, 48, 0, 49, 50, 0, 0, 0, + 52, 53, 54, 55, 56, 57, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 58, 59, 60, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 216, 217, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 0, 0, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 0, 0, 0, 0, 0, + 151, 152, 153, 154, 155, 156, 157, 158, 36, 37, + 159, 39, 0, 0, 0, 0, 0, 0, 160, 161, + 162, 163, 164, 165, 0, 166, 167, 0, 0, 168, + 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 0, 0, 184, 0, 0, -480, -480, -480, + 0, -480, 0, 185, 186, -480, -480, 0, 0, 0, + -480, 0, -480, -480, -480, -480, -480, -480, -480, 0, + -480, 0, 0, -480, -480, -480, -480, -480, -480, -480, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -480, + 0, 0, -480, -480, -480, -480, -480, -480, -480, -480, + -480, -480, 0, -480, -480, 0, -480, -480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -480, 0, 0, -480, + -480, 0, -480, -480, 0, -480, -480, -480, -480, -480, + -480, -480, -480, 0, 0, 0, 0, 0, 0, 0, + -479, -479, -479, 0, -479, 0, 0, 0, -479, -479, + -480, -480, -480, -479, -480, -479, -479, -479, -479, -479, + -479, -479, -480, -479, 0, 0, -479, -479, -479, -479, + -479, -479, -479, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -479, 0, 0, -479, -479, -479, -479, -479, + -479, -479, -479, -479, -479, 0, -479, -479, 0, -479, + -479, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -479, + 0, 0, -479, -479, 0, -479, -479, 0, -479, -479, + -479, -479, -479, -479, -479, -479, 0, 0, 0, 0, + 0, 0, 0, -481, -481, -481, 0, -481, 0, 0, + 0, -481, -481, -479, -479, -479, -481, -479, -481, -481, + -481, -481, -481, -481, -481, -479, 0, 0, 0, -481, + -481, -481, -481, -481, -481, -481, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -481, 0, 0, -481, -481, + -481, -481, -481, -481, -481, -481, -481, -481, 0, -481, + -481, 0, -481, -481, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -481, 710, 0, -481, -481, 0, -481, -481, + 0, -481, -481, -481, -481, -481, -481, -481, -481, 0, + 0, 0, 0, -87, 0, 0, -482, -482, -482, 0, + -482, 0, 0, 0, -482, -482, -481, -481, -481, -482, + 0, -482, -482, -482, -482, -482, -482, -482, -481, 0, + 0, 0, -482, -482, -482, -482, -482, -482, -482, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -482, 0, + 0, -482, -482, -482, -482, -482, -482, -482, -482, -482, + -482, 0, -482, -482, 0, -482, -482, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -482, 662, 0, -482, -482, + 0, -482, -482, 0, -482, -482, -482, -482, -482, -482, + -482, -482, 0, 0, 0, 0, -89, 0, 0, -254, + -254, -254, 0, -254, 0, 0, 0, -254, -254, -482, + -482, -482, -254, 0, -254, -254, -254, -254, -254, -254, + -254, -482, 0, 0, 0, -254, -254, -254, -254, -254, + -254, -254, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -254, 0, 0, -254, -254, -254, -254, -254, -254, + -254, -254, -254, -254, 0, -254, -254, 0, -254, -254, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -254, 0, + 0, -254, -254, 0, -254, -254, 0, -254, -254, -254, + -254, -254, -254, -254, -254, 0, 0, 0, 0, 0, + 0, 0, -254, -254, -254, 0, -254, 0, 0, 0, + -254, -254, -254, -254, -254, -254, 0, -254, -254, -254, + -254, -254, -254, -254, 244, 0, 0, 0, -254, -254, + -254, -254, -254, -254, -254, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -254, 0, 0, -254, -254, -254, + -254, -254, -254, -254, -254, -254, -254, 0, -254, -254, + 0, -254, -254, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -254, 0, 0, -254, -254, 0, -254, -254, 0, + -254, -254, -254, -254, -254, -254, -254, -254, 0, 0, + 0, 0, 0, 0, 0, -483, -483, -483, 0, -483, + 0, 0, 0, -483, -483, -254, -254, -254, -483, 0, + -483, -483, -483, -483, -483, -483, -483, 247, 0, 0, + 0, -483, -483, -483, -483, -483, -483, -483, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -483, 0, 0, + -483, -483, -483, -483, -483, -483, -483, -483, -483, -483, + 0, -483, -483, 0, -483, -483, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -483, 0, 0, -483, -483, 0, + -483, -483, 0, -483, -483, -483, -483, -483, -483, -483, + -483, 0, 0, 0, 0, 0, 0, 0, -484, -484, + -484, 0, -484, 0, 0, 0, -484, -484, -483, -483, + -483, -484, 0, -484, -484, -484, -484, -484, -484, -484, + -483, 0, 0, 0, -484, -484, -484, -484, -484, -484, + -484, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -484, 0, 0, -484, -484, -484, -484, -484, -484, -484, + -484, -484, -484, 0, -484, -484, 0, -484, -484, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -484, 0, 0, + -484, -484, 0, -484, -484, 0, -484, -484, -484, -484, + -484, -484, -484, -484, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -484, -484, -484, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -484, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 0, 0, + 141, 142, 143, 192, 193, 194, 195, 148, 149, 150, + 0, 0, 0, 0, 0, 151, 152, 153, 154, 196, + 197, 198, 158, 281, 282, 199, 283, 0, 0, 0, + 0, 0, 0, 160, 161, 162, 163, 164, 165, 0, + 166, 167, 0, 0, 168, 0, 0, 0, 169, 170, + 171, 172, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 0, 0, 141, 142, 143, 192, 193, + 194, 195, 148, 149, 150, 0, 0, 0, 0, 0, + 151, 152, 153, 154, 196, 197, 198, 158, 251, 0, + 199, 0, 0, 0, 0, 0, 0, 0, 160, 161, + 162, 163, 164, 165, 0, 166, 167, 0, 0, 168, + 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 173, 0, 52, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 0, 0, + 141, 142, 143, 192, 193, 194, 195, 148, 149, 150, + 0, 0, 0, 0, 0, 151, 152, 153, 154, 196, + 197, 198, 158, 0, 0, 199, 0, 0, 0, 0, + 0, 0, 0, 160, 161, 162, 163, 164, 165, 0, + 166, 167, 0, 0, 168, 0, 0, 0, 169, 170, + 171, 172, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 173, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 0, 0, 141, 142, 143, 192, 193, + 194, 195, 148, 149, 150, 0, 0, 0, 0, 0, + 151, 152, 153, 154, 196, 197, 198, 158, 0, 0, + 199, 0, 0, 0, 0, 0, 0, 0, 160, 161, + 162, 163, 164, 165, 0, 166, 167, 0, 0, 168, + 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 0, 0, 184, 0, 5, 6, 7, 0, + 9, 0, 0, 185, 10, 11, 0, 0, 0, 12, + 0, 13, 14, 15, 97, 98, 18, 19, 0, 0, + 0, 0, 99, 21, 22, 23, 24, 25, 26, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 0, 42, 43, 0, 44, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 207, 0, 0, 107, 48, + 0, 49, 50, 0, 231, 232, 52, 53, 54, 55, + 56, 57, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 6, 7, 8, 9, 58, + 233, 60, 10, 11, 0, 0, 0, 12, 411, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, + 20, 21, 22, 23, 24, 25, 26, 0, 0, 27, + 0, 0, 0, 0, 0, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 0, + 42, 43, 0, 44, 45, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 46, 0, 0, 47, 48, 0, 49, + 50, 0, 51, 0, 52, 53, 54, 55, 56, 57, + 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, + 0, 9, 0, 0, 0, 10, 11, 58, 59, 60, + 12, 0, 13, 14, 15, 16, 17, 18, 19, 0, + 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, + 0, 0, 27, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 0, 42, 43, 0, 44, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 207, 0, 0, 107, + 48, 0, 49, 50, 0, 616, 232, 52, 53, 54, + 55, 56, 57, 0, 0, 0, 0, 0, 0, 0, + 5, 6, 7, 0, 9, 0, 0, 0, 10, 11, + 58, 59, 60, 12, 0, 13, 14, 15, 97, 98, + 18, 19, 0, 0, 0, 0, 99, 21, 22, 23, + 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 0, 42, 43, 0, 44, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, + 0, 0, 107, 48, 0, 49, 50, 0, 231, 232, + 52, 53, 54, 55, 56, 57, 0, 0, 0, 0, + 0, 0, 0, 5, 6, 7, 0, 9, 0, 0, + 0, 10, 11, 58, 233, 60, 12, 0, 13, 14, + 15, 97, 98, 18, 19, 0, 0, 0, 0, 99, + 21, 22, 23, 24, 25, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 0, 42, + 43, 0, 44, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 207, 0, 0, 107, 413, 0, 49, 50, + 0, 231, 232, 52, 53, 54, 55, 56, 57, 0, + 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, + 9, 0, 0, 0, 10, 11, 58, 233, 60, 12, + 0, 13, 14, 15, 97, 98, 18, 19, 0, 0, + 0, 0, 99, 100, 101, 23, 24, 25, 26, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 0, 42, 43, 0, 44, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 207, 0, 0, 107, 48, + 0, 49, 50, 0, 608, 232, 52, 53, 54, 55, + 56, 57, 0, 0, 0, 0, 0, 0, 0, 5, + 6, 7, 0, 9, 0, 0, 0, 10, 11, 58, + 233, 60, 12, 0, 13, 14, 15, 97, 98, 18, + 19, 0, 0, 0, 0, 99, 100, 101, 23, 24, + 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 0, 42, 43, 0, 44, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 207, 0, + 0, 107, 48, 0, 49, 50, 0, 612, 232, 52, + 53, 54, 55, 56, 57, 0, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 9, 0, 0, 0, + 10, 11, 58, 233, 60, 12, 0, 13, 14, 15, + 97, 98, 18, 19, 0, 0, 0, 0, 99, 21, + 22, 23, 24, 25, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 0, 42, 43, + 0, 44, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 207, 0, 0, 107, 48, 0, 49, 50, 0, + 608, 232, 52, 53, 54, 55, 56, 57, 0, 0, + 0, 0, 0, 0, 0, 5, 6, 7, 0, 9, + 0, 0, 0, 10, 11, 58, 233, 60, 12, 0, + 13, 14, 15, 97, 98, 18, 19, 0, 0, 0, + 0, 99, 100, 101, 23, 24, 25, 26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 0, 42, 43, 0, 44, 45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 207, 0, 0, 107, 48, 0, + 49, 50, 0, 803, 232, 52, 53, 54, 55, 56, + 57, 0, 0, 0, 0, 0, 0, 0, 5, 6, + 7, 0, 9, 0, 0, 0, 10, 11, 58, 233, + 60, 12, 0, 13, 14, 15, 97, 98, 18, 19, + 0, 0, 0, 0, 99, 100, 101, 23, 24, 25, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 0, 42, 43, 0, 44, 45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 207, 0, 0, + 107, 48, 0, 49, 50, 0, 806, 232, 52, 53, + 54, 55, 56, 57, 0, 0, 0, 0, 0, 0, + 0, 5, 6, 7, 0, 9, 0, 0, 0, 10, + 11, 58, 233, 60, 12, 0, 13, 14, 15, 97, + 98, 18, 19, 0, 0, 0, 0, 99, 100, 101, + 23, 24, 25, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 0, 42, 43, 0, + 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 207, 0, 0, 107, 48, 0, 49, 50, 0, 811, + 232, 52, 53, 54, 55, 56, 57, 0, 0, 0, + 0, 0, 0, 0, 5, 6, 7, 0, 9, 0, + 0, 0, 10, 11, 58, 233, 60, 12, 0, 13, + 14, 15, 97, 98, 18, 19, 0, 0, 0, 0, + 99, 100, 101, 23, 24, 25, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 0, + 42, 43, 0, 44, 45, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 207, 0, 0, 107, 48, 0, 49, + 50, 0, 870, 232, 52, 53, 54, 55, 56, 57, + 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, + 0, 9, 0, 0, 0, 10, 11, 58, 233, 60, + 12, 0, 13, 14, 15, 97, 98, 18, 19, 0, + 0, 0, 0, 99, 100, 101, 23, 24, 25, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 0, 42, 43, 0, 44, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 207, 0, 0, 107, + 48, 0, 49, 50, 0, 872, 232, 52, 53, 54, + 55, 56, 57, 0, 0, 0, 0, 0, 0, 0, + 5, 6, 7, 0, 9, 0, 0, 0, 10, 11, + 58, 233, 60, 12, 0, 13, 14, 15, 97, 98, + 18, 19, 0, 0, 0, 0, 99, 100, 101, 23, + 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 0, 42, 43, 0, 44, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, + 0, 0, 107, 48, 0, 49, 50, 0, 891, 232, + 52, 53, 54, 55, 56, 57, 0, 0, 0, 0, + 0, 0, 0, 5, 6, 7, 0, 9, 0, 0, + 0, 10, 11, 58, 233, 60, 12, 0, 13, 14, + 15, 16, 17, 18, 19, 0, 0, 0, 0, 20, + 21, 22, 23, 24, 25, 26, 0, 0, 27, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 0, 42, + 43, 0, 44, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 207, 0, 0, 107, 48, 0, 49, 50, + 0, 0, 0, 52, 53, 54, 55, 56, 57, 0, + 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, + 9, 0, 0, 0, 10, 11, 58, 59, 60, 12, + 0, 13, 14, 15, 97, 98, 18, 19, 0, 0, + 0, 0, 99, 21, 22, 23, 24, 25, 26, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 0, 42, 43, 0, 44, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 207, 0, 0, 107, 48, + 0, 49, 50, 0, 266, 0, 52, 53, 54, 55, + 56, 57, 0, 0, 0, 0, 0, 0, 0, 5, + 6, 7, 0, 9, 0, 0, 0, 10, 11, 58, + 233, 60, 12, 0, 13, 14, 15, 16, 17, 18, + 19, 0, 0, 0, 0, 20, 21, 22, 23, 24, + 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 0, 42, 43, 0, 44, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 207, 0, + 0, 107, 48, 0, 49, 50, 0, 479, 0, 52, + 53, 54, 55, 56, 57, 0, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 9, 0, 0, 0, + 10, 11, 58, 233, 60, 12, 0, 13, 14, 15, + 97, 98, 18, 19, 0, 0, 0, 0, 99, 100, + 101, 23, 24, 25, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 0, 42, 43, + 0, 44, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 207, 0, 0, 107, 48, 0, 49, 50, 0, + 590, 0, 52, 53, 54, 55, 56, 57, 0, 0, + 0, 0, 0, 0, 0, 5, 6, 7, 0, 9, + 0, 0, 0, 10, 11, 58, 233, 60, 12, 0, + 13, 14, 15, 97, 98, 18, 19, 0, 0, 0, + 0, 99, 100, 101, 23, 24, 25, 26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 0, 42, 43, 0, 44, 45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 207, 0, 0, 107, 48, 0, + 49, 50, 0, 638, 0, 52, 53, 54, 55, 56, + 57, 0, 0, 0, 0, 0, 0, 0, 5, 6, + 7, 0, 9, 0, 0, 0, 10, 11, 58, 233, + 60, 12, 0, 13, 14, 15, 97, 98, 18, 19, + 0, 0, 0, 0, 99, 100, 101, 23, 24, 25, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 0, 42, 43, 0, 44, 45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 207, 0, 0, + 107, 48, 0, 49, 50, 0, 479, 0, 52, 53, + 54, 55, 56, 57, 0, 0, 0, 0, 0, 0, + 0, 5, 6, 7, 0, 9, 0, 0, 0, 10, + 11, 58, 233, 60, 12, 0, 13, 14, 15, 97, + 98, 18, 19, 0, 0, 0, 0, 99, 100, 101, + 23, 24, 25, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 0, 42, 43, 0, + 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 207, 0, 0, 107, 48, 0, 49, 50, 0, 754, + 0, 52, 53, 54, 55, 56, 57, 0, 0, 0, + 0, 0, 0, 0, 5, 6, 7, 0, 9, 0, + 0, 0, 10, 11, 58, 233, 60, 12, 0, 13, + 14, 15, 97, 98, 18, 19, 0, 0, 0, 0, + 99, 100, 101, 23, 24, 25, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 0, + 42, 43, 0, 44, 45, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 207, 0, 0, 107, 48, 0, 49, + 50, 0, 797, 0, 52, 53, 54, 55, 56, 57, + 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, + 0, 9, 0, 0, 0, 10, 11, 58, 233, 60, + 12, 0, 13, 14, 15, 97, 98, 18, 19, 0, + 0, 0, 0, 99, 100, 101, 23, 24, 25, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 0, 42, 43, 0, 44, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 207, 0, 0, 107, + 48, 0, 49, 50, 0, 0, 0, 52, 53, 54, + 55, 56, 57, 0, 0, 0, 0, 0, 0, 0, + 5, 6, 7, 0, 9, 0, 0, 0, 10, 11, + 58, 233, 60, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 0, 0, 0, 0, 20, 21, 22, 23, + 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 0, 42, 43, 0, 44, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, + 0, 0, 107, 48, 0, 49, 50, 0, 0, 0, + 52, 53, 54, 55, 56, 57, 0, 0, 0, 0, + 0, 0, 0, 5, 6, 7, 0, 9, 0, 0, + 0, 10, 11, 58, 233, 60, 12, 0, 13, 14, + 15, 97, 98, 18, 19, 0, 0, 0, 0, 99, + 100, 101, 23, 24, 25, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 102, 0, 0, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 0, 42, + 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 224, 0, 0, 47, 48, 0, 49, 50, + 0, 51, 0, 52, 53, 54, 55, 56, 57, 0, + 0, 0, 5, 6, 7, 0, 9, 0, 751, 0, + 10, 11, 0, 0, 0, 12, 108, 13, 14, 15, + 97, 98, 18, 19, 0, 0, 0, 0, 99, 100, + 101, 23, 24, 25, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 102, 0, 0, 32, 33, 103, + 35, 36, 37, 104, 39, 40, 41, 0, 42, 43, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, + 0, 106, 0, 0, 107, 48, 0, 49, 50, 0, + 0, 0, 52, 53, 54, 55, 56, 57, 0, 0, + 0, 5, 6, 7, 0, 9, 0, 0, 0, 10, + 11, 0, 0, 0, 12, 108, 13, 14, 15, 97, + 98, 18, 19, 0, 0, 0, 0, 99, 100, 101, + 23, 24, 25, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 102, 0, 0, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 0, 42, 43, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 224, 0, 0, 47, 48, 0, 49, 50, 0, 51, + 0, 52, 53, 54, 55, 56, 57, 0, 0, 0, + 5, 6, 7, 0, 9, 0, 0, 0, 10, 11, + 0, 0, 0, 12, 108, 13, 14, 15, 97, 98, + 18, 19, 0, 0, 0, 0, 99, 100, 101, 23, + 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 102, 0, 0, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 0, 42, 43, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, + 0, 0, 312, 48, 0, 49, 50, 0, 313, 0, + 52, 53, 54, 55, 56, 57, 0, 0, 0, 5, + 6, 7, 0, 9, 0, 0, 0, 10, 11, 0, + 0, 0, 12, 108, 13, 14, 15, 97, 98, 18, + 19, 0, 0, 0, 0, 99, 100, 101, 23, 24, + 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 102, 0, 0, 32, 33, 103, 35, 36, 37, + 104, 39, 40, 41, 0, 42, 43, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, + 0, 107, 48, 0, 49, 50, 0, 0, 0, 52, + 53, 54, 55, 56, 57, 0, 0, 0, 5, 6, + 7, 0, 9, 0, 0, 0, 10, 11, 0, 0, + 0, 12, 108, 13, 14, 15, 97, 98, 18, 19, + 0, 0, 0, 0, 99, 100, 101, 23, 24, 25, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 102, 0, 0, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 0, 42, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, + 107, 48, 0, 49, 50, 0, 0, 0, 52, 53, + 54, 55, 56, 57, 0, 0, 0, 5, 6, 7, + 0, 9, 0, 0, 0, 10, 11, 0, 0, 0, + 12, 108, 13, 14, 15, 97, 98, 18, 19, 0, + 0, 0, 0, 99, 100, 101, 23, 24, 25, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, + 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 0, 42, 43, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 831, 0, 0, 107, + 48, 0, 49, 50, 0, 0, 0, 52, 53, 54, + 55, 56, 57, 0, 0, 0, 0, 0, 0, 524, + 525, 0, 0, 526, 0, 0, 0, 0, 0, 0, + 108, 160, 161, 162, 163, 164, 165, 0, 166, 167, + 0, 0, 168, 0, 0, 0, 169, 170, 171, 172, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 529, 525, 184, 0, 530, + 0, 0, 0, 0, 0, 0, 185, 160, 161, 162, + 163, 164, 165, 0, 166, 167, 0, 0, 168, 0, + 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 545, 518, 184, 0, 546, 0, 0, 0, 0, + 0, 0, 185, 160, 161, 162, 163, 164, 165, 0, + 166, 167, 0, 0, 168, 0, 0, 0, 169, 170, + 171, 172, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 582, 518, 184, + 0, 583, 0, 0, 0, 0, 0, 0, 185, 160, + 161, 162, 163, 164, 165, 0, 166, 167, 0, 0, + 168, 0, 0, 0, 169, 170, 171, 172, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 585, 525, 184, 0, 586, 0, 0, + 0, 0, 0, 0, 185, 160, 161, 162, 163, 164, + 165, 0, 166, 167, 0, 0, 168, 0, 0, 0, + 169, 170, 171, 172, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 599, + 518, 184, 0, 600, 0, 0, 0, 0, 0, 0, + 185, 160, 161, 162, 163, 164, 165, 0, 166, 167, + 0, 0, 168, 0, 0, 0, 169, 170, 171, 172, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 602, 525, 184, 0, 603, + 0, 0, 0, 0, 0, 0, 185, 160, 161, 162, + 163, 164, 165, 0, 166, 167, 0, 0, 168, 0, + 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 640, 518, 184, 0, 641, 0, 0, 0, 0, + 0, 0, 185, 160, 161, 162, 163, 164, 165, 0, + 166, 167, 0, 0, 168, 0, 0, 0, 169, 170, + 171, 172, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 643, 525, 184, + 0, 644, 0, 0, 0, 0, 0, 0, 185, 160, + 161, 162, 163, 164, 165, 0, 166, 167, 0, 0, + 168, 0, 0, 0, 169, 170, 171, 172, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 877, 518, 184, 0, 878, 0, 0, + 0, 0, 0, 0, 185, 160, 161, 162, 163, 164, + 165, 0, 166, 167, 0, 0, 168, 0, 0, 0, + 169, 170, 171, 172, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 880, + 525, 184, 0, 881, 0, 0, 0, 0, 0, 0, + 185, 160, 161, 162, 163, 164, 165, 0, 166, 167, + 0, 0, 168, 0, 0, 0, 169, 170, 171, 172, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 0, 0, 329, 330, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 0, 253, 329, 330, 0, 0, 0, -220, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 0, 0, 329, 330, 0, 0, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 331, -220, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 605, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 0, 0, 329, 330, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -502, -502, 0, 0, 329, 330, 0, 0, 0, + 0, 0, 0, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 0, 0, 0, 0, 0, + 0, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 316, -502, -502, -502, -502, 321, 322, 0, + 0, -502, -502, 0, 0, 0, 0, 329, 330, 316, + 317, 318, 319, 320, 321, 322, 0, 0, 325, 326, + 0, 0, 0, 0, 329, 330, 0, 0, 0, 0, + 0, 0, 0, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 0, 0, 0, 0, 0, 0, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341 +}; + +static const yytype_int16 yycheck[] = +{ + 16, 17, 7, 8, 20, 343, 215, 16, 17, 15, + 370, 20, 16, 17, 7, 22, 20, 16, 17, 247, + 8, 20, 8, 28, 22, 397, 51, 409, 44, 45, + 368, 5, 6, 49, 50, 391, 106, 315, 62, 692, + 28, 15, 28, 59, 60, 27, 50, 52, 386, 28, + 49, 372, 531, 532, 13, 11, 12, 577, 26, 52, + 442, 13, 400, 4, 568, 12, 570, 587, 26, 47, + 287, 36, 37, 0, 291, 533, 534, 51, 261, 1, + 92, 689, 59, 58, 692, 25, 130, 94, 58, 13, + 81, 25, 81, 83, 101, 664, 94, 71, 110, 17, + 84, 670, 20, 15, 54, 17, 13, 64, 115, 72, + 25, 129, 450, 103, 83, 62, 342, 120, 344, 345, + 346, 83, 102, 105, 99, 100, 16, 17, 129, 312, + 20, 101, 28, 124, 103, 124, 126, 36, 37, 130, + 50, 103, 126, 369, 54, 108, 105, 83, 130, 131, + 56, 57, 120, 105, 129, 26, 113, 114, 115, 385, + 50, 387, 120, 110, 126, 130, 26, 26, 108, 128, + 128, 130, 131, 826, 108, 401, 81, 103, 130, 131, + 15, 105, 17, 126, 544, 107, 126, 2, 128, 4, + 5, 6, 126, 108, 218, 10, 11, 12, 105, 103, + 15, 16, 17, 563, 430, 20, 130, 131, 130, 131, + 81, 126, 27, 128, 94, 231, 232, 233, 826, 124, + 678, 81, 81, 130, 131, 451, 125, 128, 244, 81, + 246, 247, 47, 48, 49, 244, 51, 246, 247, 128, + 244, 562, 246, 247, 59, 244, 463, 246, 247, 120, + 266, 122, 81, 124, 130, 131, 71, 128, 737, 738, + 120, 120, 122, 122, 124, 124, 222, 223, 128, 128, + 25, 218, 124, 126, 52, 779, 780, 25, 798, 54, + 784, 59, 60, 261, 25, 36, 37, 267, 313, 58, + 105, 103, 107, 122, 310, 124, 83, 367, 576, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 244, 343, 246, 247, + 99, 100, 101, 310, 312, 351, 352, 342, 315, 313, + 131, 83, 54, 725, 343, 301, 302, 303, 304, 25, + 732, 723, 368, 108, 244, 859, 246, 247, 84, 300, + 108, 103, 367, 81, 305, 25, 83, 108, 384, 368, + 386, 126, 388, 389, 351, 352, 25, 393, 126, 25, + 385, 56, 57, 592, 400, 126, 103, 386, 126, 405, + 406, 206, 25, 409, 399, 126, 624, 413, 240, 625, + 626, 400, 406, 128, 413, 120, 124, 222, 223, 413, + 426, 771, 14, 15, 81, 431, 363, 81, 81, 424, + 310, 125, 126, 439, 429, 315, 442, 83, 444, 244, + 64, 246, 247, 2, 450, 125, 424, 417, 424, 419, + 125, 256, 798, 103, 449, 424, 261, 103, 108, 396, + 397, 450, 468, 469, 103, 435, 436, 124, 64, 108, + 124, 124, 108, 479, 785, 125, 126, 125, 850, 50, + 830, 52, 53, 54, 55, 108, 125, 126, 47, 50, + 126, 52, 53, 54, 55, 300, 301, 302, 303, 304, + 305, 306, 307, 126, 123, 310, 121, 312, 313, 83, + 315, 64, 50, 393, 886, 111, 112, 113, 114, 115, + 91, 92, 54, 55, 521, 83, 79, 80, 126, 103, + 91, 92, 130, 521, 54, 863, 101, 126, 343, 110, + 528, 130, 113, 531, 532, 103, 351, 352, 107, 110, + 58, 548, 113, 91, 92, 101, 81, 128, 111, 112, + 113, 114, 115, 368, 81, 370, 371, 64, 81, 83, + 576, 403, 110, 64, 126, 113, 81, 382, 573, 574, + 83, 386, 552, 58, 590, 390, 81, 392, 787, 103, + 573, 99, 100, 101, 793, 400, 574, 543, 574, 124, + 103, 90, 608, 10, 541, 574, 612, 124, 413, 122, + 616, 124, 126, 13, 8, 128, 126, 122, 624, 124, + 130, 64, 427, 126, 99, 100, 101, 564, 17, 124, + 624, 10, 638, 58, 126, 624, 79, 80, 125, 2, + 81, 4, 5, 6, 7, 450, 126, 125, 864, 81, + 81, 657, 15, 659, 660, 661, 662, 653, 604, 121, + 666, 667, 81, 126, 125, 108, 109, 110, 111, 112, + 113, 114, 115, 129, 99, 100, 101, 81, 83, 685, + 126, 122, 126, 124, 47, 125, 81, 123, 51, 653, + 122, 122, 124, 124, 661, 123, 576, 256, 103, 666, + 667, 10, 261, 122, 710, 124, 712, 713, 71, 81, + 103, 126, 718, 126, 81, 50, 686, 83, 122, 725, + 124, 126, 81, 729, 126, 50, 732, 122, 15, 124, + 729, 81, 123, 52, 53, 729, 55, 103, 543, 544, + 59, 60, 58, 680, 107, 61, 10, 270, 754, 272, + 122, 274, 124, 312, 10, 122, 762, 124, 563, 92, + 126, 707, 126, 122, 126, 124, 736, 2, 123, 4, + 126, 125, 122, 743, 124, 10, 11, 12, 125, 611, + 125, 16, 17, 99, 100, 20, 723, 121, 64, 795, + 622, 797, 27, 125, 123, 762, 10, 803, 125, 604, + 806, 10, 84, 79, 80, 811, 39, 40, 41, 42, + 43, 9, 47, 48, 49, 49, 50, 10, 10, 624, + 125, 121, 786, 382, 59, 630, 125, 108, 126, 126, + 10, 390, 10, 392, 110, 111, 112, 113, 114, 115, + 645, 126, 848, 206, 850, 10, 126, 125, 653, 729, + 10, 121, 10, 54, 848, 121, 661, 863, 10, 10, + 71, 666, 667, 126, 870, 123, 872, 862, 427, 6, + 105, 653, 107, 78, 863, 81, 866, 7, 865, 785, + 886, 562, 689, 689, -1, 891, 62, -1, -1, -1, + -1, -1, 724, 256, -1, 727, 728, -1, 261, 704, + -1, -1, 707, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 719, 720, 721, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 300, -1, 2, + -1, 4, 305, -1, -1, -1, -1, -1, 753, 312, + 313, -1, 15, -1, -1, -1, -1, 762, -1, -1, + -1, -1, -1, 768, 769, -1, 771, -1, -1, -1, + -1, 206, -1, -1, -1, -1, 808, 809, 10, 11, + 12, 786, -1, -1, 47, 790, -1, 222, 223, -1, + -1, -1, -1, -1, -1, 27, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 239, 240, 370, -1, 244, + -1, 246, 247, 247, 846, 847, 48, -1, 823, 382, + 852, 256, -1, -1, -1, 830, 261, 390, -1, 392, + -1, 836, -1, 838, -1, -1, -1, -1, -1, 871, + 845, -1, -1, -1, 107, -1, -1, -1, -1, -1, + -1, -1, -1, 885, -1, -1, 888, -1, 863, -1, + -1, 893, -1, -1, 427, 300, 301, 302, 303, 304, + 305, 306, 307, 105, -1, 310, -1, 312, -1, -1, + 315, -1, -1, -1, -1, -1, 645, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 343, 343, + -1, -1, -1, -1, -1, -1, 351, 352, -1, 2, + -1, 4, 5, 6, -1, -1, -1, -1, -1, -1, + -1, -1, 15, 368, 368, 370, 371, -1, -1, -1, + -1, -1, -1, 206, 378, 704, -1, 382, -1, -1, + -1, 386, 386, -1, -1, 390, -1, 392, -1, -1, + 719, 720, 721, -1, 47, 400, 400, -1, 51, 403, + -1, -1, -1, -1, -1, -1, -1, -1, 413, -1, + -1, 544, -1, -1, 418, -1, -1, -1, 71, -1, + 222, 223, 427, 256, 753, -1, -1, -1, 261, -1, + 563, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, -1, -1, 450, 450, -1, -1, -1, + -1, -1, -1, -1, 107, -1, -1, -1, -1, -1, + -1, 790, -1, -1, -1, -1, -1, 300, -1, -1, + -1, -1, 305, -1, 478, -1, -1, -1, -1, 312, + -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, + 4, -1, -1, -1, 823, -1, -1, -1, -1, 301, + 302, 303, 304, -1, 306, 307, -1, 836, -1, 838, + -1, -1, 645, -1, -1, -1, 845, -1, -1, -1, + 653, -1, -1, -1, 528, -1, -1, 531, 532, 533, + 534, -1, -1, 47, -1, -1, -1, 370, 543, 544, + -1, -1, -1, -1, -1, -1, 550, -1, -1, 382, + -1, -1, -1, 206, -1, -1, -1, 390, 563, 392, + -1, -1, 566, -1, 568, -1, 570, -1, -1, 371, + -1, 704, 576, 577, -1, 579, -1, -1, -1, -1, + -1, -1, -1, 587, -1, -1, 719, 720, 721, -1, + -1, -1, -1, 107, 427, -1, -1, -1, -1, 604, + -1, -1, -1, 256, -1, -1, -1, 611, 261, -1, + -1, 413, -1, -1, -1, -1, -1, -1, 622, 624, + 753, -1, -1, -1, -1, 630, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, 771, -1, + 645, -1, -1, -1, -1, -1, -1, 300, -1, -1, + -1, -1, 305, 786, -1, -1, 661, 790, -1, 312, + 313, 666, 667, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 678, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 823, -1, 206, -1, -1, -1, -1, 830, 702, 704, + -1, 705, 707, 836, -1, 838, -1, -1, -1, -1, + -1, 544, 845, -1, 719, 720, 721, 370, -1, -1, + 724, -1, -1, 727, 728, -1, -1, -1, -1, 382, + 563, -1, -1, 737, 738, -1, -1, 390, -1, 392, + -1, 543, 256, -1, -1, -1, -1, 261, 753, -1, + -1, -1, -1, -1, -1, -1, -1, 762, -1, -1, + -1, -1, -1, 768, 769, -1, 771, -1, -1, -1, + -1, -1, -1, -1, 427, 779, 780, -1, -1, -1, + 784, -1, -1, -1, -1, 790, 300, -1, -1, -1, + -1, 305, -1, -1, 798, -1, -1, -1, 312, -1, + -1, -1, 604, -1, 808, 809, -1, -1, -1, -1, + -1, -1, 645, -1, -1, -1, -1, -1, 823, -1, + 653, -1, -1, -1, -1, 830, -1, -1, 630, -1, + -1, 836, -1, 838, -1, -1, -1, -1, -1, -1, + 845, -1, 846, 847, -1, -1, -1, -1, 852, 231, + 232, -1, -1, -1, -1, 859, 370, -1, 863, 863, + -1, 865, 866, -1, -1, -1, -1, 871, 382, -1, + -1, 704, -1, -1, -1, -1, 390, -1, 392, -1, + -1, 885, -1, -1, 888, -1, 719, 720, 721, 893, + -1, 544, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, 51, -1, 707, 54, -1, -1, -1, + 563, -1, -1, 427, 62, 63, 64, 65, 66, 67, + 753, 69, 70, -1, -1, 73, -1, -1, 310, 77, + 78, 79, 80, 315, -1, 768, 769, -1, 771, -1, + -1, -1, -1, 91, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 786, -1, -1, -1, 790, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, -1, -1, + 118, 64, 65, 66, 67, 68, 69, 70, 71, 127, + 73, 74, -1, -1, -1, -1, 79, 80, -1, -1, + 823, -1, 645, 646, -1, -1, -1, 830, -1, -1, + 653, -1, -1, 836, -1, 838, -1, -1, -1, -1, + -1, 393, 845, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 405, 406, -1, -1, 409, -1, -1, + 544, 413, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 563, + -1, 704, -1, -1, -1, -1, -1, 439, 43, -1, + 442, -1, 444, -1, -1, -1, 719, 720, 721, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, -1, -1, 79, 80, -1, 479, -1, -1, + 753, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, 771, 104, + -1, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 645, -1, 786, -1, -1, -1, 790, -1, 0, + -1, 126, -1, -1, -1, -1, -1, 8, 9, 10, + -1, -1, 13, 14, 15, -1, 17, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 27, -1, -1, -1, + 823, -1, -1, -1, -1, 36, 37, 830, 39, 40, + 41, 42, 43, 836, -1, 838, -1, -1, -1, -1, + 704, -1, 845, -1, 576, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 719, 720, 721, 590, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 81, -1, -1, -1, -1, -1, 608, -1, -1, -1, + 612, -1, -1, -1, 616, -1, -1, -1, -1, 753, + -1, -1, 624, -1, 105, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, 771, -1, -1, + 121, -1, -1, 124, 125, -1, -1, 128, -1, 130, + 131, -1, -1, -1, -1, 657, 790, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 685, -1, -1, -1, -1, -1, 823, + -1, -1, -1, -1, -1, -1, 830, -1, -1, -1, + -1, -1, 836, -1, 838, -1, -1, -1, -1, -1, + -1, 845, -1, -1, -1, -1, 718, -1, -1, -1, + -1, -1, -1, 725, -1, -1, -1, -1, -1, -1, + 732, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3, 4, 5, -1, 7, -1, -1, -1, 11, 12, + -1, -1, 754, 16, -1, 18, 19, 20, 21, 22, + 23, 24, -1, 26, -1, -1, 29, 30, 31, 32, + 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 45, -1, -1, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 797, 59, 60, -1, 62, + 63, -1, -1, -1, 806, -1, -1, -1, -1, 811, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, 85, 86, -1, 88, 89, -1, 91, 92, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 848, -1, 850, -1, + -1, -1, -1, 116, 117, 118, -1, 120, -1, -1, + -1, -1, -1, -1, -1, 128, -1, -1, 870, -1, + 872, -1, -1, -1, 0, 1, -1, 3, 4, 5, + 6, 7, -1, -1, 886, 11, 12, -1, -1, 891, + 16, -1, 18, 19, 20, 21, 22, 23, 24, -1, + -1, -1, -1, 29, 30, 31, 32, 33, 34, 35, + -1, -1, 38, -1, -1, -1, -1, -1, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, -1, 62, 63, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 82, -1, -1, 85, + 86, -1, 88, 89, -1, 91, -1, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, + 116, 117, 118, 8, 9, 10, -1, -1, -1, 14, + 15, -1, 17, -1, 130, 131, -1, -1, 43, -1, + -1, 26, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 36, 37, -1, 39, 40, 41, 42, 43, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, -1, -1, 79, 80, -1, -1, -1, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, -1, -1, 79, 80, 81, -1, 83, 104, + -1, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, -1, -1, -1, -1, -1, -1, -1, 103, 104, + -1, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, -1, -1, -1, 0, 120, 121, 122, -1, 124, + 125, 126, 8, 9, 10, 130, 131, -1, 14, 15, + -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, 37, -1, 39, 40, 41, 42, 43, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, -1, -1, 79, 80, -1, -1, -1, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, -1, -1, 79, 80, 81, -1, 83, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + -1, -1, -1, -1, -1, -1, -1, 103, 104, -1, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + -1, -1, -1, -1, -1, 121, 122, -1, 124, 125, + 126, -1, -1, -1, 130, 131, 1, -1, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, + 15, 16, -1, 18, 19, 20, 21, 22, 23, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + 35, -1, -1, 38, -1, -1, -1, -1, -1, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, -1, 59, 60, -1, 62, 63, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, + 85, 86, -1, 88, 89, -1, 91, -1, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, 117, 118, -1, -1, -1, -1, 1, -1, + 3, 4, 5, 6, 7, 130, 131, 10, 11, 12, + -1, 14, 15, 16, -1, 18, 19, 20, 21, 22, + 23, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, 35, -1, -1, 38, -1, -1, -1, -1, + -1, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, -1, 62, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, 85, 86, -1, 88, 89, -1, 91, -1, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, 117, 118, -1, -1, -1, -1, + 1, -1, 3, 4, 5, 6, 7, 130, 131, 10, + 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, 35, -1, -1, 38, -1, -1, + -1, -1, -1, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + -1, 62, 63, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 82, -1, -1, 85, 86, -1, 88, 89, -1, + 91, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, 117, 118, -1, -1, + -1, -1, 1, -1, 3, 4, 5, 6, 7, 130, + 131, 10, 11, 12, -1, -1, 15, 16, -1, 18, + 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, 35, -1, -1, 38, + -1, -1, -1, -1, -1, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, -1, 62, 63, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 82, -1, -1, 85, 86, -1, 88, + 89, -1, 91, -1, 93, 94, 95, 96, 97, 98, + -1, -1, -1, -1, -1, 1, -1, 3, 4, 5, + 6, 7, -1, 9, 10, 11, 12, 116, 117, 118, + 16, -1, 18, 19, 20, 21, 22, 23, 24, -1, + -1, 130, 131, 29, 30, 31, 32, 33, 34, 35, + -1, -1, 38, -1, -1, -1, -1, -1, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, -1, 62, 63, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 82, -1, -1, 85, + 86, -1, 88, 89, -1, 91, -1, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, 1, -1, + 3, 4, 5, 6, 7, -1, -1, -1, 11, 12, + 116, 117, 118, 16, -1, 18, 19, 20, 21, 22, + 23, 24, -1, -1, 130, 131, 29, 30, 31, 32, + 33, 34, 35, -1, -1, 38, -1, -1, -1, -1, + -1, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, -1, 62, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, 85, 86, -1, 88, 89, -1, 91, -1, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, 117, 118, -1, -1, -1, -1, + -1, -1, 125, -1, -1, -1, -1, 130, 131, 1, + -1, 3, 4, 5, 6, 7, -1, -1, -1, 11, + 12, -1, -1, -1, 16, -1, 18, 19, 20, 21, + 22, 23, 24, -1, -1, -1, -1, 29, 30, 31, + 32, 33, 34, 35, -1, -1, 38, -1, -1, -1, + -1, -1, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, -1, 59, 60, -1, + 62, 63, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 82, -1, -1, 85, 86, -1, 88, 89, -1, 91, + -1, 93, 94, 95, 96, 97, 98, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, 117, 118, -1, -1, -1, + -1, -1, -1, 125, -1, -1, -1, -1, 130, 131, + 1, -1, 3, 4, 5, 6, 7, -1, -1, -1, + 11, 12, -1, -1, -1, 16, -1, 18, 19, 20, + 21, 22, 23, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, 35, -1, -1, 38, -1, -1, + -1, -1, -1, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + -1, 62, 63, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 82, -1, -1, 85, 86, -1, 88, 89, -1, + 91, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, 117, 118, -1, -1, + 121, -1, 1, -1, 3, 4, 5, 6, 7, 130, + 131, 10, 11, 12, -1, -1, -1, 16, -1, 18, + 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, 35, -1, -1, 38, + -1, -1, -1, -1, -1, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, -1, 62, 63, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 82, -1, -1, 85, 86, -1, 88, + 89, -1, 91, -1, 93, 94, 95, 96, 97, 98, + -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, + 6, 7, -1, -1, -1, 11, 12, 116, 117, 118, + 16, -1, 18, 19, 20, 21, 22, 23, 24, -1, + -1, 130, 131, 29, 30, 31, 32, 33, 34, 35, + -1, -1, 38, -1, -1, -1, -1, -1, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, -1, 62, 63, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 82, -1, -1, 85, + 86, -1, 88, 89, -1, 91, -1, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + 3, 4, 5, -1, 7, -1, -1, -1, 11, 12, + 116, 117, 118, 16, -1, 18, 19, 20, 21, 22, + 23, 24, -1, -1, -1, 131, 29, 30, 31, 32, + 33, 34, 35, -1, -1, 38, -1, -1, -1, -1, + -1, -1, 45, -1, -1, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, -1, 62, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, 85, 86, -1, 88, 89, -1, -1, -1, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, 117, 118, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 130, 131, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, -1, -1, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, -1, -1, -1, -1, -1, -1, 62, 63, + 64, 65, 66, 67, -1, 69, 70, -1, -1, 73, + -1, -1, -1, 77, 78, 79, 80, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, -1, -1, 118, -1, -1, 3, 4, 5, + -1, 7, -1, 127, 128, 11, 12, -1, -1, -1, + 16, -1, 18, 19, 20, 21, 22, 23, 24, -1, + 26, -1, -1, 29, 30, 31, 32, 33, 34, 35, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + -1, -1, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, -1, 62, 63, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 82, -1, -1, 85, + 86, -1, 88, 89, -1, 91, 92, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + 3, 4, 5, -1, 7, -1, -1, -1, 11, 12, + 116, 117, 118, 16, 120, 18, 19, 20, 21, 22, + 23, 24, 128, 26, -1, -1, 29, 30, 31, 32, + 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 45, -1, -1, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, -1, 62, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, 85, 86, -1, 88, 89, -1, 91, 92, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, 3, 4, 5, -1, 7, -1, -1, + -1, 11, 12, 116, 117, 118, 16, 120, 18, 19, + 20, 21, 22, 23, 24, 128, -1, -1, -1, 29, + 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 45, -1, -1, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, + 60, -1, 62, 63, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 82, 83, -1, 85, 86, -1, 88, 89, + -1, 91, 92, 93, 94, 95, 96, 97, 98, -1, + -1, -1, -1, 103, -1, -1, 3, 4, 5, -1, + 7, -1, -1, -1, 11, 12, 116, 117, 118, 16, + -1, 18, 19, 20, 21, 22, 23, 24, 128, -1, + -1, -1, 29, 30, 31, 32, 33, 34, 35, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, + -1, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, -1, 59, 60, -1, 62, 63, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 82, 83, -1, 85, 86, + -1, 88, 89, -1, 91, 92, 93, 94, 95, 96, + 97, 98, -1, -1, -1, -1, 103, -1, -1, 3, + 4, 5, -1, 7, -1, -1, -1, 11, 12, 116, + 117, 118, 16, -1, 18, 19, 20, 21, 22, 23, + 24, 128, -1, -1, -1, 29, 30, 31, 32, 33, + 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 45, -1, -1, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, -1, 62, 63, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, + -1, 85, 86, -1, 88, 89, -1, 91, 92, 93, + 94, 95, 96, 97, 98, -1, -1, -1, -1, -1, + -1, -1, 3, 4, 5, -1, 7, -1, -1, -1, + 11, 12, 116, 117, 118, 16, -1, 18, 19, 20, + 21, 22, 23, 24, 128, -1, -1, -1, 29, 30, + 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 45, -1, -1, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + -1, 62, 63, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 82, -1, -1, 85, 86, -1, 88, 89, -1, + 91, 92, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, 3, 4, 5, -1, 7, + -1, -1, -1, 11, 12, 116, 117, 118, 16, -1, + 18, 19, 20, 21, 22, 23, 24, 128, -1, -1, + -1, 29, 30, 31, 32, 33, 34, 35, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 45, -1, -1, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + -1, 59, 60, -1, 62, 63, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 82, -1, -1, 85, 86, -1, + 88, 89, -1, 91, 92, 93, 94, 95, 96, 97, + 98, -1, -1, -1, -1, -1, -1, -1, 3, 4, + 5, -1, 7, -1, -1, -1, 11, 12, 116, 117, + 118, 16, -1, 18, 19, 20, 21, 22, 23, 24, + 128, -1, -1, -1, 29, 30, 31, 32, 33, 34, + 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, -1, -1, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, -1, 59, 60, -1, 62, 63, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, + 85, 86, -1, 88, 89, -1, 91, 92, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, 117, 118, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 128, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + -1, -1, -1, -1, -1, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, -1, -1, -1, + -1, -1, -1, 62, 63, 64, 65, 66, 67, -1, + 69, 70, -1, -1, 73, -1, -1, -1, 77, 78, + 79, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 91, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, -1, -1, 118, + -1, -1, -1, -1, -1, -1, -1, -1, 127, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, -1, -1, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, + 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, + 54, -1, -1, -1, -1, -1, -1, -1, 62, 63, + 64, 65, 66, 67, -1, 69, 70, -1, -1, 73, + -1, -1, -1, 77, 78, 79, 80, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 91, -1, 93, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, -1, -1, 118, -1, -1, -1, -1, -1, + -1, -1, -1, 127, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + -1, -1, -1, -1, -1, 44, 45, 46, 47, 48, + 49, 50, 51, -1, -1, 54, -1, -1, -1, -1, + -1, -1, -1, 62, 63, 64, 65, 66, 67, -1, + 69, 70, -1, -1, 73, -1, -1, -1, 77, 78, + 79, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 91, -1, 93, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, -1, -1, 118, + -1, -1, -1, -1, -1, -1, -1, -1, 127, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, -1, -1, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, + 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, + 54, -1, -1, -1, -1, -1, -1, -1, 62, 63, + 64, 65, 66, 67, -1, 69, 70, -1, -1, 73, + -1, -1, -1, 77, 78, 79, 80, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, -1, -1, 118, -1, 3, 4, 5, -1, + 7, -1, -1, 127, 11, 12, -1, -1, -1, 16, + -1, 18, 19, 20, 21, 22, 23, 24, -1, -1, + -1, -1, 29, 30, 31, 32, 33, 34, 35, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, + -1, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, -1, 59, 60, -1, 62, 63, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 82, -1, -1, 85, 86, + -1, 88, 89, -1, 91, 92, 93, 94, 95, 96, + 97, 98, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3, 4, 5, 6, 7, 116, + 117, 118, 11, 12, -1, -1, -1, 16, 125, 18, + 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, 35, -1, -1, 38, + -1, -1, -1, -1, -1, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, -1, 62, 63, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 82, -1, -1, 85, 86, -1, 88, + 89, -1, 91, -1, 93, 94, 95, 96, 97, 98, + -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, + -1, 7, -1, -1, -1, 11, 12, 116, 117, 118, + 16, -1, 18, 19, 20, 21, 22, 23, 24, -1, + -1, -1, -1, 29, 30, 31, 32, 33, 34, 35, + -1, -1, 38, -1, -1, -1, -1, -1, -1, 45, + -1, -1, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, -1, 62, 63, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 82, -1, -1, 85, + 86, -1, 88, 89, -1, 91, 92, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + 3, 4, 5, -1, 7, -1, -1, -1, 11, 12, + 116, 117, 118, 16, -1, 18, 19, 20, 21, 22, + 23, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 45, -1, -1, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, -1, 62, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, 85, 86, -1, 88, 89, -1, 91, 92, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, 3, 4, 5, -1, 7, -1, -1, + -1, 11, 12, 116, 117, 118, 16, -1, 18, 19, + 20, 21, 22, 23, 24, -1, -1, -1, -1, 29, + 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 45, -1, -1, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, + 60, -1, 62, 63, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 82, -1, -1, 85, 86, -1, 88, 89, + -1, 91, 92, 93, 94, 95, 96, 97, 98, -1, + -1, -1, -1, -1, -1, -1, 3, 4, 5, -1, + 7, -1, -1, -1, 11, 12, 116, 117, 118, 16, + -1, 18, 19, 20, 21, 22, 23, 24, -1, -1, + -1, -1, 29, 30, 31, 32, 33, 34, 35, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, + -1, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, -1, 59, 60, -1, 62, 63, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 82, -1, -1, 85, 86, + -1, 88, 89, -1, 91, 92, 93, 94, 95, 96, + 97, 98, -1, -1, -1, -1, -1, -1, -1, 3, + 4, 5, -1, 7, -1, -1, -1, 11, 12, 116, + 117, 118, 16, -1, 18, 19, 20, 21, 22, 23, + 24, -1, -1, -1, -1, 29, 30, 31, 32, 33, + 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 45, -1, -1, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, -1, 62, 63, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, + -1, 85, 86, -1, 88, 89, -1, 91, 92, 93, + 94, 95, 96, 97, 98, -1, -1, -1, -1, -1, + -1, -1, 3, 4, 5, -1, 7, -1, -1, -1, + 11, 12, 116, 117, 118, 16, -1, 18, 19, 20, + 21, 22, 23, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 45, -1, -1, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + -1, 62, 63, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 82, -1, -1, 85, 86, -1, 88, 89, -1, + 91, 92, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, 3, 4, 5, -1, 7, + -1, -1, -1, 11, 12, 116, 117, 118, 16, -1, + 18, 19, 20, 21, 22, 23, 24, -1, -1, -1, + -1, 29, 30, 31, 32, 33, 34, 35, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 45, -1, -1, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + -1, 59, 60, -1, 62, 63, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 82, -1, -1, 85, 86, -1, + 88, 89, -1, 91, 92, 93, 94, 95, 96, 97, + 98, -1, -1, -1, -1, -1, -1, -1, 3, 4, + 5, -1, 7, -1, -1, -1, 11, 12, 116, 117, + 118, 16, -1, 18, 19, 20, 21, 22, 23, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, -1, -1, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, -1, 59, 60, -1, 62, 63, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, + 85, 86, -1, 88, 89, -1, 91, 92, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, 3, 4, 5, -1, 7, -1, -1, -1, 11, + 12, 116, 117, 118, 16, -1, 18, 19, 20, 21, + 22, 23, 24, -1, -1, -1, -1, 29, 30, 31, + 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 45, -1, -1, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, -1, 59, 60, -1, + 62, 63, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 82, -1, -1, 85, 86, -1, 88, 89, -1, 91, + 92, 93, 94, 95, 96, 97, 98, -1, -1, -1, + -1, -1, -1, -1, 3, 4, 5, -1, 7, -1, + -1, -1, 11, 12, 116, 117, 118, 16, -1, 18, + 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 45, -1, -1, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, -1, 62, 63, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 82, -1, -1, 85, 86, -1, 88, + 89, -1, 91, 92, 93, 94, 95, 96, 97, 98, + -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, + -1, 7, -1, -1, -1, 11, 12, 116, 117, 118, + 16, -1, 18, 19, 20, 21, 22, 23, 24, -1, + -1, -1, -1, 29, 30, 31, 32, 33, 34, 35, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + -1, -1, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, -1, 62, 63, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 82, -1, -1, 85, + 86, -1, 88, 89, -1, 91, 92, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + 3, 4, 5, -1, 7, -1, -1, -1, 11, 12, + 116, 117, 118, 16, -1, 18, 19, 20, 21, 22, + 23, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 45, -1, -1, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, -1, 62, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, 85, 86, -1, 88, 89, -1, 91, 92, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, 3, 4, 5, -1, 7, -1, -1, + -1, 11, 12, 116, 117, 118, 16, -1, 18, 19, + 20, 21, 22, 23, 24, -1, -1, -1, -1, 29, + 30, 31, 32, 33, 34, 35, -1, -1, 38, -1, + -1, -1, -1, -1, -1, 45, -1, -1, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, + 60, -1, 62, 63, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 82, -1, -1, 85, 86, -1, 88, 89, + -1, -1, -1, 93, 94, 95, 96, 97, 98, -1, + -1, -1, -1, -1, -1, -1, 3, 4, 5, -1, + 7, -1, -1, -1, 11, 12, 116, 117, 118, 16, + -1, 18, 19, 20, 21, 22, 23, 24, -1, -1, + -1, -1, 29, 30, 31, 32, 33, 34, 35, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, + -1, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, -1, 59, 60, -1, 62, 63, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 82, -1, -1, 85, 86, + -1, 88, 89, -1, 91, -1, 93, 94, 95, 96, + 97, 98, -1, -1, -1, -1, -1, -1, -1, 3, + 4, 5, -1, 7, -1, -1, -1, 11, 12, 116, + 117, 118, 16, -1, 18, 19, 20, 21, 22, 23, + 24, -1, -1, -1, -1, 29, 30, 31, 32, 33, + 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 45, -1, -1, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, -1, 62, 63, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, + -1, 85, 86, -1, 88, 89, -1, 91, -1, 93, + 94, 95, 96, 97, 98, -1, -1, -1, -1, -1, + -1, -1, 3, 4, 5, -1, 7, -1, -1, -1, + 11, 12, 116, 117, 118, 16, -1, 18, 19, 20, + 21, 22, 23, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 45, -1, -1, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + -1, 62, 63, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 82, -1, -1, 85, 86, -1, 88, 89, -1, + 91, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, -1, -1, -1, -1, 3, 4, 5, -1, 7, + -1, -1, -1, 11, 12, 116, 117, 118, 16, -1, + 18, 19, 20, 21, 22, 23, 24, -1, -1, -1, + -1, 29, 30, 31, 32, 33, 34, 35, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 45, -1, -1, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + -1, 59, 60, -1, 62, 63, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 82, -1, -1, 85, 86, -1, + 88, 89, -1, 91, -1, 93, 94, 95, 96, 97, + 98, -1, -1, -1, -1, -1, -1, -1, 3, 4, + 5, -1, 7, -1, -1, -1, 11, 12, 116, 117, + 118, 16, -1, 18, 19, 20, 21, 22, 23, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, -1, -1, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, -1, 59, 60, -1, 62, 63, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, + 85, 86, -1, 88, 89, -1, 91, -1, 93, 94, + 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, + -1, 3, 4, 5, -1, 7, -1, -1, -1, 11, + 12, 116, 117, 118, 16, -1, 18, 19, 20, 21, + 22, 23, 24, -1, -1, -1, -1, 29, 30, 31, + 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 45, -1, -1, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, -1, 59, 60, -1, + 62, 63, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 82, -1, -1, 85, 86, -1, 88, 89, -1, 91, + -1, 93, 94, 95, 96, 97, 98, -1, -1, -1, + -1, -1, -1, -1, 3, 4, 5, -1, 7, -1, + -1, -1, 11, 12, 116, 117, 118, 16, -1, 18, + 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 45, -1, -1, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, + 59, 60, -1, 62, 63, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 82, -1, -1, 85, 86, -1, 88, + 89, -1, 91, -1, 93, 94, 95, 96, 97, 98, + -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, + -1, 7, -1, -1, -1, 11, 12, 116, 117, 118, + 16, -1, 18, 19, 20, 21, 22, 23, 24, -1, + -1, -1, -1, 29, 30, 31, 32, 33, 34, 35, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + -1, -1, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, -1, 62, 63, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 82, -1, -1, 85, + 86, -1, 88, 89, -1, -1, -1, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, + 3, 4, 5, -1, 7, -1, -1, -1, 11, 12, + 116, 117, 118, 16, -1, 18, 19, 20, 21, 22, + 23, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 45, -1, -1, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, -1, 62, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, 85, 86, -1, 88, 89, -1, -1, -1, + 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, + -1, -1, -1, 3, 4, 5, -1, 7, -1, -1, + -1, 11, 12, 116, 117, 118, 16, -1, 18, 19, + 20, 21, 22, 23, 24, -1, -1, -1, -1, 29, + 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 45, -1, -1, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, -1, 59, + 60, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 82, -1, -1, 85, 86, -1, 88, 89, + -1, 91, -1, 93, 94, 95, 96, 97, 98, -1, + -1, -1, 3, 4, 5, -1, 7, -1, 108, -1, + 11, 12, -1, -1, -1, 16, 116, 18, 19, 20, + 21, 22, 23, 24, -1, -1, -1, -1, 29, 30, + 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 45, -1, -1, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, -1, 59, 60, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 79, -1, + -1, 82, -1, -1, 85, 86, -1, 88, 89, -1, + -1, -1, 93, 94, 95, 96, 97, 98, -1, -1, + -1, 3, 4, 5, -1, 7, -1, -1, -1, 11, + 12, -1, -1, -1, 16, 116, 18, 19, 20, 21, + 22, 23, 24, -1, -1, -1, -1, 29, 30, 31, + 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 45, -1, -1, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, -1, 59, 60, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 82, -1, -1, 85, 86, -1, 88, 89, -1, 91, + -1, 93, 94, 95, 96, 97, 98, -1, -1, -1, + 3, 4, 5, -1, 7, -1, -1, -1, 11, 12, + -1, -1, -1, 16, 116, 18, 19, 20, 21, 22, + 23, 24, -1, -1, -1, -1, 29, 30, 31, 32, + 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 45, -1, -1, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, -1, 59, 60, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, + -1, -1, 85, 86, -1, 88, 89, -1, 91, -1, + 93, 94, 95, 96, 97, 98, -1, -1, -1, 3, + 4, 5, -1, 7, -1, -1, -1, 11, 12, -1, + -1, -1, 16, 116, 18, 19, 20, 21, 22, 23, + 24, -1, -1, -1, -1, 29, 30, 31, 32, 33, + 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 45, -1, -1, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, -1, 59, 60, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, + -1, 85, 86, -1, 88, 89, -1, -1, -1, 93, + 94, 95, 96, 97, 98, -1, -1, -1, 3, 4, + 5, -1, 7, -1, -1, -1, 11, 12, -1, -1, + -1, 16, 116, 18, 19, 20, 21, 22, 23, 24, + -1, -1, -1, -1, 29, 30, 31, 32, 33, 34, + 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, -1, -1, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, -1, 59, 60, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, + 85, 86, -1, 88, 89, -1, -1, -1, 93, 94, + 95, 96, 97, 98, -1, -1, -1, 3, 4, 5, + -1, 7, -1, -1, -1, 11, 12, -1, -1, -1, + 16, 116, 18, 19, 20, 21, 22, 23, 24, -1, + -1, -1, -1, 29, 30, 31, 32, 33, 34, 35, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + -1, -1, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, -1, 59, 60, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 82, -1, -1, 85, + 86, -1, 88, 89, -1, -1, -1, 93, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, 50, + 51, -1, -1, 54, -1, -1, -1, -1, -1, -1, + 116, 62, 63, 64, 65, 66, 67, -1, 69, 70, + -1, -1, 73, -1, -1, -1, 77, 78, 79, 80, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 91, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 50, 51, 118, -1, 54, + -1, -1, -1, -1, -1, -1, 127, 62, 63, 64, + 65, 66, 67, -1, 69, 70, -1, -1, 73, -1, + -1, -1, 77, 78, 79, 80, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 91, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 50, 51, 118, -1, 54, -1, -1, -1, -1, + -1, -1, 127, 62, 63, 64, 65, 66, 67, -1, + 69, 70, -1, -1, 73, -1, -1, -1, 77, 78, + 79, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 91, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 50, 51, 118, + -1, 54, -1, -1, -1, -1, -1, -1, 127, 62, + 63, 64, 65, 66, 67, -1, 69, 70, -1, -1, + 73, -1, -1, -1, 77, 78, 79, 80, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 50, 51, 118, -1, 54, -1, -1, + -1, -1, -1, -1, 127, 62, 63, 64, 65, 66, + 67, -1, 69, 70, -1, -1, 73, -1, -1, -1, + 77, 78, 79, 80, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 91, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 50, + 51, 118, -1, 54, -1, -1, -1, -1, -1, -1, + 127, 62, 63, 64, 65, 66, 67, -1, 69, 70, + -1, -1, 73, -1, -1, -1, 77, 78, 79, 80, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 91, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 50, 51, 118, -1, 54, + -1, -1, -1, -1, -1, -1, 127, 62, 63, 64, + 65, 66, 67, -1, 69, 70, -1, -1, 73, -1, + -1, -1, 77, 78, 79, 80, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 91, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 50, 51, 118, -1, 54, -1, -1, -1, -1, + -1, -1, 127, 62, 63, 64, 65, 66, 67, -1, + 69, 70, -1, -1, 73, -1, -1, -1, 77, 78, + 79, 80, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 91, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 50, 51, 118, + -1, 54, -1, -1, -1, -1, -1, -1, 127, 62, + 63, 64, 65, 66, 67, -1, 69, 70, -1, -1, + 73, -1, -1, -1, 77, 78, 79, 80, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 50, 51, 118, -1, 54, -1, -1, + -1, -1, -1, -1, 127, 62, 63, 64, 65, 66, + 67, -1, 69, 70, -1, -1, 73, -1, -1, -1, + 77, 78, 79, 80, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 91, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 50, + 51, 118, -1, 54, -1, -1, -1, -1, -1, -1, + 127, 62, 63, 64, 65, 66, 67, -1, 69, 70, + -1, -1, 73, -1, -1, -1, 77, 78, 79, 80, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 91, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, -1, -1, 118, -1, -1, + -1, -1, -1, -1, -1, -1, 127, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + -1, -1, 79, 80, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 104, -1, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, -1, 130, 79, 80, -1, -1, -1, 84, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, -1, -1, 79, 80, -1, -1, 104, + -1, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 104, 126, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 126, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, -1, -1, 79, 80, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, -1, -1, 79, 80, -1, -1, -1, + -1, -1, -1, 104, -1, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, -1, -1, -1, -1, -1, + -1, -1, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 64, 65, 66, 67, 68, 69, 70, -1, + -1, 73, 74, -1, -1, -1, -1, 79, 80, 64, + 65, 66, 67, 68, 69, 70, -1, -1, 73, 74, + -1, -1, -1, -1, 79, 80, -1, -1, -1, -1, + -1, -1, -1, -1, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, -1, -1, -1, -1, -1, -1, + -1, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint16 yystos[] = +{ + 0, 133, 134, 0, 1, 3, 4, 5, 6, 7, + 11, 12, 16, 18, 19, 20, 21, 22, 23, 24, + 29, 30, 31, 32, 33, 34, 35, 38, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 59, 60, 62, 63, 82, 85, 86, 88, + 89, 91, 93, 94, 95, 96, 97, 98, 116, 117, + 118, 136, 137, 138, 141, 143, 144, 148, 149, 151, + 152, 153, 154, 155, 165, 182, 199, 209, 210, 223, + 224, 225, 226, 227, 228, 229, 232, 240, 242, 243, + 244, 245, 246, 247, 266, 275, 138, 21, 22, 29, + 30, 31, 45, 50, 54, 79, 82, 85, 116, 156, + 157, 182, 199, 244, 247, 266, 157, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 44, 45, 46, 47, 48, 49, 50, 51, 54, + 62, 63, 64, 65, 66, 67, 69, 70, 73, 77, + 78, 79, 80, 91, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 118, 127, 128, 158, 163, 164, + 245, 261, 32, 33, 34, 35, 48, 49, 50, 54, + 158, 159, 160, 161, 240, 242, 183, 82, 141, 142, + 155, 199, 244, 246, 247, 142, 130, 131, 142, 270, + 273, 274, 186, 188, 82, 149, 155, 199, 204, 244, + 247, 91, 92, 117, 148, 165, 167, 171, 178, 180, + 264, 265, 171, 171, 128, 173, 174, 128, 169, 173, + 141, 52, 160, 130, 271, 140, 120, 165, 199, 165, + 54, 85, 136, 150, 151, 141, 91, 148, 168, 180, + 264, 275, 180, 263, 264, 275, 82, 154, 199, 244, + 247, 52, 53, 55, 158, 235, 241, 234, 235, 235, + 129, 230, 129, 233, 56, 57, 143, 165, 165, 270, + 274, 39, 40, 41, 42, 43, 36, 37, 28, 206, + 103, 126, 85, 91, 152, 103, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 79, + 80, 104, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 81, 122, 124, 81, 124, 26, 120, 211, + 226, 83, 83, 169, 173, 211, 271, 141, 50, 54, + 156, 56, 57, 1, 107, 248, 273, 81, 122, 124, + 195, 262, 196, 81, 124, 269, 126, 135, 136, 54, + 13, 105, 200, 273, 103, 81, 122, 124, 83, 83, + 200, 270, 15, 17, 216, 131, 142, 142, 54, 81, + 122, 124, 25, 167, 167, 84, 126, 179, 275, 126, + 179, 125, 171, 86, 171, 175, 148, 171, 180, 209, + 275, 52, 59, 60, 139, 128, 166, 120, 136, 81, + 124, 83, 150, 125, 125, 184, 165, 271, 123, 126, + 130, 272, 126, 272, 126, 272, 121, 272, 54, 81, + 122, 124, 58, 99, 100, 101, 236, 101, 236, 101, + 61, 101, 101, 231, 236, 101, 58, 101, 64, 64, + 138, 142, 142, 142, 142, 138, 141, 141, 207, 91, + 143, 167, 180, 181, 150, 154, 126, 143, 165, 167, + 181, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 165, 50, 51, 54, + 163, 267, 268, 168, 50, 51, 54, 163, 267, 50, + 54, 267, 267, 214, 212, 143, 165, 143, 165, 90, + 145, 193, 273, 249, 192, 50, 54, 156, 267, 168, + 267, 135, 141, 50, 52, 53, 54, 55, 91, 92, + 110, 113, 128, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 197, 162, 10, 8, 219, 275, 136, + 13, 165, 50, 54, 168, 50, 54, 136, 216, 136, + 91, 180, 217, 10, 27, 105, 201, 273, 201, 50, + 54, 168, 50, 54, 190, 126, 179, 167, 91, 167, + 178, 264, 91, 167, 265, 125, 91, 165, 167, 172, + 176, 178, 264, 271, 126, 81, 124, 271, 125, 160, + 185, 165, 136, 121, 165, 125, 271, 271, 91, 167, + 50, 54, 168, 50, 54, 238, 237, 129, 236, 129, + 165, 165, 72, 108, 205, 275, 167, 126, 125, 43, + 105, 83, 83, 169, 173, 123, 83, 83, 169, 170, + 173, 275, 170, 173, 170, 173, 205, 205, 146, 273, + 142, 135, 123, 10, 271, 103, 251, 135, 273, 126, + 260, 275, 126, 260, 50, 126, 260, 50, 158, 160, + 167, 181, 220, 275, 15, 203, 275, 14, 202, 203, + 83, 123, 83, 83, 203, 10, 10, 167, 126, 200, + 187, 189, 123, 142, 167, 126, 179, 167, 167, 126, + 177, 125, 126, 179, 125, 148, 209, 267, 267, 125, + 141, 121, 125, 165, 123, 136, 52, 53, 55, 239, + 247, 108, 204, 208, 91, 167, 165, 165, 143, 165, + 165, 145, 83, 143, 165, 143, 165, 145, 215, 213, + 205, 194, 273, 10, 125, 167, 271, 10, 252, 255, + 257, 259, 50, 254, 257, 198, 84, 221, 275, 136, + 9, 222, 275, 142, 10, 83, 10, 91, 136, 136, + 136, 201, 179, 91, 179, 179, 91, 178, 180, 264, + 125, 91, 271, 125, 271, 121, 108, 136, 167, 143, + 165, 136, 136, 147, 135, 125, 126, 260, 260, 260, + 250, 82, 155, 199, 244, 247, 200, 136, 200, 167, + 203, 216, 218, 10, 10, 191, 165, 167, 126, 179, + 126, 179, 167, 125, 10, 10, 121, 136, 10, 257, + 135, 54, 81, 122, 124, 136, 136, 136, 179, 179, + 91, 264, 91, 179, 121, 260, 10, 50, 54, 168, + 50, 54, 219, 202, 10, 167, 126, 179, 167, 123, + 179, 91, 179, 167, 179 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +#else +static void +yy_stack_print (bottom, top) + yytype_int16 *bottom; + yytype_int16 *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + fprintf (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + fprintf (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss = yyssa; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + look-ahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to look-ahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 350 "parse.y" + { + lex_state = EXPR_BEG; + top_local_init(); + if (ruby_class == rb_cObject) class_nest = 0; + else class_nest = 1; + } + break; + + case 3: +#line 357 "parse.y" + { + if ((yyvsp[(2) - (2)].node) && !compile_for_eval) { + /* last expression should not be void */ + if (nd_type((yyvsp[(2) - (2)].node)) != NODE_BLOCK) void_expr((yyvsp[(2) - (2)].node)); + else { + NODE *node = (yyvsp[(2) - (2)].node); + while (node->nd_next) { + node = node->nd_next; + } + void_expr(node->nd_head); + } + } + ruby_eval_tree = block_append(ruby_eval_tree, (yyvsp[(2) - (2)].node)); + top_local_setup(); + class_nest = 0; + } + break; + + case 4: +#line 379 "parse.y" + { + (yyval.node) = (yyvsp[(1) - (4)].node); + if ((yyvsp[(2) - (4)].node)) { + (yyval.node) = NEW_RESCUE((yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].node), (yyvsp[(3) - (4)].node)); + } + else if ((yyvsp[(3) - (4)].node)) { + rb_warn("else without rescue is useless"); + (yyval.node) = block_append((yyval.node), (yyvsp[(3) - (4)].node)); + } + if ((yyvsp[(4) - (4)].node)) { + (yyval.node) = NEW_ENSURE((yyval.node), (yyvsp[(4) - (4)].node)); + } + fixpos((yyval.node), (yyvsp[(1) - (4)].node)); + } + break; + + case 5: +#line 396 "parse.y" + { + void_stmts((yyvsp[(1) - (2)].node)); + fixup_nodes(&deferred_nodes); + (yyval.node) = (yyvsp[(1) - (2)].node); + } + break; + + case 7: +#line 405 "parse.y" + { + (yyval.node) = newline_node((yyvsp[(1) - (1)].node)); + } + break; + + case 8: +#line 409 "parse.y" + { + (yyval.node) = block_append((yyvsp[(1) - (3)].node), newline_node((yyvsp[(3) - (3)].node))); + } + break; + + case 9: +#line 413 "parse.y" + { + (yyval.node) = remove_begin((yyvsp[(2) - (2)].node)); + } + break; + + case 10: +#line 418 "parse.y" + {lex_state = EXPR_FNAME;} + break; + + case 11: +#line 419 "parse.y" + { + (yyval.node) = NEW_ALIAS((yyvsp[(2) - (4)].node), (yyvsp[(4) - (4)].node)); + } + break; + + case 12: +#line 423 "parse.y" + { + (yyval.node) = NEW_VALIAS((yyvsp[(2) - (3)].id), (yyvsp[(3) - (3)].id)); + } + break; + + case 13: +#line 427 "parse.y" + { + char buf[3]; + + sprintf(buf, "$%c", (char)(yyvsp[(3) - (3)].node)->nd_nth); + (yyval.node) = NEW_VALIAS((yyvsp[(2) - (3)].id), rb_intern(buf)); + } + break; + + case 14: +#line 434 "parse.y" + { + yyerror("can't make alias for the number variables"); + (yyval.node) = 0; + } + break; + + case 15: +#line 439 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (2)].node); + } + break; + + case 16: +#line 443 "parse.y" + { + (yyval.node) = NEW_IF(cond((yyvsp[(3) - (3)].node)), remove_begin((yyvsp[(1) - (3)].node)), 0); + fixpos((yyval.node), (yyvsp[(3) - (3)].node)); + if (cond_negative(&(yyval.node)->nd_cond)) { + (yyval.node)->nd_else = (yyval.node)->nd_body; + (yyval.node)->nd_body = 0; + } + } + break; + + case 17: +#line 452 "parse.y" + { + (yyval.node) = NEW_UNLESS(cond((yyvsp[(3) - (3)].node)), remove_begin((yyvsp[(1) - (3)].node)), 0); + fixpos((yyval.node), (yyvsp[(3) - (3)].node)); + if (cond_negative(&(yyval.node)->nd_cond)) { + (yyval.node)->nd_body = (yyval.node)->nd_else; + (yyval.node)->nd_else = 0; + } + } + break; + + case 18: +#line 461 "parse.y" + { + if ((yyvsp[(1) - (3)].node) && nd_type((yyvsp[(1) - (3)].node)) == NODE_BEGIN) { + (yyval.node) = NEW_WHILE(cond((yyvsp[(3) - (3)].node)), (yyvsp[(1) - (3)].node)->nd_body, 0); + } + else { + (yyval.node) = NEW_WHILE(cond((yyvsp[(3) - (3)].node)), (yyvsp[(1) - (3)].node), 1); + } + if (cond_negative(&(yyval.node)->nd_cond)) { + nd_set_type((yyval.node), NODE_UNTIL); + } + } + break; + + case 19: +#line 473 "parse.y" + { + if ((yyvsp[(1) - (3)].node) && nd_type((yyvsp[(1) - (3)].node)) == NODE_BEGIN) { + (yyval.node) = NEW_UNTIL(cond((yyvsp[(3) - (3)].node)), (yyvsp[(1) - (3)].node)->nd_body, 0); + } + else { + (yyval.node) = NEW_UNTIL(cond((yyvsp[(3) - (3)].node)), (yyvsp[(1) - (3)].node), 1); + } + if (cond_negative(&(yyval.node)->nd_cond)) { + nd_set_type((yyval.node), NODE_WHILE); + } + } + break; + + case 20: +#line 485 "parse.y" + { + NODE *resq = NEW_RESBODY(0, remove_begin((yyvsp[(3) - (3)].node)), 0); + (yyval.node) = NEW_RESCUE(remove_begin((yyvsp[(1) - (3)].node)), resq, 0); + } + break; + + case 21: +#line 490 "parse.y" + { + if (in_def || in_single) { + yyerror("BEGIN in method"); + } + local_push(0); + } + break; + + case 22: +#line 497 "parse.y" + { + ruby_eval_tree_begin = block_append(ruby_eval_tree_begin, + NEW_PREEXE((yyvsp[(4) - (5)].node))); + local_pop(); + (yyval.node) = 0; + } + break; + + case 23: +#line 504 "parse.y" + { + if (in_def || in_single) { + rb_warn("END in method; use at_exit"); + } + + (yyval.node) = NEW_ITER(0, NEW_POSTEXE(), (yyvsp[(3) - (4)].node)); + } + break; + + case 24: +#line 512 "parse.y" + { + (yyval.node) = node_assign((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 25: +#line 516 "parse.y" + { + value_expr((yyvsp[(3) - (3)].node)); + (yyvsp[(1) - (3)].node)->nd_value = ((yyvsp[(1) - (3)].node)->nd_head) ? NEW_TO_ARY((yyvsp[(3) - (3)].node)) : NEW_ARRAY((yyvsp[(3) - (3)].node)); + (yyval.node) = (yyvsp[(1) - (3)].node); + } + break; + + case 26: +#line 522 "parse.y" + { + value_expr((yyvsp[(3) - (3)].node)); + if ((yyvsp[(1) - (3)].node)) { + ID vid = (yyvsp[(1) - (3)].node)->nd_vid; + if ((yyvsp[(2) - (3)].id) == tOROP) { + (yyvsp[(1) - (3)].node)->nd_value = (yyvsp[(3) - (3)].node); + (yyval.node) = NEW_OP_ASGN_OR(gettable(vid), (yyvsp[(1) - (3)].node)); + if (is_asgn_or_id(vid)) { + (yyval.node)->nd_aid = vid; + } + } + else if ((yyvsp[(2) - (3)].id) == tANDOP) { + (yyvsp[(1) - (3)].node)->nd_value = (yyvsp[(3) - (3)].node); + (yyval.node) = NEW_OP_ASGN_AND(gettable(vid), (yyvsp[(1) - (3)].node)); + } + else { + (yyval.node) = (yyvsp[(1) - (3)].node); + (yyval.node)->nd_value = call_op(gettable(vid),(yyvsp[(2) - (3)].id),1,(yyvsp[(3) - (3)].node)); + } + } + else { + (yyval.node) = 0; + } + } + break; + + case 27: +#line 547 "parse.y" + { + NODE *args; + + value_expr((yyvsp[(6) - (6)].node)); + if (!(yyvsp[(3) - (6)].node)) (yyvsp[(3) - (6)].node) = NEW_ZARRAY(); + args = arg_concat((yyvsp[(6) - (6)].node), (yyvsp[(3) - (6)].node)); + if ((yyvsp[(5) - (6)].id) == tOROP) { + (yyvsp[(5) - (6)].id) = 0; + } + else if ((yyvsp[(5) - (6)].id) == tANDOP) { + (yyvsp[(5) - (6)].id) = 1; + } + (yyval.node) = NEW_OP_ASGN1((yyvsp[(1) - (6)].node), (yyvsp[(5) - (6)].id), args); + fixpos((yyval.node), (yyvsp[(1) - (6)].node)); + } + break; + + case 28: +#line 563 "parse.y" + { + value_expr((yyvsp[(5) - (5)].node)); + if ((yyvsp[(4) - (5)].id) == tOROP) { + (yyvsp[(4) - (5)].id) = 0; + } + else if ((yyvsp[(4) - (5)].id) == tANDOP) { + (yyvsp[(4) - (5)].id) = 1; + } + (yyval.node) = NEW_OP_ASGN2((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].node)); + fixpos((yyval.node), (yyvsp[(1) - (5)].node)); + } + break; + + case 29: +#line 575 "parse.y" + { + value_expr((yyvsp[(5) - (5)].node)); + if ((yyvsp[(4) - (5)].id) == tOROP) { + (yyvsp[(4) - (5)].id) = 0; + } + else if ((yyvsp[(4) - (5)].id) == tANDOP) { + (yyvsp[(4) - (5)].id) = 1; + } + (yyval.node) = NEW_OP_ASGN2((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].node)); + fixpos((yyval.node), (yyvsp[(1) - (5)].node)); + } + break; + + case 30: +#line 587 "parse.y" + { + value_expr((yyvsp[(5) - (5)].node)); + if ((yyvsp[(4) - (5)].id) == tOROP) { + (yyvsp[(4) - (5)].id) = 0; + } + else if ((yyvsp[(4) - (5)].id) == tANDOP) { + (yyvsp[(4) - (5)].id) = 1; + } + (yyval.node) = NEW_OP_ASGN2((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].node)); + fixpos((yyval.node), (yyvsp[(1) - (5)].node)); + } + break; + + case 31: +#line 599 "parse.y" + { + rb_backref_error((yyvsp[(1) - (3)].node)); + (yyval.node) = 0; + } + break; + + case 32: +#line 604 "parse.y" + { + (yyval.node) = node_assign((yyvsp[(1) - (3)].node), NEW_SVALUE((yyvsp[(3) - (3)].node))); + } + break; + + case 33: +#line 608 "parse.y" + { + (yyvsp[(1) - (3)].node)->nd_value = ((yyvsp[(1) - (3)].node)->nd_head) ? NEW_TO_ARY((yyvsp[(3) - (3)].node)) : NEW_ARRAY((yyvsp[(3) - (3)].node)); + (yyval.node) = (yyvsp[(1) - (3)].node); + } + break; + + case 34: +#line 613 "parse.y" + { + (yyvsp[(1) - (3)].node)->nd_value = (yyvsp[(3) - (3)].node); + (yyval.node) = (yyvsp[(1) - (3)].node); + } + break; + + case 37: +#line 622 "parse.y" + { + (yyval.node) = logop(NODE_AND, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 38: +#line 626 "parse.y" + { + (yyval.node) = logop(NODE_OR, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 39: +#line 630 "parse.y" + { + (yyval.node) = NEW_NOT(cond((yyvsp[(2) - (2)].node))); + } + break; + + case 40: +#line 634 "parse.y" + { + (yyval.node) = NEW_NOT(cond((yyvsp[(2) - (2)].node))); + } + break; + + case 42: +#line 641 "parse.y" + { + value_expr((yyval.node)); + (yyval.node) = (yyvsp[(1) - (1)].node); + } + break; + + case 45: +#line 650 "parse.y" + { + (yyval.node) = NEW_RETURN(ret_args((yyvsp[(2) - (2)].node))); + } + break; + + case 46: +#line 654 "parse.y" + { + (yyval.node) = NEW_BREAK(ret_args((yyvsp[(2) - (2)].node))); + } + break; + + case 47: +#line 658 "parse.y" + { + (yyval.node) = NEW_NEXT(ret_args((yyvsp[(2) - (2)].node))); + } + break; + + case 49: +#line 665 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].node)); + } + break; + + case 50: +#line 669 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].node)); + } + break; + + case 51: +#line 675 "parse.y" + { + (yyval.vars) = dyna_push(); + (yyvsp[(1) - (1)].num) = ruby_sourceline; + } + break; + + case 52: +#line 679 "parse.y" + {(yyval.vars) = ruby_dyna_vars;} + break; + + case 53: +#line 682 "parse.y" + { + (yyval.node) = NEW_ITER((yyvsp[(3) - (6)].node), 0, dyna_init((yyvsp[(5) - (6)].node), (yyvsp[(4) - (6)].vars))); + nd_set_line((yyval.node), (yyvsp[(1) - (6)].num)); + dyna_pop((yyvsp[(2) - (6)].vars)); + } + break; + + case 54: +#line 690 "parse.y" + { + (yyval.node) = new_fcall((yyvsp[(1) - (2)].id), (yyvsp[(2) - (2)].node)); + fixpos((yyval.node), (yyvsp[(2) - (2)].node)); + } + break; + + case 55: +#line 695 "parse.y" + { + (yyval.node) = new_fcall((yyvsp[(1) - (3)].id), (yyvsp[(2) - (3)].node)); + if ((yyvsp[(3) - (3)].node)) { + if (nd_type((yyval.node)) == NODE_BLOCK_PASS) { + rb_compile_error("both block arg and actual block given"); + } + (yyvsp[(3) - (3)].node)->nd_iter = (yyval.node); + (yyval.node) = (yyvsp[(3) - (3)].node); + } + fixpos((yyval.node), (yyvsp[(2) - (3)].node)); + } + break; + + case 56: +#line 707 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].node)); + fixpos((yyval.node), (yyvsp[(1) - (4)].node)); + } + break; + + case 57: +#line 712 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].node)); + if ((yyvsp[(5) - (5)].node)) { + if (nd_type((yyval.node)) == NODE_BLOCK_PASS) { + rb_compile_error("both block arg and actual block given"); + } + (yyvsp[(5) - (5)].node)->nd_iter = (yyval.node); + (yyval.node) = (yyvsp[(5) - (5)].node); + } + fixpos((yyval.node), (yyvsp[(1) - (5)].node)); + } + break; + + case 58: +#line 724 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].node)); + fixpos((yyval.node), (yyvsp[(1) - (4)].node)); + } + break; + + case 59: +#line 729 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].node)); + if ((yyvsp[(5) - (5)].node)) { + if (nd_type((yyval.node)) == NODE_BLOCK_PASS) { + rb_compile_error("both block arg and actual block given"); + } + (yyvsp[(5) - (5)].node)->nd_iter = (yyval.node); + (yyval.node) = (yyvsp[(5) - (5)].node); + } + fixpos((yyval.node), (yyvsp[(1) - (5)].node)); + } + break; + + case 60: +#line 741 "parse.y" + { + (yyval.node) = new_super((yyvsp[(2) - (2)].node)); + fixpos((yyval.node), (yyvsp[(2) - (2)].node)); + } + break; + + case 61: +#line 746 "parse.y" + { + (yyval.node) = new_yield((yyvsp[(2) - (2)].node)); + fixpos((yyval.node), (yyvsp[(2) - (2)].node)); + } + break; + + case 63: +#line 754 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (3)].node); + } + break; + + case 65: +#line 761 "parse.y" + { + (yyval.node) = NEW_MASGN(NEW_LIST((yyvsp[(2) - (3)].node)), 0); + } + break; + + case 66: +#line 767 "parse.y" + { + (yyval.node) = NEW_MASGN((yyvsp[(1) - (1)].node), 0); + } + break; + + case 67: +#line 771 "parse.y" + { + (yyval.node) = NEW_MASGN(list_append((yyvsp[(1) - (2)].node),(yyvsp[(2) - (2)].node)), 0); + } + break; + + case 68: +#line 775 "parse.y" + { + (yyval.node) = NEW_MASGN((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 69: +#line 779 "parse.y" + { + (yyval.node) = NEW_MASGN((yyvsp[(1) - (2)].node), -1); + } + break; + + case 70: +#line 783 "parse.y" + { + (yyval.node) = NEW_MASGN(0, (yyvsp[(2) - (2)].node)); + } + break; + + case 71: +#line 787 "parse.y" + { + (yyval.node) = NEW_MASGN(0, -1); + } + break; + + case 73: +#line 794 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (3)].node); + } + break; + + case 74: +#line 800 "parse.y" + { + (yyval.node) = NEW_LIST((yyvsp[(1) - (2)].node)); + } + break; + + case 75: +#line 804 "parse.y" + { + (yyval.node) = list_append((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].node)); + } + break; + + case 76: +#line 810 "parse.y" + { + (yyval.node) = assignable((yyvsp[(1) - (1)].id), 0); + } + break; + + case 77: +#line 814 "parse.y" + { + (yyval.node) = aryset((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].node)); + } + break; + + case 78: +#line 818 "parse.y" + { + (yyval.node) = attrset((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id)); + } + break; + + case 79: +#line 822 "parse.y" + { + (yyval.node) = attrset((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id)); + } + break; + + case 80: +#line 826 "parse.y" + { + (yyval.node) = attrset((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id)); + } + break; + + case 81: +#line 830 "parse.y" + { + if (in_def || in_single) + yyerror("dynamic constant assignment"); + (yyval.node) = NEW_CDECL(0, 0, NEW_COLON2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id))); + } + break; + + case 82: +#line 836 "parse.y" + { + if (in_def || in_single) + yyerror("dynamic constant assignment"); + (yyval.node) = NEW_CDECL(0, 0, NEW_COLON3((yyvsp[(2) - (2)].id))); + } + break; + + case 83: +#line 842 "parse.y" + { + rb_backref_error((yyvsp[(1) - (1)].node)); + (yyval.node) = 0; + } + break; + + case 84: +#line 849 "parse.y" + { + (yyval.node) = assignable((yyvsp[(1) - (1)].id), 0); + } + break; + + case 85: +#line 853 "parse.y" + { + (yyval.node) = aryset((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].node)); + } + break; + + case 86: +#line 857 "parse.y" + { + (yyval.node) = attrset((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id)); + } + break; + + case 87: +#line 861 "parse.y" + { + (yyval.node) = attrset((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id)); + } + break; + + case 88: +#line 865 "parse.y" + { + (yyval.node) = attrset((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id)); + } + break; + + case 89: +#line 869 "parse.y" + { + if (in_def || in_single) + yyerror("dynamic constant assignment"); + (yyval.node) = NEW_CDECL(0, 0, NEW_COLON2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id))); + } + break; + + case 90: +#line 875 "parse.y" + { + if (in_def || in_single) + yyerror("dynamic constant assignment"); + (yyval.node) = NEW_CDECL(0, 0, NEW_COLON3((yyvsp[(2) - (2)].id))); + } + break; + + case 91: +#line 881 "parse.y" + { + rb_backref_error((yyvsp[(1) - (1)].node)); + (yyval.node) = 0; + } + break; + + case 92: +#line 888 "parse.y" + { + yyerror("class/module name must be CONSTANT"); + } + break; + + case 94: +#line 895 "parse.y" + { + (yyval.node) = NEW_COLON3((yyvsp[(2) - (2)].id)); + } + break; + + case 95: +#line 899 "parse.y" + { + (yyval.node) = NEW_COLON2(0, (yyval.node)); + } + break; + + case 96: +#line 903 "parse.y" + { + (yyval.node) = NEW_COLON2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id)); + } + break; + + case 100: +#line 912 "parse.y" + { + lex_state = EXPR_END; + (yyval.id) = (yyvsp[(1) - (1)].id); + } + break; + + case 101: +#line 917 "parse.y" + { + lex_state = EXPR_END; + (yyval.id) = (yyvsp[(1) - (1)].id); + } + break; + + case 104: +#line 928 "parse.y" + { + (yyval.node) = NEW_LIT(ID2SYM((yyvsp[(1) - (1)].id))); + } + break; + + case 106: +#line 935 "parse.y" + { + (yyval.node) = NEW_UNDEF((yyvsp[(1) - (1)].node)); + } + break; + + case 107: +#line 938 "parse.y" + {lex_state = EXPR_FNAME;} + break; + + case 108: +#line 939 "parse.y" + { + (yyval.node) = block_append((yyvsp[(1) - (4)].node), NEW_UNDEF((yyvsp[(4) - (4)].node))); + } + break; + + case 109: +#line 944 "parse.y" + { (yyval.id) = '|'; } + break; + + case 110: +#line 945 "parse.y" + { (yyval.id) = '^'; } + break; + + case 111: +#line 946 "parse.y" + { (yyval.id) = '&'; } + break; + + case 112: +#line 947 "parse.y" + { (yyval.id) = tCMP; } + break; + + case 113: +#line 948 "parse.y" + { (yyval.id) = tEQ; } + break; + + case 114: +#line 949 "parse.y" + { (yyval.id) = tEQQ; } + break; + + case 115: +#line 950 "parse.y" + { (yyval.id) = tMATCH; } + break; + + case 116: +#line 951 "parse.y" + { (yyval.id) = '>'; } + break; + + case 117: +#line 952 "parse.y" + { (yyval.id) = tGEQ; } + break; + + case 118: +#line 953 "parse.y" + { (yyval.id) = '<'; } + break; + + case 119: +#line 954 "parse.y" + { (yyval.id) = tLEQ; } + break; + + case 120: +#line 955 "parse.y" + { (yyval.id) = tLSHFT; } + break; + + case 121: +#line 956 "parse.y" + { (yyval.id) = tRSHFT; } + break; + + case 122: +#line 957 "parse.y" + { (yyval.id) = '+'; } + break; + + case 123: +#line 958 "parse.y" + { (yyval.id) = '-'; } + break; + + case 124: +#line 959 "parse.y" + { (yyval.id) = '*'; } + break; + + case 125: +#line 960 "parse.y" + { (yyval.id) = '*'; } + break; + + case 126: +#line 961 "parse.y" + { (yyval.id) = '/'; } + break; + + case 127: +#line 962 "parse.y" + { (yyval.id) = '%'; } + break; + + case 128: +#line 963 "parse.y" + { (yyval.id) = tPOW; } + break; + + case 129: +#line 964 "parse.y" + { (yyval.id) = '~'; } + break; + + case 130: +#line 965 "parse.y" + { (yyval.id) = tUPLUS; } + break; + + case 131: +#line 966 "parse.y" + { (yyval.id) = tUMINUS; } + break; + + case 132: +#line 967 "parse.y" + { (yyval.id) = tAREF; } + break; + + case 133: +#line 968 "parse.y" + { (yyval.id) = tASET; } + break; + + case 134: +#line 969 "parse.y" + { (yyval.id) = '`'; } + break; + + case 175: +#line 982 "parse.y" + { + (yyval.node) = node_assign((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 176: +#line 986 "parse.y" + { + (yyval.node) = node_assign((yyvsp[(1) - (5)].node), NEW_RESCUE((yyvsp[(3) - (5)].node), NEW_RESBODY(0,(yyvsp[(5) - (5)].node),0), 0)); + } + break; + + case 177: +#line 990 "parse.y" + { + value_expr((yyvsp[(3) - (3)].node)); + if ((yyvsp[(1) - (3)].node)) { + ID vid = (yyvsp[(1) - (3)].node)->nd_vid; + if ((yyvsp[(2) - (3)].id) == tOROP) { + (yyvsp[(1) - (3)].node)->nd_value = (yyvsp[(3) - (3)].node); + (yyval.node) = NEW_OP_ASGN_OR(gettable(vid), (yyvsp[(1) - (3)].node)); + if (is_asgn_or_id(vid)) { + (yyval.node)->nd_aid = vid; + } + } + else if ((yyvsp[(2) - (3)].id) == tANDOP) { + (yyvsp[(1) - (3)].node)->nd_value = (yyvsp[(3) - (3)].node); + (yyval.node) = NEW_OP_ASGN_AND(gettable(vid), (yyvsp[(1) - (3)].node)); + } + else { + (yyval.node) = (yyvsp[(1) - (3)].node); + (yyval.node)->nd_value = call_op(gettable(vid),(yyvsp[(2) - (3)].id),1,(yyvsp[(3) - (3)].node)); + } + } + else { + (yyval.node) = 0; + } + } + break; + + case 178: +#line 1015 "parse.y" + { + NODE *args; + + value_expr((yyvsp[(6) - (6)].node)); + if (!(yyvsp[(3) - (6)].node)) (yyvsp[(3) - (6)].node) = NEW_ZARRAY(); + args = arg_concat((yyvsp[(6) - (6)].node), (yyvsp[(3) - (6)].node)); + if ((yyvsp[(5) - (6)].id) == tOROP) { + (yyvsp[(5) - (6)].id) = 0; + } + else if ((yyvsp[(5) - (6)].id) == tANDOP) { + (yyvsp[(5) - (6)].id) = 1; + } + (yyval.node) = NEW_OP_ASGN1((yyvsp[(1) - (6)].node), (yyvsp[(5) - (6)].id), args); + fixpos((yyval.node), (yyvsp[(1) - (6)].node)); + } + break; + + case 179: +#line 1031 "parse.y" + { + value_expr((yyvsp[(5) - (5)].node)); + if ((yyvsp[(4) - (5)].id) == tOROP) { + (yyvsp[(4) - (5)].id) = 0; + } + else if ((yyvsp[(4) - (5)].id) == tANDOP) { + (yyvsp[(4) - (5)].id) = 1; + } + (yyval.node) = NEW_OP_ASGN2((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].node)); + fixpos((yyval.node), (yyvsp[(1) - (5)].node)); + } + break; + + case 180: +#line 1043 "parse.y" + { + value_expr((yyvsp[(5) - (5)].node)); + if ((yyvsp[(4) - (5)].id) == tOROP) { + (yyvsp[(4) - (5)].id) = 0; + } + else if ((yyvsp[(4) - (5)].id) == tANDOP) { + (yyvsp[(4) - (5)].id) = 1; + } + (yyval.node) = NEW_OP_ASGN2((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].node)); + fixpos((yyval.node), (yyvsp[(1) - (5)].node)); + } + break; + + case 181: +#line 1055 "parse.y" + { + value_expr((yyvsp[(5) - (5)].node)); + if ((yyvsp[(4) - (5)].id) == tOROP) { + (yyvsp[(4) - (5)].id) = 0; + } + else if ((yyvsp[(4) - (5)].id) == tANDOP) { + (yyvsp[(4) - (5)].id) = 1; + } + (yyval.node) = NEW_OP_ASGN2((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].node)); + fixpos((yyval.node), (yyvsp[(1) - (5)].node)); + } + break; + + case 182: +#line 1067 "parse.y" + { + yyerror("constant re-assignment"); + (yyval.node) = 0; + } + break; + + case 183: +#line 1072 "parse.y" + { + yyerror("constant re-assignment"); + (yyval.node) = 0; + } + break; + + case 184: +#line 1077 "parse.y" + { + rb_backref_error((yyvsp[(1) - (3)].node)); + (yyval.node) = 0; + } + break; + + case 185: +#line 1082 "parse.y" + { + value_expr((yyvsp[(1) - (3)].node)); + value_expr((yyvsp[(3) - (3)].node)); + (yyval.node) = NEW_DOT2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + if (nd_type((yyvsp[(1) - (3)].node)) == NODE_LIT && FIXNUM_P((yyvsp[(1) - (3)].node)->nd_lit) && + nd_type((yyvsp[(3) - (3)].node)) == NODE_LIT && FIXNUM_P((yyvsp[(3) - (3)].node)->nd_lit)) { + deferred_nodes = list_append(deferred_nodes, (yyval.node)); + } + } + break; + + case 186: +#line 1092 "parse.y" + { + value_expr((yyvsp[(1) - (3)].node)); + value_expr((yyvsp[(3) - (3)].node)); + (yyval.node) = NEW_DOT3((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + if (nd_type((yyvsp[(1) - (3)].node)) == NODE_LIT && FIXNUM_P((yyvsp[(1) - (3)].node)->nd_lit) && + nd_type((yyvsp[(3) - (3)].node)) == NODE_LIT && FIXNUM_P((yyvsp[(3) - (3)].node)->nd_lit)) { + deferred_nodes = list_append(deferred_nodes, (yyval.node)); + } + } + break; + + case 187: +#line 1102 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '+', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 188: +#line 1106 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '-', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 189: +#line 1110 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '*', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 190: +#line 1114 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '/', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 191: +#line 1118 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '%', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 192: +#line 1122 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), tPOW, 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 193: +#line 1126 "parse.y" + { + (yyval.node) = call_op(call_op((yyvsp[(2) - (4)].node), tPOW, 1, (yyvsp[(4) - (4)].node)), tUMINUS, 0, 0); + } + break; + + case 194: +#line 1130 "parse.y" + { + (yyval.node) = call_op(call_op((yyvsp[(2) - (4)].node), tPOW, 1, (yyvsp[(4) - (4)].node)), tUMINUS, 0, 0); + } + break; + + case 195: +#line 1134 "parse.y" + { + if ((yyvsp[(2) - (2)].node) && nd_type((yyvsp[(2) - (2)].node)) == NODE_LIT) { + (yyval.node) = (yyvsp[(2) - (2)].node); + } + else { + (yyval.node) = call_op((yyvsp[(2) - (2)].node), tUPLUS, 0, 0); + } + } + break; + + case 196: +#line 1143 "parse.y" + { + (yyval.node) = call_op((yyvsp[(2) - (2)].node), tUMINUS, 0, 0); + } + break; + + case 197: +#line 1147 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '|', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 198: +#line 1151 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '^', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 199: +#line 1155 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '&', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 200: +#line 1159 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), tCMP, 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 201: +#line 1163 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '>', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 202: +#line 1167 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), tGEQ, 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 203: +#line 1171 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), '<', 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 204: +#line 1175 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), tLEQ, 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 205: +#line 1179 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), tEQ, 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 206: +#line 1183 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), tEQQ, 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 207: +#line 1187 "parse.y" + { + (yyval.node) = NEW_NOT(call_op((yyvsp[(1) - (3)].node), tEQ, 1, (yyvsp[(3) - (3)].node))); + } + break; + + case 208: +#line 1191 "parse.y" + { + (yyval.node) = match_gen((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 209: +#line 1195 "parse.y" + { + (yyval.node) = NEW_NOT(match_gen((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node))); + } + break; + + case 210: +#line 1199 "parse.y" + { + (yyval.node) = NEW_NOT(cond((yyvsp[(2) - (2)].node))); + } + break; + + case 211: +#line 1203 "parse.y" + { + (yyval.node) = call_op((yyvsp[(2) - (2)].node), '~', 0, 0); + } + break; + + case 212: +#line 1207 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), tLSHFT, 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 213: +#line 1211 "parse.y" + { + (yyval.node) = call_op((yyvsp[(1) - (3)].node), tRSHFT, 1, (yyvsp[(3) - (3)].node)); + } + break; + + case 214: +#line 1215 "parse.y" + { + (yyval.node) = logop(NODE_AND, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 215: +#line 1219 "parse.y" + { + (yyval.node) = logop(NODE_OR, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 216: +#line 1222 "parse.y" + {in_defined = 1;} + break; + + case 217: +#line 1223 "parse.y" + { + in_defined = 0; + (yyval.node) = NEW_DEFINED((yyvsp[(4) - (4)].node)); + } + break; + + case 218: +#line 1228 "parse.y" + { + (yyval.node) = NEW_IF(cond((yyvsp[(1) - (5)].node)), (yyvsp[(3) - (5)].node), (yyvsp[(5) - (5)].node)); + fixpos((yyval.node), (yyvsp[(1) - (5)].node)); + } + break; + + case 219: +#line 1233 "parse.y" + { + (yyval.node) = (yyvsp[(1) - (1)].node); + } + break; + + case 220: +#line 1239 "parse.y" + { + value_expr((yyvsp[(1) - (1)].node)); + (yyval.node) = (yyvsp[(1) - (1)].node); + } + break; + + case 222: +#line 1247 "parse.y" + { + rb_warn("parenthesize argument(s) for future version"); + (yyval.node) = NEW_LIST((yyvsp[(1) - (2)].node)); + } + break; + + case 223: +#line 1252 "parse.y" + { + (yyval.node) = (yyvsp[(1) - (2)].node); + } + break; + + case 224: +#line 1256 "parse.y" + { + value_expr((yyvsp[(4) - (5)].node)); + (yyval.node) = arg_concat((yyvsp[(1) - (5)].node), (yyvsp[(4) - (5)].node)); + } + break; + + case 225: +#line 1261 "parse.y" + { + (yyval.node) = NEW_LIST(NEW_HASH((yyvsp[(1) - (2)].node))); + } + break; + + case 226: +#line 1265 "parse.y" + { + value_expr((yyvsp[(2) - (3)].node)); + (yyval.node) = NEW_NEWLINE(NEW_SPLAT((yyvsp[(2) - (3)].node))); + } + break; + + case 227: +#line 1272 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (3)].node); + } + break; + + case 228: +#line 1276 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (4)].node); + } + break; + + case 229: +#line 1280 "parse.y" + { + rb_warn("parenthesize argument for future version"); + (yyval.node) = NEW_LIST((yyvsp[(2) - (4)].node)); + } + break; + + case 230: +#line 1285 "parse.y" + { + rb_warn("parenthesize argument for future version"); + (yyval.node) = list_append((yyvsp[(2) - (6)].node), (yyvsp[(4) - (6)].node)); + } + break; + + case 233: +#line 1296 "parse.y" + { + rb_warn("parenthesize argument(s) for future version"); + (yyval.node) = NEW_LIST((yyvsp[(1) - (1)].node)); + } + break; + + case 234: +#line 1301 "parse.y" + { + (yyval.node) = arg_blk_pass((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); + } + break; + + case 235: +#line 1305 "parse.y" + { + (yyval.node) = arg_concat((yyvsp[(1) - (5)].node), (yyvsp[(4) - (5)].node)); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(5) - (5)].node)); + } + break; + + case 236: +#line 1310 "parse.y" + { + (yyval.node) = NEW_LIST(NEW_HASH((yyvsp[(1) - (2)].node))); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(2) - (2)].node)); + } + break; + + case 237: +#line 1315 "parse.y" + { + (yyval.node) = arg_concat(NEW_LIST(NEW_HASH((yyvsp[(1) - (5)].node))), (yyvsp[(4) - (5)].node)); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(5) - (5)].node)); + } + break; + + case 238: +#line 1320 "parse.y" + { + (yyval.node) = list_append((yyvsp[(1) - (4)].node), NEW_HASH((yyvsp[(3) - (4)].node))); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(4) - (4)].node)); + } + break; + + case 239: +#line 1325 "parse.y" + { + value_expr((yyvsp[(6) - (7)].node)); + (yyval.node) = arg_concat(list_append((yyvsp[(1) - (7)].node), NEW_HASH((yyvsp[(3) - (7)].node))), (yyvsp[(6) - (7)].node)); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(7) - (7)].node)); + } + break; + + case 240: +#line 1331 "parse.y" + { + (yyval.node) = arg_blk_pass(NEW_SPLAT((yyvsp[(2) - (3)].node)), (yyvsp[(3) - (3)].node)); + } + break; + + case 242: +#line 1338 "parse.y" + { + (yyval.node) = arg_blk_pass(list_concat(NEW_LIST((yyvsp[(1) - (4)].node)),(yyvsp[(3) - (4)].node)), (yyvsp[(4) - (4)].node)); + } + break; + + case 243: +#line 1342 "parse.y" + { + (yyval.node) = arg_blk_pass((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 244: +#line 1346 "parse.y" + { + (yyval.node) = arg_concat(NEW_LIST((yyvsp[(1) - (5)].node)), (yyvsp[(4) - (5)].node)); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(5) - (5)].node)); + } + break; + + case 245: +#line 1351 "parse.y" + { + (yyval.node) = arg_concat(list_concat(NEW_LIST((yyvsp[(1) - (7)].node)),(yyvsp[(3) - (7)].node)), (yyvsp[(6) - (7)].node)); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(7) - (7)].node)); + } + break; + + case 246: +#line 1356 "parse.y" + { + (yyval.node) = NEW_LIST(NEW_HASH((yyvsp[(1) - (2)].node))); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(2) - (2)].node)); + } + break; + + case 247: +#line 1361 "parse.y" + { + (yyval.node) = arg_concat(NEW_LIST(NEW_HASH((yyvsp[(1) - (5)].node))), (yyvsp[(4) - (5)].node)); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(5) - (5)].node)); + } + break; + + case 248: +#line 1366 "parse.y" + { + (yyval.node) = list_append(NEW_LIST((yyvsp[(1) - (4)].node)), NEW_HASH((yyvsp[(3) - (4)].node))); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(4) - (4)].node)); + } + break; + + case 249: +#line 1371 "parse.y" + { + (yyval.node) = list_append(list_concat(NEW_LIST((yyvsp[(1) - (6)].node)),(yyvsp[(3) - (6)].node)), NEW_HASH((yyvsp[(5) - (6)].node))); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(6) - (6)].node)); + } + break; + + case 250: +#line 1376 "parse.y" + { + (yyval.node) = arg_concat(list_append(NEW_LIST((yyvsp[(1) - (7)].node)), NEW_HASH((yyvsp[(3) - (7)].node))), (yyvsp[(6) - (7)].node)); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(7) - (7)].node)); + } + break; + + case 251: +#line 1381 "parse.y" + { + (yyval.node) = arg_concat(list_append(list_concat(NEW_LIST((yyvsp[(1) - (9)].node)), (yyvsp[(3) - (9)].node)), NEW_HASH((yyvsp[(5) - (9)].node))), (yyvsp[(8) - (9)].node)); + (yyval.node) = arg_blk_pass((yyval.node), (yyvsp[(9) - (9)].node)); + } + break; + + case 252: +#line 1386 "parse.y" + { + (yyval.node) = arg_blk_pass(NEW_SPLAT((yyvsp[(2) - (3)].node)), (yyvsp[(3) - (3)].node)); + } + break; + + case 254: +#line 1392 "parse.y" + { + (yyval.num) = cmdarg_stack; + CMDARG_PUSH(1); + } + break; + + case 255: +#line 1397 "parse.y" + { + /* CMDARG_POP() */ + cmdarg_stack = (yyvsp[(1) - (2)].num); + (yyval.node) = (yyvsp[(2) - (2)].node); + } + break; + + case 257: +#line 1405 "parse.y" + {lex_state = EXPR_ENDARG;} + break; + + case 258: +#line 1406 "parse.y" + { + rb_warn("don't put space before argument parentheses"); + (yyval.node) = 0; + } + break; + + case 259: +#line 1410 "parse.y" + {lex_state = EXPR_ENDARG;} + break; + + case 260: +#line 1411 "parse.y" + { + rb_warn("don't put space before argument parentheses"); + (yyval.node) = (yyvsp[(2) - (4)].node); + } + break; + + case 261: +#line 1418 "parse.y" + { + (yyval.node) = NEW_BLOCK_PASS((yyvsp[(2) - (2)].node)); + } + break; + + case 262: +#line 1424 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (2)].node); + } + break; + + case 264: +#line 1431 "parse.y" + { + (yyval.node) = NEW_LIST((yyvsp[(1) - (1)].node)); + } + break; + + case 265: +#line 1435 "parse.y" + { + (yyval.node) = list_append((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 266: +#line 1441 "parse.y" + { + (yyval.node) = list_append((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 267: +#line 1445 "parse.y" + { + (yyval.node) = arg_concat((yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); + } + break; + + case 268: +#line 1449 "parse.y" + { + (yyval.node) = NEW_SPLAT((yyvsp[(2) - (2)].node)); + } + break; + + case 277: +#line 1463 "parse.y" + { + (yyval.node) = NEW_FCALL((yyvsp[(1) - (1)].id), 0); + } + break; + + case 278: +#line 1467 "parse.y" + { + (yyvsp[(1) - (1)].num) = ruby_sourceline; + } + break; + + case 279: +#line 1472 "parse.y" + { + if ((yyvsp[(3) - (4)].node) == NULL) + (yyval.node) = NEW_NIL(); + else + (yyval.node) = NEW_BEGIN((yyvsp[(3) - (4)].node)); + nd_set_line((yyval.node), (yyvsp[(1) - (4)].num)); + } + break; + + case 280: +#line 1479 "parse.y" + {lex_state = EXPR_ENDARG;} + break; + + case 281: +#line 1480 "parse.y" + { + rb_warning("(...) interpreted as grouped expression"); + (yyval.node) = (yyvsp[(2) - (5)].node); + } + break; + + case 282: +#line 1485 "parse.y" + { + if (!(yyvsp[(2) - (3)].node)) (yyval.node) = NEW_NIL(); + else (yyval.node) = (yyvsp[(2) - (3)].node); + } + break; + + case 283: +#line 1490 "parse.y" + { + (yyval.node) = NEW_COLON2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id)); + } + break; + + case 284: +#line 1494 "parse.y" + { + (yyval.node) = NEW_COLON3((yyvsp[(2) - (2)].id)); + } + break; + + case 285: +#line 1498 "parse.y" + { + if ((yyvsp[(1) - (4)].node) && nd_type((yyvsp[(1) - (4)].node)) == NODE_SELF) + (yyval.node) = NEW_FCALL(tAREF, (yyvsp[(3) - (4)].node)); + else + (yyval.node) = NEW_CALL((yyvsp[(1) - (4)].node), tAREF, (yyvsp[(3) - (4)].node)); + fixpos((yyval.node), (yyvsp[(1) - (4)].node)); + } + break; + + case 286: +#line 1506 "parse.y" + { + if ((yyvsp[(2) - (3)].node) == 0) { + (yyval.node) = NEW_ZARRAY(); /* zero length array*/ + } + else { + (yyval.node) = (yyvsp[(2) - (3)].node); + } + } + break; + + case 287: +#line 1515 "parse.y" + { + (yyval.node) = NEW_HASH((yyvsp[(2) - (3)].node)); + } + break; + + case 288: +#line 1519 "parse.y" + { + (yyval.node) = NEW_RETURN(0); + } + break; + + case 289: +#line 1523 "parse.y" + { + (yyval.node) = new_yield((yyvsp[(3) - (4)].node)); + } + break; + + case 290: +#line 1527 "parse.y" + { + (yyval.node) = NEW_YIELD(0, Qfalse); + } + break; + + case 291: +#line 1531 "parse.y" + { + (yyval.node) = NEW_YIELD(0, Qfalse); + } + break; + + case 292: +#line 1534 "parse.y" + {in_defined = 1;} + break; + + case 293: +#line 1535 "parse.y" + { + in_defined = 0; + (yyval.node) = NEW_DEFINED((yyvsp[(5) - (6)].node)); + } + break; + + case 294: +#line 1540 "parse.y" + { + (yyvsp[(2) - (2)].node)->nd_iter = NEW_FCALL((yyvsp[(1) - (2)].id), 0); + (yyval.node) = (yyvsp[(2) - (2)].node); + fixpos((yyvsp[(2) - (2)].node)->nd_iter, (yyvsp[(2) - (2)].node)); + } + break; + + case 296: +#line 1547 "parse.y" + { + if ((yyvsp[(1) - (2)].node) && nd_type((yyvsp[(1) - (2)].node)) == NODE_BLOCK_PASS) { + rb_compile_error("both block arg and actual block given"); + } + (yyvsp[(2) - (2)].node)->nd_iter = (yyvsp[(1) - (2)].node); + (yyval.node) = (yyvsp[(2) - (2)].node); + fixpos((yyval.node), (yyvsp[(1) - (2)].node)); + } + break; + + case 297: +#line 1559 "parse.y" + { + (yyval.node) = NEW_IF(cond((yyvsp[(2) - (6)].node)), (yyvsp[(4) - (6)].node), (yyvsp[(5) - (6)].node)); + fixpos((yyval.node), (yyvsp[(2) - (6)].node)); + if (cond_negative(&(yyval.node)->nd_cond)) { + NODE *tmp = (yyval.node)->nd_body; + (yyval.node)->nd_body = (yyval.node)->nd_else; + (yyval.node)->nd_else = tmp; + } + } + break; + + case 298: +#line 1572 "parse.y" + { + (yyval.node) = NEW_UNLESS(cond((yyvsp[(2) - (6)].node)), (yyvsp[(4) - (6)].node), (yyvsp[(5) - (6)].node)); + fixpos((yyval.node), (yyvsp[(2) - (6)].node)); + if (cond_negative(&(yyval.node)->nd_cond)) { + NODE *tmp = (yyval.node)->nd_body; + (yyval.node)->nd_body = (yyval.node)->nd_else; + (yyval.node)->nd_else = tmp; + } + } + break; + + case 299: +#line 1581 "parse.y" + {COND_PUSH(1);} + break; + + case 300: +#line 1581 "parse.y" + {COND_POP();} + break; + + case 301: +#line 1584 "parse.y" + { + (yyval.node) = NEW_WHILE(cond((yyvsp[(3) - (7)].node)), (yyvsp[(6) - (7)].node), 1); + fixpos((yyval.node), (yyvsp[(3) - (7)].node)); + if (cond_negative(&(yyval.node)->nd_cond)) { + nd_set_type((yyval.node), NODE_UNTIL); + } + } + break; + + case 302: +#line 1591 "parse.y" + {COND_PUSH(1);} + break; + + case 303: +#line 1591 "parse.y" + {COND_POP();} + break; + + case 304: +#line 1594 "parse.y" + { + (yyval.node) = NEW_UNTIL(cond((yyvsp[(3) - (7)].node)), (yyvsp[(6) - (7)].node), 1); + fixpos((yyval.node), (yyvsp[(3) - (7)].node)); + if (cond_negative(&(yyval.node)->nd_cond)) { + nd_set_type((yyval.node), NODE_WHILE); + } + } + break; + + case 305: +#line 1604 "parse.y" + { + (yyval.node) = NEW_CASE((yyvsp[(2) - (5)].node), (yyvsp[(4) - (5)].node)); + fixpos((yyval.node), (yyvsp[(2) - (5)].node)); + } + break; + + case 306: +#line 1609 "parse.y" + { + (yyval.node) = (yyvsp[(3) - (4)].node); + } + break; + + case 307: +#line 1613 "parse.y" + { + (yyval.node) = (yyvsp[(4) - (5)].node); + } + break; + + case 308: +#line 1616 "parse.y" + {COND_PUSH(1);} + break; + + case 309: +#line 1616 "parse.y" + {COND_POP();} + break; + + case 310: +#line 1619 "parse.y" + { + (yyval.node) = NEW_FOR((yyvsp[(2) - (9)].node), (yyvsp[(5) - (9)].node), (yyvsp[(8) - (9)].node)); + fixpos((yyval.node), (yyvsp[(2) - (9)].node)); + } + break; + + case 311: +#line 1624 "parse.y" + { + if (in_def || in_single) + yyerror("class definition in method body"); + class_nest++; + local_push(0); + (yyval.num) = ruby_sourceline; + } + break; + + case 312: +#line 1633 "parse.y" + { + (yyval.node) = NEW_CLASS((yyvsp[(2) - (6)].node), (yyvsp[(5) - (6)].node), (yyvsp[(3) - (6)].node)); + nd_set_line((yyval.node), (yyvsp[(4) - (6)].num)); + local_pop(); + class_nest--; + } + break; + + case 313: +#line 1640 "parse.y" + { + (yyval.num) = in_def; + in_def = 0; + } + break; + + case 314: +#line 1645 "parse.y" + { + (yyval.num) = in_single; + in_single = 0; + class_nest++; + local_push(0); + } + break; + + case 315: +#line 1653 "parse.y" + { + (yyval.node) = NEW_SCLASS((yyvsp[(3) - (8)].node), (yyvsp[(7) - (8)].node)); + fixpos((yyval.node), (yyvsp[(3) - (8)].node)); + local_pop(); + class_nest--; + in_def = (yyvsp[(4) - (8)].num); + in_single = (yyvsp[(6) - (8)].num); + } + break; + + case 316: +#line 1662 "parse.y" + { + if (in_def || in_single) + yyerror("module definition in method body"); + class_nest++; + local_push(0); + (yyval.num) = ruby_sourceline; + } + break; + + case 317: +#line 1671 "parse.y" + { + (yyval.node) = NEW_MODULE((yyvsp[(2) - (5)].node), (yyvsp[(4) - (5)].node)); + nd_set_line((yyval.node), (yyvsp[(3) - (5)].num)); + local_pop(); + class_nest--; + } + break; + + case 318: +#line 1678 "parse.y" + { + (yyval.id) = cur_mid; + cur_mid = (yyvsp[(2) - (2)].id); + in_def++; + local_push(0); + } + break; + + case 319: +#line 1687 "parse.y" + { + if (!(yyvsp[(5) - (6)].node)) (yyvsp[(5) - (6)].node) = NEW_NIL(); + (yyval.node) = NEW_DEFN((yyvsp[(2) - (6)].id), (yyvsp[(4) - (6)].node), (yyvsp[(5) - (6)].node), NOEX_PRIVATE); + fixpos((yyval.node), (yyvsp[(4) - (6)].node)); + local_pop(); + in_def--; + cur_mid = (yyvsp[(3) - (6)].id); + } + break; + + case 320: +#line 1695 "parse.y" + {lex_state = EXPR_FNAME;} + break; + + case 321: +#line 1696 "parse.y" + { + in_single++; + local_push(0); + lex_state = EXPR_END; /* force for args */ + } + break; + + case 322: +#line 1704 "parse.y" + { + (yyval.node) = NEW_DEFS((yyvsp[(2) - (9)].node), (yyvsp[(5) - (9)].id), (yyvsp[(7) - (9)].node), (yyvsp[(8) - (9)].node)); + fixpos((yyval.node), (yyvsp[(2) - (9)].node)); + local_pop(); + in_single--; + } + break; + + case 323: +#line 1711 "parse.y" + { + (yyval.node) = NEW_BREAK(0); + } + break; + + case 324: +#line 1715 "parse.y" + { + (yyval.node) = NEW_NEXT(0); + } + break; + + case 325: +#line 1719 "parse.y" + { + (yyval.node) = NEW_REDO(); + } + break; + + case 326: +#line 1723 "parse.y" + { + (yyval.node) = NEW_RETRY(); + } + break; + + case 327: +#line 1729 "parse.y" + { + value_expr((yyvsp[(1) - (1)].node)); + (yyval.node) = (yyvsp[(1) - (1)].node); + } + break; + + case 336: +#line 1750 "parse.y" + { + (yyval.node) = NEW_IF(cond((yyvsp[(2) - (5)].node)), (yyvsp[(4) - (5)].node), (yyvsp[(5) - (5)].node)); + fixpos((yyval.node), (yyvsp[(2) - (5)].node)); + } + break; + + case 338: +#line 1758 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (2)].node); + } + break; + + case 342: +#line 1769 "parse.y" + { + (yyval.node) = (NODE*)1; + } + break; + + case 343: +#line 1773 "parse.y" + { + (yyval.node) = (NODE*)1; + } + break; + + case 344: +#line 1777 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (3)].node); + } + break; + + case 345: +#line 1783 "parse.y" + { + (yyval.vars) = dyna_push(); + (yyvsp[(1) - (1)].num) = ruby_sourceline; + } + break; + + case 346: +#line 1787 "parse.y" + {(yyval.vars) = ruby_dyna_vars;} + break; + + case 347: +#line 1790 "parse.y" + { + (yyval.node) = NEW_ITER((yyvsp[(3) - (6)].node), 0, dyna_init((yyvsp[(5) - (6)].node), (yyvsp[(4) - (6)].vars))); + nd_set_line((yyval.node), (yyvsp[(1) - (6)].num)); + dyna_pop((yyvsp[(2) - (6)].vars)); + } + break; + + case 348: +#line 1798 "parse.y" + { + if ((yyvsp[(1) - (2)].node) && nd_type((yyvsp[(1) - (2)].node)) == NODE_BLOCK_PASS) { + rb_compile_error("both block arg and actual block given"); + } + (yyvsp[(2) - (2)].node)->nd_iter = (yyvsp[(1) - (2)].node); + (yyval.node) = (yyvsp[(2) - (2)].node); + fixpos((yyval.node), (yyvsp[(1) - (2)].node)); + } + break; + + case 349: +#line 1807 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].node)); + } + break; + + case 350: +#line 1811 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].node)); + } + break; + + case 351: +#line 1817 "parse.y" + { + (yyval.node) = new_fcall((yyvsp[(1) - (2)].id), (yyvsp[(2) - (2)].node)); + fixpos((yyval.node), (yyvsp[(2) - (2)].node)); + } + break; + + case 352: +#line 1822 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].node)); + fixpos((yyval.node), (yyvsp[(1) - (4)].node)); + } + break; + + case 353: +#line 1827 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].node)); + fixpos((yyval.node), (yyvsp[(1) - (4)].node)); + } + break; + + case 354: +#line 1832 "parse.y" + { + (yyval.node) = new_call((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].id), 0); + } + break; + + case 355: +#line 1836 "parse.y" + { + (yyval.node) = new_super((yyvsp[(2) - (2)].node)); + } + break; + + case 356: +#line 1840 "parse.y" + { + (yyval.node) = NEW_ZSUPER(); + } + break; + + case 357: +#line 1846 "parse.y" + { + (yyval.vars) = dyna_push(); + (yyvsp[(1) - (1)].num) = ruby_sourceline; + } + break; + + case 358: +#line 1850 "parse.y" + {(yyval.vars) = ruby_dyna_vars;} + break; + + case 359: +#line 1852 "parse.y" + { + (yyval.node) = NEW_ITER((yyvsp[(3) - (6)].node), 0, dyna_init((yyvsp[(5) - (6)].node), (yyvsp[(4) - (6)].vars))); + nd_set_line((yyval.node), (yyvsp[(1) - (6)].num)); + dyna_pop((yyvsp[(2) - (6)].vars)); + } + break; + + case 360: +#line 1858 "parse.y" + { + (yyval.vars) = dyna_push(); + (yyvsp[(1) - (1)].num) = ruby_sourceline; + } + break; + + case 361: +#line 1862 "parse.y" + {(yyval.vars) = ruby_dyna_vars;} + break; + + case 362: +#line 1864 "parse.y" + { + (yyval.node) = NEW_ITER((yyvsp[(3) - (6)].node), 0, dyna_init((yyvsp[(5) - (6)].node), (yyvsp[(4) - (6)].vars))); + nd_set_line((yyval.node), (yyvsp[(1) - (6)].num)); + dyna_pop((yyvsp[(2) - (6)].vars)); + } + break; + + case 363: +#line 1874 "parse.y" + { + (yyval.node) = NEW_WHEN((yyvsp[(2) - (5)].node), (yyvsp[(4) - (5)].node), (yyvsp[(5) - (5)].node)); + } + break; + + case 365: +#line 1880 "parse.y" + { + (yyval.node) = list_append((yyvsp[(1) - (4)].node), NEW_WHEN((yyvsp[(4) - (4)].node), 0, 0)); + } + break; + + case 366: +#line 1884 "parse.y" + { + (yyval.node) = NEW_LIST(NEW_WHEN((yyvsp[(2) - (2)].node), 0, 0)); + } + break; + + case 369: +#line 1896 "parse.y" + { + if ((yyvsp[(3) - (6)].node)) { + (yyvsp[(3) - (6)].node) = node_assign((yyvsp[(3) - (6)].node), NEW_GVAR(rb_intern("$!"))); + (yyvsp[(5) - (6)].node) = block_append((yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].node)); + } + (yyval.node) = NEW_RESBODY((yyvsp[(2) - (6)].node), (yyvsp[(5) - (6)].node), (yyvsp[(6) - (6)].node)); + fixpos((yyval.node), (yyvsp[(2) - (6)].node)?(yyvsp[(2) - (6)].node):(yyvsp[(5) - (6)].node)); + } + break; + + case 371: +#line 1908 "parse.y" + { + (yyval.node) = NEW_LIST((yyvsp[(1) - (1)].node)); + } + break; + + case 374: +#line 1916 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (2)].node); + } + break; + + case 376: +#line 1923 "parse.y" + { + if ((yyvsp[(2) - (2)].node)) + (yyval.node) = (yyvsp[(2) - (2)].node); + else + /* place holder */ + (yyval.node) = NEW_NIL(); + } + break; + + case 379: +#line 1935 "parse.y" + { + (yyval.node) = NEW_LIT(ID2SYM((yyvsp[(1) - (1)].id))); + } + break; + + case 381: +#line 1942 "parse.y" + { + NODE *node = (yyvsp[(1) - (1)].node); + if (!node) { + node = NEW_STR(rb_str_new(0, 0)); + } + else { + node = evstr2dstr(node); + } + (yyval.node) = node; + } + break; + + case 383: +#line 1956 "parse.y" + { + (yyval.node) = literal_concat((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); + } + break; + + case 384: +#line 1962 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (3)].node); + } + break; + + case 385: +#line 1968 "parse.y" + { + NODE *node = (yyvsp[(2) - (3)].node); + if (!node) { + node = NEW_XSTR(rb_str_new(0, 0)); + } + else { + switch (nd_type(node)) { + case NODE_STR: + nd_set_type(node, NODE_XSTR); + break; + case NODE_DSTR: + nd_set_type(node, NODE_DXSTR); + break; + default: + node = NEW_NODE(NODE_DXSTR, rb_str_new(0, 0), 1, NEW_LIST(node)); + break; + } + } + (yyval.node) = node; + } + break; + + case 386: +#line 1991 "parse.y" + { + int options = (yyvsp[(3) - (3)].num); + NODE *node = (yyvsp[(2) - (3)].node); + if (!node) { + node = NEW_LIT(rb_reg_new("", 0, options & ~RE_OPTION_ONCE)); + } + else switch (nd_type(node)) { + case NODE_STR: + { + VALUE src = node->nd_lit; + nd_set_type(node, NODE_LIT); + node->nd_lit = rb_reg_new(RSTRING(src)->ptr, + RSTRING(src)->len, + options & ~RE_OPTION_ONCE); + } + break; + default: + node = NEW_NODE(NODE_DSTR, rb_str_new(0, 0), 1, NEW_LIST(node)); + case NODE_DSTR: + if (options & RE_OPTION_ONCE) { + nd_set_type(node, NODE_DREGX_ONCE); + } + else { + nd_set_type(node, NODE_DREGX); + } + node->nd_cflag = options & ~RE_OPTION_ONCE; + break; + } + (yyval.node) = node; + } + break; + + case 387: +#line 2024 "parse.y" + { + (yyval.node) = NEW_ZARRAY(); + } + break; + + case 388: +#line 2028 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (3)].node); + } + break; + + case 389: +#line 2034 "parse.y" + { + (yyval.node) = 0; + } + break; + + case 390: +#line 2038 "parse.y" + { + (yyval.node) = list_append((yyvsp[(1) - (3)].node), evstr2dstr((yyvsp[(2) - (3)].node))); + } + break; + + case 392: +#line 2045 "parse.y" + { + (yyval.node) = literal_concat((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); + } + break; + + case 393: +#line 2051 "parse.y" + { + (yyval.node) = NEW_ZARRAY(); + } + break; + + case 394: +#line 2055 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (3)].node); + } + break; + + case 395: +#line 2061 "parse.y" + { + (yyval.node) = 0; + } + break; + + case 396: +#line 2065 "parse.y" + { + (yyval.node) = list_append((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].node)); + } + break; + + case 397: +#line 2071 "parse.y" + { + (yyval.node) = 0; + } + break; + + case 398: +#line 2075 "parse.y" + { + (yyval.node) = literal_concat((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); + } + break; + + case 399: +#line 2081 "parse.y" + { + (yyval.node) = 0; + } + break; + + case 400: +#line 2085 "parse.y" + { + (yyval.node) = literal_concat((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); + } + break; + + case 402: +#line 2092 "parse.y" + { + (yyval.node) = lex_strterm; + lex_strterm = 0; + lex_state = EXPR_BEG; + } + break; + + case 403: +#line 2098 "parse.y" + { + lex_strterm = (yyvsp[(2) - (3)].node); + (yyval.node) = NEW_EVSTR((yyvsp[(3) - (3)].node)); + } + break; + + case 404: +#line 2103 "parse.y" + { + (yyval.node) = lex_strterm; + lex_strterm = 0; + lex_state = EXPR_BEG; + COND_PUSH(0); + CMDARG_PUSH(0); + } + break; + + case 405: +#line 2111 "parse.y" + { + lex_strterm = (yyvsp[(2) - (4)].node); + COND_LEXPOP(); + CMDARG_LEXPOP(); + if (((yyval.node) = (yyvsp[(3) - (4)].node)) && nd_type((yyval.node)) == NODE_NEWLINE) { + (yyval.node) = (yyval.node)->nd_next; + rb_gc_force_recycle((VALUE)(yyvsp[(3) - (4)].node)); + } + (yyval.node) = new_evstr((yyval.node)); + } + break; + + case 406: +#line 2123 "parse.y" + {(yyval.node) = NEW_GVAR((yyvsp[(1) - (1)].id));} + break; + + case 407: +#line 2124 "parse.y" + {(yyval.node) = NEW_IVAR((yyvsp[(1) - (1)].id));} + break; + + case 408: +#line 2125 "parse.y" + {(yyval.node) = NEW_CVAR((yyvsp[(1) - (1)].id));} + break; + + case 410: +#line 2130 "parse.y" + { + lex_state = EXPR_END; + (yyval.id) = (yyvsp[(2) - (2)].id); + } + break; + + case 415: +#line 2143 "parse.y" + { + lex_state = EXPR_END; + if (!((yyval.node) = (yyvsp[(2) - (3)].node))) { + (yyval.node) = NEW_NIL(); + yyerror("empty symbol literal"); + } + else { + VALUE lit; + + switch (nd_type((yyval.node))) { + case NODE_DSTR: + nd_set_type((yyval.node), NODE_DSYM); + break; + case NODE_STR: + lit = (yyval.node)->nd_lit; + if (RSTRING(lit)->len == 0) { + yyerror("empty symbol literal"); + break; + } + if (strlen(RSTRING(lit)->ptr) == RSTRING(lit)->len) { + (yyval.node)->nd_lit = ID2SYM(rb_intern(RSTRING((yyval.node)->nd_lit)->ptr)); + nd_set_type((yyval.node), NODE_LIT); + break; + } + /* fall through */ + default: + (yyval.node) = NEW_NODE(NODE_DSYM, rb_str_new(0, 0), 1, NEW_LIST((yyval.node))); + break; + } + } + } + break; + + case 418: +#line 2179 "parse.y" + { + (yyval.node) = negate_lit((yyvsp[(2) - (2)].node)); + } + break; + + case 419: +#line 2183 "parse.y" + { + (yyval.node) = negate_lit((yyvsp[(2) - (2)].node)); + } + break; + + case 425: +#line 2193 "parse.y" + {(yyval.id) = kNIL;} + break; + + case 426: +#line 2194 "parse.y" + {(yyval.id) = kSELF;} + break; + + case 427: +#line 2195 "parse.y" + {(yyval.id) = kTRUE;} + break; + + case 428: +#line 2196 "parse.y" + {(yyval.id) = kFALSE;} + break; + + case 429: +#line 2197 "parse.y" + {(yyval.id) = k__FILE__;} + break; + + case 430: +#line 2198 "parse.y" + {(yyval.id) = k__LINE__;} + break; + + case 431: +#line 2202 "parse.y" + { + (yyval.node) = gettable((yyvsp[(1) - (1)].id)); + } + break; + + case 432: +#line 2208 "parse.y" + { + (yyval.node) = assignable((yyvsp[(1) - (1)].id), 0); + } + break; + + case 435: +#line 2218 "parse.y" + { + (yyval.node) = 0; + } + break; + + case 436: +#line 2222 "parse.y" + { + lex_state = EXPR_BEG; + } + break; + + case 437: +#line 2226 "parse.y" + { + (yyval.node) = (yyvsp[(3) - (4)].node); + } + break; + + case 438: +#line 2229 "parse.y" + {yyerrok; (yyval.node) = 0;} + break; + + case 439: +#line 2233 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (4)].node); + lex_state = EXPR_BEG; + command_start = Qtrue; + } + break; + + case 440: +#line 2239 "parse.y" + { + (yyval.node) = (yyvsp[(1) - (2)].node); + } + break; + + case 441: +#line 2245 "parse.y" + { + (yyval.node) = block_append(NEW_ARGS((yyvsp[(1) - (6)].num), (yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].node)), (yyvsp[(6) - (6)].node)); + } + break; + + case 442: +#line 2249 "parse.y" + { + (yyval.node) = block_append(NEW_ARGS((yyvsp[(1) - (4)].num), (yyvsp[(3) - (4)].node), 0), (yyvsp[(4) - (4)].node)); + } + break; + + case 443: +#line 2253 "parse.y" + { + (yyval.node) = block_append(NEW_ARGS((yyvsp[(1) - (4)].num), 0, (yyvsp[(3) - (4)].node)), (yyvsp[(4) - (4)].node)); + } + break; + + case 444: +#line 2257 "parse.y" + { + (yyval.node) = block_append(NEW_ARGS((yyvsp[(1) - (2)].num), 0, 0), (yyvsp[(2) - (2)].node)); + } + break; + + case 445: +#line 2261 "parse.y" + { + (yyval.node) = block_append(NEW_ARGS(0, (yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].node)), (yyvsp[(4) - (4)].node)); + } + break; + + case 446: +#line 2265 "parse.y" + { + (yyval.node) = block_append(NEW_ARGS(0, (yyvsp[(1) - (2)].node), 0), (yyvsp[(2) - (2)].node)); + } + break; + + case 447: +#line 2269 "parse.y" + { + (yyval.node) = block_append(NEW_ARGS(0, 0, (yyvsp[(1) - (2)].node)), (yyvsp[(2) - (2)].node)); + } + break; + + case 448: +#line 2273 "parse.y" + { + (yyval.node) = block_append(NEW_ARGS(0, 0, 0), (yyvsp[(1) - (1)].node)); + } + break; + + case 449: +#line 2277 "parse.y" + { + (yyval.node) = NEW_ARGS(0, 0, 0); + } + break; + + case 450: +#line 2283 "parse.y" + { + yyerror("formal argument cannot be a constant"); + } + break; + + case 451: +#line 2287 "parse.y" + { + yyerror("formal argument cannot be an instance variable"); + } + break; + + case 452: +#line 2291 "parse.y" + { + yyerror("formal argument cannot be a global variable"); + } + break; + + case 453: +#line 2295 "parse.y" + { + yyerror("formal argument cannot be a class variable"); + } + break; + + case 454: +#line 2299 "parse.y" + { + if (!is_local_id((yyvsp[(1) - (1)].id))) + yyerror("formal argument must be local variable"); + else if (local_id((yyvsp[(1) - (1)].id))) + yyerror("duplicate argument name"); + local_cnt((yyvsp[(1) - (1)].id)); + (yyval.num) = 1; + } + break; + + case 456: +#line 2311 "parse.y" + { + (yyval.num) += 1; + } + break; + + case 457: +#line 2317 "parse.y" + { + if (!is_local_id((yyvsp[(1) - (3)].id))) + yyerror("formal argument must be local variable"); + else if (local_id((yyvsp[(1) - (3)].id))) + yyerror("duplicate optional argument name"); + (yyval.node) = assignable((yyvsp[(1) - (3)].id), (yyvsp[(3) - (3)].node)); + } + break; + + case 458: +#line 2327 "parse.y" + { + (yyval.node) = NEW_BLOCK((yyvsp[(1) - (1)].node)); + (yyval.node)->nd_end = (yyval.node); + } + break; + + case 459: +#line 2332 "parse.y" + { + (yyval.node) = block_append((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 462: +#line 2342 "parse.y" + { + if (!is_local_id((yyvsp[(2) - (2)].id))) + yyerror("rest argument must be local variable"); + else if (local_id((yyvsp[(2) - (2)].id))) + yyerror("duplicate rest argument name"); + if (dyna_in_block()) { + rb_dvar_push((yyvsp[(2) - (2)].id), Qnil); + } + (yyval.node) = assignable((yyvsp[(2) - (2)].id), 0); + } + break; + + case 463: +#line 2353 "parse.y" + { + if (dyna_in_block()) { + (yyval.node) = NEW_DASGN_CURR(internal_id(), 0); + } + else { + (yyval.node) = NEW_NODE(NODE_LASGN,0,0,local_append(0)); + } + } + break; + + case 466: +#line 2368 "parse.y" + { + if (!is_local_id((yyvsp[(2) - (2)].id))) + yyerror("block argument must be local variable"); + else if (local_id((yyvsp[(2) - (2)].id))) + yyerror("duplicate block argument name"); + (yyval.node) = NEW_BLOCK_ARG((yyvsp[(2) - (2)].id)); + } + break; + + case 467: +#line 2378 "parse.y" + { + (yyval.node) = (yyvsp[(2) - (2)].node); + } + break; + + case 469: +#line 2385 "parse.y" + { + (yyval.node) = (yyvsp[(1) - (1)].node); + value_expr((yyval.node)); + } + break; + + case 470: +#line 2389 "parse.y" + {lex_state = EXPR_BEG;} + break; + + case 471: +#line 2390 "parse.y" + { + if ((yyvsp[(3) - (5)].node) == 0) { + yyerror("can't define singleton method for ()."); + } + else { + switch (nd_type((yyvsp[(3) - (5)].node))) { + case NODE_STR: + case NODE_DSTR: + case NODE_XSTR: + case NODE_DXSTR: + case NODE_DREGX: + case NODE_LIT: + case NODE_ARRAY: + case NODE_ZARRAY: + yyerror("can't define singleton method for literals"); + default: + value_expr((yyvsp[(3) - (5)].node)); + break; + } + } + (yyval.node) = (yyvsp[(3) - (5)].node); + } + break; + + case 473: +#line 2416 "parse.y" + { + (yyval.node) = (yyvsp[(1) - (2)].node); + } + break; + + case 474: +#line 2420 "parse.y" + { + if ((yyvsp[(1) - (2)].node)->nd_alen%2 != 0) { + yyerror("odd number list for Hash"); + } + (yyval.node) = (yyvsp[(1) - (2)].node); + } + break; + + case 476: +#line 2430 "parse.y" + { + (yyval.node) = list_concat((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); + } + break; + + case 477: +#line 2436 "parse.y" + { + (yyval.node) = list_append(NEW_LIST((yyvsp[(1) - (3)].node)), (yyvsp[(3) - (3)].node)); + } + break; + + case 497: +#line 2474 "parse.y" + {yyerrok;} + break; + + case 500: +#line 2479 "parse.y" + {yyerrok;} + break; + + case 501: +#line 2482 "parse.y" + {(yyval.node) = 0;} + break; + + +/* Line 1267 of yacc.c. */ +#line 7259 "parse.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + +#line 2484 "parse.y" + +#ifdef yystacksize +#undef YYMALLOC +#endif + +#include "regex.h" +#include "util.h" + +/* We remove any previous definition of `SIGN_EXTEND_CHAR', + since ours (we hope) works properly with all combinations of + machines, compilers, `char' and `unsigned char' argument types. + (Per Bothner suggested the basic approach.) */ +#undef SIGN_EXTEND_CHAR +#if __STDC__ +# define SIGN_EXTEND_CHAR(c) ((signed char)(c)) +#else /* not __STDC__ */ +/* As in Harbison and Steele. */ +# define SIGN_EXTEND_CHAR(c) ((((unsigned char)(c)) ^ 128) - 128) +#endif +#define is_identchar(c) (SIGN_EXTEND_CHAR(c)!=-1&&(ISALNUM(c) || (c) == '_' || ismbchar(c))) + +static char *tokenbuf = NULL; +static int tokidx, toksiz = 0; + +#define LEAVE_BS 1 + +static VALUE (*lex_gets)(); /* gets function */ +static VALUE lex_input; /* non-nil if File */ +static VALUE lex_lastline; /* gc protect */ +static char *lex_pbeg; +static char *lex_p; +static char *lex_pend; + +static int +yyerror(msg) + const char *msg; +{ + const int max_line_margin = 30; + const char *p, *pe; + char *buf; + int len, i; + + rb_compile_error("%s", msg); + p = lex_p; + while (lex_pbeg <= p) { + if (*p == '\n') break; + p--; + } + p++; + + pe = lex_p; + while (pe < lex_pend) { + if (*pe == '\n') break; + pe++; + } + + len = pe - p; + if (len > 4) { + char *p2; + const char *pre = "", *post = ""; + + if (len > max_line_margin * 2 + 10) { + int re_mbc_startpos _((const char *, int, int, int)); + if ((len = lex_p - p) > max_line_margin) { + p = p + re_mbc_startpos(p, len, len - max_line_margin, 0); + pre = "..."; + } + if ((len = pe - lex_p) > max_line_margin) { + pe = lex_p + re_mbc_startpos(lex_p, len, max_line_margin, 1); + post = "..."; + } + len = pe - p; + } + buf = ALLOCA_N(char, len+2); + MEMCPY(buf, p, char, len); + buf[len] = '\0'; + rb_compile_error_append("%s%s%s", pre, buf, post); + + i = lex_p - p; + p2 = buf; pe = buf + len; + + while (p2 < pe) { + if (*p2 != '\t') *p2 = ' '; + p2++; + } + buf[i] = '^'; + buf[i+1] = '\0'; + rb_compile_error_append("%s", buf); + } + + return 0; +} + +static int heredoc_end; + +int ruby_in_compile = 0; +int ruby__end__seen; + +static VALUE ruby_debug_lines; +#ifdef YYMALLOC +static NODE *parser_heap; +#endif + +static NODE* +yycompile(f, line) + char *f; + int line; +{ + int n; + NODE *node = 0; + struct RVarmap *vp, *vars = ruby_dyna_vars; + + ruby_in_compile = 1; + if (!compile_for_eval && rb_safe_level() == 0 && + rb_const_defined(rb_cObject, rb_intern("SCRIPT_LINES__"))) { + VALUE hash, fname; + + hash = rb_const_get(rb_cObject, rb_intern("SCRIPT_LINES__")); + if (TYPE(hash) == T_HASH) { + fname = rb_str_new2(f); + ruby_debug_lines = rb_ary_new(); + rb_hash_aset(hash, fname, ruby_debug_lines); + } + if (line > 1) { + VALUE str = rb_str_new(0,0); + while (line > 1) { + rb_ary_push(ruby_debug_lines, str); + line--; + } + } + } + + ruby__end__seen = 0; + ruby_eval_tree = 0; + ruby_eval_tree_begin = 0; + heredoc_end = 0; + lex_strterm = 0; + ruby_current_node = 0; + ruby_sourcefile = rb_source_filename(f); + deferred_nodes = 0; + n = yyparse(); + ruby_debug_lines = 0; + compile_for_eval = 0; + ruby_in_compile = 0; + cond_stack = 0; + cmdarg_stack = 0; + command_start = 1; + class_nest = 0; + in_single = 0; + in_def = 0; + cur_mid = 0; + deferred_nodes = 0; + + vp = ruby_dyna_vars; + ruby_dyna_vars = vars; + lex_strterm = 0; + while (vp && vp != vars) { + struct RVarmap *tmp = vp; + vp = vp->next; + rb_gc_force_recycle((VALUE)tmp); + } + if (n == 0) node = ruby_eval_tree; + if (ruby_nerrs) ruby_eval_tree_begin = 0; + return node; +} + +static int lex_gets_ptr; + +static VALUE +lex_get_str(s) + VALUE s; +{ + char *beg, *end, *pend; + + beg = RSTRING(s)->ptr; + if (lex_gets_ptr) { + if (RSTRING(s)->len == lex_gets_ptr) return Qnil; + beg += lex_gets_ptr; + } + pend = RSTRING(s)->ptr + RSTRING(s)->len; + end = beg; + while (end < pend) { + if (*end++ == '\n') break; + } + lex_gets_ptr = end - RSTRING(s)->ptr; + return rb_str_new(beg, end - beg); +} + +static VALUE +lex_getline() +{ + VALUE line = (*lex_gets)(lex_input); + if (ruby_debug_lines && !NIL_P(line)) { + rb_ary_push(ruby_debug_lines, line); + } + return line; +} + +NODE* +rb_compile_string(f, s, line) + const char *f; + VALUE s; + int line; +{ + lex_gets = lex_get_str; + lex_gets_ptr = 0; + lex_input = s; + lex_pbeg = lex_p = lex_pend = 0; + ruby_sourceline = line - 1; + compile_for_eval = ruby_in_eval; + + return yycompile(f, line); +} + +NODE* +rb_compile_cstr(f, s, len, line) + const char *f, *s; + int len, line; +{ + return rb_compile_string(f, rb_str_new(s, len), line); +} + +NODE* +rb_compile_file(f, file, start) + const char *f; + VALUE file; + int start; +{ + lex_gets = rb_io_gets; + lex_input = file; + lex_pbeg = lex_p = lex_pend = 0; + ruby_sourceline = start - 1; + + return yycompile(f, start); +} + +static inline int +nextc() +{ + int c; + + if (lex_p == lex_pend) { + if (lex_input) { + VALUE v = lex_getline(); + + if (NIL_P(v)) return -1; + if (heredoc_end > 0) { + ruby_sourceline = heredoc_end; + heredoc_end = 0; + } + ruby_sourceline++; + lex_pbeg = lex_p = RSTRING(v)->ptr; + lex_pend = lex_p + RSTRING(v)->len; + lex_lastline = v; + } + else { + lex_lastline = 0; + return -1; + } + } + c = (unsigned char)*lex_p++; + if (c == '\r' && lex_p < lex_pend && *lex_p == '\n') { + lex_p++; + c = '\n'; + } + + return c; +} + +static void +pushback(c) + int c; +{ + if (c == -1) return; + lex_p--; +} + +#define was_bol() (lex_p == lex_pbeg + 1) +#define peek(c) (lex_p != lex_pend && (c) == *lex_p) + +#define tokfix() (tokenbuf[tokidx]='\0') +#define tok() tokenbuf +#define toklen() tokidx +#define toklast() (tokidx>0?tokenbuf[tokidx-1]:0) + +static char* +newtok() +{ + tokidx = 0; + if (!tokenbuf) { + toksiz = 60; + tokenbuf = ALLOC_N(char, 60); + } + if (toksiz > 4096) { + toksiz = 60; + REALLOC_N(tokenbuf, char, 60); + } + return tokenbuf; +} + +static void +tokadd(c) + char c; +{ + tokenbuf[tokidx++] = c; + if (tokidx >= toksiz) { + toksiz *= 2; + REALLOC_N(tokenbuf, char, toksiz); + } +} + +static int +read_escape() +{ + int c; + + switch (c = nextc()) { + case '\\': /* Backslash */ + return c; + + case 'n': /* newline */ + return '\n'; + + case 't': /* horizontal tab */ + return '\t'; + + case 'r': /* carriage-return */ + return '\r'; + + case 'f': /* form-feed */ + return '\f'; + + case 'v': /* vertical tab */ + return '\13'; + + case 'a': /* alarm(bell) */ + return '\007'; + + case 'e': /* escape */ + return 033; + + case '0': case '1': case '2': case '3': /* octal constant */ + case '4': case '5': case '6': case '7': + { + int numlen; + + pushback(c); + c = scan_oct(lex_p, 3, &numlen); + lex_p += numlen; + } + return c; + + case 'x': /* hex constant */ + { + int numlen; + + c = scan_hex(lex_p, 2, &numlen); + if (numlen == 0) { + yyerror("Invalid escape character syntax"); + return 0; + } + lex_p += numlen; + } + return c; + + case 'b': /* backspace */ + return '\010'; + + case 's': /* space */ + return ' '; + + case 'M': + if ((c = nextc()) != '-') { + yyerror("Invalid escape character syntax"); + pushback(c); + return '\0'; + } + if ((c = nextc()) == '\\') { + return read_escape() | 0x80; + } + else if (c == -1) goto eof; + else { + return ((c & 0xff) | 0x80); + } + + case 'C': + if ((c = nextc()) != '-') { + yyerror("Invalid escape character syntax"); + pushback(c); + return '\0'; + } + case 'c': + if ((c = nextc())== '\\') { + c = read_escape(); + } + else if (c == '?') + return 0177; + else if (c == -1) goto eof; + return c & 0x9f; + + eof: + case -1: + yyerror("Invalid escape character syntax"); + return '\0'; + + default: + return c; + } +} + +static int +tokadd_escape(term) + int term; +{ + int c; + + switch (c = nextc()) { + case '\n': + return 0; /* just ignore */ + + case '0': case '1': case '2': case '3': /* octal constant */ + case '4': case '5': case '6': case '7': + { + int i; + + tokadd('\\'); + tokadd(c); + for (i=0; i<2; i++) { + c = nextc(); + if (c == -1) goto eof; + if (c < '0' || '7' < c) { + pushback(c); + break; + } + tokadd(c); + } + } + return 0; + + case 'x': /* hex constant */ + { + int numlen; + + tokadd('\\'); + tokadd(c); + scan_hex(lex_p, 2, &numlen); + if (numlen == 0) { + yyerror("Invalid escape character syntax"); + return -1; + } + while (numlen--) + tokadd(nextc()); + } + return 0; + + case 'M': + if ((c = nextc()) != '-') { + yyerror("Invalid escape character syntax"); + pushback(c); + return 0; + } + tokadd('\\'); tokadd('M'); tokadd('-'); + goto escaped; + + case 'C': + if ((c = nextc()) != '-') { + yyerror("Invalid escape character syntax"); + pushback(c); + return 0; + } + tokadd('\\'); tokadd('C'); tokadd('-'); + goto escaped; + + case 'c': + tokadd('\\'); tokadd('c'); + escaped: + if ((c = nextc()) == '\\') { + return tokadd_escape(term); + } + else if (c == -1) goto eof; + tokadd(c); + return 0; + + eof: + case -1: + yyerror("Invalid escape character syntax"); + return -1; + + default: + if (c != '\\' || c != term) + tokadd('\\'); + tokadd(c); + } + return 0; +} + +static int +regx_options() +{ + char kcode = 0; + int options = 0; + int c; + + newtok(); + while (c = nextc(), ISALPHA(c)) { + switch (c) { + case 'i': + options |= RE_OPTION_IGNORECASE; + break; + case 'x': + options |= RE_OPTION_EXTENDED; + break; + case 'm': + options |= RE_OPTION_MULTILINE; + break; + case 'o': + options |= RE_OPTION_ONCE; + break; + case 'n': + kcode = 16; + break; + case 'e': + kcode = 32; + break; + case 's': + kcode = 48; + break; + case 'u': + kcode = 64; + break; + default: + tokadd(c); + break; + } + } + pushback(c); + if (toklen()) { + tokfix(); + rb_compile_error("unknown regexp option%s - %s", + toklen() > 1 ? "s" : "", tok()); + } + return options | kcode; +} + +#define STR_FUNC_ESCAPE 0x01 +#define STR_FUNC_EXPAND 0x02 +#define STR_FUNC_REGEXP 0x04 +#define STR_FUNC_QWORDS 0x08 +#define STR_FUNC_SYMBOL 0x10 +#define STR_FUNC_INDENT 0x20 + +enum string_type { + str_squote = (0), + str_dquote = (STR_FUNC_EXPAND), + str_xquote = (STR_FUNC_EXPAND), + str_regexp = (STR_FUNC_REGEXP|STR_FUNC_ESCAPE|STR_FUNC_EXPAND), + str_sword = (STR_FUNC_QWORDS), + str_dword = (STR_FUNC_QWORDS|STR_FUNC_EXPAND), + str_ssym = (STR_FUNC_SYMBOL), + str_dsym = (STR_FUNC_SYMBOL|STR_FUNC_EXPAND), +}; + +static void +dispose_string(str) + VALUE str; +{ + xfree(RSTRING(str)->ptr); + rb_gc_force_recycle(str); +} + +static int +tokadd_string(func, term, paren, nest) + int func, term, paren, *nest; +{ + int c; + + while ((c = nextc()) != -1) { + if (paren && c == paren) { + ++*nest; + } + else if (c == term) { + if (!nest || !*nest) { + pushback(c); + break; + } + --*nest; + } + else if ((func & STR_FUNC_EXPAND) && c == '#' && lex_p < lex_pend) { + int c2 = *lex_p; + if (c2 == '$' || c2 == '@' || c2 == '{') { + pushback(c); + break; + } + } + else if (c == '\\') { + c = nextc(); + switch (c) { + case '\n': + if (func & STR_FUNC_QWORDS) break; + if (func & STR_FUNC_EXPAND) continue; + tokadd('\\'); + break; + + case '\\': + if (func & STR_FUNC_ESCAPE) tokadd(c); + break; + + default: + if (func & STR_FUNC_REGEXP) { + pushback(c); + if (tokadd_escape(term) < 0) + return -1; + continue; + } + else if (func & STR_FUNC_EXPAND) { + pushback(c); + if (func & STR_FUNC_ESCAPE) tokadd('\\'); + c = read_escape(); + } + else if ((func & STR_FUNC_QWORDS) && ISSPACE(c)) { + /* ignore backslashed spaces in %w */ + } + else if (c != term && !(paren && c == paren)) { + tokadd('\\'); + } + } + } + else if (ismbchar(c)) { + int i, len = mbclen(c)-1; + + for (i = 0; i < len; i++) { + tokadd(c); + c = nextc(); + } + } + else if ((func & STR_FUNC_QWORDS) && ISSPACE(c)) { + pushback(c); + break; + } + if (!c && (func & STR_FUNC_SYMBOL)) { + func &= ~STR_FUNC_SYMBOL; + rb_compile_error("symbol cannot contain '\\0'"); + continue; + } + tokadd(c); + } + return c; +} + +#define NEW_STRTERM(func, term, paren) \ + rb_node_newnode(NODE_STRTERM, (func), (term) | ((paren) << (CHAR_BIT * 2)), 0) + +static int +parse_string(quote) + NODE *quote; +{ + int func = quote->nd_func; + int term = nd_term(quote); + int paren = nd_paren(quote); + int c, space = 0; + + if (func == -1) return tSTRING_END; + c = nextc(); + if ((func & STR_FUNC_QWORDS) && ISSPACE(c)) { + do {c = nextc();} while (ISSPACE(c)); + space = 1; + } + if (c == term && !quote->nd_nest) { + if (func & STR_FUNC_QWORDS) { + quote->nd_func = -1; + return ' '; + } + if (!(func & STR_FUNC_REGEXP)) return tSTRING_END; + yylval.num = regx_options(); + return tREGEXP_END; + } + if (space) { + pushback(c); + return ' '; + } + newtok(); + if ((func & STR_FUNC_EXPAND) && c == '#') { + switch (c = nextc()) { + case '$': + case '@': + pushback(c); + return tSTRING_DVAR; + case '{': + return tSTRING_DBEG; + } + tokadd('#'); + } + pushback(c); + if (tokadd_string(func, term, paren, "e->nd_nest) == -1) { + ruby_sourceline = nd_line(quote); + rb_compile_error("unterminated string meets end of file"); + return tSTRING_END; + } + + tokfix(); + yylval.node = NEW_STR(rb_str_new(tok(), toklen())); + return tSTRING_CONTENT; +} + +static int +heredoc_identifier() +{ + int c = nextc(), term, func = 0, len; + + if (c == '-') { + c = nextc(); + func = STR_FUNC_INDENT; + } + switch (c) { + case '\'': + func |= str_squote; goto quoted; + case '"': + func |= str_dquote; goto quoted; + case '`': + func |= str_xquote; + quoted: + newtok(); + tokadd(func); + term = c; + while ((c = nextc()) != -1 && c != term) { + len = mbclen(c); + do {tokadd(c);} while (--len > 0 && (c = nextc()) != -1); + } + if (c == -1) { + rb_compile_error("unterminated here document identifier"); + return 0; + } + break; + + default: + if (!is_identchar(c)) { + pushback(c); + if (func & STR_FUNC_INDENT) { + pushback('-'); + } + return 0; + } + newtok(); + term = '"'; + tokadd(func |= str_dquote); + do { + len = mbclen(c); + do {tokadd(c);} while (--len > 0 && (c = nextc()) != -1); + } while ((c = nextc()) != -1 && is_identchar(c)); + pushback(c); + break; + } + + tokfix(); + len = lex_p - lex_pbeg; + lex_p = lex_pend; + lex_strterm = rb_node_newnode(NODE_HEREDOC, + rb_str_new(tok(), toklen()), /* nd_lit */ + len, /* nd_nth */ + lex_lastline); /* nd_orig */ + return term == '`' ? tXSTRING_BEG : tSTRING_BEG; +} + +static void +heredoc_restore(here) + NODE *here; +{ + VALUE line = here->nd_orig; + lex_lastline = line; + lex_pbeg = RSTRING(line)->ptr; + lex_pend = lex_pbeg + RSTRING(line)->len; + lex_p = lex_pbeg + here->nd_nth; + heredoc_end = ruby_sourceline; + ruby_sourceline = nd_line(here); + dispose_string(here->nd_lit); + rb_gc_force_recycle((VALUE)here); +} + +static int +whole_match_p(eos, len, indent) + char *eos; + int len, indent; +{ + char *p = lex_pbeg; + int n; + + if (indent) { + while (*p && ISSPACE(*p)) p++; + } + n= lex_pend - (p + len); + if (n < 0 || (n > 0 && p[len] != '\n' && p[len] != '\r')) return Qfalse; + if (strncmp(eos, p, len) == 0) return Qtrue; + return Qfalse; +} + +static int +here_document(here) + NODE *here; +{ + int c, func, indent = 0; + char *eos, *p, *pend; + long len; + VALUE str = 0; + + eos = RSTRING(here->nd_lit)->ptr; + len = RSTRING(here->nd_lit)->len - 1; + indent = (func = *eos++) & STR_FUNC_INDENT; + + if ((c = nextc()) == -1) { + error: + rb_compile_error("can't find string \"%s\" anywhere before EOF", eos); + heredoc_restore(lex_strterm); + lex_strterm = 0; + return 0; + } + if (was_bol() && whole_match_p(eos, len, indent)) { + heredoc_restore(lex_strterm); + return tSTRING_END; + } + + if (!(func & STR_FUNC_EXPAND)) { + do { + p = RSTRING(lex_lastline)->ptr; + pend = lex_pend; + if (pend > p) { + switch (pend[-1]) { + case '\n': + if (--pend == p || pend[-1] != '\r') { + pend++; + break; + } + case '\r': + --pend; + } + } + if (str) + rb_str_cat(str, p, pend - p); + else + str = rb_str_new(p, pend - p); + if (pend < lex_pend) rb_str_cat(str, "\n", 1); + lex_p = lex_pend; + if (nextc() == -1) { + if (str) dispose_string(str); + goto error; + } + } while (!whole_match_p(eos, len, indent)); + } + else { + newtok(); + if (c == '#') { + switch (c = nextc()) { + case '$': + case '@': + pushback(c); + return tSTRING_DVAR; + case '{': + return tSTRING_DBEG; + } + tokadd('#'); + } + do { + pushback(c); + if ((c = tokadd_string(func, '\n', 0, NULL)) == -1) goto error; + if (c != '\n') { + yylval.node = NEW_STR(rb_str_new(tok(), toklen())); + return tSTRING_CONTENT; + } + tokadd(nextc()); + if ((c = nextc()) == -1) goto error; + } while (!whole_match_p(eos, len, indent)); + str = rb_str_new(tok(), toklen()); + } + heredoc_restore(lex_strterm); + lex_strterm = NEW_STRTERM(-1, 0, 0); + yylval.node = NEW_STR(str); + return tSTRING_CONTENT; +} + +#include "lex.c" + +static void +arg_ambiguous() +{ + rb_warning("ambiguous first argument; put parentheses or even spaces"); +} + +#define IS_ARG() (lex_state == EXPR_ARG || lex_state == EXPR_CMDARG) +#define IS_BEG() (lex_state == EXPR_BEG || lex_state == EXPR_MID || lex_state == EXPR_CLASS) + +static int +yylex() +{ + register int c; + int space_seen = 0; + int cmd_state; + enum lex_state last_state; + + if (lex_strterm) { + int token; + if (nd_type(lex_strterm) == NODE_HEREDOC) { + token = here_document(lex_strterm); + if (token == tSTRING_END) { + lex_strterm = 0; + lex_state = EXPR_END; + } + } + else { + token = parse_string(lex_strterm); + if (token == tSTRING_END || token == tREGEXP_END) { + rb_gc_force_recycle((VALUE)lex_strterm); + lex_strterm = 0; + lex_state = EXPR_END; + } + } + return token; + } + cmd_state = command_start; + command_start = Qfalse; + retry: + switch (c = nextc()) { + case '\0': /* NUL */ + case '\004': /* ^D */ + case '\032': /* ^Z */ + case -1: /* end of script. */ + return 0; + + /* white spaces */ + case ' ': case '\t': case '\f': case '\r': + case '\13': /* '\v' */ + space_seen++; + goto retry; + + case '#': /* it's a comment */ + while ((c = nextc()) != '\n') { + if (c == -1) + return 0; + } + /* fall through */ + case '\n': + switch (lex_state) { + case EXPR_BEG: + case EXPR_FNAME: + case EXPR_DOT: + case EXPR_CLASS: + goto retry; + default: + break; + } + command_start = Qtrue; + lex_state = EXPR_BEG; + return '\n'; + + case '*': + if ((c = nextc()) == '*') { + if ((c = nextc()) == '=') { + yylval.id = tPOW; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + pushback(c); + c = tPOW; + } + else { + if (c == '=') { + yylval.id = '*'; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + pushback(c); + if (IS_ARG() && space_seen && !ISSPACE(c)){ + rb_warning("`*' interpreted as argument prefix"); + c = tSTAR; + } + else if (IS_BEG()) { + c = tSTAR; + } + else { + c = '*'; + } + } + switch (lex_state) { + case EXPR_FNAME: case EXPR_DOT: + lex_state = EXPR_ARG; break; + default: + lex_state = EXPR_BEG; break; + } + return c; + + case '!': + lex_state = EXPR_BEG; + if ((c = nextc()) == '=') { + return tNEQ; + } + if (c == '~') { + return tNMATCH; + } + pushback(c); + return '!'; + + case '=': + if (was_bol()) { + /* skip embedded rd document */ + if (strncmp(lex_p, "begin", 5) == 0 && ISSPACE(lex_p[5])) { + for (;;) { + lex_p = lex_pend; + c = nextc(); + if (c == -1) { + rb_compile_error("embedded document meets end of file"); + return 0; + } + if (c != '=') continue; + if (strncmp(lex_p, "end", 3) == 0 && + (lex_p + 3 == lex_pend || ISSPACE(lex_p[3]))) { + break; + } + } + lex_p = lex_pend; + goto retry; + } + } + + switch (lex_state) { + case EXPR_FNAME: case EXPR_DOT: + lex_state = EXPR_ARG; break; + default: + lex_state = EXPR_BEG; break; + } + if ((c = nextc()) == '=') { + if ((c = nextc()) == '=') { + return tEQQ; + } + pushback(c); + return tEQ; + } + if (c == '~') { + return tMATCH; + } + else if (c == '>') { + return tASSOC; + } + pushback(c); + return '='; + + case '<': + c = nextc(); + if (c == '<' && + lex_state != EXPR_END && + lex_state != EXPR_DOT && + lex_state != EXPR_ENDARG && + lex_state != EXPR_CLASS && + (!IS_ARG() || space_seen)) { + int token = heredoc_identifier(); + if (token) return token; + } + switch (lex_state) { + case EXPR_FNAME: case EXPR_DOT: + lex_state = EXPR_ARG; break; + default: + lex_state = EXPR_BEG; break; + } + if (c == '=') { + if ((c = nextc()) == '>') { + return tCMP; + } + pushback(c); + return tLEQ; + } + if (c == '<') { + if ((c = nextc()) == '=') { + yylval.id = tLSHFT; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + pushback(c); + return tLSHFT; + } + pushback(c); + return '<'; + + case '>': + switch (lex_state) { + case EXPR_FNAME: case EXPR_DOT: + lex_state = EXPR_ARG; break; + default: + lex_state = EXPR_BEG; break; + } + if ((c = nextc()) == '=') { + return tGEQ; + } + if (c == '>') { + if ((c = nextc()) == '=') { + yylval.id = tRSHFT; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + pushback(c); + return tRSHFT; + } + pushback(c); + return '>'; + + case '"': + lex_strterm = NEW_STRTERM(str_dquote, '"', 0); + return tSTRING_BEG; + + case '`': + if (lex_state == EXPR_FNAME) { + lex_state = EXPR_END; + return c; + } + if (lex_state == EXPR_DOT) { + if (cmd_state) + lex_state = EXPR_CMDARG; + else + lex_state = EXPR_ARG; + return c; + } + lex_strterm = NEW_STRTERM(str_xquote, '`', 0); + return tXSTRING_BEG; + + case '\'': + lex_strterm = NEW_STRTERM(str_squote, '\'', 0); + return tSTRING_BEG; + + case '?': + if (lex_state == EXPR_END || lex_state == EXPR_ENDARG) { + lex_state = EXPR_BEG; + return '?'; + } + c = nextc(); + if (c == -1) { + rb_compile_error("incomplete character syntax"); + return 0; + } + if (ISSPACE(c)){ + if (!IS_ARG()){ + int c2 = 0; + switch (c) { + case ' ': + c2 = 's'; + break; + case '\n': + c2 = 'n'; + break; + case '\t': + c2 = 't'; + break; + case '\v': + c2 = 'v'; + break; + case '\r': + c2 = 'r'; + break; + case '\f': + c2 = 'f'; + break; + } + if (c2) { + rb_warn("invalid character syntax; use ?\\%c", c2); + } + } + ternary: + pushback(c); + lex_state = EXPR_BEG; + return '?'; + } + else if (ismbchar(c)) { + rb_warn("multibyte character literal not supported yet; use ?\\%.3o", c); + goto ternary; + } + else if ((ISALNUM(c) || c == '_') && lex_p < lex_pend && is_identchar(*lex_p)) { + goto ternary; + } + else if (c == '\\') { + c = read_escape(); + } + c &= 0xff; + lex_state = EXPR_END; + yylval.node = NEW_LIT(INT2FIX(c)); + return tINTEGER; + + case '&': + if ((c = nextc()) == '&') { + lex_state = EXPR_BEG; + if ((c = nextc()) == '=') { + yylval.id = tANDOP; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + pushback(c); + return tANDOP; + } + else if (c == '=') { + yylval.id = '&'; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + pushback(c); + if (IS_ARG() && space_seen && !ISSPACE(c)){ + rb_warning("`&' interpreted as argument prefix"); + c = tAMPER; + } + else if (IS_BEG()) { + c = tAMPER; + } + else { + c = '&'; + } + switch (lex_state) { + case EXPR_FNAME: case EXPR_DOT: + lex_state = EXPR_ARG; break; + default: + lex_state = EXPR_BEG; + } + return c; + + case '|': + if ((c = nextc()) == '|') { + lex_state = EXPR_BEG; + if ((c = nextc()) == '=') { + yylval.id = tOROP; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + pushback(c); + return tOROP; + } + if (c == '=') { + yylval.id = '|'; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { + lex_state = EXPR_ARG; + } + else { + lex_state = EXPR_BEG; + } + pushback(c); + return '|'; + + case '+': + c = nextc(); + if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { + lex_state = EXPR_ARG; + if (c == '@') { + return tUPLUS; + } + pushback(c); + return '+'; + } + if (c == '=') { + yylval.id = '+'; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + if (IS_BEG() || + (IS_ARG() && space_seen && !ISSPACE(c))) { + if (IS_ARG()) arg_ambiguous(); + lex_state = EXPR_BEG; + pushback(c); + if (ISDIGIT(c)) { + c = '+'; + goto start_num; + } + return tUPLUS; + } + lex_state = EXPR_BEG; + pushback(c); + return '+'; + + case '-': + c = nextc(); + if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { + lex_state = EXPR_ARG; + if (c == '@') { + return tUMINUS; + } + pushback(c); + return '-'; + } + if (c == '=') { + yylval.id = '-'; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + if (IS_BEG() || + (IS_ARG() && space_seen && !ISSPACE(c))) { + if (IS_ARG()) arg_ambiguous(); + lex_state = EXPR_BEG; + pushback(c); + if (ISDIGIT(c)) { + return tUMINUS_NUM; + } + return tUMINUS; + } + lex_state = EXPR_BEG; + pushback(c); + return '-'; + + case '.': + lex_state = EXPR_BEG; + if ((c = nextc()) == '.') { + if ((c = nextc()) == '.') { + return tDOT3; + } + pushback(c); + return tDOT2; + } + pushback(c); + if (ISDIGIT(c)) { + yyerror("no .<digit> floating literal anymore; put 0 before dot"); + } + lex_state = EXPR_DOT; + return '.'; + + start_num: + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + int is_float, seen_point, seen_e, nondigit; + + is_float = seen_point = seen_e = nondigit = 0; + lex_state = EXPR_END; + newtok(); + if (c == '-' || c == '+') { + tokadd(c); + c = nextc(); + } + if (c == '0') { + int start = toklen(); + c = nextc(); + if (c == 'x' || c == 'X') { + /* hexadecimal */ + c = nextc(); + if (ISXDIGIT(c)) { + do { + if (c == '_') { + if (nondigit) break; + nondigit = c; + continue; + } + if (!ISXDIGIT(c)) break; + nondigit = 0; + tokadd(c); + } while ((c = nextc()) != -1); + } + pushback(c); + tokfix(); + if (toklen() == start) { + yyerror("numeric literal without digits"); + } + else if (nondigit) goto trailing_uc; + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 16, Qfalse)); + return tINTEGER; + } + if (c == 'b' || c == 'B') { + /* binary */ + c = nextc(); + if (c == '0' || c == '1') { + do { + if (c == '_') { + if (nondigit) break; + nondigit = c; + continue; + } + if (c != '0' && c != '1') break; + nondigit = 0; + tokadd(c); + } while ((c = nextc()) != -1); + } + pushback(c); + tokfix(); + if (toklen() == start) { + yyerror("numeric literal without digits"); + } + else if (nondigit) goto trailing_uc; + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 2, Qfalse)); + return tINTEGER; + } + if (c == 'd' || c == 'D') { + /* decimal */ + c = nextc(); + if (ISDIGIT(c)) { + do { + if (c == '_') { + if (nondigit) break; + nondigit = c; + continue; + } + if (!ISDIGIT(c)) break; + nondigit = 0; + tokadd(c); + } while ((c = nextc()) != -1); + } + pushback(c); + tokfix(); + if (toklen() == start) { + yyerror("numeric literal without digits"); + } + else if (nondigit) goto trailing_uc; + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 10, Qfalse)); + return tINTEGER; + } + if (c == '_') { + /* 0_0 */ + goto octal_number; + } + if (c == 'o' || c == 'O') { + /* prefixed octal */ + c = nextc(); + if (c == '_') { + yyerror("numeric literal without digits"); + } + } + if (c >= '0' && c <= '7') { + /* octal */ + octal_number: + do { + if (c == '_') { + if (nondigit) break; + nondigit = c; + continue; + } + if (c < '0' || c > '9') break; + if (c > '7') goto invalid_octal; + nondigit = 0; + tokadd(c); + } while ((c = nextc()) != -1); + if (toklen() > start) { + pushback(c); + tokfix(); + if (nondigit) goto trailing_uc; + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 8, Qfalse)); + return tINTEGER; + } + if (nondigit) { + pushback(c); + goto trailing_uc; + } + } + if (c > '7' && c <= '9') { + invalid_octal: + yyerror("Illegal octal digit"); + } + else if (c == '.' || c == 'e' || c == 'E') { + tokadd('0'); + } + else { + pushback(c); + yylval.node = NEW_LIT(INT2FIX(0)); + return tINTEGER; + } + } + + for (;;) { + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + nondigit = 0; + tokadd(c); + break; + + case '.': + if (nondigit) goto trailing_uc; + if (seen_point || seen_e) { + goto decode_num; + } + else { + int c0 = nextc(); + if (!ISDIGIT(c0)) { + pushback(c0); + goto decode_num; + } + c = c0; + } + tokadd('.'); + tokadd(c); + is_float++; + seen_point++; + nondigit = 0; + break; + + case 'e': + case 'E': + if (nondigit) { + pushback(c); + c = nondigit; + goto decode_num; + } + if (seen_e) { + goto decode_num; + } + tokadd(c); + seen_e++; + is_float++; + nondigit = c; + c = nextc(); + if (c != '-' && c != '+') continue; + tokadd(c); + nondigit = c; + break; + + case '_': /* `_' in number just ignored */ + if (nondigit) goto decode_num; + nondigit = c; + break; + + default: + goto decode_num; + } + c = nextc(); + } + + decode_num: + pushback(c); + tokfix(); + if (nondigit) { + char tmp[30]; + trailing_uc: + sprintf(tmp, "trailing `%c' in number", nondigit); + yyerror(tmp); + } + if (is_float) { + double d = strtod(tok(), 0); + if (errno == ERANGE) { + rb_warn("Float %s out of range", tok()); + errno = 0; + } + yylval.node = NEW_LIT(rb_float_new(d)); + return tFLOAT; + } + yylval.node = NEW_LIT(rb_cstr_to_inum(tok(), 10, Qfalse)); + return tINTEGER; + } + + case ']': + case '}': + case ')': + COND_LEXPOP(); + CMDARG_LEXPOP(); + lex_state = EXPR_END; + return c; + + case ':': + c = nextc(); + if (c == ':') { + if (IS_BEG() || (IS_ARG() && space_seen)) { + lex_state = EXPR_BEG; + return tCOLON3; + } + lex_state = EXPR_DOT; + return tCOLON2; + } + if (lex_state == EXPR_END || lex_state == EXPR_ENDARG || ISSPACE(c)) { + pushback(c); + lex_state = EXPR_BEG; + return ':'; + } + switch (c) { + case '\'': + lex_strterm = NEW_STRTERM(str_ssym, c, 0); + break; + case '"': + lex_strterm = NEW_STRTERM(str_dsym, c, 0); + break; + default: + pushback(c); + break; + } + lex_state = EXPR_FNAME; + return tSYMBEG; + + case '/': + if (IS_BEG()) { + lex_strterm = NEW_STRTERM(str_regexp, '/', 0); + return tREGEXP_BEG; + } + if ((c = nextc()) == '=') { + yylval.id = '/'; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + pushback(c); + if (IS_ARG() && space_seen) { + if (!ISSPACE(c)) { + arg_ambiguous(); + lex_strterm = NEW_STRTERM(str_regexp, '/', 0); + return tREGEXP_BEG; + } + } + switch (lex_state) { + case EXPR_FNAME: case EXPR_DOT: + lex_state = EXPR_ARG; break; + default: + lex_state = EXPR_BEG; break; + } + return '/'; + + case '^': + if ((c = nextc()) == '=') { + yylval.id = '^'; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + switch (lex_state) { + case EXPR_FNAME: case EXPR_DOT: + lex_state = EXPR_ARG; break; + default: + lex_state = EXPR_BEG; break; + } + pushback(c); + return '^'; + + case ';': + command_start = Qtrue; + case ',': + lex_state = EXPR_BEG; + return c; + + case '~': + if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { + if ((c = nextc()) != '@') { + pushback(c); + } + } + switch (lex_state) { + case EXPR_FNAME: case EXPR_DOT: + lex_state = EXPR_ARG; break; + default: + lex_state = EXPR_BEG; break; + } + return '~'; + + case '(': + command_start = Qtrue; + if (IS_BEG()) { + c = tLPAREN; + } + else if (space_seen) { + if (lex_state == EXPR_CMDARG) { + c = tLPAREN_ARG; + } + else if (lex_state == EXPR_ARG) { + rb_warn("don't put space before argument parentheses"); + c = '('; + } + } + COND_PUSH(0); + CMDARG_PUSH(0); + lex_state = EXPR_BEG; + return c; + + case '[': + if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { + lex_state = EXPR_ARG; + if ((c = nextc()) == ']') { + if ((c = nextc()) == '=') { + return tASET; + } + pushback(c); + return tAREF; + } + pushback(c); + return '['; + } + else if (IS_BEG()) { + c = tLBRACK; + } + else if (IS_ARG() && space_seen) { + c = tLBRACK; + } + lex_state = EXPR_BEG; + COND_PUSH(0); + CMDARG_PUSH(0); + return c; + + case '{': + if (IS_ARG() || lex_state == EXPR_END) + c = '{'; /* block (primary) */ + else if (lex_state == EXPR_ENDARG) + c = tLBRACE_ARG; /* block (expr) */ + else + c = tLBRACE; /* hash */ + COND_PUSH(0); + CMDARG_PUSH(0); + lex_state = EXPR_BEG; + return c; + + case '\\': + c = nextc(); + if (c == '\n') { + space_seen = 1; + goto retry; /* skip \\n */ + } + pushback(c); + return '\\'; + + case '%': + if (IS_BEG()) { + int term; + int paren; + + c = nextc(); + quotation: + if (!ISALNUM(c)) { + term = c; + c = 'Q'; + } + else { + term = nextc(); + if (ISALNUM(term) || ismbchar(term)) { + yyerror("unknown type of %string"); + return 0; + } + } + if (c == -1 || term == -1) { + rb_compile_error("unterminated quoted string meets end of file"); + return 0; + } + paren = term; + if (term == '(') term = ')'; + else if (term == '[') term = ']'; + else if (term == '{') term = '}'; + else if (term == '<') term = '>'; + else paren = 0; + + switch (c) { + case 'Q': + lex_strterm = NEW_STRTERM(str_dquote, term, paren); + return tSTRING_BEG; + + case 'q': + lex_strterm = NEW_STRTERM(str_squote, term, paren); + return tSTRING_BEG; + + case 'W': + lex_strterm = NEW_STRTERM(str_dword, term, paren); + do {c = nextc();} while (ISSPACE(c)); + pushback(c); + return tWORDS_BEG; + + case 'w': + lex_strterm = NEW_STRTERM(str_sword, term, paren); + do {c = nextc();} while (ISSPACE(c)); + pushback(c); + return tQWORDS_BEG; + + case 'x': + lex_strterm = NEW_STRTERM(str_xquote, term, paren); + return tXSTRING_BEG; + + case 'r': + lex_strterm = NEW_STRTERM(str_regexp, term, paren); + return tREGEXP_BEG; + + case 's': + lex_strterm = NEW_STRTERM(str_ssym, term, paren); + lex_state = EXPR_FNAME; + return tSYMBEG; + + default: + yyerror("unknown type of %string"); + return 0; + } + } + if ((c = nextc()) == '=') { + yylval.id = '%'; + lex_state = EXPR_BEG; + return tOP_ASGN; + } + if (IS_ARG() && space_seen && !ISSPACE(c)) { + goto quotation; + } + switch (lex_state) { + case EXPR_FNAME: case EXPR_DOT: + lex_state = EXPR_ARG; break; + default: + lex_state = EXPR_BEG; break; + } + pushback(c); + return '%'; + + case '$': + last_state = lex_state; + lex_state = EXPR_END; + newtok(); + c = nextc(); + switch (c) { + case '_': /* $_: last read line string */ + c = nextc(); + if (is_identchar(c)) { + tokadd('$'); + tokadd('_'); + break; + } + pushback(c); + c = '_'; + /* fall through */ + case '~': /* $~: match-data */ + local_cnt(c); + /* fall through */ + case '*': /* $*: argv */ + case '$': /* $$: pid */ + case '?': /* $?: last status */ + case '!': /* $!: error string */ + case '@': /* $@: error position */ + case '/': /* $/: input record separator */ + case '\\': /* $\: output record separator */ + case ';': /* $;: field separator */ + case ',': /* $,: output field separator */ + case '.': /* $.: last read line number */ + case '=': /* $=: ignorecase */ + case ':': /* $:: load path */ + case '<': /* $<: reading filename */ + case '>': /* $>: default output handle */ + case '\"': /* $": already loaded files */ + tokadd('$'); + tokadd(c); + tokfix(); + yylval.id = rb_intern(tok()); + return tGVAR; + + case '-': + tokadd('$'); + tokadd(c); + c = nextc(); + if (is_identchar(c)) { + tokadd(c); + } + else { + pushback(c); + } + gvar: + tokfix(); + yylval.id = rb_intern(tok()); + /* xxx shouldn't check if valid option variable */ + return tGVAR; + + case '&': /* $&: last match */ + case '`': /* $`: string before last match */ + case '\'': /* $': string after last match */ + case '+': /* $+: string matches last paren. */ + if (last_state == EXPR_FNAME) { + tokadd('$'); + tokadd(c); + goto gvar; + } + yylval.node = NEW_BACK_REF(c); + return tBACK_REF; + + case '1': case '2': case '3': + case '4': case '5': case '6': + case '7': case '8': case '9': + tokadd('$'); + do { + tokadd(c); + c = nextc(); + } while (ISDIGIT(c)); + pushback(c); + if (last_state == EXPR_FNAME) goto gvar; + tokfix(); + yylval.node = NEW_NTH_REF(atoi(tok()+1)); + return tNTH_REF; + + default: + if (!is_identchar(c)) { + pushback(c); + return '$'; + } + case '0': + tokadd('$'); + } + break; + + case '@': + c = nextc(); + newtok(); + tokadd('@'); + if (c == '@') { + tokadd('@'); + c = nextc(); + } + if (ISDIGIT(c)) { + if (tokidx == 1) { + rb_compile_error("`@%c' is not allowed as an instance variable name", c); + } + else { + rb_compile_error("`@@%c' is not allowed as a class variable name", c); + } + return 0; + } + if (!is_identchar(c)) { + pushback(c); + return '@'; + } + break; + + case '_': + if (was_bol() && whole_match_p("__END__", 7, 0)) { + ruby__end__seen = 1; + lex_lastline = 0; + return -1; + } + newtok(); + break; + + default: + if (!is_identchar(c)) { + rb_compile_error("Invalid char `\\%03o' in expression", c); + goto retry; + } + + newtok(); + break; + } + + do { + tokadd(c); + if (ismbchar(c)) { + int i, len = mbclen(c)-1; + + for (i = 0; i < len; i++) { + c = nextc(); + tokadd(c); + } + } + c = nextc(); + } while (is_identchar(c)); + if ((c == '!' || c == '?') && is_identchar(tok()[0]) && !peek('=')) { + tokadd(c); + } + else { + pushback(c); + } + tokfix(); + + { + int result = 0; + + last_state = lex_state; + switch (tok()[0]) { + case '$': + lex_state = EXPR_END; + result = tGVAR; + break; + case '@': + lex_state = EXPR_END; + if (tok()[1] == '@') + result = tCVAR; + else + result = tIVAR; + break; + + default: + if (toklast() == '!' || toklast() == '?') { + result = tFID; + } + else { + if (lex_state == EXPR_FNAME) { + if ((c = nextc()) == '=' && !peek('~') && !peek('>') && + (!peek('=') || (lex_p + 1 < lex_pend && lex_p[1] == '>'))) { + result = tIDENTIFIER; + tokadd(c); + tokfix(); + } + else { + pushback(c); + } + } + if (result == 0 && ISUPPER(tok()[0])) { + result = tCONSTANT; + } + else { + result = tIDENTIFIER; + } + } + + if (lex_state != EXPR_DOT) { + struct kwtable *kw; + + /* See if it is a reserved word. */ + kw = rb_reserved_word(tok(), toklen()); + if (kw) { + enum lex_state state = lex_state; + lex_state = kw->state; + if (state == EXPR_FNAME) { + yylval.id = rb_intern(kw->name); + return kw->id[0]; + } + if (kw->id[0] == kDO) { + if (COND_P()) return kDO_COND; + if (CMDARG_P() && state != EXPR_CMDARG) + return kDO_BLOCK; + if (state == EXPR_ENDARG) + return kDO_BLOCK; + return kDO; + } + if (state == EXPR_BEG) + return kw->id[0]; + else { + if (kw->id[0] != kw->id[1]) + lex_state = EXPR_BEG; + return kw->id[1]; + } + } + } + + if (lex_state == EXPR_BEG || + lex_state == EXPR_MID || + lex_state == EXPR_DOT || + lex_state == EXPR_ARG || + lex_state == EXPR_CLASS || + lex_state == EXPR_CMDARG) { + if (cmd_state) { + lex_state = EXPR_CMDARG; + } + else { + lex_state = EXPR_ARG; + } + } + else { + lex_state = EXPR_END; + } + } + yylval.id = rb_intern(tok()); + if (is_local_id(yylval.id) && + last_state != EXPR_DOT && + ((dyna_in_block() && rb_dvar_defined(yylval.id)) || local_id(yylval.id))) { + lex_state = EXPR_END; + } + return result; + } +} + +NODE* +rb_node_newnode(type, a0, a1, a2) + enum node_type type; + VALUE a0, a1, a2; +{ + NODE *n = (NODE*)rb_newobj(); + + n->flags |= T_NODE; + nd_set_type(n, type); + nd_set_line(n, ruby_sourceline); + n->nd_file = ruby_sourcefile; + + n->u1.value = a0; + n->u2.value = a1; + n->u3.value = a2; + + return n; +} + +static enum node_type +nodetype(node) /* for debug */ + NODE *node; +{ + return (enum node_type)nd_type(node); +} + +static int +nodeline(node) + NODE *node; +{ + return nd_line(node); +} + +static NODE* +newline_node(node) + NODE *node; +{ + NODE *nl = 0; + if (node) { + int line; + if (nd_type(node) == NODE_NEWLINE) return node; + line = nd_line(node); + node = remove_begin(node); + nl = NEW_NEWLINE(node); + nd_set_line(nl, line); + nl->nd_nth = line; + } + return nl; +} + +static void +fixpos(node, orig) + NODE *node, *orig; +{ + if (!node) return; + if (!orig) return; + if (orig == (NODE*)1) return; + node->nd_file = orig->nd_file; + nd_set_line(node, nd_line(orig)); +} + +static void +parser_warning(node, mesg) + NODE *node; + const char *mesg; +{ + int line = ruby_sourceline; + ruby_sourceline = nd_line(node); + rb_warning("%s", mesg); + ruby_sourceline = line; +} + +static void +parser_warn(node, mesg) + NODE *node; + const char *mesg; +{ + int line = ruby_sourceline; + ruby_sourceline = nd_line(node); + rb_warn("%s", mesg); + ruby_sourceline = line; +} + +static NODE* +block_append(head, tail) + NODE *head, *tail; +{ + NODE *end, *h = head; + + if (tail == 0) return head; + + again: + if (h == 0) return tail; + switch (nd_type(h)) { + case NODE_NEWLINE: + h = h->nd_next; + goto again; + case NODE_LIT: + case NODE_STR: + parser_warning(h, "unused literal ignored"); + return tail; + default: + h = end = NEW_BLOCK(head); + end->nd_end = end; + fixpos(end, head); + head = end; + break; + case NODE_BLOCK: + end = h->nd_end; + break; + } + + if (RTEST(ruby_verbose)) { + NODE *nd = end->nd_head; + newline: + switch (nd_type(nd)) { + case NODE_RETURN: + case NODE_BREAK: + case NODE_NEXT: + case NODE_REDO: + case NODE_RETRY: + parser_warning(nd, "statement not reached"); + break; + + case NODE_NEWLINE: + nd = nd->nd_next; + goto newline; + + default: + break; + } + } + + if (nd_type(tail) != NODE_BLOCK) { + tail = NEW_BLOCK(tail); + tail->nd_end = tail; + } + end->nd_next = tail; + h->nd_end = tail->nd_end; + return head; +} + +/* append item to the list */ +static NODE* +list_append(list, item) + NODE *list, *item; +{ + NODE *last; + + if (list == 0) return NEW_LIST(item); + if (list->nd_next) { + last = list->nd_next->nd_end; + } + else { + last = list; + } + + list->nd_alen += 1; + last->nd_next = NEW_LIST(item); + list->nd_next->nd_end = last->nd_next; + return list; +} + +/* concat two lists */ +static NODE* +list_concat(head, tail) + NODE *head, *tail; +{ + NODE *last; + + if (head->nd_next) { + last = head->nd_next->nd_end; + } + else { + last = head; + } + + head->nd_alen += tail->nd_alen; + last->nd_next = tail; + if (tail->nd_next) { + head->nd_next->nd_end = tail->nd_next->nd_end; + } + else { + head->nd_next->nd_end = tail; + } + + return head; +} + +/* concat two string literals */ +static NODE * +literal_concat(head, tail) + NODE *head, *tail; +{ + enum node_type htype; + + if (!head) return tail; + if (!tail) return head; + + htype = nd_type(head); + if (htype == NODE_EVSTR) { + NODE *node = NEW_DSTR(rb_str_new(0, 0)); + head = list_append(node, head); + } + switch (nd_type(tail)) { + case NODE_STR: + if (htype == NODE_STR) { + rb_str_concat(head->nd_lit, tail->nd_lit); + rb_gc_force_recycle((VALUE)tail); + } + else { + list_append(head, tail); + } + break; + + case NODE_DSTR: + if (htype == NODE_STR) { + rb_str_concat(head->nd_lit, tail->nd_lit); + tail->nd_lit = head->nd_lit; + rb_gc_force_recycle((VALUE)head); + head = tail; + } + else { + nd_set_type(tail, NODE_ARRAY); + tail->nd_head = NEW_STR(tail->nd_lit); + list_concat(head, tail); + } + break; + + case NODE_EVSTR: + if (htype == NODE_STR) { + nd_set_type(head, NODE_DSTR); + head->nd_alen = 1; + } + list_append(head, tail); + break; + } + return head; +} + +static NODE * +evstr2dstr(node) + NODE *node; +{ + if (nd_type(node) == NODE_EVSTR) { + node = list_append(NEW_DSTR(rb_str_new(0, 0)), node); + } + return node; +} + +static NODE * +new_evstr(node) + NODE *node; +{ + NODE *head = node; + + again: + if (node) { + switch (nd_type(node)) { + case NODE_STR: case NODE_DSTR: case NODE_EVSTR: + return node; + case NODE_NEWLINE: + node = node->nd_next; + goto again; + } + } + return NEW_EVSTR(head); +} + +static NODE * +call_op(recv, id, narg, arg1) + NODE *recv; + ID id; + int narg; + NODE *arg1; +{ + value_expr(recv); + if (narg == 1) { + value_expr(arg1); + arg1 = NEW_LIST(arg1); + } + else { + arg1 = 0; + } + return NEW_CALL(recv, id, arg1); +} + +static NODE* +match_gen(node1, node2) + NODE *node1; + NODE *node2; +{ + local_cnt('~'); + + value_expr(node1); + value_expr(node2); + if (node1) { + switch (nd_type(node1)) { + case NODE_DREGX: + case NODE_DREGX_ONCE: + return NEW_MATCH2(node1, node2); + + case NODE_LIT: + if (TYPE(node1->nd_lit) == T_REGEXP) { + return NEW_MATCH2(node1, node2); + } + } + } + + if (node2) { + switch (nd_type(node2)) { + case NODE_DREGX: + case NODE_DREGX_ONCE: + return NEW_MATCH3(node2, node1); + + case NODE_LIT: + if (TYPE(node2->nd_lit) == T_REGEXP) { + return NEW_MATCH3(node2, node1); + } + } + } + + return NEW_CALL(node1, tMATCH, NEW_LIST(node2)); +} + +static NODE* +gettable(id) + ID id; +{ + if (id == kSELF) { + return NEW_SELF(); + } + else if (id == kNIL) { + return NEW_NIL(); + } + else if (id == kTRUE) { + return NEW_TRUE(); + } + else if (id == kFALSE) { + return NEW_FALSE(); + } + else if (id == k__FILE__) { + return NEW_STR(rb_str_new2(ruby_sourcefile)); + } + else if (id == k__LINE__) { + return NEW_LIT(INT2FIX(ruby_sourceline)); + } + else if (is_local_id(id)) { + if (dyna_in_block() && rb_dvar_defined(id)) return NEW_DVAR(id); + if (local_id(id)) return NEW_LVAR(id); + /* method call without arguments */ +#if 0 + /* Rite will warn this */ + rb_warn("ambiguous identifier; %s() or self.%s is better for method call", + rb_id2name(id), rb_id2name(id)); +#endif + return NEW_VCALL(id); + } + else if (is_global_id(id)) { + return NEW_GVAR(id); + } + else if (is_instance_id(id)) { + return NEW_IVAR(id); + } + else if (is_const_id(id)) { + return NEW_CONST(id); + } + else if (is_class_id(id)) { + return NEW_CVAR(id); + } + rb_compile_error("identifier %s is not valid", rb_id2name(id)); + return 0; +} + +static VALUE dyna_var_lookup _((ID id)); + +static NODE* +assignable(id, val) + ID id; + NODE *val; +{ + value_expr(val); + if (id == kSELF) { + yyerror("Can't change the value of self"); + } + else if (id == kNIL) { + yyerror("Can't assign to nil"); + } + else if (id == kTRUE) { + yyerror("Can't assign to true"); + } + else if (id == kFALSE) { + yyerror("Can't assign to false"); + } + else if (id == k__FILE__) { + yyerror("Can't assign to __FILE__"); + } + else if (id == k__LINE__) { + yyerror("Can't assign to __LINE__"); + } + else if (is_local_id(id)) { + if (rb_dvar_curr(id)) { + return NEW_DASGN_CURR(id, val); + } + else if (dyna_var_lookup(id)) { + return NEW_DASGN(id, val); + } + else if (local_id(id) || !dyna_in_block()) { + return NEW_LASGN(id, val); + } + else{ + rb_dvar_push(id, Qnil); + return NEW_DASGN_CURR(id, val); + } + } + else if (is_global_id(id)) { + return NEW_GASGN(id, val); + } + else if (is_instance_id(id)) { + return NEW_IASGN(id, val); + } + else if (is_const_id(id)) { + if (in_def || in_single) + yyerror("dynamic constant assignment"); + return NEW_CDECL(id, val, 0); + } + else if (is_class_id(id)) { + if (in_def || in_single) return NEW_CVASGN(id, val); + return NEW_CVDECL(id, val); + } + else { + rb_compile_error("identifier %s is not valid", rb_id2name(id)); + } + return 0; +} + +static NODE * +aryset(recv, idx) + NODE *recv, *idx; +{ + if (recv && nd_type(recv) == NODE_SELF) + recv = (NODE *)1; + else + value_expr(recv); + return NEW_ATTRASGN(recv, tASET, idx); +} + +ID +rb_id_attrset(id) + ID id; +{ + id &= ~ID_SCOPE_MASK; + id |= ID_ATTRSET; + return id; +} + +static NODE * +attrset(recv, id) + NODE *recv; + ID id; +{ + if (recv && nd_type(recv) == NODE_SELF) + recv = (NODE *)1; + else + value_expr(recv); + return NEW_ATTRASGN(recv, rb_id_attrset(id), 0); +} + +static void +rb_backref_error(node) + NODE *node; +{ + switch (nd_type(node)) { + case NODE_NTH_REF: + rb_compile_error("Can't set variable $%d", node->nd_nth); + break; + case NODE_BACK_REF: + rb_compile_error("Can't set variable $%c", (int)node->nd_nth); + break; + } +} + +static NODE * +arg_concat(node1, node2) + NODE *node1; + NODE *node2; +{ + if (!node2) return node1; + return NEW_ARGSCAT(node1, node2); +} + +static NODE * +arg_add(node1, node2) + NODE *node1; + NODE *node2; +{ + if (!node1) return NEW_LIST(node2); + if (nd_type(node1) == NODE_ARRAY) { + return list_append(node1, node2); + } + else { + return NEW_ARGSPUSH(node1, node2); + } +} + +static NODE* +node_assign(lhs, rhs) + NODE *lhs, *rhs; +{ + if (!lhs) return 0; + + value_expr(rhs); + switch (nd_type(lhs)) { + case NODE_GASGN: + case NODE_IASGN: + case NODE_LASGN: + case NODE_DASGN: + case NODE_DASGN_CURR: + case NODE_MASGN: + case NODE_CDECL: + case NODE_CVDECL: + case NODE_CVASGN: + lhs->nd_value = rhs; + break; + + case NODE_ATTRASGN: + case NODE_CALL: + lhs->nd_args = arg_add(lhs->nd_args, rhs); + break; + + default: + /* should not happen */ + break; + } + + return lhs; +} + +static int +value_expr0(node) + NODE *node; +{ + int cond = 0; + + while (node) { + switch (nd_type(node)) { + case NODE_DEFN: + case NODE_DEFS: + parser_warning(node, "void value expression"); + return Qfalse; + + case NODE_RETURN: + case NODE_BREAK: + case NODE_NEXT: + case NODE_REDO: + case NODE_RETRY: + if (!cond) yyerror("void value expression"); + /* or "control never reach"? */ + return Qfalse; + + case NODE_BLOCK: + while (node->nd_next) { + node = node->nd_next; + } + node = node->nd_head; + break; + + case NODE_BEGIN: + node = node->nd_body; + break; + + case NODE_IF: + if (!value_expr(node->nd_body)) return Qfalse; + node = node->nd_else; + break; + + case NODE_AND: + case NODE_OR: + cond = 1; + node = node->nd_2nd; + break; + + case NODE_NEWLINE: + node = node->nd_next; + break; + + default: + return Qtrue; + } + } + + return Qtrue; +} + +static void +void_expr0(node) + NODE *node; +{ + char *useless = 0; + + if (!RTEST(ruby_verbose)) return; + + again: + if (!node) return; + switch (nd_type(node)) { + case NODE_NEWLINE: + node = node->nd_next; + goto again; + + case NODE_CALL: + switch (node->nd_mid) { + case '+': + case '-': + case '*': + case '/': + case '%': + case tPOW: + case tUPLUS: + case tUMINUS: + case '|': + case '^': + case '&': + case tCMP: + case '>': + case tGEQ: + case '<': + case tLEQ: + case tEQ: + case tNEQ: + useless = rb_id2name(node->nd_mid); + break; + } + break; + + case NODE_LVAR: + case NODE_DVAR: + case NODE_GVAR: + case NODE_IVAR: + case NODE_CVAR: + case NODE_NTH_REF: + case NODE_BACK_REF: + useless = "a variable"; + break; + case NODE_CONST: + case NODE_CREF: + useless = "a constant"; + break; + case NODE_LIT: + case NODE_STR: + case NODE_DSTR: + case NODE_DREGX: + case NODE_DREGX_ONCE: + useless = "a literal"; + break; + case NODE_COLON2: + case NODE_COLON3: + useless = "::"; + break; + case NODE_DOT2: + useless = ".."; + break; + case NODE_DOT3: + useless = "..."; + break; + case NODE_SELF: + useless = "self"; + break; + case NODE_NIL: + useless = "nil"; + break; + case NODE_TRUE: + useless = "true"; + break; + case NODE_FALSE: + useless = "false"; + break; + case NODE_DEFINED: + useless = "defined?"; + break; + } + + if (useless) { + int line = ruby_sourceline; + + ruby_sourceline = nd_line(node); + rb_warn("useless use of %s in void context", useless); + ruby_sourceline = line; + } +} + +static void +void_stmts(node) + NODE *node; +{ + if (!RTEST(ruby_verbose)) return; + if (!node) return; + if (nd_type(node) != NODE_BLOCK) return; + + for (;;) { + if (!node->nd_next) return; + void_expr0(node->nd_head); + node = node->nd_next; + } +} + +static NODE * +remove_begin(node) + NODE *node; +{ + NODE **n = &node; + while (*n) { + switch (nd_type(*n)) { + case NODE_NEWLINE: + n = &(*n)->nd_next; + continue; + case NODE_BEGIN: + *n = (*n)->nd_body; + default: + return node; + } + } + return node; +} + +static int +assign_in_cond(node) + NODE *node; +{ + switch (nd_type(node)) { + case NODE_MASGN: + yyerror("multiple assignment in conditional"); + return 1; + + case NODE_LASGN: + case NODE_DASGN: + case NODE_GASGN: + case NODE_IASGN: + break; + + case NODE_NEWLINE: + default: + return 0; + } + + switch (nd_type(node->nd_value)) { + case NODE_LIT: + case NODE_STR: + case NODE_NIL: + case NODE_TRUE: + case NODE_FALSE: + /* reports always */ + parser_warn(node->nd_value, "found = in conditional, should be =="); + return 1; + + case NODE_DSTR: + case NODE_XSTR: + case NODE_DXSTR: + case NODE_EVSTR: + case NODE_DREGX: + default: + break; + } +#if 0 + if (assign_in_cond(node->nd_value) == 0) { + parser_warning(node->nd_value, "assignment in condition"); + } +#endif + return 1; +} + +static int +e_option_supplied() +{ + if (strcmp(ruby_sourcefile, "-e") == 0) + return Qtrue; + return Qfalse; +} + +static void +warn_unless_e_option(node, str) + NODE *node; + const char *str; +{ + if (!e_option_supplied()) parser_warn(node, str); +} + +static void +warning_unless_e_option(node, str) + NODE *node; + const char *str; +{ + if (!e_option_supplied()) parser_warning(node, str); +} + +static void +fixup_nodes(rootnode) + NODE **rootnode; +{ + NODE *node, *next, *head; + + for (node = *rootnode; node; node = next) { + enum node_type type; + VALUE val; + + next = node->nd_next; + head = node->nd_head; + rb_gc_force_recycle((VALUE)node); + *rootnode = next; + switch (type = nd_type(head)) { + case NODE_DOT2: + case NODE_DOT3: + val = rb_range_new(head->nd_beg->nd_lit, head->nd_end->nd_lit, + type == NODE_DOT3 ? Qtrue : Qfalse); + rb_gc_force_recycle((VALUE)head->nd_beg); + rb_gc_force_recycle((VALUE)head->nd_end); + nd_set_type(head, NODE_LIT); + head->nd_lit = val; + break; + default: + break; + } + } +} + +static NODE *cond0(); + +static NODE* +range_op(node) + NODE *node; +{ + enum node_type type; + + if (node == 0) return 0; + + type = nd_type(node); + if (type == NODE_NEWLINE) { + node = node->nd_next; + type = nd_type(node); + } + value_expr(node); + if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) { + warn_unless_e_option(node, "integer literal in conditional range"); + return call_op(node,tEQ,1,NEW_GVAR(rb_intern("$."))); + } + return cond0(node); +} + +static int +literal_node(node) + NODE *node; +{ + if (!node) return 1; /* same as NODE_NIL */ + switch (nd_type(node)) { + case NODE_LIT: + case NODE_STR: + case NODE_DSTR: + case NODE_EVSTR: + case NODE_DREGX: + case NODE_DREGX_ONCE: + case NODE_DSYM: + return 2; + case NODE_TRUE: + case NODE_FALSE: + case NODE_NIL: + return 1; + } + return 0; +} + +static NODE* +cond0(node) + NODE *node; +{ + if (node == 0) return 0; + assign_in_cond(node); + + switch (nd_type(node)) { + case NODE_DSTR: + case NODE_EVSTR: + case NODE_STR: + rb_warn("string literal in condition"); + break; + + case NODE_DREGX: + case NODE_DREGX_ONCE: + warning_unless_e_option(node, "regex literal in condition"); + local_cnt('_'); + local_cnt('~'); + return NEW_MATCH2(node, NEW_GVAR(rb_intern("$_"))); + + case NODE_AND: + case NODE_OR: + node->nd_1st = cond0(node->nd_1st); + node->nd_2nd = cond0(node->nd_2nd); + break; + + case NODE_DOT2: + case NODE_DOT3: + node->nd_beg = range_op(node->nd_beg); + node->nd_end = range_op(node->nd_end); + if (nd_type(node) == NODE_DOT2) nd_set_type(node,NODE_FLIP2); + else if (nd_type(node) == NODE_DOT3) nd_set_type(node, NODE_FLIP3); + node->nd_cnt = local_append(internal_id()); + if (!e_option_supplied()) { + int b = literal_node(node->nd_beg); + int e = literal_node(node->nd_end); + if ((b == 1 && e == 1) || (b + e >= 2 && RTEST(ruby_verbose))) { + parser_warn(node, "range literal in condition"); + } + } + break; + + case NODE_DSYM: + parser_warning(node, "literal in condition"); + break; + + case NODE_LIT: + if (TYPE(node->nd_lit) == T_REGEXP) { + warn_unless_e_option(node, "regex literal in condition"); + nd_set_type(node, NODE_MATCH); + local_cnt('_'); + local_cnt('~'); + } + else { + parser_warning(node, "literal in condition"); + } + default: + break; + } + return node; +} + +static NODE* +cond(node) + NODE *node; +{ + if (node == 0) return 0; + value_expr(node); + if (nd_type(node) == NODE_NEWLINE){ + node->nd_next = cond0(node->nd_next); + return node; + } + return cond0(node); +} + +static NODE* +logop(type, left, right) + enum node_type type; + NODE *left, *right; +{ + value_expr(left); + if (left && nd_type(left) == type) { + NODE *node = left, *second; + while ((second = node->nd_2nd) != 0 && nd_type(second) == type) { + node = second; + } + node->nd_2nd = NEW_NODE(type, second, right, 0); + return left; + } + return NEW_NODE(type, left, right, 0); +} + +static int +cond_negative(nodep) + NODE **nodep; +{ + NODE *c = *nodep; + + if (!c) return 0; + switch (nd_type(c)) { + case NODE_NOT: + *nodep = c->nd_body; + return 1; + case NODE_NEWLINE: + if (c->nd_next && nd_type(c->nd_next) == NODE_NOT) { + c->nd_next = c->nd_next->nd_body; + return 1; + } + } + return 0; +} + +static void +no_blockarg(node) + NODE *node; +{ + if (node && nd_type(node) == NODE_BLOCK_PASS) { + rb_compile_error("block argument should not be given"); + } +} + +static NODE * +ret_args(node) + NODE *node; +{ + if (node) { + no_blockarg(node); + if (nd_type(node) == NODE_ARRAY && node->nd_next == 0) { + node = node->nd_head; + } + if (node && nd_type(node) == NODE_SPLAT) { + node = NEW_SVALUE(node); + } + } + return node; +} + +static NODE * +new_yield(node) + NODE *node; +{ + long state = Qtrue; + + if (node) { + no_blockarg(node); + if (nd_type(node) == NODE_ARRAY && node->nd_next == 0) { + node = node->nd_head; + state = Qfalse; + } + if (node && nd_type(node) == NODE_SPLAT) { + state = Qtrue; + } + } + else { + state = Qfalse; + } + return NEW_YIELD(node, state); +} + +static NODE* +negate_lit(node) + NODE *node; +{ + switch (TYPE(node->nd_lit)) { + case T_FIXNUM: + node->nd_lit = LONG2FIX(-FIX2LONG(node->nd_lit)); + break; + case T_BIGNUM: + node->nd_lit = rb_funcall(node->nd_lit,tUMINUS,0,0); + break; + case T_FLOAT: + RFLOAT(node->nd_lit)->value = -RFLOAT(node->nd_lit)->value; + break; + default: + break; + } + return node; +} + +static NODE * +arg_blk_pass(node1, node2) + NODE *node1; + NODE *node2; +{ + if (node2) { + node2->nd_head = node1; + return node2; + } + return node1; +} + +static NODE* +arg_prepend(node1, node2) + NODE *node1, *node2; +{ + switch (nd_type(node2)) { + case NODE_ARRAY: + return list_concat(NEW_LIST(node1), node2); + + case NODE_SPLAT: + return arg_concat(node1, node2->nd_head); + + case NODE_BLOCK_PASS: + node2->nd_body = arg_prepend(node1, node2->nd_body); + return node2; + + default: + rb_bug("unknown nodetype(%d) for arg_prepend", nd_type(node2)); + } + return 0; /* not reached */ +} + +static NODE* +new_call(r,m,a) + NODE *r; + ID m; + NODE *a; +{ + if (a && nd_type(a) == NODE_BLOCK_PASS) { + a->nd_iter = NEW_CALL(r,m,a->nd_head); + return a; + } + return NEW_CALL(r,m,a); +} + +static NODE* +new_fcall(m,a) + ID m; + NODE *a; +{ + if (a && nd_type(a) == NODE_BLOCK_PASS) { + a->nd_iter = NEW_FCALL(m,a->nd_head); + return a; + } + return NEW_FCALL(m,a); +} + +static NODE* +new_super(a) + NODE *a; +{ + if (a && nd_type(a) == NODE_BLOCK_PASS) { + a->nd_iter = NEW_SUPER(a->nd_head); + return a; + } + return NEW_SUPER(a); +} + +static struct local_vars { + ID *tbl; + int nofree; + int cnt; + int dlev; + struct RVarmap* dyna_vars; + struct local_vars *prev; +} *lvtbl; + +static void +local_push(top) + int top; +{ + struct local_vars *local; + + local = ALLOC(struct local_vars); + local->prev = lvtbl; + local->nofree = 0; + local->cnt = 0; + local->tbl = 0; + local->dlev = 0; + local->dyna_vars = ruby_dyna_vars; + lvtbl = local; + if (!top) { + /* preserve reference for GC, but link should be cut. */ + rb_dvar_push(0, (VALUE)ruby_dyna_vars); + ruby_dyna_vars->next = 0; + } +} + +static void +local_pop() +{ + struct local_vars *local = lvtbl->prev; + + if (lvtbl->tbl) { + if (!lvtbl->nofree) xfree(lvtbl->tbl); + else lvtbl->tbl[0] = lvtbl->cnt; + } + ruby_dyna_vars = lvtbl->dyna_vars; + xfree(lvtbl); + lvtbl = local; +} + +static ID* +local_tbl() +{ + lvtbl->nofree = 1; + return lvtbl->tbl; +} + +static int +local_append(id) + ID id; +{ + if (lvtbl->tbl == 0) { + lvtbl->tbl = ALLOC_N(ID, 4); + lvtbl->tbl[0] = 0; + lvtbl->tbl[1] = '_'; + lvtbl->tbl[2] = '~'; + lvtbl->cnt = 2; + if (id == '_') return 0; + if (id == '~') return 1; + } + else { + REALLOC_N(lvtbl->tbl, ID, lvtbl->cnt+2); + } + + lvtbl->tbl[lvtbl->cnt+1] = id; + return lvtbl->cnt++; +} + +static int +local_cnt(id) + ID id; +{ + int cnt, max; + + if (id == 0) return lvtbl->cnt; + + for (cnt=1, max=lvtbl->cnt+1; cnt<max;cnt++) { + if (lvtbl->tbl[cnt] == id) return cnt-1; + } + return local_append(id); +} + +static int +local_id(id) + ID id; +{ + int i, max; + + if (lvtbl == 0) return Qfalse; + for (i=3, max=lvtbl->cnt+1; i<max; i++) { + if (lvtbl->tbl[i] == id) return Qtrue; + } + return Qfalse; +} + +static void +top_local_init() +{ + local_push(1); + lvtbl->cnt = ruby_scope->local_tbl?ruby_scope->local_tbl[0]:0; + if (lvtbl->cnt > 0) { + lvtbl->tbl = ALLOC_N(ID, lvtbl->cnt+3); + MEMCPY(lvtbl->tbl, ruby_scope->local_tbl, ID, lvtbl->cnt+1); + } + else { + lvtbl->tbl = 0; + } + if (ruby_dyna_vars) + lvtbl->dlev = 1; + else + lvtbl->dlev = 0; +} + +static void +top_local_setup() +{ + int len = lvtbl->cnt; + int i; + + if (len > 0) { + i = ruby_scope->local_tbl?ruby_scope->local_tbl[0]:0; + + if (i < len) { + if (i == 0 || (ruby_scope->flags & SCOPE_MALLOC) == 0) { + VALUE *vars = ALLOC_N(VALUE, len+1); + if (ruby_scope->local_vars) { + *vars++ = ruby_scope->local_vars[-1]; + MEMCPY(vars, ruby_scope->local_vars, VALUE, i); + rb_mem_clear(vars+i, len-i); + } + else { + *vars++ = 0; + rb_mem_clear(vars, len); + } + ruby_scope->local_vars = vars; + ruby_scope->flags |= SCOPE_MALLOC; + } + else { + VALUE *vars = ruby_scope->local_vars-1; + REALLOC_N(vars, VALUE, len+1); + ruby_scope->local_vars = vars+1; + rb_mem_clear(ruby_scope->local_vars+i, len-i); + } + if (ruby_scope->local_tbl && ruby_scope->local_vars[-1] == 0) { + if (!(ruby_scope->flags & SCOPE_CLONE)) + xfree(ruby_scope->local_tbl); + } + ruby_scope->local_vars[-1] = 0; /* no reference needed */ + ruby_scope->local_tbl = local_tbl(); + } + } + local_pop(); +} + +#define DVAR_USED FL_USER6 + +static VALUE +dyna_var_lookup(id) + ID id; +{ + struct RVarmap *vars = ruby_dyna_vars; + + while (vars) { + if (vars->id == id) { + FL_SET(vars, DVAR_USED); + return Qtrue; + } + vars = vars->next; + } + return Qfalse; +} + +static struct RVarmap* +dyna_push() +{ + struct RVarmap* vars = ruby_dyna_vars; + + rb_dvar_push(0, 0); + lvtbl->dlev++; + return vars; +} + +static void +dyna_pop(vars) + struct RVarmap* vars; +{ + lvtbl->dlev--; + ruby_dyna_vars = vars; +} + +static int +dyna_in_block() +{ + return (lvtbl->dlev > 0); +} + +static NODE * +dyna_init(node, pre) + NODE *node; + struct RVarmap *pre; +{ + struct RVarmap *post = ruby_dyna_vars; + NODE *var; + + if (!node || !post || pre == post) return node; + for (var = 0; post != pre && post->id; post = post->next) { + if (FL_TEST(post, DVAR_USED)) { + var = NEW_DASGN_CURR(post->id, var); + } + } + return block_append(var, node); +} + +int +ruby_parser_stack_on_heap() +{ +#if defined(YYMALLOC) + return Qfalse; +#else + return Qtrue; +#endif +} + +void +rb_gc_mark_parser() +{ +#if defined YYMALLOC + rb_gc_mark((VALUE)parser_heap); +#elif defined yystacksize + if (yyvsp) rb_gc_mark_locations((VALUE *)yyvs, (VALUE *)yyvsp); +#endif + + if (!ruby_in_compile) return; + + rb_gc_mark_maybe((VALUE)yylval.node); + rb_gc_mark(ruby_debug_lines); + rb_gc_mark(lex_lastline); + rb_gc_mark(lex_input); + rb_gc_mark((VALUE)lex_strterm); + rb_gc_mark((VALUE)deferred_nodes); +} + +void +rb_parser_append_print() +{ + ruby_eval_tree = + block_append(ruby_eval_tree, + NEW_FCALL(rb_intern("print"), + NEW_ARRAY(NEW_GVAR(rb_intern("$_"))))); +} + +void +rb_parser_while_loop(chop, split) + int chop, split; +{ + if (split) { + ruby_eval_tree = + block_append(NEW_GASGN(rb_intern("$F"), + NEW_CALL(NEW_GVAR(rb_intern("$_")), + rb_intern("split"), 0)), + ruby_eval_tree); + } + if (chop) { + ruby_eval_tree = + block_append(NEW_CALL(NEW_GVAR(rb_intern("$_")), + rb_intern("chop!"), 0), ruby_eval_tree); + } + ruby_eval_tree = NEW_OPT_N(ruby_eval_tree); +} + +static struct { + ID token; + char *name; +} op_tbl[] = { + {tDOT2, ".."}, + {tDOT3, "..."}, + {'+', "+"}, + {'-', "-"}, + {'+', "+(binary)"}, + {'-', "-(binary)"}, + {'*', "*"}, + {'/', "/"}, + {'%', "%"}, + {tPOW, "**"}, + {tUPLUS, "+@"}, + {tUMINUS, "-@"}, + {tUPLUS, "+(unary)"}, + {tUMINUS, "-(unary)"}, + {'|', "|"}, + {'^', "^"}, + {'&', "&"}, + {tCMP, "<=>"}, + {'>', ">"}, + {tGEQ, ">="}, + {'<', "<"}, + {tLEQ, "<="}, + {tEQ, "=="}, + {tEQQ, "==="}, + {tNEQ, "!="}, + {tMATCH, "=~"}, + {tNMATCH, "!~"}, + {'!', "!"}, + {'~', "~"}, + {'!', "!(unary)"}, + {'~', "~(unary)"}, + {'!', "!@"}, + {'~', "~@"}, + {tAREF, "[]"}, + {tASET, "[]="}, + {tLSHFT, "<<"}, + {tRSHFT, ">>"}, + {tCOLON2, "::"}, + {'`', "`"}, + {0, 0} +}; + +static st_table *sym_tbl; +static st_table *sym_rev_tbl; + +void +Init_sym() +{ + sym_tbl = st_init_strtable_with_size(200); + sym_rev_tbl = st_init_numtable_with_size(200); +} + +static ID last_id = tLAST_TOKEN; + +static ID +internal_id() +{ + return ID_INTERNAL | (++last_id << ID_SCOPE_SHIFT); +} + +static int +is_special_global_name(m) + const char *m; +{ + switch (*m) { + case '~': case '*': case '$': case '?': case '!': case '@': + case '/': case '\\': case ';': case ',': case '.': case '=': + case ':': case '<': case '>': case '\"': + case '&': case '`': case '\'': case '+': + case '0': + ++m; + break; + case '-': + ++m; + if (is_identchar(*m)) m += mbclen(*m); + break; + default: + if (!ISDIGIT(*m)) return 0; + do ++m; while (ISDIGIT(*m)); + } + return !*m; +} + +int +rb_symname_p(name) + const char *name; +{ + const char *m = name; + int localid = Qfalse; + + if (!m) return Qfalse; + switch (*m) { + case '\0': + return Qfalse; + + case '$': + if (is_special_global_name(++m)) return Qtrue; + goto id; + + case '@': + if (*++m == '@') ++m; + goto id; + + case '<': + switch (*++m) { + case '<': ++m; break; + case '=': if (*++m == '>') ++m; break; + default: break; + } + break; + + case '>': + switch (*++m) { + case '>': case '=': ++m; break; + } + break; + + case '=': + switch (*++m) { + case '~': ++m; break; + case '=': if (*++m == '=') ++m; break; + default: return Qfalse; + } + break; + + case '*': + if (*++m == '*') ++m; + break; + + case '+': case '-': + if (*++m == '@') ++m; + break; + + case '|': case '^': case '&': case '/': case '%': case '~': case '`': + ++m; + break; + + case '[': + if (*++m != ']') return Qfalse; + if (*++m == '=') ++m; + break; + + default: + localid = !ISUPPER(*m); + id: + if (*m != '_' && !ISALPHA(*m) && !ismbchar(*m)) return Qfalse; + while (is_identchar(*m)) m += mbclen(*m); + if (localid) { + switch (*m) { + case '!': case '?': case '=': ++m; + } + } + break; + } + return *m ? Qfalse : Qtrue; +} + +int +rb_sym_interned_p(str) + VALUE str; +{ + ID id; + + if (st_lookup(sym_tbl, (st_data_t)RSTRING(str)->ptr, (st_data_t *)&id)) + return Qtrue; + return Qfalse; +} + +ID +rb_intern(name) + const char *name; +{ + const char *m = name; + ID id; + int last; + + if (st_lookup(sym_tbl, (st_data_t)name, (st_data_t *)&id)) + return id; + + last = strlen(name)-1; + id = 0; + switch (*name) { + case '$': + id |= ID_GLOBAL; + if (is_special_global_name(++m)) goto new_id; + break; + case '@': + if (name[1] == '@') { + m++; + id |= ID_CLASS; + } + else { + id |= ID_INSTANCE; + } + m++; + break; + default: + if (name[0] != '_' && ISASCII(name[0]) && !ISALNUM(name[0])) { + /* operators */ + int i; + + for (i=0; op_tbl[i].token; i++) { + if (*op_tbl[i].name == *name && + strcmp(op_tbl[i].name, name) == 0) { + id = op_tbl[i].token; + goto id_regist; + } + } + } + + if (name[last] == '=') { + /* attribute assignment */ + char *buf = ALLOCA_N(char,last+1); + + strncpy(buf, name, last); + buf[last] = '\0'; + id = rb_intern(buf); + if (id > tLAST_TOKEN && !is_attrset_id(id)) { + id = rb_id_attrset(id); + goto id_regist; + } + id = ID_ATTRSET; + } + else if (ISUPPER(name[0])) { + id = ID_CONST; + } + else { + id = ID_LOCAL; + } + break; + } + if (!ISDIGIT(*m)) { + while (m <= name + last && is_identchar(*m)) { + m += mbclen(*m); + } + } + if (*m) id = ID_JUNK; + new_id: + id |= ++last_id << ID_SCOPE_SHIFT; + id_regist: + name = strdup(name); + st_add_direct(sym_tbl, (st_data_t)name, id); + st_add_direct(sym_rev_tbl, id, (st_data_t)name); + return id; +} + +char * +rb_id2name(id) + ID id; +{ + char *name; + st_data_t data; + + if (id < tLAST_TOKEN) { + int i; + + for (i=0; op_tbl[i].token; i++) { + if (op_tbl[i].token == id) + return op_tbl[i].name; + } + } + + if (st_lookup(sym_rev_tbl, id, &data)) + return (char *)data; + + if (is_attrset_id(id)) { + ID id2 = (id & ~ID_SCOPE_MASK) | ID_LOCAL; + + again: + name = rb_id2name(id2); + if (name) { + char *buf = ALLOCA_N(char, strlen(name)+2); + + strcpy(buf, name); + strcat(buf, "="); + rb_intern(buf); + return rb_id2name(id); + } + if (is_local_id(id2)) { + id2 = (id & ~ID_SCOPE_MASK) | ID_CONST; + goto again; + } + } + return 0; +} + +static int +symbols_i(key, value, ary) + char *key; + ID value; + VALUE ary; +{ + rb_ary_push(ary, ID2SYM(value)); + return ST_CONTINUE; +} + +/* + * call-seq: + * Symbol.all_symbols => array + * + * Returns an array of all the symbols currently in Ruby's symbol + * table. + * + * Symbol.all_symbols.size #=> 903 + * Symbol.all_symbols[1,20] #=> [:floor, :ARGV, :Binding, :symlink, + * :chown, :EOFError, :$;, :String, + * :LOCK_SH, :"setuid?", :$<, + * :default_proc, :compact, :extend, + * :Tms, :getwd, :$=, :ThreadGroup, + * :wait2, :$>] + */ + +VALUE +rb_sym_all_symbols() +{ + VALUE ary = rb_ary_new2(sym_tbl->num_entries); + + st_foreach(sym_tbl, symbols_i, ary); + return ary; +} + +int +rb_is_const_id(id) + ID id; +{ + if (is_const_id(id)) return Qtrue; + return Qfalse; +} + +int +rb_is_class_id(id) + ID id; +{ + if (is_class_id(id)) return Qtrue; + return Qfalse; +} + +int +rb_is_instance_id(id) + ID id; +{ + if (is_instance_id(id)) return Qtrue; + return Qfalse; +} + +int +rb_is_local_id(id) + ID id; +{ + if (is_local_id(id)) return Qtrue; + return Qfalse; +} + +int +rb_is_junk_id(id) + ID id; +{ + if (is_junk_id(id)) return Qtrue; + return Qfalse; +} + +static void +special_local_set(c, val) + char c; + VALUE val; +{ + int cnt; + + top_local_init(); + cnt = local_cnt(c); + top_local_setup(); + ruby_scope->local_vars[cnt] = val; +} + +VALUE +rb_backref_get() +{ + VALUE *var = rb_svar(1); + if (var) { + return *var; + } + return Qnil; +} + +void +rb_backref_set(val) + VALUE val; +{ + VALUE *var = rb_svar(1); + if (var) { + *var = val; + } + else { + special_local_set('~', val); + } +} + +VALUE +rb_lastline_get() +{ + VALUE *var = rb_svar(0); + if (var) { + return *var; + } + return Qnil; +} + +void +rb_lastline_set(val) + VALUE val; +{ + VALUE *var = rb_svar(0); + if (var) { + *var = val; + } + else { + special_local_set('_', val); + } +} + +#ifdef YYMALLOC +#define HEAPCNT(n, size) ((n) * (size) / sizeof(YYSTYPE)) +#define NEWHEAP() rb_node_newnode(NODE_ALLOCA, 0, (VALUE)parser_heap, 0) +#define ADD2HEAP(n, c, p) ((parser_heap = (n))->u1.node = (p), \ + (n)->u3.cnt = (c), (p)) + +static void * +rb_parser_malloc(size) + size_t size; +{ + size_t cnt = HEAPCNT(1, size); + NODE *n = NEWHEAP(); + void *ptr = xmalloc(size); + + return ADD2HEAP(n, cnt, ptr); +} + +static void * +rb_parser_calloc(nelem, size) + size_t nelem, size; +{ + size_t cnt = HEAPCNT(nelem, size); + NODE *n = NEWHEAP(); + void *ptr = xcalloc(nelem, size); + + return ADD2HEAP(n, cnt, ptr); +} + +static void * +rb_parser_realloc(ptr, size) + void *ptr; + size_t size; +{ + NODE *n; + size_t cnt = HEAPCNT(1, size); + + if (ptr && (n = parser_heap) != NULL) { + do { + if (n->u1.node == ptr) { + n->u1.node = ptr = xrealloc(ptr, size); + if (n->u3.cnt) n->u3.cnt = cnt; + return ptr; + } + } while ((n = n->u2.node) != NULL); + } + n = NEWHEAP(); + ptr = xrealloc(ptr, size); + return ADD2HEAP(n, cnt, ptr); +} + +static void +rb_parser_free(ptr) + void *ptr; +{ + NODE **prev = &parser_heap, *n; + + while ((n = *prev) != 0) { + if (n->u1.node == ptr) { + *prev = n->u2.node; + rb_gc_force_recycle((VALUE)n); + break; + } + prev = &n->u2.node; + } + xfree(ptr); +} +#endif + +/********************************************************************** + + prec.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Tue Jan 26 02:40:41 2000 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" + +VALUE rb_mPrecision; + +static ID prc_pr, prc_if; + + +/* + * call-seq: + * num.prec(klass) => a_klass + * + * Converts _self_ into an instance of _klass_. By default, + * +prec+ invokes + * + * klass.induced_from(num) + * + * and returns its value. So, if <code>klass.induced_from</code> + * doesn't return an instance of _klass_, it will be necessary + * to reimplement +prec+. + */ + +static VALUE +prec_prec(x, klass) + VALUE x, klass; +{ + return rb_funcall(klass, prc_if, 1, x); +} + +/* + * call-seq: + * num.prec_i => Integer + * + * Returns an +Integer+ converted from _num_. It is equivalent + * to <code>prec(Integer)</code>. + */ + +static VALUE +prec_prec_i(x) + VALUE x; +{ + VALUE klass = rb_cInteger; + + return rb_funcall(x, prc_pr, 1, klass); +} + +/* + * call-seq: + * num.prec_f => Float + * + * Returns a +Float+ converted from _num_. It is equivalent + * to <code>prec(Float)</code>. + */ + +static VALUE +prec_prec_f(x) + VALUE x; +{ + VALUE klass = rb_cFloat; + + return rb_funcall(x, prc_pr, 1, klass); +} + +/* + * call-seq: + * Mod.induced_from(number) => a_mod + * + * Creates an instance of mod from. This method is overridden + * by concrete +Numeric+ classes, so that (for example) + * + * Fixnum.induced_from(9.9) #=> 9 + * + * Note that a use of +prec+ in a redefinition may cause + * an infinite loop. + */ + +static VALUE +prec_induced_from(module, x) + VALUE module, x; +{ + rb_raise(rb_eTypeError, "undefined conversion from %s into %s", + rb_obj_classname(x), rb_class2name(module)); + return Qnil; /* not reached */ +} + +/* + * call_seq: + * included + * + * When the +Precision+ module is mixed-in to a class, this +included+ + * method is used to add our default +induced_from+ implementation + * to the host class. + */ + +static VALUE +prec_included(module, include) + VALUE module, include; +{ + switch (TYPE(include)) { + case T_CLASS: + case T_MODULE: + break; + default: + Check_Type(include, T_CLASS); + break; + } + rb_define_singleton_method(include, "induced_from", prec_induced_from, 1); + return module; +} + +/* + * Precision is a mixin for concrete numeric classes with + * precision. Here, `precision' means the fineness of approximation + * of a real number, so, this module should not be included into + * anything which is not a subset of Real (so it should not be + * included in classes such as +Complex+ or +Matrix+). +*/ + +void +Init_Precision() +{ + rb_mPrecision = rb_define_module("Precision"); + rb_define_singleton_method(rb_mPrecision, "included", prec_included, 1); + rb_define_method(rb_mPrecision, "prec", prec_prec, 1); + rb_define_method(rb_mPrecision, "prec_i", prec_prec_i, 0); + rb_define_method(rb_mPrecision, "prec_f", prec_prec_f, 0); + + prc_pr = rb_intern("prec"); + prc_if = rb_intern("induced_from"); +} +/********************************************************************** + + process.c - + + $Author: shyouhei $ + $Date: 2008-06-29 11:33:11 +0200 (Sun, 29 Jun 2008) $ + created at: Tue Aug 10 14:30:50 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "rubysig.h" +#include <stdio.h> +#include <errno.h> +#include <signal.h> +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef __DJGPP__ +#include <process.h> +#endif + +#include <time.h> +#include <ctype.h> + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#endif +#ifndef EXIT_FAILURE +#define EXIT_FAILURE 1 +#endif + +struct timeval rb_time_interval _((VALUE)); + +#ifdef HAVE_SYS_WAIT_H +# include <sys/wait.h> +#endif +#ifdef HAVE_SYS_RESOURCE_H +# include <sys/resource.h> +#endif +#include "st.h" + +#ifdef __EMX__ +#undef HAVE_GETPGRP +#endif + +#ifdef HAVE_SYS_TIMES_H +#include <sys/times.h> +#endif + +#ifdef HAVE_GRP_H +#include <grp.h> +#endif + +#if defined(HAVE_TIMES) || defined(_WIN32) +static VALUE S_Tms; +#endif + +#ifndef WIFEXITED +#define WIFEXITED(w) (((w) & 0xff) == 0) +#endif +#ifndef WIFSIGNALED +#define WIFSIGNALED(w) (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f)) +#endif +#ifndef WIFSTOPPED +#define WIFSTOPPED(w) (((w) & 0xff) == 0x7f) +#endif +#ifndef WEXITSTATUS +#define WEXITSTATUS(w) (((w) >> 8) & 0xff) +#endif +#ifndef WTERMSIG +#define WTERMSIG(w) ((w) & 0x7f) +#endif +#ifndef WSTOPSIG +#define WSTOPSIG WEXITSTATUS +#endif + +#if defined(__APPLE__) && ( defined(__MACH__) || defined(__DARWIN__) ) && !defined(__MacOS_X__) +#define __MacOS_X__ 1 +#endif + +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) +#define HAVE_44BSD_SETUID 1 +#define HAVE_44BSD_SETGID 1 +#endif + +#ifdef __NetBSD__ +#undef HAVE_SETRUID +#undef HAVE_SETRGID +#endif + +#if defined(__MacOS_X__) || defined(__bsdi__) +#define BROKEN_SETREUID 1 +#define BROKEN_SETREGID 1 +#endif + +#ifdef BROKEN_SETREUID +#define setreuid ruby_setreuid +#endif +#ifdef BROKEN_SETREGID +#define setregid ruby_setregid +#endif + +#if defined(HAVE_44BSD_SETUID) || defined(__MacOS_X__) +#if !defined(USE_SETREUID) && !defined(BROKEN_SETREUID) +#define OBSOLETE_SETREUID 1 +#endif +#if !defined(USE_SETREGID) && !defined(BROKEN_SETREGID) +#define OBSOLETE_SETREGID 1 +#endif +#endif + +#define preserving_errno(stmts) \ + do {int saved_errno = errno; stmts; errno = saved_errno;} while (0) + + +/* + * call-seq: + * Process.pid => fixnum + * + * Returns the process id of this process. Not available on all + * platforms. + * + * Process.pid #=> 27415 + */ + +static VALUE +get_pid() +{ + rb_secure(2); + return INT2FIX(getpid()); +} + + +/* + * call-seq: + * Process.ppid => fixnum + * + * Returns the process id of the parent of this process. Always + * returns 0 on NT. Not available on all platforms. + * + * puts "I am #{Process.pid}" + * Process.fork { puts "Dad is #{Process.ppid}" } + * + * <em>produces:</em> + * + * I am 27417 + * Dad is 27417 + */ + +static VALUE +get_ppid() +{ + rb_secure(2); +#ifdef _WIN32 + return INT2FIX(0); +#else + return INT2FIX(getppid()); +#endif +} + + +/********************************************************************* + * + * Document-class: Process::Status + * + * <code>Process::Status</code> encapsulates the information on the + * status of a running or terminated system process. The built-in + * variable <code>$?</code> is either +nil+ or a + * <code>Process::Status</code> object. + * + * fork { exit 99 } #=> 26557 + * Process.wait #=> 26557 + * $?.class #=> Process::Status + * $?.to_i #=> 25344 + * $? >> 8 #=> 99 + * $?.stopped? #=> false + * $?.exited? #=> true + * $?.exitstatus #=> 99 + * + * Posix systems record information on processes using a 16-bit + * integer. The lower bits record the process status (stopped, + * exited, signaled) and the upper bits possibly contain additional + * information (for example the program's return code in the case of + * exited processes). Pre Ruby 1.8, these bits were exposed directly + * to the Ruby program. Ruby now encapsulates these in a + * <code>Process::Status</code> object. To maximize compatibility, + * however, these objects retain a bit-oriented interface. In the + * descriptions that follow, when we talk about the integer value of + * _stat_, we're referring to this 16 bit value. + */ + +static VALUE rb_cProcStatus; +VALUE rb_last_status = Qnil; + +static void +last_status_set(status, pid) + int status, pid; +{ + rb_last_status = rb_obj_alloc(rb_cProcStatus); + rb_iv_set(rb_last_status, "status", INT2FIX(status)); + rb_iv_set(rb_last_status, "pid", INT2FIX(pid)); +} + + +/* + * call-seq: + * stat.to_i => fixnum + * stat.to_int => fixnum + * + * Returns the bits in _stat_ as a <code>Fixnum</code>. Poking + * around in these bits is platform dependent. + * + * fork { exit 0xab } #=> 26566 + * Process.wait #=> 26566 + * sprintf('%04x', $?.to_i) #=> "ab00" + */ + +static VALUE +pst_to_i(st) + VALUE st; +{ + return rb_iv_get(st, "status"); +} + + +/* + * call-seq: + * stat.to_s => string + * + * Equivalent to _stat_<code>.to_i.to_s</code>. + */ + +static VALUE +pst_to_s(st) + VALUE st; +{ + return rb_fix2str(pst_to_i(st), 10); +} + + +/* + * call-seq: + * stat.pid => fixnum + * + * Returns the process ID that this status object represents. + * + * fork { exit } #=> 26569 + * Process.wait #=> 26569 + * $?.pid #=> 26569 + */ + +static VALUE +pst_pid(st) + VALUE st; +{ + return rb_iv_get(st, "pid"); +} + + +/* + * call-seq: + * stat.inspect => string + * + * Override the inspection method. + */ + +static VALUE +pst_inspect(st) + VALUE st; +{ + VALUE pid; + int status; + VALUE str; + char buf[256]; + + pid = pst_pid(st); + status = NUM2INT(st); + + snprintf(buf, sizeof(buf), "#<%s: pid=%ld", rb_class2name(CLASS_OF(st)), NUM2LONG(pid)); + str = rb_str_new2(buf); + if (WIFSTOPPED(status)) { + int stopsig = WSTOPSIG(status); + const char *signame = ruby_signal_name(stopsig); + if (signame) { + snprintf(buf, sizeof(buf), ",stopped(SIG%s=%d)", signame, stopsig); + } + else { + snprintf(buf, sizeof(buf), ",stopped(%d)", stopsig); + } + rb_str_cat2(str, buf); + } + if (WIFSIGNALED(status)) { + int termsig = WTERMSIG(status); + const char *signame = ruby_signal_name(termsig); + if (signame) { + snprintf(buf, sizeof(buf), ",signaled(SIG%s=%d)", signame, termsig); + } + else { + snprintf(buf, sizeof(buf), ",signaled(%d)", termsig); + } + rb_str_cat2(str, buf); + } + if (WIFEXITED(status)) { + snprintf(buf, sizeof(buf), ",exited(%d)", WEXITSTATUS(status)); + rb_str_cat2(str, buf); + } +#ifdef WCOREDUMP + if (WCOREDUMP(status)) { + rb_str_cat2(str, ",coredumped"); + } +#endif + rb_str_cat2(str, ">"); + return str; +} + + +/* + * call-seq: + * stat == other => true or false + * + * Returns +true+ if the integer value of _stat_ + * equals <em>other</em>. + */ + +static VALUE +pst_equal(st1, st2) + VALUE st1, st2; +{ + if (st1 == st2) return Qtrue; + return rb_equal(pst_to_i(st1), st2); +} + + +/* + * call-seq: + * stat & num => fixnum + * + * Logical AND of the bits in _stat_ with <em>num</em>. + * + * fork { exit 0x37 } + * Process.wait + * sprintf('%04x', $?.to_i) #=> "3700" + * sprintf('%04x', $? & 0x1e00) #=> "1600" + */ + +static VALUE +pst_bitand(st1, st2) + VALUE st1, st2; +{ + int status = NUM2INT(st1) & NUM2INT(st2); + + return INT2NUM(status); +} + + +/* + * call-seq: + * stat >> num => fixnum + * + * Shift the bits in _stat_ right <em>num</em> places. + * + * fork { exit 99 } #=> 26563 + * Process.wait #=> 26563 + * $?.to_i #=> 25344 + * $? >> 8 #=> 99 + */ + +static VALUE +pst_rshift(st1, st2) + VALUE st1, st2; +{ + int status = NUM2INT(st1) >> NUM2INT(st2); + + return INT2NUM(status); +} + + +/* + * call-seq: + * stat.stopped? => true or false + * + * Returns +true+ if this process is stopped. This is only + * returned if the corresponding <code>wait</code> call had the + * <code>WUNTRACED</code> flag set. + */ + +static VALUE +pst_wifstopped(st) + VALUE st; +{ + int status = NUM2INT(st); + + if (WIFSTOPPED(status)) + return Qtrue; + else + return Qfalse; +} + + +/* + * call-seq: + * stat.stopsig => fixnum or nil + * + * Returns the number of the signal that caused _stat_ to stop + * (or +nil+ if self is not stopped). + */ + +static VALUE +pst_wstopsig(st) + VALUE st; +{ + int status = NUM2INT(st); + + if (WIFSTOPPED(status)) + return INT2NUM(WSTOPSIG(status)); + return Qnil; +} + + +/* + * call-seq: + * stat.signaled? => true or false + * + * Returns +true+ if _stat_ terminated because of + * an uncaught signal. + */ + +static VALUE +pst_wifsignaled(st) + VALUE st; +{ + int status = NUM2INT(st); + + if (WIFSIGNALED(status)) + return Qtrue; + else + return Qfalse; +} + + +/* + * call-seq: + * stat.termsig => fixnum or nil + * + * Returns the number of the signal that caused _stat_ to + * terminate (or +nil+ if self was not terminated by an + * uncaught signal). + */ + +static VALUE +pst_wtermsig(st) + VALUE st; +{ + int status = NUM2INT(st); + + if (WIFSIGNALED(status)) + return INT2NUM(WTERMSIG(status)); + return Qnil; +} + + +/* + * call-seq: + * stat.exited? => true or false + * + * Returns +true+ if _stat_ exited normally (for + * example using an <code>exit()</code> call or finishing the + * program). + */ + +static VALUE +pst_wifexited(st) + VALUE st; +{ + int status = NUM2INT(st); + + if (WIFEXITED(status)) + return Qtrue; + else + return Qfalse; +} + + +/* + * call-seq: + * stat.exitstatus => fixnum or nil + * + * Returns the least significant eight bits of the return code of + * _stat_. Only available if <code>exited?</code> is + * +true+. + * + * fork { } #=> 26572 + * Process.wait #=> 26572 + * $?.exited? #=> true + * $?.exitstatus #=> 0 + * + * fork { exit 99 } #=> 26573 + * Process.wait #=> 26573 + * $?.exited? #=> true + * $?.exitstatus #=> 99 + */ + +static VALUE +pst_wexitstatus(st) + VALUE st; +{ + int status = NUM2INT(st); + + if (WIFEXITED(status)) + return INT2NUM(WEXITSTATUS(status)); + return Qnil; +} + + +/* + * call-seq: + * stat.success? => true, false or nil + * + * Returns +true+ if _stat_ is successful, +false+ if not. + * Returns +nil+ if <code>exited?</code> is not +true+. + */ + +static VALUE +pst_success_p(st) + VALUE st; +{ + int status = NUM2INT(st); + + if (!WIFEXITED(status)) + return Qnil; + return WEXITSTATUS(status) == EXIT_SUCCESS ? Qtrue : Qfalse; +} + + +/* + * call-seq: + * stat.coredump? => true or false + * + * Returns +true+ if _stat_ generated a coredump + * when it terminated. Not available on all platforms. + */ + +static VALUE +pst_wcoredump(st) + VALUE st; +{ +#ifdef WCOREDUMP + int status = NUM2INT(st); + + if (WCOREDUMP(status)) + return Qtrue; + else + return Qfalse; +#else + return Qfalse; +#endif +} + +#if !defined(HAVE_WAITPID) && !defined(HAVE_WAIT4) +#define NO_WAITPID +static st_table *pid_tbl; +#endif + +int +rb_waitpid(pid, st, flags) + int pid; + int *st; + int flags; +{ + int result; +#ifndef NO_WAITPID + int oflags = flags; + if (!rb_thread_alone()) { /* there're other threads to run */ + flags |= WNOHANG; + } + + retry: + TRAP_BEG; +#ifdef HAVE_WAITPID + result = waitpid(pid, st, flags); +#else /* HAVE_WAIT4 */ + result = wait4(pid, st, flags, NULL); +#endif + TRAP_END; + if (result < 0) { + if (errno == EINTR) { + rb_thread_polling(); + goto retry; + } + return -1; + } + if (result == 0) { + if (oflags & WNOHANG) return 0; + rb_thread_polling(); + if (rb_thread_alone()) flags = oflags; + goto retry; + } +#else /* NO_WAITPID */ + if (pid_tbl && st_lookup(pid_tbl, pid, st)) { + last_status_set(*st, pid); + st_delete(pid_tbl, (st_data_t*)&pid, NULL); + return pid; + } + + if (flags) { + rb_raise(rb_eArgError, "can't do waitpid with flags"); + } + + for (;;) { + TRAP_BEG; + result = wait(st); + TRAP_END; + if (result < 0) { + if (errno == EINTR) { + rb_thread_schedule(); + continue; + } + return -1; + } + if (result == pid) { + break; + } + if (!pid_tbl) + pid_tbl = st_init_numtable(); + st_insert(pid_tbl, pid, st); + if (!rb_thread_alone()) rb_thread_schedule(); + } +#endif + if (result > 0) { + last_status_set(*st, result); + } + return result; +} + +#ifdef NO_WAITPID +struct wait_data { + int pid; + int status; +}; + +static int +wait_each(pid, status, data) + int pid, status; + struct wait_data *data; +{ + if (data->status != -1) return ST_STOP; + + data->pid = pid; + data->status = status; + return ST_DELETE; +} + +static int +waitall_each(pid, status, ary) + int pid, status; + VALUE ary; +{ + last_status_set(status, pid); + rb_ary_push(ary, rb_assoc_new(INT2NUM(pid), rb_last_status)); + return ST_DELETE; +} +#endif + + +/* [MG]:FIXME: I wasn't sure how this should be done, since ::wait() + has historically been documented as if it didn't take any arguments + despite the fact that it's just an alias for ::waitpid(). The way I + have it below is more truthful, but a little confusing. + + I also took the liberty of putting in the pid values, as they're + pretty useful, and it looked as if the original 'ri' output was + supposed to contain them after "[...]depending on the value of + aPid:". + + The 'ansi' and 'bs' formats of the ri output don't display the + definition list for some reason, but the plain text one does. + */ + +/* + * call-seq: + * Process.wait() => fixnum + * Process.wait(pid=-1, flags=0) => fixnum + * Process.waitpid(pid=-1, flags=0) => fixnum + * + * Waits for a child process to exit, returns its process id, and + * sets <code>$?</code> to a <code>Process::Status</code> object + * containing information on that process. Which child it waits on + * depends on the value of _pid_: + * + * > 0:: Waits for the child whose process ID equals _pid_. + * + * 0:: Waits for any child whose process group ID equals that of the + * calling process. + * + * -1:: Waits for any child process (the default if no _pid_ is + * given). + * + * < -1:: Waits for any child whose process group ID equals the absolute + * value of _pid_. + * + * The _flags_ argument may be a logical or of the flag values + * <code>Process::WNOHANG</code> (do not block if no child available) + * or <code>Process::WUNTRACED</code> (return stopped children that + * haven't been reported). Not all flags are available on all + * platforms, but a flag value of zero will work on all platforms. + * + * Calling this method raises a <code>SystemError</code> if there are + * no child processes. Not available on all platforms. + * + * include Process + * fork { exit 99 } #=> 27429 + * wait #=> 27429 + * $?.exitstatus #=> 99 + * + * pid = fork { sleep 3 } #=> 27440 + * Time.now #=> Wed Apr 09 08:57:09 CDT 2003 + * waitpid(pid, Process::WNOHANG) #=> nil + * Time.now #=> Wed Apr 09 08:57:09 CDT 2003 + * waitpid(pid, 0) #=> 27440 + * Time.now #=> Wed Apr 09 08:57:12 CDT 2003 + */ + +static VALUE +proc_wait(argc, argv) + int argc; + VALUE *argv; +{ + VALUE vpid, vflags; + int pid, flags, status; + + rb_secure(2); + flags = 0; + rb_scan_args(argc, argv, "02", &vpid, &vflags); + if (argc == 0) { + pid = -1; + } + else { + pid = NUM2INT(vpid); + if (argc == 2 && !NIL_P(vflags)) { + flags = NUM2UINT(vflags); + } + } + if ((pid = rb_waitpid(pid, &status, flags)) < 0) + rb_sys_fail(0); + if (pid == 0) { + return rb_last_status = Qnil; + } + return INT2FIX(pid); +} + + +/* + * call-seq: + * Process.wait2(pid=-1, flags=0) => [pid, status] + * Process.waitpid2(pid=-1, flags=0) => [pid, status] + * + * Waits for a child process to exit (see Process::waitpid for exact + * semantics) and returns an array containing the process id and the + * exit status (a <code>Process::Status</code> object) of that + * child. Raises a <code>SystemError</code> if there are no child + * processes. + * + * Process.fork { exit 99 } #=> 27437 + * pid, status = Process.wait2 + * pid #=> 27437 + * status.exitstatus #=> 99 + */ + +static VALUE +proc_wait2(argc, argv) + int argc; + VALUE *argv; +{ + VALUE pid = proc_wait(argc, argv); + if (NIL_P(pid)) return Qnil; + return rb_assoc_new(pid, rb_last_status); +} + + +/* + * call-seq: + * Process.waitall => [ [pid1,status1], ...] + * + * Waits for all children, returning an array of + * _pid_/_status_ pairs (where _status_ is a + * <code>Process::Status</code> object). + * + * fork { sleep 0.2; exit 2 } #=> 27432 + * fork { sleep 0.1; exit 1 } #=> 27433 + * fork { exit 0 } #=> 27434 + * p Process.waitall + * + * <em>produces</em>: + * + * [[27434, #<Process::Status: pid=27434,exited(0)>], + * [27433, #<Process::Status: pid=27433,exited(1)>], + * [27432, #<Process::Status: pid=27432,exited(2)>]] + */ + +static VALUE +proc_waitall() +{ + VALUE result; + int pid, status; + + rb_secure(2); + result = rb_ary_new(); +#ifdef NO_WAITPID + if (pid_tbl) { + st_foreach(pid_tbl, waitall_each, result); + } + + for (pid = -1;;) { + pid = wait(&status); + if (pid == -1) { + if (errno == ECHILD) + break; + if (errno == EINTR) { + rb_thread_schedule(); + continue; + } + rb_sys_fail(0); + } + last_status_set(status, pid); + rb_ary_push(result, rb_assoc_new(INT2NUM(pid), rb_last_status)); + } +#else + rb_last_status = Qnil; + for (pid = -1;;) { + pid = rb_waitpid(-1, &status, 0); + if (pid == -1) { + if (errno == ECHILD) + break; + rb_sys_fail(0); + } + rb_ary_push(result, rb_assoc_new(INT2NUM(pid), rb_last_status)); + } +#endif + return result; +} + +static VALUE +detach_process_watcher(arg) + void *arg; +{ + int pid = (int)(VALUE)arg, status; + + while (rb_waitpid(pid, &status, WNOHANG) == 0) { + rb_thread_sleep(1); + } + return rb_last_status; +} + +VALUE +rb_detach_process(pid) + int pid; +{ + return rb_thread_create(detach_process_watcher, (void*)(VALUE)pid); +} + + +/* + * call-seq: + * Process.detach(pid) => thread + * + * Some operating systems retain the status of terminated child + * processes until the parent collects that status (normally using + * some variant of <code>wait()</code>. If the parent never collects + * this status, the child stays around as a <em>zombie</em> process. + * <code>Process::detach</code> prevents this by setting up a + * separate Ruby thread whose sole job is to reap the status of the + * process _pid_ when it terminates. Use <code>detach</code> + * only when you do not intent to explicitly wait for the child to + * terminate. <code>detach</code> only checks the status + * periodically (currently once each second). + * + * The waiting thread returns the exit status of the detached process + * when it terminates, so you can use <code>Thread#join</code> to + * know the result. If specified _pid_ is not a valid child process + * ID, the thread returns +nil+ immediately. + * + * In this first example, we don't reap the first child process, so + * it appears as a zombie in the process status display. + * + * p1 = fork { sleep 0.1 } + * p2 = fork { sleep 0.2 } + * Process.waitpid(p2) + * sleep 2 + * system("ps -ho pid,state -p #{p1}") + * + * <em>produces:</em> + * + * 27389 Z + * + * In the next example, <code>Process::detach</code> is used to reap + * the child automatically. + * + * p1 = fork { sleep 0.1 } + * p2 = fork { sleep 0.2 } + * Process.detach(p1) + * Process.waitpid(p2) + * sleep 2 + * system("ps -ho pid,state -p #{p1}") + * + * <em>(produces no output)</em> + */ + +static VALUE +proc_detach(VALUE obj, VALUE pid) +{ + rb_secure(2); + return rb_detach_process(NUM2INT(pid)); +} + +#ifndef HAVE_STRING_H +char *strtok(); +#endif + +#ifdef HAVE_SETITIMER +#define before_exec() rb_thread_stop_timer() +#define after_exec() rb_thread_start_timer() +#else +#define before_exec() +#define after_exec() +#endif + +extern char *dln_find_exe(); + +static void +security(str) + char *str; +{ + if (rb_env_path_tainted()) { + if (rb_safe_level() > 0) { + rb_raise(rb_eSecurityError, "Insecure PATH - %s", str); + } + } +} + +static int +proc_exec_v(argv, prog) + char **argv; + char *prog; +{ + if (!prog) + prog = argv[0]; + security(prog); + prog = dln_find_exe(prog, 0); + if (!prog) + return -1; + +#if (defined(MSDOS) && !defined(DJGPP)) || defined(__human68k__) || defined(__EMX__) || defined(OS2) + { +#if defined(__human68k__) +#define COMMAND "command.x" +#endif +#if defined(__EMX__) || defined(OS2) /* OS/2 emx */ +#define COMMAND "cmd.exe" +#endif +#if (defined(MSDOS) && !defined(DJGPP)) +#define COMMAND "command.com" +#endif + char *extension; + + if ((extension = strrchr(prog, '.')) != NULL && strcasecmp(extension, ".bat") == 0) { + char **new_argv; + char *p; + int n; + + for (n = 0; argv[n]; n++) + /* no-op */; + new_argv = ALLOCA_N(char*, n + 2); + for (; n > 0; n--) + new_argv[n + 1] = argv[n]; + new_argv[1] = strcpy(ALLOCA_N(char, strlen(argv[0]) + 1), argv[0]); + for (p = new_argv[1]; *p != '\0'; p++) + if (*p == '/') + *p = '\\'; + new_argv[0] = COMMAND; + argv = new_argv; + prog = dln_find_exe(argv[0], 0); + if (!prog) { + errno = ENOENT; + return -1; + } + } + } +#endif /* MSDOS or __human68k__ or __EMX__ */ + before_exec(); + rb_thread_cancel_timer(); + execv(prog, argv); + preserving_errno(after_exec()); + return -1; +} + +static int +proc_exec_n(argc, argv, progv) + int argc; + VALUE *argv; + VALUE progv; +{ + char *prog = 0; + char **args; + int i; + + if (progv) { + prog = RSTRING(progv)->ptr; + } + args = ALLOCA_N(char*, argc+1); + for (i=0; i<argc; i++) { + SafeStringValue(argv[i]); + args[i] = RSTRING(argv[i])->ptr; + } + args[i] = 0; + if (args[0]) { + return proc_exec_v(args, prog); + } + return -1; +} + +int +rb_proc_exec(str) + const char *str; +{ + const char *s = str; + char *ss, *t; + char **argv, **a; + + while (*str && ISSPACE(*str)) + str++; + +#ifdef _WIN32 + before_exec(); + do_spawn(P_OVERLAY, (char *)str); + after_exec(); +#else + for (s=str; *s; s++) { + if (*s != ' ' && !ISALPHA(*s) && strchr("*?{}[]<>()~&|\\$;'`\"\n",*s)) { +#if defined(MSDOS) + int status; + before_exec(); + status = system(str); + after_exec(); + if (status != -1) + exit(status); +#else +#if defined(__human68k__) || defined(__CYGWIN32__) || defined(__EMX__) + char *shell = dln_find_exe("sh", 0); + int status = -1; + before_exec(); + if (shell) + execl(shell, "sh", "-c", str, (char *) NULL); + else + status = system(str); + after_exec(); + if (status != -1) + exit(status); +#else + before_exec(); + execl("/bin/sh", "sh", "-c", str, (char *)NULL); + preserving_errno(after_exec()); +#endif +#endif + return -1; + } + } + a = argv = ALLOCA_N(char*, (s-str)/2+2); + ss = ALLOCA_N(char, s-str+1); + strcpy(ss, str); + if ((*a++ = strtok(ss, " \t")) != 0) { + while ((t = strtok(NULL, " \t")) != 0) { + *a++ = t; + } + *a = NULL; + } + if (argv[0]) { + return proc_exec_v(argv, 0); + } + errno = ENOENT; +#endif /* _WIN32 */ + return -1; +} + +#if defined(__human68k__) || defined(__DJGPP__) || defined(_WIN32) +static int +proc_spawn_v(argv, prog) + char **argv; + char *prog; +{ + char *extension; + int status; + + if (!prog) + prog = argv[0]; + security(prog); + prog = dln_find_exe(prog, 0); + if (!prog) + return -1; + +#if defined(__human68k__) + if ((extension = strrchr(prog, '.')) != NULL && strcasecmp(extension, ".bat") == 0) { + char **new_argv; + char *p; + int n; + + for (n = 0; argv[n]; n++) + /* no-op */; + new_argv = ALLOCA_N(char*, n + 2); + for (; n > 0; n--) + new_argv[n + 1] = argv[n]; + new_argv[1] = strcpy(ALLOCA_N(char, strlen(argv[0]) + 1), argv[0]); + for (p = new_argv[1]; *p != '\0'; p++) + if (*p == '/') + *p = '\\'; + new_argv[0] = COMMAND; + argv = new_argv; + prog = dln_find_exe(argv[0], 0); + if (!prog) { + errno = ENOENT; + return -1; + } + } +#endif + before_exec(); +#if defined(_WIN32) + status = do_aspawn(P_WAIT, prog, argv); +#else + status = spawnv(P_WAIT, prog, argv); +#endif + after_exec(); + return status; +} + +static int +proc_spawn_n(argc, argv, prog) + int argc; + VALUE *argv; + VALUE prog; +{ + char **args; + int i; + + args = ALLOCA_N(char*, argc + 1); + for (i = 0; i < argc; i++) { + SafeStringValue(argv[i]); + args[i] = StringValueCStr(argv[i]); + } + if (prog) + SafeStringValue(prog); + args[i] = (char*) 0; + if (args[0]) + return proc_spawn_v(args, prog ? StringValueCStr(prog) : 0); + return -1; +} + +#if !defined(_WIN32) +static int +proc_spawn(sv) + VALUE sv; +{ + char *str; + char *s, *t; + char **argv, **a; + int status; + + SafeStringValue(sv); + str = s = StringValueCStr(sv); + for (s = str; *s; s++) { + if (*s != ' ' && !ISALPHA(*s) && strchr("*?{}[]<>()~&|\\$;'`\"\n",*s)) { + char *shell = dln_find_exe("sh", 0); + before_exec(); + status = shell?spawnl(P_WAIT,shell,"sh","-c",str,(char*)NULL):system(str); + after_exec(); + return status; + } + } + a = argv = ALLOCA_N(char*, (s - str) / 2 + 2); + s = ALLOCA_N(char, s - str + 1); + strcpy(s, str); + if (*a++ = strtok(s, " \t")) { + while (t = strtok(NULL, " \t")) + *a++ = t; + *a = NULL; + } + return argv[0] ? proc_spawn_v(argv, 0) : -1; +} +#endif +#endif + +struct rb_exec_arg { + int argc; + VALUE *argv; + VALUE prog; +}; + +static void +proc_prepare_args(e, argc, argv, prog) + struct rb_exec_arg *e; + int argc; + VALUE *argv; + VALUE prog; +{ + int i; + + MEMZERO(e, struct rb_exec_arg, 1); + if (prog) { + SafeStringValue(prog); + StringValueCStr(prog); + } + for (i = 0; i < argc; i++) { + SafeStringValue(argv[i]); + StringValueCStr(argv[i]); + } + security(RSTRING(prog ? prog : argv[0])->ptr); + e->prog = prog; + e->argc = argc; + e->argv = argv; +} + +static VALUE +proc_exec_args(earg) + VALUE earg; +{ + struct rb_exec_arg *e = (struct rb_exec_arg *)earg; + int argc = e->argc; + VALUE *argv = e->argv; + VALUE prog = e->prog; + + if (argc == 1 && prog == 0) { + return (VALUE)rb_proc_exec(RSTRING(argv[0])->ptr); + } + else { + return (VALUE)proc_exec_n(argc, argv, prog); + } +} + +/* + * call-seq: + * exec(command [, arg, ...]) + * + * Replaces the current process by running the given external _command_. + * If +exec+ is given a single argument, that argument is + * taken as a line that is subject to shell expansion before being + * executed. If multiple arguments are given, the second and subsequent + * arguments are passed as parameters to _command_ with no shell + * expansion. If the first argument is a two-element array, the first + * element is the command to be executed, and the second argument is + * used as the <code>argv[0]</code> value, which may show up in process + * listings. In MSDOS environments, the command is executed in a + * subshell; otherwise, one of the <code>exec(2)</code> system calls is + * used, so the running command may inherit some of the environment of + * the original program (including open file descriptors). + * + * exec "echo *" # echoes list of files in current directory + * # never get here + * + * + * exec "echo", "*" # echoes an asterisk + * # never get here + */ + +VALUE +rb_f_exec(argc, argv) + int argc; + VALUE *argv; +{ + VALUE prog = 0; + VALUE tmp; + struct rb_exec_arg earg; + + if (argc == 0) { + rb_last_status = Qnil; + rb_raise(rb_eArgError, "wrong number of arguments"); + } + + tmp = rb_check_array_type(argv[0]); + if (!NIL_P(tmp)) { + if (RARRAY(tmp)->len != 2) { + rb_raise(rb_eArgError, "wrong first argument"); + } + prog = RARRAY(tmp)->ptr[0]; + argv[0] = RARRAY(tmp)->ptr[1]; + SafeStringValue(prog); + } + proc_prepare_args(&earg, argc, argv, prog); + proc_exec_args((VALUE)&earg); + rb_sys_fail(RSTRING(argv[0])->ptr); + return Qnil; /* dummy */ +} + + +/* + * call-seq: + * Kernel.fork [{ block }] => fixnum or nil + * Process.fork [{ block }] => fixnum or nil + * + * Creates a subprocess. If a block is specified, that block is run + * in the subprocess, and the subprocess terminates with a status of + * zero. Otherwise, the +fork+ call returns twice, once in + * the parent, returning the process ID of the child, and once in + * the child, returning _nil_. The child process can exit using + * <code>Kernel.exit!</code> to avoid running any + * <code>at_exit</code> functions. The parent process should + * use <code>Process.wait</code> to collect the termination statuses + * of its children or use <code>Process.detach</code> to register + * disinterest in their status; otherwise, the operating system + * may accumulate zombie processes. + * + * The thread calling fork is the only thread in the created child process. + * fork doesn't copy other threads. + */ + +static VALUE +rb_f_fork(obj) + VALUE obj; +{ +#if !defined(__human68k__) && !defined(_WIN32) && !defined(__MACOS__) && !defined(__EMX__) && !defined(__VMS) + int pid; + + rb_secure(2); + +#ifndef __VMS + fflush(stdout); + fflush(stderr); +#endif + + switch (pid = fork()) { + case 0: +#ifdef linux + after_exec(); +#endif + rb_thread_atfork(); + if (rb_block_given_p()) { + int status; + + rb_protect(rb_yield, Qundef, &status); + ruby_stop(status); + } + return Qnil; + + case -1: + rb_sys_fail("fork(2)"); + return Qnil; + + default: + return INT2FIX(pid); + } +#else + rb_notimplement(); +#endif +} + + +/* + * call-seq: + * Process.exit!(fixnum=-1) + * + * Exits the process immediately. No exit handlers are + * run. <em>fixnum</em> is returned to the underlying system as the + * exit status. + * + * Process.exit!(0) + */ + +static VALUE +rb_f_exit_bang(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE status; + int istatus; + + rb_secure(4); + if (rb_scan_args(argc, argv, "01", &status) == 1) { + switch (status) { + case Qtrue: + istatus = EXIT_SUCCESS; + break; + case Qfalse: + istatus = EXIT_FAILURE; + break; + default: + istatus = NUM2INT(status); + break; + } + } + else { + istatus = EXIT_FAILURE; + } + _exit(istatus); + + return Qnil; /* not reached */ +} + +#if defined(sun) +#define signal(a,b) sigset(a,b) +#endif + +void +rb_syswait(pid) + int pid; +{ + static int overriding; +#ifdef SIGHUP + RETSIGTYPE (*hfunc)_((int)); +#endif +#ifdef SIGQUIT + RETSIGTYPE (*qfunc)_((int)); +#endif + RETSIGTYPE (*ifunc)_((int)); + int status; + int i, hooked = Qfalse; + + if (!overriding) { +#ifdef SIGHUP + hfunc = signal(SIGHUP, SIG_IGN); +#endif +#ifdef SIGQUIT + qfunc = signal(SIGQUIT, SIG_IGN); +#endif + ifunc = signal(SIGINT, SIG_IGN); + overriding = Qtrue; + hooked = Qtrue; + } + + do { + i = rb_waitpid(pid, &status, 0); + } while (i == -1 && errno == EINTR); + + if (hooked) { +#ifdef SIGHUP + signal(SIGHUP, hfunc); +#endif +#ifdef SIGQUIT + signal(SIGQUIT, qfunc); +#endif + signal(SIGINT, ifunc); + overriding = Qfalse; + } +} + +/* + * call-seq: + * system(cmd [, arg, ...]) => true or false + * + * Executes _cmd_ in a subshell, returning +true+ if + * the command was found and ran successfully, +false+ + * otherwise. An error status is available in <code>$?</code>. The + * arguments are processed in the same way as for + * <code>Kernel::exec</code>. + * + * system("echo *") + * system("echo", "*") + * + * <em>produces:</em> + * + * config.h main.rb + * * + */ + +static VALUE +rb_f_system(argc, argv) + int argc; + VALUE *argv; +{ + int status; +#if defined(__EMX__) + VALUE cmd; + + fflush(stdout); + fflush(stderr); + if (argc == 0) { + rb_last_status = Qnil; + rb_raise(rb_eArgError, "wrong number of arguments"); + } + + if (TYPE(argv[0]) == T_ARRAY) { + if (RARRAY(argv[0])->len != 2) { + rb_raise(rb_eArgError, "wrong first argument"); + } + argv[0] = RARRAY(argv[0])->ptr[0]; + } + cmd = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" ")); + + SafeStringValue(cmd); + status = do_spawn(RSTRING(cmd)->ptr); + last_status_set(status, 0); +#elif defined(__human68k__) || defined(__DJGPP__) || defined(_WIN32) + volatile VALUE prog = 0; + + fflush(stdout); + fflush(stderr); + if (argc == 0) { + rb_last_status = Qnil; + rb_raise(rb_eArgError, "wrong number of arguments"); + } + + if (TYPE(argv[0]) == T_ARRAY) { + if (RARRAY(argv[0])->len != 2) { + rb_raise(rb_eArgError, "wrong first argument"); + } + prog = RARRAY(argv[0])->ptr[0]; + argv[0] = RARRAY(argv[0])->ptr[1]; + } + + if (argc == 1 && prog == 0) { +#if defined(_WIN32) + SafeStringValue(argv[0]); + status = do_spawn(P_WAIT, StringValueCStr(argv[0])); +#else + status = proc_spawn(argv[0]); +#endif + } + else { + status = proc_spawn_n(argc, argv, prog); + } +#if !defined(_WIN32) + last_status_set(status == -1 ? 127 : status, 0); +#else + if (status == -1) + last_status_set(0x7f << 8, 0); +#endif +#elif defined(__VMS) + VALUE cmd; + + if (argc == 0) { + rb_last_status = Qnil; + rb_raise(rb_eArgError, "wrong number of arguments"); + } + + if (TYPE(argv[0]) == T_ARRAY) { + if (RARRAY(argv[0])->len != 2) { + rb_raise(rb_eArgError, "wrong first argument"); + } + argv[0] = RARRAY(argv[0])->ptr[0]; + } + cmd = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" ")); + + SafeStringValue(cmd); + status = system(StringValueCStr(cmd)); + last_status_set((status & 0xff) << 8, 0); +#else + volatile VALUE prog = 0; + int pid; + struct rb_exec_arg earg; + RETSIGTYPE (*chfunc)(int); + + fflush(stdout); + fflush(stderr); + if (argc == 0) { + rb_last_status = Qnil; + rb_raise(rb_eArgError, "wrong number of arguments"); + } + + if (TYPE(argv[0]) == T_ARRAY) { + if (RARRAY(argv[0])->len != 2) { + rb_raise(rb_eArgError, "wrong first argument"); + } + prog = RARRAY(argv[0])->ptr[0]; + argv[0] = RARRAY(argv[0])->ptr[1]; + } + proc_prepare_args(&earg, argc, argv, prog); + + chfunc = signal(SIGCHLD, SIG_DFL); + retry: + pid = fork(); + if (pid == 0) { + /* child process */ + rb_thread_atfork(); + rb_protect(proc_exec_args, (VALUE)&earg, NULL); + _exit(127); + } + if (pid < 0) { + if (errno == EAGAIN) { + rb_thread_sleep(1); + goto retry; + } + } + else { + rb_syswait(pid); + } + signal(SIGCHLD, chfunc); + if (pid < 0) rb_sys_fail(0); + status = NUM2INT(rb_last_status); +#endif + + if (status == EXIT_SUCCESS) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * sleep([duration]) => fixnum + * + * Suspends the current thread for _duration_ seconds (which may be any number, + * including a +Float+ with fractional seconds). Returns the actual number of + * seconds slept (rounded), which may be less than that asked for if another + * thread calls <code>Thread#run</code>. Zero arguments causes +sleep+ to sleep + * forever. + * + * Time.new #=> Wed Apr 09 08:56:32 CDT 2003 + * sleep 1.2 #=> 1 + * Time.new #=> Wed Apr 09 08:56:33 CDT 2003 + * sleep 1.9 #=> 2 + * Time.new #=> Wed Apr 09 08:56:35 CDT 2003 + */ + +static VALUE +rb_f_sleep(argc, argv) + int argc; + VALUE *argv; +{ + int beg, end; + + beg = time(0); + if (argc == 0) { + rb_thread_sleep_forever(); + } + else if (argc == 1) { + rb_thread_wait_for(rb_time_interval(argv[0])); + } + else { + rb_raise(rb_eArgError, "wrong number of arguments"); + } + + end = time(0) - beg; + + return INT2FIX(end); +} + + +/* + * call-seq: + * Process.getpgrp => integer + * + * Returns the process group ID for this process. Not available on + * all platforms. + * + * Process.getpgid(0) #=> 25527 + * Process.getpgrp #=> 25527 + */ + +#if defined(SIGCLD) && !defined(SIGCHLD) +# define SIGCHLD SIGCLD +#endif + +static VALUE +proc_getpgrp() +{ + int pgrp; + + rb_secure(2); +#if defined(HAVE_GETPGRP) && defined(GETPGRP_VOID) + pgrp = getpgrp(); + if (pgrp < 0) rb_sys_fail(0); + return INT2FIX(pgrp); +#else +# ifdef HAVE_GETPGID + pgrp = getpgid(0); + if (pgrp < 0) rb_sys_fail(0); + return INT2FIX(pgrp); +# else + rb_notimplement(); +# endif +#endif +} + + +/* + * call-seq: + * Process.setpgrp => 0 + * + * Equivalent to <code>setpgid(0,0)</code>. Not available on all + * platforms. + */ + +static VALUE +proc_setpgrp() +{ + rb_secure(2); + /* check for posix setpgid() first; this matches the posix */ + /* getpgrp() above. It appears that configure will set SETPGRP_VOID */ + /* even though setpgrp(0,0) would be prefered. The posix call avoids */ + /* this confusion. */ +#ifdef HAVE_SETPGID + if (setpgid(0,0) < 0) rb_sys_fail(0); +#elif defined(HAVE_SETPGRP) && defined(SETPGRP_VOID) + if (setpgrp() < 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return INT2FIX(0); +} + + +/* + * call-seq: + * Process.getpgid(pid) => integer + * + * Returns the process group ID for the given process id. Not + * available on all platforms. + * + * Process.getpgid(Process.ppid()) #=> 25527 + */ + +static VALUE +proc_getpgid(obj, pid) + VALUE obj, pid; +{ +#if defined(HAVE_GETPGID) && !defined(__CHECKER__) + int i; + + rb_secure(2); + i = getpgid(NUM2INT(pid)); + if (i < 0) rb_sys_fail(0); + return INT2NUM(i); +#else + rb_notimplement(); +#endif +} + + +/* + * call-seq: + * Process.setpgid(pid, integer) => 0 + * + * Sets the process group ID of _pid_ (0 indicates this + * process) to <em>integer</em>. Not available on all platforms. + */ + +static VALUE +proc_setpgid(obj, pid, pgrp) + VALUE obj, pid, pgrp; +{ +#ifdef HAVE_SETPGID + int ipid, ipgrp; + + rb_secure(2); + ipid = NUM2INT(pid); + ipgrp = NUM2INT(pgrp); + + if (setpgid(ipid, ipgrp) < 0) rb_sys_fail(0); + return INT2FIX(0); +#else + rb_notimplement(); +#endif +} + + +/* + * call-seq: + * Process.setsid => fixnum + * + * Establishes this process as a new session and process group + * leader, with no controlling tty. Returns the session id. Not + * available on all platforms. + * + * Process.setsid #=> 27422 + */ + +static VALUE +proc_setsid() +{ +#if defined(HAVE_SETSID) + int pid; + + rb_secure(2); + pid = setsid(); + if (pid < 0) rb_sys_fail(0); + return INT2FIX(pid); +#elif defined(HAVE_SETPGRP) && defined(TIOCNOTTY) + rb_pid_t pid; + int ret; + + rb_secure(2); + pid = getpid(); +#if defined(SETPGRP_VOID) + ret = setpgrp(); + /* If `pid_t setpgrp(void)' is equivalent to setsid(), + `ret' will be the same value as `pid', and following open() will fail. + In Linux, `int setpgrp(void)' is equivalent to setpgid(0, 0). */ +#else + ret = setpgrp(0, pid); +#endif + if (ret == -1) rb_sys_fail(0); + + if ((fd = open("/dev/tty", O_RDWR)) >= 0) { + ioctl(fd, TIOCNOTTY, NULL); + close(fd); + } + return INT2FIX(pid); +#else + rb_notimplement(); +#endif +} + + +/* + * call-seq: + * Process.getpriority(kind, integer) => fixnum + * + * Gets the scheduling priority for specified process, process group, + * or user. <em>kind</em> indicates the kind of entity to find: one + * of <code>Process::PRIO_PGRP</code>, + * <code>Process::PRIO_USER</code>, or + * <code>Process::PRIO_PROCESS</code>. _integer_ is an id + * indicating the particular process, process group, or user (an id + * of 0 means _current_). Lower priorities are more favorable + * for scheduling. Not available on all platforms. + * + * Process.getpriority(Process::PRIO_USER, 0) #=> 19 + * Process.getpriority(Process::PRIO_PROCESS, 0) #=> 19 + */ + +static VALUE +proc_getpriority(obj, which, who) + VALUE obj, which, who; +{ +#ifdef HAVE_GETPRIORITY + int prio, iwhich, iwho; + + rb_secure(2); + iwhich = NUM2INT(which); + iwho = NUM2INT(who); + + errno = 0; + prio = getpriority(iwhich, iwho); + if (errno) rb_sys_fail(0); + return INT2FIX(prio); +#else + rb_notimplement(); +#endif +} + + +/* + * call-seq: + * Process.setpriority(kind, integer, priority) => 0 + * + * See <code>Process#getpriority</code>. + * + * Process.setpriority(Process::PRIO_USER, 0, 19) #=> 0 + * Process.setpriority(Process::PRIO_PROCESS, 0, 19) #=> 0 + * Process.getpriority(Process::PRIO_USER, 0) #=> 19 + * Process.getpriority(Process::PRIO_PROCESS, 0) #=> 19 + */ + +static VALUE +proc_setpriority(obj, which, who, prio) + VALUE obj, which, who, prio; +{ +#ifdef HAVE_GETPRIORITY + int iwhich, iwho, iprio; + + rb_secure(2); + iwhich = NUM2INT(which); + iwho = NUM2INT(who); + iprio = NUM2INT(prio); + + if (setpriority(iwhich, iwho, iprio) < 0) + rb_sys_fail(0); + return INT2FIX(0); +#else + rb_notimplement(); +#endif +} + +#if SIZEOF_RLIM_T == SIZEOF_INT +# define RLIM2NUM(v) UINT2NUM(v) +# define NUM2RLIM(v) NUM2UINT(v) +#elif SIZEOF_RLIM_T == SIZEOF_LONG +# define RLIM2NUM(v) ULONG2NUM(v) +# define NUM2RLIM(v) NUM2ULONG(v) +#elif SIZEOF_RLIM_T == SIZEOF_LONG_LONG +# define RLIM2NUM(v) ULL2NUM(v) +# define NUM2RLIM(v) NUM2ULL(v) +#endif + +/* + * call-seq: + * Process.getrlimit(resource) => [cur_limit, max_limit] + * + * Gets the resource limit of the process. + * _cur_limit_ means current (soft) limit and + * _max_limit_ means maximum (hard) limit. + * + * _resource_ indicates the kind of resource to limit: + * such as <code>Process::RLIMIT_CORE</code>, + * <code>Process::RLIMIT_CPU</code>, etc. + * See Process.setrlimit for details. + * + * _cur_limit_ and _max_limit_ may be <code>Process::RLIM_INFINITY</code>, + * <code>Process::RLIM_SAVED_MAX</code> or + * <code>Process::RLIM_SAVED_CUR</code>. + * See Process.setrlimit and the system getrlimit(2) manual for details. + */ + +static VALUE +proc_getrlimit(VALUE obj, VALUE resource) +{ +#if defined(HAVE_GETRLIMIT) && defined(RLIM2NUM) + struct rlimit rlim; + + rb_secure(2); + + if (getrlimit(NUM2INT(resource), &rlim) < 0) { + rb_sys_fail("getrlimit"); + } + return rb_assoc_new(RLIM2NUM(rlim.rlim_cur), RLIM2NUM(rlim.rlim_max)); +#else + rb_notimplement(); +#endif +} + +/* + * call-seq: + * Process.setrlimit(resource, cur_limit, max_limit) => nil + * Process.setrlimit(resource, cur_limit) => nil + * + * Sets the resource limit of the process. + * _cur_limit_ means current (soft) limit and + * _max_limit_ means maximum (hard) limit. + * + * If _max_limit_ is not given, _cur_limit_ is used. + * + * _resource_ indicates the kind of resource to limit. + * The list of resources are OS dependent. + * Ruby may support following resources. + * + * [Process::RLIMIT_CORE] core size (bytes) (SUSv3) + * [Process::RLIMIT_CPU] CPU time (seconds) (SUSv3) + * [Process::RLIMIT_DATA] data segment (bytes) (SUSv3) + * [Process::RLIMIT_FSIZE] file size (bytes) (SUSv3) + * [Process::RLIMIT_NOFILE] file descriptors (number) (SUSv3) + * [Process::RLIMIT_STACK] stack size (bytes) (SUSv3) + * [Process::RLIMIT_AS] total available memory (bytes) (SUSv3, NetBSD, FreeBSD, OpenBSD but 4.4BSD-Lite) + * [Process::RLIMIT_MEMLOCK] total size for mlock(2) (bytes) (4.4BSD, GNU/Linux) + * [Process::RLIMIT_NPROC] number of processes for the user (number) (4.4BSD, GNU/Linux) + * [Process::RLIMIT_RSS] resident memory size (bytes) (4.2BSD, GNU/Linux) + * [Process::RLIMIT_SBSIZE] all socket buffers (bytes) (NetBSD, FreeBSD) + * + * Other <code>Process::RLIMIT_???</code> constants may be defined. + * + * _cur_limit_ and _max_limit_ may be <code>Process::RLIM_INFINITY</code>, + * which means that the resource is not limited. + * They may be <code>Process::RLIM_SAVED_MAX</code> or + * <code>Process::RLIM_SAVED_CUR</code> too. + * See system setrlimit(2) manual for details. + * + */ + +static VALUE +proc_setrlimit(int argc, VALUE *argv, VALUE obj) +{ +#if defined(HAVE_SETRLIMIT) && defined(NUM2RLIM) + VALUE resource, rlim_cur, rlim_max; + struct rlimit rlim; + + rb_secure(2); + + rb_scan_args(argc, argv, "21", &resource, &rlim_cur, &rlim_max); + if (rlim_max == Qnil) + rlim_max = rlim_cur; + + rlim.rlim_cur = NUM2RLIM(rlim_cur); + rlim.rlim_max = NUM2RLIM(rlim_max); + + if (setrlimit(NUM2INT(resource), &rlim) < 0) { + rb_sys_fail("setrlimit"); + } + return Qnil; +#else + rb_notimplement(); +#endif +} + +static int under_uid_switch = 0; +static void +check_uid_switch() +{ + rb_secure(2); + if (under_uid_switch) { + rb_raise(rb_eRuntimeError, "can't handle UID while evaluating block given to Process::UID.switch method"); + } +} + +static int under_gid_switch = 0; +static void +check_gid_switch() +{ + rb_secure(2); + if (under_gid_switch) { + rb_raise(rb_eRuntimeError, "can't handle GID while evaluating block given to Process::UID.switch method"); + } +} + + +/********************************************************************* + * Document-class: Process::Sys + * + * The <code>Process::Sys</code> module contains UID and GID + * functions which provide direct bindings to the system calls of the + * same names instead of the more-portable versions of the same + * functionality found in the <code>Process</code>, + * <code>Process::UID</code>, and <code>Process::GID</code> modules. + */ + + +/* + * call-seq: + * Process::Sys.setuid(integer) => nil + * + * Set the user ID of the current process to _integer_. Not + * available on all platforms. + * + */ + +static VALUE +p_sys_setuid(obj, id) + VALUE obj, id; +{ +#if defined HAVE_SETUID + check_uid_switch(); + if (setuid(NUM2INT(id)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + + + +/* + * call-seq: + * Process::Sys.setruid(integer) => nil + * + * Set the real user ID of the calling process to _integer_. + * Not available on all platforms. + * + */ + +static VALUE +p_sys_setruid(obj, id) + VALUE obj, id; +{ +#if defined HAVE_SETRUID + check_uid_switch(); + if (setruid(NUM2INT(id)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + + +/* + * call-seq: + * Process::Sys.seteuid(integer) => nil + * + * Set the effective user ID of the calling process to + * _integer_. Not available on all platforms. + * + */ + +static VALUE +p_sys_seteuid(obj, id) + VALUE obj, id; +{ +#if defined HAVE_SETEUID + check_uid_switch(); + if (seteuid(NUM2INT(id)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + + +/* + * call-seq: + * Process::Sys.setreuid(rid, eid) => nil + * + * Sets the (integer) real and/or effective user IDs of the current + * process to _rid_ and _eid_, respectively. A value of + * <code>-1</code> for either means to leave that ID unchanged. Not + * available on all platforms. + * + */ + +static VALUE +p_sys_setreuid(obj, rid, eid) + VALUE obj, rid, eid; +{ +#if defined HAVE_SETREUID + check_uid_switch(); + if (setreuid(NUM2INT(rid),NUM2INT(eid)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + + +/* + * call-seq: + * Process::Sys.setresuid(rid, eid, sid) => nil + * + * Sets the (integer) real, effective, and saved user IDs of the + * current process to _rid_, _eid_, and _sid_ respectively. A + * value of <code>-1</code> for any value means to + * leave that ID unchanged. Not available on all platforms. + * + */ + +static VALUE +p_sys_setresuid(obj, rid, eid, sid) + VALUE obj, rid, eid, sid; +{ +#if defined HAVE_SETRESUID + check_uid_switch(); + if (setresuid(NUM2INT(rid),NUM2INT(eid),NUM2INT(sid)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + + +/* + * call-seq: + * Process.uid => fixnum + * Process::UID.rid => fixnum + * Process::Sys.getuid => fixnum + * + * Returns the (real) user ID of this process. + * + * Process.uid #=> 501 + */ + +static VALUE +proc_getuid(obj) + VALUE obj; +{ + int uid = getuid(); + return INT2FIX(uid); +} + + +/* + * call-seq: + * Process.uid= integer => numeric + * + * Sets the (integer) user ID for this process. Not available on all + * platforms. + */ + +static VALUE +proc_setuid(obj, id) + VALUE obj, id; +{ + int uid = NUM2INT(id); + + check_uid_switch(); +#if defined(HAVE_SETRESUID) && !defined(__CHECKER__) + if (setresuid(uid, -1, -1) < 0) rb_sys_fail(0); +#elif defined HAVE_SETREUID + if (setreuid(uid, -1) < 0) rb_sys_fail(0); +#elif defined HAVE_SETRUID + if (setruid(uid) < 0) rb_sys_fail(0); +#elif defined HAVE_SETUID + { + if (geteuid() == uid) { + if (setuid(uid) < 0) rb_sys_fail(0); + } + else { + rb_notimplement(); + } + } +#else + rb_notimplement(); +#endif + return INT2FIX(uid); +} + + +/******************************************************************** + * + * Document-class: Process::UID + * + * The <code>Process::UID</code> module contains a collection of + * module functions which can be used to portably get, set, and + * switch the current process's real, effective, and saved user IDs. + * + */ + +static int SAVED_USER_ID = -1; + +#ifdef BROKEN_SETREUID +int +setreuid(ruid, euid) + rb_uid_t ruid, euid; +{ + if (ruid != -1 && ruid != getuid()) { + if (euid == -1) euid = geteuid(); + if (setuid(ruid) < 0) return -1; + } + if (euid != -1 && euid != geteuid()) { + if (seteuid(euid) < 0) return -1; + } + return 0; +} +#endif + +/* + * call-seq: + * Process::UID.change_privilege(integer) => fixnum + * + * Change the current process's real and effective user ID to that + * specified by _integer_. Returns the new user ID. Not + * available on all platforms. + * + * [Process.uid, Process.euid] #=> [0, 0] + * Process::UID.change_privilege(31) #=> 31 + * [Process.uid, Process.euid] #=> [31, 31] + */ + +static VALUE +p_uid_change_privilege(obj, id) + VALUE obj, id; +{ + int uid; + + check_uid_switch(); + + uid = NUM2INT(id); + + if (geteuid() == 0) { /* root-user */ +#if defined(HAVE_SETRESUID) + if (setresuid(uid, uid, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; +#elif defined(HAVE_SETUID) + if (setuid(uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; +#elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) + if (getuid() == uid) { + if (SAVED_USER_ID == uid) { + if (setreuid(-1, uid) < 0) rb_sys_fail(0); + } else { + if (uid == 0) { /* (r,e,s) == (root, root, x) */ + if (setreuid(-1, SAVED_USER_ID) < 0) rb_sys_fail(0); + if (setreuid(SAVED_USER_ID, 0) < 0) rb_sys_fail(0); + SAVED_USER_ID = 0; /* (r,e,s) == (x, root, root) */ + if (setreuid(uid, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } else { + if (setreuid(0, -1) < 0) rb_sys_fail(0); + SAVED_USER_ID = 0; + if (setreuid(uid, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } + } + } else { + if (setreuid(uid, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } +#elif defined(HAVE_SETRUID) && defined(HAVE_SETEUID) + if (getuid() == uid) { + if (SAVED_USER_ID == uid) { + if (seteuid(uid) < 0) rb_sys_fail(0); + } else { + if (uid == 0) { + if (setruid(SAVED_USER_ID) < 0) rb_sys_fail(0); + SAVED_USER_ID = 0; + if (setruid(0) < 0) rb_sys_fail(0); + } else { + if (setruid(0) < 0) rb_sys_fail(0); + SAVED_USER_ID = 0; + if (seteuid(uid) < 0) rb_sys_fail(0); + if (setruid(uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } + } + } else { + if (seteuid(uid) < 0) rb_sys_fail(0); + if (setruid(uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } +#else + rb_notimplement(); +#endif + } else { /* unprivileged user */ +#if defined(HAVE_SETRESUID) + if (setresuid((getuid() == uid)? -1: uid, + (geteuid() == uid)? -1: uid, + (SAVED_USER_ID == uid)? -1: uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; +#elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) + if (SAVED_USER_ID == uid) { + if (setreuid((getuid() == uid)? -1: uid, + (geteuid() == uid)? -1: uid) < 0) rb_sys_fail(0); + } else if (getuid() != uid) { + if (setreuid(uid, (geteuid() == uid)? -1: uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } else if (/* getuid() == uid && */ geteuid() != uid) { + if (setreuid(geteuid(), uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + if (setreuid(uid, -1) < 0) rb_sys_fail(0); + } else { /* getuid() == uid && geteuid() == uid */ + if (setreuid(-1, SAVED_USER_ID) < 0) rb_sys_fail(0); + if (setreuid(SAVED_USER_ID, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + if (setreuid(uid, -1) < 0) rb_sys_fail(0); + } +#elif defined(HAVE_SETRUID) && defined(HAVE_SETEUID) + if (SAVED_USER_ID == uid) { + if (geteuid() != uid && seteuid(uid) < 0) rb_sys_fail(0); + if (getuid() != uid && setruid(uid) < 0) rb_sys_fail(0); + } else if (/* SAVED_USER_ID != uid && */ geteuid() == uid) { + if (getuid() != uid) { + if (setruid(uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } else { + if (setruid(SAVED_USER_ID) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + if (setruid(uid) < 0) rb_sys_fail(0); + } + } else if (/* geteuid() != uid && */ getuid() == uid) { + if (seteuid(uid) < 0) rb_sys_fail(0); + if (setruid(SAVED_USER_ID) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + if (setruid(uid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } +#elif defined HAVE_44BSD_SETUID + if (getuid() == uid) { + /* (r,e,s)==(uid,?,?) ==> (uid,uid,uid) */ + if (setuid(uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } else { + errno = EPERM; + rb_sys_fail(0); + } +#elif defined HAVE_SETEUID + if (getuid() == uid && SAVED_USER_ID == uid) { + if (seteuid(uid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } +#elif defined HAVE_SETUID + if (getuid() == uid && SAVED_USER_ID == uid) { + if (setuid(uid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } +#else + rb_notimplement(); +#endif + } + return INT2FIX(uid); +} + + + +/* + * call-seq: + * Process::Sys.setgid(integer) => nil + * + * Set the group ID of the current process to _integer_. Not + * available on all platforms. + * + */ + +static VALUE +p_sys_setgid(obj, id) + VALUE obj, id; +{ +#if defined HAVE_SETGID + check_gid_switch(); + if (setgid(NUM2INT(id)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + + +/* + * call-seq: + * Process::Sys.setrgid(integer) => nil + * + * Set the real group ID of the calling process to _integer_. + * Not available on all platforms. + * + */ + +static VALUE +p_sys_setrgid(obj, id) + VALUE obj, id; +{ +#if defined HAVE_SETRGID + check_gid_switch(); + if (setrgid(NUM2INT(id)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + + + +/* + * call-seq: + * Process::Sys.setegid(integer) => nil + * + * Set the effective group ID of the calling process to + * _integer_. Not available on all platforms. + * + */ + +static VALUE +p_sys_setegid(obj, id) + VALUE obj, id; +{ +#if defined HAVE_SETEGID + check_gid_switch(); + if (setegid(NUM2INT(id)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + + +/* + * call-seq: + * Process::Sys.setregid(rid, eid) => nil + * + * Sets the (integer) real and/or effective group IDs of the current + * process to <em>rid</em> and <em>eid</em>, respectively. A value of + * <code>-1</code> for either means to leave that ID unchanged. Not + * available on all platforms. + * + */ + +static VALUE +p_sys_setregid(obj, rid, eid) + VALUE obj, rid, eid; +{ +#if defined HAVE_SETREGID + check_gid_switch(); + if (setregid(NUM2INT(rid),NUM2INT(eid)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + +/* + * call-seq: + * Process::Sys.setresgid(rid, eid, sid) => nil + * + * Sets the (integer) real, effective, and saved user IDs of the + * current process to <em>rid</em>, <em>eid</em>, and <em>sid</em> + * respectively. A value of <code>-1</code> for any value means to + * leave that ID unchanged. Not available on all platforms. + * + */ + +static VALUE +p_sys_setresgid(obj, rid, eid, sid) + VALUE obj, rid, eid, sid; +{ +#if defined HAVE_SETRESGID + check_gid_switch(); + if (setresgid(NUM2INT(rid),NUM2INT(eid),NUM2INT(sid)) != 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return Qnil; +} + + +/* + * call-seq: + * Process::Sys.issetugid => true or false + * + * Returns +true+ if the process was created as a result + * of an execve(2) system call which had either of the setuid or + * setgid bits set (and extra privileges were given as a result) or + * if it has changed any of its real, effective or saved user or + * group IDs since it began execution. + * + */ + +static VALUE +p_sys_issetugid(obj) + VALUE obj; +{ +#if defined HAVE_ISSETUGID + rb_secure(2); + if (issetugid()) { + return Qtrue; + } else { + return Qfalse; + } +#else + rb_notimplement(); + return Qnil; /* not reached */ +#endif +} + + +/* + * call-seq: + * Process.gid => fixnum + * Process::GID.rid => fixnum + * Process::Sys.getgid => fixnum + * + * Returns the (real) group ID for this process. + * + * Process.gid #=> 500 + */ + +static VALUE +proc_getgid(obj) + VALUE obj; +{ + int gid = getgid(); + return INT2FIX(gid); +} + + +/* + * call-seq: + * Process.gid= fixnum => fixnum + * + * Sets the group ID for this process. + */ + +static VALUE +proc_setgid(obj, id) + VALUE obj, id; +{ + int gid = NUM2INT(id); + + check_gid_switch(); +#if defined(HAVE_SETRESGID) && !defined(__CHECKER__) + if (setresgid(gid, -1, -1) < 0) rb_sys_fail(0); +#elif defined HAVE_SETREGID + if (setregid(gid, -1) < 0) rb_sys_fail(0); +#elif defined HAVE_SETRGID + if (setrgid(gid) < 0) rb_sys_fail(0); +#elif defined HAVE_SETGID + { + if (getegid() == gid) { + if (setgid(gid) < 0) rb_sys_fail(0); + } + else { + rb_notimplement(); + } + } +#else + rb_notimplement(); +#endif + return INT2FIX(gid); +} + + +static size_t maxgroups = 32; + + +/* + * call-seq: + * Process.groups => array + * + * Get an <code>Array</code> of the gids of groups in the + * supplemental group access list for this process. + * + * Process.groups #=> [27, 6, 10, 11] + * + */ + +static VALUE +proc_getgroups(VALUE obj) +{ +#ifdef HAVE_GETGROUPS + VALUE ary; + size_t ngroups; + rb_gid_t *groups; + int i; + + groups = ALLOCA_N(rb_gid_t, maxgroups); + + ngroups = getgroups(maxgroups, groups); + if (ngroups == -1) + rb_sys_fail(0); + + ary = rb_ary_new(); + for (i = 0; i < ngroups; i++) + rb_ary_push(ary, INT2NUM(groups[i])); + + return ary; +#else + rb_notimplement(); + return Qnil; +#endif +} + + +/* + * call-seq: + * Process.groups= array => array + * + * Set the supplemental group access list to the given + * <code>Array</code> of group IDs. + * + * Process.groups #=> [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27] + * Process.groups = [27, 6, 10, 11] #=> [27, 6, 10, 11] + * Process.groups #=> [27, 6, 10, 11] + * + */ + +static VALUE +proc_setgroups(VALUE obj, VALUE ary) +{ +#ifdef HAVE_SETGROUPS + size_t ngroups; + rb_gid_t *groups; + int i; + struct group *gr; + + Check_Type(ary, T_ARRAY); + + ngroups = RARRAY(ary)->len; + if (ngroups > maxgroups) + rb_raise(rb_eArgError, "too many groups, %d max", maxgroups); + + groups = ALLOCA_N(rb_gid_t, ngroups); + + for (i = 0; i < ngroups && i < RARRAY(ary)->len; i++) { + VALUE g = RARRAY(ary)->ptr[i]; + + if (FIXNUM_P(g)) { + groups[i] = FIX2INT(g); + } + else { + VALUE tmp = rb_check_string_type(g); + + if (NIL_P(tmp)) { + groups[i] = NUM2INT(g); + } + else { + gr = getgrnam(RSTRING(tmp)->ptr); + if (gr == NULL) + rb_raise(rb_eArgError, + "can't find group for %s", RSTRING(tmp)->ptr); + groups[i] = gr->gr_gid; + } + } + } + + i = setgroups(ngroups, groups); + if (i == -1) + rb_sys_fail(0); + + return proc_getgroups(obj); +#else + rb_notimplement(); + return Qnil; +#endif +} + + +/* + * call-seq: + * Process.initgroups(username, gid) => array + * + * Initializes the supplemental group access list by reading the + * system group database and using all groups of which the given user + * is a member. The group with the specified <em>gid</em> is also + * added to the list. Returns the resulting <code>Array</code> of the + * gids of all the groups in the supplementary group access list. Not + * available on all platforms. + * + * Process.groups #=> [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27] + * Process.initgroups( "mgranger", 30 ) #=> [30, 6, 10, 11] + * Process.groups #=> [30, 6, 10, 11] + * + */ + +static VALUE +proc_initgroups(obj, uname, base_grp) + VALUE obj, uname, base_grp; +{ +#ifdef HAVE_INITGROUPS + if (initgroups(StringValuePtr(uname), (rb_gid_t)NUM2INT(base_grp)) != 0) { + rb_sys_fail(0); + } + return proc_getgroups(obj); +#else + rb_notimplement(); + return Qnil; +#endif +} + + +/* + * call-seq: + * Process.maxgroups => fixnum + * + * Returns the maximum number of gids allowed in the supplemental + * group access list. + * + * Process.maxgroups #=> 32 + */ + +static VALUE +proc_getmaxgroups(obj) + VALUE obj; +{ + return INT2FIX(maxgroups); +} + + +/* + * call-seq: + * Process.maxgroups= fixnum => fixnum + * + * Sets the maximum number of gids allowed in the supplemental group + * access list. + */ + +static VALUE +proc_setmaxgroups(VALUE obj, VALUE val) +{ + size_t ngroups = FIX2INT(val); + + if (ngroups > 4096) + ngroups = 4096; + + maxgroups = ngroups; + + return INT2FIX(maxgroups); +} + + +/******************************************************************** + * + * Document-class: Process::GID + * + * The <code>Process::GID</code> module contains a collection of + * module functions which can be used to portably get, set, and + * switch the current process's real, effective, and saved group IDs. + * + */ + +static int SAVED_GROUP_ID = -1; + +#ifdef BROKEN_SETREGID +int +setregid(rgid, egid) + rb_gid_t rgid, egid; +{ + if (rgid != -1 && rgid != getgid()) { + if (egid == -1) egid = getegid(); + if (setgid(rgid) < 0) return -1; + } + if (egid != -1 && egid != getegid()) { + if (setegid(egid) < 0) return -1; + } + return 0; +} +#endif + +/* + * call-seq: + * Process::GID.change_privilege(integer) => fixnum + * + * Change the current process's real and effective group ID to that + * specified by _integer_. Returns the new group ID. Not + * available on all platforms. + * + * [Process.gid, Process.egid] #=> [0, 0] + * Process::GID.change_privilege(33) #=> 33 + * [Process.gid, Process.egid] #=> [33, 33] + */ + +static VALUE +p_gid_change_privilege(obj, id) + VALUE obj, id; +{ + int gid; + + check_gid_switch(); + + gid = NUM2INT(id); + + if (geteuid() == 0) { /* root-user */ +#if defined(HAVE_SETRESGID) + if (setresgid(gid, gid, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; +#elif defined HAVE_SETGID + if (setgid(gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; +#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) + if (getgid() == gid) { + if (SAVED_GROUP_ID == gid) { + if (setregid(-1, gid) < 0) rb_sys_fail(0); + } else { + if (gid == 0) { /* (r,e,s) == (root, y, x) */ + if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0); + if (setregid(SAVED_GROUP_ID, 0) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = 0; /* (r,e,s) == (x, root, root) */ + if (setregid(gid, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } else { /* (r,e,s) == (z, y, x) */ + if (setregid(0, 0) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = 0; + if (setregid(gid, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } + } + } else { + if (setregid(gid, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } +#elif defined(HAVE_SETRGID) && defined (HAVE_SETEGID) + if (getgid() == gid) { + if (SAVED_GROUP_ID == gid) { + if (setegid(gid) < 0) rb_sys_fail(0); + } else { + if (gid == 0) { + if (setegid(gid) < 0) rb_sys_fail(0); + if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = 0; + if (setrgid(0) < 0) rb_sys_fail(0); + } else { + if (setrgid(0) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = 0; + if (setegid(gid) < 0) rb_sys_fail(0); + if (setrgid(gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } + } + } else { + if (setegid(gid) < 0) rb_sys_fail(0); + if (setrgid(gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } +#else + rb_notimplement(); +#endif + } else { /* unprivileged user */ +#if defined(HAVE_SETRESGID) + if (setresgid((getgid() == gid)? -1: gid, + (getegid() == gid)? -1: gid, + (SAVED_GROUP_ID == gid)? -1: gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; +#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) + if (SAVED_GROUP_ID == gid) { + if (setregid((getgid() == gid)? -1: gid, + (getegid() == gid)? -1: gid) < 0) rb_sys_fail(0); + } else if (getgid() != gid) { + if (setregid(gid, (getegid() == gid)? -1: gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } else if (/* getgid() == gid && */ getegid() != gid) { + if (setregid(getegid(), gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + if (setregid(gid, -1) < 0) rb_sys_fail(0); + } else { /* getgid() == gid && getegid() == gid */ + if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0); + if (setregid(SAVED_GROUP_ID, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + if (setregid(gid, -1) < 0) rb_sys_fail(0); + } +#elif defined(HAVE_SETRGID) && defined(HAVE_SETEGID) + if (SAVED_GROUP_ID == gid) { + if (getegid() != gid && setegid(gid) < 0) rb_sys_fail(0); + if (getgid() != gid && setrgid(gid) < 0) rb_sys_fail(0); + } else if (/* SAVED_GROUP_ID != gid && */ getegid() == gid) { + if (getgid() != gid) { + if (setrgid(gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } else { + if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + if (setrgid(gid) < 0) rb_sys_fail(0); + } + } else if (/* getegid() != gid && */ getgid() == gid) { + if (setegid(gid) < 0) rb_sys_fail(0); + if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + if (setrgid(gid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } +#elif defined HAVE_44BSD_SETGID + if (getgid() == gid) { + /* (r,e,s)==(gid,?,?) ==> (gid,gid,gid) */ + if (setgid(gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } else { + errno = EPERM; + rb_sys_fail(0); + } +#elif defined HAVE_SETEGID + if (getgid() == gid && SAVED_GROUP_ID == gid) { + if (setegid(gid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } +#elif defined HAVE_SETGID + if (getgid() == gid && SAVED_GROUP_ID == gid) { + if (setgid(gid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } +#else + rb_notimplement(); +#endif + } + return INT2FIX(gid); +} + + +/* + * call-seq: + * Process.euid => fixnum + * Process::UID.eid => fixnum + * Process::Sys.geteuid => fixnum + * + * Returns the effective user ID for this process. + * + * Process.euid #=> 501 + */ + +static VALUE +proc_geteuid(obj) + VALUE obj; +{ + int euid = geteuid(); + return INT2FIX(euid); +} + + +/* + * call-seq: + * Process.euid= integer + * + * Sets the effective user ID for this process. Not available on all + * platforms. + */ + +static VALUE +proc_seteuid(obj, euid) + VALUE obj, euid; +{ + check_uid_switch(); +#if defined(HAVE_SETRESUID) && !defined(__CHECKER__) + if (setresuid(-1, NUM2INT(euid), -1) < 0) rb_sys_fail(0); +#elif defined HAVE_SETREUID + if (setreuid(-1, NUM2INT(euid)) < 0) rb_sys_fail(0); +#elif defined HAVE_SETEUID + if (seteuid(NUM2INT(euid)) < 0) rb_sys_fail(0); +#elif defined HAVE_SETUID + euid = NUM2INT(euid); + if (euid == getuid()) { + if (setuid(euid) < 0) rb_sys_fail(0); + } + else { + rb_notimplement(); + } +#else + rb_notimplement(); +#endif + return euid; +} + +static VALUE +rb_seteuid_core(euid) + int euid; +{ + int uid; + + check_uid_switch(); + + uid = getuid(); + +#if defined(HAVE_SETRESUID) && !defined(__CHECKER__) + if (uid != euid) { + if (setresuid(-1,euid,euid) < 0) rb_sys_fail(0); + SAVED_USER_ID = euid; + } else { + if (setresuid(-1,euid,-1) < 0) rb_sys_fail(0); + } +#elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) + if (setreuid(-1, euid) < 0) rb_sys_fail(0); + if (uid != euid) { + if (setreuid(euid,uid) < 0) rb_sys_fail(0); + if (setreuid(uid,euid) < 0) rb_sys_fail(0); + SAVED_USER_ID = euid; + } +#elif defined HAVE_SETEUID + if (seteuid(euid) < 0) rb_sys_fail(0); +#elif defined HAVE_SETUID + if (geteuid() == 0) rb_sys_fail(0); + if (setuid(euid) < 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return INT2FIX(euid); +} + + +/* + * call-seq: + * Process::UID.grant_privilege(integer) => fixnum + * Process::UID.eid= integer => fixnum + * + * Set the effective user ID, and if possible, the saved user ID of + * the process to the given _integer_. Returns the new + * effective user ID. Not available on all platforms. + * + * [Process.uid, Process.euid] #=> [0, 0] + * Process::UID.grant_privilege(31) #=> 31 + * [Process.uid, Process.euid] #=> [0, 31] + */ + +static VALUE +p_uid_grant_privilege(obj, id) + VALUE obj, id; +{ + return rb_seteuid_core(NUM2INT(id)); +} + + +/* + * call-seq: + * Process.egid => fixnum + * Process::GID.eid => fixnum + * Process::Sys.geteid => fixnum + * + * Returns the effective group ID for this process. Not available on + * all platforms. + * + * Process.egid #=> 500 + */ + +static VALUE +proc_getegid(obj) + VALUE obj; +{ + int egid = getegid(); + + return INT2FIX(egid); +} + + +/* + * call-seq: + * Process.egid = fixnum => fixnum + * + * Sets the effective group ID for this process. Not available on all + * platforms. + */ + +static VALUE +proc_setegid(obj, egid) + VALUE obj, egid; +{ + check_gid_switch(); + +#if defined(HAVE_SETRESGID) && !defined(__CHECKER__) + if (setresgid(-1, NUM2INT(egid), -1) < 0) rb_sys_fail(0); +#elif defined HAVE_SETREGID + if (setregid(-1, NUM2INT(egid)) < 0) rb_sys_fail(0); +#elif defined HAVE_SETEGID + if (setegid(NUM2INT(egid)) < 0) rb_sys_fail(0); +#elif defined HAVE_SETGID + egid = NUM2INT(egid); + if (egid == getgid()) { + if (setgid(egid) < 0) rb_sys_fail(0); + } + else { + rb_notimplement(); + } +#else + rb_notimplement(); +#endif + return egid; +} + +static VALUE +rb_setegid_core(egid) + int egid; +{ + int gid; + + check_gid_switch(); + + gid = getgid(); + +#if defined(HAVE_SETRESGID) && !defined(__CHECKER__) + if (gid != egid) { + if (setresgid(-1,egid,egid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = egid; + } else { + if (setresgid(-1,egid,-1) < 0) rb_sys_fail(0); + } +#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) + if (setregid(-1, egid) < 0) rb_sys_fail(0); + if (gid != egid) { + if (setregid(egid,gid) < 0) rb_sys_fail(0); + if (setregid(gid,egid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = egid; + } +#elif defined HAVE_SETEGID + if (setegid(egid) < 0) rb_sys_fail(0); +#elif defined HAVE_SETGID + if (geteuid() == 0 /* root user */) rb_sys_fail(0); + if (setgid(egid) < 0) rb_sys_fail(0); +#else + rb_notimplement(); +#endif + return INT2FIX(egid); +} + + +/* + * call-seq: + * Process::GID.grant_privilege(integer) => fixnum + * Process::GID.eid = integer => fixnum + * + * Set the effective group ID, and if possible, the saved group ID of + * the process to the given _integer_. Returns the new + * effective group ID. Not available on all platforms. + * + * [Process.gid, Process.egid] #=> [0, 0] + * Process::GID.grant_privilege(31) #=> 33 + * [Process.gid, Process.egid] #=> [0, 33] + */ + +static VALUE +p_gid_grant_privilege(obj, id) + VALUE obj, id; +{ + return rb_setegid_core(NUM2INT(id)); +} + + +/* + * call-seq: + * Process::UID.re_exchangeable? => true or false + * + * Returns +true+ if the real and effective user IDs of a + * process may be exchanged on the current platform. + * + */ + +static VALUE +p_uid_exchangeable() +{ +#if defined(HAVE_SETRESUID) && !defined(__CHECKER__) + return Qtrue; +#elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) + return Qtrue; +#else + return Qfalse; +#endif +} + + +/* + * call-seq: + * Process::UID.re_exchange => fixnum + * + * Exchange real and effective user IDs and return the new effective + * user ID. Not available on all platforms. + * + * [Process.uid, Process.euid] #=> [0, 31] + * Process::UID.re_exchange #=> 0 + * [Process.uid, Process.euid] #=> [31, 0] + */ + +static VALUE +p_uid_exchange(obj) + VALUE obj; +{ + int uid, euid; + + check_uid_switch(); + + uid = getuid(); + euid = geteuid(); + +#if defined(HAVE_SETRESUID) && !defined(__CHECKER__) + if (setresuid(euid, uid, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; +#elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) + if (setreuid(euid,uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; +#else + rb_notimplement(); +#endif + return INT2FIX(uid); +} + + +/* + * call-seq: + * Process::GID.re_exchangeable? => true or false + * + * Returns +true+ if the real and effective group IDs of a + * process may be exchanged on the current platform. + * + */ + +static VALUE +p_gid_exchangeable() +{ +#if defined(HAVE_SETRESGID) && !defined(__CHECKER__) + return Qtrue; +#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) + return Qtrue; +#else + return Qfalse; +#endif +} + + +/* + * call-seq: + * Process::GID.re_exchange => fixnum + * + * Exchange real and effective group IDs and return the new effective + * group ID. Not available on all platforms. + * + * [Process.gid, Process.egid] #=> [0, 33] + * Process::GID.re_exchange #=> 0 + * [Process.gid, Process.egid] #=> [33, 0] + */ + +static VALUE +p_gid_exchange(obj) + VALUE obj; +{ + int gid, egid; + + check_gid_switch(); + + gid = getgid(); + egid = getegid(); + +#if defined(HAVE_SETRESGID) && !defined(__CHECKER__) + if (setresgid(egid, gid, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; +#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) + if (setregid(egid,gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; +#else + rb_notimplement(); +#endif + return INT2FIX(gid); +} + +/* [MG] :FIXME: Is this correct? I'm not sure how to phrase this. */ + +/* + * call-seq: + * Process::UID.sid_available? => true or false + * + * Returns +true+ if the current platform has saved user + * ID functionality. + * + */ + +static VALUE +p_uid_have_saved_id() +{ +#if defined(HAVE_SETRESUID) || defined(HAVE_SETEUID) || defined(_POSIX_SAVED_IDS) + return Qtrue; +#else + return Qfalse; +#endif +} + + +#if defined(HAVE_SETRESUID) || defined(HAVE_SETEUID) || defined(_POSIX_SAVED_IDS) +static VALUE +p_uid_sw_ensure(id) + int id; +{ + under_uid_switch = 0; + return rb_seteuid_core(id); +} + + +/* + * call-seq: + * Process::UID.switch => fixnum + * Process::UID.switch {|| block} => object + * + * Switch the effective and real user IDs of the current process. If + * a <em>block</em> is given, the user IDs will be switched back + * after the block is executed. Returns the new effective user ID if + * called without a block, and the return value of the block if one + * is given. + * + */ + +static VALUE +p_uid_switch(obj) + VALUE obj; +{ + int uid, euid; + + check_uid_switch(); + + uid = getuid(); + euid = geteuid(); + + if (uid != euid) { + proc_seteuid(obj, INT2FIX(uid)); + if (rb_block_given_p()) { + under_uid_switch = 1; + return rb_ensure(rb_yield, Qnil, p_uid_sw_ensure, SAVED_USER_ID); + } else { + return INT2FIX(euid); + } + } else if (euid != SAVED_USER_ID) { + proc_seteuid(obj, INT2FIX(SAVED_USER_ID)); + if (rb_block_given_p()) { + under_uid_switch = 1; + return rb_ensure(rb_yield, Qnil, p_uid_sw_ensure, euid); + } else { + return INT2FIX(uid); + } + } else { + errno = EPERM; + rb_sys_fail(0); + } + +#else +static VALUE +p_uid_sw_ensure(obj) + VALUE obj; +{ + under_uid_switch = 0; + return p_uid_exchange(obj); +} + +static VALUE +p_uid_switch(obj) + VALUE obj; +{ + int uid, euid; + + check_uid_switch(); + + uid = getuid(); + euid = geteuid(); + + if (uid == euid) { + errno = EPERM; + rb_sys_fail(0); + } + p_uid_exchange(obj); + if (rb_block_given_p()) { + under_uid_switch = 1; + return rb_ensure(rb_yield, Qnil, p_uid_sw_ensure, obj); + } else { + return INT2FIX(euid); + } +#endif +} + + +/* [MG] :FIXME: Is this correct? I'm not sure how to phrase this. */ + +/* + * call-seq: + * Process::GID.sid_available? => true or false + * + * Returns +true+ if the current platform has saved group + * ID functionality. + * + */ + +static VALUE +p_gid_have_saved_id() +{ +#if defined(HAVE_SETRESGID) || defined(HAVE_SETEGID) || defined(_POSIX_SAVED_IDS) + return Qtrue; +#else + return Qfalse; +#endif +} + +#if defined(HAVE_SETRESGID) || defined(HAVE_SETEGID) || defined(_POSIX_SAVED_IDS) +static VALUE +p_gid_sw_ensure(id) + int id; +{ + under_gid_switch = 0; + return rb_setegid_core(id); +} + + +/* + * call-seq: + * Process::GID.switch => fixnum + * Process::GID.switch {|| block} => object + * + * Switch the effective and real group IDs of the current process. If + * a <em>block</em> is given, the group IDs will be switched back + * after the block is executed. Returns the new effective group ID if + * called without a block, and the return value of the block if one + * is given. + * + */ + +static VALUE +p_gid_switch(obj) + VALUE obj; +{ + int gid, egid; + + check_gid_switch(); + + gid = getgid(); + egid = getegid(); + + if (gid != egid) { + proc_setegid(obj, INT2FIX(gid)); + if (rb_block_given_p()) { + under_gid_switch = 1; + return rb_ensure(rb_yield, Qnil, p_gid_sw_ensure, SAVED_GROUP_ID); + } else { + return INT2FIX(egid); + } + } else if (egid != SAVED_GROUP_ID) { + proc_setegid(obj, INT2FIX(SAVED_GROUP_ID)); + if (rb_block_given_p()) { + under_gid_switch = 1; + return rb_ensure(rb_yield, Qnil, p_gid_sw_ensure, egid); + } else { + return INT2FIX(gid); + } + } else { + errno = EPERM; + rb_sys_fail(0); + } +#else +static VALUE +p_gid_sw_ensure(obj) + VALUE obj; +{ + under_gid_switch = 0; + return p_gid_exchange(obj); +} + +static VALUE +p_gid_switch(obj) + VALUE obj; +{ + int gid, egid; + + check_gid_switch(); + + gid = getgid(); + egid = getegid(); + + if (gid == egid) { + errno = EPERM; + rb_sys_fail(0); + } + p_gid_exchange(obj); + if (rb_block_given_p()) { + under_gid_switch = 1; + return rb_ensure(rb_yield, Qnil, p_gid_sw_ensure, obj); + } else { + return INT2FIX(egid); + } +#endif +} + + +/* + * call-seq: + * Process.times => aStructTms + * + * Returns a <code>Tms</code> structure (see <code>Struct::Tms</code> + * on page 388) that contains user and system CPU times for this + * process. + * + * t = Process.times + * [ t.utime, t.stime ] #=> [0.0, 0.02] + */ + +VALUE +rb_proc_times(obj) + VALUE obj; +{ +#if defined(HAVE_TIMES) && !defined(__CHECKER__) + const double hertz = +#ifdef HAVE__SC_CLK_TCK + (double)sysconf(_SC_CLK_TCK); +#else +#ifndef HZ +# ifdef CLK_TCK +# define HZ CLK_TCK +# else +# define HZ 60 +# endif +#endif /* HZ */ + HZ; +#endif + struct tms buf; + volatile VALUE utime, stime, cutime, sctime; + + times(&buf); + return rb_struct_new(S_Tms, + utime = rb_float_new(buf.tms_utime / hertz), + stime = rb_float_new(buf.tms_stime / hertz), + cutime = rb_float_new(buf.tms_cutime / hertz), + sctime = rb_float_new(buf.tms_cstime / hertz)); +#else + rb_notimplement(); +#endif +} + +VALUE rb_mProcess; +VALUE rb_mProcUID; +VALUE rb_mProcGID; +VALUE rb_mProcID_Syscall; + + +/* + * The <code>Process</code> module is a collection of methods used to + * manipulate processes. + */ + +void +Init_process() +{ + rb_define_virtual_variable("$$", get_pid, 0); + rb_define_readonly_variable("$?", &rb_last_status); + rb_define_global_function("exec", rb_f_exec, -1); + rb_define_global_function("fork", rb_f_fork, 0); + rb_define_global_function("exit!", rb_f_exit_bang, -1); + rb_define_global_function("system", rb_f_system, -1); + rb_define_global_function("sleep", rb_f_sleep, -1); + + rb_mProcess = rb_define_module("Process"); + +#if !defined(_WIN32) && !defined(DJGPP) +#ifdef WNOHANG + rb_define_const(rb_mProcess, "WNOHANG", INT2FIX(WNOHANG)); +#else + rb_define_const(rb_mProcess, "WNOHANG", INT2FIX(0)); +#endif +#ifdef WUNTRACED + rb_define_const(rb_mProcess, "WUNTRACED", INT2FIX(WUNTRACED)); +#else + rb_define_const(rb_mProcess, "WUNTRACED", INT2FIX(0)); +#endif +#endif + + rb_define_singleton_method(rb_mProcess, "fork", rb_f_fork, 0); + rb_define_singleton_method(rb_mProcess, "exit!", rb_f_exit_bang, -1); + rb_define_singleton_method(rb_mProcess, "exit", rb_f_exit, -1); /* in eval.c */ + rb_define_singleton_method(rb_mProcess, "abort", rb_f_abort, -1); /* in eval.c */ + + rb_define_module_function(rb_mProcess, "kill", rb_f_kill, -1); /* in signal.c */ + rb_define_module_function(rb_mProcess, "wait", proc_wait, -1); + rb_define_module_function(rb_mProcess, "wait2", proc_wait2, -1); + rb_define_module_function(rb_mProcess, "waitpid", proc_wait, -1); + rb_define_module_function(rb_mProcess, "waitpid2", proc_wait2, -1); + rb_define_module_function(rb_mProcess, "waitall", proc_waitall, 0); + rb_define_module_function(rb_mProcess, "detach", proc_detach, 1); + + rb_cProcStatus = rb_define_class_under(rb_mProcess, "Status", rb_cObject); + rb_undef_method(CLASS_OF(rb_cProcStatus), "new"); + + rb_define_method(rb_cProcStatus, "==", pst_equal, 1); + rb_define_method(rb_cProcStatus, "&", pst_bitand, 1); + rb_define_method(rb_cProcStatus, ">>", pst_rshift, 1); + rb_define_method(rb_cProcStatus, "to_i", pst_to_i, 0); + rb_define_method(rb_cProcStatus, "to_int", pst_to_i, 0); + rb_define_method(rb_cProcStatus, "to_s", pst_to_s, 0); + rb_define_method(rb_cProcStatus, "inspect", pst_inspect, 0); + + rb_define_method(rb_cProcStatus, "pid", pst_pid, 0); + + rb_define_method(rb_cProcStatus, "stopped?", pst_wifstopped, 0); + rb_define_method(rb_cProcStatus, "stopsig", pst_wstopsig, 0); + rb_define_method(rb_cProcStatus, "signaled?", pst_wifsignaled, 0); + rb_define_method(rb_cProcStatus, "termsig", pst_wtermsig, 0); + rb_define_method(rb_cProcStatus, "exited?", pst_wifexited, 0); + rb_define_method(rb_cProcStatus, "exitstatus", pst_wexitstatus, 0); + rb_define_method(rb_cProcStatus, "success?", pst_success_p, 0); + rb_define_method(rb_cProcStatus, "coredump?", pst_wcoredump, 0); + + rb_define_module_function(rb_mProcess, "pid", get_pid, 0); + rb_define_module_function(rb_mProcess, "ppid", get_ppid, 0); + + rb_define_module_function(rb_mProcess, "getpgrp", proc_getpgrp, 0); + rb_define_module_function(rb_mProcess, "setpgrp", proc_setpgrp, 0); + rb_define_module_function(rb_mProcess, "getpgid", proc_getpgid, 1); + rb_define_module_function(rb_mProcess, "setpgid", proc_setpgid, 2); + + rb_define_module_function(rb_mProcess, "setsid", proc_setsid, 0); + + rb_define_module_function(rb_mProcess, "getpriority", proc_getpriority, 2); + rb_define_module_function(rb_mProcess, "setpriority", proc_setpriority, 3); + +#ifdef HAVE_GETPRIORITY + rb_define_const(rb_mProcess, "PRIO_PROCESS", INT2FIX(PRIO_PROCESS)); + rb_define_const(rb_mProcess, "PRIO_PGRP", INT2FIX(PRIO_PGRP)); + rb_define_const(rb_mProcess, "PRIO_USER", INT2FIX(PRIO_USER)); +#endif + + rb_define_module_function(rb_mProcess, "getrlimit", proc_getrlimit, 1); + rb_define_module_function(rb_mProcess, "setrlimit", proc_setrlimit, -1); +#ifdef RLIM2NUM +#ifdef RLIM_INFINITY + rb_define_const(rb_mProcess, "RLIM_INFINITY", RLIM2NUM(RLIM_INFINITY)); +#endif +#ifdef RLIM_SAVED_MAX + rb_define_const(rb_mProcess, "RLIM_SAVED_MAX", RLIM2NUM(RLIM_SAVED_MAX)); +#endif +#ifdef RLIM_SAVED_CUR + rb_define_const(rb_mProcess, "RLIM_SAVED_CUR", RLIM2NUM(RLIM_SAVED_CUR)); +#endif +#ifdef RLIMIT_CORE + rb_define_const(rb_mProcess, "RLIMIT_CORE", INT2FIX(RLIMIT_CORE)); +#endif +#ifdef RLIMIT_CPU + rb_define_const(rb_mProcess, "RLIMIT_CPU", INT2FIX(RLIMIT_CPU)); +#endif +#ifdef RLIMIT_DATA + rb_define_const(rb_mProcess, "RLIMIT_DATA", INT2FIX(RLIMIT_DATA)); +#endif +#ifdef RLIMIT_FSIZE + rb_define_const(rb_mProcess, "RLIMIT_FSIZE", INT2FIX(RLIMIT_FSIZE)); +#endif +#ifdef RLIMIT_NOFILE + rb_define_const(rb_mProcess, "RLIMIT_NOFILE", INT2FIX(RLIMIT_NOFILE)); +#endif +#ifdef RLIMIT_STACK + rb_define_const(rb_mProcess, "RLIMIT_STACK", INT2FIX(RLIMIT_STACK)); +#endif +#ifdef RLIMIT_AS + rb_define_const(rb_mProcess, "RLIMIT_AS", INT2FIX(RLIMIT_AS)); +#endif +#ifdef RLIMIT_MEMLOCK + rb_define_const(rb_mProcess, "RLIMIT_MEMLOCK", INT2FIX(RLIMIT_MEMLOCK)); +#endif +#ifdef RLIMIT_NPROC + rb_define_const(rb_mProcess, "RLIMIT_NPROC", INT2FIX(RLIMIT_NPROC)); +#endif +#ifdef RLIMIT_RSS + rb_define_const(rb_mProcess, "RLIMIT_RSS", INT2FIX(RLIMIT_RSS)); +#endif +#ifdef RLIMIT_SBSIZE + rb_define_const(rb_mProcess, "RLIMIT_SBSIZE", INT2FIX(RLIMIT_SBSIZE)); +#endif +#endif + + rb_define_module_function(rb_mProcess, "uid", proc_getuid, 0); + rb_define_module_function(rb_mProcess, "uid=", proc_setuid, 1); + rb_define_module_function(rb_mProcess, "gid", proc_getgid, 0); + rb_define_module_function(rb_mProcess, "gid=", proc_setgid, 1); + rb_define_module_function(rb_mProcess, "euid", proc_geteuid, 0); + rb_define_module_function(rb_mProcess, "euid=", proc_seteuid, 1); + rb_define_module_function(rb_mProcess, "egid", proc_getegid, 0); + rb_define_module_function(rb_mProcess, "egid=", proc_setegid, 1); + rb_define_module_function(rb_mProcess, "initgroups", proc_initgroups, 2); + rb_define_module_function(rb_mProcess, "groups", proc_getgroups, 0); + rb_define_module_function(rb_mProcess, "groups=", proc_setgroups, 1); + rb_define_module_function(rb_mProcess, "maxgroups", proc_getmaxgroups, 0); + rb_define_module_function(rb_mProcess, "maxgroups=", proc_setmaxgroups, 1); + + rb_define_module_function(rb_mProcess, "times", rb_proc_times, 0); + +#if defined(HAVE_TIMES) || defined(_WIN32) + S_Tms = rb_struct_define("Tms", "utime", "stime", "cutime", "cstime", NULL); +#endif + + SAVED_USER_ID = geteuid(); + SAVED_GROUP_ID = getegid(); + + rb_mProcUID = rb_define_module_under(rb_mProcess, "UID"); + rb_mProcGID = rb_define_module_under(rb_mProcess, "GID"); + + rb_define_module_function(rb_mProcUID, "rid", proc_getuid, 0); + rb_define_module_function(rb_mProcGID, "rid", proc_getgid, 0); + rb_define_module_function(rb_mProcUID, "eid", proc_geteuid, 0); + rb_define_module_function(rb_mProcGID, "eid", proc_getegid, 0); + rb_define_module_function(rb_mProcUID, "change_privilege", p_uid_change_privilege, 1); + rb_define_module_function(rb_mProcGID, "change_privilege", p_gid_change_privilege, 1); + rb_define_module_function(rb_mProcUID, "grant_privilege", p_uid_grant_privilege, 1); + rb_define_module_function(rb_mProcGID, "grant_privilege", p_gid_grant_privilege, 1); + rb_define_alias(rb_singleton_class(rb_mProcUID), "eid=", "grant_privilege"); + rb_define_alias(rb_singleton_class(rb_mProcGID), "eid=", "grant_privilege"); + rb_define_module_function(rb_mProcUID, "re_exchange", p_uid_exchange, 0); + rb_define_module_function(rb_mProcGID, "re_exchange", p_gid_exchange, 0); + rb_define_module_function(rb_mProcUID, "re_exchangeable?", p_uid_exchangeable, 0); + rb_define_module_function(rb_mProcGID, "re_exchangeable?", p_gid_exchangeable, 0); + rb_define_module_function(rb_mProcUID, "sid_available?", p_uid_have_saved_id, 0); + rb_define_module_function(rb_mProcGID, "sid_available?", p_gid_have_saved_id, 0); + rb_define_module_function(rb_mProcUID, "switch", p_uid_switch, 0); + rb_define_module_function(rb_mProcGID, "switch", p_gid_switch, 0); + + rb_mProcID_Syscall = rb_define_module_under(rb_mProcess, "Sys"); + + rb_define_module_function(rb_mProcID_Syscall, "getuid", proc_getuid, 0); + rb_define_module_function(rb_mProcID_Syscall, "geteuid", proc_geteuid, 0); + rb_define_module_function(rb_mProcID_Syscall, "getgid", proc_getgid, 0); + rb_define_module_function(rb_mProcID_Syscall, "getegid", proc_getegid, 0); + + rb_define_module_function(rb_mProcID_Syscall, "setuid", p_sys_setuid, 1); + rb_define_module_function(rb_mProcID_Syscall, "setgid", p_sys_setgid, 1); + + rb_define_module_function(rb_mProcID_Syscall, "setruid", p_sys_setruid, 1); + rb_define_module_function(rb_mProcID_Syscall, "setrgid", p_sys_setrgid, 1); + + rb_define_module_function(rb_mProcID_Syscall, "seteuid", p_sys_seteuid, 1); + rb_define_module_function(rb_mProcID_Syscall, "setegid", p_sys_setegid, 1); + + rb_define_module_function(rb_mProcID_Syscall, "setreuid", p_sys_setreuid, 2); + rb_define_module_function(rb_mProcID_Syscall, "setregid", p_sys_setregid, 2); + + rb_define_module_function(rb_mProcID_Syscall, "setresuid", p_sys_setresuid, 3); + rb_define_module_function(rb_mProcID_Syscall, "setresgid", p_sys_setresgid, 3); + rb_define_module_function(rb_mProcID_Syscall, "issetugid", p_sys_issetugid, 0); +} +/********************************************************************** + + random.c - + + $Author: shyouhei $ + $Date: 2009-01-17 04:15:36 +0100 (Sat, 17 Jan 2009) $ + created at: Fri Dec 24 16:39:21 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +/* +This is based on trimmed version of MT19937. To get the original version, +contact <http://www.math.keio.ac.jp/~matumoto/emt.html>. + +The original copyright notice follows. + + A C-program for MT19937, with initialization improved 2002/2/10. + Coded by Takuji Nishimura and Makoto Matsumoto. + This is a faster version by taking Shawn Cokus's optimization, + Matthe Bellew's simplification, Isaku Wada's real version. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Any feedback is very welcome. + http://www.math.keio.ac.jp/matumoto/emt.html + email: matumoto@math.keio.ac.jp +*/ + +/* Period parameters */ +#define N 624 +#define M 397 +#define MATRIX_A 0x9908b0dfUL /* constant vector a */ +#define UMASK 0x80000000UL /* most significant w-r bits */ +#define LMASK 0x7fffffffUL /* least significant r bits */ +#define MIXBITS(u,v) ( ((u) & UMASK) | ((v) & LMASK) ) +#define TWIST(u,v) ((MIXBITS(u,v) >> 1) ^ ((v)&1UL ? MATRIX_A : 0UL)) + +static unsigned long state[N]; /* the array for the state vector */ +static int left = 1; +static int initf = 0; +static unsigned long *next; + +/* initializes state[N] with a seed */ +static void +init_genrand(s) + unsigned long s; +{ + int j; + state[0]= s & 0xffffffffUL; + for (j=1; j<N; j++) { + state[j] = (1812433253UL * (state[j-1] ^ (state[j-1] >> 30)) + j); + /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ + /* In the previous versions, MSBs of the seed affect */ + /* only MSBs of the array state[]. */ + /* 2002/01/09 modified by Makoto Matsumoto */ + state[j] &= 0xffffffffUL; /* for >32 bit machines */ + } + left = 1; initf = 1; +} + +/* initialize by an array with array-length */ +/* init_key is the array for initializing keys */ +/* key_length is its length */ +/* slight change for C++, 2004/2/26 */ +static void +init_by_array(unsigned long init_key[], int key_length) +{ + int i, j, k; + init_genrand(19650218UL); + i=1; j=0; + k = (N>key_length ? N : key_length); + for (; k; k--) { + state[i] = (state[i] ^ ((state[i-1] ^ (state[i-1] >> 30)) * 1664525UL)) + + init_key[j] + j; /* non linear */ + state[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; j++; + if (i>=N) { state[0] = state[N-1]; i=1; } + if (j>=key_length) j=0; + } + for (k=N-1; k; k--) { + state[i] = (state[i] ^ ((state[i-1] ^ (state[i-1] >> 30)) * 1566083941UL)) + - i; /* non linear */ + state[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; + if (i>=N) { state[0] = state[N-1]; i=1; } + } + + state[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ + left = 1; initf = 1; +} + +static void +next_state() +{ + unsigned long *p=state; + int j; + + /* if init_genrand() has not been called, */ + /* a default initial seed is used */ + if (initf==0) init_genrand(5489UL); + + left = N; + next = state; + + for (j=N-M+1; --j; p++) + *p = p[M] ^ TWIST(p[0], p[1]); + + for (j=M; --j; p++) + *p = p[M-N] ^ TWIST(p[0], p[1]); + + *p = p[M-N] ^ TWIST(p[0], state[0]); +} + +/* generates a random number on [0,0xffffffff]-interval */ +static unsigned long +genrand_int32(void) +{ + unsigned long y; + + if (--left == 0) next_state(); + y = *next++; + + /* Tempering */ + y ^= (y >> 11); + y ^= (y << 7) & 0x9d2c5680UL; + y ^= (y << 15) & 0xefc60000UL; + y ^= (y >> 18); + + return y; +} + +/* generates a random number on [0,1) with 53-bit resolution*/ +static double +genrand_real(void) +{ + unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6; + return(a*67108864.0+b)*(1.0/9007199254740992.0); +} +/* These real versions are due to Isaku Wada, 2002/01/09 added */ + +#undef N +#undef M + +/* These real versions are due to Isaku Wada, 2002/01/09 added */ + +#include "ruby.h" + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#include <time.h> +#include <sys/types.h> +#include <sys/stat.h> +#ifdef HAVE_FCNTL_H +#include <fcntl.h> +#endif + +static VALUE saved_seed = INT2FIX(0); + +static VALUE +rand_init(vseed) + VALUE vseed; +{ + volatile VALUE seed; + VALUE old; + long len; + unsigned long *buf; + + seed = rb_to_int(vseed); + switch (TYPE(seed)) { + case T_FIXNUM: + len = sizeof(VALUE); + break; + case T_BIGNUM: + len = RBIGNUM(seed)->len * SIZEOF_BDIGITS; + if (len == 0) + len = 4; + break; + default: + rb_raise(rb_eTypeError, "failed to convert %s into Integer", + rb_obj_classname(vseed)); + } + len = (len + 3) / 4; /* number of 32bit words */ + buf = ALLOC_N(unsigned long, len); /* allocate longs for init_by_array */ + memset(buf, 0, len * sizeof(long)); + if (FIXNUM_P(seed)) { + buf[0] = FIX2ULONG(seed) & 0xffffffff; +#if SIZEOF_LONG > 4 + buf[1] = FIX2ULONG(seed) >> 32; +#endif + } + else { + int i, j; + for (i = RBIGNUM(seed)->len-1; 0 <= i; i--) { + j = i * SIZEOF_BDIGITS / 4; +#if SIZEOF_BDIGITS < 4 + buf[j] <<= SIZEOF_BDIGITS * 8; +#endif + buf[j] |= ((BDIGIT *)RBIGNUM(seed)->digits)[i]; + } + } + while (1 < len && buf[len-1] == 0) { + len--; + } + if (len <= 1) { + init_genrand(buf[0]); + } + else { + if (buf[len-1] == 1) /* remove leading-zero-guard */ + len--; + init_by_array(buf, len); + } + old = saved_seed; + saved_seed = seed; + free(buf); + return old; +} + +static VALUE +random_seed() +{ + static int n = 0; + struct timeval tv; + int fd; + struct stat statbuf; + + int seed_len; + BDIGIT *digits; + unsigned long *seed; + NEWOBJ(big, struct RBignum); + OBJSETUP(big, rb_cBignum, T_BIGNUM); + + seed_len = 4 * sizeof(long); + big->sign = 1; + big->len = seed_len / SIZEOF_BDIGITS + 1; + digits = big->digits = ALLOC_N(BDIGIT, big->len); + seed = (unsigned long *)big->digits; + + memset(digits, 0, big->len * SIZEOF_BDIGITS); + +#ifdef S_ISCHR + if ((fd = open("/dev/urandom", O_RDONLY +#ifdef O_NONBLOCK + |O_NONBLOCK +#endif +#ifdef O_NOCTTY + |O_NOCTTY +#endif +#ifdef O_NOFOLLOW + |O_NOFOLLOW +#endif + )) >= 0) { + if (fstat(fd, &statbuf) == 0 && S_ISCHR(statbuf.st_mode)) { + read(fd, seed, seed_len); + } + close(fd); + } +#endif + + gettimeofday(&tv, 0); + seed[0] ^= tv.tv_usec; + seed[1] ^= tv.tv_sec; + seed[2] ^= getpid() ^ (n++ << 16); + seed[3] ^= (unsigned long)&seed; + + /* set leading-zero-guard if need. */ + digits[big->len-1] = digits[big->len-2] <= 1 ? 1 : 0; + + return rb_big_norm((VALUE)big); +} + +/* + * call-seq: + * srand(number=0) => old_seed + * + * Seeds the pseudorandom number generator to the value of + * <i>number</i>.<code>to_i.abs</code>. If <i>number</i> is omitted, + * seeds the generator using a combination of the time, the + * process id, and a sequence number. (This is also the behavior if + * <code>Kernel::rand</code> is called without previously calling + * <code>srand</code>, but without the sequence.) By setting the seed + * to a known value, scripts can be made deterministic during testing. + * The previous seed value is returned. Also see <code>Kernel::rand</code>. + */ + +static VALUE +rb_f_srand(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE seed, old; + + rb_secure(4); + if (rb_scan_args(argc, argv, "01", &seed) == 0) { + seed = random_seed(); + } + old = rand_init(seed); + + return old; +} + +static unsigned long +make_mask(unsigned long x) +{ + x = x | x >> 1; + x = x | x >> 2; + x = x | x >> 4; + x = x | x >> 8; + x = x | x >> 16; +#if 4 < SIZEOF_LONG + x = x | x >> 32; +#endif + return x; +} + +static unsigned long +limited_rand(unsigned long limit) +{ + unsigned long mask = make_mask(limit); + int i; + unsigned long val; + + retry: + val = 0; + for (i = SIZEOF_LONG/4-1; 0 <= i; i--) { + if (mask >> (i * 32)) { + val |= genrand_int32() << (i * 32); + val &= mask; + if (limit < val) + goto retry; + } + } + return val; +} + +static VALUE +limited_big_rand(struct RBignum *limit) +{ + unsigned long mask, lim, rnd; + struct RBignum *val; + int i, len, boundary; + + len = (limit->len * SIZEOF_BDIGITS + 3) / 4; + val = (struct RBignum *)rb_big_clone((VALUE)limit); + val->sign = 1; +#if SIZEOF_BDIGITS == 2 +# define BIG_GET32(big,i) (((BDIGIT *)(big)->digits)[(i)*2] | \ + ((i)*2+1 < (big)->len ? (((BDIGIT *)(big)->digits)[(i)*2+1] << 16) \ + : 0)) +# define BIG_SET32(big,i,d) ((((BDIGIT *)(big)->digits)[(i)*2] = (d) & 0xffff), \ + ((i)*2+1 < (big)->len ? (((BDIGIT *)(big)->digits)[(i)*2+1] = (d) >> 16) \ + : 0)) +#else + /* SIZEOF_BDIGITS == 4 */ +# define BIG_GET32(big,i) (((BDIGIT *)(big)->digits)[i]) +# define BIG_SET32(big,i,d) (((BDIGIT *)(big)->digits)[i] = (d)) +#endif + retry: + mask = 0; + boundary = 1; + for (i = len-1; 0 <= i; i--) { + lim = BIG_GET32(limit, i); + mask = mask ? 0xffffffff : make_mask(lim); + if (mask) { + rnd = genrand_int32() & mask; + if (boundary) { + if (lim < rnd) + goto retry; + if (rnd < lim) + boundary = 0; + } + } + else { + rnd = 0; + } + BIG_SET32(val, i, rnd); + } + return rb_big_norm((VALUE)val); +} + +/* + * call-seq: + * rand(max=0) => number + * + * Converts <i>max</i> to an integer using max1 = + * max<code>.to_i.abs</code>. If the result is zero, returns a + * pseudorandom floating point number greater than or equal to 0.0 and + * less than 1.0. Otherwise, returns a pseudorandom integer greater + * than or equal to zero and less than max1. <code>Kernel::srand</code> + * may be used to ensure repeatable sequences of random numbers between + * different runs of the program. Ruby currently uses a modified + * Mersenne Twister with a period of 2**19937-1. + * + * srand 1234 #=> 0 + * [ rand, rand ] #=> [0.191519450163469, 0.49766366626136] + * [ rand(10), rand(1000) ] #=> [6, 817] + * srand 1234 #=> 1234 + * [ rand, rand ] #=> [0.191519450163469, 0.49766366626136] + */ + +static VALUE +rb_f_rand(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; +{ + VALUE vmax; + long val, max; + + rb_scan_args(argc, argv, "01", &vmax); + switch (TYPE(vmax)) { + case T_FLOAT: + if (RFLOAT(vmax)->value <= LONG_MAX && RFLOAT(vmax)->value >= LONG_MIN) { + max = (long)RFLOAT(vmax)->value; + break; + } + if (RFLOAT(vmax)->value < 0) + vmax = rb_dbl2big(-RFLOAT(vmax)->value); + else + vmax = rb_dbl2big(RFLOAT(vmax)->value); + /* fall through */ + case T_BIGNUM: + bignum: + { + struct RBignum *limit = (struct RBignum *)vmax; + if (!limit->sign) { + limit = (struct RBignum *)rb_big_clone(vmax); + limit->sign = 1; + } + limit = (struct RBignum *)rb_big_minus((VALUE)limit, INT2FIX(1)); + if (FIXNUM_P((VALUE)limit)) { + if (FIX2LONG((VALUE)limit) == -1) + return rb_float_new(genrand_real()); + return LONG2NUM(limited_rand(FIX2LONG((VALUE)limit))); + } + return limited_big_rand(limit); + } + case T_NIL: + max = 0; + break; + default: + vmax = rb_Integer(vmax); + if (TYPE(vmax) == T_BIGNUM) goto bignum; + /* fall through */ + case T_FIXNUM: + max = FIX2LONG(vmax); + break; + } + + if (max == 0) { + return rb_float_new(genrand_real()); + } + if (max < 0) max = -max; + val = limited_rand(max-1); + return LONG2NUM(val); +} + +void +Init_Random() +{ + rand_init(random_seed()); + rb_define_global_function("srand", rb_f_srand, -1); + rb_define_global_function("rand", rb_f_rand, -1); + rb_global_variable(&saved_seed); +} +/********************************************************************** + + range.c - + + $Author: shyouhei $ + $Date: 2007-09-16 21:38:27 +0200 (Sun, 16 Sep 2007) $ + created at: Thu Aug 19 17:46:47 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" + +VALUE rb_cRange; +static ID id_cmp, id_succ, id_beg, id_end, id_excl; + +#define EXCL(r) RTEST(rb_ivar_get((r), id_excl)) +#define SET_EXCL(r,v) rb_ivar_set((r), id_excl, (v) ? Qtrue : Qfalse) + +static VALUE +range_failed() +{ + rb_raise(rb_eArgError, "bad value for range"); + return Qnil; /* dummy */ +} + +static VALUE +range_check(args) + VALUE *args; +{ + return rb_funcall(args[0], id_cmp, 1, args[1]); +} + +static void +range_init(range, beg, end, exclude_end) + VALUE range, beg, end; + int exclude_end; +{ + VALUE args[2]; + + args[0] = beg; + args[1] = end; + + if (!FIXNUM_P(beg) || !FIXNUM_P(end)) { + VALUE v; + + v = rb_rescue(range_check, (VALUE)args, range_failed, 0); + if (NIL_P(v)) range_failed(); + } + + SET_EXCL(range, exclude_end); + rb_ivar_set(range, id_beg, beg); + rb_ivar_set(range, id_end, end); +} + +VALUE +rb_range_new(beg, end, exclude_end) + VALUE beg, end; + int exclude_end; +{ + VALUE range = rb_obj_alloc(rb_cRange); + + range_init(range, beg, end, exclude_end); + return range; +} + +/* + * call-seq: + * Range.new(start, end, exclusive=false) => range + * + * Constructs a range using the given <i>start</i> and <i>end</i>. If the third + * parameter is omitted or is <code>false</code>, the <i>range</i> will include + * the end object; otherwise, it will be excluded. + */ + +static VALUE +range_initialize(argc, argv, range) + int argc; + VALUE *argv; + VALUE range; +{ + VALUE beg, end, flags; + + rb_scan_args(argc, argv, "21", &beg, &end, &flags); + /* Ranges are immutable, so that they should be initialized only once. */ + if (rb_ivar_defined(range, id_beg)) { + rb_name_error(rb_intern("initialize"), "`initialize' called twice"); + } + range_init(range, beg, end, RTEST(flags)); + return Qnil; +} + + +/* + * call-seq: + * rng.exclude_end? => true or false + * + * Returns <code>true</code> if <i>rng</i> excludes its end value. + */ + +static VALUE +range_exclude_end_p(range) + VALUE range; +{ + return EXCL(range) ? Qtrue : Qfalse; +} + + +/* + * call-seq: + * rng == obj => true or false + * + * Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent + * beginning and end items (by comparing them with <code>==</code>), and has + * the same #exclude_end? setting as <i>rng</t>. + * + * (0..2) == (0..2) #=> true + * (0..2) == Range.new(0,2) #=> true + * (0..2) == (0...2) #=> false + * + */ + +static VALUE +range_eq(range, obj) + VALUE range, obj; +{ + if (range == obj) return Qtrue; + if (!rb_obj_is_instance_of(obj, rb_obj_class(range))) + return Qfalse; + + if (!rb_equal(rb_ivar_get(range, id_beg), rb_ivar_get(obj, id_beg))) + return Qfalse; + if (!rb_equal(rb_ivar_get(range, id_end), rb_ivar_get(obj, id_end))) + return Qfalse; + + if (EXCL(range) != EXCL(obj)) return Qfalse; + + return Qtrue; +} + +static int +r_lt(a, b) + VALUE a, b; +{ + VALUE r = rb_funcall(a, id_cmp, 1, b); + + if (NIL_P(r)) return Qfalse; + if (rb_cmpint(r, a, b) < 0) return Qtrue; + return Qfalse; +} + +static int +r_le(a, b) + VALUE a, b; +{ + int c; + VALUE r = rb_funcall(a, id_cmp, 1, b); + + if (NIL_P(r)) return Qfalse; + c = rb_cmpint(r, a, b); + if (c == 0) return INT2FIX(0); + if (c < 0) return Qtrue; + return Qfalse; +} + + +/* + * call-seq: + * rng.eql?(obj) => true or false + * + * Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent + * beginning and end items (by comparing them with #eql?), and has the same + * #exclude_end? setting as <i>rng</i>. + * + * (0..2) == (0..2) #=> true + * (0..2) == Range.new(0,2) #=> true + * (0..2) == (0...2) #=> false + * + */ + +static VALUE +range_eql(range, obj) + VALUE range, obj; +{ + if (range == obj) return Qtrue; + if (!rb_obj_is_instance_of(obj, rb_obj_class(range))) + return Qfalse; + + if (!rb_eql(rb_ivar_get(range, id_beg), rb_ivar_get(obj, id_beg))) + return Qfalse; + if (!rb_eql(rb_ivar_get(range, id_end), rb_ivar_get(obj, id_end))) + return Qfalse; + + if (EXCL(range) != EXCL(obj)) return Qfalse; + + return Qtrue; +} + +/* + * call-seq: + * rng.hash => fixnum + * + * Generate a hash value such that two ranges with the same start and + * end points, and the same value for the "exclude end" flag, generate + * the same hash value. + */ + +static VALUE +range_hash(range) + VALUE range; +{ + long hash = EXCL(range); + VALUE v; + + v = rb_hash(rb_ivar_get(range, id_beg)); + hash ^= v << 1; + v = rb_hash(rb_ivar_get(range, id_end)); + hash ^= v << 9; + hash ^= EXCL(range) << 24; + + return LONG2FIX(hash); +} + +static VALUE +str_step(args) + VALUE *args; +{ + return rb_str_upto(args[0], args[1], EXCL(args[2])); +} + +static void +range_each_func(range, func, v, e, arg) + VALUE range; + void (*func) _((VALUE, void*)); + VALUE v, e; + void *arg; +{ + int c; + + if (EXCL(range)) { + while (r_lt(v, e)) { + (*func)(v, arg); + v = rb_funcall(v, id_succ, 0, 0); + } + } + else { + while (RTEST(c = r_le(v, e))) { + (*func)(v, arg); + if (c == INT2FIX(0)) break; + v = rb_funcall(v, id_succ, 0, 0); + } + } +} + +static VALUE +step_i(i, iter) + VALUE i; + long *iter; +{ + iter[0]--; + if (iter[0] == 0) { + rb_yield(i); + iter[0] = iter[1]; + } + return Qnil; +} + +/* + * call-seq: + * rng.step(n=1) {| obj | block } => rng + * + * Iterates over <i>rng</i>, passing each <i>n</i>th element to the block. If + * the range contains numbers or strings, natural ordering is used. Otherwise + * <code>step</code> invokes <code>succ</code> to iterate through range + * elements. The following code uses class <code>Xs</code>, which is defined + * in the class-level documentation. + * + * range = Xs.new(1)..Xs.new(10) + * range.step(2) {|x| puts x} + * range.step(3) {|x| puts x} + * + * <em>produces:</em> + * + * 1 x + * 3 xxx + * 5 xxxxx + * 7 xxxxxxx + * 9 xxxxxxxxx + * 1 x + * 4 xxxx + * 7 xxxxxxx + * 10 xxxxxxxxxx + */ + + +static VALUE +range_step(argc, argv, range) + int argc; + VALUE *argv; + VALUE range; +{ + VALUE b, e, step; + long unit; + + b = rb_ivar_get(range, id_beg); + e = rb_ivar_get(range, id_end); + if (rb_scan_args(argc, argv, "01", &step) == 0) { + step = INT2FIX(1); + } + + unit = NUM2LONG(step); + if (unit < 0) { + rb_raise(rb_eArgError, "step can't be negative"); + } + if (FIXNUM_P(b) && FIXNUM_P(e)) { /* fixnums are special */ + long end = FIX2LONG(e); + long i; + + if (unit == 0) rb_raise(rb_eArgError, "step can't be 0"); + if (!EXCL(range)) end += 1; + i = FIX2LONG(b); + while (i < end) { + rb_yield(LONG2NUM(i)); + if (i + unit < i) break; + i += unit; + } + } + else { + VALUE tmp = rb_check_string_type(b); + + if (!NIL_P(tmp)) { + VALUE args[5]; + long iter[2]; + + b = tmp; + if (unit == 0) rb_raise(rb_eArgError, "step can't be 0"); + args[0] = b; args[1] = e; args[2] = range; + iter[0] = 1; iter[1] = unit; + rb_iterate((VALUE(*)_((VALUE)))str_step, (VALUE)args, step_i, + (VALUE)iter); + } + else if (rb_obj_is_kind_of(b, rb_cNumeric)) { + ID c = rb_intern(EXCL(range) ? "<" : "<="); + + if (rb_equal(step, INT2FIX(0))) rb_raise(rb_eArgError, "step can't be 0"); + while (RTEST(rb_funcall(b, c, 1, e))) { + rb_yield(b); + b = rb_funcall(b, '+', 1, step); + } + } + else { + long args[2]; + + if (unit == 0) rb_raise(rb_eArgError, "step can't be 0"); + if (!rb_respond_to(b, id_succ)) { + rb_raise(rb_eTypeError, "can't iterate from %s", + rb_obj_classname(b)); + } + + args[0] = 1; + args[1] = unit; + range_each_func(range, step_i, b, e, args); + } + } + return range; +} + +static void +each_i(v, arg) + VALUE v; + void *arg; +{ + rb_yield(v); +} + +/* + * call-seq: + * rng.each {| i | block } => rng + * + * Iterates over the elements <i>rng</i>, passing each in turn to the + * block. You can only iterate if the start object of the range + * supports the +succ+ method (which means that you can't iterate over + * ranges of +Float+ objects). + * + * (10..15).each do |n| + * print n, ' ' + * end + * + * <em>produces:</em> + * + * 10 11 12 13 14 15 + */ + +static VALUE +range_each(range) + VALUE range; +{ + VALUE beg, end; + + beg = rb_ivar_get(range, id_beg); + end = rb_ivar_get(range, id_end); + + if (!rb_respond_to(beg, id_succ)) { + rb_raise(rb_eTypeError, "can't iterate from %s", + rb_obj_classname(beg)); + } + if (FIXNUM_P(beg) && FIXNUM_P(end)) { /* fixnums are special */ + long lim = FIX2LONG(end); + long i; + + if (!EXCL(range)) lim += 1; + for (i=FIX2LONG(beg); i<lim; i++) { + rb_yield(LONG2NUM(i)); + } + } + else if (TYPE(beg) == T_STRING) { + VALUE args[5]; + long iter[2]; + + args[0] = beg; args[1] = end; args[2] = range; + iter[0] = 1; iter[1] = 1; + rb_iterate((VALUE(*)_((VALUE)))str_step, (VALUE)args, step_i, + (VALUE)iter); + } + else { + range_each_func(range, each_i, beg, end, NULL); + } + return range; +} + +/* + * call-seq: + * rng.first => obj + * rng.begin => obj + * + * Returns the first object in <i>rng</i>. + */ + +static VALUE +range_first(range) + VALUE range; +{ + return rb_ivar_get(range, id_beg); +} + + +/* + * call-seq: + * rng.end => obj + * rng.last => obj + * + * Returns the object that defines the end of <i>rng</i>. + * + * (1..10).end #=> 10 + * (1...10).end #=> 10 + */ + + +static VALUE +range_last(range) + VALUE range; +{ + return rb_ivar_get(range, id_end); +} + +VALUE +rb_range_beg_len(range, begp, lenp, len, err) + VALUE range; + long *begp, *lenp; + long len; + int err; +{ + long beg, end, b, e; + + if (!rb_obj_is_kind_of(range, rb_cRange)) return Qfalse; + + beg = b = NUM2LONG(rb_ivar_get(range, id_beg)); + end = e = NUM2LONG(rb_ivar_get(range, id_end)); + + if (beg < 0) { + beg += len; + if (beg < 0) goto out_of_range; + } + if (err == 0 || err == 2) { + if (beg > len) goto out_of_range; + if (end > len) end = len; + } + if (end < 0) end += len; + if (!EXCL(range)) end++; /* include end point */ + len = end - beg; + if (len < 0) len = 0; + + *begp = beg; + *lenp = len; + return Qtrue; + + out_of_range: + if (err) { + rb_raise(rb_eRangeError, "%ld..%s%ld out of range", + b, EXCL(range)? "." : "", e); + } + return Qnil; +} + +/* + * call-seq: + * rng.to_s => string + * + * Convert this range object to a printable form. + */ + +static VALUE +range_to_s(range) + VALUE range; +{ + VALUE str, str2; + + str = rb_obj_as_string(rb_ivar_get(range, id_beg)); + str2 = rb_obj_as_string(rb_ivar_get(range, id_end)); + str = rb_str_dup(str); + rb_str_cat(str, "...", EXCL(range)?3:2); + rb_str_append(str, str2); + OBJ_INFECT(str, str2); + + return str; +} + +/* + * call-seq: + * rng.inspect => string + * + * Convert this range object to a printable form (using + * <code>inspect</code> to convert the start and end + * objects). + */ + + +static VALUE +range_inspect(range) + VALUE range; +{ + VALUE str, str2; + + str = rb_inspect(rb_ivar_get(range, id_beg)); + str2 = rb_inspect(rb_ivar_get(range, id_end)); + str = rb_str_dup(str); + rb_str_cat(str, "...", EXCL(range)?3:2); + rb_str_append(str, str2); + OBJ_INFECT(str, str2); + + return str; +} + +/* + * call-seq: + * rng === obj => true or false + * rng.member?(val) => true or false + * rng.include?(val) => true or false + * + * Returns <code>true</code> if <i>obj</i> is an element of + * <i>rng</i>, <code>false</code> otherwise. Conveniently, + * <code>===</code> is the comparison operator used by + * <code>case</code> statements. + * + * case 79 + * when 1..50 then print "low\n" + * when 51..75 then print "medium\n" + * when 76..100 then print "high\n" + * end + * + * <em>produces:</em> + * + * high + */ + +static VALUE +range_include(range, val) + VALUE range, val; +{ + VALUE beg, end; + + beg = rb_ivar_get(range, id_beg); + end = rb_ivar_get(range, id_end); + if (r_le(beg, val)) { + if (EXCL(range)) { + if (r_lt(val, end)) return Qtrue; + } + else { + if (r_le(val, end)) return Qtrue; + } + } + return Qfalse; +} + + +/* A <code>Range</code> represents an interval---a set of values with a + * start and an end. Ranges may be constructed using the + * <em>s</em><code>..</code><em>e</em> and + * <em>s</em><code>...</code><em>e</em> literals, or with + * <code>Range::new</code>. Ranges constructed using <code>..</code> + * run from the start to the end inclusively. Those created using + * <code>...</code> exclude the end value. When used as an iterator, + * ranges return each value in the sequence. + * + * (-1..-5).to_a #=> [] + * (-5..-1).to_a #=> [-5, -4, -3, -2, -1] + * ('a'..'e').to_a #=> ["a", "b", "c", "d", "e"] + * ('a'...'e').to_a #=> ["a", "b", "c", "d"] + * + * Ranges can be constructed using objects of any type, as long as the + * objects can be compared using their <code><=></code> operator and + * they support the <code>succ</code> method to return the next object + * in sequence. + * + * class Xs # represent a string of 'x's + * include Comparable + * attr :length + * def initialize(n) + * @length = n + * end + * def succ + * Xs.new(@length + 1) + * end + * def <=>(other) + * @length <=> other.length + * end + * def to_s + * sprintf "%2d #{inspect}", @length + * end + * def inspect + * 'x' * @length + * end + * end + * + * r = Xs.new(3)..Xs.new(6) #=> xxx..xxxxxx + * r.to_a #=> [xxx, xxxx, xxxxx, xxxxxx] + * r.member?(Xs.new(5)) #=> true + * + * In the previous code example, class <code>Xs</code> includes the + * <code>Comparable</code> module. This is because + * <code>Enumerable#member?</code> checks for equality using + * <code>==</code>. Including <code>Comparable</code> ensures that the + * <code>==</code> method is defined in terms of the <code><=></code> + * method implemented in <code>Xs</code>. + * + */ + +void +Init_Range() +{ + rb_cRange = rb_define_class("Range", rb_cObject); + rb_include_module(rb_cRange, rb_mEnumerable); + rb_define_method(rb_cRange, "initialize", range_initialize, -1); + rb_define_method(rb_cRange, "==", range_eq, 1); + rb_define_method(rb_cRange, "===", range_include, 1); + rb_define_method(rb_cRange, "eql?", range_eql, 1); + rb_define_method(rb_cRange, "hash", range_hash, 0); + rb_define_method(rb_cRange, "each", range_each, 0); + rb_define_method(rb_cRange, "step", range_step, -1); + rb_define_method(rb_cRange, "first", range_first, 0); + rb_define_method(rb_cRange, "last", range_last, 0); + rb_define_method(rb_cRange, "begin", range_first, 0); + rb_define_method(rb_cRange, "end", range_last, 0); + rb_define_method(rb_cRange, "to_s", range_to_s, 0); + rb_define_method(rb_cRange, "inspect", range_inspect, 0); + + rb_define_method(rb_cRange, "exclude_end?", range_exclude_end_p, 0); + + rb_define_method(rb_cRange, "member?", range_include, 1); + rb_define_method(rb_cRange, "include?", range_include, 1); + + id_cmp = rb_intern("<=>"); + id_succ = rb_intern("succ"); + id_beg = rb_intern("begin"); + id_end = rb_intern("end"); + id_excl = rb_intern("excl"); +} +/********************************************************************** + + re.c - + + $Author: shyouhei $ + created at: Mon Aug 9 18:24:49 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "re.h" +#include <ctype.h> + +VALUE rb_eRegexpError; + +#define BEG(no) regs->beg[no] +#define END(no) regs->end[no] + +#if 'a' == 97 /* it's ascii */ +static const char casetable[] = { + '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', + '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', + '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', + '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', + /* ' ' '!' '"' '#' '$' '%' '&' ''' */ + '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', + /* '(' ')' '*' '+' ',' '-' '.' '/' */ + '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', + /* '0' '1' '2' '3' '4' '5' '6' '7' */ + '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', + /* '8' '9' ':' ';' '<' '=' '>' '?' */ + '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', + /* '@' 'A' 'B' 'C' 'D' 'E' 'F' 'G' */ + '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', + /* 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' */ + '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', + /* 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' */ + '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', + /* 'X' 'Y' 'Z' '[' '\' ']' '^' '_' */ + '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', + /* '`' 'a' 'b' 'c' 'd' 'e' 'f' 'g' */ + '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', + /* 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' */ + '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', + /* 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' */ + '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', + /* 'x' 'y' 'z' '{' '|' '}' '~' */ + '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', + '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', + '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', + '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', + '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', + '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247', + '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', + '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', + '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', + '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307', + '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317', + '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327', + '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337', + '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', + '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', + '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', + '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377', +}; +#else +# error >>> "You lose. You will need a translation table for your character set." <<< +#endif + +int +rb_memcicmp(x, y, len) + const void *x, *y; + long len; +{ + const unsigned char *p1 = x, *p2 = y; + int tmp; + + while (len--) { + if ((tmp = casetable[(unsigned)*p1++] - casetable[(unsigned)*p2++]) != 0) + return tmp; + } + return 0; +} + +int +rb_memcmp(p1, p2, len) + const void *p1, *p2; + long len; +{ + if (!ruby_ignorecase) { + return memcmp(p1, p2, len); + } + return rb_memcicmp(p1, p2, len); +} + +long +rb_memsearch(x0, m, y0, n) + const void *x0, *y0; + long m, n; +{ + const unsigned char *x = (unsigned char *)x0, *y = (unsigned char *)y0; + const unsigned char *s, *e; + long i; + int d; + unsigned long hx, hy; + +#define KR_REHASH(a, b, h) (((h) << 1) - (((unsigned long)(a))<<d) + (b)) + + if (m > n) return -1; + s = y; e = s + n - m; + + /* Preprocessing */ + /* computes d = 2^(m-1) with + the left-shift operator */ + d = sizeof(hx) * CHAR_BIT - 1; + if (d > m) d = m; + + if (ruby_ignorecase) { + if (n == m) { + return rb_memcicmp(x, s, m) == 0 ? 0 : -1; + } + /* Prepare hash value */ + for (hy = hx = i = 0; i < d; ++i) { + hx = KR_REHASH(0, casetable[x[i]], hx); + hy = KR_REHASH(0, casetable[s[i]], hy); + } + /* Searching */ + while (hx != hy || rb_memcicmp(x, s, m)) { + if (s >= e) return -1; + hy = KR_REHASH(casetable[*s], casetable[*(s+d)], hy); + s++; + } + } + else { + if (n == m) { + return memcmp(x, s, m) == 0 ? 0 : -1; + } + /* Prepare hash value */ + for (hy = hx = i = 0; i < d; ++i) { + hx = KR_REHASH(0, x[i], hx); + hy = KR_REHASH(0, s[i], hy); + } + /* Searching */ + while (hx != hy || memcmp(x, s, m)) { + if (s >= e) return -1; + hy = KR_REHASH(*s, *(s+d), hy); + s++; + } + } + return s-y; +} + +#define REG_LITERAL FL_USER5 +#define REG_CASESTATE FL_USER0 +#define KCODE_NONE 0 +#define KCODE_EUC FL_USER1 +#define KCODE_SJIS FL_USER2 +#define KCODE_UTF8 FL_USER3 +#define KCODE_FIXED FL_USER4 +#define KCODE_MASK (KCODE_EUC|KCODE_SJIS|KCODE_UTF8) + +static int reg_kcode = DEFAULT_KCODE; + +static void +kcode_euc(re) + struct RRegexp *re; +{ + FL_UNSET(re, KCODE_MASK); + FL_SET(re, KCODE_EUC); + FL_SET(re, KCODE_FIXED); +} + +static void +kcode_sjis(re) + struct RRegexp *re; +{ + FL_UNSET(re, KCODE_MASK); + FL_SET(re, KCODE_SJIS); + FL_SET(re, KCODE_FIXED); +} + +static void +kcode_utf8(re) + struct RRegexp *re; +{ + FL_UNSET(re, KCODE_MASK); + FL_SET(re, KCODE_UTF8); + FL_SET(re, KCODE_FIXED); +} + +static void +kcode_none(re) + struct RRegexp *re; +{ + FL_UNSET(re, KCODE_MASK); + FL_SET(re, KCODE_FIXED); +} + +static int curr_kcode; + +void +rb_kcode_set_option(re) + VALUE re; +{ + if (!FL_TEST(re, KCODE_FIXED)) return; + + curr_kcode = RBASIC(re)->flags & KCODE_MASK; + if (reg_kcode == curr_kcode) return; + switch (curr_kcode) { + case KCODE_NONE: + re_mbcinit(MBCTYPE_ASCII); + break; + case KCODE_EUC: + re_mbcinit(MBCTYPE_EUC); + break; + case KCODE_SJIS: + re_mbcinit(MBCTYPE_SJIS); + break; + case KCODE_UTF8: + re_mbcinit(MBCTYPE_UTF8); + break; + } +} + +void +rb_kcode_reset_option() +{ + if (reg_kcode == curr_kcode) return; + switch (reg_kcode) { + case KCODE_NONE: + re_mbcinit(MBCTYPE_ASCII); + break; + case KCODE_EUC: + re_mbcinit(MBCTYPE_EUC); + break; + case KCODE_SJIS: + re_mbcinit(MBCTYPE_SJIS); + break; + case KCODE_UTF8: + re_mbcinit(MBCTYPE_UTF8); + break; + } +} + +int +rb_reg_mbclen2(c, re) + unsigned int c; + VALUE re; +{ + int len; + + if (!FL_TEST(re, KCODE_FIXED)) + return mbclen(c); + rb_kcode_set_option(re); + len = mbclen(c); + rb_kcode_reset_option(); + return len; +} + +static void +rb_reg_check(re) + VALUE re; +{ + if (!RREGEXP(re)->ptr || !RREGEXP(re)->str) { + rb_raise(rb_eTypeError, "uninitialized Regexp"); + } +} + +extern int ruby_in_compile; + +static void +rb_reg_expr_str(str, s, len) + VALUE str; + const char *s; + long len; +{ + const char *p, *pend; + int need_escape = 0; + + p = s; pend = p + len; + while (p<pend) { + if (*p == '/' || (!ISPRINT(*p) && !ismbchar(*p))) { + need_escape = 1; + break; + } + p += mbclen(*p); + } + if (!need_escape) { + rb_str_buf_cat(str, s, len); + } + else { + p = s; + while (p<pend) { + if (*p == '\\') { + int n = mbclen(p[1]) + 1; + rb_str_buf_cat(str, p, n); + p += n; + continue; + } + else if (*p == '/') { + char c = '\\'; + rb_str_buf_cat(str, &c, 1); + rb_str_buf_cat(str, p, 1); + } + else if (ismbchar(*p)) { + rb_str_buf_cat(str, p, mbclen(*p)); + p += mbclen(*p); + continue; + } + else if (ISPRINT(*p)) { + rb_str_buf_cat(str, p, 1); + } + else if (!ISSPACE(*p)) { + char b[8]; + + sprintf(b, "\\%03o", *p & 0377); + rb_str_buf_cat(str, b, 4); + } + else { + rb_str_buf_cat(str, p, 1); + } + p++; + } + } +} + +static VALUE +rb_reg_desc(s, len, re) + const char *s; + long len; + VALUE re; +{ + VALUE str = rb_str_buf_new2("/"); + + rb_reg_expr_str(str, s, len); + rb_str_buf_cat2(str, "/"); + if (re) { + rb_reg_check(re); + if (RREGEXP(re)->ptr->options & RE_OPTION_MULTILINE) + rb_str_buf_cat2(str, "m"); + if (RREGEXP(re)->ptr->options & RE_OPTION_IGNORECASE) + rb_str_buf_cat2(str, "i"); + if (RREGEXP(re)->ptr->options & RE_OPTION_EXTENDED) + rb_str_buf_cat2(str, "x"); + + if (FL_TEST(re, KCODE_FIXED)) { + switch ((RBASIC(re)->flags & KCODE_MASK)) { + case KCODE_NONE: + rb_str_buf_cat2(str, "n"); + break; + case KCODE_EUC: + rb_str_buf_cat2(str, "e"); + break; + case KCODE_SJIS: + rb_str_buf_cat2(str, "s"); + break; + case KCODE_UTF8: + rb_str_buf_cat2(str, "u"); + break; + } + } + } + OBJ_INFECT(str, re); + return str; +} + + +/* + * call-seq: + * rxp.source => str + * + * Returns the original string of the pattern. + * + * /ab+c/ix.source #=> "ab+c" + */ + +static VALUE +rb_reg_source(re) + VALUE re; +{ + VALUE str; + + rb_reg_check(re); + str = rb_str_new(RREGEXP(re)->str,RREGEXP(re)->len); + if (OBJ_TAINTED(re)) OBJ_TAINT(str); + return str; +} + +/* + * call-seq: + * rxp.inspect => string + * + * Produce a nicely formatted string-version of _rxp_. Perhaps surprisingly, + * <code>#inspect</code> actually produces the more natural version of + * the string than <code>#to_s</code>. + * + * /ab+c/ix.to_s #=> /ab+c/ix +*/ + +static VALUE +rb_reg_inspect(re) + VALUE re; +{ + rb_reg_check(re); + return rb_reg_desc(RREGEXP(re)->str, RREGEXP(re)->len, re); +} + + +/* + * call-seq: + * rxp.to_s => str + * + * Returns a string containing the regular expression and its options (using the + * <code>(?xxx:yyy)</code> notation. This string can be fed back in to + * <code>Regexp::new</code> to a regular expression with the same semantics as + * the original. (However, <code>Regexp#==</code> may not return true when + * comparing the two, as the source of the regular expression itself may + * differ, as the example shows). <code>Regexp#inspect</code> produces a + * generally more readable version of <i>rxp</i>. + * + * r1 = /ab+c/ix #=> /ab+c/ix + * s1 = r1.to_s #=> "(?ix-m:ab+c)" + * r2 = Regexp.new(s1) #=> /(?ix-m:ab+c)/ + * r1 == r2 #=> false + * r1.source #=> "ab+c" + * r2.source #=> "(?ix-m:ab+c)" + */ + +static VALUE +rb_reg_to_s(re) + VALUE re; +{ + int options; + const int embeddable = RE_OPTION_MULTILINE|RE_OPTION_IGNORECASE|RE_OPTION_EXTENDED; + long len; + const char* ptr; + VALUE str = rb_str_buf_new2("(?"); + + rb_reg_check(re); + + options = RREGEXP(re)->ptr->options; + ptr = RREGEXP(re)->str; + len = RREGEXP(re)->len; + again: + if (len >= 4 && ptr[0] == '(' && ptr[1] == '?') { + int err = 1; + ptr += 2; + if ((len -= 2) > 0) { + do { + if (*ptr == 'm') { + options |= RE_OPTION_MULTILINE; + } + else if (*ptr == 'i') { + options |= RE_OPTION_IGNORECASE; + } + else if (*ptr == 'x') { + options |= RE_OPTION_EXTENDED; + } + else break; + ++ptr; + } while (--len > 0); + } + if (len > 1 && *ptr == '-') { + ++ptr; + --len; + do { + if (*ptr == 'm') { + options &= ~RE_OPTION_MULTILINE; + } + else if (*ptr == 'i') { + options &= ~RE_OPTION_IGNORECASE; + } + else if (*ptr == 'x') { + options &= ~RE_OPTION_EXTENDED; + } + else break; + ++ptr; + } while (--len > 0); + } + if (*ptr == ')') { + --len; + ++ptr; + goto again; + } + if (*ptr == ':' && ptr[len-1] == ')') { + Regexp *rp; + rb_kcode_set_option(re); + rp = ALLOC(Regexp); + MEMZERO((char *)rp, Regexp, 1); + err = re_compile_pattern(++ptr, len -= 2, rp) != 0; + rb_kcode_reset_option(); + re_free_pattern(rp); + } + if (err) { + options = RREGEXP(re)->ptr->options; + ptr = RREGEXP(re)->str; + len = RREGEXP(re)->len; + } + } + + if (options & RE_OPTION_MULTILINE) rb_str_buf_cat2(str, "m"); + if (options & RE_OPTION_IGNORECASE) rb_str_buf_cat2(str, "i"); + if (options & RE_OPTION_EXTENDED) rb_str_buf_cat2(str, "x"); + + if ((options & embeddable) != embeddable) { + rb_str_buf_cat2(str, "-"); + if (!(options & RE_OPTION_MULTILINE)) rb_str_buf_cat2(str, "m"); + if (!(options & RE_OPTION_IGNORECASE)) rb_str_buf_cat2(str, "i"); + if (!(options & RE_OPTION_EXTENDED)) rb_str_buf_cat2(str, "x"); + } + + rb_str_buf_cat2(str, ":"); + rb_reg_expr_str(str, ptr, len); + rb_str_buf_cat2(str, ")"); + + OBJ_INFECT(str, re); + return str; +} + +static void +rb_reg_raise(s, len, err, re) + const char *s; + long len; + const char *err; + VALUE re; +{ + VALUE desc = rb_reg_desc(s, len, re); + + if (ruby_in_compile) + rb_compile_error("%s: %s", err, RSTRING(desc)->ptr); + else + rb_raise(rb_eRegexpError, "%s: %s", err, RSTRING(desc)->ptr); +} + + +/* + * call-seq: + * rxp.casefold? => true or false + * + * Returns the value of the case-insensitive flag. + */ + +static VALUE +rb_reg_casefold_p(re) + VALUE re; +{ + rb_reg_check(re); + if (RREGEXP(re)->ptr->options & RE_OPTION_IGNORECASE) return Qtrue; + return Qfalse; +} + + +/* + * call-seq: + * rxp.options => fixnum + * + * Returns the set of bits corresponding to the options used when creating this + * Regexp (see <code>Regexp::new</code> for details. Note that additional bits + * may be set in the returned options: these are used internally by the regular + * expression code. These extra bits are ignored if the options are passed to + * <code>Regexp::new</code>. + * + * Regexp::IGNORECASE #=> 1 + * Regexp::EXTENDED #=> 2 + * Regexp::MULTILINE #=> 4 + * + * /cat/.options #=> 128 + * /cat/ix.options #=> 131 + * Regexp.new('cat', true).options #=> 129 + * Regexp.new('cat', 0, 's').options #=> 384 + * + * r = /cat/ix + * Regexp.new(r.source, r.options) #=> /cat/ix + */ + +static VALUE +rb_reg_options_m(re) + VALUE re; +{ + int options = rb_reg_options(re); + return INT2NUM(options); +} + + +/* + * call-seq: + * rxp.kcode => str + * + * Returns the character set code for the regexp. + */ + +static VALUE +rb_reg_kcode_m(re) + VALUE re; +{ + char *kcode; + + if (FL_TEST(re, KCODE_FIXED)) { + switch (RBASIC(re)->flags & KCODE_MASK) { + case KCODE_NONE: + kcode = "none"; break; + case KCODE_EUC: + kcode = "euc"; break; + case KCODE_SJIS: + kcode = "sjis"; break; + case KCODE_UTF8: + kcode = "utf8"; break; + default: + rb_bug("unknown kcode - should not happen"); + break; + } + return rb_str_new2(kcode); + } + return Qnil; +} + +static Regexp* +make_regexp(s, len, flags) + const char *s; + long len; + int flags; +{ + Regexp *rp; + char *err; + + /* Handle escaped characters first. */ + + /* Build a copy of the string (in dest) with the + escaped characters translated, and generate the regex + from that. + */ + + rp = ALLOC(Regexp); + MEMZERO((char *)rp, Regexp, 1); + rp->buffer = ALLOC_N(char, 16); + rp->allocated = 16; + rp->fastmap = ALLOC_N(char, 256); + if (flags) { + rp->options = flags; + } + err = re_compile_pattern(s, len, rp); + + if (err != NULL) { + re_free_pattern(rp); + rb_reg_raise(s, len, err, 0); + return 0; + } + return rp; +} + + +/* + * Document-class: MatchData + * + * <code>MatchData</code> is the type of the special variable <code>$~</code>, + * and is the type of the object returned by <code>Regexp#match</code> and + * <code>Regexp#last_match</code>. It encapsulates all the results of a pattern + * match, results normally accessed through the special variables + * <code>$&</code>, <code>$'</code>, <code>$`</code>, <code>$1</code>, + * <code>$2</code>, and so on. <code>Matchdata</code> is also known as + * <code>MatchingData</code>. + * + */ + +VALUE rb_cMatch; + +static VALUE match_alloc _((VALUE)); +static VALUE +match_alloc(klass) + VALUE klass; +{ + NEWOBJ(match, struct RMatch); + OBJSETUP(match, klass, T_MATCH); + + match->str = 0; + match->regs = 0; + match->regs = ALLOC(struct re_registers); + MEMZERO(match->regs, struct re_registers, 1); + + return (VALUE)match; +} + +static void +match_check(VALUE match) +{ + if (!RMATCH(match)->str) { + rb_raise(rb_eTypeError, "uninitialized Match"); + } +} + +/* :nodoc: */ +static VALUE +match_init_copy(obj, orig) + VALUE obj, orig; +{ + if (obj == orig) return obj; + + if (!rb_obj_is_instance_of(orig, rb_obj_class(obj))) { + rb_raise(rb_eTypeError, "wrong argument class"); + } + RMATCH(obj)->str = RMATCH(orig)->str; + re_free_registers(RMATCH(obj)->regs); + RMATCH(obj)->regs->allocated = 0; + re_copy_registers(RMATCH(obj)->regs, RMATCH(orig)->regs); + + return obj; +} + + +/* + * call-seq: + * mtch.length => integer + * mtch.size => integer + * + * Returns the number of elements in the match array. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138.") + * m.length #=> 5 + * m.size #=> 5 + */ + +static VALUE +match_size(match) + VALUE match; +{ + match_check(match); + return INT2FIX(RMATCH(match)->regs->num_regs); +} + + +/* + * call-seq: + * mtch.offset(n) => array + * + * Returns a two-element array containing the beginning and ending offsets of + * the <em>n</em>th match. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138.") + * m.offset(0) #=> [1, 7] + * m.offset(4) #=> [6, 7] + */ + +static VALUE +match_offset(match, n) + VALUE match, n; +{ + int i = NUM2INT(n); + + match_check(match); + if (i < 0 || RMATCH(match)->regs->num_regs <= i) + rb_raise(rb_eIndexError, "index %d out of matches", i); + + if (RMATCH(match)->regs->beg[i] < 0) + return rb_assoc_new(Qnil, Qnil); + + return rb_assoc_new(INT2FIX(RMATCH(match)->regs->beg[i]), + INT2FIX(RMATCH(match)->regs->end[i])); +} + + +/* + * call-seq: + * mtch.begin(n) => integer + * + * Returns the offset of the start of the <em>n</em>th element of the match + * array in the string. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138.") + * m.begin(0) #=> 1 + * m.begin(2) #=> 2 + */ + +static VALUE +match_begin(match, n) + VALUE match, n; +{ + int i = NUM2INT(n); + + match_check(match); + if (i < 0 || RMATCH(match)->regs->num_regs <= i) + rb_raise(rb_eIndexError, "index %d out of matches", i); + + if (RMATCH(match)->regs->beg[i] < 0) + return Qnil; + + return INT2FIX(RMATCH(match)->regs->beg[i]); +} + + +/* + * call-seq: + * mtch.end(n) => integer + * + * Returns the offset of the character immediately following the end of the + * <em>n</em>th element of the match array in the string. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138.") + * m.end(0) #=> 7 + * m.end(2) #=> 3 + */ + +static VALUE +match_end(match, n) + VALUE match, n; +{ + int i = NUM2INT(n); + + match_check(match); + if (i < 0 || RMATCH(match)->regs->num_regs <= i) + rb_raise(rb_eIndexError, "index %d out of matches", i); + + if (RMATCH(match)->regs->beg[i] < 0) + return Qnil; + + return INT2FIX(RMATCH(match)->regs->end[i]); +} + +#define MATCH_BUSY FL_USER2 + +void +rb_match_busy(match) + VALUE match; +{ + FL_SET(match, MATCH_BUSY); +} + +int ruby_ignorecase; +static int may_need_recompile; + +static void +rb_reg_prepare_re(re) + VALUE re; +{ + int need_recompile = 0; + int state; + + rb_reg_check(re); + state = FL_TEST(re, REG_CASESTATE); + /* ignorecase status */ + if (ruby_ignorecase && !state) { + FL_SET(re, REG_CASESTATE); + RREGEXP(re)->ptr->options |= RE_OPTION_IGNORECASE; + need_recompile = 1; + } + if (!ruby_ignorecase && state) { + FL_UNSET(re, REG_CASESTATE); + RREGEXP(re)->ptr->options &= ~RE_OPTION_IGNORECASE; + need_recompile = 1; + } + + if (!FL_TEST(re, KCODE_FIXED) && + (RBASIC(re)->flags & KCODE_MASK) != reg_kcode) { + need_recompile = 1; + RBASIC(re)->flags &= ~KCODE_MASK; + RBASIC(re)->flags |= reg_kcode; + } + + if (need_recompile) { + char *err; + + if (FL_TEST(re, KCODE_FIXED)) + rb_kcode_set_option(re); + rb_reg_check(re); + RREGEXP(re)->ptr->fastmap_accurate = 0; + err = re_compile_pattern(RREGEXP(re)->str, RREGEXP(re)->len, RREGEXP(re)->ptr); + if (err != NULL) { + rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, re); + } + } +} + +long +rb_reg_adjust_startpos(re, str, pos, reverse) + VALUE re, str; + long pos, reverse; +{ + long range; + + rb_reg_check(re); + if (may_need_recompile) rb_reg_prepare_re(re); + + if (FL_TEST(re, KCODE_FIXED)) + rb_kcode_set_option(re); + else if (reg_kcode != curr_kcode) + rb_kcode_reset_option(); + + if (reverse) { + range = -pos; + } + else { + range = RSTRING(str)->len - pos; + } + return re_adjust_startpos(RREGEXP(re)->ptr, + RSTRING(str)->ptr, RSTRING(str)->len, + pos, range); +} + +long +rb_reg_search(re, str, pos, reverse) + VALUE re, str; + long pos, reverse; +{ + long result; + VALUE match; + struct re_registers regs; + long range; + + if (pos > RSTRING(str)->len || pos < 0) { + rb_backref_set(Qnil); + return -1; + } + + rb_reg_check(re); + if (may_need_recompile) rb_reg_prepare_re(re); + + if (FL_TEST(re, KCODE_FIXED)) + rb_kcode_set_option(re); + else if (reg_kcode != curr_kcode) + rb_kcode_reset_option(); + + if (reverse) { + range = -pos; + } + else { + range = RSTRING(str)->len - pos; + } + MEMZERO(®s, struct re_registers, 1); + result = re_search(RREGEXP(re)->ptr,RSTRING(str)->ptr,RSTRING(str)->len, + pos, range, ®s); + + if (FL_TEST(re, KCODE_FIXED)) + rb_kcode_reset_option(); + + if (result == -2) { + rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, + "Stack overflow in regexp matcher", re); + } + + if (result < 0) { + re_free_registers(®s); + rb_backref_set(Qnil); + return result; + } + + match = rb_backref_get(); + if (NIL_P(match) || FL_TEST(match, MATCH_BUSY)) { + match = match_alloc(rb_cMatch); + } + else { + if (rb_safe_level() >= 3) + OBJ_TAINT(match); + else + FL_UNSET(match, FL_TAINT); + } + + re_copy_registers(RMATCH(match)->regs, ®s); + re_free_registers(®s); + RMATCH(match)->str = rb_str_new4(str); + rb_backref_set(match); + + OBJ_INFECT(match, re); + OBJ_INFECT(match, str); + return result; +} + +VALUE +rb_reg_nth_defined(nth, match) + int nth; + VALUE match; +{ + if (NIL_P(match)) return Qnil; + match_check(match); + if (nth >= RMATCH(match)->regs->num_regs) { + return Qnil; + } + if (nth < 0) { + nth += RMATCH(match)->regs->num_regs; + if (nth <= 0) return Qnil; + } + if (RMATCH(match)->BEG(nth) == -1) return Qfalse; + return Qtrue; +} + +VALUE +rb_reg_nth_match(nth, match) + int nth; + VALUE match; +{ + VALUE str; + long start, end, len; + + if (NIL_P(match)) return Qnil; + match_check(match); + if (nth >= RMATCH(match)->regs->num_regs) { + return Qnil; + } + if (nth < 0) { + nth += RMATCH(match)->regs->num_regs; + if (nth <= 0) return Qnil; + } + start = RMATCH(match)->BEG(nth); + if (start == -1) return Qnil; + end = RMATCH(match)->END(nth); + len = end - start; + str = rb_str_substr(RMATCH(match)->str, start, len); + OBJ_INFECT(str, match); + return str; +} + +VALUE +rb_reg_last_match(match) + VALUE match; +{ + return rb_reg_nth_match(0, match); +} + + +/* + * call-seq: + * mtch.pre_match => str + * + * Returns the portion of the original string before the current match. + * Equivalent to the special variable <code>$`</code>. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138.") + * m.pre_match #=> "T" + */ + +VALUE +rb_reg_match_pre(match) + VALUE match; +{ + VALUE str; + + if (NIL_P(match)) return Qnil; + match_check(match); + if (RMATCH(match)->BEG(0) == -1) return Qnil; + str = rb_str_substr(RMATCH(match)->str, 0, RMATCH(match)->BEG(0)); + if (OBJ_TAINTED(match)) OBJ_TAINT(str); + return str; +} + + +/* + * call-seq: + * mtch.post_match => str + * + * Returns the portion of the original string after the current match. + * Equivalent to the special variable <code>$'</code>. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138: The Movie") + * m.post_match #=> ": The Movie" + */ + +VALUE +rb_reg_match_post(match) + VALUE match; +{ + VALUE str; + long pos; + + if (NIL_P(match)) return Qnil; + match_check(match); + if (RMATCH(match)->BEG(0) == -1) return Qnil; + str = RMATCH(match)->str; + pos = RMATCH(match)->END(0); + str = rb_str_substr(str, pos, RSTRING(str)->len - pos); + if (OBJ_TAINTED(match)) OBJ_TAINT(str); + return str; +} + +VALUE +rb_reg_match_last(match) + VALUE match; +{ + int i; + + if (NIL_P(match)) return Qnil; + match_check(match); + if (RMATCH(match)->BEG(0) == -1) return Qnil; + + for (i=RMATCH(match)->regs->num_regs-1; RMATCH(match)->BEG(i) == -1 && i > 0; i--) + ; + if (i == 0) return Qnil; + return rb_reg_nth_match(i, match); +} + +static VALUE +last_match_getter() +{ + return rb_reg_last_match(rb_backref_get()); +} + +static VALUE +prematch_getter() +{ + return rb_reg_match_pre(rb_backref_get()); +} + +static VALUE +postmatch_getter() +{ + return rb_reg_match_post(rb_backref_get()); +} + +static VALUE +last_paren_match_getter() +{ + return rb_reg_match_last(rb_backref_get()); +} + +static VALUE +match_array(match, start) + VALUE match; + int start; +{ + struct re_registers *regs; + VALUE ary; + VALUE target; + int i; + int taint = OBJ_TAINTED(match); + + match_check(match); + regs = RMATCH(match)->regs; + ary = rb_ary_new2(regs->num_regs); + target = RMATCH(match)->str; + + for (i=start; i<regs->num_regs; i++) { + if (regs->beg[i] == -1) { + rb_ary_push(ary, Qnil); + } + else { + VALUE str = rb_str_substr(target, regs->beg[i], regs->end[i]-regs->beg[i]); + if (taint) OBJ_TAINT(str); + rb_ary_push(ary, str); + } + } + return ary; +} + + +/* [MG]:FIXME: I put parens around the /.../.match() in the first line of the + second example to prevent the '*' followed by a '/' from ending the + comment. */ + +/* + * call-seq: + * mtch.to_a => anArray + * + * Returns the array of matches. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138.") + * m.to_a #=> ["HX1138", "H", "X", "113", "8"] + * + * Because <code>to_a</code> is called when expanding + * <code>*</code><em>variable</em>, there's a useful assignment + * shortcut for extracting matched fields. This is slightly slower than + * accessing the fields directly (as an intermediate array is + * generated). + * + * all,f1,f2,f3 = *(/(.)(.)(\d+)(\d)/.match("THX1138.")) + * all #=> "HX1138" + * f1 #=> "H" + * f2 #=> "X" + * f3 #=> "113" + */ + +static VALUE +match_to_a(match) + VALUE match; +{ + return match_array(match, 0); +} + + +/* + * call-seq: + * mtch.captures => array + * + * Returns the array of captures; equivalent to <code>mtch.to_a[1..-1]</code>. + * + * f1,f2,f3,f4 = /(.)(.)(\d+)(\d)/.match("THX1138.").captures + * f1 #=> "H" + * f2 #=> "X" + * f3 #=> "113" + * f4 #=> "8" + */ +static VALUE +match_captures(match) + VALUE match; +{ + return match_array(match, 1); +} + + +/* + * call-seq: + * mtch[i] => obj + * mtch[start, length] => array + * mtch[range] => array + * + * Match Reference---<code>MatchData</code> acts as an array, and may be + * accessed using the normal array indexing techniques. <i>mtch</i>[0] is + * equivalent to the special variable <code>$&</code>, and returns the entire + * matched string. <i>mtch</i>[1], <i>mtch</i>[2], and so on return the values + * of the matched backreferences (portions of the pattern between parentheses). + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138.") + * m[0] #=> "HX1138" + * m[1, 2] #=> ["H", "X"] + * m[1..3] #=> ["H", "X", "113"] + * m[-3, 2] #=> ["X", "113"] + */ + +static VALUE +match_aref(argc, argv, match) + int argc; + VALUE *argv; + VALUE match; +{ + VALUE idx, rest; + + rb_scan_args(argc, argv, "11", &idx, &rest); + + if (!NIL_P(rest) || !FIXNUM_P(idx) || FIX2INT(idx) < 0) { + return rb_ary_aref(argc, argv, match_to_a(match)); + } + return rb_reg_nth_match(FIX2INT(idx), match); +} + +static VALUE match_entry _((VALUE, long)); +static VALUE +match_entry(match, n) + VALUE match; + long n; +{ + return rb_reg_nth_match(n, match); +} + + +/* + * call-seq: + * mtch.select([index]*) => array + * + * Uses each <i>index</i> to access the matching values, returning an array of + * the corresponding matches. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138: The Movie") + * m.to_a #=> ["HX1138", "H", "X", "113", "8"] + * m.select(0, 2, -2) #=> ["HX1138", "X", "113"] + */ + +static VALUE +match_values_at(argc, argv, match) + int argc; + VALUE *argv; + VALUE match; +{ + match_check(match); + return rb_values_at(match, RMATCH(match)->regs->num_regs, argc, argv, match_entry); +} + + +/* + * call-seq: + * mtch.select([index]*) => array + * + * Uses each <i>index</i> to access the matching values, returning an + * array of the corresponding matches. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138: The Movie") + * m.to_a #=> ["HX1138", "H", "X", "113", "8"] + * m.select(0, 2, -2) #=> ["HX1138", "X", "113"] + */ + +static VALUE +match_select(argc, argv, match) + int argc; + VALUE *argv; + VALUE match; +{ + if (argc > 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); + } + else { + struct re_registers *regs; + VALUE target; + VALUE result = rb_ary_new(); + int i; + int taint = OBJ_TAINTED(match); + + match_check(match); + regs = RMATCH(match)->regs; + target = RMATCH(match)->str; + + for (i=0; i<regs->num_regs; i++) { + VALUE str = rb_str_substr(target, regs->beg[i], regs->end[i]-regs->beg[i]); + if (taint) OBJ_TAINT(str); + if (RTEST(rb_yield(str))) { + rb_ary_push(result, str); + } + } + return result; + } +} + + +/* + * call-seq: + * mtch.to_s => str + * + * Returns the entire matched string. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138.") + * m.to_s #=> "HX1138" + */ + +static VALUE +match_to_s(match) + VALUE match; +{ + VALUE str = rb_reg_last_match(match); + + if (NIL_P(str)) str = rb_str_new(0,0); + if (OBJ_TAINTED(match)) OBJ_TAINT(str); + if (OBJ_TAINTED(RMATCH(match)->str)) OBJ_TAINT(str); + return str; +} + + +/* + * call-seq: + * mtch.string => str + * + * Returns a frozen copy of the string passed in to <code>match</code>. + * + * m = /(.)(.)(\d+)(\d)/.match("THX1138.") + * m.string #=> "THX1138." + */ + +static VALUE +match_string(match) + VALUE match; +{ + match_check(match); + return RMATCH(match)->str; /* str is frozen */ +} + +VALUE rb_cRegexp; + +static void +rb_reg_initialize(obj, s, len, options) + VALUE obj; + const char *s; + long len; + int options; /* CASEFOLD = 1 */ + /* EXTENDED = 2 */ + /* MULTILINE = 4 */ + /* CODE_NONE = 16 */ + /* CODE_EUC = 32 */ + /* CODE_SJIS = 48 */ + /* CODE_UTF8 = 64 */ +{ + struct RRegexp *re = RREGEXP(obj); + + if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify regexp"); + rb_check_frozen(obj); + if (FL_TEST(obj, REG_LITERAL)) + rb_raise(rb_eSecurityError, "can't modify literal regexp"); + if (re->ptr) re_free_pattern(re->ptr); + if (re->str) free(re->str); + re->ptr = 0; + re->str = 0; + + switch (options & ~0xf) { + case 0: + default: + FL_SET(re, reg_kcode); + break; + case 16: + kcode_none(re); + break; + case 32: + kcode_euc(re); + break; + case 48: + kcode_sjis(re); + break; + case 64: + kcode_utf8(re); + break; + } + + if (options & ~0xf) { + rb_kcode_set_option((VALUE)re); + } + if (ruby_ignorecase) { + options |= RE_OPTION_IGNORECASE; + FL_SET(re, REG_CASESTATE); + } + re->ptr = make_regexp(s, len, options & 0xf); + re->str = ALLOC_N(char, len+1); + memcpy(re->str, s, len); + re->str[len] = '\0'; + re->len = len; + if (options & ~0xf) { + rb_kcode_reset_option(); + } + if (ruby_in_compile) FL_SET(obj, REG_LITERAL); +} + +static VALUE rb_reg_s_alloc _((VALUE)); +static VALUE +rb_reg_s_alloc(klass) + VALUE klass; +{ + NEWOBJ(re, struct RRegexp); + OBJSETUP(re, klass, T_REGEXP); + + re->ptr = 0; + re->len = 0; + re->str = 0; + + return (VALUE)re; +} + +VALUE +rb_reg_new(s, len, options) + const char *s; + long len; + int options; +{ + VALUE re = rb_reg_s_alloc(rb_cRegexp); + + rb_reg_initialize(re, s, len, options); + return (VALUE)re; +} + +static int case_cache; +static int kcode_cache; +static VALUE reg_cache; + +VALUE +rb_reg_regcomp(str) + VALUE str; +{ + volatile VALUE save_str = str; + if (reg_cache && RREGEXP(reg_cache)->len == RSTRING(str)->len + && case_cache == ruby_ignorecase + && kcode_cache == reg_kcode + && memcmp(RREGEXP(reg_cache)->str, RSTRING(str)->ptr, RSTRING(str)->len) == 0) + return reg_cache; + + case_cache = ruby_ignorecase; + kcode_cache = reg_kcode; + return reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len, + ruby_ignorecase); +} + +static int +rb_reg_cur_kcode(re) + VALUE re; +{ + if (FL_TEST(re, KCODE_FIXED)) { + return RBASIC(re)->flags & KCODE_MASK; + } + return 0; +} + +/* + * call-seq: + * rxp.hash => fixnum + * + * Produce a hash based on the text and options of this regular expression. + */ + +static VALUE +rb_reg_hash(re) + VALUE re; +{ + int hashval, len; + char *p; + + rb_reg_check(re); + hashval = RREGEXP(re)->ptr->options; + len = RREGEXP(re)->len; + p = RREGEXP(re)->str; + while (len--) { + hashval = hashval * 33 + *p++; + } + hashval = hashval + (hashval>>5); + + return INT2FIX(hashval); +} + + +/* + * call-seq: + * rxp == other_rxp => true or false + * rxp.eql?(other_rxp) => true or false + * + * Equality---Two regexps are equal if their patterns are identical, they have + * the same character set code, and their <code>casefold?</code> values are the + * same. + * + * /abc/ == /abc/x #=> false + * /abc/ == /abc/i #=> false + * /abc/u == /abc/n #=> false + */ + +static VALUE +rb_reg_equal(re1, re2) + VALUE re1, re2; +{ + if (re1 == re2) return Qtrue; + if (TYPE(re2) != T_REGEXP) return Qfalse; + rb_reg_check(re1); rb_reg_check(re2); + if (RREGEXP(re1)->len != RREGEXP(re2)->len) return Qfalse; + if (memcmp(RREGEXP(re1)->str, RREGEXP(re2)->str, RREGEXP(re1)->len) == 0 && + rb_reg_cur_kcode(re1) == rb_reg_cur_kcode(re2) && + RREGEXP(re1)->ptr->options == RREGEXP(re2)->ptr->options) { + return Qtrue; + } + return Qfalse; +} + + +/* + * call-seq: + * rxp.match(str) => matchdata or nil + * + * Returns a <code>MatchData</code> object describing the match, or + * <code>nil</code> if there was no match. This is equivalent to retrieving the + * value of the special variable <code>$~</code> following a normal match. + * + * /(.)(.)(.)/.match("abc")[2] #=> "b" + */ + +VALUE +rb_reg_match(re, str) + VALUE re, str; +{ + long start; + + if (NIL_P(str)) { + rb_backref_set(Qnil); + return Qnil; + } + StringValue(str); + start = rb_reg_search(re, str, 0, 0); + if (start < 0) { + return Qnil; + } + return LONG2FIX(start); +} + + +/* + * call-seq: + * rxp === str => true or false + * + * Case Equality---Synonym for <code>Regexp#=~</code> used in case statements. + * + * a = "HELLO" + * case a + * when /^[a-z]*$/; print "Lower case\n" + * when /^[A-Z]*$/; print "Upper case\n" + * else; print "Mixed case\n" + * end + * + * <em>produces:</em> + * + * Upper case + */ + +VALUE +rb_reg_eqq(re, str) + VALUE re, str; +{ + long start; + + if (TYPE(str) != T_STRING) { + str = rb_check_string_type(str); + if (NIL_P(str)) { + rb_backref_set(Qnil); + return Qfalse; + } + } + StringValue(str); + start = rb_reg_search(re, str, 0, 0); + if (start < 0) { + return Qfalse; + } + return Qtrue; +} + + +/* + * call-seq: + * ~ rxp => integer or nil + * + * Match---Matches <i>rxp</i> against the contents of <code>$_</code>. + * Equivalent to <code><i>rxp</i> =~ $_</code>. + * + * $_ = "input data" + * ~ /at/ #=> 7 + */ + +VALUE +rb_reg_match2(re) + VALUE re; +{ + long start; + VALUE line = rb_lastline_get(); + + if (TYPE(line) != T_STRING) { + rb_backref_set(Qnil); + return Qnil; + } + + start = rb_reg_search(re, line, 0, 0); + if (start < 0) { + return Qnil; + } + return LONG2FIX(start); +} + + +/* + * call-seq: + * rxp.match(str) => matchdata or nil + * + * Returns a <code>MatchData</code> object describing the match, or + * <code>nil</code> if there was no match. This is equivalent to retrieving the + * value of the special variable <code>$~</code> following a normal match. + * + * /(.)(.)(.)/.match("abc")[2] #=> "b" + */ + +static VALUE +rb_reg_match_m(re, str) + VALUE re, str; +{ + VALUE result = rb_reg_match(re, str); + + if (NIL_P(result)) return Qnil; + result = rb_backref_get(); + rb_match_busy(result); + return result; +} + +/* + * Document-method: compile + * + * Synonym for <code>Regexp.new</code> + */ + +/* + * call-seq: + * Regexp.new(string [, options [, lang]]) => regexp + * Regexp.new(regexp) => regexp + * Regexp.compile(string [, options [, lang]]) => regexp + * Regexp.compile(regexp) => regexp + * + * Constructs a new regular expression from <i>pattern</i>, which can be either + * a <code>String</code> or a <code>Regexp</code> (in which case that regexp's + * options are propagated, and new options may not be specified (a change as of + * Ruby 1.8). If <i>options</i> is a <code>Fixnum</code>, it should be one or + * more of the constants <code>Regexp::EXTENDED</code>, + * <code>Regexp::IGNORECASE</code>, and <code>Regexp::MULTILINE</code>, + * <em>or</em>-ed together. Otherwise, if <i>options</i> is not + * <code>nil</code>, the regexp will be case insensitive. The <i>lang</i> + * parameter enables multibyte support for the regexp: `n', `N' = none, `e', + * `E' = EUC, `s', `S' = SJIS, `u', `U' = UTF-8. + * + * r1 = Regexp.new('^a-z+:\\s+\w+') #=> /^a-z+:\s+\w+/ + * r2 = Regexp.new('cat', true) #=> /cat/i + * r3 = Regexp.new('dog', Regexp::EXTENDED) #=> /dog/x + * r4 = Regexp.new(r2) #=> /cat/i + */ + +static VALUE +rb_reg_initialize_m(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + const char *s; + long len; + int flags = 0; + + if (argc == 0 || argc > 3) { + rb_raise(rb_eArgError, "wrong number of arguments"); + } + if (TYPE(argv[0]) == T_REGEXP) { + if (argc > 1) { + rb_warn("flags%s ignored", (argc == 3) ? " and encoding": ""); + } + rb_reg_check(argv[0]); + flags = RREGEXP(argv[0])->ptr->options & 0xf; + if (FL_TEST(argv[0], KCODE_FIXED)) { + switch (RBASIC(argv[0])->flags & KCODE_MASK) { + case KCODE_NONE: + flags |= 16; + break; + case KCODE_EUC: + flags |= 32; + break; + case KCODE_SJIS: + flags |= 48; + break; + case KCODE_UTF8: + flags |= 64; + break; + default: + break; + } + } + s = RREGEXP(argv[0])->str; + len = RREGEXP(argv[0])->len; + } + else { + if (argc >= 2) { + if (FIXNUM_P(argv[1])) flags = FIX2INT(argv[1]); + else if (RTEST(argv[1])) flags = RE_OPTION_IGNORECASE; + } + if (argc == 3 && !NIL_P(argv[2])) { + char *kcode = StringValuePtr(argv[2]); + + flags &= ~0x70; + switch (kcode[0]) { + case 'n': case 'N': + flags |= 16; + break; + case 'e': case 'E': + flags |= 32; + break; + case 's': case 'S': + flags |= 48; + break; + case 'u': case 'U': + flags |= 64; + break; + default: + break; + } + } + s = StringValuePtr(argv[0]); + len = RSTRING(argv[0])->len; + } + rb_reg_initialize(self, s, len, flags); + return self; +} + +VALUE +rb_reg_quote(str) + VALUE str; +{ + char *s, *send, *t; + VALUE tmp; + int c; + + s = RSTRING(str)->ptr; + send = s + RSTRING(str)->len; + for (; s < send; s++) { + c = *s; + if (ismbchar(c)) { + int n = mbclen(c); + + while (n-- && s < send) + s++; + s--; + continue; + } + switch (c) { + case '[': case ']': case '{': case '}': + case '(': case ')': case '|': case '-': + case '*': case '.': case '\\': + case '?': case '+': case '^': case '$': + case ' ': case '#': + case '\t': case '\f': case '\n': case '\r': + goto meta_found; + } + } + return rb_str_new3(str); + + meta_found: + tmp = rb_str_new(0, RSTRING(str)->len*2); + t = RSTRING(tmp)->ptr; + /* copy upto metacharacter */ + memcpy(t, RSTRING(str)->ptr, s - RSTRING(str)->ptr); + t += s - RSTRING(str)->ptr; + + for (; s < send; s++) { + c = *s; + if (ismbchar(c)) { + int n = mbclen(c); + + while (n-- && s < send) + *t++ = *s++; + s--; + continue; + } + switch (c) { + case '[': case ']': case '{': case '}': + case '(': case ')': case '|': case '-': + case '*': case '.': case '\\': + case '?': case '+': case '^': case '$': + case '#': + *t++ = '\\'; + break; + case ' ': + *t++ = '\\'; + *t++ = ' '; + continue; + case '\t': + *t++ = '\\'; + *t++ = 't'; + continue; + case '\n': + *t++ = '\\'; + *t++ = 'n'; + continue; + case '\r': + *t++ = '\\'; + *t++ = 'r'; + continue; + case '\f': + *t++ = '\\'; + *t++ = 'f'; + continue; + } + *t++ = c; + } + rb_str_resize(tmp, t - RSTRING(tmp)->ptr); + OBJ_INFECT(tmp, str); + return tmp; +} + + +/* + * call-seq: + * Regexp.escape(str) => a_str + * Regexp.quote(str) => a_str + * + * Escapes any characters that would have special meaning in a regular + * expression. Returns a new escaped string, or self if no characters are + * escaped. For any string, + * <code>Regexp.escape(<i>str</i>)=~<i>str</i></code> will be true. + * + * Regexp.escape('\\*?{}.') #=> \\\\\*\?\{\}\. + */ + +static VALUE +rb_reg_s_quote(argc, argv) + int argc; + VALUE *argv; +{ + VALUE str, kcode; + int kcode_saved = reg_kcode; + + rb_scan_args(argc, argv, "11", &str, &kcode); + if (!NIL_P(kcode)) { + rb_set_kcode(StringValuePtr(kcode)); + curr_kcode = reg_kcode; + reg_kcode = kcode_saved; + } + StringValue(str); + str = rb_reg_quote(str); + rb_kcode_reset_option(); + return str; +} + +int +rb_kcode() +{ + switch (reg_kcode) { + case KCODE_EUC: + return MBCTYPE_EUC; + case KCODE_SJIS: + return MBCTYPE_SJIS; + case KCODE_UTF8: + return MBCTYPE_UTF8; + case KCODE_NONE: + return MBCTYPE_ASCII; + } + rb_bug("wrong reg_kcode value (0x%x)", reg_kcode); +} + +static int +rb_reg_get_kcode(re) + VALUE re; +{ + switch (RBASIC(re)->flags & KCODE_MASK) { + case KCODE_NONE: + return 16; + case KCODE_EUC: + return 32; + case KCODE_SJIS: + return 48; + case KCODE_UTF8: + return 64; + default: + return 0; + } +} + +int +rb_reg_options(re) + VALUE re; +{ + int options; + + rb_reg_check(re); + options = RREGEXP(re)->ptr->options & + (RE_OPTION_IGNORECASE|RE_OPTION_MULTILINE|RE_OPTION_EXTENDED); + if (FL_TEST(re, KCODE_FIXED)) { + options |= rb_reg_get_kcode(re); + } + return options; +} + + +/* + * call-seq: + * Regexp.union([pattern]*) => new_str + * + * Return a <code>Regexp</code> object that is the union of the given + * <em>pattern</em>s, i.e., will match any of its parts. The <em>pattern</em>s + * can be Regexp objects, in which case their options will be preserved, or + * Strings. If no arguments are given, returns <code>/(?!)/</code>. + * + * Regexp.union #=> /(?!)/ + * Regexp.union("penzance") #=> /penzance/ + * Regexp.union("skiing", "sledding") #=> /skiing|sledding/ + * Regexp.union(/dogs/, /cats/i) #=> /(?-mix:dogs)|(?i-mx:cats)/ + */ +static VALUE +rb_reg_s_union(argc, argv) + int argc; + VALUE *argv; +{ + if (argc == 0) { + VALUE args[1]; + args[0] = rb_str_new2("(?!)"); + return rb_class_new_instance(1, args, rb_cRegexp); + } + else if (argc == 1) { + VALUE v; + v = rb_check_convert_type(argv[0], T_REGEXP, "Regexp", "to_regexp"); + if (!NIL_P(v)) + return v; + else { + VALUE args[1]; + args[0] = rb_reg_s_quote(argc, argv); + return rb_class_new_instance(1, args, rb_cRegexp); + } + } + else { + int i, kcode = -1; + VALUE kcode_re = Qnil; + VALUE source = rb_str_buf_new(0); + VALUE args[3]; + for (i = 0; i < argc; i++) { + volatile VALUE v; + if (0 < i) + rb_str_buf_cat2(source, "|"); + v = rb_check_convert_type(argv[i], T_REGEXP, "Regexp", "to_regexp"); + if (!NIL_P(v)) { + if (FL_TEST(v, KCODE_FIXED)) { + if (kcode == -1) { + kcode_re = v; + kcode = RBASIC(v)->flags & KCODE_MASK; + } + else if ((RBASIC(v)->flags & KCODE_MASK) != kcode) { + volatile VALUE str1, str2; + str1 = rb_inspect(kcode_re); + str2 = rb_inspect(v); + rb_raise(rb_eArgError, "mixed kcode: %s and %s", + RSTRING(str1)->ptr, RSTRING(str2)->ptr); + } + } + v = rb_reg_to_s(v); + } + else { + args[0] = argv[i]; + v = rb_reg_s_quote(1, args); + } + rb_str_buf_append(source, v); + } + args[0] = source; + args[1] = Qnil; + switch (kcode) { + case -1: + args[2] = Qnil; + break; + case KCODE_NONE: + args[2] = rb_str_new2("n"); + break; + case KCODE_EUC: + args[2] = rb_str_new2("e"); + break; + case KCODE_SJIS: + args[2] = rb_str_new2("s"); + break; + case KCODE_UTF8: + args[2] = rb_str_new2("u"); + break; + } + return rb_class_new_instance(3, args, rb_cRegexp); + } +} + +/* :nodoc: */ +static VALUE +rb_reg_init_copy(copy, re) + VALUE copy, re; +{ + if (copy == re) return copy; + rb_check_frozen(copy); + /* need better argument type check */ + if (!rb_obj_is_instance_of(re, rb_obj_class(copy))) { + rb_raise(rb_eTypeError, "wrong argument type"); + } + rb_reg_check(re); + rb_reg_initialize(copy, RREGEXP(re)->str, RREGEXP(re)->len, + rb_reg_options(re)); + return copy; +} + +VALUE +rb_reg_regsub(str, src, regs) + VALUE str, src; + struct re_registers *regs; +{ + VALUE val = 0; + char *p, *s, *e, c; + int no; + + p = s = RSTRING(str)->ptr; + e = s + RSTRING(str)->len; + + while (s < e) { + char *ss = s; + + c = *s++; + if (ismbchar(c)) { + s += mbclen(c) - 1; + continue; + } + if (c != '\\' || s == e) continue; + + if (!val) { + val = rb_str_buf_new(ss-p); + rb_str_buf_cat(val, p, ss-p); + } + else { + rb_str_buf_cat(val, p, ss-p); + } + + c = *s++; + p = s; + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + no = c - '0'; + break; + case '&': + no = 0; + break; + + case '`': + rb_str_buf_cat(val, RSTRING(src)->ptr, BEG(0)); + continue; + + case '\'': + rb_str_buf_cat(val, RSTRING(src)->ptr+END(0), RSTRING(src)->len-END(0)); + continue; + + case '+': + no = regs->num_regs-1; + while (BEG(no) == -1 && no > 0) no--; + if (no == 0) continue; + break; + + case '\\': + rb_str_buf_cat(val, s-1, 1); + continue; + + default: + rb_str_buf_cat(val, s-2, 2); + continue; + } + + if (no >= 0) { + if (no >= regs->num_regs) continue; + if (BEG(no) == -1) continue; + rb_str_buf_cat(val, RSTRING(src)->ptr+BEG(no), END(no)-BEG(no)); + } + } + + if (p < e) { + if (!val) { + val = rb_str_buf_new(e-p); + rb_str_buf_cat(val, p, e-p); + } + else { + rb_str_buf_cat(val, p, e-p); + } + } + if (!val) return str; + + return val; +} + +const char* +rb_get_kcode() +{ + switch (reg_kcode) { + case KCODE_SJIS: + return "SJIS"; + case KCODE_EUC: + return "EUC"; + case KCODE_UTF8: + return "UTF8"; + default: + return "NONE"; + } +} + +static VALUE +kcode_getter() +{ + return rb_str_new2(rb_get_kcode()); +} + +void +rb_set_kcode(code) + const char *code; +{ + if (code == 0) goto set_no_conversion; + + switch (code[0]) { + case 'E': + case 'e': + reg_kcode = KCODE_EUC; + re_mbcinit(MBCTYPE_EUC); + break; + case 'S': + case 's': + reg_kcode = KCODE_SJIS; + re_mbcinit(MBCTYPE_SJIS); + break; + case 'U': + case 'u': + reg_kcode = KCODE_UTF8; + re_mbcinit(MBCTYPE_UTF8); + break; + default: + case 'N': + case 'n': + case 'A': + case 'a': + set_no_conversion: + reg_kcode = KCODE_NONE; + re_mbcinit(MBCTYPE_ASCII); + break; + } +} + +static void +kcode_setter(val) + VALUE val; +{ + may_need_recompile = 1; + rb_set_kcode(StringValuePtr(val)); +} + +static VALUE +ignorecase_getter() +{ + return ruby_ignorecase?Qtrue:Qfalse; +} + +static void +ignorecase_setter(val, id) + VALUE val; + ID id; +{ + rb_warn("modifying %s is deprecated", rb_id2name(id)); + may_need_recompile = 1; + ruby_ignorecase = RTEST(val); +} + +static VALUE +match_getter() +{ + VALUE match = rb_backref_get(); + + if (NIL_P(match)) return Qnil; + rb_match_busy(match); + return match; +} + +static void +match_setter(val) + VALUE val; +{ + if (!NIL_P(val)) { + Check_Type(val, T_MATCH); + } + rb_backref_set(val); +} + +/* + * call-seq: + * Regexp.last_match => matchdata + * Regexp.last_match(fixnum) => str + * + * The first form returns the <code>MatchData</code> object generated by the + * last successful pattern match. Equivalent to reading the global variable + * <code>$~</code>. The second form returns the nth field in this + * <code>MatchData</code> object. + * + * /c(.)t/ =~ 'cat' #=> 0 + * Regexp.last_match #=> #<MatchData:0x401b3d30> + * Regexp.last_match(0) #=> "cat" + * Regexp.last_match(1) #=> "a" + * Regexp.last_match(2) #=> nil + */ + +static VALUE +rb_reg_s_last_match(argc, argv) + int argc; + VALUE *argv; +{ + VALUE nth; + + if (rb_scan_args(argc, argv, "01", &nth) == 1) { + return rb_reg_nth_match(NUM2INT(nth), rb_backref_get()); + } + return match_getter(); +} + + +/* + * Document-class: Regexp + * + * A <code>Regexp</code> holds a regular expression, used to match a pattern + * against strings. Regexps are created using the <code>/.../</code> and + * <code>%r{...}</code> literals, and by the <code>Regexp::new</code> + * constructor. + * + */ + +void +Init_Regexp() +{ + rb_eRegexpError = rb_define_class("RegexpError", rb_eStandardError); + + re_set_casetable(casetable); +#if DEFAULT_KCODE == KCODE_EUC + re_mbcinit(MBCTYPE_EUC); +#else +#if DEFAULT_KCODE == KCODE_SJIS + re_mbcinit(MBCTYPE_SJIS); +#else +#if DEFAULT_KCODE == KCODE_UTF8 + re_mbcinit(MBCTYPE_UTF8); +#else + re_mbcinit(MBCTYPE_ASCII); +#endif +#endif +#endif + + rb_define_virtual_variable("$~", match_getter, match_setter); + rb_define_virtual_variable("$&", last_match_getter, 0); + rb_define_virtual_variable("$`", prematch_getter, 0); + rb_define_virtual_variable("$'", postmatch_getter, 0); + rb_define_virtual_variable("$+", last_paren_match_getter, 0); + + rb_define_virtual_variable("$=", ignorecase_getter, ignorecase_setter); + rb_define_virtual_variable("$KCODE", kcode_getter, kcode_setter); + rb_define_virtual_variable("$-K", kcode_getter, kcode_setter); + + rb_cRegexp = rb_define_class("Regexp", rb_cObject); + rb_define_alloc_func(rb_cRegexp, rb_reg_s_alloc); + rb_define_singleton_method(rb_cRegexp, "compile", rb_class_new_instance, -1); + rb_define_singleton_method(rb_cRegexp, "quote", rb_reg_s_quote, -1); + rb_define_singleton_method(rb_cRegexp, "escape", rb_reg_s_quote, -1); + rb_define_singleton_method(rb_cRegexp, "union", rb_reg_s_union, -1); + rb_define_singleton_method(rb_cRegexp, "last_match", rb_reg_s_last_match, -1); + + rb_define_method(rb_cRegexp, "initialize", rb_reg_initialize_m, -1); + rb_define_method(rb_cRegexp, "initialize_copy", rb_reg_init_copy, 1); + rb_define_method(rb_cRegexp, "hash", rb_reg_hash, 0); + rb_define_method(rb_cRegexp, "eql?", rb_reg_equal, 1); + rb_define_method(rb_cRegexp, "==", rb_reg_equal, 1); + rb_define_method(rb_cRegexp, "=~", rb_reg_match, 1); + rb_define_method(rb_cRegexp, "===", rb_reg_eqq, 1); + rb_define_method(rb_cRegexp, "~", rb_reg_match2, 0); + rb_define_method(rb_cRegexp, "match", rb_reg_match_m, 1); + rb_define_method(rb_cRegexp, "to_s", rb_reg_to_s, 0); + rb_define_method(rb_cRegexp, "inspect", rb_reg_inspect, 0); + rb_define_method(rb_cRegexp, "source", rb_reg_source, 0); + rb_define_method(rb_cRegexp, "casefold?", rb_reg_casefold_p, 0); + rb_define_method(rb_cRegexp, "options", rb_reg_options_m, 0); + rb_define_method(rb_cRegexp, "kcode", rb_reg_kcode_m, 0); + + rb_define_const(rb_cRegexp, "IGNORECASE", INT2FIX(RE_OPTION_IGNORECASE)); + rb_define_const(rb_cRegexp, "EXTENDED", INT2FIX(RE_OPTION_EXTENDED)); + rb_define_const(rb_cRegexp, "MULTILINE", INT2FIX(RE_OPTION_MULTILINE)); + + rb_global_variable(®_cache); + + rb_cMatch = rb_define_class("MatchData", rb_cObject); + rb_define_global_const("MatchingData", rb_cMatch); + rb_define_alloc_func(rb_cMatch, match_alloc); + rb_undef_method(CLASS_OF(rb_cMatch), "new"); + + rb_define_method(rb_cMatch, "initialize_copy", match_init_copy, 1); + rb_define_method(rb_cMatch, "size", match_size, 0); + rb_define_method(rb_cMatch, "length", match_size, 0); + rb_define_method(rb_cMatch, "offset", match_offset, 1); + rb_define_method(rb_cMatch, "begin", match_begin, 1); + rb_define_method(rb_cMatch, "end", match_end, 1); + rb_define_method(rb_cMatch, "to_a", match_to_a, 0); + rb_define_method(rb_cMatch, "[]", match_aref, -1); + rb_define_method(rb_cMatch, "captures", match_captures, 0); + rb_define_method(rb_cMatch, "select", match_select, -1); + rb_define_method(rb_cMatch, "values_at", match_values_at, -1); + rb_define_method(rb_cMatch, "pre_match", rb_reg_match_pre, 0); + rb_define_method(rb_cMatch, "post_match", rb_reg_match_post, 0); + rb_define_method(rb_cMatch, "to_s", match_to_s, 0); + rb_define_method(rb_cMatch, "inspect", rb_any_to_s, 0); /* in object.c */ + rb_define_method(rb_cMatch, "string", match_string, 0); +} +/* Extended regular expression matching and search library. + Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file LGPL. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ +/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto) + Last change: May 21, 1993 by t^2 */ +/* removed gapped buffer support, multiple syntax support by matz <matz@nts.co.jp> */ +/* Perl5 extension added by matz <matz@caelum.co.jp> */ +/* UTF-8 extension added Jan 16 1999 by Yoshida Masato <yoshidam@tau.bekkoame.ne.jp> */ + +#include "config.h" + +#ifdef HAVE_STRING_H +# include <string.h> +#else +# include <strings.h> +#endif + +/* We write fatal error messages on standard error. */ +#include <stdio.h> + +/* isalpha(3) etc. are used for the character classes. */ +#include <ctype.h> +#include <sys/types.h> + +#ifndef PARAMS +# if defined __GNUC__ || (defined __STDC__ && __STDC__) +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif /* GCC. */ +#endif /* Not PARAMS. */ + +#if defined(STDC_HEADERS) +# include <stddef.h> +#else +/* We need this for `regex.h', and perhaps for the Emacs include files. */ +# include <sys/types.h> +#endif +#ifdef HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#if !defined(__STDC__) && !defined(_MSC_VER) +# define volatile +#endif + +#ifdef HAVE_PROTOTYPES +# define _(args) args +#else +# define _(args) () +#endif + +#ifdef RUBY_PLATFORM +#include "defines.h" +#undef xmalloc +#undef xrealloc +#undef xcalloc +#undef xfree + +# define RUBY +extern int rb_prohibit_interrupt; +extern int rb_trap_pending; +void rb_trap_exec _((void)); + +# define CHECK_INTS do {\ + if (!rb_prohibit_interrupt) {\ + if (rb_trap_pending) rb_trap_exec();\ + }\ +} while (0) +#endif + +/* Make alloca work the best possible way. */ +#ifdef __GNUC__ +# ifndef atarist +# ifndef alloca +# define alloca __builtin_alloca +# endif +# endif /* atarist */ +#else +# ifdef HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +void *alloca (); +# endif +# endif /* AIX */ +# endif /* HAVE_ALLOCA_H */ + +#endif /* __GNUC__ */ + +#ifdef HAVE_STRING_H +# include <string.h> +#else +# include <strings.h> +#endif + +#define xmalloc malloc +#define xrealloc realloc +#define xcalloc calloc +#define xfree free + +#ifdef C_ALLOCA +#define FREE_VARIABLES() alloca(0) +#else +#define FREE_VARIABLES() +#endif + +#define FREE_AND_RETURN_VOID(stackb) do { \ + FREE_VARIABLES(); \ + if (stackb != stacka) xfree(stackb); \ + return; \ +} while(0) + +#define FREE_AND_RETURN(stackb,val) do { \ + FREE_VARIABLES(); \ + if (stackb != stacka) xfree(stackb); \ + return(val); \ +} while(0) + +#define DOUBLE_STACK(type) do { \ + type *stackx; \ + unsigned int xlen = stacke - stackb; \ + if (stackb == stacka) { \ + stackx = (type*)xmalloc(2 * xlen * sizeof(type)); \ + if (!stackx) goto memory_exhausted; \ + memcpy(stackx, stackb, xlen * sizeof (type)); \ + } \ + else { \ + stackx = (type*)xrealloc(stackb, 2 * xlen * sizeof(type)); \ + if (!stackx) goto memory_exhausted; \ + } \ + /* Rearrange the pointers. */ \ + stackp = stackx + (stackp - stackb); \ + stackb = stackx; \ + stacke = stackb + 2 * xlen; \ +} while (0) + +#define RE_TALLOC(n,t) ((t*)alloca((n)*sizeof(t))) +#define TMALLOC(n,t) ((t*)xmalloc((n)*sizeof(t))) +#define TREALLOC(s,n,t) (s=((t*)xrealloc(s,(n)*sizeof(t)))) + +#define EXPAND_FAIL_STACK() DOUBLE_STACK(unsigned char*) +#define ENSURE_FAIL_STACK(n) \ + do { \ + if (stacke - stackp <= (n)) { \ + /* if (len > re_max_failures * MAX_NUM_FAILURE_ITEMS) \ + { \ + FREE_AND_RETURN(stackb,(-2)); \ + }*/ \ + \ + /* Roughly double the size of the stack. */ \ + EXPAND_FAIL_STACK(); \ + } \ + } while (0) + +/* Get the interface, including the syntax bits. */ +#include "regex.h" + +/* Subroutines for re_compile_pattern. */ +static void store_jump _((char*, int, char*)); +static void insert_jump _((int, char*, char*, char*)); +static void store_jump_n _((char*, int, char*, unsigned)); +static void insert_jump_n _((int, char*, char*, char*, unsigned)); +static void insert_op _((int, char*, char*)); +static void insert_op_2 _((int, char*, char*, int, int)); +static int memcmp_translate _((unsigned char*, unsigned char*, int)); + +/* Define the syntax stuff, so we can do the \<, \>, etc. */ + +/* This must be nonzero for the wordchar and notwordchar pattern + commands in re_match. */ +#define Sword 1 +#define Sword2 2 + +#define SYNTAX(c) re_syntax_table[c] + +static char re_syntax_table[256]; +static void init_syntax_once _((void)); +static const unsigned char *translate = 0; +static void init_regs _((struct re_registers*, unsigned int)); +static void bm_init_skip _((int *, unsigned char*, int, const unsigned char*)); +static int current_mbctype = MBCTYPE_ASCII; + +#undef P + +#ifdef RUBY +#include "util.h" +void rb_warn _((const char*, ...)); +# define re_warning(x) rb_warn(x) +#endif + +#ifndef re_warning +# define re_warning(x) +#endif + +static void +init_syntax_once() +{ + register int c; + static int done = 0; + + if (done) + return; + + memset(re_syntax_table, 0, sizeof re_syntax_table); + + for (c=0; c<=0x7f; c++) + if (isalnum(c)) + re_syntax_table[c] = Sword; + re_syntax_table['_'] = Sword; + + for (c=0x80; c<=0xff; c++) + if (isalnum(c)) + re_syntax_table[c] = Sword2; + done = 1; +} + +void +re_set_casetable(table) + const char *table; +{ + translate = (const unsigned char*)table; +} + +/* Jim Meyering writes: + + "... Some ctype macros are valid only for character codes that + isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when + using /bin/cc or gcc but without giving an ansi option). So, all + ctype uses should be through macros like ISPRINT... If + STDC_HEADERS is defined, then autoconf has verified that the ctype + macros don't need to be guarded with references to isascii. ... + Defining isascii to 1 should let any compiler worth its salt + eliminate the && through constant folding." + Solaris defines some of these symbols so we must undefine them first. */ + +#undef ISASCII +#if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) +# define ISASCII(c) 1 +#else +# define ISASCII(c) isascii(c) +#endif + +#ifdef isblank +# define ISBLANK(c) (ISASCII(c) && isblank(c)) +#else +# define ISBLANK(c) ((c) == ' ' || (c) == '\t') +#endif +#ifdef isgraph +# define ISGRAPH(c) (ISASCII(c) && isgraph(c)) +#else +# define ISGRAPH(c) (ISASCII(c) && isprint(c) && !isspace(c)) +#endif + +#undef ISPRINT +#define ISPRINT(c) (ISASCII(c) && isprint(c)) +#define ISDIGIT(c) (ISASCII(c) && isdigit(c)) +#define ISALNUM(c) (ISASCII(c) && isalnum(c)) +#define ISALPHA(c) (ISASCII(c) && isalpha(c)) +#define ISCNTRL(c) (ISASCII(c) && iscntrl(c)) +#define ISLOWER(c) (ISASCII(c) && islower(c)) +#define ISPUNCT(c) (ISASCII(c) && ispunct(c)) +#define ISSPACE(c) (ISASCII(c) && isspace(c)) +#define ISUPPER(c) (ISASCII(c) && isupper(c)) +#define ISXDIGIT(c) (ISASCII(c) && isxdigit(c)) + +#ifndef NULL +# define NULL (void *)0 +#endif + +/* We remove any previous definition of `SIGN_EXTEND_CHAR', + since ours (we hope) works properly with all combinations of + machines, compilers, `char' and `unsigned char' argument types. + (Per Bothner suggested the basic approach.) */ +#undef SIGN_EXTEND_CHAR +#if __STDC__ +# define SIGN_EXTEND_CHAR(c) ((signed char)(c)) +#else /* not __STDC__ */ +/* As in Harbison and Steele. */ +# define SIGN_EXTEND_CHAR(c) ((((unsigned char)(c)) ^ 128) - 128) +#endif + +/* These are the command codes that appear in compiled regular + expressions, one per byte. Some command codes are followed by + argument bytes. A command code can specify any interpretation + whatsoever for its arguments. Zero-bytes may appear in the compiled + regular expression. + + The value of `exactn' is needed in search.c (search_buffer) in emacs. + So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of + `exactn' we use here must also be 1. */ + +enum regexpcode + { + unused=0, + exactn=1, /* Followed by one byte giving n, then by n literal bytes. */ + begline, /* Fail unless at beginning of line. */ + endline, /* Fail unless at end of line. */ + begbuf, /* Succeeds if at beginning of buffer (if emacs) or at beginning + of string to be matched (if not). */ + endbuf, /* Analogously, for end of buffer/string. */ + endbuf2, /* End of buffer/string, or newline just before it. */ + begpos, /* Matches where last scan//gsub left off. */ + jump, /* Followed by two bytes giving relative address to jump to. */ + jump_past_alt,/* Same as jump, but marks the end of an alternative. */ + on_failure_jump, /* Followed by two bytes giving relative address of + place to resume at in case of failure. */ + finalize_jump, /* Throw away latest failure point and then jump to + address. */ + maybe_finalize_jump, /* Like jump but finalize if safe to do so. + This is used to jump back to the beginning + of a repeat. If the command that follows + this jump is clearly incompatible with the + one at the beginning of the repeat, such that + we can be sure that there is no use backtracking + out of repetitions already completed, + then we finalize. */ + dummy_failure_jump, /* Jump, and push a dummy failure point. This + failure point will be thrown away if an attempt + is made to use it for a failure. A + construct + makes this before the first repeat. Also + use it as an intermediary kind of jump when + compiling an or construct. */ + push_dummy_failure, /* Push a dummy failure point and continue. Used at the end of + alternatives. */ + succeed_n, /* Used like on_failure_jump except has to succeed n times; + then gets turned into an on_failure_jump. The relative + address following it is useless until then. The + address is followed by two bytes containing n. */ + jump_n, /* Similar to jump, but jump n times only; also the relative + address following is in turn followed by yet two more bytes + containing n. */ + try_next, /* Jump to next pattern for the first time, + leaving this pattern on the failure stack. */ + finalize_push, /* Finalize stack and push the beginning of the pattern + on the stack to retry (used for non-greedy match) */ + finalize_push_n, /* Similar to finalize_push, buf finalize n time only */ + set_number_at, /* Set the following relative location to the + subsequent number. */ + anychar, /* Matches any (more or less) one character excluding newlines. */ + anychar_repeat, /* Matches sequence of characters excluding newlines. */ + charset, /* Matches any one char belonging to specified set. + First following byte is number of bitmap bytes. + Then come bytes for a bitmap saying which chars are in. + Bits in each byte are ordered low-bit-first. + A character is in the set if its bit is 1. + A character too large to have a bit in the map + is automatically not in the set. */ + charset_not, /* Same parameters as charset, but match any character + that is not one of those specified. */ + start_memory, /* Start remembering the text that is matched, for + storing in a memory register. Followed by one + byte containing the register number. Register numbers + must be in the range 0 through RE_NREGS. */ + stop_memory, /* Stop remembering the text that is matched + and store it in a memory register. Followed by + one byte containing the register number. Register + numbers must be in the range 0 through RE_NREGS. */ + start_paren, /* Place holder at the start of (?:..). */ + stop_paren, /* Place holder at the end of (?:..). */ + casefold_on, /* Turn on casefold flag. */ + casefold_off, /* Turn off casefold flag. */ + option_set, /* Turn on multi line match (match with newlines). */ + start_nowidth, /* Save string point to the stack. */ + stop_nowidth, /* Restore string place at the point start_nowidth. */ + pop_and_fail, /* Fail after popping nowidth entry from stack. */ + stop_backtrack, /* Restore backtrack stack at the point start_nowidth. */ + duplicate, /* Match a duplicate of something remembered. + Followed by one byte containing the index of the memory + register. */ + wordchar, /* Matches any word-constituent character. */ + notwordchar, /* Matches any char that is not a word-constituent. */ + wordbeg, /* Succeeds if at word beginning. */ + wordend, /* Succeeds if at word end. */ + wordbound, /* Succeeds if at a word boundary. */ + notwordbound /* Succeeds if not at a word boundary. */ + }; + + +/* Number of failure points to allocate space for initially, + when matching. If this number is exceeded, more space is allocated, + so it is not a hard limit. */ + +#ifndef NFAILURES +#define NFAILURES 160 +#endif + +/* Store NUMBER in two contiguous bytes starting at DESTINATION. */ +#define STORE_NUMBER(destination, number) \ + do { (destination)[0] = (number) & 0377; \ + (destination)[1] = (number) >> 8; } while (0) + +/* Same as STORE_NUMBER, except increment the destination pointer to + the byte after where the number is stored. Watch out that values for + DESTINATION such as p + 1 won't work, whereas p will. */ +#define STORE_NUMBER_AND_INCR(destination, number) \ + do { STORE_NUMBER(destination, number); \ + (destination) += 2; } while (0) + + +/* Put into DESTINATION a number stored in two contingous bytes starting + at SOURCE. */ +#define EXTRACT_NUMBER(destination, source) \ + do { (destination) = *(source) & 0377; \ + (destination) += SIGN_EXTEND_CHAR(*(char*)((source) + 1)) << 8; } while (0) + +/* Same as EXTRACT_NUMBER, except increment the pointer for source to + point to second byte of SOURCE. Note that SOURCE has to be a value + such as p, not, e.g., p + 1. */ +#define EXTRACT_NUMBER_AND_INCR(destination, source) \ + do { EXTRACT_NUMBER(destination, source); \ + (source) += 2; } while (0) + + +/* Specify the precise syntax of regexps for compilation. This provides + for compatibility for various utilities which historically have + different, incompatible syntaxes. + + The argument SYNTAX is a bit-mask comprised of the various bits + defined in regex.h. */ + +long +re_set_syntax(syntax) + long syntax; +{ + /* obsolete */ + return 0; +} + +/* Macros for re_compile_pattern, which is found below these definitions. */ + +#define TRANSLATE_P() ((options&RE_OPTION_IGNORECASE) && translate) +#define MAY_TRANSLATE() ((bufp->options&(RE_OPTION_IGNORECASE|RE_MAY_IGNORECASE)) && translate) +/* Fetch the next character in the uncompiled pattern---translating it + if necessary. Also cast from a signed character in the constant + string passed to us by the user to an unsigned char that we can use + as an array index (in, e.g., `translate'). */ +#define PATFETCH(c) \ + do {if (p == pend) goto end_of_pattern; \ + c = (unsigned char) *p++; \ + if (TRANSLATE_P()) c = (unsigned char)translate[c]; \ + } while (0) + +/* Fetch the next character in the uncompiled pattern, with no + translation. */ +#define PATFETCH_RAW(c) \ + do {if (p == pend) goto end_of_pattern; \ + c = (unsigned char)*p++; \ + } while (0) + +/* Go backwards one character in the pattern. */ +#define PATUNFETCH p-- + +#define MBC2WC(c, p) \ + do { \ + if (current_mbctype == MBCTYPE_UTF8) { \ + int n = mbclen(c) - 1; \ + c &= (1<<(BYTEWIDTH-2-n)) - 1; \ + while (n--) { \ + c = c << 6 | (*p++ & ((1<<6)-1)); \ + } \ + } \ + else { \ + c <<= 8; \ + c |= (unsigned char)*(p)++; \ + } \ + } while (0) + +#define PATFETCH_MBC(c) \ + do { \ + if (p + mbclen(c) - 1 >= pend) goto end_of_pattern; \ + MBC2WC(c, p); \ + } while(0) + +#define WC2MBC1ST(c) \ + ((current_mbctype != MBCTYPE_UTF8) ? ((c<0x100) ? (c) : (((c)>>8)&0xff)) : utf8_firstbyte(c)) + +typedef unsigned int (*mbc_startpos_func_t) _((const char *string, unsigned int pos)); + +static unsigned int asc_startpos _((const char *string, unsigned int pos)); +static unsigned int euc_startpos _((const char *string, unsigned int pos)); +static unsigned int sjis_startpos _((const char *string, unsigned int pos)); +static unsigned int utf8_startpos _((const char *string, unsigned int pos)); + +static const mbc_startpos_func_t mbc_startpos_func[4] = { + asc_startpos, euc_startpos, sjis_startpos, utf8_startpos +}; + +#define mbc_startpos(start, pos) (*mbc_startpos_func[current_mbctype])((start), (pos)) + +static unsigned int +utf8_firstbyte(c) + unsigned long c; +{ + if (c < 0x80) return c; + if (c <= 0x7ff) return ((c>>6)&0xff)|0xc0; + if (c <= 0xffff) return ((c>>12)&0xff)|0xe0; + if (c <= 0x1fffff) return ((c>>18)&0xff)|0xf0; + if (c <= 0x3ffffff) return ((c>>24)&0xff)|0xf8; + if (c <= 0x7fffffff) return ((c>>30)&0xff)|0xfc; +#if SIZEOF_INT > 4 + if (c <= 0xfffffffff) return 0xfe; +#else + return 0xfe; +#endif +} + +static void +print_mbc(c) + unsigned int c; +{ + if (current_mbctype == MBCTYPE_UTF8) { + if (c < 0x80) + printf("%c", (int)c); + else if (c <= 0x7ff) + printf("%c%c", (int)utf8_firstbyte(c), (int)(c & 0x3f)); + else if (c <= 0xffff) + printf("%c%c%c", (int)utf8_firstbyte(c), (int)((c >> 6) & 0x3f), + (int)(c & 0x3f)); + else if (c <= 0x1fffff) + printf("%c%c%c%c", (int)utf8_firstbyte(c), (int)((c >> 12) & 0x3f), + (int)((c >> 6) & 0x3f), (int)(c & 0x3f)); + else if (c <= 0x3ffffff) + printf("%c%c%c%c%c", (int)utf8_firstbyte(c), (int)((c >> 18) & 0x3f), + (int)((c >> 12) & 0x3f), (int)((c >> 6) & 0x3f), (int)(c & 0x3f)); + else if (c <= 0x7fffffff) + printf("%c%c%c%c%c%c", (int)utf8_firstbyte(c), (int)((c >> 24) & 0x3f), + (int)((c >> 18) & 0x3f), (int)((c >> 12) & 0x3f), + (int)((c >> 6) & 0x3f), (int)(c & 0x3f)); + } + else if (c < 0xff) { + printf("\\%o", (int)c); + } + else { + printf("%c%c", (int)(c >> BYTEWIDTH), (int)(c &0xff)); + } +} + +/* If the buffer isn't allocated when it comes in, use this. */ +#define INIT_BUF_SIZE 28 + +/* Make sure we have at least N more bytes of space in buffer. */ +#define GET_BUFFER_SPACE(n) \ + do { \ + while (b - bufp->buffer + (n) >= bufp->allocated) \ + EXTEND_BUFFER; \ + } while (0) + +/* Make sure we have one more byte of buffer space and then add CH to it. */ +#define BUFPUSH(ch) \ + do { \ + GET_BUFFER_SPACE(1); \ + *b++ = (char)(ch); \ + } while (0) + +/* Extend the buffer by twice its current size via reallociation and + reset the pointers that pointed into the old allocation to point to + the correct places in the new allocation. If extending the buffer + results in it being larger than 1 << 16, then flag memory exhausted. */ +#define EXTEND_BUFFER \ + do { char *old_buffer = bufp->buffer; \ + if (bufp->allocated == (1L<<16)) goto too_big; \ + bufp->allocated *= 2; \ + if (bufp->allocated > (1L<<16)) bufp->allocated = (1L<<16); \ + bufp->buffer = (char*)xrealloc(bufp->buffer, bufp->allocated); \ + if (bufp->buffer == 0) \ + goto memory_exhausted; \ + b = (b - old_buffer) + bufp->buffer; \ + if (fixup_alt_jump) \ + fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer; \ + if (laststart) \ + laststart = (laststart - old_buffer) + bufp->buffer; \ + begalt = (begalt - old_buffer) + bufp->buffer; \ + if (pending_exact) \ + pending_exact = (pending_exact - old_buffer) + bufp->buffer; \ + } while (0) + + +/* Set the bit for character C in a character set list. */ +#define SET_LIST_BIT(c) \ + (b[(unsigned char)(c) / BYTEWIDTH] \ + |= 1 << ((unsigned char)(c) % BYTEWIDTH)) + +/* Get the next unsigned number in the uncompiled pattern. */ +#define GET_UNSIGNED_NUMBER(num) \ + do { if (p != pend) { \ + PATFETCH(c); \ + while (ISDIGIT(c)) { \ + if (num < 0) \ + num = 0; \ + num = num * 10 + c - '0'; \ + if (p == pend) \ + break; \ + PATFETCH(c); \ + } \ + } \ + } while (0) + +#define STREQ(s1, s2) ((strcmp(s1, s2) == 0)) + +#define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ + +#define IS_CHAR_CLASS(string) \ + (STREQ(string, "alpha") || STREQ(string, "upper") \ + || STREQ(string, "lower") || STREQ(string, "digit") \ + || STREQ(string, "alnum") || STREQ(string, "xdigit") \ + || STREQ(string, "space") || STREQ(string, "print") \ + || STREQ(string, "punct") || STREQ(string, "graph") \ + || STREQ(string, "cntrl") || STREQ(string, "blank")) + +#define STORE_MBC(p, c) \ + do { \ + (p)[0] = (unsigned char)(((c) >>24) & 0xff); \ + (p)[1] = (unsigned char)(((c) >>16) & 0xff); \ + (p)[2] = (unsigned char)(((c) >> 8) & 0xff); \ + (p)[3] = (unsigned char)(((c) >> 0) & 0xff); \ + } while (0) + +#define STORE_MBC_AND_INCR(p, c) \ + do { \ + *(p)++ = (unsigned char)(((c) >>24) & 0xff); \ + *(p)++ = (unsigned char)(((c) >>16) & 0xff); \ + *(p)++ = (unsigned char)(((c) >> 8) & 0xff); \ + *(p)++ = (unsigned char)(((c) >> 0) & 0xff); \ + } while (0) + +#define EXTRACT_MBC(p) \ + ((unsigned int)((unsigned char)(p)[0] << 24 | \ + (unsigned char)(p)[1] << 16 | \ + (unsigned char)(p)[2] << 8 | \ + (unsigned char)(p)[3])) + +#define EXTRACT_MBC_AND_INCR(p) \ + ((unsigned int)((p) += 4, \ + (unsigned char)(p)[-4] << 24 | \ + (unsigned char)(p)[-3] << 16 | \ + (unsigned char)(p)[-2] << 8 | \ + (unsigned char)(p)[-1])) + +#define EXTRACT_UNSIGNED(p) \ + ((unsigned char)(p)[0] | (unsigned char)(p)[1] << 8) +#define EXTRACT_UNSIGNED_AND_INCR(p) \ + ((p) += 2, (unsigned char)(p)[-2] | (unsigned char)(p)[-1] << 8) + +/* Handle (mb)?charset(_not)?. + + Structure of mbcharset(_not)? in compiled pattern. + + struct { + unsinged char id; mbcharset(_not)? + unsigned char sbc_size; + unsigned char sbc_map[sbc_size]; same as charset(_not)? up to here. + unsigned short mbc_size; number of intervals. + struct { + unsigned long beg; beginning of interval. + unsigned long end; end of interval. + } intervals[mbc_size]; + }; */ + +static void +set_list_bits(c1, c2, b) + unsigned long c1, c2; + unsigned char *b; +{ + unsigned char sbc_size = b[-1]; + unsigned short mbc_size = EXTRACT_UNSIGNED(&b[sbc_size]); + unsigned short beg, end, upb; + + if (c1 > c2) + return; + b = &b[sbc_size + 2]; + + for (beg = 0, upb = mbc_size; beg < upb; ) { + unsigned short mid = (unsigned short)(beg + upb) >> 1; + + if ((int)c1 - 1 > (int)EXTRACT_MBC(&b[mid*8+4])) + beg = mid + 1; + else + upb = mid; + } + + for (end = beg, upb = mbc_size; end < upb; ) { + unsigned short mid = (unsigned short)(end + upb) >> 1; + + if ((int)c2 >= (int)EXTRACT_MBC(&b[mid*8]) - 1) + end = mid + 1; + else + upb = mid; + } + + if (beg != end) { + if (c1 > EXTRACT_MBC(&b[beg*8])) + c1 = EXTRACT_MBC(&b[beg*8]); + if (c2 < EXTRACT_MBC(&b[(end - 1)*8+4])) + c2 = EXTRACT_MBC(&b[(end - 1)*8+4]); + } + if (end < mbc_size && end != beg + 1) + /* NOTE: memcpy() would not work here. */ + memmove(&b[(beg + 1)*8], &b[end*8], (mbc_size - end)*8); + STORE_MBC(&b[beg*8 + 0], c1); + STORE_MBC(&b[beg*8 + 4], c2); + mbc_size += beg - end + 1; + STORE_NUMBER(&b[-2], mbc_size); +} + +static int +is_in_list_sbc(c, b) + unsigned long c; + const unsigned char *b; +{ + unsigned short size; + + size = *b++; + return ((int)c / BYTEWIDTH < (int)size && b[c / BYTEWIDTH] & 1 << c % BYTEWIDTH); +} + +static int +is_in_list_mbc(c, b) + unsigned long c; + const unsigned char *b; +{ + unsigned short size; + unsigned short i, j; + + size = *b++; + b += size + 2; + size = EXTRACT_UNSIGNED(&b[-2]); + if (size == 0) return 0; + + for (i = 0, j = size; i < j; ) { + unsigned short k = (unsigned short)(i + j) >> 1; + + if (c > EXTRACT_MBC(&b[k*8+4])) + i = k + 1; + else + j = k; + } + if (i < size && EXTRACT_MBC(&b[i*8]) <= c) + return 1; + + return 0; +} + +static int +is_in_list(c, b) + unsigned long c; + const unsigned char *b; +{ + return is_in_list_sbc(c, b) || (current_mbctype ? is_in_list_mbc(c, b) : 0); +} + +static void +print_partial_compiled_pattern(start, end) + unsigned char *start; + unsigned char *end; +{ + int mcnt, mcnt2; + unsigned char *p = start; + unsigned char *pend = end; + + if (start == NULL) { + printf("(null)\n"); + return; + } + + /* Loop over pattern commands. */ + while (p < pend) { + switch ((enum regexpcode)*p++) { + case unused: + printf("/unused"); + break; + + case exactn: + mcnt = *p++; + printf("/exactn/%d", mcnt); + do { + putchar('/'); + printf("%c", *p++); + } + while (--mcnt); + break; + + case start_memory: + mcnt = *p++; + printf("/start_memory/%d/%d", mcnt, *p++); + break; + + case stop_memory: + mcnt = *p++; + printf("/stop_memory/%d/%d", mcnt, *p++); + break; + + case start_paren: + printf("/start_paren"); + break; + + case stop_paren: + printf("/stop_paren"); + break; + + case casefold_on: + printf("/casefold_on"); + break; + + case casefold_off: + printf("/casefold_off"); + break; + + case option_set: + printf("/option_set/%d", *p++); + break; + + case start_nowidth: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + printf("/start_nowidth//%d", mcnt); + break; + + case stop_nowidth: + printf("/stop_nowidth//"); + p += 2; + break; + + case pop_and_fail: + printf("/pop_and_fail"); + break; + + case stop_backtrack: + printf("/stop_backtrack//"); + p += 2; + break; + + case duplicate: + printf("/duplicate/%d", *p++); + break; + + case anychar: + printf("/anychar"); + break; + + case anychar_repeat: + printf("/anychar_repeat"); + break; + + case charset: + case charset_not: + { + register int c; + + printf("/charset%s", + (enum regexpcode)*(p - 1) == charset_not ? "_not" : ""); + + mcnt = *p++; + printf("/%d", mcnt); + for (c = 0; c < mcnt; c++) { + unsigned bit; + unsigned char map_byte = p[c]; + + putchar('/'); + + for (bit = 0; bit < BYTEWIDTH; bit++) + if (map_byte & (1 << bit)) + printf("%c", c * BYTEWIDTH + bit); + } + p += mcnt; + mcnt = EXTRACT_UNSIGNED_AND_INCR(p); + putchar('/'); + while (mcnt--) { + print_mbc(EXTRACT_MBC_AND_INCR(p)); + putchar('-'); + print_mbc(EXTRACT_MBC_AND_INCR(p)); + } + break; + } + + case begline: + printf("/begline"); + break; + + case endline: + printf("/endline"); + break; + + case on_failure_jump: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + printf("/on_failure_jump//%d", mcnt); + break; + + case dummy_failure_jump: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + printf("/dummy_failure_jump//%d", mcnt); + break; + + case push_dummy_failure: + printf("/push_dummy_failure"); + break; + + case finalize_jump: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + printf("/finalize_jump//%d", mcnt); + break; + + case maybe_finalize_jump: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + printf("/maybe_finalize_jump//%d", mcnt); + break; + + case jump_past_alt: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + printf("/jump_past_alt//%d", mcnt); + break; + + case jump: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + printf("/jump//%d", mcnt); + break; + + case succeed_n: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + EXTRACT_NUMBER_AND_INCR(mcnt2, p); + printf("/succeed_n//%d//%d", mcnt, mcnt2); + break; + + case jump_n: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + EXTRACT_NUMBER_AND_INCR(mcnt2, p); + printf("/jump_n//%d//%d", mcnt, mcnt2); + break; + + case set_number_at: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + EXTRACT_NUMBER_AND_INCR(mcnt2, p); + printf("/set_number_at//%d//%d", mcnt, mcnt2); + break; + + case try_next: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + printf("/try_next//%d", mcnt); + break; + + case finalize_push: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + printf("/finalize_push//%d", mcnt); + break; + + case finalize_push_n: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + EXTRACT_NUMBER_AND_INCR(mcnt2, p); + printf("/finalize_push_n//%d//%d", mcnt, mcnt2); + break; + + case wordbound: + printf("/wordbound"); + break; + + case notwordbound: + printf("/notwordbound"); + break; + + case wordbeg: + printf("/wordbeg"); + break; + + case wordend: + printf("/wordend"); + + case wordchar: + printf("/wordchar"); + break; + + case notwordchar: + printf("/notwordchar"); + break; + + case begbuf: + printf("/begbuf"); + break; + + case endbuf: + printf("/endbuf"); + break; + + case endbuf2: + printf("/endbuf2"); + break; + + case begpos: + printf("/begpos"); + break; + + default: + printf("?%d", *(p-1)); + } + } + printf("/\n"); +} + + +static void +print_compiled_pattern(bufp) + struct re_pattern_buffer *bufp; +{ + unsigned char *buffer = (unsigned char*)bufp->buffer; + + print_partial_compiled_pattern(buffer, buffer + bufp->used); +} + +static char* +calculate_must_string(start, end) + char *start; + char *end; +{ + int mcnt; + int max = 0; + unsigned char *p = (unsigned char *)start; + unsigned char *pend = (unsigned char *)end; + char *must = 0; + + if (start == NULL) return 0; + + /* Loop over pattern commands. */ + while (p < pend) { + switch ((enum regexpcode)*p++) { + case unused: + break; + + case exactn: + mcnt = *p; + if (mcnt > max) { + must = (char *)p; + max = mcnt; + } + p += mcnt+1; + break; + + case start_memory: + case stop_memory: + p += 2; + break; + + case duplicate: + case option_set: + p++; + break; + + case casefold_on: + case casefold_off: + return 0; /* should not check must_string */ + + case pop_and_fail: + case anychar: + case anychar_repeat: + case begline: + case endline: + case wordbound: + case notwordbound: + case wordbeg: + case wordend: + case wordchar: + case notwordchar: + case begbuf: + case endbuf: + case endbuf2: + case begpos: + case push_dummy_failure: + case start_paren: + case stop_paren: + break; + + case charset: + case charset_not: + mcnt = *p++; + p += mcnt; + mcnt = EXTRACT_UNSIGNED_AND_INCR(p); + while (mcnt--) { + p += 8; + } + break; + + case on_failure_jump: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + if (mcnt > 0) p += mcnt; + if ((enum regexpcode)p[-3] == jump) { + p -= 2; + EXTRACT_NUMBER_AND_INCR(mcnt, p); + if (mcnt > 0) p += mcnt; + } + break; + + case dummy_failure_jump: + case succeed_n: + case try_next: + case jump: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + if (mcnt > 0) p += mcnt; + break; + + case start_nowidth: + case stop_nowidth: + case stop_backtrack: + case finalize_jump: + case maybe_finalize_jump: + case finalize_push: + p += 2; + break; + + case jump_n: + case set_number_at: + case finalize_push_n: + p += 4; + break; + + default: + break; + } + } + return must; +} + +static unsigned int +read_backslash(c) + int c; +{ + switch (c) { + case 'n': + return '\n'; + + case 't': + return '\t'; + + case 'r': + return '\r'; + + case 'f': + return '\f'; + + case 'v': + return '\v'; + + case 'a': + return '\007'; + + case 'b': + return '\010'; + + case 'e': + return '\033'; + } + return c; +} + +static unsigned int +read_special(p, pend, pp) + const char *p, *pend, **pp; +{ + int c; + + PATFETCH_RAW(c); + switch (c) { + case 'M': + PATFETCH_RAW(c); + if (c != '-') return -1; + PATFETCH_RAW(c); + *pp = p; + if (c == '\\') { + return read_special(--p, pend, pp) | 0x80; + } + else if (c == -1) return ~0; + else { + return ((c & 0xff) | 0x80); + } + + case 'C': + PATFETCH_RAW(c); + if (c != '-') return ~0; + case 'c': + PATFETCH_RAW(c); + *pp = p; + if (c == '\\') { + c = read_special(--p, pend, pp); + } + else if (c == '?') return 0177; + else if (c == -1) return ~0; + return c & 0x9f; + default: + *pp = p + 1; + return read_backslash(c); + } + + end_of_pattern: + return ~0; +} + +/* re_compile_pattern takes a regular-expression string + and converts it into a buffer full of byte commands for matching. + + PATTERN is the address of the pattern string + SIZE is the length of it. + BUFP is a struct re_pattern_buffer * which points to the info + on where to store the byte commands. + This structure contains a char * which points to the + actual space, which should have been obtained with malloc. + re_compile_pattern may use realloc to grow the buffer space. + + The number of bytes of commands can be found out by looking in + the `struct re_pattern_buffer' that bufp pointed to, after + re_compile_pattern returns. */ + +char * +re_compile_pattern(pattern, size, bufp) + const char *pattern; + int size; + struct re_pattern_buffer *bufp; +{ + register char *b = bufp->buffer; + register const char *p = pattern; + const char *nextp; + const char *pend = pattern + size; + register unsigned int c, c1 = 0; + const char *p0; + int numlen; +#define ERROR_MSG_MAX_SIZE 200 + static char error_msg[ERROR_MSG_MAX_SIZE+1]; + + /* Address of the count-byte of the most recently inserted `exactn' + command. This makes it possible to tell whether a new exact-match + character can be added to that command or requires a new `exactn' + command. */ + + char *pending_exact = 0; + + /* Address of the place where a forward-jump should go to the end of + the containing expression. Each alternative of an `or', except the + last, ends with a forward-jump of this sort. */ + + char *fixup_alt_jump = 0; + + /* Address of start of the most recently finished expression. + This tells postfix * where to find the start of its operand. */ + + char *laststart = 0; + + /* In processing a repeat, 1 means zero matches is allowed. */ + + char zero_times_ok; + + /* In processing a repeat, 1 means many matches is allowed. */ + + char many_times_ok; + + /* In processing a repeat, 1 means non-greedy matches. */ + + char greedy; + + /* Address of beginning of regexp, or inside of last (. */ + + char *begalt = b; + + /* Place in the uncompiled pattern (i.e., the {) to + which to go back if the interval is invalid. */ + const char *beg_interval; + + /* In processing an interval, at least this many matches must be made. */ + int lower_bound; + + /* In processing an interval, at most this many matches can be made. */ + int upper_bound; + + /* Stack of information saved by ( and restored by ). + Five stack elements are pushed by each (: + First, the value of b. + Second, the value of fixup_alt_jump. + Third, the value of begalt. + Fourth, the value of regnum. + Fifth, the type of the paren. */ + + int stacka[40]; + int *stackb = stacka; + int *stackp = stackb; + int *stacke = stackb + 40; + + /* Counts ('s as they are encountered. Remembered for the matching ), + where it becomes the register number to put in the stop_memory + command. */ + + int regnum = 1; + + int range = 0; + int had_mbchar = 0; + int had_num_literal = 0; + int had_char_class = 0; + + int options = bufp->options; + + bufp->fastmap_accurate = 0; + bufp->must = 0; + bufp->must_skip = 0; + + /* Initialize the syntax table. */ + init_syntax_once(); + + if (bufp->allocated == 0) { + bufp->allocated = INIT_BUF_SIZE; + /* EXTEND_BUFFER loses when bufp->allocated is 0. */ + bufp->buffer = (char*)xrealloc(bufp->buffer, INIT_BUF_SIZE); + if (!bufp->buffer) goto memory_exhausted; /* this not happen */ + begalt = b = bufp->buffer; + } + + while (p != pend) { + PATFETCH(c); + + switch (c) { + case '$': + if (bufp->options & RE_OPTION_SINGLELINE) { + BUFPUSH(endbuf); + } + else { + p0 = p; + /* When testing what follows the $, + look past the \-constructs that don't consume anything. */ + + while (p0 != pend) { + if (*p0 == '\\' && p0 + 1 != pend + && (p0[1] == 'b' || p0[1] == 'B')) + p0 += 2; + else + break; + } + BUFPUSH(endline); + } + break; + + case '^': + if (bufp->options & RE_OPTION_SINGLELINE) + BUFPUSH(begbuf); + else + BUFPUSH(begline); + break; + + case '+': + case '?': + case '*': + /* If there is no previous pattern, char not special. */ + if (!laststart) { + snprintf(error_msg, ERROR_MSG_MAX_SIZE, + "invalid regular expression; there's no previous pattern, to which '%c' would define cardinality at %d", + c, p-pattern); + FREE_AND_RETURN(stackb, error_msg); + } + /* If there is a sequence of repetition chars, + collapse it down to just one. */ + zero_times_ok = c != '+'; + many_times_ok = c != '?'; + greedy = 1; + if (p != pend) { + PATFETCH(c); + switch (c) { + case '?': + greedy = 0; + break; + case '*': + case '+': + goto nested_meta; + default: + PATUNFETCH; + break; + } + } + + repeat: + /* Star, etc. applied to an empty pattern is equivalent + to an empty pattern. */ + if (!laststart) + break; + + if (greedy && many_times_ok && *laststart == anychar && b - laststart <= 2) { + if (b[-1] == stop_paren) + b--; + if (zero_times_ok) + *laststart = anychar_repeat; + else { + BUFPUSH(anychar_repeat); + } + break; + } + /* Now we know whether or not zero matches is allowed + and also whether or not two or more matches is allowed. */ + if (many_times_ok) { + /* If more than one repetition is allowed, put in at the + end a backward relative jump from b to before the next + jump we're going to put in below (which jumps from + laststart to after this jump). */ + GET_BUFFER_SPACE(3); + store_jump(b,greedy?maybe_finalize_jump:finalize_push,laststart-3); + b += 3; /* Because store_jump put stuff here. */ + } + + /* On failure, jump from laststart to next pattern, which will be the + end of the buffer after this jump is inserted. */ + GET_BUFFER_SPACE(3); + insert_jump(on_failure_jump, laststart, b + 3, b); + b += 3; + + if (zero_times_ok) { + if (greedy == 0) { + GET_BUFFER_SPACE(3); + insert_jump(try_next, laststart, b + 3, b); + b += 3; + } + } + else { + /* At least one repetition is required, so insert a + `dummy_failure_jump' before the initial + `on_failure_jump' instruction of the loop. This + effects a skip over that instruction the first time + we hit that loop. */ + GET_BUFFER_SPACE(3); + insert_jump(dummy_failure_jump, laststart, laststart + 6, b); + b += 3; + } + break; + + case '.': + laststart = b; + BUFPUSH(anychar); + break; + + case '[': + if (p == pend) + FREE_AND_RETURN(stackb, "invalid regular expression; '[' can't be the last character ie. can't start range at the end of pattern"); + while ((b - bufp->buffer + 9 + (1 << BYTEWIDTH) / BYTEWIDTH) + > bufp->allocated) + EXTEND_BUFFER; + + laststart = b; + if (*p == '^') { + BUFPUSH(charset_not); + p++; + } + else + BUFPUSH(charset); + p0 = p; + + BUFPUSH((1 << BYTEWIDTH) / BYTEWIDTH); + /* Clear the whole map */ + memset(b, 0, (1 << BYTEWIDTH) / BYTEWIDTH + 2); + + had_mbchar = 0; + had_num_literal = 0; + had_char_class = 0; + + /* Read in characters and ranges, setting map bits. */ + for (;;) { + int size; + unsigned last = (unsigned)-1; + + if ((size = EXTRACT_UNSIGNED(&b[(1 << BYTEWIDTH) / BYTEWIDTH])) || current_mbctype) { + /* Ensure the space is enough to hold another interval + of multi-byte chars in charset(_not)?. */ + size = (1 << BYTEWIDTH) / BYTEWIDTH + 2 + size*8 + 8; + while (b + size + 1 > bufp->buffer + bufp->allocated) + EXTEND_BUFFER; + } + range_retry: + if (range && had_char_class) { + FREE_AND_RETURN(stackb, "invalid regular expression; can't use character class as an end value of range"); + } + PATFETCH_RAW(c); + + if (c == ']') { + if (p == p0 + 1) { + if (p == pend) + FREE_AND_RETURN(stackb, "invalid regular expression; empty character class"); + re_warning("character class has `]' without escape"); + } + else + /* Stop if this isn't merely a ] inside a bracket + expression, but rather the end of a bracket + expression. */ + break; + } + /* Look ahead to see if it's a range when the last thing + was a character class. */ + if (had_char_class && c == '-' && *p != ']') + FREE_AND_RETURN(stackb, "invalid regular expression; can't use character class as a start value of range"); + if (ismbchar(c)) { + PATFETCH_MBC(c); + had_mbchar++; + } + had_char_class = 0; + + if (c == '-' && ((p != p0 + 1 && *p != ']') || + (p[0] == '-' && p[1] != ']') || + range)) + re_warning("character class has `-' without escape"); + if (c == '[' && *p != ':') + re_warning("character class has `[' without escape"); + + /* \ escapes characters when inside [...]. */ + if (c == '\\') { + PATFETCH_RAW(c); + switch (c) { + case 'w': + for (c = 0; c < (1 << BYTEWIDTH); c++) { + if (SYNTAX(c) == Sword || + (!current_mbctype && SYNTAX(c) == Sword2)) + SET_LIST_BIT(c); + } + if (current_mbctype) { + set_list_bits(0x80, 0xffffffff, b); + } + had_char_class = 1; + last = -1; + continue; + + case 'W': + for (c = 0; c < (1 << BYTEWIDTH); c++) { + if (SYNTAX(c) != Sword && + ((current_mbctype && !re_mbctab[c]) || + (!current_mbctype && SYNTAX(c) != Sword2))) + SET_LIST_BIT(c); + } + had_char_class = 1; + last = -1; + continue; + + case 's': + for (c = 0; c < 256; c++) + if (ISSPACE(c)) + SET_LIST_BIT(c); + had_char_class = 1; + last = -1; + continue; + + case 'S': + for (c = 0; c < 256; c++) + if (!ISSPACE(c)) + SET_LIST_BIT(c); + if (current_mbctype) + set_list_bits(0x80, 0xffffffff, b); + had_char_class = 1; + last = -1; + continue; + + case 'd': + for (c = '0'; c <= '9'; c++) + SET_LIST_BIT(c); + had_char_class = 1; + last = -1; + continue; + + case 'D': + for (c = 0; c < 256; c++) + if (!ISDIGIT(c)) + SET_LIST_BIT(c); + if (current_mbctype) + set_list_bits(0x80, 0xffffffff, b); + had_char_class = 1; + last = -1; + continue; + + case 'x': + c = scan_hex(p, 2, &numlen); + if (numlen == 0) goto invalid_escape; + p += numlen; + had_num_literal = 1; + break; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + PATUNFETCH; + c = scan_oct(p, 3, &numlen); + p += numlen; + had_num_literal = 1; + break; + + case 'M': + case 'C': + case 'c': + { + const char *pp; + + --p; + c = read_special(p, pend, &pp); + if (c > 255) goto invalid_escape; + p = pp; + had_num_literal = 1; + } + break; + + default: + c = read_backslash(c); + if (ismbchar(c)) { + PATFETCH_MBC(c); + had_mbchar++; + } + break; + } + } + else if (c == '[' && *p == ':') { /* [:...:] */ + /* Leave room for the null. */ + char str[CHAR_CLASS_MAX_LENGTH + 1]; + + PATFETCH_RAW(c); + c1 = 0; + + /* If pattern is `[[:'. */ + if (p == pend) + FREE_AND_RETURN(stackb, "invalid regular expression; re can't end '[[:'"); + + for (;;) { + PATFETCH_RAW(c); + if (c == ':' || c == ']' || p == pend + || c1 == CHAR_CLASS_MAX_LENGTH) + break; + str[c1++] = c; + } + str[c1] = '\0'; + + /* If isn't a word bracketed by `[:' and `:]': + undo the ending character, the letters, and + the leading `:' and `['. */ + if (c == ':' && *p == ']') { + int ch; + char is_alnum = STREQ(str, "alnum"); + char is_alpha = STREQ(str, "alpha"); + char is_blank = STREQ(str, "blank"); + char is_cntrl = STREQ(str, "cntrl"); + char is_digit = STREQ(str, "digit"); + char is_graph = STREQ(str, "graph"); + char is_lower = STREQ(str, "lower"); + char is_print = STREQ(str, "print"); + char is_punct = STREQ(str, "punct"); + char is_space = STREQ(str, "space"); + char is_upper = STREQ(str, "upper"); + char is_xdigit = STREQ(str, "xdigit"); + + if (!IS_CHAR_CLASS(str)){ + snprintf(error_msg, ERROR_MSG_MAX_SIZE, + "invalid regular expression; [:%s:] is not a character class", str); + FREE_AND_RETURN(stackb, error_msg); + } + + /* Throw away the ] at the end of the character class. */ + PATFETCH(c); + + if (p == pend) + FREE_AND_RETURN(stackb, "invalid regular expression; range doesn't have ending ']' after a character class"); + + for (ch = 0; ch < 1 << BYTEWIDTH; ch++) { + if ( (is_alnum && ISALNUM(ch)) + || (is_alpha && ISALPHA(ch)) + || (is_blank && ISBLANK(ch)) + || (is_cntrl && ISCNTRL(ch)) + || (is_digit && ISDIGIT(ch)) + || (is_graph && ISGRAPH(ch)) + || (is_lower && ISLOWER(ch)) + || (is_print && ISPRINT(ch)) + || (is_punct && ISPUNCT(ch)) + || (is_space && ISSPACE(ch)) + || (is_upper && ISUPPER(ch)) + || (is_xdigit && ISXDIGIT(ch))) + SET_LIST_BIT(ch); + } + had_char_class = 1; + continue; + } + else { + c1 += 2; + while (c1--) + PATUNFETCH; + re_warning("character class has `[' without escape"); + c = '['; + } + } + + /* Get a range. */ + if (range) { + if (last > c) + goto invalid_pattern; + + range = 0; + if (had_mbchar == 0) { + if (TRANSLATE_P()) { + for (;last<=c;last++) + SET_LIST_BIT(translate[last]); + } + else { + for (;last<=c;last++) + SET_LIST_BIT(last); + } + } + else if (had_mbchar == 2) { + set_list_bits(last, c, b); + } + else { + /* restriction: range between sbc and mbc */ + goto invalid_pattern; + } + } + else if (p[0] == '-' && p[1] != ']') { + last = c; + PATFETCH_RAW(c1); + range = 1; + goto range_retry; + } + else { + if (TRANSLATE_P() && c < 0x100) c = (unsigned char)translate[c]; + if (had_mbchar == 0 && (!current_mbctype || !had_num_literal)) { + SET_LIST_BIT(c); + had_num_literal = 0; + } + else { + set_list_bits(c, c, b); + } + } + had_mbchar = 0; + } + + /* Discard any character set/class bitmap bytes that are all + 0 at the end of the map. Decrement the map-length byte too. */ + while ((int)b[-1] > 0 && b[b[-1] - 1] == 0) + b[-1]--; + if (b[-1] != (1 << BYTEWIDTH) / BYTEWIDTH) + memmove(&b[(unsigned char)b[-1]], &b[(1 << BYTEWIDTH) / BYTEWIDTH], + 2 + EXTRACT_UNSIGNED(&b[(1 << BYTEWIDTH) / BYTEWIDTH])*8); + b += b[-1] + 2 + EXTRACT_UNSIGNED(&b[(unsigned char)b[-1]])*8; + had_num_literal = 0; + break; + + case '(': + { + int old_options = options; + int push_option = 0; + int casefold = 0; + + PATFETCH(c); + if (c == '?') { + int negative = 0; + + PATFETCH_RAW(c); + switch (c) { + case 'x': case 'm': case 'i': case '-': + for (;;) { + switch (c) { + case '-': + negative = 1; + break; + + case ':': + case ')': + break; + + case 'x': + if (negative) + options &= ~RE_OPTION_EXTENDED; + else + options |= RE_OPTION_EXTENDED; + break; + + case 'm': + if (negative) { + if (options&RE_OPTION_MULTILINE) { + options &= ~RE_OPTION_MULTILINE; + } + } + else if (!(options&RE_OPTION_MULTILINE)) { + options |= RE_OPTION_MULTILINE; + } + push_option = 1; + break; + + case 'i': + if (negative) { + if (options&RE_OPTION_IGNORECASE) { + options &= ~RE_OPTION_IGNORECASE; + } + } + else if (!(options&RE_OPTION_IGNORECASE)) { + options |= RE_OPTION_IGNORECASE; + } + casefold = 1; + break; + + default: + FREE_AND_RETURN(stackb, "undefined (?...) inline option"); + } + if (c == ')') { + c = '#'; /* read whole in-line options */ + break; + } + if (c == ':') break; + PATFETCH_RAW(c); + } + break; + + case '#': + for (;;) { + PATFETCH(c); + if (c == ')') break; + } + c = '#'; + break; + + case ':': + case '=': + case '!': + case '>': + break; + + default: + FREE_AND_RETURN(stackb, "undefined (?...) sequence"); + } + } + else { + PATUNFETCH; + c = '('; + } + if (c == '#') { + if (push_option) { + BUFPUSH(option_set); + BUFPUSH(options); + } + if (casefold) { + if (options & RE_OPTION_IGNORECASE) + BUFPUSH(casefold_on); + else + BUFPUSH(casefold_off); + } + break; + } + if (stackp+8 >= stacke) { + DOUBLE_STACK(int); + } + + /* Laststart should point to the start_memory that we are about + to push (unless the pattern has RE_NREGS or more ('s). */ + /* obsolete: now RE_NREGS is just a default register size. */ + *stackp++ = b - bufp->buffer; + *stackp++ = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0; + *stackp++ = begalt - bufp->buffer; + switch (c) { + case '(': + BUFPUSH(start_memory); + BUFPUSH(regnum); + *stackp++ = regnum++; + *stackp++ = b - bufp->buffer; + BUFPUSH(0); + /* too many ()'s to fit in a byte. (max 254) */ + if (regnum >= RE_REG_MAX) goto too_big; + break; + + case '=': + case '!': + case '>': + BUFPUSH(start_nowidth); + *stackp++ = b - bufp->buffer; + BUFPUSH(0); /* temporary value */ + BUFPUSH(0); + if (c != '!') break; + + BUFPUSH(on_failure_jump); + *stackp++ = b - bufp->buffer; + BUFPUSH(0); /* temporary value */ + BUFPUSH(0); + break; + + case ':': + BUFPUSH(start_paren); + pending_exact = 0; + default: + break; + } + if (push_option) { + BUFPUSH(option_set); + BUFPUSH(options); + } + if (casefold) { + if (options & RE_OPTION_IGNORECASE) + BUFPUSH(casefold_on); + else + BUFPUSH(casefold_off); + } + *stackp++ = c; + *stackp++ = old_options; + fixup_alt_jump = 0; + laststart = 0; + begalt = b; + } + break; + + case ')': + if (stackp == stackb) + FREE_AND_RETURN(stackb, "unmatched )"); + + pending_exact = 0; + if (fixup_alt_jump) { + /* Push a dummy failure point at the end of the + alternative for a possible future + `finalize_jump' to pop. See comments at + `push_dummy_failure' in `re_match'. */ + BUFPUSH(push_dummy_failure); + + /* We allocated space for this jump when we assigned + to `fixup_alt_jump', in the `handle_alt' case below. */ + store_jump(fixup_alt_jump, jump, b); + } + if (options != stackp[-1]) { + if ((options ^ stackp[-1]) & RE_OPTION_IGNORECASE) { + BUFPUSH((options&RE_OPTION_IGNORECASE)?casefold_off:casefold_on); + } + if ((options ^ stackp[-1]) != RE_OPTION_IGNORECASE) { + BUFPUSH(option_set); + BUFPUSH(stackp[-1]); + } + } + p0 = b; + options = *--stackp; + switch (c = *--stackp) { + case '(': + { + char *loc = bufp->buffer + *--stackp; + *loc = regnum - stackp[-1]; + BUFPUSH(stop_memory); + BUFPUSH(stackp[-1]); + BUFPUSH(regnum - stackp[-1]); + stackp--; + } + break; + + case '!': + BUFPUSH(pop_and_fail); + /* back patch */ + STORE_NUMBER(bufp->buffer+stackp[-1], b - bufp->buffer - stackp[-1] - 2); + stackp--; + /* fall through */ + case '=': + BUFPUSH(stop_nowidth); + /* tell stack-pos place to start_nowidth */ + STORE_NUMBER(bufp->buffer+stackp[-1], b - bufp->buffer - stackp[-1] - 2); + BUFPUSH(0); /* space to hold stack pos */ + BUFPUSH(0); + stackp--; + break; + + case '>': + BUFPUSH(stop_backtrack); + /* tell stack-pos place to start_nowidth */ + STORE_NUMBER(bufp->buffer+stackp[-1], b - bufp->buffer - stackp[-1] - 2); + BUFPUSH(0); /* space to hold stack pos */ + BUFPUSH(0); + stackp--; + break; + + case ':': + BUFPUSH(stop_paren); + break; + + default: + break; + } + begalt = *--stackp + bufp->buffer; + stackp--; + fixup_alt_jump = *stackp ? *stackp + bufp->buffer - 1 : 0; + laststart = *--stackp + bufp->buffer; + if (c == '!' || c == '=') laststart = b; + break; + + case '|': + /* Insert before the previous alternative a jump which + jumps to this alternative if the former fails. */ + GET_BUFFER_SPACE(3); + insert_jump(on_failure_jump, begalt, b + 6, b); + pending_exact = 0; + b += 3; + /* The alternative before this one has a jump after it + which gets executed if it gets matched. Adjust that + jump so it will jump to this alternative's analogous + jump (put in below, which in turn will jump to the next + (if any) alternative's such jump, etc.). The last such + jump jumps to the correct final destination. A picture: + _____ _____ + | | | | + | v | v + a | b | c + + If we are at `b', then fixup_alt_jump right now points to a + three-byte space after `a'. We'll put in the jump, set + fixup_alt_jump to right after `b', and leave behind three + bytes which we'll fill in when we get to after `c'. */ + + if (fixup_alt_jump) + store_jump(fixup_alt_jump, jump_past_alt, b); + + /* Mark and leave space for a jump after this alternative, + to be filled in later either by next alternative or + when know we're at the end of a series of alternatives. */ + fixup_alt_jump = b; + GET_BUFFER_SPACE(3); + b += 3; + + laststart = 0; + begalt = b; + break; + + case '{': + /* If there is no previous pattern, this is an invalid pattern. */ + if (!laststart) { + snprintf(error_msg, ERROR_MSG_MAX_SIZE, + "invalid regular expression; there's no previous pattern, to which '{' would define cardinality at %d", + p-pattern); + FREE_AND_RETURN(stackb, error_msg); + } + if( p == pend) + FREE_AND_RETURN(stackb, "invalid regular expression; '{' can't be last character" ); + + beg_interval = p - 1; + + lower_bound = -1; /* So can see if are set. */ + upper_bound = -1; + GET_UNSIGNED_NUMBER(lower_bound); + if (c == ',') { + GET_UNSIGNED_NUMBER(upper_bound); + } + else + /* Interval such as `{1}' => match exactly once. */ + upper_bound = lower_bound; + + if (lower_bound < 0 || c != '}') + goto unfetch_interval; + + if (lower_bound >= RE_DUP_MAX || upper_bound >= RE_DUP_MAX) + FREE_AND_RETURN(stackb, "too big quantifier in {,}"); + if (upper_bound < 0) upper_bound = RE_DUP_MAX; + if (lower_bound > upper_bound) + FREE_AND_RETURN(stackb, "can't do {n,m} with n > m"); + + beg_interval = 0; + pending_exact = 0; + + greedy = 1; + if (p != pend) { + PATFETCH(c); + if (c == '?') greedy = 0; + else PATUNFETCH; + } + + if (lower_bound == 0) { + zero_times_ok = 1; + if (upper_bound == RE_DUP_MAX) { + many_times_ok = 1; + goto repeat; + } + if (upper_bound == 1) { + many_times_ok = 0; + goto repeat; + } + } + if (lower_bound == 1) { + if (upper_bound == 1) { + /* No need to repeat */ + break; + } + if (upper_bound == RE_DUP_MAX) { + many_times_ok = 1; + zero_times_ok = 0; + goto repeat; + } + } + + /* If upper_bound is zero, don't want to succeed at all; + jump from laststart to b + 3, which will be the end of + the buffer after this jump is inserted. */ + + if (upper_bound == 0) { + GET_BUFFER_SPACE(3); + insert_jump(jump, laststart, b + 3, b); + b += 3; + break; + } + + /* If lower_bound == upper_bound, repeat count can be removed */ + if (lower_bound == upper_bound) { + int mcnt; + int skip_stop_paren = 0; + + if (b[-1] == stop_paren) { + skip_stop_paren = 1; + b--; + } + + if (*laststart == exactn && laststart[1]+2 == b - laststart + && laststart[1]*lower_bound < 256) { + mcnt = laststart[1]; + GET_BUFFER_SPACE((lower_bound-1)*mcnt); + laststart[1] = lower_bound*mcnt; + while (--lower_bound) { + memcpy(b, laststart+2, mcnt); + b += mcnt; + } + if (skip_stop_paren) BUFPUSH(stop_paren); + break; + } + + if (lower_bound < 5 && b - laststart < 10) { + /* 5 and 10 are the magic numbers */ + + mcnt = b - laststart; + GET_BUFFER_SPACE((lower_bound-1)*mcnt); + while (--lower_bound) { + memcpy(b, laststart, mcnt); + b += mcnt; + } + if (skip_stop_paren) BUFPUSH(stop_paren); + break; + } + if (skip_stop_paren) b++; /* push back stop_paren */ + } + + /* Otherwise, we have a nontrivial interval. When + we're all done, the pattern will look like: + set_number_at <jump count> <upper bound> + set_number_at <succeed_n count> <lower bound> + succeed_n <after jump addr> <succed_n count> + <body of loop> + jump_n <succeed_n addr> <jump count> + (The upper bound and `jump_n' are omitted if + `upper_bound' is 1, though.) */ + { /* If the upper bound is > 1, we need to insert + more at the end of the loop. */ + unsigned nbytes = upper_bound == 1 ? 10 : 20; + + GET_BUFFER_SPACE(nbytes); + /* Initialize lower bound of the `succeed_n', even + though it will be set during matching by its + attendant `set_number_at' (inserted next), + because `re_compile_fastmap' needs to know. + Jump to the `jump_n' we might insert below. */ + insert_jump_n(succeed_n, laststart, b + (nbytes/2), + b, lower_bound); + b += 5; /* Just increment for the succeed_n here. */ + + /* Code to initialize the lower bound. Insert + before the `succeed_n'. The `5' is the last two + bytes of this `set_number_at', plus 3 bytes of + the following `succeed_n'. */ + insert_op_2(set_number_at, laststart, b, 5, lower_bound); + b += 5; + + if (upper_bound > 1) { + /* More than one repetition is allowed, so + append a backward jump to the `succeed_n' + that starts this interval. + + When we've reached this during matching, + we'll have matched the interval once, so + jump back only `upper_bound - 1' times. */ + GET_BUFFER_SPACE(5); + store_jump_n(b, greedy?jump_n:finalize_push_n, laststart + 5, + upper_bound - 1); + b += 5; + + /* The location we want to set is the second + parameter of the `jump_n'; that is `b-2' as + an absolute address. `laststart' will be + the `set_number_at' we're about to insert; + `laststart+3' the number to set, the source + for the relative address. But we are + inserting into the middle of the pattern -- + so everything is getting moved up by 5. + Conclusion: (b - 2) - (laststart + 3) + 5, + i.e., b - laststart. + + We insert this at the beginning of the loop + so that if we fail during matching, we'll + reinitialize the bounds. */ + insert_op_2(set_number_at, laststart, b, b - laststart, + upper_bound - 1); + b += 5; + } + } + break; + + unfetch_interval: + /* If an invalid interval, match the characters as literals. */ + re_warning("regexp has invalid interval"); + p = beg_interval; + beg_interval = 0; + + /* normal_char and normal_backslash need `c'. */ + PATFETCH(c); + goto normal_char; + + case '\\': + if (p == pend) + FREE_AND_RETURN(stackb, "invalid regular expression; '\\' can't be last character"); + /* Do not translate the character after the \, so that we can + distinguish, e.g., \B from \b, even if we normally would + translate, e.g., B to b. */ + PATFETCH_RAW(c); + switch (c) { + case 's': + case 'S': + case 'd': + case 'D': + while (b - bufp->buffer + 9 + (1 << BYTEWIDTH) / BYTEWIDTH + > bufp->allocated) + EXTEND_BUFFER; + + laststart = b; + if (c == 's' || c == 'd') { + BUFPUSH(charset); + } + else { + BUFPUSH(charset_not); + } + + BUFPUSH((1 << BYTEWIDTH) / BYTEWIDTH); + memset(b, 0, (1 << BYTEWIDTH) / BYTEWIDTH + 2); + if (c == 's' || c == 'S') { + SET_LIST_BIT(' '); + SET_LIST_BIT('\t'); + SET_LIST_BIT('\n'); + SET_LIST_BIT('\r'); + SET_LIST_BIT('\f'); + } + else { + char cc; + + for (cc = '0'; cc <= '9'; cc++) { + SET_LIST_BIT(cc); + } + } + + while ((int)b[-1] > 0 && b[b[-1] - 1] == 0) + b[-1]--; + if (b[-1] != (1 << BYTEWIDTH) / BYTEWIDTH) + memmove(&b[(unsigned char)b[-1]], &b[(1 << BYTEWIDTH) / BYTEWIDTH], + 2 + EXTRACT_UNSIGNED(&b[(1 << BYTEWIDTH) / BYTEWIDTH])*8); + b += b[-1] + 2 + EXTRACT_UNSIGNED(&b[(unsigned char)b[-1]])*8; + break; + + case 'w': + laststart = b; + BUFPUSH(wordchar); + break; + + case 'W': + laststart = b; + BUFPUSH(notwordchar); + break; + +#ifndef RUBY + case '<': + BUFPUSH(wordbeg); + break; + + case '>': + BUFPUSH(wordend); + break; +#endif + + case 'b': + BUFPUSH(wordbound); + break; + + case 'B': + BUFPUSH(notwordbound); + break; + + case 'A': + BUFPUSH(begbuf); + break; + + case 'Z': + if ((bufp->options & RE_OPTION_SINGLELINE) == 0) { + BUFPUSH(endbuf2); + break; + } + /* fall through */ + case 'z': + BUFPUSH(endbuf); + break; + + case 'G': + BUFPUSH(begpos); + break; + + /* hex */ + case 'x': + had_mbchar = 0; + c = scan_hex(p, 2, &numlen); + if (numlen == 0) goto invalid_escape; + p += numlen; + had_num_literal = 1; + goto numeric_char; + + /* octal */ + case '0': + had_mbchar = 0; + c = scan_oct(p, 2, &numlen); + p += numlen; + had_num_literal = 1; + goto numeric_char; + + /* back-ref or octal */ + case '1': case '2': case '3': + case '4': case '5': case '6': + case '7': case '8': case '9': + PATUNFETCH; + p0 = p; + + had_mbchar = 0; + c1 = 0; + GET_UNSIGNED_NUMBER(c1); + if (!ISDIGIT(c)) PATUNFETCH; + + if (9 < c1 && c1 >= regnum) { + /* need to get octal */ + c = scan_oct(p0, 3, &numlen) & 0xff; + p = p0 + numlen; + c1 = 0; + had_num_literal = 1; + goto numeric_char; + } + + laststart = b; + BUFPUSH(duplicate); + BUFPUSH(c1); + break; + + case 'M': + case 'C': + case 'c': + p0 = --p; + c = read_special(p, pend, &p0); + if (c > 255) goto invalid_escape; + p = p0; + had_num_literal = 1; + goto numeric_char; + + default: + c = read_backslash(c); + goto normal_char; + } + break; + + case '#': + if (options & RE_OPTION_EXTENDED) { + while (p != pend) { + PATFETCH(c); + if (c == '\n') break; + } + break; + } + goto normal_char; + + case ' ': + case '\t': + case '\f': + case '\r': + case '\n': + if (options & RE_OPTION_EXTENDED) + break; + + default: + if (c == ']') + re_warning("regexp has `]' without escape"); + else if (c == '}') + re_warning("regexp has `}' without escape"); + normal_char: /* Expects the character in `c'. */ + had_mbchar = 0; + if (ismbchar(c)) { + had_mbchar = 1; + c1 = p - pattern; + } + numeric_char: + nextp = p + mbclen(c) - 1; + if (!pending_exact || pending_exact + *pending_exact + 1 != b + || *pending_exact >= (c1 ? 0176 : 0177) + || (nextp < pend && + ( *nextp == '+' || *nextp == '?' + || *nextp == '*' || *nextp == '^' + || *nextp == '{'))) { + laststart = b; + BUFPUSH(exactn); + pending_exact = b; + BUFPUSH(0); + } + if (had_num_literal || c == 0xff) { + BUFPUSH(0xff); + (*pending_exact)++; + had_num_literal = 0; + } + BUFPUSH(c); + (*pending_exact)++; + if (had_mbchar) { + int len = mbclen(c) - 1; + while (len--) { + PATFETCH_RAW(c); + BUFPUSH(c); + (*pending_exact)++; + } + } + } + } + + if (fixup_alt_jump) + store_jump(fixup_alt_jump, jump, b); + + if (stackp != stackb) + FREE_AND_RETURN(stackb, "unmatched ("); + + /* set optimize flags */ + laststart = bufp->buffer; + if (laststart != b) { + if (*laststart == dummy_failure_jump) laststart += 3; + else if (*laststart == try_next) laststart += 3; + if (*laststart == anychar_repeat) { + bufp->options |= RE_OPTIMIZE_ANCHOR; + } + } + + bufp->used = b - bufp->buffer; + bufp->re_nsub = regnum; + laststart = bufp->buffer; + if (laststart != b) { + if (*laststart == start_memory) laststart += 3; + if (*laststart == exactn) { + bufp->options |= RE_OPTIMIZE_EXACTN; + bufp->must = laststart+1; + } + } + if (!bufp->must) { + bufp->must = calculate_must_string(bufp->buffer, b); + } + if (current_mbctype == MBCTYPE_SJIS) bufp->options |= RE_OPTIMIZE_NO_BM; + else if (bufp->must) { + int i; + int len = (unsigned char)bufp->must[0]; + + for (i=1; i<len; i++) { + if ((unsigned char)bufp->must[i] == 0xff || + (current_mbctype && ismbchar(bufp->must[i]))) { + bufp->options |= RE_OPTIMIZE_NO_BM; + break; + } + } + if (!(bufp->options & RE_OPTIMIZE_NO_BM)) { + bufp->must_skip = (int *) xmalloc((1 << BYTEWIDTH)*sizeof(int)); + bm_init_skip(bufp->must_skip, (unsigned char*)bufp->must+1, + (unsigned char)bufp->must[0], + (unsigned char*)(MAY_TRANSLATE()?translate:0)); + } + } + + bufp->regstart = TMALLOC(regnum, unsigned char*); + bufp->regend = TMALLOC(regnum, unsigned char*); + bufp->old_regstart = TMALLOC(regnum, unsigned char*); + bufp->old_regend = TMALLOC(regnum, unsigned char*); + bufp->reg_info = TMALLOC(regnum, register_info_type); + bufp->best_regstart = TMALLOC(regnum, unsigned char*); + bufp->best_regend = TMALLOC(regnum, unsigned char*); + FREE_AND_RETURN(stackb, 0); + + invalid_pattern: + FREE_AND_RETURN(stackb, "invalid regular expression"); + + end_of_pattern: + FREE_AND_RETURN(stackb, "premature end of regular expression"); + + too_big: + FREE_AND_RETURN(stackb, "regular expression too big"); + + memory_exhausted: + FREE_AND_RETURN(stackb, "memory exhausted"); + + nested_meta: + FREE_AND_RETURN(stackb, "nested *?+ in regexp"); + + invalid_escape: + FREE_AND_RETURN(stackb, "Invalid escape character syntax"); +} + +void +re_free_pattern(bufp) + struct re_pattern_buffer *bufp; +{ + xfree(bufp->buffer); + xfree(bufp->fastmap); + if (bufp->must_skip) xfree(bufp->must_skip); + + xfree(bufp->regstart); + xfree(bufp->regend); + xfree(bufp->old_regstart); + xfree(bufp->old_regend); + xfree(bufp->best_regstart); + xfree(bufp->best_regend); + xfree(bufp->reg_info); + xfree(bufp); +} + +/* Store a jump of the form <OPCODE> <relative address>. + Store in the location FROM a jump operation to jump to relative + address FROM - TO. OPCODE is the opcode to store. */ + +static void +store_jump(from, opcode, to) + char *from, *to; + int opcode; +{ + from[0] = (char)opcode; + STORE_NUMBER(from + 1, to - (from + 3)); +} + + +/* Open up space before char FROM, and insert there a jump to TO. + CURRENT_END gives the end of the storage not in use, so we know + how much data to copy up. OP is the opcode of the jump to insert. + + If you call this function, you must zero out pending_exact. */ + +static void +insert_jump(op, from, to, current_end) + int op; + char *from, *to, *current_end; +{ + register char *pfrom = current_end; /* Copy from here... */ + register char *pto = current_end + 3; /* ...to here. */ + + while (pfrom != from) + *--pto = *--pfrom; + store_jump(from, op, to); +} + + +/* Store a jump of the form <opcode> <relative address> <n> . + + Store in the location FROM a jump operation to jump to relative + address FROM - TO. OPCODE is the opcode to store, N is a number the + jump uses, say, to decide how many times to jump. + + If you call this function, you must zero out pending_exact. */ + +static void +store_jump_n(from, opcode, to, n) + char *from, *to; + int opcode; + unsigned n; +{ + from[0] = (char)opcode; + STORE_NUMBER(from + 1, to - (from + 3)); + STORE_NUMBER(from + 3, n); +} + + +/* Similar to insert_jump, but handles a jump which needs an extra + number to handle minimum and maximum cases. Open up space at + location FROM, and insert there a jump to TO. CURRENT_END gives the + end of the storage in use, so we know how much data to copy up. OP is + the opcode of the jump to insert. + + If you call this function, you must zero out pending_exact. */ + +static void +insert_jump_n(op, from, to, current_end, n) + int op; + char *from, *to, *current_end; + unsigned n; +{ + register char *pfrom = current_end; /* Copy from here... */ + register char *pto = current_end + 5; /* ...to here. */ + + while (pfrom != from) + *--pto = *--pfrom; + store_jump_n(from, op, to, n); +} + + +/* Open up space at location THERE, and insert operation OP. + CURRENT_END gives the end of the storage in use, so + we know how much data to copy up. + + If you call this function, you must zero out pending_exact. */ + +static void +insert_op(op, there, current_end) + int op; + char *there, *current_end; +{ + register char *pfrom = current_end; /* Copy from here... */ + register char *pto = current_end + 1; /* ...to here. */ + + while (pfrom != there) + *--pto = *--pfrom; + + there[0] = (char)op; +} + + +/* Open up space at location THERE, and insert operation OP followed by + NUM_1 and NUM_2. CURRENT_END gives the end of the storage in use, so + we know how much data to copy up. + + If you call this function, you must zero out pending_exact. */ + +static void +insert_op_2(op, there, current_end, num_1, num_2) + int op; + char *there, *current_end; + int num_1, num_2; +{ + register char *pfrom = current_end; /* Copy from here... */ + register char *pto = current_end + 5; /* ...to here. */ + + while (pfrom != there) + *--pto = *--pfrom; + + there[0] = (char)op; + STORE_NUMBER(there + 1, num_1); + STORE_NUMBER(there + 3, num_2); +} + + +#define trans_eq(c1, c2, translate) (translate?(translate[c1]==translate[c2]):((c1)==(c2))) +static int +slow_match(little, lend, big, bend, translate) + const unsigned char *little, *lend; + const unsigned char *big, *bend; + const unsigned char *translate; +{ + int c; + + while (little < lend && big < bend) { + c = *little++; + if (c == 0xff) + c = *little++; + if (!trans_eq(*big++, c, translate)) break; + } + if (little == lend) return 1; + return 0; +} + +static int +slow_search(little, llen, big, blen, translate) + const unsigned char *little; + int llen; + const unsigned char *big; + int blen; + const char *translate; +{ + const unsigned char *bsave = big; + const unsigned char *bend = big + blen; + register int c; + int fescape = 0; + + c = *little; + if (c == 0xff) { + c = little[1]; + fescape = 1; + } + else if (translate && !ismbchar(c)) { + c = translate[c]; + } + + while (big < bend) { + /* look for first character */ + if (fescape) { + while (big < bend) { + if (*big == c) break; + big++; + } + } + else if (translate && !ismbchar(c)) { + while (big < bend) { + if (ismbchar(*big)) big+=mbclen(*big)-1; + else if (translate[*big] == c) break; + big++; + } + } + else { + while (big < bend) { + if (*big == c) break; + if (ismbchar(*big)) big+=mbclen(*big)-1; + big++; + } + } + + if (slow_match(little, little+llen, big, bend, (unsigned char *)translate)) + return big - bsave; + + big+=mbclen(*big); + } + return -1; +} + +static void +bm_init_skip(skip, pat, m, translate) + int *skip; + unsigned char *pat; + int m; + const unsigned char *translate; +{ + int j, c; + + for (c=0; c<256; c++) { + skip[c] = m; + } + if (translate) { + for (j=0; j<m-1; j++) { + skip[translate[pat[j]]] = m-1-j; + } + } + else { + for (j=0; j<m-1; j++) { + skip[pat[j]] = m-1-j; + } + } +} + +static int +bm_search(little, llen, big, blen, skip, translate) + const unsigned char *little; + int llen; + const unsigned char *big; + int blen; + int *skip; + const unsigned char *translate; +{ + int i, j, k; + + i = llen-1; + if (translate) { + while (i < blen) { + k = i; + j = llen-1; + while (j >= 0 && translate[big[k]] == translate[little[j]]) { + k--; + j--; + } + if (j < 0) return k+1; + + i += skip[translate[big[i]]]; + } + return -1; + } + while (i < blen) { + k = i; + j = llen-1; + while (j >= 0 && big[k] == little[j]) { + k--; + j--; + } + if (j < 0) return k+1; + + i += skip[big[i]]; + } + return -1; +} + +/* Given a pattern, compute a fastmap from it. The fastmap records + which of the (1 << BYTEWIDTH) possible characters can start a string + that matches the pattern. This fastmap is used by re_search to skip + quickly over totally implausible text. + + The caller must supply the address of a (1 << BYTEWIDTH)-byte data + area as bufp->fastmap. + The other components of bufp describe the pattern to be used. */ +static int +re_compile_fastmap0(bufp) + struct re_pattern_buffer *bufp; +{ + unsigned char *pattern = (unsigned char*)bufp->buffer; + int size = bufp->used; + register char *fastmap = bufp->fastmap; + register unsigned char *p = pattern; + register unsigned char *pend = pattern + size; + register int j, k; + unsigned is_a_succeed_n; + + + unsigned char *stacka[NFAILURES]; + unsigned char **stackb = stacka; + unsigned char **stackp = stackb; + unsigned char **stacke = stackb + NFAILURES; + int options = bufp->options; + + memset(fastmap, 0, (1 << BYTEWIDTH)); + bufp->fastmap_accurate = 1; + bufp->can_be_null = 0; + + while (p) { + is_a_succeed_n = 0; + if (p == pend) { + bufp->can_be_null = 1; + break; + } +#ifdef SWITCH_ENUM_BUG + switch ((int)((enum regexpcode)*p++)) +#else + switch ((enum regexpcode)*p++) +#endif + { + case exactn: + if (p[1] == 0xff) { + if (TRANSLATE_P()) + fastmap[translate[p[2]]] = 2; + else + fastmap[p[2]] = 2; + bufp->options |= RE_OPTIMIZE_BMATCH; + } + else if (TRANSLATE_P()) + fastmap[translate[p[1]]] = 1; + else + fastmap[p[1]] = 1; + break; + + case begline: + case begbuf: + case begpos: + case endbuf: + case endbuf2: + case wordbound: + case notwordbound: + case wordbeg: + case wordend: + case pop_and_fail: + case push_dummy_failure: + case start_paren: + case stop_paren: + continue; + + case casefold_on: + bufp->options |= RE_MAY_IGNORECASE; + options |= RE_OPTION_IGNORECASE; + continue; + + case casefold_off: + options &= ~RE_OPTION_IGNORECASE; + continue; + + case option_set: + options = *p++; + continue; + + case endline: + if (TRANSLATE_P()) + fastmap[translate['\n']] = 1; + else + fastmap['\n'] = 1; + if ((options & RE_OPTION_SINGLELINE) == 0 && bufp->can_be_null == 0) + bufp->can_be_null = 2; + break; + + case jump_n: + case finalize_jump: + case maybe_finalize_jump: + case jump: + case jump_past_alt: + case dummy_failure_jump: + case finalize_push: + case finalize_push_n: + EXTRACT_NUMBER_AND_INCR(j, p); + p += j; + if (j > 0) + continue; + /* Jump backward reached implies we just went through + the body of a loop and matched nothing. + Opcode jumped to should be an on_failure_jump. + Just treat it like an ordinary jump. + For a * loop, it has pushed its failure point already; + If so, discard that as redundant. */ + + if ((enum regexpcode)*p != on_failure_jump + && (enum regexpcode)*p != try_next + && (enum regexpcode)*p != succeed_n) + continue; + p++; + EXTRACT_NUMBER_AND_INCR(j, p); + p += j; + if (stackp != stackb && *stackp == p) + stackp--; /* pop */ + continue; + + case try_next: + case start_nowidth: + case stop_nowidth: + case stop_backtrack: + p += 2; + continue; + + case succeed_n: + is_a_succeed_n = 1; + /* Get to the number of times to succeed. */ + EXTRACT_NUMBER(k, p + 2); + /* Increment p past the n for when k != 0. */ + if (k != 0) { + p += 4; + continue; + } + /* fall through */ + + case on_failure_jump: + EXTRACT_NUMBER_AND_INCR(j, p); + if (p + j < pend) { + if (stackp == stacke) { + EXPAND_FAIL_STACK(); + } + *++stackp = p + j; /* push */ + } + else { + bufp->can_be_null = 1; + } + if (is_a_succeed_n) + EXTRACT_NUMBER_AND_INCR(k, p); /* Skip the n. */ + continue; + + case set_number_at: + p += 4; + continue; + + case start_memory: + case stop_memory: + p += 2; + continue; + + case duplicate: + bufp->can_be_null = 1; + if (*p >= bufp->re_nsub) break; + fastmap['\n'] = 1; + case anychar_repeat: + case anychar: + for (j = 0; j < (1 << BYTEWIDTH); j++) { + if (j != '\n' || (options & RE_OPTION_MULTILINE)) + fastmap[j] = 1; + } + if (bufp->can_be_null) { + FREE_AND_RETURN(stackb, 0); + } + /* Don't return; check the alternative paths + so we can set can_be_null if appropriate. */ + if ((enum regexpcode)p[-1] == anychar_repeat) { + continue; + } + break; + + case wordchar: + for (j = 0; j < 0x80; j++) { + if (SYNTAX(j) == Sword) + fastmap[j] = 1; + } + switch (current_mbctype) { + case MBCTYPE_ASCII: + for (j = 0x80; j < (1 << BYTEWIDTH); j++) { + if (SYNTAX(j) == Sword2) + fastmap[j] = 1; + } + break; + case MBCTYPE_EUC: + case MBCTYPE_SJIS: + case MBCTYPE_UTF8: + for (j = 0x80; j < (1 << BYTEWIDTH); j++) { + if (re_mbctab[j]) + fastmap[j] = 1; + } + break; + } + break; + + case notwordchar: + for (j = 0; j < 0x80; j++) + if (SYNTAX(j) != Sword) + fastmap[j] = 1; + switch (current_mbctype) { + case MBCTYPE_ASCII: + for (j = 0x80; j < (1 << BYTEWIDTH); j++) { + if (SYNTAX(j) != Sword2) + fastmap[j] = 1; + } + break; + case MBCTYPE_EUC: + case MBCTYPE_SJIS: + case MBCTYPE_UTF8: + for (j = 0x80; j < (1 << BYTEWIDTH); j++) { + if (!re_mbctab[j]) + fastmap[j] = 1; + } + break; + } + break; + + case charset: + /* NOTE: Charset for single-byte chars never contain + multi-byte char. See set_list_bits(). */ + for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) + if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) { + int tmp = TRANSLATE_P()?translate[j]:j; + fastmap[tmp] = 1; + } + { + unsigned short size; + unsigned long c, beg, end; + + p += p[-1] + 2; + size = EXTRACT_UNSIGNED(&p[-2]); + for (j = 0; j < (int)size; j++) { + c = EXTRACT_MBC(&p[j*8]); + beg = WC2MBC1ST(c); + c = EXTRACT_MBC(&p[j*8+4]); + end = WC2MBC1ST(c); + /* set bits for 1st bytes of multi-byte chars. */ + while (beg <= end) { + /* NOTE: Charset for multi-byte chars might contain + single-byte chars. We must reject them. */ + if (c < 0x100) { + fastmap[beg] = 2; + bufp->options |= RE_OPTIMIZE_BMATCH; + } + else if (ismbchar(beg)) + fastmap[beg] = 1; + beg++; + } + } + } + break; + + case charset_not: + /* S: set of all single-byte chars. + M: set of all first bytes that can start multi-byte chars. + s: any set of single-byte chars. + m: any set of first bytes that can start multi-byte chars. + + We assume S+M = U. + ___ _ _ + s+m = (S*s+M*m). */ + /* Chars beyond end of map must be allowed */ + /* NOTE: Charset_not for single-byte chars might contain + multi-byte chars. See set_list_bits(). */ + for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) + if (!ismbchar(j)) + fastmap[j] = 1; + + for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) + if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) { + if (!ismbchar(j)) + fastmap[j] = 1; + } + { + unsigned short size; + unsigned long c, beg; + int num_literal = 0; + + p += p[-1] + 2; + size = EXTRACT_UNSIGNED(&p[-2]); + if (size == 0) { + for (j = 0x80; j < (1 << BYTEWIDTH); j++) + if (ismbchar(j)) + fastmap[j] = 1; + break; + } + for (j = 0,c = 0;j < (int)size; j++) { + unsigned int cc = EXTRACT_MBC(&p[j*8]); + beg = WC2MBC1ST(cc); + while (c <= beg) { + if (ismbchar(c)) + fastmap[c] = 1; + c++; + } + + cc = EXTRACT_MBC(&p[j*8+4]); + if (cc < 0xff) { + num_literal = 1; + while (c <= cc) { + if (ismbchar(c)) + fastmap[c] = 1; + c++; + } + } + c = WC2MBC1ST(cc); + } + + for (j = c; j < (1 << BYTEWIDTH); j++) { + if (num_literal) + fastmap[j] = 1; + if (ismbchar(j)) + fastmap[j] = 1; + } + } + break; + + case unused: /* pacify gcc -Wall */ + break; + } + + /* Get here means we have successfully found the possible starting + characters of one path of the pattern. We need not follow this + path any farther. Instead, look at the next alternative + remembered in the stack. */ + if (stackp != stackb) + p = *stackp--; /* pop */ + else + break; + } + FREE_AND_RETURN(stackb, 0); + memory_exhausted: + FREE_AND_RETURN(stackb, -2); +} + +void +re_compile_fastmap(bufp) + struct re_pattern_buffer *bufp; +{ + (void)re_compile_fastmap0(bufp); +} + +/* adjust startpos value to the position between characters. */ +int +re_mbc_startpos(string, size, startpos, range) + const char *string; + int size, startpos, range; +{ + int i = mbc_startpos(string, startpos); + + if (i < startpos) { + if (range > 0) { + startpos = i + mbclen(string[i]); + } + else { + int len = mbclen(string[i]); + if (i + len <= startpos) + startpos = i + len; + else + startpos = i; + } + } + return startpos; +} + +int +re_adjust_startpos(bufp, string, size, startpos, range) + struct re_pattern_buffer *bufp; + const char *string; + int size, startpos, range; +{ + /* Update the fastmap now if not correct already. */ + if (!bufp->fastmap_accurate) { + int ret = re_compile_fastmap0(bufp); + if (ret) return ret; + } + + /* Adjust startpos for mbc string */ + if (current_mbctype && startpos>0 && !(bufp->options&RE_OPTIMIZE_BMATCH)) { + startpos = re_mbc_startpos(string, size, startpos, range); + } + return startpos; +} + + +static int re_match_exec _((struct re_pattern_buffer *, const char *, int, int, int, + struct re_registers *)); + +/* Using the compiled pattern in BUFP->buffer, first tries to match + STRING, starting first at index STARTPOS, then at STARTPOS + 1, and + so on. RANGE is the number of places to try before giving up. If + RANGE is negative, it searches backwards, i.e., the starting + positions tried are STARTPOS, STARTPOS - 1, etc. STRING is of SIZE. + In REGS, return the indices of STRING that matched the entire + BUFP->buffer and its contained subexpressions. + + The value returned is the position in the strings at which the match + was found, or -1 if no match was found, or -2 if error (such as + failure stack overflow). */ + +int +re_search(bufp, string, size, startpos, range, regs) + struct re_pattern_buffer *bufp; + const char *string; + int size, startpos, range; + struct re_registers *regs; +{ + register char *fastmap = bufp->fastmap; + int val, anchor = 0, initpos = startpos; + + /* Check for out-of-range starting position. */ + if (startpos < 0 || startpos > size) + return -1; + if (!string) { + if (size == 0) string = ""; + else return -1; + } + + /* Update the fastmap now if not correct already. */ + if (fastmap && !bufp->fastmap_accurate) { + int ret = re_compile_fastmap0(bufp); + if (ret) return ret; + } + + + /* If the search isn't to be a backwards one, don't waste time in a + search for a pattern that must be anchored. */ + if (bufp->used > 0) { + switch ((enum regexpcode)bufp->buffer[0]) { + case begbuf: + begbuf_match: + if (range > 0) { + if (startpos > 0) return -1; + else { + val = re_match(bufp, string, size, 0, regs); + if (val >= 0) return 0; + return val; + } + } + break; + + case begline: + anchor = 1; + break; + + case begpos: + val = re_match(bufp, string, size, startpos, regs); + if (val >= 0) return startpos; + return val; + + default: + break; + } + } + if (bufp->options & RE_OPTIMIZE_ANCHOR) { + if (bufp->options&RE_OPTION_MULTILINE && range > 0) { + goto begbuf_match; + } + anchor = 1; + } + + if (bufp->must) { + int len = ((unsigned char*)bufp->must)[0]; + int pos, pbeg, pend; + + pbeg = startpos; + pend = startpos + range; + if (pbeg > pend) { /* swap pbeg,pend */ + pos = pend; pend = pbeg; pbeg = pos; + } + pend = size; + if (bufp->options & RE_OPTIMIZE_NO_BM) { + pos = slow_search((unsigned char *)(bufp->must+1), len, + (unsigned char*)(string+pbeg), pend-pbeg, + (char *)(MAY_TRANSLATE()?translate:0)); + } + else { + pos = bm_search((unsigned char *)(bufp->must+1), len, + (unsigned char *)(string+pbeg), pend-pbeg, + bufp->must_skip, + MAY_TRANSLATE()?translate:0); + } + if (pos == -1) return -1; + if (range > 0 && (bufp->options & RE_OPTIMIZE_EXACTN)) { + startpos += pos; + range -= pos; + if (range < 0) return -1; + } + } + + for (;;) { + /* If a fastmap is supplied, skip quickly over characters that + cannot possibly be the start of a match. Note, however, that + if the pattern can possibly match the null string, we must + test it at each starting point so that we take the first null + string we get. */ + + if (fastmap && startpos < size + && bufp->can_be_null != 1 && !(anchor && startpos == 0)) { + if (range > 0) { /* Searching forwards. */ + register unsigned char *p, c; + int irange = range; + + p = (unsigned char*)string+startpos; + + while (range > 0) { + c = *p++; + if (ismbchar(c)) { + int len; + + if (fastmap[c]) + break; + len = mbclen(c) - 1; + while (len--) { + c = *p++; + range--; + if (fastmap[c] == 2) + goto startpos_adjust; + } + } + else { + if (fastmap[MAY_TRANSLATE() ? translate[c] : c]) + break; + } + range--; + } + startpos_adjust: + startpos += irange - range; + } + else { /* Searching backwards. */ + register unsigned char c; + + c = string[startpos]; + c &= 0xff; + if (MAY_TRANSLATE() ? !fastmap[translate[c]] : !fastmap[c]) + goto advance; + } + } + + if (startpos > size) return -1; + if ((anchor || !bufp->can_be_null) && range > 0 && size > 0 && startpos == size) + return -1; + val = re_match_exec(bufp, string, size, startpos, initpos, regs); + if (val >= 0) return startpos; + if (val == -2) return -2; + +#ifndef NO_ALLOCA +#ifdef C_ALLOCA + alloca(0); +#endif /* C_ALLOCA */ +#endif /* NO_ALLOCA */ + + if (range > 0) { + if (anchor && startpos < size && + (startpos < 1 || string[startpos-1] != '\n')) { + while (range > 0 && string[startpos] != '\n') { + range--; + startpos++; + } + } + } + + advance: + if (!range) + break; + else if (range > 0) { + const char *d = string + startpos; + + if (ismbchar(*d)) { + int len = mbclen(*d) - 1; + range-=len, startpos+=len; + if (!range) + break; + } + range--, startpos++; + } + else { + range++, startpos--; + { + const char *s, *d, *p; + + s = string; d = string + startpos; + for (p = d; p-- > s && ismbchar(*p); ) + /* --p >= s would not work on 80[12]?86. + (when the offset of s equals 0 other than huge model.) */ + ; + if (!((d - p) & 1)) { + if (!range) + break; + range++, startpos--; + } + } + } + } + return -1; +} + + + + +/* The following are used for re_match, defined below: */ + +/* Accessing macros used in re_match: */ + +#define IS_ACTIVE(R) ((R).bits.is_active) +#define MATCHED_SOMETHING(R) ((R).bits.matched_something) + + +/* Macros used by re_match: */ + +/* I.e., regstart, regend, and reg_info. */ +#define NUM_REG_ITEMS 3 + +/* I.e., ptr and count. */ +#define NUM_COUNT_ITEMS 2 + +/* Individual items aside from the registers. */ +#define NUM_NONREG_ITEMS 4 + +/* We push at most this many things on the stack whenever we + fail. The `+ 2' refers to PATTERN_PLACE and STRING_PLACE, which are + arguments to the PUSH_FAILURE_POINT macro. */ +#define MAX_NUM_FAILURE_ITEMS (num_regs * NUM_REG_ITEMS + NUM_NONREG_ITEMS) + +/* We push this many things on the stack whenever we fail. */ +#define NUM_FAILURE_ITEMS (last_used_reg * NUM_REG_ITEMS + NUM_NONREG_ITEMS + 1) + +/* This pushes counter information for succeed_n and jump_n */ +#define PUSH_FAILURE_COUNT(ptr) \ + do { \ + int c; \ + EXTRACT_NUMBER(c, ptr); \ + ENSURE_FAIL_STACK(NUM_COUNT_ITEMS); \ + *stackp++ = (unsigned char*)(long)c; \ + *stackp++ = (ptr); \ + num_failure_counts++; \ + } while (0) + +/* This pushes most of the information about the current state we will want + if we ever fail back to it. */ + +#define PUSH_FAILURE_POINT(pattern_place, string_place) \ + do { \ + long last_used_reg, this_reg; \ + \ + /* Find out how many registers are active or have been matched. \ + (Aside from register zero, which is only set at the end.) */ \ + for (last_used_reg = num_regs-1; last_used_reg > 0; last_used_reg--)\ + if (!REG_UNSET(regstart[last_used_reg])) \ + break; \ + \ + ENSURE_FAIL_STACK(NUM_FAILURE_ITEMS); \ + *stackp++ = (unsigned char*)(long)num_failure_counts; \ + num_failure_counts = 0; \ + \ + /* Now push the info for each of those registers. */ \ + for (this_reg = 1; this_reg <= last_used_reg; this_reg++) { \ + *stackp++ = regstart[this_reg]; \ + *stackp++ = regend[this_reg]; \ + *stackp++ = reg_info[this_reg].word; \ + } \ + \ + /* Push how many registers we saved. */ \ + *stackp++ = (unsigned char*)last_used_reg; \ + \ + *stackp++ = pattern_place; \ + *stackp++ = string_place; \ + *stackp++ = (unsigned char*)(long)options; /* current option status */ \ + *stackp++ = (unsigned char*)0; /* non-greedy flag */ \ + } while(0) + +#define NON_GREEDY ((unsigned char*)1) + +#define POP_FAILURE_COUNT() \ + do { \ + unsigned char *ptr = *--stackp; \ + int count = (long)*--stackp; \ + STORE_NUMBER(ptr, count); \ + } while (0) + +/* This pops what PUSH_FAILURE_POINT pushes. */ + +#define POP_FAILURE_POINT() \ + do { \ + long temp; \ + stackp -= NUM_NONREG_ITEMS; /* Remove failure points (and flag). */ \ + temp = (long)*--stackp; /* How many regs pushed. */ \ + temp *= NUM_REG_ITEMS; /* How much to take off the stack. */ \ + stackp -= temp; /* Remove the register info. */ \ + temp = (long)*--stackp; /* How many counters pushed. */ \ + while (temp--) { \ + POP_FAILURE_COUNT(); /* Remove the counter info. */ \ + } \ + num_failure_counts = 0; /* Reset num_failure_counts. */ \ + } while(0) + + /* Registers are set to a sentinel when they haven't yet matched. */ +#define REG_UNSET_VALUE ((unsigned char*)-1) +#define REG_UNSET(e) ((e) == REG_UNSET_VALUE) + +#define PREFETCH if (d == dend) goto fail + + /* Call this when have matched something; it sets `matched' flags for the + registers corresponding to the subexpressions of which we currently + are inside. */ +#define SET_REGS_MATCHED \ + do { unsigned this_reg; \ + for (this_reg = 0; this_reg < num_regs; this_reg++) { \ + if (IS_ACTIVE(reg_info[this_reg])) \ + MATCHED_SOMETHING(reg_info[this_reg]) = 1; \ + else \ + MATCHED_SOMETHING(reg_info[this_reg]) = 0; \ + } \ + } while(0) + +#define AT_STRINGS_BEG(d) ((d) == string) +#define AT_STRINGS_END(d) ((d) == dend) + +#define IS_A_LETTER(d) (SYNTAX(*(d)) == Sword || \ + (current_mbctype ? \ + (re_mbctab[*(d)] && ((d)+mbclen(*(d)))<=dend): \ + SYNTAX(*(d)) == Sword2)) + +#define PREV_IS_A_LETTER(d) ((current_mbctype == MBCTYPE_SJIS)? \ + IS_A_LETTER((d)-(!AT_STRINGS_BEG((d)-1)&& \ + ismbchar((d)[-2])?2:1)): \ + ((current_mbctype && ((d)[-1] >= 0x80)) || \ + IS_A_LETTER((d)-1))) + +static void +init_regs(regs, num_regs) + struct re_registers *regs; + unsigned int num_regs; +{ + int i; + + regs->num_regs = num_regs; + if (num_regs < RE_NREGS) + num_regs = RE_NREGS; + + if (regs->allocated == 0) { + regs->beg = TMALLOC(num_regs, int); + regs->end = TMALLOC(num_regs, int); + regs->allocated = num_regs; + } + else if (regs->allocated < num_regs) { + TREALLOC(regs->beg, num_regs, int); + TREALLOC(regs->end, num_regs, int); + regs->allocated = num_regs; + } + for (i=0; i<num_regs; i++) { + regs->beg[i] = regs->end[i] = -1; + } +} + +/* Match the pattern described by BUFP against STRING, which is of + SIZE. Start the match at index POS in STRING. In REGS, return the + indices of STRING that matched the entire BUFP->buffer and its + contained subexpressions. + + If bufp->fastmap is nonzero, then it had better be up to date. + + The reason that the data to match are specified as two components + which are to be regarded as concatenated is so this function can be + used directly on the contents of an Emacs buffer. + + -1 is returned if there is no match. -2 is returned if there is an + error (such as match stack overflow). Otherwise the value is the + length of the substring which was matched. */ + +int +re_match(bufp, string_arg, size, pos, regs) + struct re_pattern_buffer *bufp; + const char *string_arg; + int size, pos; + struct re_registers *regs; +{ + return re_match_exec(bufp, string_arg, size, pos, pos, regs); +} + +static int +re_match_exec(bufp, string_arg, size, pos, beg, regs) + struct re_pattern_buffer *bufp; + const char *string_arg; + int size, pos, beg; + struct re_registers *regs; +{ + register unsigned char *p = (unsigned char*)bufp->buffer; + unsigned char *p1; + + /* Pointer to beyond end of buffer. */ + register unsigned char *pend = p + bufp->used; + + unsigned num_regs = bufp->re_nsub; + + unsigned char *string = (unsigned char*)string_arg; + + register unsigned char *d, *dend; + register int mcnt; /* Multipurpose. */ + int options = bufp->options; + + /* Failure point stack. Each place that can handle a failure further + down the line pushes a failure point on this stack. It consists of + restart, regend, and reg_info for all registers corresponding to the + subexpressions we're currently inside, plus the number of such + registers, and, finally, two char *'s. The first char * is where to + resume scanning the pattern; the second one is where to resume + scanning the strings. If the latter is zero, the failure point is a + ``dummy''; if a failure happens and the failure point is a dummy, it + gets discarded and the next next one is tried. */ + + unsigned char **const stacka = 0; + unsigned char **stackb; + unsigned char **stackp; + unsigned char **stacke; + + /* Information on the contents of registers. These are pointers into + the input strings; they record just what was matched (on this + attempt) by a subexpression part of the pattern, that is, the + regnum-th regstart pointer points to where in the pattern we began + matching and the regnum-th regend points to right after where we + stopped matching the regnum-th subexpression. (The zeroth register + keeps track of what the whole pattern matches.) */ + + unsigned char **regstart = bufp->regstart; + unsigned char **regend = bufp->regend; + + /* If a group that's operated upon by a repetition operator fails to + match anything, then the register for its start will need to be + restored because it will have been set to wherever in the string we + are when we last see its open-group operator. Similarly for a + register's end. */ + unsigned char **old_regstart = bufp->old_regstart; + unsigned char **old_regend = bufp->old_regend; + + /* The is_active field of reg_info helps us keep track of which (possibly + nested) subexpressions we are currently in. The matched_something + field of reg_info[reg_num] helps us tell whether or not we have + matched any of the pattern so far this time through the reg_num-th + subexpression. These two fields get reset each time through any + loop their register is in. */ + + register_info_type *reg_info = bufp->reg_info; + + /* The following record the register info as found in the above + variables when we find a match better than any we've seen before. + This happens as we backtrack through the failure points, which in + turn happens only if we have not yet matched the entire string. */ + + unsigned best_regs_set = 0; + unsigned char **best_regstart = bufp->best_regstart; + unsigned char **best_regend = bufp->best_regend; + + int num_failure_counts = 0; + + if (regs) { + init_regs(regs, num_regs); + } + + /* Initialize the stack. */ + stackb = TMALLOC(MAX_NUM_FAILURE_ITEMS * NFAILURES, unsigned char*); + stackp = stackb; + stacke = &stackb[MAX_NUM_FAILURE_ITEMS * NFAILURES]; + +#ifdef DEBUG_REGEX + fprintf(stderr, "Entering re_match(%s)\n", string_arg); +#endif + + /* Initialize subexpression text positions to -1 to mark ones that no + ( or ( and ) or ) has been seen for. Also set all registers to + inactive and mark them as not having matched anything or ever + failed. */ + for (mcnt = 0; mcnt < num_regs; mcnt++) { + regstart[mcnt] = regend[mcnt] + = old_regstart[mcnt] = old_regend[mcnt] + = best_regstart[mcnt] = best_regend[mcnt] = REG_UNSET_VALUE; +#ifdef __CHECKER__ + reg_info[mcnt].word = 0; +#endif + IS_ACTIVE (reg_info[mcnt]) = 0; + MATCHED_SOMETHING (reg_info[mcnt]) = 0; + } + + /* Set up pointers to ends of strings. + Don't allow the second string to be empty unless both are empty. */ + + + /* `p' scans through the pattern as `d' scans through the data. `dend' + is the end of the input string that `d' points within. `d' is + advanced into the following input string whenever necessary, but + this happens before fetching; therefore, at the beginning of the + loop, `d' can be pointing at the end of a string, but it cannot + equal string2. */ + + d = string + pos, dend = string + size; + + /* This loops over pattern commands. It exits by returning from the + function if match is complete, or it drops through if match fails + at this starting point in the input data. */ + + for (;;) { +#ifdef DEBUG_REGEX + fprintf(stderr, + "regex loop(%d): matching 0x%02d\n", + p - (unsigned char*)bufp->buffer, + *p); +#endif + /* End of pattern means we might have succeeded. */ + if (p == pend) { + /* If not end of string, try backtracking. Otherwise done. */ + if ((bufp->options & RE_OPTION_LONGEST) && d != dend) { + if (best_regs_set) /* non-greedy, no need to backtrack */ + goto restore_best_regs; + while (stackp != stackb && stackp[-1] == NON_GREEDY) { + if (best_regs_set) /* non-greedy, no need to backtrack */ + goto restore_best_regs; + POP_FAILURE_POINT(); + } + if (stackp != stackb) { + /* More failure points to try. */ + + /* If exceeds best match so far, save it. */ + if (! best_regs_set || (d > best_regend[0])) { + best_regs_set = 1; + best_regend[0] = d; /* Never use regstart[0]. */ + + for (mcnt = 1; mcnt < num_regs; mcnt++) { + best_regstart[mcnt] = regstart[mcnt]; + best_regend[mcnt] = regend[mcnt]; + } + } + goto fail; + } + /* If no failure points, don't restore garbage. */ + else if (best_regs_set) { + restore_best_regs: + /* Restore best match. */ + d = best_regend[0]; + + for (mcnt = 0; mcnt < num_regs; mcnt++) { + regstart[mcnt] = best_regstart[mcnt]; + regend[mcnt] = best_regend[mcnt]; + } + } + } + + /* If caller wants register contents data back, convert it + to indices. */ + if (regs) { + regs->beg[0] = pos; + regs->end[0] = d - string; + for (mcnt = 1; mcnt < num_regs; mcnt++) { + if (REG_UNSET(regend[mcnt])) { + regs->beg[mcnt] = -1; + regs->end[mcnt] = -1; + continue; + } + regs->beg[mcnt] = regstart[mcnt] - string; + regs->end[mcnt] = regend[mcnt] - string; + } + } + FREE_AND_RETURN(stackb, (d - pos - string)); + } + + /* Otherwise match next pattern command. */ +#ifdef SWITCH_ENUM_BUG + switch ((int)((enum regexpcode)*p++)) +#else + switch ((enum regexpcode)*p++) +#endif + { + /* ( [or `(', as appropriate] is represented by start_memory, + ) by stop_memory. Both of those commands are followed by + a register number in the next byte. The text matched + within the ( and ) is recorded under that number. */ + case start_memory: + old_regstart[*p] = regstart[*p]; + regstart[*p] = d; + IS_ACTIVE(reg_info[*p]) = 1; + MATCHED_SOMETHING(reg_info[*p]) = 0; + p += 2; + continue; + + case stop_memory: + old_regend[*p] = regend[*p]; + regend[*p] = d; + IS_ACTIVE(reg_info[*p]) = 0; + p += 2; + continue; + + case start_paren: + case stop_paren: + break; + + /* \<digit> has been turned into a `duplicate' command which is + followed by the numeric value of <digit> as the register number. */ + case duplicate: + { + int regno = *p++; /* Get which register to match against */ + register unsigned char *d2, *dend2; + + /* Check if there's corresponding group */ + if (regno >= num_regs) goto fail; + /* Check if corresponding group is still open */ + if (IS_ACTIVE(reg_info[regno])) goto fail; + + /* Where in input to try to start matching. */ + d2 = regstart[regno]; + if (REG_UNSET(d2)) goto fail; + + /* Where to stop matching; if both the place to start and + the place to stop matching are in the same string, then + set to the place to stop, otherwise, for now have to use + the end of the first string. */ + + dend2 = regend[regno]; + if (REG_UNSET(dend2)) goto fail; + for (;;) { + /* At end of register contents => success */ + if (d2 == dend2) break; + + /* If necessary, advance to next segment in data. */ + PREFETCH; + + /* How many characters left in this segment to match. */ + mcnt = dend - d; + + /* Want how many consecutive characters we can match in + one shot, so, if necessary, adjust the count. */ + if (mcnt > dend2 - d2) + mcnt = dend2 - d2; + + /* Compare that many; failure if mismatch, else move + past them. */ + if ((options & RE_OPTION_IGNORECASE) + ? memcmp_translate(d, d2, mcnt) + : memcmp((char*)d, (char*)d2, mcnt)) + goto fail; + d += mcnt, d2 += mcnt; + } + } + break; + + case start_nowidth: + PUSH_FAILURE_POINT(0, d); + if (stackp - stackb > RE_DUP_MAX) { + FREE_AND_RETURN(stackb,(-2)); + } + EXTRACT_NUMBER_AND_INCR(mcnt, p); + STORE_NUMBER(p+mcnt, stackp - stackb); + continue; + + case stop_nowidth: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + stackp = stackb + mcnt; + d = stackp[-3]; + POP_FAILURE_POINT(); + continue; + + case stop_backtrack: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + stackp = stackb + mcnt; + POP_FAILURE_POINT(); + continue; + + case pop_and_fail: + EXTRACT_NUMBER(mcnt, p+1); + stackp = stackb + mcnt; + POP_FAILURE_POINT(); + goto fail; + + case anychar: + PREFETCH; + if (ismbchar(*d)) { + if (d + mbclen(*d) > dend) + goto fail; + SET_REGS_MATCHED; + d += mbclen(*d); + break; + } + if (!(options&RE_OPTION_MULTILINE) + && (TRANSLATE_P() ? translate[*d] : *d) == '\n') + goto fail; + SET_REGS_MATCHED; + d++; + break; + + case anychar_repeat: + for (;;) { + PUSH_FAILURE_POINT(p, d); + PREFETCH; + if (ismbchar(*d)) { + if (d + mbclen(*d) > dend) + goto fail; + SET_REGS_MATCHED; + d += mbclen(*d); + continue; + } + if (!(options&RE_OPTION_MULTILINE) && + (TRANSLATE_P() ? translate[*d] : *d) == '\n') + goto fail; + SET_REGS_MATCHED; + d++; + } + break; + + case charset: + case charset_not: + { + int not; /* Nonzero for charset_not. */ + int part = 0; /* true if matched part of mbc */ + unsigned char *dsave = d + 1; + int cc, c; + + PREFETCH; + c = (unsigned char)*d++; + if (ismbchar(c)) { + if (d + mbclen(c) - 1 <= dend) { + cc = c; + MBC2WC(c, d); + not = is_in_list_mbc(c, p); + if (!not) { + part = not = is_in_list_sbc(cc, p); + } + } else { + not = is_in_list(c, p); + } + } + else { + if (TRANSLATE_P()) + c = (unsigned char)translate[c]; + not = is_in_list(c, p); + } + + if (*(p - 1) == (unsigned char)charset_not) { + not = !not; + } + if (!not) goto fail; + + p += 1 + *p + 2 + EXTRACT_UNSIGNED(&p[1 + *p])*8; + SET_REGS_MATCHED; + + if (part) d = dsave; + break; + } + + case begline: + if (size == 0 || AT_STRINGS_BEG(d)) + break; + if (d[-1] == '\n' && !AT_STRINGS_END(d)) + break; + goto fail; + + case endline: + if (AT_STRINGS_END(d)) { + break; + } + else if (*d == '\n') + break; + goto fail; + + /* Match at the very beginning of the string. */ + case begbuf: + if (AT_STRINGS_BEG(d)) + break; + goto fail; + + /* Match at the very end of the data. */ + case endbuf: + if (AT_STRINGS_END(d)) + break; + goto fail; + + /* Match at the very end of the data. */ + case endbuf2: + if (AT_STRINGS_END(d)) { + break; + } + /* .. or newline just before the end of the data. */ + if (*d == '\n' && AT_STRINGS_END(d+1)) + break; + goto fail; + + /* `or' constructs are handled by starting each alternative with + an on_failure_jump that points to the start of the next + alternative. Each alternative except the last ends with a + jump to the joining point. (Actually, each jump except for + the last one really jumps to the following jump, because + tensioning the jumps is a hassle.) */ + + /* The start of a stupid repeat has an on_failure_jump that points + past the end of the repeat text. This makes a failure point so + that on failure to match a repetition, matching restarts past + as many repetitions have been found with no way to fail and + look for another one. */ + + /* A smart repeat is similar but loops back to the on_failure_jump + so that each repetition makes another failure point. */ + + /* Match at the starting position. */ + case begpos: + if (d - string == beg) + break; + goto fail; + + case on_failure_jump: + on_failure: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + PUSH_FAILURE_POINT(p + mcnt, d); + continue; + + /* The end of a smart repeat has a maybe_finalize_jump back. + Change it either to a finalize_jump or an ordinary jump. */ + case maybe_finalize_jump: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + p1 = p; + + /* Compare the beginning of the repeat with what in the + pattern follows its end. If we can establish that there + is nothing that they would both match, i.e., that we + would have to backtrack because of (as in, e.g., `a*a') + then we can change to finalize_jump, because we'll + never have to backtrack. + + This is not true in the case of alternatives: in + `(a|ab)*' we do need to backtrack to the `ab' alternative + (e.g., if the string was `ab'). But instead of trying to + detect that here, the alternative has put on a dummy + failure point which is what we will end up popping. */ + + /* Skip over open/close-group commands. */ + while (p1 + 2 < pend) { + if ((enum regexpcode)*p1 == stop_memory || + (enum regexpcode)*p1 == start_memory) + p1 += 3; /* Skip over args, too. */ + else if (/*(enum regexpcode)*p1 == start_paren ||*/ + (enum regexpcode)*p1 == stop_paren) + p1 += 1; + else + break; + } + + if (p1 == pend) + p[-3] = (unsigned char)finalize_jump; + else if (*p1 == (unsigned char)exactn || + *p1 == (unsigned char)endline) { + register int c = *p1 == (unsigned char)endline ? '\n' : p1[2]; + register unsigned char *p2 = p + mcnt; + /* p2[0] ... p2[2] are an on_failure_jump. + Examine what follows that. */ + if (p2[3] == (unsigned char)exactn && p2[5] != c) + p[-3] = (unsigned char)finalize_jump; + else if (p2[3] == (unsigned char)charset || + p2[3] == (unsigned char)charset_not) { + int not; + if (ismbchar(c)) { + unsigned char *pp = p1+3; + MBC2WC(c, pp); + } + /* `is_in_list()' is TRUE if c would match */ + /* That means it is not safe to finalize. */ + not = is_in_list(c, p2 + 4); + if (p2[3] == (unsigned char)charset_not) + not = !not; + if (!not) + p[-3] = (unsigned char)finalize_jump; + } + } + p -= 2; /* Point at relative address again. */ + if (p[-1] != (unsigned char)finalize_jump) { + p[-1] = (unsigned char)jump; + goto nofinalize; + } + /* Note fall through. */ + + /* The end of a stupid repeat has a finalize_jump back to the + start, where another failure point will be made which will + point to after all the repetitions found so far. */ + + /* Take off failure points put on by matching on_failure_jump + because didn't fail. Also remove the register information + put on by the on_failure_jump. */ + case finalize_jump: + if (stackp > stackb && stackp[-3] == d) { + p = stackp[-4]; + POP_FAILURE_POINT(); + continue; + } + POP_FAILURE_POINT(); + /* Note fall through. */ + + /* We need this opcode so we can detect where alternatives end + in `group_match_null_string_p' et al. */ + case jump_past_alt: + /* fall through */ + + /* Jump without taking off any failure points. */ + case jump: + nofinalize: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + if (mcnt < 0 && stackp > stackb && stackp[-3] == d) /* avoid infinite loop */ + goto fail; + p += mcnt; + continue; + + case dummy_failure_jump: + /* Normally, the on_failure_jump pushes a failure point, which + then gets popped at finalize_jump. We will end up at + finalize_jump, also, and with a pattern of, say, `a+', we + are skipping over the on_failure_jump, so we have to push + something meaningless for finalize_jump to pop. */ + PUSH_FAILURE_POINT(0, 0); + goto nofinalize; + + /* At the end of an alternative, we need to push a dummy failure + point in case we are followed by a `finalize_jump', because + we don't want the failure point for the alternative to be + popped. For example, matching `(a|ab)*' against `aab' + requires that we match the `ab' alternative. */ + case push_dummy_failure: + /* See comments just above at `dummy_failure_jump' about the + two zeroes. */ + p1 = p; + /* Skip over open/close-group commands. */ + while (p1 + 2 < pend) { + if ((enum regexpcode)*p1 == stop_memory || + (enum regexpcode)*p1 == start_memory) + p1 += 3; /* Skip over args, too. */ + else if (/*(enum regexpcode)*p1 == start_paren ||*/ + (enum regexpcode)*p1 == stop_paren) + p1 += 1; + else + break; + } + if (p1 < pend && (enum regexpcode)*p1 == jump) + p[-1] = unused; + else + PUSH_FAILURE_POINT(0, 0); + break; + + /* Have to succeed matching what follows at least n times. Then + just handle like an on_failure_jump. */ + case succeed_n: + EXTRACT_NUMBER(mcnt, p + 2); + /* Originally, this is how many times we HAVE to succeed. */ + if (mcnt != 0) { + mcnt--; + p += 2; + PUSH_FAILURE_COUNT(p); + STORE_NUMBER_AND_INCR(p, mcnt); + PUSH_FAILURE_POINT(0, 0); + } + else { + goto on_failure; + } + continue; + + case jump_n: + EXTRACT_NUMBER(mcnt, p + 2); + /* Originally, this is how many times we CAN jump. */ + if (mcnt) { + mcnt--; + PUSH_FAILURE_COUNT(p + 2); + STORE_NUMBER(p + 2, mcnt); + goto nofinalize; /* Do the jump without taking off + any failure points. */ + } + /* If don't have to jump any more, skip over the rest of command. */ + else + p += 4; + continue; + + case set_number_at: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + p1 = p + mcnt; + EXTRACT_NUMBER_AND_INCR(mcnt, p); + STORE_NUMBER(p1, mcnt); + continue; + + case try_next: + EXTRACT_NUMBER_AND_INCR(mcnt, p); + if (p + mcnt < pend) { + PUSH_FAILURE_POINT(p, d); + stackp[-1] = NON_GREEDY; + } + p += mcnt; + continue; + + case finalize_push: + POP_FAILURE_POINT(); + EXTRACT_NUMBER_AND_INCR(mcnt, p); + if (mcnt < 0 && stackp > stackb && stackp[-3] == d) /* avoid infinite loop */ + goto fail; + PUSH_FAILURE_POINT(p + mcnt, d); + stackp[-1] = NON_GREEDY; + continue; + + case finalize_push_n: + EXTRACT_NUMBER(mcnt, p + 2); + /* Originally, this is how many times we CAN jump. */ + if (mcnt) { + int pos, i; + + mcnt--; + STORE_NUMBER(p + 2, mcnt); + EXTRACT_NUMBER(pos, p); + EXTRACT_NUMBER(i, p+pos+5); + if (i > 0) goto nofinalize; + POP_FAILURE_POINT(); + EXTRACT_NUMBER_AND_INCR(mcnt, p); + PUSH_FAILURE_POINT(p + mcnt, d); + stackp[-1] = NON_GREEDY; + p += 2; /* skip n */ + } + /* If don't have to push any more, skip over the rest of command. */ + else + p += 4; + continue; + + /* Ignore these. Used to ignore the n of succeed_n's which + currently have n == 0. */ + case unused: + continue; + + case casefold_on: + options |= RE_OPTION_IGNORECASE; + continue; + + case casefold_off: + options &= ~RE_OPTION_IGNORECASE; + continue; + + case option_set: + options = *p++; + continue; + + case wordbound: + if (AT_STRINGS_BEG(d)) { + if (AT_STRINGS_END(d)) goto fail; + if (IS_A_LETTER(d)) break; + else goto fail; + } + if (AT_STRINGS_END(d)) { + if (PREV_IS_A_LETTER(d)) break; + else goto fail; + } + if (PREV_IS_A_LETTER(d) != IS_A_LETTER(d)) + break; + goto fail; + + case notwordbound: + if (AT_STRINGS_BEG(d)) { + if (IS_A_LETTER(d)) goto fail; + else break; + } + if (AT_STRINGS_END(d)) { + if (PREV_IS_A_LETTER(d)) goto fail; + else break; + } + if (PREV_IS_A_LETTER(d) != IS_A_LETTER(d)) + goto fail; + break; + + case wordbeg: + if (IS_A_LETTER(d) && (AT_STRINGS_BEG(d) || !PREV_IS_A_LETTER(d))) + break; + goto fail; + + case wordend: + if (!AT_STRINGS_BEG(d) && PREV_IS_A_LETTER(d) + && (!IS_A_LETTER(d) || AT_STRINGS_END(d))) + break; + goto fail; + + case wordchar: + PREFETCH; + if (!IS_A_LETTER(d)) + goto fail; + if (ismbchar(*d) && d + mbclen(*d) - 1 < dend) + d += mbclen(*d) - 1; + d++; + SET_REGS_MATCHED; + break; + + case notwordchar: + PREFETCH; + if (IS_A_LETTER(d)) + goto fail; + if (ismbchar(*d) && d + mbclen(*d) - 1 < dend) + d += mbclen(*d) - 1; + d++; + SET_REGS_MATCHED; + break; + + case exactn: + /* Match the next few pattern characters exactly. + mcnt is how many characters to match. */ + mcnt = *p++; + /* This is written out as an if-else so we don't waste time + testing `translate' inside the loop. */ + if (TRANSLATE_P()) { + do { + unsigned char c; + + PREFETCH; + if (*p == 0xff) { + p++; + if (!--mcnt + || AT_STRINGS_END(d) + || (unsigned char)*d++ != (unsigned char)*p++) + goto fail; + continue; + } + c = *d++; + if (ismbchar(c)) { + int n; + + if (c != (unsigned char)*p++) + goto fail; + for (n = mbclen(c) - 1; n > 0; n--) + if (!--mcnt /* redundant check if pattern was + compiled properly. */ + || AT_STRINGS_END(d) + || (unsigned char)*d++ != (unsigned char)*p++) + goto fail; + continue; + } + /* compiled code translation needed for ruby */ + if ((unsigned char)translate[c] != (unsigned char)translate[*p++]) + goto fail; + } + while (--mcnt); + } + else { + do { + PREFETCH; + if (*p == 0xff) {p++; mcnt--;} + if (*d++ != *p++) goto fail; + } + while (--mcnt); + } + SET_REGS_MATCHED; + break; + } +#ifdef RUBY + CHECK_INTS; +#endif + continue; /* Successfully executed one pattern command; keep going. */ + + /* Jump here if any matching operation fails. */ + fail: + if (stackp != stackb) { + /* A restart point is known. Restart there and pop it. */ + short last_used_reg, this_reg; + + /* If this failure point is from a dummy_failure_point, just + skip it. */ + if (stackp[-4] == 0 || (best_regs_set && stackp[-1] == NON_GREEDY)) { + POP_FAILURE_POINT(); + goto fail; + } + stackp--; /* discard greedy flag */ + options = (long)*--stackp; + d = *--stackp; + p = *--stackp; + /* Restore register info. */ + last_used_reg = (long)*--stackp; + + /* Make the ones that weren't saved -1 or 0 again. */ + for (this_reg = num_regs - 1; this_reg > last_used_reg; this_reg--) { + regend[this_reg] = REG_UNSET_VALUE; + regstart[this_reg] = REG_UNSET_VALUE; + IS_ACTIVE(reg_info[this_reg]) = 0; + MATCHED_SOMETHING(reg_info[this_reg]) = 0; + } + + /* And restore the rest from the stack. */ + for ( ; this_reg > 0; this_reg--) { + reg_info[this_reg].word = *--stackp; + regend[this_reg] = *--stackp; + regstart[this_reg] = *--stackp; + } + mcnt = (long)*--stackp; + while (mcnt--) { + POP_FAILURE_COUNT(); + } + if (p < pend) { + int is_a_jump_n = 0; + int failed_paren = 0; + + p1 = p; + /* If failed to a backwards jump that's part of a repetition + loop, need to pop this failure point and use the next one. */ + switch ((enum regexpcode)*p1) { + case jump_n: + case finalize_push_n: + is_a_jump_n = 1; + case maybe_finalize_jump: + case finalize_jump: + case finalize_push: + case jump: + p1++; + EXTRACT_NUMBER_AND_INCR(mcnt, p1); + + if (mcnt >= 0) break; /* should be backward jump */ + p1 += mcnt; + + if (( is_a_jump_n && (enum regexpcode)*p1 == succeed_n) || + (!is_a_jump_n && (enum regexpcode)*p1 == on_failure_jump)) { + if (failed_paren) { + p1++; + EXTRACT_NUMBER_AND_INCR(mcnt, p1); + PUSH_FAILURE_POINT(p1 + mcnt, d); + } + goto fail; + } + break; + default: + /* do nothing */; + } + } + } + else + break; /* Matching at this starting point really fails. */ + } + + if (best_regs_set) + goto restore_best_regs; + + FREE_AND_RETURN(stackb,(-1)); /* Failure to match. */ + memory_exhausted: + FREE_AND_RETURN(stackb,(-2)); +} + + +static int +memcmp_translate(s1, s2, len) + unsigned char *s1, *s2; + register int len; +{ + register unsigned char *p1 = s1, *p2 = s2, c; + while (len) { + c = *p1++; + if (ismbchar(c)) { + int n; + + if (c != *p2++) return 1; + for (n = mbclen(c) - 1; n > 0; n--) + if (!--len || *p1++ != *p2++) + return 1; + } + else + if (translate[c] != translate[*p2++]) + return 1; + len--; + } + return 0; +} + +void +re_copy_registers(regs1, regs2) + struct re_registers *regs1, *regs2; +{ + int i; + + if (regs1 == regs2) return; + if (regs1->allocated == 0) { + regs1->beg = TMALLOC(regs2->num_regs, int); + regs1->end = TMALLOC(regs2->num_regs, int); + regs1->allocated = regs2->num_regs; + } + else if (regs1->allocated < regs2->num_regs) { + TREALLOC(regs1->beg, regs2->num_regs, int); + TREALLOC(regs1->end, regs2->num_regs, int); + regs1->allocated = regs2->num_regs; + } + for (i=0; i<regs2->num_regs; i++) { + regs1->beg[i] = regs2->beg[i]; + regs1->end[i] = regs2->end[i]; + } + regs1->num_regs = regs2->num_regs; +} + +void +re_free_registers(regs) + struct re_registers *regs; +{ + if (regs->allocated == 0) return; + if (regs->beg) xfree(regs->beg); + if (regs->end) xfree(regs->end); +} + +/* Functions for multi-byte support. + Created for grep multi-byte extension Jul., 1993 by t^2 (Takahiro Tanimoto) + Last change: Jul. 9, 1993 by t^2 */ +static const unsigned char mbctab_ascii[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const unsigned char mbctab_euc[] = { /* 0xA1-0xFE */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, +}; + +static const unsigned char mbctab_sjis[] = { /* 0x81-0x9F,0xE0-0xFC */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 +}; + +static const unsigned char mbctab_sjis_trail[] = { /* 0x40-0x7E,0x80-0xFC */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 +}; + +static const unsigned char mbctab_utf8[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 0, 0, +}; + +const unsigned char *re_mbctab = mbctab_ascii; + +void +re_mbcinit(mbctype) + int mbctype; +{ + switch (mbctype) { + case MBCTYPE_ASCII: + re_mbctab = mbctab_ascii; + current_mbctype = MBCTYPE_ASCII; + break; + case MBCTYPE_EUC: + re_mbctab = mbctab_euc; + current_mbctype = MBCTYPE_EUC; + break; + case MBCTYPE_SJIS: + re_mbctab = mbctab_sjis; + current_mbctype = MBCTYPE_SJIS; + break; + case MBCTYPE_UTF8: + re_mbctab = mbctab_utf8; + current_mbctype = MBCTYPE_UTF8; + break; + } +} + +#define mbc_isfirst(t, c) (t)[(unsigned char)(c)] +#define mbc_len(t, c) ((t)[(unsigned char)(c)]+1) + +static unsigned int +asc_startpos(string, pos) + const char *string; + unsigned int pos; +{ + return pos; +} + +#define euc_islead(c) ((unsigned char)((c) - 0xa1) > 0xfe - 0xa1) +#define euc_mbclen(c) mbc_len(mbctab_euc, (c)) +static unsigned int +euc_startpos(string, pos) + const char *string; + unsigned int pos; +{ + unsigned int i = pos, w; + + while (i > 0 && !euc_islead(string[i])) { + --i; + } + if (i == pos || i + (w = euc_mbclen(string[i])) > pos) { + return i; + } + i += w; + return i + ((pos - i) & ~1); +} + +#define sjis_isfirst(c) mbc_isfirst(mbctab_sjis, (c)) +#define sjis_istrail(c) mbctab_sjis_trail[(unsigned char)(c)] +#define sjis_mbclen(c) mbc_len(mbctab_sjis, (c)) +static unsigned int +sjis_startpos(string, pos) + const char *string; + unsigned int pos; +{ + unsigned int i = pos, w; + + if (i > 0 && sjis_istrail(string[i])) { + do { + if (!sjis_isfirst(string[--i])) { + ++i; + break; + } + } while (i > 0); + } + if (i == pos || i + (w = sjis_mbclen(string[i])) > pos) { + return i; + } + i += w; + return i + ((pos - i) & ~1); +} + +#define utf8_islead(c) ((unsigned char)((c) & 0xc0) != 0x80) +#define utf8_mbclen(c) mbc_len(mbctab_utf8, (c)) +static unsigned int +utf8_startpos(string, pos) + const char *string; + unsigned int pos; +{ + unsigned int i = pos, w; + + while (i > 0 && !utf8_islead(string[i])) { + --i; + } + if (i == pos || i + (w = utf8_mbclen(string[i])) > pos) { + return i; + } + return i + w; +} + +/* + vi: sw=2 ts=8 + Local variables: + mode : C + c-file-style : "gnu" + tab-width : 8 + End +*/ +/********************************************************************** + + ruby.c - + + $Author: shyouhei $ + $Date: 2008-07-10 11:36:08 +0200 (Thu, 10 Jul 2008) $ + created at: Tue Aug 10 12:47:31 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#if defined _WIN32 || defined __CYGWIN__ +#include <windows.h> +#endif +#if defined __CYGWIN__ +#include <sys/cygwin.h> +#endif +#ifdef _WIN32_WCE +#include <winsock.h> +#include "wince.h" +#endif +#include "ruby.h" +#include "dln.h" +#include "node.h" +#include <stdio.h> +#include <sys/types.h> +#include <ctype.h> + +#ifdef __hpux +#include <sys/pstat.h> +#endif + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#ifndef HAVE_STRING_H +char *strchr _((const char*,const char)); +char *strrchr _((const char*,const char)); +char *strstr _((const char*,const char*)); +#endif + +#include "util.h" + +#ifndef HAVE_STDLIB_H +char *getenv(); +#endif + +VALUE ruby_debug = Qfalse; +VALUE ruby_verbose = Qfalse; +static int sflag = 0; +static int xflag = 0; +extern int ruby_yydebug; + +char *ruby_inplace_mode = Qfalse; + +static void load_stdin _((void)); +static void load_file _((const char *, int)); +static void forbid_setid _((const char *)); + +static VALUE do_loop = Qfalse, do_print = Qfalse; +static VALUE do_check = Qfalse, do_line = Qfalse; +static VALUE do_split = Qfalse; + +static char *script; + +static int origargc; +static char **origargv; + +static void +usage(name) + const char *name; +{ + /* This message really ought to be max 23 lines. + * Removed -h because the user already knows that option. Others? */ + + static char *usage_msg[] = { +"-0[octal] specify record separator (\\0, if no argument)", +"-a autosplit mode with -n or -p (splits $_ into $F)", +"-c check syntax only", +"-Cdirectory cd to directory, before executing your script", +"-d set debugging flags (set $DEBUG to true)", +"-e 'command' one line of script. Several -e's allowed. Omit [programfile]", +"-Fpattern split() pattern for autosplit (-a)", +"-i[extension] edit ARGV files in place (make backup if extension supplied)", +"-Idirectory specify $LOAD_PATH directory (may be used more than once)", +"-Kkcode specifies KANJI (Japanese) code-set", +"-l enable line ending processing", +"-n assume 'while gets(); ... end' loop around your script", +"-p assume loop like -n but print line also like sed", +"-rlibrary require the library, before executing your script", +"-s enable some switch parsing for switches after script name", +"-S look for the script using PATH environment variable", +"-T[level] turn on tainting checks", +"-v print version number, then turn on verbose mode", +"-w turn warnings on for your script", +"-W[level] set warning level; 0=silence, 1=medium, 2=verbose (default)", +"-x[directory] strip off text before #!ruby line and perhaps cd to directory", +"--copyright print the copyright", +"--version print the version", +NULL +}; + char **p = usage_msg; + + printf("Usage: %s [switches] [--] [programfile] [arguments]\n", name); + while (*p) + printf(" %s\n", *p++); +} + +extern VALUE rb_load_path; + +#ifndef CharNext /* defined as CharNext[AW] on Windows. */ +#define CharNext(p) ((p) + mblen(p, RUBY_MBCHAR_MAXSIZE)) +#endif + +#if defined DOSISH || defined __CYGWIN__ +static inline void +translate_char(char *p, int from, int to) +{ + while (*p) { + if ((unsigned char)*p == from) + *p = to; + p = CharNext(p); + } +} +#endif + +#if defined _WIN32 || defined __CYGWIN__ || defined __DJGPP__ +static VALUE +rubylib_mangled_path(const char *s, unsigned int l) +{ + static char *newp, *oldp; + static int newl, oldl, notfound; + char *ptr; + VALUE ret; + + if (!newp && !notfound) { + newp = getenv("RUBYLIB_PREFIX"); + if (newp) { + oldp = newp = strdup(newp); + while (*newp && !ISSPACE(*newp) && *newp != ';') { + newp = CharNext(newp); /* Skip digits. */ + } + oldl = newp - oldp; + while (*newp && (ISSPACE(*newp) || *newp == ';')) { + newp = CharNext(newp); /* Skip whitespace. */ + } + newl = strlen(newp); + if (newl == 0 || oldl == 0) { + rb_fatal("malformed RUBYLIB_PREFIX"); + } + translate_char(newp, '\\', '/'); + } + else { + notfound = 1; + } + } + if (!newp || l < oldl || strncasecmp(oldp, s, oldl) != 0) { + return rb_str_new(s, l); + } + ret = rb_str_new(0, l + newl - oldl); + ptr = RSTRING_PTR(ret); + memcpy(ptr, newp, newl); + memcpy(ptr + newl, s + oldl, l - oldl); + ptr[l + newl - oldl] = 0; + return ret; +} + +static VALUE +rubylib_mangled_path2(const char *s) +{ + return rubylib_mangled_path(s, strlen(s)); +} +#else +#define rubylib_mangled_path rb_str_new +#define rubylib_mangled_path2 rb_str_new2 +#endif + +static void push_include _((const char *path)); + +static void +push_include(path) + const char *path; +{ + const char sep = PATH_SEP_CHAR; + const char *p, *s; + + p = path; + while (*p) { + while (*p == sep) + p++; + if (!*p) break; + for (s = p; *s && *s != sep; s = CharNext(s)); + rb_ary_push(rb_load_path, rubylib_mangled_path(p, s - p)); + p = s; + } +} + +#ifdef __CYGWIN__ +static void +push_include_cygwin(const char *path) +{ + const char *p, *s; + char rubylib[FILENAME_MAX]; + VALUE buf = 0; + + p = path; + while (*p) { + unsigned int len; + while (*p == ';') + p++; + if (!*p) break; + for (s = p; *s && *s != ';'; s = CharNext(s)); + len = s - p; + if (*s) { + if (!buf) { + buf = rb_str_new(p, len); + p = RSTRING_PTR(buf); + } + else { + rb_str_resize(buf, len); + p = strncpy(RSTRING_PTR(buf), p, len); + } + } + if (cygwin_conv_to_posix_path(p, rubylib) == 0) + p = rubylib; + push_include(p); + if (!*s) break; + p = s + 1; + } +} + +#define push_include push_include_cygwin +#endif + +void +ruby_incpush(path) + const char *path; +{ + if (path == 0) + return; + push_include(path); +} + +#if defined DOSISH || defined __CYGWIN__ +#define LOAD_RELATIVE 1 +#endif + +void +ruby_init_loadpath() +{ +#if defined LOAD_RELATIVE + char libpath[FILENAME_MAX+1]; + char *p; + int rest; +#if defined _WIN32 || defined __CYGWIN__ + HMODULE libruby = NULL; + MEMORY_BASIC_INFORMATION m; + +#ifndef _WIN32_WCE + memset(&m, 0, sizeof(m)); + if (VirtualQuery(ruby_init_loadpath, &m, sizeof(m)) && m.State == MEM_COMMIT) + libruby = (HMODULE)m.AllocationBase; +#endif + GetModuleFileName(libruby, libpath, sizeof libpath); +#elif defined(DJGPP) + extern char *__dos_argv0; + strncpy(libpath, __dos_argv0, FILENAME_MAX); +#elif defined(__human68k__) + extern char **_argv; + strncpy(libpath, _argv[0], FILENAME_MAX); +#elif defined(__EMX__) + _execname(libpath, FILENAME_MAX); +#endif + + libpath[FILENAME_MAX] = '\0'; +#if defined DOSISH + translate_char(libpath, '\\', '/'); +#elif defined __CYGWIN__ + { + char rubylib[FILENAME_MAX]; + cygwin_conv_to_posix_path(libpath, rubylib); + strncpy(libpath, rubylib, sizeof(libpath)); + } +#endif + p = strrchr(libpath, '/'); + if (p) { + *p = 0; + if (p - libpath > 3 && !strcasecmp(p - 4, "/bin")) { + p -= 4; + *p = 0; + } + } + else { + strcpy(libpath, "."); + p = libpath + 1; + } + + rest = FILENAME_MAX - (p - libpath); + +#define RUBY_RELATIVE(path) (strncpy(p, (path), rest), libpath) +#else +#define RUBY_RELATIVE(path) (path) +#endif +#define incpush(path) rb_ary_push(rb_load_path, rubylib_mangled_path2(path)) + + if (rb_safe_level() == 0) { + ruby_incpush(getenv("RUBYLIB")); + } + +#ifdef RUBY_SEARCH_PATH + incpush(RUBY_RELATIVE(RUBY_SEARCH_PATH)); +#endif + + incpush(RUBY_RELATIVE(RUBY_SITE_LIB2)); +#ifdef RUBY_SITE_THIN_ARCHLIB + incpush(RUBY_RELATIVE(RUBY_SITE_THIN_ARCHLIB)); +#endif + incpush(RUBY_RELATIVE(RUBY_SITE_ARCHLIB)); + incpush(RUBY_RELATIVE(RUBY_SITE_LIB)); + + incpush(RUBY_RELATIVE(RUBY_LIB)); +#ifdef RUBY_THIN_ARCHLIB + incpush(RUBY_RELATIVE(RUBY_THIN_ARCHLIB)); +#endif + incpush(RUBY_RELATIVE(RUBY_ARCHLIB)); + + if (rb_safe_level() == 0) { + incpush("."); + } +} + +struct req_list { + char *name; + struct req_list *next; +}; +static struct req_list req_list_head, *req_list_last = &req_list_head; + +static void +add_modules(mod) + const char *mod; +{ + struct req_list *list; + + list = ALLOC(struct req_list); + list->name = ALLOC_N(char, strlen(mod)+1); + strcpy(list->name, mod); + list->next = 0; + req_list_last->next = list; + req_list_last = list; +} + +extern void Init_ext _((void)); + +static void +require_libraries() +{ + extern NODE *ruby_eval_tree; + extern NODE *ruby_eval_tree_begin; + NODE *save[3]; + struct req_list *list = req_list_head.next; + struct req_list *tmp; + + save[0] = ruby_eval_tree; + save[1] = ruby_eval_tree_begin; + save[2] = NEW_NEWLINE(0); + ruby_eval_tree = ruby_eval_tree_begin = 0; + ruby_current_node = 0; + Init_ext(); /* should be called here for some reason :-( */ + ruby_current_node = save[2]; + ruby_set_current_source(); + req_list_last = 0; + while (list) { + int state; + + ruby_current_node = 0; + rb_protect((VALUE (*)(VALUE))rb_require, (VALUE)list->name, &state); + if (state) rb_jump_tag(state); + tmp = list->next; + free(list->name); + free(list); + list = tmp; + ruby_current_node = save[2]; + ruby_set_current_source(); + } + req_list_head.next = 0; + ruby_eval_tree = save[0]; + ruby_eval_tree_begin = save[1]; + rb_gc_force_recycle((VALUE)save[2]); + ruby_current_node = 0; +} + +static void +process_sflag() +{ + if (sflag) { + long n; + VALUE *args; + + n = RARRAY(rb_argv)->len; + args = RARRAY(rb_argv)->ptr; + while (n > 0) { + VALUE v = *args++; + char *s = StringValuePtr(v); + char *p; + int hyphen = Qfalse; + + if (s[0] != '-') break; + n--; + if (s[1] == '-' && s[2] == '\0') break; + + v = Qtrue; + /* check if valid name before replacing - with _ */ + for (p = s + 1; *p; p++) { + if (*p == '=') { + *p++ = '\0'; + v = rb_str_new2(p); + break; + } + if (*p == '-') { + hyphen = Qtrue; + } + else if (*p != '_' && !ISALNUM(*p)) { + VALUE name_error[2]; + name_error[0] = rb_str_new2("invalid name for global variable - "); + if (!(p = strchr(p, '='))) { + rb_str_cat2(name_error[0], s); + } + else { + rb_str_cat(name_error[0], s, p - s); + } + name_error[1] = args[-1]; + rb_exc_raise(rb_class_new_instance(2, name_error, rb_eNameError)); + } + } + s[0] = '$'; + if (hyphen) { + for (p = s + 1; *p; ++p) { + if (*p == '-') *p = '_'; + } + } + rb_gv_set(s, v); + } + n = RARRAY(rb_argv)->len - n; + while (n--) { + rb_ary_shift(rb_argv); + } + } + sflag = 0; +} + +static void proc_options _((int argc, char **argv)); + +static char* +moreswitches(s) + char *s; +{ + int argc; char *argv[3]; + char *p = s; + + argc = 2; argv[0] = argv[2] = 0; + while (*s && !ISSPACE(*s)) + s++; + argv[1] = ALLOCA_N(char, s-p+2); + argv[1][0] = '-'; + strncpy(argv[1]+1, p, s-p); + argv[1][s-p+1] = '\0'; + proc_options(argc, argv); + while (*s && ISSPACE(*s)) + s++; + return s; +} + +static void +proc_options(argc, argv) + int argc; + char **argv; +{ + char *argv0 = argv[0]; + int do_search; + char *s; + NODE *volatile script_node = 0; + + int version = 0; + int copyright = 0; + int verbose = 0; + VALUE e_script = Qfalse; + + if (argc == 0) return; + + do_search = Qfalse; + + for (argc--,argv++; argc > 0; argc--,argv++) { + if (argv[0][0] != '-' || !argv[0][1]) break; + + s = argv[0]+1; + reswitch: + switch (*s) { + case 'a': + do_split = Qtrue; + s++; + goto reswitch; + + case 'p': + do_print = Qtrue; + /* through */ + case 'n': + do_loop = Qtrue; + s++; + goto reswitch; + + case 'd': + ruby_debug = Qtrue; + ruby_verbose = Qtrue; + s++; + goto reswitch; + + case 'y': + ruby_yydebug = 1; + s++; + goto reswitch; + + case 'v': + if (argv0 == 0 || verbose) { + s++; + goto reswitch; + } + ruby_show_version(); + verbose = 1; + case 'w': + ruby_verbose = Qtrue; + s++; + goto reswitch; + + case 'W': + { + int numlen; + int v = 2; /* -W as -W2 */ + + if (*++s) { + v = scan_oct(s, 1, &numlen); + if (numlen == 0) v = 1; + s += numlen; + } + switch (v) { + case 0: + ruby_verbose = Qnil; break; + case 1: + ruby_verbose = Qfalse; break; + default: + ruby_verbose = Qtrue; break; + } + } + goto reswitch; + + case 'c': + do_check = Qtrue; + s++; + goto reswitch; + + case 's': + forbid_setid("-s"); + sflag = 1; + s++; + goto reswitch; + + case 'h': + usage(origargv[0]); + exit(0); + + case 'l': + do_line = Qtrue; + rb_output_rs = rb_rs; + s++; + goto reswitch; + + case 'S': + forbid_setid("-S"); + do_search = Qtrue; + s++; + goto reswitch; + + case 'e': + forbid_setid("-e"); + if (!*++s) { + s = argv[1]; + argc--,argv++; + } + if (!s) { + fprintf(stderr, "%s: no code specified for -e\n", origargv[0]); + exit(2); + } + if (!e_script) { + e_script = rb_str_new(0,0); + if (script == 0) script = "-e"; + } + rb_str_cat2(e_script, s); + rb_str_cat2(e_script, "\n"); + break; + + case 'r': + forbid_setid("-r"); + if (*++s) { + add_modules(s); + } + else if (argv[1]) { + add_modules(argv[1]); + argc--,argv++; + } + break; + + case 'i': + forbid_setid("-i"); + if (ruby_inplace_mode) free(ruby_inplace_mode); + ruby_inplace_mode = strdup(s+1); + break; + + case 'x': + xflag = Qtrue; + s++; + if (*s && chdir(s) < 0) { + rb_fatal("Can't chdir to %s", s); + } + break; + + case 'C': + case 'X': + s++; + if (!*s) { + s = argv[1]; + argc--,argv++; + } + if (!s || !*s) { + rb_fatal("Can't chdir"); + } + if (chdir(s) < 0) { + rb_fatal("Can't chdir to %s", s); + } + break; + + case 'F': + if (*++s) { + rb_fs = rb_reg_new(s, strlen(s), 0); + } + break; + + case 'K': + if (*++s) { + rb_set_kcode(s); + s++; + } + goto reswitch; + + case 'T': + { + int numlen; + int v = 1; + + if (*++s) { + v = scan_oct(s, 2, &numlen); + if (numlen == 0) v = 1; + s += numlen; + } + rb_set_safe_level(v); + } + goto reswitch; + + case 'I': + forbid_setid("-I"); + if (*++s) + ruby_incpush(s); + else if (argv[1]) { + ruby_incpush(argv[1]); + argc--,argv++; + } + break; + + case '0': + { + int numlen; + int v; + char c; + + v = scan_oct(s, 4, &numlen); + s += numlen; + if (v > 0377) rb_rs = Qnil; + else if (v == 0 && numlen >= 2) { + rb_rs = rb_str_new2("\n\n"); + } + else { + c = v & 0xff; + rb_rs = rb_str_new(&c, 1); + } + } + goto reswitch; + + case '-': + if (!s[1] || (s[1] == '\r' && !s[2])) { + argc--,argv++; + goto switch_end; + } + s++; + if (strcmp("copyright", s) == 0) + copyright = 1; + else if (strcmp("debug", s) == 0) { + ruby_debug = Qtrue; + ruby_verbose = Qtrue; + } + else if (strcmp("version", s) == 0) + version = 1; + else if (strcmp("verbose", s) == 0) { + verbose = 1; + ruby_verbose = Qtrue; + } + else if (strcmp("yydebug", s) == 0) + ruby_yydebug = 1; + else if (strcmp("help", s) == 0) { + usage(origargv[0]); + exit(0); + } + else { + fprintf(stderr, "%s: invalid option --%s (-h will show valid options)\n", + origargv[0], s); + exit(2); + } + break; + + case '\r': + if (!s[1]) break; + + default: + { + const char *format; + if (ISPRINT(*s)) { + format = "%s: invalid option -%c (-h will show valid options)\n"; + } + else { + format = "%s: invalid option -\\%03o (-h will show valid options)\n"; + } + fprintf(stderr, format, origargv[0], (int)(unsigned char)*s); + } + exit(2); + + case 0: + break; + } + } + + switch_end: + if (argv0 == 0) return; + + if (rb_safe_level() == 0 && (s = getenv("RUBYOPT"))) { + while (ISSPACE(*s)) s++; + if (*s == 'T' || (*s == '-' && *(s+1) == 'T')) { + int numlen; + int v = 1; + + if (*s != 'T') ++s; + if (*++s) { + v = scan_oct(s, 2, &numlen); + if (numlen == 0) v = 1; + } + rb_set_safe_level(v); + } + else { + while (s && *s) { + if (*s == '-') { + s++; + if (ISSPACE(*s)) { + do {s++;} while (ISSPACE(*s)); + continue; + } + } + if (!*s) break; + if (!strchr("IdvwWrK", *s)) + rb_raise(rb_eRuntimeError, "illegal switch in RUBYOPT: -%c", *s); + s = moreswitches(s); + } + } + } + + if (version) { + ruby_show_version(); + exit(0); + } + if (copyright) { + ruby_show_copyright(); + } + + if (rb_safe_level() >= 4) { + OBJ_TAINT(rb_argv); + OBJ_TAINT(rb_load_path); + } + + if (!e_script) { + if (argc == 0) { /* no more args */ + if (verbose) exit(0); + script = "-"; + } + else { + script = argv[0]; + if (script[0] == '\0') { + script = "-"; + } + else if (do_search) { + char *path = getenv("RUBYPATH"); + + script = 0; + if (path) { + script = dln_find_file(argv[0], path); + } + if (!script) { + script = dln_find_file(argv[0], getenv(PATH_ENV)); + } + if (!script) script = argv[0]; + script = ruby_sourcefile = rb_source_filename(script); + script_node = NEW_NEWLINE(0); + } +#if defined DOSISH || defined __CYGWIN__ + translate_char(script, '\\', '/'); +#endif + argc--; argv++; + } + } + + ruby_script(script); + ruby_set_argv(argc, argv); + process_sflag(); + + ruby_init_loadpath(); + ruby_sourcefile = rb_source_filename(argv0); + if (e_script) { + require_libraries(); + rb_compile_string(script, e_script, 1); + } + else if (strlen(script) == 1 && script[0] == '-') { + load_stdin(); + } + else { + load_file(script, 1); + } + + process_sflag(); + xflag = 0; + + if (rb_safe_level() >= 4) { + FL_UNSET(rb_argv, FL_TAINT); + FL_UNSET(rb_load_path, FL_TAINT); + } +} + +extern int ruby__end__seen; + +static void +load_file(fname, script) + const char *fname; + int script; +{ + extern VALUE rb_stdin; + VALUE f; + int line_start = 1; + + if (!fname) rb_load_fail(fname); + if (strcmp(fname, "-") == 0) { + f = rb_stdin; + } + else { + FILE *fp = fopen(fname, "r"); + + if (fp == NULL) { + rb_load_fail(fname); + } + fclose(fp); + + f = rb_file_open(fname, "r"); +#if defined DOSISH || defined __CYGWIN__ + { + char *ext = strrchr(fname, '.'); + if (ext && strcasecmp(ext, ".exe") == 0) + rb_io_binmode(f); + } +#endif + } + + if (script) { + VALUE c = 1; /* something not nil */ + VALUE line; + char *p; + + if (xflag) { + forbid_setid("-x"); + xflag = Qfalse; + while (!NIL_P(line = rb_io_gets(f))) { + line_start++; + if (RSTRING(line)->len > 2 + && RSTRING(line)->ptr[0] == '#' + && RSTRING(line)->ptr[1] == '!') { + if ((p = strstr(RSTRING(line)->ptr, "ruby")) != 0) { + goto start_read; + } + } + } + rb_raise(rb_eLoadError, "no Ruby script found in input"); + } + + c = rb_io_getc(f); + if (c == INT2FIX('#')) { + line = rb_io_gets(f); + if (NIL_P(line)) return; + line_start++; + + if (RSTRING(line)->len > 2 && RSTRING(line)->ptr[0] == '!') { + if ((p = strstr(RSTRING(line)->ptr, "ruby")) == 0) { + /* not ruby script, kick the program */ + char **argv; + char *path; + char *pend = RSTRING(line)->ptr + RSTRING(line)->len; + + p = RSTRING(line)->ptr + 1; /* skip `#!' */ + if (pend[-1] == '\n') pend--; /* chomp line */ + if (pend[-1] == '\r') pend--; + *pend = '\0'; + while (p < pend && ISSPACE(*p)) + p++; + path = p; /* interpreter path */ + while (p < pend && !ISSPACE(*p)) + p++; + *p++ = '\0'; + if (p < pend) { + argv = ALLOCA_N(char*, origargc+3); + argv[1] = p; + MEMCPY(argv+2, origargv+1, char*, origargc); + } + else { + argv = origargv; + } + argv[0] = path; + execv(path, argv); + + ruby_sourcefile = rb_source_filename(fname); + ruby_sourceline = 1; + rb_fatal("Can't exec %s", path); + } + + start_read: + p += 4; + RSTRING(line)->ptr[RSTRING(line)->len-1] = '\0'; + if (RSTRING(line)->ptr[RSTRING(line)->len-2] == '\r') + RSTRING(line)->ptr[RSTRING(line)->len-2] = '\0'; + if ((p = strstr(p, " -")) != 0) { + p++; /* skip space before `-' */ + while (*p == '-') { + p = moreswitches(p+1); + } + } + } + } + else if (!NIL_P(c)) { + rb_io_ungetc(f, c); + } + require_libraries(); /* Why here? unnatural */ + if (NIL_P(c)) return; + } + rb_compile_file(fname, f, line_start); + if (script && ruby__end__seen) { + rb_define_global_const("DATA", f); + } + else if (f != rb_stdin) { + rb_io_close(f); + } + + if (ruby_parser_stack_on_heap()) { + rb_gc(); + } +} + +void +rb_load_file(fname) + const char *fname; +{ + load_file(fname, 0); +} + +static void +load_stdin() +{ + forbid_setid("program input from stdin"); + load_file("-", 1); +} + +VALUE rb_progname; +VALUE rb_argv; +VALUE rb_argv0; + +#if defined(PSTAT_SETCMD) || defined(HAVE_SETPROCTITLE) +#elif defined(_WIN32) +#elif defined(HAVE_SETENV) && defined(HAVE_UNSETENV) +#else +#define USE_ENVSPACE_FOR_ARG0 +#endif + +#ifdef USE_ENVSPACE_FOR_ARG0 +static struct { + char *begin, *end; +} envspace; +extern char **environ; + +static void +set_arg0space() +{ + char *s; + int i; + + if (!environ || (s = environ[0]) == NULL) return; + envspace.begin = s; + s += strlen(s); + for (i = 1; environ[i]; i++) { + if (environ[i] == s + 1) { + s++; + s += strlen(s); /* this one is ok too */ + } + } + envspace.end = s; +} +#else +#define set_arg0space() ((void)0) +#endif + +static int +get_arglen(int argc, char **argv) +{ + char *s = argv[0]; + int i; + + if (!argc) return 0; + s += strlen(s); + /* See if all the arguments are contiguous in memory */ + for (i = 1; i < argc; i++) { + if (argv[i] == s + 1) { + s++; + s += strlen(s); /* this one is ok too */ + } + else { + break; + } + } +#if defined(USE_ENVSPACE_FOR_ARG0) + if (environ && (s == environ[0])) { + s += strlen(s); + for (i = 1; environ[i]; i++) { + if (environ[i] == s + 1) { + s++; + s += strlen(s); /* this one is ok too */ + } + } + ruby_setenv("", NULL); /* duplicate environ vars */ + } +#endif + return s - argv[0]; +} + +static void +set_arg0(val, id) + VALUE val; + ID id; +{ + VALUE progname; + char *s; + long i; + int j; +#if !defined(PSTAT_SETCMD) && !defined(HAVE_SETPROCTITLE) + static int len = 0; +#endif + + if (origargv == 0) rb_raise(rb_eRuntimeError, "$0 not initialized"); + StringValue(val); + s = RSTRING(val)->ptr; + i = RSTRING(val)->len; +#if defined(PSTAT_SETCMD) + if (i >= PST_CLEN) { + union pstun j; + j.pst_command = s; + i = PST_CLEN; + RSTRING(val)->len = i; + *(s + i) = '\0'; + pstat(PSTAT_SETCMD, j, PST_CLEN, 0, 0); + } + else { + union pstun j; + j.pst_command = s; + pstat(PSTAT_SETCMD, j, i, 0, 0); + } + progname = rb_tainted_str_new(s, i); +#elif defined(HAVE_SETPROCTITLE) + setproctitle("%.*s", (int)i, s); + progname = rb_tainted_str_new(s, i); +#else + if (len == 0) { + len = get_arglen(origargc, origargv); + } + + if (i >= len) { + i = len; + } + memcpy(origargv[0], s, i); + s = origargv[0] + i; + *s = '\0'; + if (++i < len) memset(s + 1, ' ', len - i); + for (i = len-1, j = origargc-1; j > 0 && i >= 0; --i, --j) { + origargv[j] = origargv[0] + i; + *origargv[j] = '\0'; + } + progname = rb_tainted_str_new2(origargv[0]); +#endif + rb_progname = rb_obj_freeze(progname); +} + +void +ruby_script(name) + const char *name; +{ + if (name) { + rb_progname = rb_obj_freeze(rb_tainted_str_new2(name)); + ruby_sourcefile = rb_source_filename(name); + } +} + +static int uid, euid, gid, egid; + +static void +init_ids() +{ + uid = (int)getuid(); + euid = (int)geteuid(); + gid = (int)getgid(); + egid = (int)getegid(); +#ifdef VMS + uid |= gid << 16; + euid |= egid << 16; +#endif + if (uid && (euid != uid || egid != gid)) { + rb_set_safe_level(1); + } +} + +static void +forbid_setid(s) + const char *s; +{ + if (euid != uid) + rb_raise(rb_eSecurityError, "no %s allowed while running setuid", s); + if (egid != gid) + rb_raise(rb_eSecurityError, "no %s allowed while running setgid", s); + if (rb_safe_level() > 0) + rb_raise(rb_eSecurityError, "no %s allowed in tainted mode", s); +} + +static void +verbose_setter(val, id, variable) + VALUE val; + ID id; + VALUE *variable; +{ + ruby_verbose = RTEST(val) ? Qtrue : val; +} + +void +ruby_prog_init() +{ + init_ids(); + + ruby_sourcefile = rb_source_filename("ruby"); + rb_define_hooked_variable("$VERBOSE", &ruby_verbose, 0, verbose_setter); + rb_define_hooked_variable("$-v", &ruby_verbose, 0, verbose_setter); + rb_define_hooked_variable("$-w", &ruby_verbose, 0, verbose_setter); + rb_define_variable("$DEBUG", &ruby_debug); + rb_define_variable("$-d", &ruby_debug); + rb_define_readonly_variable("$-p", &do_print); + rb_define_readonly_variable("$-l", &do_line); + + rb_define_hooked_variable("$0", &rb_progname, 0, set_arg0); + rb_define_hooked_variable("$PROGRAM_NAME", &rb_progname, 0, set_arg0); + + rb_define_readonly_variable("$*", &rb_argv); + rb_argv = rb_ary_new(); + rb_define_global_const("ARGV", rb_argv); + rb_define_readonly_variable("$-a", &do_split); + rb_global_variable(&rb_argv0); + +#ifdef MSDOS + /* + * There is no way we can refer to them from ruby, so close them to save + * space. + */ + (void)fclose(stdaux); + (void)fclose(stdprn); +#endif +} + +void +ruby_set_argv(argc, argv) + int argc; + char **argv; +{ + int i; + +#if defined(USE_DLN_A_OUT) + if (origargv) dln_argv0 = origargv[0]; + else dln_argv0 = argv[0]; +#endif + rb_ary_clear(rb_argv); + for (i=0; i < argc; i++) { + VALUE arg = rb_tainted_str_new2(argv[i]); + + OBJ_FREEZE(arg); + rb_ary_push(rb_argv, arg); + } +} + +void +ruby_process_options(argc, argv) + int argc; + char **argv; +{ + origargc = argc; origargv = argv; + + ruby_script(argv[0]); /* for the time being */ + rb_argv0 = rb_progname; +#if defined(USE_DLN_A_OUT) + dln_argv0 = argv[0]; +#endif + set_arg0space(); + proc_options(argc, argv); + + if (do_check && ruby_nerrs == 0) { + printf("Syntax OK\n"); + exit(0); + } + if (do_print) { + rb_parser_append_print(); + } + if (do_loop) { + rb_parser_while_loop(do_line, do_split); + } +} +/********************************************************************** + + signal.c - + + $Author: shyouhei $ + $Date: 2008-06-29 09:52:47 +0200 (Sun, 29 Jun 2008) $ + created at: Tue Dec 20 10:13:44 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "rubysig.h" +#include <signal.h> +#include <stdio.h> + +#ifdef __BEOS__ +#undef SIGBUS +#endif + +#if defined HAVE_SIGPROCMASK || defined HAVE_SIGSETMASK +#define USE_TRAP_MASK 1 +#else +#define USE_TRAP_MASK 0 +#endif + +#ifndef NSIG +# ifdef DJGPP +# define NSIG SIGMAX +# else +# define NSIG (_SIGMAX + 1) /* For QNX */ +# endif +#endif + +static struct signals { + char *signm; + int signo; +} siglist [] = { + {"EXIT", 0}, +#ifdef SIGHUP + {"HUP", SIGHUP}, +#endif + {"INT", SIGINT}, +#ifdef SIGQUIT + {"QUIT", SIGQUIT}, +#endif +#ifdef SIGILL + {"ILL", SIGILL}, +#endif +#ifdef SIGTRAP + {"TRAP", SIGTRAP}, +#endif +#ifdef SIGIOT + {"IOT", SIGIOT}, +#endif +#ifdef SIGABRT + {"ABRT", SIGABRT}, +#endif +#ifdef SIGEMT + {"EMT", SIGEMT}, +#endif +#ifdef SIGFPE + {"FPE", SIGFPE}, +#endif +#ifdef SIGKILL + {"KILL", SIGKILL}, +#endif +#ifdef SIGBUS + {"BUS", SIGBUS}, +#endif +#ifdef SIGSEGV + {"SEGV", SIGSEGV}, +#endif +#ifdef SIGSYS + {"SYS", SIGSYS}, +#endif +#ifdef SIGPIPE + {"PIPE", SIGPIPE}, +#endif +#ifdef SIGALRM + {"ALRM", SIGALRM}, +#endif +#ifdef SIGTERM + {"TERM", SIGTERM}, +#endif +#ifdef SIGURG + {"URG", SIGURG}, +#endif +#ifdef SIGSTOP + {"STOP", SIGSTOP}, +#endif +#ifdef SIGTSTP + {"TSTP", SIGTSTP}, +#endif +#ifdef SIGCONT + {"CONT", SIGCONT}, +#endif +#ifdef SIGCHLD + {"CHLD", SIGCHLD}, +#endif +#ifdef SIGCLD + {"CLD", SIGCLD}, +#else +# ifdef SIGCHLD + {"CLD", SIGCHLD}, +# endif +#endif +#ifdef SIGTTIN + {"TTIN", SIGTTIN}, +#endif +#ifdef SIGTTOU + {"TTOU", SIGTTOU}, +#endif +#ifdef SIGIO + {"IO", SIGIO}, +#endif +#ifdef SIGXCPU + {"XCPU", SIGXCPU}, +#endif +#ifdef SIGXFSZ + {"XFSZ", SIGXFSZ}, +#endif +#ifdef SIGVTALRM + {"VTALRM", SIGVTALRM}, +#endif +#ifdef SIGPROF + {"PROF", SIGPROF}, +#endif +#ifdef SIGWINCH + {"WINCH", SIGWINCH}, +#endif +#ifdef SIGUSR1 + {"USR1", SIGUSR1}, +#endif +#ifdef SIGUSR2 + {"USR2", SIGUSR2}, +#endif +#ifdef SIGLOST + {"LOST", SIGLOST}, +#endif +#ifdef SIGMSG + {"MSG", SIGMSG}, +#endif +#ifdef SIGPWR + {"PWR", SIGPWR}, +#endif +#ifdef SIGPOLL + {"POLL", SIGPOLL}, +#endif +#ifdef SIGDANGER + {"DANGER", SIGDANGER}, +#endif +#ifdef SIGMIGRATE + {"MIGRATE", SIGMIGRATE}, +#endif +#ifdef SIGPRE + {"PRE", SIGPRE}, +#endif +#ifdef SIGGRANT + {"GRANT", SIGGRANT}, +#endif +#ifdef SIGRETRACT + {"RETRACT", SIGRETRACT}, +#endif +#ifdef SIGSOUND + {"SOUND", SIGSOUND}, +#endif +#ifdef SIGINFO + {"INFO", SIGINFO}, +#endif + {NULL, 0} +}; + +static int +signm2signo(nm) + const char *nm; +{ + struct signals *sigs; + + for (sigs = siglist; sigs->signm; sigs++) + if (strcmp(sigs->signm, nm) == 0) + return sigs->signo; + return 0; +} + +static char* +signo2signm(no) + int no; +{ + struct signals *sigs; + + for (sigs = siglist; sigs->signm; sigs++) + if (sigs->signo == no) + return sigs->signm; + return 0; +} + +const char * +ruby_signal_name(no) + int no; +{ + return signo2signm(no); +} + +/* + * call-seq: + * SignalException.new(sig) => signal_exception + * + * Construct a new SignalException object. +sig+ should be a known + * signal name, or a signal number. + */ + +static VALUE +esignal_init(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + int argnum = 1; + VALUE sig = Qnil; + int signo; + const char *signm; + char tmpnm[(sizeof(int)*CHAR_BIT)/3+4]; + + if (argc > 0) { + sig = argv[0]; + if (FIXNUM_P(sig)) argnum = 2; + } + if (argc < 1 || argnum < argc) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", + argc, argnum); + } + if (argnum == 2) { + signo = FIX2INT(sig); + if (signo < 0 || signo > NSIG) { + rb_raise(rb_eArgError, "invalid signal number (%d)", signo); + } + if (argc > 1) { + sig = argv[1]; + } + else { + signm = signo2signm(signo); + if (signm) { + snprintf(tmpnm, sizeof(tmpnm), "SIG%s", signm); + } + else { + snprintf(tmpnm, sizeof(tmpnm), "SIG%u", signo); + } + sig = rb_str_new2(signm = tmpnm); + } + } + else { + signm = SYMBOL_P(sig) ? rb_id2name(SYM2ID(sig)) : StringValuePtr(sig); + if (strncmp(signm, "SIG", 3) == 0) signm += 3; + signo = signm2signo(signm); + if (!signo) { + rb_raise(rb_eArgError, "unsupported name `SIG%s'", signm); + } + if (SYMBOL_P(sig)) { + sig = rb_str_new2(signm); + } + } + rb_call_super(1, &sig); + rb_iv_set(self, "signo", INT2NUM(signo)); + + return self; +} + +static VALUE +interrupt_init(self, mesg) + VALUE self, mesg; +{ + VALUE argv[2]; + + argv[0] = INT2FIX(SIGINT); + argv[1] = mesg; + return rb_call_super(2, argv); +} + +void +ruby_default_signal(sig) + int sig; +{ +#ifndef MACOS_UNUSE_SIGNAL + extern rb_pid_t getpid _((void)); + + signal(sig, SIG_DFL); + kill(getpid(), sig); +#endif +} + +/* + * call-seq: + * Process.kill(signal, pid, ...) => fixnum + * + * Sends the given signal to the specified process id(s), or to the + * current process if _pid_ is zero. _signal_ may be an + * integer signal number or a POSIX signal name (either with or without + * a +SIG+ prefix). If _signal_ is negative (or starts + * with a minus sign), kills process groups instead of + * processes. Not all signals are available on all platforms. + * + * pid = fork do + * Signal.trap("HUP") { puts "Ouch!"; exit } + * # ... do some work ... + * end + * # ... + * Process.kill("HUP", pid) + * Process.wait + * + * <em>produces:</em> + * + * Ouch! + */ + +VALUE +rb_f_kill(argc, argv) + int argc; + VALUE *argv; +{ + int negative = 0; + int sig; + int i; + char *s; + + rb_secure(2); + if (argc < 2) + rb_raise(rb_eArgError, "wrong number of arguments -- kill(sig, pid...)"); + switch (TYPE(argv[0])) { + case T_FIXNUM: + sig = FIX2INT(argv[0]); + break; + + case T_SYMBOL: + s = rb_id2name(SYM2ID(argv[0])); + if (!s) rb_raise(rb_eArgError, "bad signal"); + goto str_signal; + + case T_STRING: + s = RSTRING(argv[0])->ptr; + if (s[0] == '-') { + negative++; + s++; + } + str_signal: + if (strncmp("SIG", s, 3) == 0) + s += 3; + if((sig = signm2signo(s)) == 0) + rb_raise(rb_eArgError, "unsupported name `SIG%s'", s); + + if (negative) + sig = -sig; + break; + + default: + { + VALUE str; + + str = rb_check_string_type(argv[0]); + if (!NIL_P(str)) { + s = RSTRING(str)->ptr; + goto str_signal; + } + rb_raise(rb_eArgError, "bad signal type %s", + rb_obj_classname(argv[0])); + } + break; + } + + if (sig < 0) { + sig = -sig; + for (i=1; i<argc; i++) { + int pid = NUM2INT(argv[i]); +#ifdef HAS_KILLPG + if (killpg(pid, sig) < 0) +#else + if (kill(-pid, sig) < 0) +#endif + rb_sys_fail(0); + } + } + else { + for (i=1; i<argc; i++) { + Check_Type(argv[i], T_FIXNUM); + if (kill(FIX2INT(argv[i]), sig) < 0) + rb_sys_fail(0); + } + } + return INT2FIX(i-1); +} + +static struct { + VALUE cmd; + int safe; +} trap_list[NSIG]; +static rb_atomic_t trap_pending_list[NSIG]; +static char rb_trap_accept_nativethreads[NSIG]; +rb_atomic_t rb_trap_pending; +rb_atomic_t rb_trap_immediate; +int rb_prohibit_interrupt = 1; + +void +rb_gc_mark_trap_list() +{ +#ifndef MACOS_UNUSE_SIGNAL + int i; + + for (i=0; i<NSIG; i++) { + if (trap_list[i].cmd) + rb_gc_mark(trap_list[i].cmd); + } +#endif /* MACOS_UNUSE_SIGNAL */ +} + +#ifdef __dietlibc__ +#define sighandler_t sh_t +#endif + +typedef RETSIGTYPE (*sighandler_t)_((int)); + +#ifdef POSIX_SIGNAL +static sighandler_t +ruby_signal(signum, handler) + int signum; + sighandler_t handler; +{ + struct sigaction sigact, old; + + rb_trap_accept_nativethreads[signum] = 0; + + sigact.sa_handler = handler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; +# ifdef SA_NOCLDWAIT + if (signum == SIGCHLD && handler == SIG_IGN) + sigact.sa_flags |= SA_NOCLDWAIT; +# endif + sigaction(signum, &sigact, &old); + return old.sa_handler; +} + +void +posix_signal(signum, handler) + int signum; + sighandler_t handler; +{ + ruby_signal(signum, handler); +} + +# ifdef HAVE_NATIVETHREAD +static sighandler_t +ruby_nativethread_signal(signum, handler) + int signum; + sighandler_t handler; +{ + sighandler_t old; + + old = ruby_signal(signum, handler); + rb_trap_accept_nativethreads[signum] = 1; + return old; +} + +void +posix_nativethread_signal(signum, handler) + int signum; + sighandler_t handler; +{ + ruby_nativethread_signal(signum, handler); +} +# endif + +#else /* !POSIX_SIGNAL */ +#define ruby_signal(sig,handler) (rb_trap_accept_nativethreads[sig] = 0, signal((sig),(handler))) + +# ifdef HAVE_NATIVETHREAD +static sighandler_t +ruby_nativethread_signal(signum, handler) + int signum; + sighandler_t handler; +{ + sighandler_t old; + + old = signal(signum, handler); + rb_trap_accept_nativethreads[signum] = 1; + return old; +} +# endif +#endif /* POSIX_SIGNAL */ + +static void signal_exec _((int sig)); +static void +signal_exec(sig) + int sig; +{ + if (trap_list[sig].cmd == 0) { + switch (sig) { + case SIGINT: + rb_thread_interrupt(); + break; +#ifdef SIGHUP + case SIGHUP: +#endif +#ifdef SIGQUIT + case SIGQUIT: +#endif +#ifdef SIGTERM + case SIGTERM: +#endif +#ifdef SIGALRM + case SIGALRM: +#endif +#ifdef SIGUSR1 + case SIGUSR1: +#endif +#ifdef SIGUSR2 + case SIGUSR2: +#endif + rb_thread_signal_raise(sig); + break; + } + } + else if (trap_list[sig].cmd == Qundef) { + rb_thread_signal_exit(); + } + else { + rb_thread_trap_eval(trap_list[sig].cmd, sig, trap_list[sig].safe); + } +} + +#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL) +static void +sigsend_to_ruby_thread(int sig) +{ +# ifdef HAVE_SIGPROCMASK + sigset_t mask, old_mask; +# else + int mask, old_mask; +# endif + +# ifdef HAVE_SIGPROCMASK + sigfillset(&mask); + sigprocmask(SIG_BLOCK, &mask, &old_mask); +# else + mask = sigblock(~0); + sigsetmask(mask); +# endif + + ruby_native_thread_kill(sig); +} +#endif + +static RETSIGTYPE sighandler _((int)); +static RETSIGTYPE +sighandler(sig) + int sig; +{ +#ifdef _WIN32 +#define IN_MAIN_CONTEXT(f, a) (rb_w32_main_context(a, f) ? (void)0 : f(a)) +#else +#define IN_MAIN_CONTEXT(f, a) f(a) +#endif + + if (sig >= NSIG) { + rb_bug("trap_handler: Bad signal %d", sig); + } + +#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL) + if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) { + sigsend_to_ruby_thread(sig); + return; + } +#endif + +#if !defined(BSD_SIGNAL) && !defined(POSIX_SIGNAL) + if (rb_trap_accept_nativethreads[sig]) { + ruby_nativethread_signal(sig, sighandler); + } + else { + ruby_signal(sig, sighandler); + } +#endif + + if (trap_list[sig].cmd == 0 && ATOMIC_TEST(rb_trap_immediate)) { + IN_MAIN_CONTEXT(signal_exec, sig); + ATOMIC_SET(rb_trap_immediate, 1); + } + else { + ATOMIC_INC(rb_trap_pending); + ATOMIC_INC(trap_pending_list[sig]); +#ifdef _WIN32 + rb_w32_interrupted(); +#endif + } +} + +#ifdef SIGBUS +static RETSIGTYPE sigbus _((int)); +static RETSIGTYPE +sigbus(sig) + int sig; +{ +#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL) + if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) { + sigsend_to_ruby_thread(sig); + return; + } +#endif + + rb_bug("Bus Error"); +} +#endif + +#ifdef SIGSEGV +static RETSIGTYPE sigsegv _((int)); +static RETSIGTYPE +sigsegv(sig) + int sig; +{ +#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL) + if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) { + sigsend_to_ruby_thread(sig); + return; + } +#endif + + rb_bug("Segmentation fault"); +} +#endif + +#ifdef SIGPIPE +static RETSIGTYPE sigpipe _((int)); +static RETSIGTYPE +sigpipe(sig) + int sig; +{ + /* do nothing */ +} +#endif + +void +rb_trap_exit() +{ +#ifndef MACOS_UNUSE_SIGNAL + if (trap_list[0].cmd) { + VALUE trap_exit = trap_list[0].cmd; + + trap_list[0].cmd = 0; + rb_eval_cmd(trap_exit, rb_ary_new3(1, INT2FIX(0)), trap_list[0].safe); + } +#endif +} + +void +rb_trap_exec() +{ +#ifndef MACOS_UNUSE_SIGNAL + int i; + + for (i=0; i<NSIG; i++) { + if (trap_pending_list[i]) { + trap_pending_list[i] = 0; + signal_exec(i); + } + } +#endif /* MACOS_UNUSE_SIGNAL */ + rb_trap_pending = 0; +} + +struct trap_arg { +#if USE_TRAP_MASK +# ifdef HAVE_SIGPROCMASK + sigset_t mask; +# else + int mask; +# endif +#endif + VALUE sig, cmd; +}; + +# ifdef HAVE_SIGPROCMASK +static sigset_t trap_last_mask; +# else +static int trap_last_mask; +# endif + +static RETSIGTYPE sigexit _((int)); +static RETSIGTYPE +sigexit(sig) + int sig; +{ + rb_thread_signal_exit(); +} + +static VALUE +trap(arg) + struct trap_arg *arg; +{ + sighandler_t func, oldfunc; + VALUE command, oldcmd; + int sig = -1; + char *s; + + func = sighandler; + command = arg->cmd; + if (NIL_P(command)) { + func = SIG_IGN; + } + else if (TYPE(command) == T_STRING) { + SafeStringValue(command); /* taint check */ + if (RSTRING(command)->len == 0) { + func = SIG_IGN; + } + else if (RSTRING(command)->len == 7) { + if (strncmp(RSTRING(command)->ptr, "SIG_IGN", 7) == 0) { + func = SIG_IGN; + } + else if (strncmp(RSTRING(command)->ptr, "SIG_DFL", 7) == 0) { + func = SIG_DFL; + } + else if (strncmp(RSTRING(command)->ptr, "DEFAULT", 7) == 0) { + func = SIG_DFL; + } + } + else if (RSTRING(command)->len == 6) { + if (strncmp(RSTRING(command)->ptr, "IGNORE", 6) == 0) { + func = SIG_IGN; + } + } + else if (RSTRING(command)->len == 4) { + if (strncmp(RSTRING(command)->ptr, "EXIT", 4) == 0) { + func = sigexit; + } + } + } + if (func == SIG_IGN || func == SIG_DFL) { + command = 0; + } + + switch (TYPE(arg->sig)) { + case T_FIXNUM: + sig = FIX2INT(arg->sig); + break; + + case T_SYMBOL: + s = rb_id2name(SYM2ID(arg->sig)); + if (!s) rb_raise(rb_eArgError, "bad signal"); + goto str_signal; + + case T_STRING: + s = RSTRING(arg->sig)->ptr; + + str_signal: + if (strncmp("SIG", s, 3) == 0) + s += 3; + sig = signm2signo(s); + if (sig == 0 && strcmp(s, "EXIT") != 0) + rb_raise(rb_eArgError, "unsupported signal SIG%s", s); + } + + if (sig < 0 || sig >= NSIG) { + rb_raise(rb_eArgError, "invalid signal number (%d)", sig); + } +#if defined(HAVE_SETITIMER) + if (sig == SIGVTALRM) { + rb_raise(rb_eArgError, "SIGVTALRM reserved for Thread; can't set handler"); + } +#endif + if (func == SIG_DFL) { + switch (sig) { + case SIGINT: +#ifdef SIGHUP + case SIGHUP: +#endif +#ifdef SIGQUIT + case SIGQUIT: +#endif +#ifdef SIGTERM + case SIGTERM: +#endif +#ifdef SIGALRM + case SIGALRM: +#endif +#ifdef SIGUSR1 + case SIGUSR1: +#endif +#ifdef SIGUSR2 + case SIGUSR2: +#endif + func = sighandler; + break; +#ifdef SIGBUS + case SIGBUS: + func = sigbus; + break; +#endif +#ifdef SIGSEGV + case SIGSEGV: + func = sigsegv; + break; +#endif +#ifdef SIGPIPE + case SIGPIPE: + func = sigpipe; + break; +#endif + } + } + oldfunc = ruby_signal(sig, func); + oldcmd = trap_list[sig].cmd; + if (!oldcmd) { + if (oldfunc == SIG_IGN) oldcmd = rb_str_new2("IGNORE"); + else if (oldfunc == sighandler) oldcmd = rb_str_new2("DEFAULT"); + else oldcmd = Qnil; + } + + trap_list[sig].cmd = command; + trap_list[sig].safe = ruby_safe_level; + /* enable at least specified signal. */ +#if USE_TRAP_MASK +#ifdef HAVE_SIGPROCMASK + sigdelset(&arg->mask, sig); +#else + arg->mask &= ~sigmask(sig); +#endif +#endif + return oldcmd; +} + +#if USE_TRAP_MASK +static VALUE +trap_ensure(arg) + struct trap_arg *arg; +{ + /* enable interrupt */ +#ifdef HAVE_SIGPROCMASK + sigprocmask(SIG_SETMASK, &arg->mask, NULL); +#else + sigsetmask(arg->mask); +#endif + trap_last_mask = arg->mask; + return 0; +} +#endif + +void +rb_trap_restore_mask() +{ +#if USE_TRAP_MASK +# ifdef HAVE_SIGPROCMASK + sigprocmask(SIG_SETMASK, &trap_last_mask, NULL); +# else + sigsetmask(trap_last_mask); +# endif +#endif +} + +/* + * call-seq: + * Signal.trap( signal, proc ) => obj + * Signal.trap( signal ) {| | block } => obj + * + * Specifies the handling of signals. The first parameter is a signal + * name (a string such as ``SIGALRM'', ``SIGUSR1'', and so on) or a + * signal number. The characters ``SIG'' may be omitted from the + * signal name. The command or block specifies code to be run when the + * signal is raised. If the command is the string ``IGNORE'' or + * ``SIG_IGN'', the signal will be ignored. If the command is + * ``DEFAULT'' or ``SIG_DFL'', the operating system's default handler + * will be invoked. If the command is ``EXIT'', the script will be + * terminated by the signal. Otherwise, the given command or block + * will be run. + * The special signal name ``EXIT'' or signal number zero will be + * invoked just prior to program termination. + * trap returns the previous handler for the given signal. + * + * Signal.trap(0, proc { puts "Terminating: #{$$}" }) + * Signal.trap("CLD") { puts "Child died" } + * fork && Process.wait + * + * produces: + * Terminating: 27461 + * Child died + * Terminating: 27460 + */ +static VALUE +sig_trap(argc, argv) + int argc; + VALUE *argv; +{ + struct trap_arg arg; + + rb_secure(2); + if (argc == 0 || argc > 2) { + rb_raise(rb_eArgError, "wrong number of arguments -- trap(sig, cmd)/trap(sig){...}"); + } + + arg.sig = argv[0]; + if (argc == 1) { + arg.cmd = rb_block_proc(); + } + else if (argc == 2) { + arg.cmd = argv[1]; + } + + if (OBJ_TAINTED(arg.cmd)) { + rb_raise(rb_eSecurityError, "Insecure: tainted signal trap"); + } +#if USE_TRAP_MASK + /* disable interrupt */ +# ifdef HAVE_SIGPROCMASK + sigfillset(&arg.mask); + sigprocmask(SIG_BLOCK, &arg.mask, &arg.mask); +# else + arg.mask = sigblock(~0); +# endif + + return rb_ensure(trap, (VALUE)&arg, trap_ensure, (VALUE)&arg); +#else + return trap(&arg); +#endif +} + +/* + * call-seq: + * Signal.list => a_hash + * + * Returns a list of signal names mapped to the corresponding + * underlying signal numbers. + * + * Signal.list #=> {"ABRT"=>6, "ALRM"=>14, "BUS"=>7, "CHLD"=>17, "CLD"=>17, "CONT"=>18, "FPE"=>8, "HUP"=>1, "ILL"=>4, "INT"=>2, "IO"=>29, "IOT"=>6, "KILL"=>9, "PIPE"=>13, "POLL"=>29, "PROF"=>27, "PWR"=>30, "QUIT"=>3, "SEGV"=>11, "STOP"=>19, "SYS"=>31, "TERM"=>15, "TRAP"=>5, "TSTP"=>20, "TTIN"=>21, "TTOU"=>22, "URG"=>23, "USR1"=>10, "USR2"=>12, "VTALRM"=>26, "WINCH"=>28, "XCPU"=>24, "XFSZ"=>25} + */ +static VALUE +sig_list() +{ + VALUE h = rb_hash_new(); + struct signals *sigs; + + for (sigs = siglist; sigs->signm; sigs++) { + rb_hash_aset(h, rb_str_new2(sigs->signm), INT2FIX(sigs->signo)); + } + return h; +} + +static void +install_sighandler(signum, handler) + int signum; + sighandler_t handler; +{ + sighandler_t old; + + old = ruby_signal(signum, handler); + if (old != SIG_DFL) { + ruby_signal(signum, old); + } +} + +#if 0 +/* + * If you write a handler which works on any native thread + * (even if the thread is NOT a ruby's one), please enable + * this function and use it to install the handler, instead + * of `install_sighandler()'. + */ +#ifdef HAVE_NATIVETHREAD +static void +install_nativethread_sighandler(signum, handler) + int signum; + sighandler_t handler; +{ + sighandler_t old; + int old_st; + + old_st = rb_trap_accept_nativethreads[signum]; + old = ruby_nativethread_signal(signum, handler); + if (old != SIG_DFL) { + if (old_st) { + ruby_nativethread_signal(signum, old); + } else { + ruby_signal(signum, old); + } + } +} +#endif +#endif + +static void +init_sigchld(sig) + int sig; +{ + sighandler_t oldfunc; +#if USE_TRAP_MASK +# ifdef HAVE_SIGPROCMASK + sigset_t mask; +# else + int mask; +# endif +#endif + +#if USE_TRAP_MASK + /* disable interrupt */ +# ifdef HAVE_SIGPROCMASK + sigfillset(&mask); + sigprocmask(SIG_BLOCK, &mask, &mask); +# else + mask = sigblock(~0); +# endif +#endif + + oldfunc = ruby_signal(sig, SIG_DFL); + if (oldfunc != SIG_DFL && oldfunc != SIG_IGN) { + ruby_signal(sig, oldfunc); + } else { + trap_list[sig].cmd = 0; + } + +#if USE_TRAP_MASK +#ifdef HAVE_SIGPROCMASK + sigdelset(&mask, sig); + sigprocmask(SIG_SETMASK, &mask, NULL); +#else + mask &= ~sigmask(sig); + sigsetmask(mask); +#endif + trap_last_mask = mask; +#endif +} + +/* + * Many operating systems allow signals to be sent to running + * processes. Some signals have a defined effect on the process, while + * others may be trapped at the code level and acted upon. For + * example, your process may trap the USR1 signal and use it to toggle + * debugging, and may use TERM to initiate a controlled shutdown. + * + * pid = fork do + * Signal.trap("USR1") do + * $debug = !$debug + * puts "Debug now: #$debug" + * end + * Signal.trap("TERM") do + * puts "Terminating..." + * shutdown() + * end + * # . . . do some work . . . + * end + * + * Process.detach(pid) + * + * # Controlling program: + * Process.kill("USR1", pid) + * # ... + * Process.kill("USR1", pid) + * # ... + * Process.kill("TERM", pid) + * + * produces: + * Debug now: true + * Debug now: false + * Terminating... + * + * The list of available signal names and their interpretation is + * system dependent. Signal delivery semantics may also vary between + * systems; in particular signal delivery may not always be reliable. + */ +void +Init_signal() +{ +#ifndef MACOS_UNUSE_SIGNAL + VALUE mSignal = rb_define_module("Signal"); + + rb_define_global_function("trap", sig_trap, -1); + rb_define_module_function(mSignal, "trap", sig_trap, -1); + rb_define_module_function(mSignal, "list", sig_list, 0); + + rb_define_method(rb_eSignal, "initialize", esignal_init, -1); + rb_attr(rb_eSignal, rb_intern("signo"), 1, 0, 0); + rb_alias(rb_eSignal, rb_intern("signm"), rb_intern("message")); + rb_define_method(rb_eInterrupt, "initialize", interrupt_init, 1); + + install_sighandler(SIGINT, sighandler); +#ifdef SIGHUP + install_sighandler(SIGHUP, sighandler); +#endif +#ifdef SIGQUIT + install_sighandler(SIGQUIT, sighandler); +#endif +#ifdef SIGTERM + install_sighandler(SIGTERM, sighandler); +#endif +#ifdef SIGALRM + install_sighandler(SIGALRM, sighandler); +#endif +#ifdef SIGUSR1 + install_sighandler(SIGUSR1, sighandler); +#endif +#ifdef SIGUSR2 + install_sighandler(SIGUSR2, sighandler); +#endif + +#ifdef SIGBUS + install_sighandler(SIGBUS, sigbus); +#endif +#ifdef SIGSEGV + install_sighandler(SIGSEGV, sigsegv); +#endif +#ifdef SIGPIPE + install_sighandler(SIGPIPE, sigpipe); +#endif + +#if defined(SIGCLD) + init_sigchld(SIGCLD); +#elif defined(SIGCHLD) + init_sigchld(SIGCHLD); +#endif + +#endif /* MACOS_UNUSE_SIGNAL */ +} +/********************************************************************** + + sprintf.c - + + $Author: shyouhei $ + $Date: 2008-06-20 01:12:46 +0200 (Fri, 20 Jun 2008) $ + created at: Fri Oct 15 10:39:26 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "re.h" +#include <ctype.h> +#include <math.h> + +#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */ +#define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT) +#define EXTENDSIGN(n, l) (((~0 << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0 << (n))) + +static void fmt_setup _((char*,int,int,int,int)); + +static char* +remove_sign_bits(str, base) + char *str; + int base; +{ + char *s, *t; + + s = t = str; + + if (base == 16) { + while (*t == 'f') { + t++; + } + } + else if (base == 8) { + *t |= EXTENDSIGN(3, strlen(t)); + while (*t == '7') { + t++; + } + } + else if (base == 2) { + while (*t == '1') { + t++; + } + } + if (t > s) { + while (*t) *s++ = *t++; + *s = '\0'; + } + + return str; +} + +static char +sign_bits(base, p) + int base; + const char *p; +{ + char c = '.'; + + switch (base) { + case 16: + if (*p == 'X') c = 'F'; + else c = 'f'; + break; + case 8: + c = '7'; break; + case 2: + c = '1'; break; + } + return c; +} + +#define FNONE 0 +#define FSHARP 1 +#define FMINUS 2 +#define FPLUS 4 +#define FZERO 8 +#define FSPACE 16 +#define FWIDTH 32 +#define FPREC 64 +#define FPREC0 128 + +#define CHECK(l) do {\ + while (blen + (l) >= bsiz) {\ + bsiz*=2;\ + }\ + rb_str_resize(result, bsiz);\ + buf = RSTRING(result)->ptr;\ +} while (0) + +#define PUSH(s, l) do { \ + CHECK(l);\ + memcpy(&buf[blen], s, l);\ + blen += (l);\ +} while (0) + +#define GETARG() (nextvalue != Qundef ? nextvalue : \ + posarg < 0 ? \ + (rb_raise(rb_eArgError, "unnumbered(%d) mixed with numbered", nextarg), 0) : \ + (posarg = nextarg++, GETNTHARG(posarg))) + +#define GETPOSARG(n) (posarg > 0 ? \ + (rb_raise(rb_eArgError, "numbered(%d) after unnumbered(%d)", n, posarg), 0) : \ + ((n < 1) ? (rb_raise(rb_eArgError, "invalid index - %d$", n), 0) : \ + (posarg = -1, GETNTHARG(n)))) + +#define GETNTHARG(nth) \ + ((nth >= argc) ? (rb_raise(rb_eArgError, "too few arguments"), 0) : argv[nth]) + +#define GETNUM(n, val) \ + for (; p < end && ISDIGIT(*p); p++) { \ + int next_n = 10 * n + (*p - '0'); \ + if (next_n / 10 != n) {\ + rb_raise(rb_eArgError, #val " too big"); \ + } \ + n = next_n; \ + } \ + if (p >= end) { \ + rb_raise(rb_eArgError, "malformed format string - %%*[0-9]"); \ + } + +#define GETASTER(val) do { \ + t = p++; \ + n = 0; \ + GETNUM(n, val); \ + if (*p == '$') { \ + tmp = GETPOSARG(n); \ + } \ + else { \ + tmp = GETARG(); \ + p = t; \ + } \ + val = NUM2INT(tmp); \ +} while (0) + + +/* + * call-seq: + * format(format_string [, arguments...] ) => string + * sprintf(format_string [, arguments...] ) => string + * + * Returns the string resulting from applying <i>format_string</i> to + * any additional arguments. Within the format string, any characters + * other than format sequences are copied to the result. A format + * sequence consists of a percent sign, followed by optional flags, + * width, and precision indicators, then terminated with a field type + * character. The field type controls how the corresponding + * <code>sprintf</code> argument is to be interpreted, while the flags + * modify that interpretation. The field type characters are listed + * in the table at the end of this section. The flag characters are: + * + * Flag | Applies to | Meaning + * ---------+--------------+----------------------------------------- + * space | bdeEfgGiouxX | Leave a space at the start of + * | | positive numbers. + * ---------+--------------+----------------------------------------- + * (digit)$ | all | Specifies the absolute argument number + * | | for this field. Absolute and relative + * | | argument numbers cannot be mixed in a + * | | sprintf string. + * ---------+--------------+----------------------------------------- + * # | beEfgGoxX | Use an alternative format. For the + * | | conversions `o', `x', `X', and `b', + * | | prefix the result with ``0'', ``0x'', ``0X'', + * | | and ``0b'', respectively. For `e', + * | | `E', `f', `g', and 'G', force a decimal + * | | point to be added, even if no digits follow. + * | | For `g' and 'G', do not remove trailing zeros. + * ---------+--------------+----------------------------------------- + * + | bdeEfgGiouxX | Add a leading plus sign to positive numbers. + * ---------+--------------+----------------------------------------- + * - | all | Left-justify the result of this conversion. + * ---------+--------------+----------------------------------------- + * 0 (zero) | bdeEfgGiouxX | Pad with zeros, not spaces. + * ---------+--------------+----------------------------------------- + * * | all | Use the next argument as the field width. + * | | If negative, left-justify the result. If the + * | | asterisk is followed by a number and a dollar + * | | sign, use the indicated argument as the width. + * + * + * The field width is an optional integer, followed optionally by a + * period and a precision. The width specifies the minimum number of + * characters that will be written to the result for this field. For + * numeric fields, the precision controls the number of decimal places + * displayed. For string fields, the precision determines the maximum + * number of characters to be copied from the string. (Thus, the format + * sequence <code>%10.10s</code> will always contribute exactly ten + * characters to the result.) + * + * The field types are: + * + * Field | Conversion + * ------+-------------------------------------------------------------- + * b | Convert argument as a binary number. + * c | Argument is the numeric code for a single character. + * d | Convert argument as a decimal number. + * E | Equivalent to `e', but uses an uppercase E to indicate + * | the exponent. + * e | Convert floating point argument into exponential notation + * | with one digit before the decimal point. The precision + * | determines the number of fractional digits (defaulting to six). + * f | Convert floating point argument as [-]ddd.ddd, + * | where the precision determines the number of digits after + * | the decimal point. + * G | Equivalent to `g', but use an uppercase `E' in exponent form. + * g | Convert a floating point number using exponential form + * | if the exponent is less than -4 or greater than or + * | equal to the precision, or in d.dddd form otherwise. + * i | Identical to `d'. + * o | Convert argument as an octal number. + * p | The valuing of argument.inspect. + * s | Argument is a string to be substituted. If the format + * | sequence contains a precision, at most that many characters + * | will be copied. + * u | Treat argument as an unsigned decimal number. Negative integers + * | are displayed as a 32 bit two's complement plus one for the + * | underlying architecture; that is, 2 ** 32 + n. However, since + * | Ruby has no inherent limit on bits used to represent the + * | integer, this value is preceded by two dots (..) in order to + * | indicate a infinite number of leading sign bits. + * X | Convert argument as a hexadecimal number using uppercase + * | letters. Negative numbers will be displayed with two + * | leading periods (representing an infinite string of + * | leading 'FF's. + * x | Convert argument as a hexadecimal number. + * | Negative numbers will be displayed with two + * | leading periods (representing an infinite string of + * | leading 'ff's. + * + * Examples: + * + * sprintf("%d %04x", 123, 123) #=> "123 007b" + * sprintf("%08b '%4s'", 123, 123) #=> "01111011 ' 123'" + * sprintf("%1$*2$s %2$d %1$s", "hello", 8) #=> " hello 8 hello" + * sprintf("%1$*2$s %2$d", "hello", -8) #=> "hello -8" + * sprintf("%+g:% g:%-g", 1.23, 1.23, 1.23) #=> "+1.23: 1.23:1.23" + * sprintf("%u", -123) #=> "..4294967173" + */ + +VALUE +rb_f_sprintf(argc, argv) + int argc; + VALUE *argv; +{ + return rb_str_format(argc - 1, argv + 1, GETNTHARG(0)); +} + +VALUE +rb_str_format(argc, argv, fmt) + int argc; + VALUE *argv; + VALUE fmt; +{ + const char *p, *end; + char *buf; + int blen, bsiz; + VALUE result; + + int width, prec, flags = FNONE; + int nextarg = 1; + int posarg = 0; + int tainted = 0; + VALUE nextvalue; + VALUE tmp; + VALUE str; + +#define CHECK_FOR_WIDTH(f) \ + if ((f) & FWIDTH) { \ + rb_raise(rb_eArgError, "width given twice"); \ + } \ + if ((f) & FPREC0) { \ + rb_raise(rb_eArgError, "width after precision"); \ + } +#define CHECK_FOR_FLAGS(f) \ + if ((f) & FWIDTH) { \ + rb_raise(rb_eArgError, "flag after width"); \ + } \ + if ((f) & FPREC0) { \ + rb_raise(rb_eArgError, "flag after precision"); \ + } + + ++argc; + --argv; + if (OBJ_TAINTED(fmt)) tainted = 1; + StringValue(fmt); + fmt = rb_str_new4(fmt); + p = RSTRING(fmt)->ptr; + end = p + RSTRING(fmt)->len; + blen = 0; + bsiz = 120; + result = rb_str_buf_new(bsiz); + buf = RSTRING(result)->ptr; + + for (; p < end; p++) { + const char *t; + int n; + + for (t = p; t < end && *t != '%'; t++) ; + PUSH(p, t - p); + if (t >= end) { + /* end of fmt string */ + goto sprint_exit; + } + p = t + 1; /* skip `%' */ + + width = prec = -1; + nextvalue = Qundef; + retry: + switch (*p) { + default: + if (ISPRINT(*p)) + rb_raise(rb_eArgError, "malformed format string - %%%c", *p); + else + rb_raise(rb_eArgError, "malformed format string"); + break; + + case ' ': + CHECK_FOR_FLAGS(flags); + flags |= FSPACE; + p++; + goto retry; + + case '#': + CHECK_FOR_FLAGS(flags); + flags |= FSHARP; + p++; + goto retry; + + case '+': + CHECK_FOR_FLAGS(flags); + flags |= FPLUS; + p++; + goto retry; + + case '-': + CHECK_FOR_FLAGS(flags); + flags |= FMINUS; + p++; + goto retry; + + case '0': + CHECK_FOR_FLAGS(flags); + flags |= FZERO; + p++; + goto retry; + + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + n = 0; + GETNUM(n, width); + if (*p == '$') { + if (nextvalue != Qundef) { + rb_raise(rb_eArgError, "value given twice - %d$", n); + } + nextvalue = GETPOSARG(n); + p++; + goto retry; + } + CHECK_FOR_WIDTH(flags); + width = n; + flags |= FWIDTH; + goto retry; + + case '*': + CHECK_FOR_WIDTH(flags); + flags |= FWIDTH; + GETASTER(width); + if (width < 0) { + flags |= FMINUS; + width = -width; + } + p++; + goto retry; + + case '.': + if (flags & FPREC0) { + rb_raise(rb_eArgError, "precision given twice"); + } + flags |= FPREC|FPREC0; + + prec = 0; + p++; + if (*p == '*') { + GETASTER(prec); + if (prec < 0) { /* ignore negative precision */ + flags &= ~FPREC; + } + p++; + goto retry; + } + + GETNUM(prec, precision); + goto retry; + + case '\n': + case '\0': + p--; + case '%': + if (flags != FNONE) { + rb_raise(rb_eArgError, "illegal format character - %%"); + } + PUSH("%", 1); + break; + + case 'c': + { + VALUE val = GETARG(); + char c; + + if (!(flags & FMINUS)) + while (--width > 0) + PUSH(" ", 1); + c = NUM2INT(val) & 0xff; + PUSH(&c, 1); + while (--width > 0) + PUSH(" ", 1); + } + break; + + case 's': + case 'p': + { + VALUE arg = GETARG(); + long len; + + if (*p == 'p') arg = rb_inspect(arg); + str = rb_obj_as_string(arg); + if (OBJ_TAINTED(str)) tainted = 1; + len = RSTRING(str)->len; + if (flags&FPREC) { + if (prec < len) { + len = prec; + } + } + /* need to adjust multi-byte string pos */ + if (flags&FWIDTH) { + if (width > len) { + CHECK(width); + width -= len; + if (!(flags&FMINUS)) { + while (width--) { + buf[blen++] = ' '; + } + } + memcpy(&buf[blen], RSTRING_PTR(str), len); + blen += len; + if (flags&FMINUS) { + while (width--) { + buf[blen++] = ' '; + } + } + break; + } + } + PUSH(RSTRING(str)->ptr, len); + } + break; + + case 'd': + case 'i': + case 'o': + case 'x': + case 'X': + case 'b': + case 'B': + case 'u': + { + volatile VALUE val = GETARG(); + char fbuf[32], nbuf[64], *s, *t; + const char *prefix = 0; + int sign = 0; + char sc = 0; + long v = 0; + int base, bignum = 0; + int len, pos; + volatile VALUE tmp; + volatile VALUE tmp1; + + switch (*p) { + case 'd': + case 'i': + sign = 1; break; + case 'o': + case 'x': + case 'X': + case 'b': + case 'B': + case 'u': + default: + if (flags&(FPLUS|FSPACE)) sign = 1; + break; + } + if (flags & FSHARP) { + switch (*p) { + case 'o': + prefix = "0"; break; + case 'x': + prefix = "0x"; break; + case 'X': + prefix = "0X"; break; + case 'b': + prefix = "0b"; break; + case 'B': + prefix = "0B"; break; + } + if (prefix) { + width -= strlen(prefix); + } + } + + bin_retry: + switch (TYPE(val)) { + case T_FLOAT: + val = rb_dbl2big(RFLOAT(val)->value); + if (FIXNUM_P(val)) goto bin_retry; + bignum = 1; + break; + case T_STRING: + val = rb_str_to_inum(val, 0, Qtrue); + goto bin_retry; + case T_BIGNUM: + bignum = 1; + break; + case T_FIXNUM: + v = FIX2LONG(val); + break; + default: + val = rb_Integer(val); + goto bin_retry; + } + + switch (*p) { + case 'o': + base = 8; break; + case 'x': + case 'X': + base = 16; break; + case 'b': + case 'B': + base = 2; break; + case 'u': + case 'd': + case 'i': + default: + base = 10; break; + } + + if (!bignum) { + if (base == 2) { + val = rb_int2big(v); + goto bin_retry; + } + if (sign) { + char c = *p; + if (c == 'i') c = 'd'; /* %d and %i are identical */ + if (v < 0) { + v = -v; + sc = '-'; + width--; + } + else if (flags & FPLUS) { + sc = '+'; + width--; + } + else if (flags & FSPACE) { + sc = ' '; + width--; + } + sprintf(fbuf, "%%l%c", c); + sprintf(nbuf, fbuf, v); + s = nbuf; + goto format_integer; + } + s = nbuf; + if (v < 0) { + if (base == 10) { + rb_warning("negative number for %%u specifier"); + } + if (!(flags&(FPREC|FZERO))) { + strcpy(s, ".."); + s += 2; + } + } + sprintf(fbuf, "%%l%c", *p == 'X' ? 'x' : *p); + sprintf(s, fbuf, v); + if (v < 0) { + char d = 0; + + remove_sign_bits(s, base); + switch (base) { + case 16: + d = 'f'; break; + case 8: + d = '7'; break; + } + if (d && *s != d) { + memmove(s+1, s, strlen(s)+1); + *s = d; + } + } + s = nbuf; + goto format_integer; + } + + if (sign) { + tmp = rb_big2str(val, base); + s = RSTRING(tmp)->ptr; + if (s[0] == '-') { + s++; + sc = '-'; + width--; + } + else if (flags & FPLUS) { + sc = '+'; + width--; + } + else if (flags & FSPACE) { + sc = ' '; + width--; + } + goto format_integer; + } + if (!RBIGNUM(val)->sign) { + val = rb_big_clone(val); + rb_big_2comp(val); + } + tmp1 = tmp = rb_big2str0(val, base, RBIGNUM(val)->sign); + s = RSTRING(tmp)->ptr; + if (*s == '-') { + if (base == 10) { + rb_warning("negative number for %%u specifier"); + } + remove_sign_bits(++s, base); + tmp = rb_str_new(0, 3+strlen(s)); + t = RSTRING(tmp)->ptr; + if (!(flags&(FPREC|FZERO))) { + strcpy(t, ".."); + t += 2; + } + switch (base) { + case 16: + if (s[0] != 'f') strcpy(t++, "f"); break; + case 8: + if (s[0] != '7') strcpy(t++, "7"); break; + case 2: + if (s[0] != '1') strcpy(t++, "1"); break; + } + strcpy(t, s); + bignum = 2; + } + s = RSTRING(tmp)->ptr; + + format_integer: + pos = -1; + len = strlen(s); + + if (*p == 'X') { + char *pp = s; + while (*pp) { + *pp = toupper(*pp); + pp++; + } + } + if ((flags&(FZERO|FPREC)) == FZERO) { + prec = width; + width = 0; + } + else { + if (prec < len) prec = len; + width -= prec; + } + if (!(flags&FMINUS)) { + CHECK(width); + while (width-- > 0) { + buf[blen++] = ' '; + } + } + if (sc) PUSH(&sc, 1); + if (prefix) { + int plen = strlen(prefix); + PUSH(prefix, plen); + } + CHECK(prec - len); + if (!bignum && v < 0) { + char c = sign_bits(base, p); + while (len < prec--) { + buf[blen++] = c; + } + } + else { + char c; + + if (!sign && bignum && !RBIGNUM(val)->sign) + c = sign_bits(base, p); + else + c = '0'; + while (len < prec--) { + buf[blen++] = c; + } + } + PUSH(s, len); + CHECK(width); + while (width-- > 0) { + buf[blen++] = ' '; + } + } + break; + + case 'f': + case 'g': + case 'G': + case 'e': + case 'E': + { + VALUE val = GETARG(); + double fval; + int i, need = 6; + char fbuf[32]; + + fval = RFLOAT(rb_Float(val))->value; +#if defined(_WIN32) && !defined(__BORLANDC__) + if (isnan(fval) || isinf(fval)) { + char *expr; + + if (isnan(fval)) { + expr = "NaN"; + } + else { + expr = "Inf"; + } + need = strlen(expr); + if ((!isnan(fval) && fval < 0.0) || (flags & FPLUS)) + need++; + else if (flags & FSPACE) + need++; + if ((flags & FWIDTH) && need < width) + need = width; + + CHECK(need); + sprintf(&buf[blen], "%*s", need, ""); + if (flags & FMINUS) { + if (!isnan(fval) && fval < 0.0) + buf[blen++] = '-'; + else if (flags & FPLUS) + buf[blen++] = '+'; + else if (flags & FSPACE) + blen++; + strncpy(&buf[blen], expr, strlen(expr)); + } + else if (flags & FZERO) { + if (!isnan(fval) && fval < 0.0) { + buf[blen++] = '-'; + need--; + } + else if (flags & FPLUS) { + buf[blen++] = '+'; + need--; + } + else if (flags & FSPACE) { + blen++; + need--; + } + while (need-- - strlen(expr) > 0) { + buf[blen++] = '0'; + } + strncpy(&buf[blen], expr, strlen(expr)); + } + else { + if (!isnan(fval) && fval < 0.0) + buf[blen + need - strlen(expr) - 1] = '-'; + else if (flags & FPLUS) + buf[blen + need - strlen(expr) - 1] = '+'; + strncpy(&buf[blen + need - strlen(expr)], expr, + strlen(expr)); + } + blen += strlen(&buf[blen]); + break; + } +#endif /* defined(_WIN32) && !defined(__BORLANDC__) */ + fmt_setup(fbuf, *p, flags, width, prec); + need = 0; + if (*p != 'e' && *p != 'E') { + i = INT_MIN; + frexp(fval, &i); + if (i > 0) + need = BIT_DIGITS(i); + } + need += (flags&FPREC) ? prec : 6; + if ((flags&FWIDTH) && need < width) + need = width; + need += 20; + + CHECK(need); + sprintf(&buf[blen], fbuf, fval); + blen += strlen(&buf[blen]); + } + break; + } + flags = FNONE; + } + + sprint_exit: + /* XXX - We cannot validiate the number of arguments if (digit)$ style used. + */ + if (posarg >= 0 && nextarg < argc) { + const char *mesg = "too many arguments for format string"; + if (RTEST(ruby_debug)) rb_raise(rb_eArgError, mesg); + if (RTEST(ruby_verbose)) rb_warn(mesg); + } + rb_str_resize(result, blen); + + if (tainted) OBJ_TAINT(result); + return result; +} + +static void +fmt_setup(buf, c, flags, width, prec) + char *buf; + int c; + int flags, width, prec; +{ + *buf++ = '%'; + if (flags & FSHARP) *buf++ = '#'; + if (flags & FPLUS) *buf++ = '+'; + if (flags & FMINUS) *buf++ = '-'; + if (flags & FZERO) *buf++ = '0'; + if (flags & FSPACE) *buf++ = ' '; + + if (flags & FWIDTH) { + sprintf(buf, "%d", width); + buf += strlen(buf); + } + + if (flags & FPREC) { + sprintf(buf, ".%d", prec); + buf += strlen(buf); + } + + *buf++ = c; + *buf = '\0'; +} +/* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */ + +/* static char sccsid[] = "@(#) st.c 5.1 89/12/14 Crucible"; */ + +#include "config.h" +#include "defines.h" +#include <stdio.h> +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#include <string.h> +#include "st.h" + +typedef struct st_table_entry st_table_entry; + +struct st_table_entry { + unsigned int hash; + st_data_t key; + st_data_t record; + st_table_entry *next; +}; + +#define ST_DEFAULT_MAX_DENSITY 5 +#define ST_DEFAULT_INIT_TABLE_SIZE 11 + + /* + * DEFAULT_MAX_DENSITY is the default for the largest we allow the + * average number of items per bin before increasing the number of + * bins + * + * DEFAULT_INIT_TABLE_SIZE is the default for the number of bins + * allocated initially + * + */ +static int numcmp(long, long); +static int numhash(long); +static struct st_hash_type type_numhash = { + numcmp, + numhash, +}; + +/* extern int strcmp(const char *, const char *); */ +static int strhash(const char *); +static struct st_hash_type type_strhash = { + strcmp, + strhash, +}; + +static void rehash(st_table *); + +#ifdef RUBY +#define malloc xmalloc +#define calloc xcalloc +#endif + +#define alloc(type) (type*)malloc((unsigned)sizeof(type)) +#define Calloc(n,s) (char*)calloc((n),(s)) + +#define EQUAL(table,x,y) ((x)==(y) || (*table->type->compare)((x),(y)) == 0) + +#define do_hash(key,table) (unsigned int)(*(table)->type->hash)((key)) +#define do_hash_bin(key,table) (do_hash(key, table)%(table)->num_bins) + +/* + * MINSIZE is the minimum size of a dictionary. + */ + +#define MINSIZE 8 + +/* +Table of prime numbers 2^n+a, 2<=n<=30. +*/ +static long primes[] = { + 8 + 3, + 16 + 3, + 32 + 5, + 64 + 3, + 128 + 3, + 256 + 27, + 512 + 9, + 1024 + 9, + 2048 + 5, + 4096 + 3, + 8192 + 27, + 16384 + 43, + 32768 + 3, + 65536 + 45, + 131072 + 29, + 262144 + 3, + 524288 + 21, + 1048576 + 7, + 2097152 + 17, + 4194304 + 15, + 8388608 + 9, + 16777216 + 43, + 33554432 + 35, + 67108864 + 15, + 134217728 + 29, + 268435456 + 3, + 536870912 + 11, + 1073741824 + 85, + 0 +}; + +static int +new_size(size) + int size; +{ + int i; + +#if 0 + for (i=3; i<31; i++) { + if ((1<<i) > size) return 1<<i; + } + return -1; +#else + int newsize; + + for (i = 0, newsize = MINSIZE; + i < sizeof(primes)/sizeof(primes[0]); + i++, newsize <<= 1) + { + if (newsize > size) return primes[i]; + } + /* Ran out of polynomials */ + return -1; /* should raise exception */ +#endif +} + +#ifdef HASH_LOG +static int collision = 0; +static int init_st = 0; + +static void +stat_col() +{ + FILE *f = fopen("/tmp/col", "w"); + fprintf(f, "collision: %d\n", collision); + fclose(f); +} +#endif + +st_table* +st_init_table_with_size(type, size) + struct st_hash_type *type; + int size; +{ + st_table *tbl; + +#ifdef HASH_LOG + if (init_st == 0) { + init_st = 1; + atexit(stat_col); + } +#endif + + size = new_size(size); /* round up to prime number */ + + tbl = alloc(st_table); + tbl->type = type; + tbl->num_entries = 0; + tbl->num_bins = size; + tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*)); + + return tbl; +} + +st_table* +st_init_table(type) + struct st_hash_type *type; +{ + return st_init_table_with_size(type, 0); +} + +st_table* +st_init_numtable(void) +{ + return st_init_table(&type_numhash); +} + +st_table* +st_init_numtable_with_size(size) + int size; +{ + return st_init_table_with_size(&type_numhash, size); +} + +st_table* +st_init_strtable(void) +{ + return st_init_table(&type_strhash); +} + +st_table* +st_init_strtable_with_size(size) + int size; +{ + return st_init_table_with_size(&type_strhash, size); +} + +void +st_free_table(table) + st_table *table; +{ + register st_table_entry *ptr, *next; + int i; + + for(i = 0; i < table->num_bins; i++) { + ptr = table->bins[i]; + while (ptr != 0) { + next = ptr->next; + free(ptr); + ptr = next; + } + } + free(table->bins); + free(table); +} + +#define PTR_NOT_EQUAL(table, ptr, hash_val, key) \ +((ptr) != 0 && (ptr->hash != (hash_val) || !EQUAL((table), (key), (ptr)->key))) + +#ifdef HASH_LOG +#define COLLISION collision++ +#else +#define COLLISION +#endif + +#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\ + bin_pos = hash_val%(table)->num_bins;\ + ptr = (table)->bins[bin_pos];\ + if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {\ + COLLISION;\ + while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {\ + ptr = ptr->next;\ + }\ + ptr = ptr->next;\ + }\ +} while (0) + +int +st_lookup(table, key, value) + st_table *table; + register st_data_t key; + st_data_t *value; +{ + unsigned int hash_val, bin_pos; + register st_table_entry *ptr; + + hash_val = do_hash(key, table); + FIND_ENTRY(table, ptr, hash_val, bin_pos); + + if (ptr == 0) { + return 0; + } + else { + if (value != 0) *value = ptr->record; + return 1; + } +} + +#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\ +do {\ + st_table_entry *entry;\ + if (table->num_entries/(table->num_bins) > ST_DEFAULT_MAX_DENSITY) {\ + rehash(table);\ + bin_pos = hash_val % table->num_bins;\ + }\ + \ + entry = alloc(st_table_entry);\ + \ + entry->hash = hash_val;\ + entry->key = key;\ + entry->record = value;\ + entry->next = table->bins[bin_pos];\ + table->bins[bin_pos] = entry;\ + table->num_entries++;\ +} while (0) + +int +st_insert(table, key, value) + register st_table *table; + register st_data_t key; + st_data_t value; +{ + unsigned int hash_val, bin_pos; + register st_table_entry *ptr; + + hash_val = do_hash(key, table); + FIND_ENTRY(table, ptr, hash_val, bin_pos); + + if (ptr == 0) { + ADD_DIRECT(table, key, value, hash_val, bin_pos); + return 0; + } + else { + ptr->record = value; + return 1; + } +} + +void +st_add_direct(table, key, value) + st_table *table; + st_data_t key; + st_data_t value; +{ + unsigned int hash_val, bin_pos; + + hash_val = do_hash(key, table); + bin_pos = hash_val % table->num_bins; + ADD_DIRECT(table, key, value, hash_val, bin_pos); +} + +static void +rehash(table) + register st_table *table; +{ + register st_table_entry *ptr, *next, **new_bins; + int i, old_num_bins = table->num_bins, new_num_bins; + unsigned int hash_val; + + new_num_bins = new_size(old_num_bins+1); + new_bins = (st_table_entry**)Calloc(new_num_bins, sizeof(st_table_entry*)); + + for(i = 0; i < old_num_bins; i++) { + ptr = table->bins[i]; + while (ptr != 0) { + next = ptr->next; + hash_val = ptr->hash % new_num_bins; + ptr->next = new_bins[hash_val]; + new_bins[hash_val] = ptr; + ptr = next; + } + } + free(table->bins); + table->num_bins = new_num_bins; + table->bins = new_bins; +} + +st_table* +st_copy(old_table) + st_table *old_table; +{ + st_table *new_table; + st_table_entry *ptr, *entry; + int i, num_bins = old_table->num_bins; + + new_table = alloc(st_table); + if (new_table == 0) { + return 0; + } + + *new_table = *old_table; + new_table->bins = (st_table_entry**) + Calloc((unsigned)num_bins, sizeof(st_table_entry*)); + + if (new_table->bins == 0) { + free(new_table); + return 0; + } + + for(i = 0; i < num_bins; i++) { + new_table->bins[i] = 0; + ptr = old_table->bins[i]; + while (ptr != 0) { + entry = alloc(st_table_entry); + if (entry == 0) { + free(new_table->bins); + free(new_table); + return 0; + } + *entry = *ptr; + entry->next = new_table->bins[i]; + new_table->bins[i] = entry; + ptr = ptr->next; + } + } + return new_table; +} + +int +st_delete(table, key, value) + register st_table *table; + register st_data_t *key; + st_data_t *value; +{ + unsigned int hash_val; + st_table_entry *tmp; + register st_table_entry *ptr; + + hash_val = do_hash_bin(*key, table); + ptr = table->bins[hash_val]; + + if (ptr == 0) { + if (value != 0) *value = 0; + return 0; + } + + if (EQUAL(table, *key, ptr->key)) { + table->bins[hash_val] = ptr->next; + table->num_entries--; + if (value != 0) *value = ptr->record; + *key = ptr->key; + free(ptr); + return 1; + } + + for(; ptr->next != 0; ptr = ptr->next) { + if (EQUAL(table, ptr->next->key, *key)) { + tmp = ptr->next; + ptr->next = ptr->next->next; + table->num_entries--; + if (value != 0) *value = tmp->record; + *key = tmp->key; + free(tmp); + return 1; + } + } + + return 0; +} + +int +st_delete_safe(table, key, value, never) + register st_table *table; + register st_data_t *key; + st_data_t *value; + st_data_t never; +{ + unsigned int hash_val; + register st_table_entry *ptr; + + hash_val = do_hash_bin(*key, table); + ptr = table->bins[hash_val]; + + if (ptr == 0) { + if (value != 0) *value = 0; + return 0; + } + + for(; ptr != 0; ptr = ptr->next) { + if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) { + table->num_entries--; + *key = ptr->key; + if (value != 0) *value = ptr->record; + ptr->key = ptr->record = never; + return 1; + } + } + + return 0; +} + +static int +delete_never(key, value, never) + st_data_t key, value, never; +{ + if (value == never) return ST_DELETE; + return ST_CONTINUE; +} + +void +st_cleanup_safe(table, never) + st_table *table; + st_data_t never; +{ + int num_entries = table->num_entries; + + st_foreach(table, delete_never, never); + table->num_entries = num_entries; +} + +int +st_foreach(table, func, arg) + st_table *table; + int (*func)(); + st_data_t arg; +{ + st_table_entry *ptr, *last, *tmp; + enum st_retval retval; + int i; + + for(i = 0; i < table->num_bins; i++) { + last = 0; + for(ptr = table->bins[i]; ptr != 0;) { + retval = (*func)(ptr->key, ptr->record, arg); + switch (retval) { + case ST_CHECK: /* check if hash is modified during iteration */ + tmp = 0; + if (i < table->num_bins) { + for (tmp = table->bins[i]; tmp; tmp=tmp->next) { + if (tmp == ptr) break; + } + } + if (!tmp) { + /* call func with error notice */ + return 1; + } + /* fall through */ + case ST_CONTINUE: + last = ptr; + ptr = ptr->next; + break; + case ST_STOP: + return 0; + case ST_DELETE: + tmp = ptr; + if (last == 0) { + table->bins[i] = ptr->next; + } + else { + last->next = ptr->next; + } + ptr = ptr->next; + free(tmp); + table->num_entries--; + } + } + } + return 0; +} + +static int +strhash(string) + register const char *string; +{ + register int c; + +#ifdef HASH_ELFHASH + register unsigned int h = 0, g; + + while ((c = *string++) != '\0') { + h = ( h << 4 ) + c; + if ( g = h & 0xF0000000 ) + h ^= g >> 24; + h &= ~g; + } + return h; +#elif defined(HASH_PERL) + register int val = 0; + + while ((c = *string++) != '\0') { + val += c; + val += (val << 10); + val ^= (val >> 6); + } + val += (val << 3); + val ^= (val >> 11); + + return val + (val << 15); +#else + register int val = 0; + + while ((c = *string++) != '\0') { + val = val*997 + c; + } + + return val + (val>>5); +#endif +} + +static int +numcmp(x, y) + long x, y; +{ + return x != y; +} + +static int +numhash(n) + long n; +{ + return n; +} +/********************************************************************** + + string.c - + + $Author: shyouhei $ + $Date: 2009-02-17 03:58:28 +0100 (Tue, 17 Feb 2009) $ + created at: Mon Aug 9 17:12:58 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "re.h" + +#define BEG(no) regs->beg[no] +#define END(no) regs->end[no] + +#include <math.h> +#include <ctype.h> + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +VALUE rb_cString; + +#define STR_TMPLOCK FL_USER1 +#define STR_ASSOC FL_USER3 +#define STR_NOCAPA (ELTS_SHARED|STR_ASSOC) + +#define RESIZE_CAPA(str,capacity) do {\ + REALLOC_N(RSTRING(str)->ptr, char, (capacity)+1);\ + if (!FL_TEST(str, STR_NOCAPA))\ + RSTRING(str)->aux.capa = (capacity);\ +} while (0) + +VALUE rb_fs; + +static inline void +str_mod_check(s, p, len) + VALUE s; + char *p; + long len; +{ + if (RSTRING(s)->ptr != p || RSTRING(s)->len != len) { + rb_raise(rb_eRuntimeError, "string modified"); + } +} + +static inline void +str_frozen_check(s) + VALUE s; +{ + if (OBJ_FROZEN(s)) { + rb_raise(rb_eRuntimeError, "string frozen"); + } +} + +static VALUE str_alloc _((VALUE)); +static VALUE +str_alloc(klass) + VALUE klass; +{ + NEWOBJ(str, struct RString); + OBJSETUP(str, klass, T_STRING); + + str->ptr = 0; + str->len = 0; + str->aux.capa = 0; + + return (VALUE)str; +} + +static VALUE +str_new(klass, ptr, len) + VALUE klass; + const char *ptr; + long len; +{ + VALUE str; + + if (len < 0) { + rb_raise(rb_eArgError, "negative string size (or size too big)"); + } + + str = str_alloc(klass); + RSTRING(str)->len = len; + RSTRING(str)->aux.capa = len; + RSTRING(str)->ptr = ALLOC_N(char,len+1); + if (ptr) { + memcpy(RSTRING(str)->ptr, ptr, len); + } + RSTRING(str)->ptr[len] = '\0'; + return str; +} + +VALUE +rb_str_new(ptr, len) + const char *ptr; + long len; +{ + return str_new(rb_cString, ptr, len); +} + +VALUE +rb_str_new2(ptr) + const char *ptr; +{ + if (!ptr) { + rb_raise(rb_eArgError, "NULL pointer given"); + } + return rb_str_new(ptr, strlen(ptr)); +} + +VALUE +rb_tainted_str_new(ptr, len) + const char *ptr; + long len; +{ + VALUE str = rb_str_new(ptr, len); + + OBJ_TAINT(str); + return str; +} + +VALUE +rb_tainted_str_new2(ptr) + const char *ptr; +{ + VALUE str = rb_str_new2(ptr); + + OBJ_TAINT(str); + return str; +} + +static VALUE +str_new3(klass, str) + VALUE klass, str; +{ + VALUE str2 = str_alloc(klass); + + RSTRING(str2)->len = RSTRING(str)->len; + RSTRING(str2)->ptr = RSTRING(str)->ptr; + RSTRING(str2)->aux.shared = str; + FL_SET(str2, ELTS_SHARED); + + return str2; +} + +VALUE +rb_str_new3(str) + VALUE str; +{ + VALUE str2 = str_new3(rb_obj_class(str), str); + + OBJ_INFECT(str2, str); + return str2; +} + +static VALUE +str_new4(klass, str) + VALUE klass, str; +{ + VALUE str2 = str_alloc(klass); + + RSTRING(str2)->len = RSTRING(str)->len; + RSTRING(str2)->ptr = RSTRING(str)->ptr; + if (FL_TEST(str, ELTS_SHARED)) { + FL_SET(str2, ELTS_SHARED); + RSTRING(str2)->aux.shared = RSTRING(str)->aux.shared; + } + else { + FL_SET(str, ELTS_SHARED); + RSTRING(str)->aux.shared = str2; + } + + return str2; +} + +VALUE +rb_str_new4(orig) + VALUE orig; +{ + VALUE klass, str; + + if (OBJ_FROZEN(orig)) return orig; + klass = rb_obj_class(orig); + if (FL_TEST(orig, ELTS_SHARED) && (str = RSTRING(orig)->aux.shared) && klass == RBASIC(str)->klass) { + long ofs; + ofs = RSTRING(str)->len - RSTRING(orig)->len; + if ((ofs > 0) || (!OBJ_TAINTED(str) && OBJ_TAINTED(orig))) { + str = str_new3(klass, str); + RSTRING(str)->ptr += ofs; + RSTRING(str)->len -= ofs; + } + } + else if (FL_TEST(orig, STR_ASSOC)) { + str = str_new(klass, RSTRING(orig)->ptr, RSTRING(orig)->len); + } + else { + str = str_new4(klass, orig); + } + OBJ_INFECT(str, orig); + OBJ_FREEZE(str); + return str; +} + +VALUE +rb_str_new5(obj, ptr, len) + VALUE obj; + const char *ptr; + long len; +{ + return str_new(rb_obj_class(obj), ptr, len); +} + +#define STR_BUF_MIN_SIZE 128 + +VALUE +rb_str_buf_new(capa) + long capa; +{ + VALUE str = str_alloc(rb_cString); + + if (capa < STR_BUF_MIN_SIZE) { + capa = STR_BUF_MIN_SIZE; + } + RSTRING(str)->ptr = 0; + RSTRING(str)->len = 0; + RSTRING(str)->aux.capa = capa; + RSTRING(str)->ptr = ALLOC_N(char, capa+1); + RSTRING(str)->ptr[0] = '\0'; + + return str; +} + +VALUE +rb_str_buf_new2(ptr) + const char *ptr; +{ + VALUE str; + long len = strlen(ptr); + + str = rb_str_buf_new(len); + rb_str_buf_cat(str, ptr, len); + + return str; +} + +VALUE +rb_str_to_str(str) + VALUE str; +{ + return rb_convert_type(str, T_STRING, "String", "to_str"); +} + +static void +rb_str_shared_replace(str, str2) + VALUE str, str2; +{ + if (str == str2) return; + rb_str_modify(str); + if (!FL_TEST(str, ELTS_SHARED)) free(RSTRING(str)->ptr); + if (NIL_P(str2)) { + RSTRING(str)->ptr = 0; + RSTRING(str)->len = 0; + RSTRING(str)->aux.capa = 0; + FL_UNSET(str, STR_NOCAPA); + return; + } + RSTRING(str)->ptr = RSTRING(str2)->ptr; + RSTRING(str)->len = RSTRING(str2)->len; + FL_UNSET(str, STR_NOCAPA); + if (FL_TEST(str2, STR_NOCAPA)) { + FL_SET(str, RBASIC(str2)->flags & STR_NOCAPA); + RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared; + } + else { + RSTRING(str)->aux.capa = RSTRING(str2)->aux.capa; + } + RSTRING(str2)->ptr = 0; /* abandon str2 */ + RSTRING(str2)->len = 0; + RSTRING(str2)->aux.capa = 0; + FL_UNSET(str2, STR_NOCAPA); + if (OBJ_TAINTED(str2)) OBJ_TAINT(str); +} + +static ID id_to_s; + +VALUE +rb_obj_as_string(obj) + VALUE obj; +{ + VALUE str; + + if (TYPE(obj) == T_STRING) { + return obj; + } + str = rb_funcall(obj, id_to_s, 0); + if (TYPE(str) != T_STRING) + return rb_any_to_s(obj); + if (OBJ_TAINTED(obj)) OBJ_TAINT(str); + return str; +} + +static VALUE rb_str_s_alloc _((VALUE)); +static VALUE rb_str_replace _((VALUE, VALUE)); + +VALUE +rb_str_dup(str) + VALUE str; +{ + VALUE dup = str_alloc(rb_obj_class(str)); + rb_str_replace(dup, str); + return dup; +} + + +/* + * call-seq: + * String.new(str="") => new_str + * + * Returns a new string object containing a copy of <i>str</i>. + */ + +static VALUE +rb_str_init(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE orig; + + if (rb_scan_args(argc, argv, "01", &orig) == 1) + rb_str_replace(str, orig); + return str; +} + +/* + * call-seq: + * str.length => integer + * + * Returns the length of <i>str</i>. + */ + +static VALUE +rb_str_length(str) + VALUE str; +{ + return LONG2NUM(RSTRING(str)->len); +} + +/* + * call-seq: + * str.empty? => true or false + * + * Returns <code>true</code> if <i>str</i> has a length of zero. + * + * "hello".empty? #=> false + * "".empty? #=> true + */ + +static VALUE +rb_str_empty(str) + VALUE str; +{ + if (RSTRING(str)->len == 0) + return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * str + other_str => new_str + * + * Concatenation---Returns a new <code>String</code> containing + * <i>other_str</i> concatenated to <i>str</i>. + * + * "Hello from " + self.to_s #=> "Hello from main" + */ + +VALUE +rb_str_plus(str1, str2) + VALUE str1, str2; +{ + VALUE str3; + + StringValue(str2); + str3 = rb_str_new(0, RSTRING(str1)->len+RSTRING(str2)->len); + memcpy(RSTRING(str3)->ptr, RSTRING(str1)->ptr, RSTRING(str1)->len); + memcpy(RSTRING(str3)->ptr + RSTRING(str1)->len, + RSTRING(str2)->ptr, RSTRING(str2)->len); + RSTRING(str3)->ptr[RSTRING(str3)->len] = '\0'; + + if (OBJ_TAINTED(str1) || OBJ_TAINTED(str2)) + OBJ_TAINT(str3); + return str3; +} + +/* + * call-seq: + * str * integer => new_str + * + * Copy---Returns a new <code>String</code> containing <i>integer</i> copies of + * the receiver. + * + * "Ho! " * 3 #=> "Ho! Ho! Ho! " + */ + +VALUE +rb_str_times(str, times) + VALUE str; + VALUE times; +{ + VALUE str2; + long i, len; + + len = NUM2LONG(times); + if (len < 0) { + rb_raise(rb_eArgError, "negative argument"); + } + if (len && LONG_MAX/len < RSTRING(str)->len) { + rb_raise(rb_eArgError, "argument too big"); + } + + str2 = rb_str_new5(str,0, len *= RSTRING(str)->len); + for (i = 0; i < len; i += RSTRING(str)->len) { + memcpy(RSTRING(str2)->ptr + i, + RSTRING(str)->ptr, RSTRING(str)->len); + } + RSTRING(str2)->ptr[RSTRING(str2)->len] = '\0'; + + OBJ_INFECT(str2, str); + + return str2; +} + +/* + * call-seq: + * str % arg => new_str + * + * Format---Uses <i>str</i> as a format specification, and returns the result + * of applying it to <i>arg</i>. If the format specification contains more than + * one substitution, then <i>arg</i> must be an <code>Array</code> containing + * the values to be substituted. See <code>Kernel::sprintf</code> for details + * of the format string. + * + * "%05d" % 123 #=> "00123" + * "%-5s: %08x" % [ "ID", self.id ] #=> "ID : 200e14d6" + */ + +static VALUE +rb_str_format_m(str, arg) + VALUE str, arg; +{ + volatile VALUE tmp = rb_check_array_type(arg); + + if (!NIL_P(tmp)) { + return rb_str_format(RARRAY_LEN(tmp), RARRAY_PTR(tmp), str); + } + return rb_str_format(1, &arg, str); +} + +static const char null_str[] = ""; + +static int +str_independent(str) + VALUE str; +{ + if (FL_TEST(str, STR_TMPLOCK)) { + rb_raise(rb_eRuntimeError, "can't modify string; temporarily locked"); + } + if (OBJ_FROZEN(str)) rb_error_frozen("string"); + if (!OBJ_TAINTED(str) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify string"); + if (RSTRING(str)->ptr == null_str) return 0; + if (!FL_TEST(str, ELTS_SHARED)) return 1; + return 0; +} + +static void +str_make_independent(str) + VALUE str; +{ + char *ptr; + + ptr = ALLOC_N(char, RSTRING(str)->len+1); + if (RSTRING(str)->ptr) { + memcpy(ptr, RSTRING(str)->ptr, RSTRING(str)->len); + } + ptr[RSTRING(str)->len] = 0; + RSTRING(str)->ptr = ptr; + RSTRING(str)->aux.capa = RSTRING(str)->len; + FL_UNSET(str, STR_NOCAPA); +} + +void +rb_str_modify(str) + VALUE str; +{ + if (!str_independent(str)) + str_make_independent(str); +} + +void +rb_str_associate(str, add) + VALUE str, add; +{ + if (FL_TEST(str, STR_ASSOC)) { + /* already associated */ + rb_ary_concat(RSTRING(str)->aux.shared, add); + } + else { + if (FL_TEST(str, ELTS_SHARED)) { + str_make_independent(str); + } + else if (RSTRING(str)->aux.capa != RSTRING(str)->len) { + RESIZE_CAPA(str, RSTRING(str)->len); + } + RSTRING(str)->aux.shared = add; + FL_SET(str, STR_ASSOC); + } +} + +VALUE +rb_str_associated(str) + VALUE str; +{ + if (FL_TEST(str, STR_ASSOC)) { + return RSTRING(str)->aux.shared; + } + return Qfalse; +} + +#define make_null_str(s) do { \ + FL_SET(s, ELTS_SHARED); \ + RSTRING(s)->ptr = (char *)null_str; \ + RSTRING(s)->aux.shared = 0; \ + } while (0) + +static VALUE +rb_str_s_alloc(klass) + VALUE klass; +{ + VALUE str = str_alloc(klass); + make_null_str(str); + return str; +} + +VALUE +rb_string_value(ptr) + volatile VALUE *ptr; +{ + VALUE s = *ptr; + if (TYPE(s) != T_STRING) { + s = rb_str_to_str(s); + *ptr = s; + } + if (!RSTRING(s)->ptr) { + make_null_str(s); + } + return s; +} + +char * +rb_string_value_ptr(ptr) + volatile VALUE *ptr; +{ + return RSTRING(rb_string_value(ptr))->ptr; +} + +char * +rb_string_value_cstr(ptr) + volatile VALUE *ptr; +{ + VALUE str = rb_string_value(ptr); + char *s = RSTRING(str)->ptr; + + if (!s || RSTRING(str)->len != strlen(s)) { + rb_raise(rb_eArgError, "string contains null byte"); + } + return s; +} + +VALUE +rb_check_string_type(str) + VALUE str; +{ + str = rb_check_convert_type(str, T_STRING, "String", "to_str"); + if (!NIL_P(str) && !RSTRING(str)->ptr) { + make_null_str(str); + } + return str; +} + +VALUE +rb_str_substr(str, beg, len) + VALUE str; + long beg, len; +{ + VALUE str2; + + if (len < 0) return Qnil; + if (beg > RSTRING(str)->len) return Qnil; + if (beg < 0) { + beg += RSTRING(str)->len; + if (beg < 0) return Qnil; + } + if (beg + len > RSTRING(str)->len) { + len = RSTRING(str)->len - beg; + } + if (len < 0) { + len = 0; + } + if (len == 0) { + str2 = rb_str_new5(str,0,0); + } + else if (len > sizeof(struct RString)/2 && + beg + len == RSTRING(str)->len && !FL_TEST(str, STR_ASSOC)) { + str2 = rb_str_new4(str); + str2 = str_new3(rb_obj_class(str2), str2); + RSTRING(str2)->ptr += RSTRING(str2)->len - len; + RSTRING(str2)->len = len; + } + else { + str2 = rb_str_new5(str, RSTRING(str)->ptr+beg, len); + } + OBJ_INFECT(str2, str); + + return str2; +} + +VALUE +rb_str_freeze(str) + VALUE str; +{ + return rb_obj_freeze(str); +} + +VALUE +rb_str_dup_frozen(str) + VALUE str; +{ + if (FL_TEST(str, ELTS_SHARED) && RSTRING(str)->aux.shared) { + VALUE shared = RSTRING(str)->aux.shared; + if (RSTRING(shared)->len == RSTRING(str)->len) { + OBJ_FREEZE(shared); + return shared; + } + } + if (OBJ_FROZEN(str)) return str; + str = rb_str_dup(str); + OBJ_FREEZE(str); + return str; +} + +VALUE +rb_str_locktmp(str) + VALUE str; +{ + if (FL_TEST(str, STR_TMPLOCK)) { + rb_raise(rb_eRuntimeError, "temporal locking already locked string"); + } + FL_SET(str, STR_TMPLOCK); + return str; +} + +VALUE +rb_str_unlocktmp(str) + VALUE str; +{ + if (!FL_TEST(str, STR_TMPLOCK)) { + rb_raise(rb_eRuntimeError, "temporal unlocking already unlocked string"); + } + FL_UNSET(str, STR_TMPLOCK); + return str; +} + +VALUE +rb_str_resize(str, len) + VALUE str; + long len; +{ + if (len < 0) { + rb_raise(rb_eArgError, "negative string size (or size too big)"); + } + + rb_str_modify(str); + if (len != RSTRING(str)->len) { + if (RSTRING(str)->len < len || RSTRING(str)->len - len > 1024) { + REALLOC_N(RSTRING(str)->ptr, char, len+1); + if (!FL_TEST(str, STR_NOCAPA)) { + RSTRING(str)->aux.capa = len; + } + } + RSTRING(str)->len = len; + RSTRING(str)->ptr[len] = '\0'; /* sentinel */ + } + return str; +} + +static VALUE +str_buf_cat(str, ptr, len) + VALUE str; + const char *ptr; + long len; +{ + long capa, total, off = -1;; + + rb_str_modify(str); + if (ptr >= RSTRING(str)->ptr && ptr <= RSTRING(str)->ptr + RSTRING(str)->len) { + off = ptr - RSTRING(str)->ptr; + } + if (len == 0) return 0; + if (FL_TEST(str, STR_ASSOC)) { + FL_UNSET(str, STR_ASSOC); + capa = RSTRING(str)->aux.capa = RSTRING(str)->len; + } + else { + capa = RSTRING(str)->aux.capa; + } + if (RSTRING(str)->len >= LONG_MAX - len) { + rb_raise(rb_eArgError, "string sizes too big"); + } + total = RSTRING(str)->len+len; + if (capa <= total) { + while (total > capa) { + if (capa + 1 >= LONG_MAX / 2) { + capa = total; + break; + } + capa = (capa + 1) * 2; + } + RESIZE_CAPA(str, capa); + } + if (off != -1) { + ptr = RSTRING(str)->ptr + off; + } + memcpy(RSTRING(str)->ptr + RSTRING(str)->len, ptr, len); + RSTRING(str)->len = total; + RSTRING(str)->ptr[total] = '\0'; /* sentinel */ + + return str; +} + +VALUE +rb_str_buf_cat(str, ptr, len) + VALUE str; + const char *ptr; + long len; +{ + if (len == 0) return str; + if (len < 0) { + rb_raise(rb_eArgError, "negative string size (or size too big)"); + } + return str_buf_cat(str, ptr, len); +} + +VALUE +rb_str_buf_cat2(str, ptr) + VALUE str; + const char *ptr; +{ + return rb_str_buf_cat(str, ptr, strlen(ptr)); +} + +VALUE +rb_str_cat(str, ptr, len) + VALUE str; + const char *ptr; + long len; +{ + if (len < 0) { + rb_raise(rb_eArgError, "negative string size (or size too big)"); + } + if (FL_TEST(str, STR_ASSOC)) { + rb_str_modify(str); + REALLOC_N(RSTRING(str)->ptr, char, RSTRING(str)->len+len+1); + memcpy(RSTRING(str)->ptr + RSTRING(str)->len, ptr, len); + RSTRING(str)->len += len; + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; /* sentinel */ + return str; + } + + return rb_str_buf_cat(str, ptr, len); +} + +VALUE +rb_str_cat2(str, ptr) + VALUE str; + const char *ptr; +{ + return rb_str_cat(str, ptr, strlen(ptr)); +} + +VALUE +rb_str_buf_append(str, str2) + VALUE str, str2; +{ + str_buf_cat(str, RSTRING(str2)->ptr, RSTRING(str2)->len); + OBJ_INFECT(str, str2); + return str; +} + +VALUE +rb_str_append(str, str2) + VALUE str, str2; +{ + StringValue(str2); + rb_str_modify(str); + if (RSTRING(str2)->len > 0) { + if (FL_TEST(str, STR_ASSOC)) { + long len = RSTRING(str)->len+RSTRING(str2)->len; + REALLOC_N(RSTRING(str)->ptr, char, len+1); + memcpy(RSTRING(str)->ptr + RSTRING(str)->len, + RSTRING(str2)->ptr, RSTRING(str2)->len); + RSTRING(str)->ptr[len] = '\0'; /* sentinel */ + RSTRING(str)->len = len; + } + else { + return rb_str_buf_append(str, str2); + } + } + OBJ_INFECT(str, str2); + return str; +} + + +/* + * call-seq: + * str << fixnum => str + * str.concat(fixnum) => str + * str << obj => str + * str.concat(obj) => str + * + * Append---Concatenates the given object to <i>str</i>. If the object is a + * <code>Fixnum</code> between 0 and 255, it is converted to a character before + * concatenation. + * + * a = "hello " + * a << "world" #=> "hello world" + * a.concat(33) #=> "hello world!" + */ + +VALUE +rb_str_concat(str1, str2) + VALUE str1, str2; +{ + if (FIXNUM_P(str2)) { + int i = FIX2INT(str2); + if (0 <= i && i <= 0xff) { /* byte */ + char c = i; + return rb_str_cat(str1, &c, 1); + } + } + str1 = rb_str_append(str1, str2); + + return str1; +} + +int +rb_str_hash(str) + VALUE str; +{ + register long len = RSTRING(str)->len; + register char *p = RSTRING(str)->ptr; + register int key = 0; + +#if defined(HASH_ELFHASH) + register unsigned int g; + + while (len--) { + key = (key << 4) + *p++; + if (g = key & 0xF0000000) + key ^= g >> 24; + key &= ~g; + } +#elif defined(HASH_PERL) + while (len--) { + key += *p++; + key += (key << 10); + key ^= (key >> 6); + } + key += (key << 3); + key ^= (key >> 11); + key += (key << 15); +#else + while (len--) { + key = key*65599 + *p; + p++; + } + key = key + (key>>5); +#endif + return key; +} + +/* + * call-seq: + * str.hash => fixnum + * + * Return a hash based on the string's length and content. + */ + +static VALUE +rb_str_hash_m(str) + VALUE str; +{ + int key = rb_str_hash(str); + return INT2FIX(key); +} + +#define lesser(a,b) (((a)>(b))?(b):(a)) + +int +rb_str_cmp(str1, str2) + VALUE str1, str2; +{ + long len; + int retval; + + len = lesser(RSTRING(str1)->len, RSTRING(str2)->len); + retval = rb_memcmp(RSTRING(str1)->ptr, RSTRING(str2)->ptr, len); + if (retval == 0) { + if (RSTRING(str1)->len == RSTRING(str2)->len) return 0; + if (RSTRING(str1)->len > RSTRING(str2)->len) return 1; + return -1; + } + if (retval > 0) return 1; + return -1; +} + + +/* + * call-seq: + * str == obj => true or false + * + * Equality---If <i>obj</i> is not a <code>String</code>, returns + * <code>false</code>. Otherwise, returns <code>true</code> if <i>str</i> + * <code><=></code> <i>obj</i> returns zero. + */ + +static VALUE +rb_str_equal(str1, str2) + VALUE str1, str2; +{ + if (str1 == str2) return Qtrue; + if (TYPE(str2) != T_STRING) { + if (!rb_respond_to(str2, rb_intern("to_str"))) { + return Qfalse; + } + return rb_equal(str2, str1); + } + if (RSTRING(str1)->len == RSTRING(str2)->len && + rb_str_cmp(str1, str2) == 0) { + return Qtrue; + } + return Qfalse; +} + +#define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{')) + +/* + * call-seq: + * str.eql?(other) => true or false + * + * Two strings are equal if the have the same length and content. + */ + +static VALUE +rb_str_eql(str1, str2) + VALUE str1, str2; +{ + if (TYPE(str2) != T_STRING || RSTRING(str1)->len != RSTRING(str2)->len) + return Qfalse; + + if (memcmp(RSTRING(str1)->ptr, RSTRING(str2)->ptr, + lesser(RSTRING(str1)->len, RSTRING(str2)->len)) == 0) + return Qtrue; + + return Qfalse; +} + +/* + * call-seq: + * str <=> other_str => -1, 0, +1 + * + * Comparison---Returns -1 if <i>other_str</i> is less than, 0 if + * <i>other_str</i> is equal to, and +1 if <i>other_str</i> is greater than + * <i>str</i>. If the strings are of different lengths, and the strings are + * equal when compared up to the shortest length, then the longer string is + * considered greater than the shorter one. If the variable <code>$=</code> is + * <code>false</code>, the comparison is based on comparing the binary values + * of each character in the string. In older versions of Ruby, setting + * <code>$=</code> allowed case-insensitive comparisons; this is now deprecated + * in favor of using <code>String#casecmp</code>. + * + * <code><=></code> is the basis for the methods <code><</code>, + * <code><=</code>, <code>></code>, <code>>=</code>, and <code>between?</code>, + * included from module <code>Comparable</code>. The method + * <code>String#==</code> does not use <code>Comparable#==</code>. + * + * "abcdef" <=> "abcde" #=> 1 + * "abcdef" <=> "abcdef" #=> 0 + * "abcdef" <=> "abcdefg" #=> -1 + * "abcdef" <=> "ABCDEF" #=> 1 + */ + +static VALUE +rb_str_cmp_m(str1, str2) + VALUE str1, str2; +{ + long result; + + if (TYPE(str2) != T_STRING) { + if (!rb_respond_to(str2, rb_intern("to_str"))) { + return Qnil; + } + else if (!rb_respond_to(str2, rb_intern("<=>"))) { + return Qnil; + } + else { + VALUE tmp = rb_funcall(str2, rb_intern("<=>"), 1, str1); + + if (NIL_P(tmp)) return Qnil; + if (!FIXNUM_P(tmp)) { + return rb_funcall(LONG2FIX(0), '-', 1, tmp); + } + result = -FIX2LONG(tmp); + } + } + else { + result = rb_str_cmp(str1, str2); + } + return LONG2NUM(result); +} + +/* + * call-seq: + * str.casecmp(other_str) => -1, 0, +1 + * + * Case-insensitive version of <code>String#<=></code>. + * + * "abcdef".casecmp("abcde") #=> 1 + * "aBcDeF".casecmp("abcdef") #=> 0 + * "abcdef".casecmp("abcdefg") #=> -1 + * "abcdef".casecmp("ABCDEF") #=> 0 + */ + +static VALUE +rb_str_casecmp(str1, str2) + VALUE str1, str2; +{ + long len; + int retval; + + StringValue(str2); + len = lesser(RSTRING(str1)->len, RSTRING(str2)->len); + retval = rb_memcicmp(RSTRING(str1)->ptr, RSTRING(str2)->ptr, len); + if (retval == 0) { + if (RSTRING(str1)->len == RSTRING(str2)->len) return INT2FIX(0); + if (RSTRING(str1)->len > RSTRING(str2)->len) return INT2FIX(1); + return INT2FIX(-1); + } + if (retval == 0) return INT2FIX(0); + if (retval > 0) return INT2FIX(1); + return INT2FIX(-1); +} + +static long +rb_str_index(str, sub, offset) + VALUE str, sub; + long offset; +{ + long pos; + + if (offset < 0) { + offset += RSTRING(str)->len; + if (offset < 0) return -1; + } + if (RSTRING(str)->len - offset < RSTRING(sub)->len) return -1; + if (RSTRING(sub)->len == 0) return offset; + pos = rb_memsearch(RSTRING(sub)->ptr, RSTRING(sub)->len, + RSTRING(str)->ptr+offset, RSTRING(str)->len-offset); + if (pos < 0) return pos; + return pos + offset; +} + + +/* + * call-seq: + * str.index(substring [, offset]) => fixnum or nil + * str.index(fixnum [, offset]) => fixnum or nil + * str.index(regexp [, offset]) => fixnum or nil + * + * Returns the index of the first occurrence of the given <i>substring</i>, + * character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>. Returns + * <code>nil</code> if not found. If the second parameter is present, it + * specifies the position in the string to begin the search. + * + * "hello".index('e') #=> 1 + * "hello".index('lo') #=> 3 + * "hello".index('a') #=> nil + * "hello".index(101) #=> 1 + * "hello".index(/[aeiou]/, -3) #=> 4 + */ + +static VALUE +rb_str_index_m(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE sub; + VALUE initpos; + long pos; + + if (rb_scan_args(argc, argv, "11", &sub, &initpos) == 2) { + pos = NUM2LONG(initpos); + } + else { + pos = 0; + } + if (pos < 0) { + pos += RSTRING(str)->len; + if (pos < 0) { + if (TYPE(sub) == T_REGEXP) { + rb_backref_set(Qnil); + } + return Qnil; + } + } + + switch (TYPE(sub)) { + case T_REGEXP: + pos = rb_reg_adjust_startpos(sub, str, pos, 0); + pos = rb_reg_search(sub, str, pos, 0); + break; + + case T_FIXNUM: + { + int c = FIX2INT(sub); + long len = RSTRING(str)->len; + unsigned char *p = (unsigned char*)RSTRING(str)->ptr; + + for (;pos<len;pos++) { + if (p[pos] == c) return LONG2NUM(pos); + } + return Qnil; + } + + default: { + VALUE tmp; + + tmp = rb_check_string_type(sub); + if (NIL_P(tmp)) { + rb_raise(rb_eTypeError, "type mismatch: %s given", + rb_obj_classname(sub)); + } + sub = tmp; + } + /* fall through */ + case T_STRING: + pos = rb_str_index(str, sub, pos); + break; + } + + if (pos == -1) return Qnil; + return LONG2NUM(pos); +} + +static long +rb_str_rindex(str, sub, pos) + VALUE str, sub; + long pos; +{ + long len = RSTRING(sub)->len; + char *s, *sbeg, *t; + + /* substring longer than string */ + if (RSTRING(str)->len < len) return -1; + if (RSTRING(str)->len - pos < len) { + pos = RSTRING(str)->len - len; + } + sbeg = RSTRING(str)->ptr; + s = RSTRING(str)->ptr + pos; + t = RSTRING(sub)->ptr; + if (len) { + while (sbeg <= s) { + if (rb_memcmp(s, t, len) == 0) { + return s - RSTRING(str)->ptr; + } + s--; + } + return -1; + } + else { + return pos; + } +} + + +/* + * call-seq: + * str.rindex(substring [, fixnum]) => fixnum or nil + * str.rindex(fixnum [, fixnum]) => fixnum or nil + * str.rindex(regexp [, fixnum]) => fixnum or nil + * + * Returns the index of the last occurrence of the given <i>substring</i>, + * character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>. Returns + * <code>nil</code> if not found. If the second parameter is present, it + * specifies the position in the string to end the search---characters beyond + * this point will not be considered. + * + * "hello".rindex('e') #=> 1 + * "hello".rindex('l') #=> 3 + * "hello".rindex('a') #=> nil + * "hello".rindex(101) #=> 1 + * "hello".rindex(/[aeiou]/, -2) #=> 1 + */ + +static VALUE +rb_str_rindex_m(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE sub; + VALUE position; + long pos; + + if (rb_scan_args(argc, argv, "11", &sub, &position) == 2) { + pos = NUM2LONG(position); + if (pos < 0) { + pos += RSTRING(str)->len; + if (pos < 0) { + if (TYPE(sub) == T_REGEXP) { + rb_backref_set(Qnil); + } + return Qnil; + } + } + if (pos > RSTRING(str)->len) pos = RSTRING(str)->len; + } + else { + pos = RSTRING(str)->len; + } + + switch (TYPE(sub)) { + case T_REGEXP: + if (RREGEXP(sub)->len) { + pos = rb_reg_adjust_startpos(sub, str, pos, 1); + pos = rb_reg_search(sub, str, pos, 1); + } + if (pos >= 0) return LONG2NUM(pos); + break; + + case T_STRING: + pos = rb_str_rindex(str, sub, pos); + if (pos >= 0) return LONG2NUM(pos); + break; + + case T_FIXNUM: + { + int c = FIX2INT(sub); + unsigned char *p = (unsigned char*)RSTRING(str)->ptr + pos; + unsigned char *pbeg = (unsigned char*)RSTRING(str)->ptr; + + if (pos == RSTRING(str)->len) { + if (pos == 0) return Qnil; + --p; + } + while (pbeg <= p) { + if (*p == c) return LONG2NUM((char*)p - RSTRING(str)->ptr); + p--; + } + return Qnil; + } + + default: + rb_raise(rb_eTypeError, "type mismatch: %s given", + rb_obj_classname(sub)); + } + return Qnil; +} + +/* + * call-seq: + * str =~ obj => fixnum or nil + * + * Match---If <i>obj</i> is a <code>Regexp</code>, use it as a pattern to match + * against <i>str</i>,and returns the position the match starts, or + * <code>nil</code> if there is no match. Otherwise, invokes + * <i>obj.=~</i>, passing <i>str</i> as an argument. The default + * <code>=~</code> in <code>Object</code> returns <code>false</code>. + * + * "cat o' 9 tails" =~ /\d/ #=> 7 + * "cat o' 9 tails" =~ 9 #=> false + */ + +static VALUE +rb_str_match(x, y) + VALUE x, y; +{ + switch (TYPE(y)) { + case T_STRING: + rb_raise(rb_eTypeError, "type mismatch: String given"); + + case T_REGEXP: + return rb_reg_match(y, x); + + default: + return rb_funcall(y, rb_intern("=~"), 1, x); + } +} + + +static VALUE get_pat _((VALUE, int)); + + +/* + * call-seq: + * str.match(pattern) => matchdata or nil + * + * Converts <i>pattern</i> to a <code>Regexp</code> (if it isn't already one), + * then invokes its <code>match</code> method on <i>str</i>. + * + * 'hello'.match('(.)\1') #=> #<MatchData:0x401b3d30> + * 'hello'.match('(.)\1')[0] #=> "ll" + * 'hello'.match(/(.)\1/)[0] #=> "ll" + * 'hello'.match('xx') #=> nil + */ + +static VALUE +rb_str_match_m(str, re) + VALUE str, re; +{ + return rb_funcall(get_pat(re, 0), rb_intern("match"), 1, str); +} + +static char +succ_char(s) + char *s; +{ + char c = *s; + + /* numerics */ + if ('0' <= c && c < '9') (*s)++; + else if (c == '9') { + *s = '0'; + return '1'; + } + /* small alphabets */ + else if ('a' <= c && c < 'z') (*s)++; + else if (c == 'z') { + return *s = 'a'; + } + /* capital alphabets */ + else if ('A' <= c && c < 'Z') (*s)++; + else if (c == 'Z') { + return *s = 'A'; + } + return 0; +} + + +/* + * call-seq: + * str.succ => new_str + * str.next => new_str + * + * Returns the successor to <i>str</i>. The successor is calculated by + * incrementing characters starting from the rightmost alphanumeric (or + * the rightmost character if there are no alphanumerics) in the + * string. Incrementing a digit always results in another digit, and + * incrementing a letter results in another letter of the same case. + * Incrementing nonalphanumerics uses the underlying character set's + * collating sequence. + * + * If the increment generates a ``carry,'' the character to the left of + * it is incremented. This process repeats until there is no carry, + * adding an additional character if necessary. + * + * "abcd".succ #=> "abce" + * "THX1138".succ #=> "THX1139" + * "<<koala>>".succ #=> "<<koalb>>" + * "1999zzz".succ #=> "2000aaa" + * "ZZZ9999".succ #=> "AAAA0000" + * "***".succ #=> "**+" + */ + +static VALUE +rb_str_succ(orig) + VALUE orig; +{ + VALUE str; + char *sbeg, *s; + int c = -1; + long n = 0; + + str = rb_str_new5(orig, RSTRING(orig)->ptr, RSTRING(orig)->len); + OBJ_INFECT(str, orig); + if (RSTRING(str)->len == 0) return str; + + sbeg = RSTRING(str)->ptr; s = sbeg + RSTRING(str)->len - 1; + + while (sbeg <= s) { + if (ISALNUM(*s)) { + if ((c = succ_char(s)) == 0) break; + n = s - sbeg; + } + s--; + } + if (c == -1) { /* str contains no alnum */ + sbeg = RSTRING(str)->ptr; s = sbeg + RSTRING(str)->len - 1; + c = '\001'; + while (sbeg <= s) { + if ((*s += 1) != 0) break; + s--; + } + } + if (s < sbeg) { + RESIZE_CAPA(str, RSTRING(str)->len + 1); + s = RSTRING(str)->ptr + n; + memmove(s+1, s, RSTRING(str)->len - n); + *s = c; + RSTRING(str)->len += 1; + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + } + + return str; +} + + +/* + * call-seq: + * str.succ! => str + * str.next! => str + * + * Equivalent to <code>String#succ</code>, but modifies the receiver in + * place. + */ + +static VALUE +rb_str_succ_bang(str) + VALUE str; +{ + rb_str_shared_replace(str, rb_str_succ(str)); + + return str; +} + +VALUE +rb_str_upto(beg, end, excl) + VALUE beg, end; + int excl; +{ + VALUE current, after_end; + ID succ = rb_intern("succ"); + int n; + + StringValue(end); + n = rb_str_cmp(beg, end); + if (n > 0 || (excl && n == 0)) return beg; + after_end = rb_funcall(end, succ, 0, 0); + current = beg; + while (!rb_str_equal(current, after_end)) { + rb_yield(current); + if (!excl && rb_str_equal(current, end)) break; + current = rb_funcall(current, succ, 0, 0); + StringValue(current); + if (excl && rb_str_equal(current, end)) break; + StringValue(current); + if (RSTRING(current)->len > RSTRING(end)->len || RSTRING(current)->len == 0) + break; + } + + return beg; +} + + +/* + * call-seq: + * str.upto(other_str) {|s| block } => str + * + * Iterates through successive values, starting at <i>str</i> and + * ending at <i>other_str</i> inclusive, passing each value in turn to + * the block. The <code>String#succ</code> method is used to generate + * each value. + * + * "a8".upto("b6") {|s| print s, ' ' } + * for s in "a8".."b6" + * print s, ' ' + * end + * + * <em>produces:</em> + * + * a8 a9 b0 b1 b2 b3 b4 b5 b6 + * a8 a9 b0 b1 b2 b3 b4 b5 b6 + */ + +static VALUE +rb_str_upto_m(beg, end) + VALUE beg, end; +{ + return rb_str_upto(beg, end, Qfalse); +} + +static VALUE +rb_str_subpat(str, re, nth) + VALUE str, re; + int nth; +{ + if (rb_reg_search(re, str, 0, 0) >= 0) { + return rb_reg_nth_match(nth, rb_backref_get()); + } + return Qnil; +} + +static VALUE +rb_str_aref(str, indx) + VALUE str; + VALUE indx; +{ + long idx; + + switch (TYPE(indx)) { + case T_FIXNUM: + idx = FIX2LONG(indx); + + num_index: + if (idx < 0) { + idx = RSTRING(str)->len + idx; + } + if (idx < 0 || RSTRING(str)->len <= idx) { + return Qnil; + } + return INT2FIX(RSTRING(str)->ptr[idx] & 0xff); + + case T_REGEXP: + return rb_str_subpat(str, indx, 0); + + case T_STRING: + if (rb_str_index(str, indx, 0) != -1) + return rb_str_dup(indx); + return Qnil; + + default: + /* check if indx is Range */ + { + long beg, len; + VALUE tmp; + + switch (rb_range_beg_len(indx, &beg, &len, RSTRING(str)->len, 0)) { + case Qfalse: + break; + case Qnil: + return Qnil; + default: + tmp = rb_str_substr(str, beg, len); + OBJ_INFECT(tmp, indx); + return tmp; + } + } + idx = NUM2LONG(indx); + goto num_index; + } + return Qnil; /* not reached */ +} + + +/* + * call-seq: + * str[fixnum] => fixnum or nil + * str[fixnum, fixnum] => new_str or nil + * str[range] => new_str or nil + * str[regexp] => new_str or nil + * str[regexp, fixnum] => new_str or nil + * str[other_str] => new_str or nil + * str.slice(fixnum) => fixnum or nil + * str.slice(fixnum, fixnum) => new_str or nil + * str.slice(range) => new_str or nil + * str.slice(regexp) => new_str or nil + * str.slice(regexp, fixnum) => new_str or nil + * str.slice(other_str) => new_str or nil + * + * Element Reference---If passed a single <code>Fixnum</code>, returns the code + * of the character at that position. If passed two <code>Fixnum</code> + * objects, returns a substring starting at the offset given by the first, and + * a length given by the second. If given a range, a substring containing + * characters at offsets given by the range is returned. In all three cases, if + * an offset is negative, it is counted from the end of <i>str</i>. Returns + * <code>nil</code> if the initial offset falls outside the string, the length + * is negative, or the beginning of the range is greater than the end. + * + * If a <code>Regexp</code> is supplied, the matching portion of <i>str</i> is + * returned. If a numeric parameter follows the regular expression, that + * component of the <code>MatchData</code> is returned instead. If a + * <code>String</code> is given, that string is returned if it occurs in + * <i>str</i>. In both cases, <code>nil</code> is returned if there is no + * match. + * + * a = "hello there" + * a[1] #=> 101 + * a[1,3] #=> "ell" + * a[1..3] #=> "ell" + * a[-3,2] #=> "er" + * a[-4..-2] #=> "her" + * a[12..-1] #=> nil + * a[-2..-4] #=> "" + * a[/[aeiou](.)\1/] #=> "ell" + * a[/[aeiou](.)\1/, 0] #=> "ell" + * a[/[aeiou](.)\1/, 1] #=> "l" + * a[/[aeiou](.)\1/, 2] #=> nil + * a["lo"] #=> "lo" + * a["bye"] #=> nil + */ + +static VALUE +rb_str_aref_m(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + if (argc == 2) { + if (TYPE(argv[0]) == T_REGEXP) { + return rb_str_subpat(str, argv[0], NUM2INT(argv[1])); + } + return rb_str_substr(str, NUM2LONG(argv[0]), NUM2LONG(argv[1])); + } + if (argc != 1) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc); + } + return rb_str_aref(str, argv[0]); +} + +static void +rb_str_splice(str, beg, len, val) + VALUE str; + long beg, len; + VALUE val; +{ + if (len < 0) rb_raise(rb_eIndexError, "negative length %ld", len); + + StringValue(val); + rb_str_modify(str); + + if (RSTRING(str)->len < beg) { + out_of_range: + rb_raise(rb_eIndexError, "index %ld out of string", beg); + } + if (beg < 0) { + if (-beg > RSTRING(str)->len) { + goto out_of_range; + } + beg += RSTRING(str)->len; + } + if (RSTRING(str)->len < len || RSTRING(str)->len < beg + len) { + len = RSTRING(str)->len - beg; + } + + if (len < RSTRING(val)->len) { + /* expand string */ + RESIZE_CAPA(str, RSTRING(str)->len + RSTRING(val)->len - len + 1); + } + + if (RSTRING(val)->len != len) { + memmove(RSTRING(str)->ptr + beg + RSTRING(val)->len, + RSTRING(str)->ptr + beg + len, + RSTRING(str)->len - (beg + len)); + } + if (RSTRING(str)->len < beg && len < 0) { + MEMZERO(RSTRING(str)->ptr + RSTRING(str)->len, char, -len); + } + if (RSTRING(val)->len > 0) { + memmove(RSTRING(str)->ptr+beg, RSTRING(val)->ptr, RSTRING(val)->len); + } + RSTRING(str)->len += RSTRING(val)->len - len; + if (RSTRING(str)->ptr) { + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + } + OBJ_INFECT(str, val); +} + +void +rb_str_update(str, beg, len, val) + VALUE str; + long beg, len; + VALUE val; +{ + rb_str_splice(str, beg, len, val); +} + +static void +rb_str_subpat_set(str, re, nth, val) + VALUE str, re; + int nth; + VALUE val; +{ + VALUE match; + long start, end, len; + + if (rb_reg_search(re, str, 0, 0) < 0) { + rb_raise(rb_eIndexError, "regexp not matched"); + } + match = rb_backref_get(); + if (nth >= RMATCH(match)->regs->num_regs) { + out_of_range: + rb_raise(rb_eIndexError, "index %d out of regexp", nth); + } + if (nth < 0) { + if (-nth >= RMATCH(match)->regs->num_regs) { + goto out_of_range; + } + nth += RMATCH(match)->regs->num_regs; + } + + start = RMATCH(match)->BEG(nth); + if (start == -1) { + rb_raise(rb_eIndexError, "regexp group %d not matched", nth); + } + end = RMATCH(match)->END(nth); + len = end - start; + rb_str_splice(str, start, len, val); +} + +static VALUE +rb_str_aset(str, indx, val) + VALUE str; + VALUE indx, val; +{ + long idx, beg; + + switch (TYPE(indx)) { + case T_FIXNUM: + idx = FIX2LONG(indx); + num_index: + if (RSTRING(str)->len <= idx) { + out_of_range: + rb_raise(rb_eIndexError, "index %ld out of string", idx); + } + if (idx < 0) { + if (-idx > RSTRING(str)->len) + goto out_of_range; + idx += RSTRING(str)->len; + } + if (FIXNUM_P(val)) { + rb_str_modify(str); + if (RSTRING(str)->len == idx) { + RSTRING(str)->len += 1; + RESIZE_CAPA(str, RSTRING(str)->len); + } + RSTRING(str)->ptr[idx] = FIX2INT(val) & 0xff; + } + else { + rb_str_splice(str, idx, 1, val); + } + return val; + + case T_REGEXP: + rb_str_subpat_set(str, indx, 0, val); + return val; + + case T_STRING: + beg = rb_str_index(str, indx, 0); + if (beg < 0) { + rb_raise(rb_eIndexError, "string not matched"); + } + rb_str_splice(str, beg, RSTRING(indx)->len, val); + return val; + + default: + /* check if indx is Range */ + { + long beg, len; + if (rb_range_beg_len(indx, &beg, &len, RSTRING(str)->len, 2)) { + rb_str_splice(str, beg, len, val); + return val; + } + } + idx = NUM2LONG(indx); + goto num_index; + } +} + +/* + * call-seq: + * str[fixnum] = fixnum + * str[fixnum] = new_str + * str[fixnum, fixnum] = new_str + * str[range] = aString + * str[regexp] = new_str + * str[regexp, fixnum] = new_str + * str[other_str] = new_str + * + * Element Assignment---Replaces some or all of the content of <i>str</i>. The + * portion of the string affected is determined using the same criteria as + * <code>String#[]</code>. If the replacement string is not the same length as + * the text it is replacing, the string will be adjusted accordingly. If the + * regular expression or string is used as the index doesn't match a position + * in the string, <code>IndexError</code> is raised. If the regular expression + * form is used, the optional second <code>Fixnum</code> allows you to specify + * which portion of the match to replace (effectively using the + * <code>MatchData</code> indexing rules. The forms that take a + * <code>Fixnum</code> will raise an <code>IndexError</code> if the value is + * out of range; the <code>Range</code> form will raise a + * <code>RangeError</code>, and the <code>Regexp</code> and <code>String</code> + * forms will silently ignore the assignment. + */ + +static VALUE +rb_str_aset_m(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + if (argc == 3) { + if (TYPE(argv[0]) == T_REGEXP) { + rb_str_subpat_set(str, argv[0], NUM2INT(argv[1]), argv[2]); + } + else { + rb_str_splice(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]); + } + return argv[2]; + } + if (argc != 2) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc); + } + return rb_str_aset(str, argv[0], argv[1]); +} + +/* + * call-seq: + * str.insert(index, other_str) => str + * + * Inserts <i>other_str</i> before the character at the given + * <i>index</i>, modifying <i>str</i>. Negative indices count from the + * end of the string, and insert <em>after</em> the given character. + * The intent is insert <i>aString</i> so that it starts at the given + * <i>index</i>. + * + * "abcd".insert(0, 'X') #=> "Xabcd" + * "abcd".insert(3, 'X') #=> "abcXd" + * "abcd".insert(4, 'X') #=> "abcdX" + * "abcd".insert(-3, 'X') #=> "abXcd" + * "abcd".insert(-1, 'X') #=> "abcdX" + */ + +static VALUE +rb_str_insert(str, idx, str2) + VALUE str, idx, str2; +{ + long pos = NUM2LONG(idx); + + if (pos == -1) { + pos = RSTRING(str)->len; + } + else if (pos < 0) { + pos++; + } + rb_str_splice(str, pos, 0, str2); + return str; +} + +/* + * call-seq: + * str.slice!(fixnum) => fixnum or nil + * str.slice!(fixnum, fixnum) => new_str or nil + * str.slice!(range) => new_str or nil + * str.slice!(regexp) => new_str or nil + * str.slice!(other_str) => new_str or nil + * + * Deletes the specified portion from <i>str</i>, and returns the portion + * deleted. The forms that take a <code>Fixnum</code> will raise an + * <code>IndexError</code> if the value is out of range; the <code>Range</code> + * form will raise a <code>RangeError</code>, and the <code>Regexp</code> and + * <code>String</code> forms will silently ignore the assignment. + * + * string = "this is a string" + * string.slice!(2) #=> 105 + * string.slice!(3..6) #=> " is " + * string.slice!(/s.*t/) #=> "sa st" + * string.slice!("r") #=> "r" + * string #=> "thing" + */ + +static VALUE +rb_str_slice_bang(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE result; + VALUE buf[3]; + int i; + + if (argc < 1 || 2 < argc) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc); + } + for (i=0; i<argc; i++) { + buf[i] = argv[i]; + } + buf[i] = rb_str_new(0,0); + result = rb_str_aref_m(argc, buf, str); + if (!NIL_P(result)) { + rb_str_aset_m(argc+1, buf, str); + } + return result; +} + +static VALUE +get_pat(pat, quote) + VALUE pat; + int quote; +{ + VALUE val; + + switch (TYPE(pat)) { + case T_REGEXP: + return pat; + + case T_STRING: + break; + + default: + val = rb_check_string_type(pat); + if (NIL_P(val)) { + Check_Type(pat, T_REGEXP); + } + pat = val; + } + + if (quote) { + pat = rb_reg_quote(pat); + } + + return rb_reg_regcomp(pat); +} + + +/* + * call-seq: + * str.sub!(pattern, replacement) => str or nil + * str.sub!(pattern) {|match| block } => str or nil + * + * Performs the substitutions of <code>String#sub</code> in place, + * returning <i>str</i>, or <code>nil</code> if no substitutions were + * performed. + */ + +static VALUE +rb_str_sub_bang(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE pat, repl, match; + struct re_registers *regs; + int iter = 0; + int tainted = 0; + long plen; + + if (argc == 1 && rb_block_given_p()) { + iter = 1; + } + else if (argc == 2) { + repl = argv[1]; + StringValue(repl); + if (OBJ_TAINTED(repl)) tainted = 1; + } + else { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc); + } + + pat = get_pat(argv[0], 1); + if (rb_reg_search(pat, str, 0, 0) >= 0) { + match = rb_backref_get(); + regs = RMATCH(match)->regs; + + if (iter) { + char *p = RSTRING(str)->ptr; long len = RSTRING(str)->len; + + rb_match_busy(match); + repl = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); + str_mod_check(str, p, len); + str_frozen_check(str); + rb_backref_set(match); + } + else { + repl = rb_reg_regsub(repl, str, regs); + } + rb_str_modify(str); + if (OBJ_TAINTED(repl)) tainted = 1; + plen = END(0) - BEG(0); + if (RSTRING(repl)->len > plen) { + RESIZE_CAPA(str, RSTRING(str)->len + RSTRING(repl)->len - plen); + } + if (RSTRING(repl)->len != plen) { + memmove(RSTRING(str)->ptr + BEG(0) + RSTRING(repl)->len, + RSTRING(str)->ptr + BEG(0) + plen, + RSTRING(str)->len - BEG(0) - plen); + } + memcpy(RSTRING(str)->ptr + BEG(0), + RSTRING(repl)->ptr, RSTRING(repl)->len); + RSTRING(str)->len += RSTRING(repl)->len - plen; + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + if (tainted) OBJ_TAINT(str); + + return str; + } + return Qnil; +} + + +/* + * call-seq: + * str.sub(pattern, replacement) => new_str + * str.sub(pattern) {|match| block } => new_str + * + * Returns a copy of <i>str</i> with the <em>first</em> occurrence of + * <i>pattern</i> replaced with either <i>replacement</i> or the value of the + * block. The <i>pattern</i> will typically be a <code>Regexp</code>; if it is + * a <code>String</code> then no regular expression metacharacters will be + * interpreted (that is <code>/\d/</code> will match a digit, but + * <code>'\d'</code> will match a backslash followed by a 'd'). + * + * If the method call specifies <i>replacement</i>, special variables such as + * <code>$&</code> will not be useful, as substitution into the string occurs + * before the pattern match starts. However, the sequences <code>\1</code>, + * <code>\2</code>, etc., may be used. + * + * In the block form, the current match string is passed in as a parameter, and + * variables such as <code>$1</code>, <code>$2</code>, <code>$`</code>, + * <code>$&</code>, and <code>$'</code> will be set appropriately. The value + * returned by the block will be substituted for the match on each call. + * + * The result inherits any tainting in the original string or any supplied + * replacement string. + * + * "hello".sub(/[aeiou]/, '*') #=> "h*llo" + * "hello".sub(/([aeiou])/, '<\1>') #=> "h<e>llo" + * "hello".sub(/./) {|s| s[0].to_s + ' ' } #=> "104 ello" + */ + +static VALUE +rb_str_sub(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + str = rb_str_dup(str); + rb_str_sub_bang(argc, argv, str); + return str; +} + +static VALUE +str_gsub(argc, argv, str, bang) + int argc; + VALUE *argv; + VALUE str; + int bang; +{ + VALUE pat, val, repl, match, dest; + struct re_registers *regs; + long beg, n; + long offset, blen, slen, len; + int iter = 0; + char *buf, *bp, *sp, *cp; + int tainted = 0; + + if (argc == 1 && rb_block_given_p()) { + iter = 1; + } + else if (argc == 2) { + repl = argv[1]; + StringValue(repl); + if (OBJ_TAINTED(repl)) tainted = 1; + } + else { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc); + } + + pat = get_pat(argv[0], 1); + offset=0; n=0; + beg = rb_reg_search(pat, str, 0, 0); + if (beg < 0) { + if (bang) return Qnil; /* no match, no substitution */ + return rb_str_dup(str); + } + + blen = RSTRING(str)->len + 30; /* len + margin */ + dest = str_new(0, 0, blen); + buf = RSTRING(dest)->ptr; + bp = buf; + sp = cp = RSTRING(str)->ptr; + slen = RSTRING(str)->len; + + rb_str_locktmp(dest); + while (beg >= 0) { + n++; + match = rb_backref_get(); + regs = RMATCH(match)->regs; + if (iter) { + rb_match_busy(match); + val = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); + str_mod_check(str, sp, slen); + if (bang) str_frozen_check(str); + if (val == dest) { /* paranoid chack [ruby-dev:24827] */ + rb_raise(rb_eRuntimeError, "block should not cheat"); + } + rb_backref_set(match); + } + else { + val = rb_reg_regsub(repl, str, regs); + } + if (OBJ_TAINTED(val)) tainted = 1; + len = (bp - buf) + (beg - offset) + RSTRING(val)->len + 3; + if (blen < len) { + while (blen < len) blen *= 2; + len = bp - buf; + RESIZE_CAPA(dest, blen); + RSTRING(dest)->len = blen; + buf = RSTRING(dest)->ptr; + bp = buf + len; + } + len = beg - offset; /* copy pre-match substr */ + memcpy(bp, cp, len); + bp += len; + memcpy(bp, RSTRING(val)->ptr, RSTRING(val)->len); + bp += RSTRING(val)->len; + offset = END(0); + if (BEG(0) == END(0)) { + /* + * Always consume at least one character of the input string + * in order to prevent infinite loops. + */ + if (RSTRING(str)->len <= END(0)) break; + len = mbclen2(RSTRING(str)->ptr[END(0)], pat); + memcpy(bp, RSTRING(str)->ptr+END(0), len); + bp += len; + offset = END(0) + len; + } + cp = RSTRING(str)->ptr + offset; + if (offset > RSTRING(str)->len) break; + beg = rb_reg_search(pat, str, offset, 0); + } + if (RSTRING(str)->len > offset) { + len = bp - buf; + if (blen - len < RSTRING(str)->len - offset) { + blen = len + RSTRING(str)->len - offset; + RESIZE_CAPA(dest, blen); + buf = RSTRING(dest)->ptr; + bp = buf + len; + } + memcpy(bp, cp, RSTRING(str)->len - offset); + bp += RSTRING(str)->len - offset; + } + rb_backref_set(match); + *bp = '\0'; + rb_str_unlocktmp(dest); + if (bang) { + if (str_independent(str)) { + free(RSTRING(str)->ptr); + } + FL_UNSET(str, STR_NOCAPA); + RSTRING(str)->ptr = buf; + RSTRING(str)->aux.capa = blen; + RSTRING(dest)->ptr = 0; + RSTRING(dest)->len = 0; + } + else { + RBASIC(dest)->klass = rb_obj_class(str); + OBJ_INFECT(dest, str); + str = dest; + } + RSTRING(str)->len = bp - buf; + + if (tainted) OBJ_TAINT(str); + return str; +} + + +/* + * call-seq: + * str.gsub!(pattern, replacement) => str or nil + * str.gsub!(pattern) {|match| block } => str or nil + * + * Performs the substitutions of <code>String#gsub</code> in place, returning + * <i>str</i>, or <code>nil</code> if no substitutions were performed. + */ + +static VALUE +rb_str_gsub_bang(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + return str_gsub(argc, argv, str, 1); +} + + +/* + * call-seq: + * str.gsub(pattern, replacement) => new_str + * str.gsub(pattern) {|match| block } => new_str + * + * Returns a copy of <i>str</i> with <em>all</em> occurrences of <i>pattern</i> + * replaced with either <i>replacement</i> or the value of the block. The + * <i>pattern</i> will typically be a <code>Regexp</code>; if it is a + * <code>String</code> then no regular expression metacharacters will be + * interpreted (that is <code>/\d/</code> will match a digit, but + * <code>'\d'</code> will match a backslash followed by a 'd'). + * + * If a string is used as the replacement, special variables from the match + * (such as <code>$&</code> and <code>$1</code>) cannot be substituted into it, + * as substitution into the string occurs before the pattern match + * starts. However, the sequences <code>\1</code>, <code>\2</code>, and so on + * may be used to interpolate successive groups in the match. + * + * In the block form, the current match string is passed in as a parameter, and + * variables such as <code>$1</code>, <code>$2</code>, <code>$`</code>, + * <code>$&</code>, and <code>$'</code> will be set appropriately. The value + * returned by the block will be substituted for the match on each call. + * + * The result inherits any tainting in the original string or any supplied + * replacement string. + * + * "hello".gsub(/[aeiou]/, '*') #=> "h*ll*" + * "hello".gsub(/([aeiou])/, '<\1>') #=> "h<e>ll<o>" + * "hello".gsub(/./) {|s| s[0].to_s + ' '} #=> "104 101 108 108 111 " + */ + +static VALUE +rb_str_gsub(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + return str_gsub(argc, argv, str, 0); +} + + +/* + * call-seq: + * str.replace(other_str) => str + * + * Replaces the contents and taintedness of <i>str</i> with the corresponding + * values in <i>other_str</i>. + * + * s = "hello" #=> "hello" + * s.replace "world" #=> "world" + */ + +static VALUE +rb_str_replace(str, str2) + VALUE str, str2; +{ + if (str == str2) return str; + + StringValue(str2); + if (FL_TEST(str2, ELTS_SHARED)) { + if (str_independent(str)) { + free(RSTRING(str)->ptr); + } + RSTRING(str)->len = RSTRING(str2)->len; + RSTRING(str)->ptr = RSTRING(str2)->ptr; + FL_SET(str, ELTS_SHARED); + FL_UNSET(str, STR_ASSOC); + RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared; + } + else { + if (str_independent(str)) { + rb_str_resize(str, RSTRING(str2)->len); + memcpy(RSTRING(str)->ptr, RSTRING(str2)->ptr, RSTRING(str2)->len); + if (!RSTRING(str)->ptr) { + make_null_str(str); + } + } + else { + RSTRING(str)->ptr = RSTRING(str2)->ptr; + RSTRING(str)->len = RSTRING(str2)->len; + str_make_independent(str); + } + if (FL_TEST(str2, STR_ASSOC)) { + FL_SET(str, STR_ASSOC); + RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared; + } + } + + OBJ_INFECT(str, str2); + return str; +} + +static VALUE +uscore_get() +{ + VALUE line; + + line = rb_lastline_get(); + if (TYPE(line) != T_STRING) { + rb_raise(rb_eTypeError, "$_ value need to be String (%s given)", + NIL_P(line) ? "nil" : rb_obj_classname(line)); + } + return line; +} + +/* + * call-seq: + * sub!(pattern, replacement) => $_ or nil + * sub!(pattern) {|...| block } => $_ or nil + * + * Equivalent to <code>$_.sub!(<i>args</i>)</code>. + */ + +static VALUE +rb_f_sub_bang(argc, argv) + int argc; + VALUE *argv; +{ + return rb_str_sub_bang(argc, argv, uscore_get()); +} + +/* + * call-seq: + * sub(pattern, replacement) => $_ + * sub(pattern) { block } => $_ + * + * Equivalent to <code>$_.sub(<i>args</i>)</code>, except that + * <code>$_</code> will be updated if substitution occurs. + */ + +static VALUE +rb_f_sub(argc, argv) + int argc; + VALUE *argv; +{ + VALUE str = rb_str_dup(uscore_get()); + + if (NIL_P(rb_str_sub_bang(argc, argv, str))) + return str; + rb_lastline_set(str); + return str; +} + +/* + * call-seq: + * gsub!(pattern, replacement) => string or nil + * gsub!(pattern) {|...| block } => string or nil + * + * Equivalent to <code>Kernel::gsub</code>, except <code>nil</code> is + * returned if <code>$_</code> is not modified. + * + * $_ = "quick brown fox" + * gsub! /cat/, '*' #=> nil + * $_ #=> "quick brown fox" + */ + +static VALUE +rb_f_gsub_bang(argc, argv) + int argc; + VALUE *argv; +{ + return rb_str_gsub_bang(argc, argv, uscore_get()); +} + +/* + * call-seq: + * gsub(pattern, replacement) => string + * gsub(pattern) {|...| block } => string + * + * Equivalent to <code>$_.gsub...</code>, except that <code>$_</code> + * receives the modified result. + * + * $_ = "quick brown fox" + * gsub /[aeiou]/, '*' #=> "q**ck br*wn f*x" + * $_ #=> "q**ck br*wn f*x" + */ + +static VALUE +rb_f_gsub(argc, argv) + int argc; + VALUE *argv; +{ + VALUE str = rb_str_dup(uscore_get()); + + if (NIL_P(rb_str_gsub_bang(argc, argv, str))) + return str; + rb_lastline_set(str); + return str; +} + + +/* + * call-seq: + * str.reverse! => str + * + * Reverses <i>str</i> in place. + */ + +static VALUE +rb_str_reverse_bang(str) + VALUE str; +{ + char *s, *e; + char c; + + if (RSTRING(str)->len > 1) { + rb_str_modify(str); + s = RSTRING(str)->ptr; + e = s + RSTRING(str)->len - 1; + while (s < e) { + c = *s; + *s++ = *e; + *e-- = c; + } + } + return str; +} + + +/* + * call-seq: + * str.reverse => new_str + * + * Returns a new string with the characters from <i>str</i> in reverse order. + * + * "stressed".reverse #=> "desserts" + */ + +static VALUE +rb_str_reverse(str) + VALUE str; +{ + VALUE obj; + char *s, *e, *p; + + if (RSTRING(str)->len <= 1) return rb_str_dup(str); + + obj = rb_str_new5(str, 0, RSTRING(str)->len); + s = RSTRING(str)->ptr; e = s + RSTRING(str)->len - 1; + p = RSTRING(obj)->ptr; + + while (e >= s) { + *p++ = *e--; + } + OBJ_INFECT(obj, str); + + return obj; +} + + +/* + * call-seq: + * str.include? other_str => true or false + * str.include? fixnum => true or false + * + * Returns <code>true</code> if <i>str</i> contains the given string or + * character. + * + * "hello".include? "lo" #=> true + * "hello".include? "ol" #=> false + * "hello".include? ?h #=> true + */ + +static VALUE +rb_str_include(str, arg) + VALUE str, arg; +{ + long i; + + if (FIXNUM_P(arg)) { + if (memchr(RSTRING(str)->ptr, FIX2INT(arg), RSTRING(str)->len)) + return Qtrue; + return Qfalse; + } + + StringValue(arg); + i = rb_str_index(str, arg, 0); + + if (i == -1) return Qfalse; + return Qtrue; +} + + +/* + * call-seq: + * str.to_i(base=10) => integer + * + * Returns the result of interpreting leading characters in <i>str</i> as an + * integer base <i>base</i> (2, 8, 10, or 16). Extraneous characters past the + * end of a valid number are ignored. If there is not a valid number at the + * start of <i>str</i>, <code>0</code> is returned. This method never raises an + * exception. + * + * "12345".to_i #=> 12345 + * "99 red balloons".to_i #=> 99 + * "0a".to_i #=> 0 + * "0a".to_i(16) #=> 10 + * "hello".to_i #=> 0 + * "1100101".to_i(2) #=> 101 + * "1100101".to_i(8) #=> 294977 + * "1100101".to_i(10) #=> 1100101 + * "1100101".to_i(16) #=> 17826049 + */ + +static VALUE +rb_str_to_i(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE b; + int base; + + rb_scan_args(argc, argv, "01", &b); + if (argc == 0) base = 10; + else base = NUM2INT(b); + + if (base < 0) { + rb_raise(rb_eArgError, "illegal radix %d", base); + } + return rb_str_to_inum(str, base, Qfalse); +} + + +/* + * call-seq: + * str.to_f => float + * + * Returns the result of interpreting leading characters in <i>str</i> as a + * floating point number. Extraneous characters past the end of a valid number + * are ignored. If there is not a valid number at the start of <i>str</i>, + * <code>0.0</code> is returned. This method never raises an exception. + * + * "123.45e1".to_f #=> 1234.5 + * "45.67 degrees".to_f #=> 45.67 + * "thx1138".to_f #=> 0.0 + */ + +static VALUE +rb_str_to_f(str) + VALUE str; +{ + return rb_float_new(rb_str_to_dbl(str, Qfalse)); +} + + +/* + * call-seq: + * str.to_s => str + * str.to_str => str + * + * Returns the receiver. + */ + +static VALUE +rb_str_to_s(str) + VALUE str; +{ + if (rb_obj_class(str) != rb_cString) { + VALUE dup = str_alloc(rb_cString); + rb_str_replace(dup, str); + return dup; + } + return str; +} + +/* + * call-seq: + * str.inspect => string + * + * Returns a printable version of _str_, with special characters + * escaped. + * + * str = "hello" + * str[3] = 8 + * str.inspect #=> "hel\010o" + */ + +VALUE +rb_str_inspect(str) + VALUE str; +{ + char *p, *pend; + VALUE result = rb_str_buf_new2("\""); + char s[5]; + + p = RSTRING(str)->ptr; pend = p + RSTRING(str)->len; + while (p < pend) { + char c = *p++; + if (ismbchar(c) && p < pend) { + int len = mbclen(c); + rb_str_buf_cat(result, p - 1, len); + p += len - 1; + } + else if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p, pend))) { + s[0] = '\\'; s[1] = c; + rb_str_buf_cat(result, s, 2); + } + else if (ISPRINT(c)) { + s[0] = c; + rb_str_buf_cat(result, s, 1); + } + else if (c == '\n') { + s[0] = '\\'; s[1] = 'n'; + rb_str_buf_cat(result, s, 2); + } + else if (c == '\r') { + s[0] = '\\'; s[1] = 'r'; + rb_str_buf_cat(result, s, 2); + } + else if (c == '\t') { + s[0] = '\\'; s[1] = 't'; + rb_str_buf_cat(result, s, 2); + } + else if (c == '\f') { + s[0] = '\\'; s[1] = 'f'; + rb_str_buf_cat(result, s, 2); + } + else if (c == '\013') { + s[0] = '\\'; s[1] = 'v'; + rb_str_buf_cat(result, s, 2); + } + else if (c == '\010') { + s[0] = '\\'; s[1] = 'b'; + rb_str_buf_cat(result, s, 2); + } + else if (c == '\007') { + s[0] = '\\'; s[1] = 'a'; + rb_str_buf_cat(result, s, 2); + } + else if (c == 033) { + s[0] = '\\'; s[1] = 'e'; + rb_str_buf_cat(result, s, 2); + } + else { + sprintf(s, "\\%03o", c & 0377); + rb_str_buf_cat2(result, s); + } + } + rb_str_buf_cat2(result, "\""); + + OBJ_INFECT(result, str); + return result; +} + + +/* + * call-seq: + * str.dump => new_str + * + * Produces a version of <i>str</i> with all nonprinting characters replaced by + * <code>\nnn</code> notation and all special characters escaped. + */ + +VALUE +rb_str_dump(str) + VALUE str; +{ + long len; + char *p, *pend; + char *q, *qend; + VALUE result; + + len = 2; /* "" */ + p = RSTRING(str)->ptr; pend = p + RSTRING(str)->len; + while (p < pend) { + char c = *p++; + switch (c) { + case '"': case '\\': + case '\n': case '\r': + case '\t': case '\f': + case '\013': case '\010': case '\007': case '\033': + len += 2; + break; + + case '#': + len += IS_EVSTR(p, pend) ? 2 : 1; + break; + + default: + if (ISPRINT(c)) { + len++; + } + else { + len += 4; /* \nnn */ + } + break; + } + } + + result = rb_str_new5(str, 0, len); + p = RSTRING(str)->ptr; pend = p + RSTRING(str)->len; + q = RSTRING(result)->ptr; qend = q + len; + + *q++ = '"'; + while (p < pend) { + char c = *p++; + + if (c == '"' || c == '\\') { + *q++ = '\\'; + *q++ = c; + } + else if (c == '#') { + if (IS_EVSTR(p, pend)) *q++ = '\\'; + *q++ = '#'; + } + else if (ISPRINT(c)) { + *q++ = c; + } + else if (c == '\n') { + *q++ = '\\'; + *q++ = 'n'; + } + else if (c == '\r') { + *q++ = '\\'; + *q++ = 'r'; + } + else if (c == '\t') { + *q++ = '\\'; + *q++ = 't'; + } + else if (c == '\f') { + *q++ = '\\'; + *q++ = 'f'; + } + else if (c == '\013') { + *q++ = '\\'; + *q++ = 'v'; + } + else if (c == '\010') { + *q++ = '\\'; + *q++ = 'b'; + } + else if (c == '\007') { + *q++ = '\\'; + *q++ = 'a'; + } + else if (c == '\033') { + *q++ = '\\'; + *q++ = 'e'; + } + else { + *q++ = '\\'; + sprintf(q, "%03o", c&0xff); + q += 3; + } + } + *q++ = '"'; + + OBJ_INFECT(result, str); + return result; +} + + +/* + * call-seq: + * str.upcase! => str or nil + * + * Upcases the contents of <i>str</i>, returning <code>nil</code> if no changes + * were made. + */ + +static VALUE +rb_str_upcase_bang(str) + VALUE str; +{ + char *s, *send; + int modify = 0; + + rb_str_modify(str); + s = RSTRING(str)->ptr; send = s + RSTRING(str)->len; + while (s < send) { + if (ismbchar(*s)) { + s+=mbclen(*s) - 1; + } + else if (ISLOWER(*s)) { + *s = toupper(*s); + modify = 1; + } + s++; + } + + if (modify) return str; + return Qnil; +} + + +/* + * call-seq: + * str.upcase => new_str + * + * Returns a copy of <i>str</i> with all lowercase letters replaced with their + * uppercase counterparts. The operation is locale insensitive---only + * characters ``a'' to ``z'' are affected. + * + * "hEllO".upcase #=> "HELLO" + */ + +static VALUE +rb_str_upcase(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_upcase_bang(str); + return str; +} + + +/* + * call-seq: + * str.downcase! => str or nil + * + * Downcases the contents of <i>str</i>, returning <code>nil</code> if no + * changes were made. + */ + +static VALUE +rb_str_downcase_bang(str) + VALUE str; +{ + char *s, *send; + int modify = 0; + + rb_str_modify(str); + s = RSTRING(str)->ptr; send = s + RSTRING(str)->len; + while (s < send) { + if (ismbchar(*s)) { + s+=mbclen(*s) - 1; + } + else if (ISUPPER(*s)) { + *s = tolower(*s); + modify = 1; + } + s++; + } + + if (modify) return str; + return Qnil; +} + + +/* + * call-seq: + * str.downcase => new_str + * + * Returns a copy of <i>str</i> with all uppercase letters replaced with their + * lowercase counterparts. The operation is locale insensitive---only + * characters ``A'' to ``Z'' are affected. + * + * "hEllO".downcase #=> "hello" + */ + +static VALUE +rb_str_downcase(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_downcase_bang(str); + return str; +} + + +/* + * call-seq: + * str.capitalize! => str or nil + * + * Modifies <i>str</i> by converting the first character to uppercase and the + * remainder to lowercase. Returns <code>nil</code> if no changes are made. + * + * a = "hello" + * a.capitalize! #=> "Hello" + * a #=> "Hello" + * a.capitalize! #=> nil + */ + +static VALUE +rb_str_capitalize_bang(str) + VALUE str; +{ + char *s, *send; + int modify = 0; + + rb_str_modify(str); + if (RSTRING(str)->len == 0 || !RSTRING(str)->ptr) return Qnil; + s = RSTRING(str)->ptr; send = s + RSTRING(str)->len; + if (ISLOWER(*s)) { + *s = toupper(*s); + modify = 1; + } + while (++s < send) { + if (ismbchar(*s)) { + s+=mbclen(*s) - 1; + } + else if (ISUPPER(*s)) { + *s = tolower(*s); + modify = 1; + } + } + if (modify) return str; + return Qnil; +} + + +/* + * call-seq: + * str.capitalize => new_str + * + * Returns a copy of <i>str</i> with the first character converted to uppercase + * and the remainder to lowercase. + * + * "hello".capitalize #=> "Hello" + * "HELLO".capitalize #=> "Hello" + * "123ABC".capitalize #=> "123abc" + */ + +static VALUE +rb_str_capitalize(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_capitalize_bang(str); + return str; +} + + +/* + * call-seq: + * str.swapcase! => str or nil + * + * Equivalent to <code>String#swapcase</code>, but modifies the receiver in + * place, returning <i>str</i>, or <code>nil</code> if no changes were made. + */ + +static VALUE +rb_str_swapcase_bang(str) + VALUE str; +{ + char *s, *send; + int modify = 0; + + rb_str_modify(str); + s = RSTRING(str)->ptr; send = s + RSTRING(str)->len; + while (s < send) { + if (ismbchar(*s)) { + s+=mbclen(*s) - 1; + } + else if (ISUPPER(*s)) { + *s = tolower(*s); + modify = 1; + } + else if (ISLOWER(*s)) { + *s = toupper(*s); + modify = 1; + } + s++; + } + + if (modify) return str; + return Qnil; +} + + +/* + * call-seq: + * str.swapcase => new_str + * + * Returns a copy of <i>str</i> with uppercase alphabetic characters converted + * to lowercase and lowercase characters converted to uppercase. + * + * "Hello".swapcase #=> "hELLO" + * "cYbEr_PuNk11".swapcase #=> "CyBeR_pUnK11" + */ + +static VALUE +rb_str_swapcase(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_swapcase_bang(str); + return str; +} + +typedef unsigned char *USTR; + +struct tr { + int gen, now, max; + char *p, *pend; +}; + +static int +trnext(t) + struct tr *t; +{ + for (;;) { + if (!t->gen) { + if (t->p == t->pend) return -1; + if (t->p < t->pend - 1 && *t->p == '\\') { + t->p++; + } + t->now = *(USTR)t->p++; + if (t->p < t->pend - 1 && *t->p == '-') { + t->p++; + if (t->p < t->pend) { + if (t->now > *(USTR)t->p) { + t->p++; + continue; + } + t->gen = 1; + t->max = *(USTR)t->p++; + } + } + return t->now; + } + else if (++t->now < t->max) { + return t->now; + } + else { + t->gen = 0; + return t->max; + } + } +} + +static VALUE rb_str_delete_bang _((int,VALUE*,VALUE)); + +static VALUE +tr_trans(str, src, repl, sflag) + VALUE str, src, repl; + int sflag; +{ + struct tr trsrc, trrepl; + int cflag = 0; + int trans[256]; + int i, c, modify = 0; + char *s, *send; + + StringValue(src); + StringValue(repl); + if (RSTRING(str)->len == 0 || !RSTRING(str)->ptr) return Qnil; + trsrc.p = RSTRING(src)->ptr; trsrc.pend = trsrc.p + RSTRING(src)->len; + if (RSTRING(src)->len >= 2 && RSTRING(src)->ptr[0] == '^') { + cflag++; + trsrc.p++; + } + if (RSTRING(repl)->len == 0) { + return rb_str_delete_bang(1, &src, str); + } + trrepl.p = RSTRING(repl)->ptr; + trrepl.pend = trrepl.p + RSTRING(repl)->len; + trsrc.gen = trrepl.gen = 0; + trsrc.now = trrepl.now = 0; + trsrc.max = trrepl.max = 0; + + if (cflag) { + for (i=0; i<256; i++) { + trans[i] = 1; + } + while ((c = trnext(&trsrc)) >= 0) { + trans[c & 0xff] = -1; + } + while ((c = trnext(&trrepl)) >= 0) + /* retrieve last replacer */; + for (i=0; i<256; i++) { + if (trans[i] >= 0) { + trans[i] = trrepl.now; + } + } + } + else { + int r; + + for (i=0; i<256; i++) { + trans[i] = -1; + } + while ((c = trnext(&trsrc)) >= 0) { + r = trnext(&trrepl); + if (r == -1) r = trrepl.now; + trans[c & 0xff] = r; + } + } + + rb_str_modify(str); + s = RSTRING(str)->ptr; send = s + RSTRING(str)->len; + if (sflag) { + char *t = s; + int c0, last = -1; + + while (s < send) { + c0 = *s++; + if ((c = trans[c0 & 0xff]) >= 0) { + if (last == c) continue; + last = c; + *t++ = c & 0xff; + modify = 1; + } + else { + last = -1; + *t++ = c0; + } + } + if (RSTRING(str)->len > (t - RSTRING(str)->ptr)) { + RSTRING(str)->len = (t - RSTRING(str)->ptr); + modify = 1; + *t = '\0'; + } + } + else { + while (s < send) { + if ((c = trans[*s & 0xff]) >= 0) { + *s = c & 0xff; + modify = 1; + } + s++; + } + } + + if (modify) return str; + return Qnil; +} + + +/* + * call-seq: + * str.tr!(from_str, to_str) => str or nil + * + * Translates <i>str</i> in place, using the same rules as + * <code>String#tr</code>. Returns <i>str</i>, or <code>nil</code> if no + * changes were made. + */ + +static VALUE +rb_str_tr_bang(str, src, repl) + VALUE str, src, repl; +{ + return tr_trans(str, src, repl, 0); +} + + +/* + * call-seq: + * str.tr(from_str, to_str) => new_str + * + * Returns a copy of <i>str</i> with the characters in <i>from_str</i> replaced + * by the corresponding characters in <i>to_str</i>. If <i>to_str</i> is + * shorter than <i>from_str</i>, it is padded with its last character. Both + * strings may use the c1--c2 notation to denote ranges of characters, and + * <i>from_str</i> may start with a <code>^</code>, which denotes all + * characters except those listed. + * + * "hello".tr('aeiou', '*') #=> "h*ll*" + * "hello".tr('^aeiou', '*') #=> "*e**o" + * "hello".tr('el', 'ip') #=> "hippo" + * "hello".tr('a-y', 'b-z') #=> "ifmmp" + */ + +static VALUE +rb_str_tr(str, src, repl) + VALUE str, src, repl; +{ + str = rb_str_dup(str); + tr_trans(str, src, repl, 0); + return str; +} + +static void +tr_setup_table(str, table, init) + VALUE str; + char table[256]; + int init; +{ + char buf[256]; + struct tr tr; + int i, c; + int cflag = 0; + + tr.p = RSTRING(str)->ptr; tr.pend = tr.p + RSTRING(str)->len; + tr.gen = tr.now = tr.max = 0; + if (RSTRING(str)->len > 1 && RSTRING(str)->ptr[0] == '^') { + cflag = 1; + tr.p++; + } + + if (init) { + for (i=0; i<256; i++) { + table[i] = 1; + } + } + for (i=0; i<256; i++) { + buf[i] = cflag; + } + while ((c = trnext(&tr)) >= 0) { + buf[c & 0xff] = !cflag; + } + for (i=0; i<256; i++) { + table[i] = table[i] && buf[i]; + } +} + + +/* + * call-seq: + * str.delete!([other_str]+>) => str or nil + * + * Performs a <code>delete</code> operation in place, returning <i>str</i>, or + * <code>nil</code> if <i>str</i> was not modified. + */ + +static VALUE +rb_str_delete_bang(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + char *s, *send, *t; + char squeez[256]; + int modify = 0; + int init = 1; + int i; + + if (argc < 1) { + rb_raise(rb_eArgError, "wrong number of arguments"); + } + for (i=0; i<argc; i++) { + VALUE s = argv[i]; + + StringValue(s); + tr_setup_table(s, squeez, init); + init = 0; + } + + rb_str_modify(str); + s = t = RSTRING(str)->ptr; + if (!s || RSTRING(str)->len == 0) return Qnil; + send = s + RSTRING(str)->len; + while (s < send) { + if (squeez[*s & 0xff]) + modify = 1; + else + *t++ = *s; + s++; + } + *t = '\0'; + RSTRING(str)->len = t - RSTRING(str)->ptr; + + if (modify) return str; + return Qnil; +} + + +/* + * call-seq: + * str.delete([other_str]+) => new_str + * + * Returns a copy of <i>str</i> with all characters in the intersection of its + * arguments deleted. Uses the same rules for building the set of characters as + * <code>String#count</code>. + * + * "hello".delete "l","lo" #=> "heo" + * "hello".delete "lo" #=> "he" + * "hello".delete "aeiou", "^e" #=> "hell" + * "hello".delete "ej-m" #=> "ho" + */ + +static VALUE +rb_str_delete(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + str = rb_str_dup(str); + rb_str_delete_bang(argc, argv, str); + return str; +} + + +/* + * call-seq: + * str.squeeze!([other_str]*) => str or nil + * + * Squeezes <i>str</i> in place, returning either <i>str</i>, or + * <code>nil</code> if no changes were made. + */ + +static VALUE +rb_str_squeeze_bang(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + char squeez[256]; + char *s, *send, *t; + int c, save, modify = 0; + int init = 1; + int i; + + if (argc == 0) { + for (i=0; i<256; i++) { + squeez[i] = 1; + } + } + else { + for (i=0; i<argc; i++) { + VALUE s = argv[i]; + + StringValue(s); + tr_setup_table(s, squeez, init); + init = 0; + } + } + + rb_str_modify(str); + s = t = RSTRING(str)->ptr; + if (!s || RSTRING(str)->len == 0) return Qnil; + send = s + RSTRING(str)->len; + save = -1; + while (s < send) { + c = *s++ & 0xff; + if (c != save || !squeez[c]) { + *t++ = save = c; + } + } + *t = '\0'; + if (t - RSTRING(str)->ptr != RSTRING(str)->len) { + RSTRING(str)->len = t - RSTRING(str)->ptr; + modify = 1; + } + + if (modify) return str; + return Qnil; +} + + +/* + * call-seq: + * str.squeeze([other_str]*) => new_str + * + * Builds a set of characters from the <i>other_str</i> parameter(s) using the + * procedure described for <code>String#count</code>. Returns a new string + * where runs of the same character that occur in this set are replaced by a + * single character. If no arguments are given, all runs of identical + * characters are replaced by a single character. + * + * "yellow moon".squeeze #=> "yelow mon" + * " now is the".squeeze(" ") #=> " now is the" + * "putters shoot balls".squeeze("m-z") #=> "puters shot balls" + */ + +static VALUE +rb_str_squeeze(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + str = rb_str_dup(str); + rb_str_squeeze_bang(argc, argv, str); + return str; +} + + +/* + * call-seq: + * str.tr_s!(from_str, to_str) => str or nil + * + * Performs <code>String#tr_s</code> processing on <i>str</i> in place, + * returning <i>str</i>, or <code>nil</code> if no changes were made. + */ + +static VALUE +rb_str_tr_s_bang(str, src, repl) + VALUE str, src, repl; +{ + return tr_trans(str, src, repl, 1); +} + + +/* + * call-seq: + * str.tr_s(from_str, to_str) => new_str + * + * Processes a copy of <i>str</i> as described under <code>String#tr</code>, + * then removes duplicate characters in regions that were affected by the + * translation. + * + * "hello".tr_s('l', 'r') #=> "hero" + * "hello".tr_s('el', '*') #=> "h*o" + * "hello".tr_s('el', 'hx') #=> "hhxo" + */ + +static VALUE +rb_str_tr_s(str, src, repl) + VALUE str, src, repl; +{ + str = rb_str_dup(str); + tr_trans(str, src, repl, 1); + return str; +} + + +/* + * call-seq: + * str.count([other_str]+) => fixnum + * + * Each <i>other_str</i> parameter defines a set of characters to count. The + * intersection of these sets defines the characters to count in + * <i>str</i>. Any <i>other_str</i> that starts with a caret (^) is + * negated. The sequence c1--c2 means all characters between c1 and c2. + * + * a = "hello world" + * a.count "lo" #=> 5 + * a.count "lo", "o" #=> 2 + * a.count "hello", "^l" #=> 4 + * a.count "ej-m" #=> 4 + */ + +static VALUE +rb_str_count(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + char table[256]; + char *s, *send; + int init = 1; + int i; + + if (argc < 1) { + rb_raise(rb_eArgError, "wrong number of arguments"); + } + for (i=0; i<argc; i++) { + VALUE s = argv[i]; + + StringValue(s); + tr_setup_table(s, table, init); + init = 0; + } + + s = RSTRING(str)->ptr; + if (!s || RSTRING(str)->len == 0) return INT2FIX(0); + send = s + RSTRING(str)->len; + i = 0; + while (s < send) { + if (table[*s++ & 0xff]) { + i++; + } + } + return INT2NUM(i); +} + + +/* + * call-seq: + * str.split(pattern=$;, [limit]) => anArray + * + * Divides <i>str</i> into substrings based on a delimiter, returning an array + * of these substrings. + * + * If <i>pattern</i> is a <code>String</code>, then its contents are used as + * the delimiter when splitting <i>str</i>. If <i>pattern</i> is a single + * space, <i>str</i> is split on whitespace, with leading whitespace and runs + * of contiguous whitespace characters ignored. + * + * If <i>pattern</i> is a <code>Regexp</code>, <i>str</i> is divided where the + * pattern matches. Whenever the pattern matches a zero-length string, + * <i>str</i> is split into individual characters. + * + * If <i>pattern</i> is omitted, the value of <code>$;</code> is used. If + * <code>$;</code> is <code>nil</code> (which is the default), <i>str</i> is + * split on whitespace as if ` ' were specified. + * + * If the <i>limit</i> parameter is omitted, trailing null fields are + * suppressed. If <i>limit</i> is a positive number, at most that number of + * fields will be returned (if <i>limit</i> is <code>1</code>, the entire + * string is returned as the only entry in an array). If negative, there is no + * limit to the number of fields returned, and trailing null fields are not + * suppressed. + * + * " now's the time".split #=> ["now's", "the", "time"] + * " now's the time".split(' ') #=> ["now's", "the", "time"] + * " now's the time".split(/ /) #=> ["", "now's", "", "the", "time"] + * "1, 2.34,56, 7".split(%r{,\s*}) #=> ["1", "2.34", "56", "7"] + * "hello".split(//) #=> ["h", "e", "l", "l", "o"] + * "hello".split(//, 3) #=> ["h", "e", "llo"] + * "hi mom".split(%r{\s*}) #=> ["h", "i", "m", "o", "m"] + * + * "mellow yellow".split("ello") #=> ["m", "w y", "w"] + * "1,2,,3,4,,".split(',') #=> ["1", "2", "", "3", "4"] + * "1,2,,3,4,,".split(',', 4) #=> ["1", "2", "", "3,4,,"] + * "1,2,,3,4,,".split(',', -4) #=> ["1", "2", "", "3", "4", "", ""] + */ + +static VALUE +rb_str_split_m(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE spat; + VALUE limit; + int awk_split = Qfalse; + long beg, end, i = 0; + int lim = 0; + VALUE result, tmp; + + if (rb_scan_args(argc, argv, "02", &spat, &limit) == 2) { + lim = NUM2INT(limit); + if (lim <= 0) limit = Qnil; + else if (lim == 1) { + if (RSTRING(str)->len == 0) + return rb_ary_new2(0); + return rb_ary_new3(1, str); + } + i = 1; + } + + if (NIL_P(spat)) { + if (!NIL_P(rb_fs)) { + spat = rb_fs; + goto fs_set; + } + awk_split = Qtrue; + } + else { + fs_set: + if (TYPE(spat) == T_STRING && RSTRING(spat)->len == 1) { + if (RSTRING(spat)->ptr[0] == ' ') { + awk_split = Qtrue; + } + else { + spat = rb_reg_regcomp(rb_reg_quote(spat)); + } + } + else { + spat = get_pat(spat, 1); + } + } + + result = rb_ary_new(); + beg = 0; + if (awk_split) { + char *ptr = RSTRING(str)->ptr; + long len = RSTRING(str)->len; + char *eptr = ptr + len; + int skip = 1; + + for (end = beg = 0; ptr<eptr; ptr++) { + if (skip) { + if (ISSPACE(*ptr)) { + beg++; + } + else { + end = beg+1; + skip = 0; + if (!NIL_P(limit) && lim <= i) break; + } + } + else { + if (ISSPACE(*ptr)) { + rb_ary_push(result, rb_str_substr(str, beg, end-beg)); + skip = 1; + beg = end + 1; + if (!NIL_P(limit)) ++i; + } + else { + end++; + } + } + } + } + else { + long start = beg; + long idx; + int last_null = 0; + struct re_registers *regs; + + while ((end = rb_reg_search(spat, str, start, 0)) >= 0) { + regs = RMATCH(rb_backref_get())->regs; + if (start == end && BEG(0) == END(0)) { + if (!RSTRING(str)->ptr) { + rb_ary_push(result, rb_str_new("", 0)); + break; + } + else if (last_null == 1) { + rb_ary_push(result, rb_str_substr(str, beg, mbclen2(RSTRING(str)->ptr[beg],spat))); + beg = start; + } + else { + start += mbclen2(RSTRING(str)->ptr[start],spat); + last_null = 1; + continue; + } + } + else { + rb_ary_push(result, rb_str_substr(str, beg, end-beg)); + beg = start = END(0); + } + last_null = 0; + + for (idx=1; idx < regs->num_regs; idx++) { + if (BEG(idx) == -1) continue; + if (BEG(idx) == END(idx)) + tmp = rb_str_new5(str, 0, 0); + else + tmp = rb_str_substr(str, BEG(idx), END(idx)-BEG(idx)); + rb_ary_push(result, tmp); + } + if (!NIL_P(limit) && lim <= ++i) break; + } + } + if (RSTRING(str)->len > 0 && (!NIL_P(limit) || RSTRING(str)->len > beg || lim < 0)) { + if (RSTRING(str)->len == beg) + tmp = rb_str_new5(str, 0, 0); + else + tmp = rb_str_substr(str, beg, RSTRING(str)->len-beg); + rb_ary_push(result, tmp); + } + if (NIL_P(limit) && lim == 0) { + while (RARRAY(result)->len > 0 && + RSTRING(RARRAY(result)->ptr[RARRAY(result)->len-1])->len == 0) + rb_ary_pop(result); + } + + return result; +} + +VALUE +rb_str_split(str, sep0) + VALUE str; + const char *sep0; +{ + VALUE sep; + + StringValue(str); + sep = rb_str_new2(sep0); + return rb_str_split_m(1, &sep, str); +} + +/* + * call-seq: + * split([pattern [, limit]]) => array + * + * Equivalent to <code>$_.split(<i>pattern</i>, <i>limit</i>)</code>. + * See <code>String#split</code>. + */ + +static VALUE +rb_f_split(argc, argv) + int argc; + VALUE *argv; +{ + return rb_str_split_m(argc, argv, uscore_get()); +} + +/* + * call-seq: + * str.each(separator=$/) {|substr| block } => str + * str.each_line(separator=$/) {|substr| block } => str + * + * Splits <i>str</i> using the supplied parameter as the record separator + * (<code>$/</code> by default), passing each substring in turn to the supplied + * block. If a zero-length record separator is supplied, the string is split on + * <code>\n</code> characters, except that multiple successive newlines are + * appended together. + * + * print "Example one\n" + * "hello\nworld".each {|s| p s} + * print "Example two\n" + * "hello\nworld".each('l') {|s| p s} + * print "Example three\n" + * "hello\n\n\nworld".each('') {|s| p s} + * + * <em>produces:</em> + * + * Example one + * "hello\n" + * "world" + * Example two + * "hel" + * "l" + * "o\nworl" + * "d" + * Example three + * "hello\n\n\n" + * "world" + */ + +static VALUE +rb_str_each_line(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE rs; + int newline; + char *p = RSTRING(str)->ptr, *pend = p + RSTRING(str)->len, *s; + char *ptr = p; + long len = RSTRING(str)->len, rslen; + VALUE line; + + if (rb_scan_args(argc, argv, "01", &rs) == 0) { + rs = rb_rs; + } + + if (NIL_P(rs)) { + rb_yield(str); + return str; + } + StringValue(rs); + rslen = RSTRING(rs)->len; + if (rslen == 0) { + newline = '\n'; + } + else { + newline = RSTRING(rs)->ptr[rslen-1]; + } + + for (s = p, p += rslen; p < pend; p++) { + if (rslen == 0 && *p == '\n') { + if (*++p != '\n') continue; + while (*p == '\n') p++; + } + if (RSTRING(str)->ptr < p && p[-1] == newline && + (rslen <= 1 || + rb_memcmp(RSTRING(rs)->ptr, p-rslen, rslen) == 0)) { + line = rb_str_new5(str, s, p - s); + OBJ_INFECT(line, str); + rb_yield(line); + str_mod_check(str, ptr, len); + s = p; + } + } + + if (s != pend) { + if (p > pend) p = pend; + line = rb_str_new5(str, s, p - s); + OBJ_INFECT(line, str); + rb_yield(line); + } + + return str; +} + + +/* + * call-seq: + * str.each_byte {|fixnum| block } => str + * + * Passes each byte in <i>str</i> to the given block. + * + * "hello".each_byte {|c| print c, ' ' } + * + * <em>produces:</em> + * + * 104 101 108 108 111 + */ + +static VALUE +rb_str_each_byte(str) + VALUE str; +{ + long i; + + for (i=0; i<RSTRING(str)->len; i++) { + rb_yield(INT2FIX(RSTRING(str)->ptr[i] & 0xff)); + } + return str; +} + + +/* + * call-seq: + * str.chop! => str or nil + * + * Processes <i>str</i> as for <code>String#chop</code>, returning <i>str</i>, + * or <code>nil</code> if <i>str</i> is the empty string. See also + * <code>String#chomp!</code>. + */ + +static VALUE +rb_str_chop_bang(str) + VALUE str; +{ + if (RSTRING(str)->len > 0) { + rb_str_modify(str); + RSTRING(str)->len--; + if (RSTRING(str)->ptr[RSTRING(str)->len] == '\n') { + if (RSTRING(str)->len > 0 && + RSTRING(str)->ptr[RSTRING(str)->len-1] == '\r') { + RSTRING(str)->len--; + } + } + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + return str; + } + return Qnil; +} + + +/* + * call-seq: + * str.chop => new_str + * + * Returns a new <code>String</code> with the last character removed. If the + * string ends with <code>\r\n</code>, both characters are removed. Applying + * <code>chop</code> to an empty string returns an empty + * string. <code>String#chomp</code> is often a safer alternative, as it leaves + * the string unchanged if it doesn't end in a record separator. + * + * "string\r\n".chop #=> "string" + * "string\n\r".chop #=> "string\n" + * "string\n".chop #=> "string" + * "string".chop #=> "strin" + * "x".chop.chop #=> "" + */ + +static VALUE +rb_str_chop(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_chop_bang(str); + return str; +} + + +/* + * call-seq: + * chop! => $_ or nil + * + * Equivalent to <code>$_.chop!</code>. + * + * a = "now\r\n" + * $_ = a + * chop! #=> "now" + * chop! #=> "no" + * chop! #=> "n" + * chop! #=> "" + * chop! #=> nil + * $_ #=> "" + * a #=> "" + */ + +static VALUE +rb_f_chop_bang(str) + VALUE str; +{ + return rb_str_chop_bang(uscore_get()); +} + +/* + * call-seq: + * chop => string + * + * Equivalent to <code>($_.dup).chop!</code>, except <code>nil</code> + * is never returned. See <code>String#chop!</code>. + * + * a = "now\r\n" + * $_ = a + * chop #=> "now" + * $_ #=> "now" + * chop #=> "no" + * chop #=> "n" + * chop #=> "" + * chop #=> "" + * a #=> "now\r\n" + */ + +static VALUE +rb_f_chop() +{ + VALUE str = uscore_get(); + + if (RSTRING(str)->len > 0) { + str = rb_str_dup(str); + rb_str_chop_bang(str); + rb_lastline_set(str); + } + return str; +} + + +/* + * call-seq: + * str.chomp!(separator=$/) => str or nil + * + * Modifies <i>str</i> in place as described for <code>String#chomp</code>, + * returning <i>str</i>, or <code>nil</code> if no modifications were made. + */ + +static VALUE +rb_str_chomp_bang(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE rs; + int newline; + char *p; + long len, rslen; + + if (rb_scan_args(argc, argv, "01", &rs) == 0) { + len = RSTRING(str)->len; + if (len == 0) return Qnil; + p = RSTRING(str)->ptr; + rs = rb_rs; + if (rs == rb_default_rs) { + smart_chomp: + rb_str_modify(str); + if (RSTRING(str)->ptr[len-1] == '\n') { + RSTRING(str)->len--; + if (RSTRING(str)->len > 0 && + RSTRING(str)->ptr[RSTRING(str)->len-1] == '\r') { + RSTRING(str)->len--; + } + } + else if (RSTRING(str)->ptr[len-1] == '\r') { + RSTRING(str)->len--; + } + else { + return Qnil; + } + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + return str; + } + } + if (NIL_P(rs)) return Qnil; + StringValue(rs); + len = RSTRING(str)->len; + if (len == 0) return Qnil; + p = RSTRING(str)->ptr; + rslen = RSTRING(rs)->len; + if (rslen == 0) { + while (len>0 && p[len-1] == '\n') { + len--; + if (len>0 && p[len-1] == '\r') + len--; + } + if (len < RSTRING(str)->len) { + rb_str_modify(str); + RSTRING(str)->len = len; + RSTRING(str)->ptr[len] = '\0'; + return str; + } + return Qnil; + } + if (rslen > len) return Qnil; + newline = RSTRING(rs)->ptr[rslen-1]; + if (rslen == 1 && newline == '\n') + goto smart_chomp; + + if (p[len-1] == newline && + (rslen <= 1 || + rb_memcmp(RSTRING(rs)->ptr, p+len-rslen, rslen) == 0)) { + rb_str_modify(str); + RSTRING(str)->len -= rslen; + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + return str; + } + return Qnil; +} + + +/* + * call-seq: + * str.chomp(separator=$/) => new_str + * + * Returns a new <code>String</code> with the given record separator removed + * from the end of <i>str</i> (if present). If <code>$/</code> has not been + * changed from the default Ruby record separator, then <code>chomp</code> also + * removes carriage return characters (that is it will remove <code>\n</code>, + * <code>\r</code>, and <code>\r\n</code>). + * + * "hello".chomp #=> "hello" + * "hello\n".chomp #=> "hello" + * "hello\r\n".chomp #=> "hello" + * "hello\n\r".chomp #=> "hello\n" + * "hello\r".chomp #=> "hello" + * "hello \n there".chomp #=> "hello \n there" + * "hello".chomp("llo") #=> "he" + */ + +static VALUE +rb_str_chomp(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + str = rb_str_dup(str); + rb_str_chomp_bang(argc, argv, str); + return str; +} + +/* + * call-seq: + * chomp! => $_ or nil + * chomp!(string) => $_ or nil + * + * Equivalent to <code>$_.chomp!(<em>string</em>)</code>. See + * <code>String#chomp!</code> + * + * $_ = "now\n" + * chomp! #=> "now" + * $_ #=> "now" + * chomp! "x" #=> nil + * $_ #=> "now" + */ + +static VALUE +rb_f_chomp_bang(argc, argv) + int argc; + VALUE *argv; +{ + return rb_str_chomp_bang(argc, argv, uscore_get()); +} + +/* + * call-seq: + * chomp => $_ + * chomp(string) => $_ + * + * Equivalent to <code>$_ = $_.chomp(<em>string</em>)</code>. See + * <code>String#chomp</code>. + * + * $_ = "now\n" + * chomp #=> "now" + * $_ #=> "now" + * chomp "ow" #=> "n" + * $_ #=> "n" + * chomp "xxx" #=> "n" + * $_ #=> "n" + */ + +static VALUE +rb_f_chomp(argc, argv) + int argc; + VALUE *argv; +{ + VALUE str = uscore_get(); + VALUE dup = rb_str_dup(str); + + if (NIL_P(rb_str_chomp_bang(argc, argv, dup))) + return str; + rb_lastline_set(dup); + return dup; +} + + +/* + * call-seq: + * str.lstrip! => self or nil + * + * Removes leading whitespace from <i>str</i>, returning <code>nil</code> if no + * change was made. See also <code>String#rstrip!</code> and + * <code>String#strip!</code>. + * + * " hello ".lstrip #=> "hello " + * "hello".lstrip! #=> nil + */ + +static VALUE +rb_str_lstrip_bang(str) + VALUE str; +{ + char *s, *t, *e; + + s = RSTRING(str)->ptr; + if (!s || RSTRING(str)->len == 0) return Qnil; + e = t = s + RSTRING(str)->len; + /* remove spaces at head */ + while (s < t && ISSPACE(*s)) s++; + + if (s > RSTRING(str)->ptr) { + rb_str_modify(str); + RSTRING(str)->len = t-s; + memmove(RSTRING(str)->ptr, s, RSTRING(str)->len); + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + return str; + } + return Qnil; +} + + +/* + * call-seq: + * str.lstrip => new_str + * + * Returns a copy of <i>str</i> with leading whitespace removed. See also + * <code>String#rstrip</code> and <code>String#strip</code>. + * + * " hello ".lstrip #=> "hello " + * "hello".lstrip #=> "hello" + */ + +static VALUE +rb_str_lstrip(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_lstrip_bang(str); + return str; +} + + +/* + * call-seq: + * str.rstrip! => self or nil + * + * Removes trailing whitespace from <i>str</i>, returning <code>nil</code> if + * no change was made. See also <code>String#lstrip!</code> and + * <code>String#strip!</code>. + * + * " hello ".rstrip #=> " hello" + * "hello".rstrip! #=> nil + */ + +static VALUE +rb_str_rstrip_bang(str) + VALUE str; +{ + char *s, *t, *e; + + s = RSTRING(str)->ptr; + if (!s || RSTRING(str)->len == 0) return Qnil; + e = t = s + RSTRING(str)->len; + + /* remove trailing '\0's */ + while (s < t && t[-1] == '\0') t--; + + /* remove trailing spaces */ + while (s < t && ISSPACE(*(t-1))) t--; + + if (t < e) { + rb_str_modify(str); + RSTRING(str)->len = t-s; + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + return str; + } + return Qnil; +} + + +/* + * call-seq: + * str.rstrip => new_str + * + * Returns a copy of <i>str</i> with trailing whitespace removed. See also + * <code>String#lstrip</code> and <code>String#strip</code>. + * + * " hello ".rstrip #=> " hello" + * "hello".rstrip #=> "hello" + */ + +static VALUE +rb_str_rstrip(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_rstrip_bang(str); + return str; +} + + +/* + * call-seq: + * str.strip! => str or nil + * + * Removes leading and trailing whitespace from <i>str</i>. Returns + * <code>nil</code> if <i>str</i> was not altered. + */ + +static VALUE +rb_str_strip_bang(str) + VALUE str; +{ + VALUE l = rb_str_lstrip_bang(str); + VALUE r = rb_str_rstrip_bang(str); + + if (NIL_P(l) && NIL_P(r)) return Qnil; + return str; +} + + +/* + * call-seq: + * str.strip => new_str + * + * Returns a copy of <i>str</i> with leading and trailing whitespace removed. + * + * " hello ".strip #=> "hello" + * "\tgoodbye\r\n".strip #=> "goodbye" + */ + +static VALUE +rb_str_strip(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_strip_bang(str); + return str; +} + +static VALUE +scan_once(str, pat, start) + VALUE str, pat; + long *start; +{ + VALUE result, match; + struct re_registers *regs; + long i; + + if (rb_reg_search(pat, str, *start, 0) >= 0) { + match = rb_backref_get(); + regs = RMATCH(match)->regs; + if (BEG(0) == END(0)) { + /* + * Always consume at least one character of the input string + */ + if (RSTRING(str)->len > END(0)) + *start = END(0)+mbclen2(RSTRING(str)->ptr[END(0)],pat); + else + *start = END(0)+1; + } + else { + *start = END(0); + } + if (regs->num_regs == 1) { + return rb_reg_nth_match(0, match); + } + result = rb_ary_new2(regs->num_regs); + for (i=1; i < regs->num_regs; i++) { + rb_ary_push(result, rb_reg_nth_match(i, match)); + } + + return result; + } + return Qnil; +} + + +/* + * call-seq: + * str.scan(pattern) => array + * str.scan(pattern) {|match, ...| block } => str + * + * Both forms iterate through <i>str</i>, matching the pattern (which may be a + * <code>Regexp</code> or a <code>String</code>). For each match, a result is + * generated and either added to the result array or passed to the block. If + * the pattern contains no groups, each individual result consists of the + * matched string, <code>$&</code>. If the pattern contains groups, each + * individual result is itself an array containing one entry per group. + * + * a = "cruel world" + * a.scan(/\w+/) #=> ["cruel", "world"] + * a.scan(/.../) #=> ["cru", "el ", "wor"] + * a.scan(/(...)/) #=> [["cru"], ["el "], ["wor"]] + * a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]] + * + * And the block form: + * + * a.scan(/\w+/) {|w| print "<<#{w}>> " } + * print "\n" + * a.scan(/(.)(.)/) {|x,y| print y, x } + * print "\n" + * + * <em>produces:</em> + * + * <<cruel>> <<world>> + * rceu lowlr + */ + +static VALUE +rb_str_scan(str, pat) + VALUE str, pat; +{ + VALUE result; + long start = 0; + VALUE match = Qnil; + char *p = RSTRING(str)->ptr; long len = RSTRING(str)->len; + + pat = get_pat(pat, 1); + if (!rb_block_given_p()) { + VALUE ary = rb_ary_new(); + + while (!NIL_P(result = scan_once(str, pat, &start))) { + match = rb_backref_get(); + rb_ary_push(ary, result); + } + rb_backref_set(match); + return ary; + } + + while (!NIL_P(result = scan_once(str, pat, &start))) { + match = rb_backref_get(); + rb_match_busy(match); + rb_yield(result); + str_mod_check(str, p, len); + rb_backref_set(match); /* restore $~ value */ + } + rb_backref_set(match); + return str; +} + +/* + * call-seq: + * scan(pattern) => array + * scan(pattern) {|///| block } => $_ + * + * Equivalent to calling <code>$_.scan</code>. See + * <code>String#scan</code>. + */ + +static VALUE +rb_f_scan(self, pat) + VALUE self, pat; +{ + return rb_str_scan(uscore_get(), pat); +} + + +/* + * call-seq: + * str.hex => integer + * + * Treats leading characters from <i>str</i> as a string of hexadecimal digits + * (with an optional sign and an optional <code>0x</code>) and returns the + * corresponding number. Zero is returned on error. + * + * "0x0a".hex #=> 10 + * "-1234".hex #=> -4660 + * "0".hex #=> 0 + * "wombat".hex #=> 0 + */ + +static VALUE +rb_str_hex(str) + VALUE str; +{ + return rb_str_to_inum(str, 16, Qfalse); +} + + +/* + * call-seq: + * str.oct => integer + * + * Treats leading characters of <i>str</i> as a string of octal digits (with an + * optional sign) and returns the corresponding number. Returns 0 if the + * conversion fails. + * + * "123".oct #=> 83 + * "-377".oct #=> -255 + * "bad".oct #=> 0 + * "0377bad".oct #=> 255 + */ + +static VALUE +rb_str_oct(str) + VALUE str; +{ + return rb_str_to_inum(str, -8, Qfalse); +} + + +/* + * call-seq: + * str.crypt(other_str) => new_str + * + * Applies a one-way cryptographic hash to <i>str</i> by invoking the standard + * library function <code>crypt</code>. The argument is the salt string, which + * should be two characters long, each character drawn from + * <code>[a-zA-Z0-9./]</code>. + */ + +static VALUE +rb_str_crypt(str, salt) + VALUE str, salt; +{ + extern char *crypt(); + VALUE result; + char *s; + + StringValue(salt); + if (RSTRING(salt)->len < 2) + rb_raise(rb_eArgError, "salt too short(need >=2 bytes)"); + + if (RSTRING(str)->ptr) s = RSTRING(str)->ptr; + else s = ""; + result = rb_str_new2(crypt(s, RSTRING(salt)->ptr)); + OBJ_INFECT(result, str); + OBJ_INFECT(result, salt); + return result; +} + + +/* + * call-seq: + * str.intern => symbol + * str.to_sym => symbol + * + * Returns the <code>Symbol</code> corresponding to <i>str</i>, creating the + * symbol if it did not previously exist. See <code>Symbol#id2name</code>. + * + * "Koala".intern #=> :Koala + * s = 'cat'.to_sym #=> :cat + * s == :cat #=> true + * s = '@cat'.to_sym #=> :@cat + * s == :@cat #=> true + * + * This can also be used to create symbols that cannot be represented using the + * <code>:xxx</code> notation. + * + * 'cat and dog'.to_sym #=> :"cat and dog" + */ + +VALUE +rb_str_intern(s) + VALUE s; +{ + volatile VALUE str = s; + ID id; + + if (!RSTRING(str)->ptr || RSTRING(str)->len == 0) { + rb_raise(rb_eArgError, "interning empty string"); + } + if (strlen(RSTRING(str)->ptr) != RSTRING(str)->len) + rb_raise(rb_eArgError, "symbol string may not contain `\\0'"); + if (OBJ_TAINTED(str) && rb_safe_level() >= 1 && !rb_sym_interned_p(str)) { + rb_raise(rb_eSecurityError, "Insecure: can't intern tainted string"); + } + id = rb_intern(RSTRING(str)->ptr); + return ID2SYM(id); +} + + +/* + * call-seq: + * str.sum(n=16) => integer + * + * Returns a basic <em>n</em>-bit checksum of the characters in <i>str</i>, + * where <em>n</em> is the optional <code>Fixnum</code> parameter, defaulting + * to 16. The result is simply the sum of the binary value of each character in + * <i>str</i> modulo <code>2n - 1</code>. This is not a particularly good + * checksum. + */ + +static VALUE +rb_str_sum(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + VALUE vbits; + int bits; + char *ptr, *p, *pend; + long len; + + if (rb_scan_args(argc, argv, "01", &vbits) == 0) { + bits = 16; + } + else bits = NUM2INT(vbits); + + ptr = p = RSTRING(str)->ptr; + len = RSTRING(str)->len; + pend = p + len; + if (bits >= sizeof(long)*CHAR_BIT) { + VALUE sum = INT2FIX(0); + + while (p < pend) { + str_mod_check(str, ptr, len); + sum = rb_funcall(sum, '+', 1, INT2FIX((unsigned char)*p)); + p++; + } + if (bits != 0) { + VALUE mod; + + mod = rb_funcall(INT2FIX(1), rb_intern("<<"), 1, INT2FIX(bits)); + mod = rb_funcall(mod, '-', 1, INT2FIX(1)); + sum = rb_funcall(sum, '&', 1, mod); + } + return sum; + } + else { + unsigned long sum = 0; + + while (p < pend) { + str_mod_check(str, ptr, len); + sum += (unsigned char)*p; + p++; + } + if (bits != 0) { + sum &= (((unsigned long)1)<<bits)-1; + } + return rb_int2inum(sum); + } +} + +static VALUE +rb_str_justify(argc, argv, str, jflag) + int argc; + VALUE *argv; + VALUE str; + char jflag; +{ + VALUE w; + long width, flen = 0; + VALUE res; + char *p, *pend, *f = " "; + long n; + VALUE pad; + + rb_scan_args(argc, argv, "11", &w, &pad); + width = NUM2LONG(w); + if (argc == 2) { + StringValue(pad); + f = RSTRING(pad)->ptr; + flen = RSTRING(pad)->len; + if (flen == 0) { + rb_raise(rb_eArgError, "zero width padding"); + } + } + if (width < 0 || RSTRING(str)->len >= width) return rb_str_dup(str); + res = rb_str_new5(str, 0, width); + p = RSTRING(res)->ptr; + if (jflag != 'l') { + n = width - RSTRING(str)->len; + pend = p + ((jflag == 'r') ? n : n/2); + if (flen <= 1) { + while (p < pend) { + *p++ = *f; + } + } + else { + char *q = f; + while (p + flen <= pend) { + memcpy(p,f,flen); + p += flen; + } + while (p < pend) { + *p++ = *q++; + } + } + } + memcpy(p, RSTRING(str)->ptr, RSTRING(str)->len); + if (jflag != 'r') { + p += RSTRING(str)->len; pend = RSTRING(res)->ptr + width; + if (flen <= 1) { + while (p < pend) { + *p++ = *f; + } + } + else { + while (p + flen <= pend) { + memcpy(p,f,flen); + p += flen; + } + while (p < pend) { + *p++ = *f++; + } + } + } + OBJ_INFECT(res, str); + if (flen > 0) OBJ_INFECT(res, pad); + return res; +} + + +/* + * call-seq: + * str.ljust(integer, padstr=' ') => new_str + * + * If <i>integer</i> is greater than the length of <i>str</i>, returns a new + * <code>String</code> of length <i>integer</i> with <i>str</i> left justified + * and padded with <i>padstr</i>; otherwise, returns <i>str</i>. + * + * "hello".ljust(4) #=> "hello" + * "hello".ljust(20) #=> "hello " + * "hello".ljust(20, '1234') #=> "hello123412341234123" + */ + +static VALUE +rb_str_ljust(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + return rb_str_justify(argc, argv, str, 'l'); +} + + +/* + * call-seq: + * str.rjust(integer, padstr=' ') => new_str + * + * If <i>integer</i> is greater than the length of <i>str</i>, returns a new + * <code>String</code> of length <i>integer</i> with <i>str</i> right justified + * and padded with <i>padstr</i>; otherwise, returns <i>str</i>. + * + * "hello".rjust(4) #=> "hello" + * "hello".rjust(20) #=> " hello" + * "hello".rjust(20, '1234') #=> "123412341234123hello" + */ + +static VALUE +rb_str_rjust(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + return rb_str_justify(argc, argv, str, 'r'); +} + + +/* + * call-seq: + * str.center(integer, padstr) => new_str + * + * If <i>integer</i> is greater than the length of <i>str</i>, returns a new + * <code>String</code> of length <i>integer</i> with <i>str</i> centered and + * padded with <i>padstr</i>; otherwise, returns <i>str</i>. + * + * "hello".center(4) #=> "hello" + * "hello".center(20) #=> " hello " + * "hello".center(20, '123') #=> "1231231hello12312312" + */ + +static VALUE +rb_str_center(argc, argv, str) + int argc; + VALUE *argv; + VALUE str; +{ + return rb_str_justify(argc, argv, str, 'c'); +} + +void +rb_str_setter(val, id, var) + VALUE val; + ID id; + VALUE *var; +{ + if (!NIL_P(val) && TYPE(val) != T_STRING) { + rb_raise(rb_eTypeError, "value of %s must be String", rb_id2name(id)); + } + *var = val; +} + + +/* + * A <code>String</code> object holds and manipulates an arbitrary sequence of + * bytes, typically representing characters. String objects may be created + * using <code>String::new</code> or as literals. + * + * Because of aliasing issues, users of strings should be aware of the methods + * that modify the contents of a <code>String</code> object. Typically, + * methods with names ending in ``!'' modify their receiver, while those + * without a ``!'' return a new <code>String</code>. However, there are + * exceptions, such as <code>String#[]=</code>. + * + */ + +void +Init_String() +{ + rb_cString = rb_define_class("String", rb_cObject); + rb_include_module(rb_cString, rb_mComparable); + rb_include_module(rb_cString, rb_mEnumerable); + rb_define_alloc_func(rb_cString, rb_str_s_alloc); + rb_define_method(rb_cString, "initialize", rb_str_init, -1); + rb_define_method(rb_cString, "initialize_copy", rb_str_replace, 1); + rb_define_method(rb_cString, "<=>", rb_str_cmp_m, 1); + rb_define_method(rb_cString, "==", rb_str_equal, 1); + rb_define_method(rb_cString, "eql?", rb_str_eql, 1); + rb_define_method(rb_cString, "hash", rb_str_hash_m, 0); + rb_define_method(rb_cString, "casecmp", rb_str_casecmp, 1); + rb_define_method(rb_cString, "+", rb_str_plus, 1); + rb_define_method(rb_cString, "*", rb_str_times, 1); + rb_define_method(rb_cString, "%", rb_str_format_m, 1); + rb_define_method(rb_cString, "[]", rb_str_aref_m, -1); + rb_define_method(rb_cString, "[]=", rb_str_aset_m, -1); + rb_define_method(rb_cString, "insert", rb_str_insert, 2); + rb_define_method(rb_cString, "length", rb_str_length, 0); + rb_define_method(rb_cString, "size", rb_str_length, 0); + rb_define_method(rb_cString, "empty?", rb_str_empty, 0); + rb_define_method(rb_cString, "=~", rb_str_match, 1); + rb_define_method(rb_cString, "match", rb_str_match_m, 1); + rb_define_method(rb_cString, "succ", rb_str_succ, 0); + rb_define_method(rb_cString, "succ!", rb_str_succ_bang, 0); + rb_define_method(rb_cString, "next", rb_str_succ, 0); + rb_define_method(rb_cString, "next!", rb_str_succ_bang, 0); + rb_define_method(rb_cString, "upto", rb_str_upto_m, 1); + rb_define_method(rb_cString, "index", rb_str_index_m, -1); + rb_define_method(rb_cString, "rindex", rb_str_rindex_m, -1); + rb_define_method(rb_cString, "replace", rb_str_replace, 1); + + rb_define_method(rb_cString, "to_i", rb_str_to_i, -1); + rb_define_method(rb_cString, "to_f", rb_str_to_f, 0); + rb_define_method(rb_cString, "to_s", rb_str_to_s, 0); + rb_define_method(rb_cString, "to_str", rb_str_to_s, 0); + rb_define_method(rb_cString, "inspect", rb_str_inspect, 0); + rb_define_method(rb_cString, "dump", rb_str_dump, 0); + + rb_define_method(rb_cString, "upcase", rb_str_upcase, 0); + rb_define_method(rb_cString, "downcase", rb_str_downcase, 0); + rb_define_method(rb_cString, "capitalize", rb_str_capitalize, 0); + rb_define_method(rb_cString, "swapcase", rb_str_swapcase, 0); + + rb_define_method(rb_cString, "upcase!", rb_str_upcase_bang, 0); + rb_define_method(rb_cString, "downcase!", rb_str_downcase_bang, 0); + rb_define_method(rb_cString, "capitalize!", rb_str_capitalize_bang, 0); + rb_define_method(rb_cString, "swapcase!", rb_str_swapcase_bang, 0); + + rb_define_method(rb_cString, "hex", rb_str_hex, 0); + rb_define_method(rb_cString, "oct", rb_str_oct, 0); + rb_define_method(rb_cString, "split", rb_str_split_m, -1); + rb_define_method(rb_cString, "reverse", rb_str_reverse, 0); + rb_define_method(rb_cString, "reverse!", rb_str_reverse_bang, 0); + rb_define_method(rb_cString, "concat", rb_str_concat, 1); + rb_define_method(rb_cString, "<<", rb_str_concat, 1); + rb_define_method(rb_cString, "crypt", rb_str_crypt, 1); + rb_define_method(rb_cString, "intern", rb_str_intern, 0); + rb_define_method(rb_cString, "to_sym", rb_str_intern, 0); + + rb_define_method(rb_cString, "include?", rb_str_include, 1); + + rb_define_method(rb_cString, "scan", rb_str_scan, 1); + + rb_define_method(rb_cString, "ljust", rb_str_ljust, -1); + rb_define_method(rb_cString, "rjust", rb_str_rjust, -1); + rb_define_method(rb_cString, "center", rb_str_center, -1); + + rb_define_method(rb_cString, "sub", rb_str_sub, -1); + rb_define_method(rb_cString, "gsub", rb_str_gsub, -1); + rb_define_method(rb_cString, "chop", rb_str_chop, 0); + rb_define_method(rb_cString, "chomp", rb_str_chomp, -1); + rb_define_method(rb_cString, "strip", rb_str_strip, 0); + rb_define_method(rb_cString, "lstrip", rb_str_lstrip, 0); + rb_define_method(rb_cString, "rstrip", rb_str_rstrip, 0); + + rb_define_method(rb_cString, "sub!", rb_str_sub_bang, -1); + rb_define_method(rb_cString, "gsub!", rb_str_gsub_bang, -1); + rb_define_method(rb_cString, "chop!", rb_str_chop_bang, 0); + rb_define_method(rb_cString, "chomp!", rb_str_chomp_bang, -1); + rb_define_method(rb_cString, "strip!", rb_str_strip_bang, 0); + rb_define_method(rb_cString, "lstrip!", rb_str_lstrip_bang, 0); + rb_define_method(rb_cString, "rstrip!", rb_str_rstrip_bang, 0); + + rb_define_method(rb_cString, "tr", rb_str_tr, 2); + rb_define_method(rb_cString, "tr_s", rb_str_tr_s, 2); + rb_define_method(rb_cString, "delete", rb_str_delete, -1); + rb_define_method(rb_cString, "squeeze", rb_str_squeeze, -1); + rb_define_method(rb_cString, "count", rb_str_count, -1); + + rb_define_method(rb_cString, "tr!", rb_str_tr_bang, 2); + rb_define_method(rb_cString, "tr_s!", rb_str_tr_s_bang, 2); + rb_define_method(rb_cString, "delete!", rb_str_delete_bang, -1); + rb_define_method(rb_cString, "squeeze!", rb_str_squeeze_bang, -1); + + rb_define_method(rb_cString, "each_line", rb_str_each_line, -1); + rb_define_method(rb_cString, "each", rb_str_each_line, -1); + rb_define_method(rb_cString, "each_byte", rb_str_each_byte, 0); + + rb_define_method(rb_cString, "sum", rb_str_sum, -1); + + rb_define_global_function("sub", rb_f_sub, -1); + rb_define_global_function("gsub", rb_f_gsub, -1); + + rb_define_global_function("sub!", rb_f_sub_bang, -1); + rb_define_global_function("gsub!", rb_f_gsub_bang, -1); + + rb_define_global_function("chop", rb_f_chop, 0); + rb_define_global_function("chop!", rb_f_chop_bang, 0); + + rb_define_global_function("chomp", rb_f_chomp, -1); + rb_define_global_function("chomp!", rb_f_chomp_bang, -1); + + rb_define_global_function("split", rb_f_split, -1); + rb_define_global_function("scan", rb_f_scan, 1); + + rb_define_method(rb_cString, "slice", rb_str_aref_m, -1); + rb_define_method(rb_cString, "slice!", rb_str_slice_bang, -1); + + id_to_s = rb_intern("to_s"); + + rb_fs = Qnil; + rb_define_variable("$;", &rb_fs); + rb_define_variable("$-F", &rb_fs); +} +/********************************************************************** + + struct.c - + + $Author: shyouhei $ + $Date: 2008-06-15 15:44:44 +0200 (Sun, 15 Jun 2008) $ + created at: Tue Mar 22 18:44:30 JST 1995 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "env.h" + +VALUE rb_cStruct; + +static VALUE struct_alloc _((VALUE)); + +VALUE +rb_struct_iv_get(c, name) + VALUE c; + char *name; +{ + ID id; + + id = rb_intern(name); + for (;;) { + if (rb_ivar_defined(c, id)) + return rb_ivar_get(c, id); + c = RCLASS(c)->super; + if (c == 0 || c == rb_cStruct) + return Qnil; + } +} + +VALUE +rb_struct_s_members(klass) + VALUE klass; +{ + VALUE members = rb_struct_iv_get(klass, "__members__"); + + if (NIL_P(members)) { + rb_bug("non-initialized struct"); + } + return members; +} + +VALUE +rb_struct_members(s) + VALUE s; +{ + VALUE members = rb_struct_s_members(rb_obj_class(s)); + + if (RSTRUCT(s)->len != RARRAY(members)->len) { + rb_raise(rb_eTypeError, "struct size differs (%d required %d given)", + RARRAY(members)->len, RSTRUCT(s)->len); + } + return members; +} + +static VALUE +rb_struct_s_members_m(klass) + VALUE klass; +{ + VALUE members, ary; + VALUE *p, *pend; + + members = rb_struct_s_members(klass); + ary = rb_ary_new2(RARRAY(members)->len); + p = RARRAY(members)->ptr; pend = p + RARRAY(members)->len; + while (p < pend) { + rb_ary_push(ary, rb_str_new2(rb_id2name(SYM2ID(*p)))); + p++; + } + + return ary; +} + +/* + * call-seq: + * struct.members => array + * + * Returns an array of strings representing the names of the instance + * variables. + * + * Customer = Struct.new(:name, :address, :zip) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) + * joe.members #=> ["name", "address", "zip"] + */ + +static VALUE +rb_struct_members_m(obj) + VALUE obj; +{ + return rb_struct_s_members_m(rb_obj_class(obj)); +} + +VALUE +rb_struct_getmember(obj, id) + VALUE obj; + ID id; +{ + VALUE members, slot; + long i; + + members = rb_struct_members(obj); + slot = ID2SYM(id); + for (i=0; i<RARRAY(members)->len; i++) { + if (RARRAY(members)->ptr[i] == slot) { + return RSTRUCT(obj)->ptr[i]; + } + } + rb_name_error(id, "%s is not struct member", rb_id2name(id)); + return Qnil; /* not reached */ +} + +static VALUE +rb_struct_ref(obj) + VALUE obj; +{ + return rb_struct_getmember(obj, ruby_frame->orig_func); +} + +static VALUE rb_struct_ref0(obj) VALUE obj; {return RSTRUCT(obj)->ptr[0];} +static VALUE rb_struct_ref1(obj) VALUE obj; {return RSTRUCT(obj)->ptr[1];} +static VALUE rb_struct_ref2(obj) VALUE obj; {return RSTRUCT(obj)->ptr[2];} +static VALUE rb_struct_ref3(obj) VALUE obj; {return RSTRUCT(obj)->ptr[3];} +static VALUE rb_struct_ref4(obj) VALUE obj; {return RSTRUCT(obj)->ptr[4];} +static VALUE rb_struct_ref5(obj) VALUE obj; {return RSTRUCT(obj)->ptr[5];} +static VALUE rb_struct_ref6(obj) VALUE obj; {return RSTRUCT(obj)->ptr[6];} +static VALUE rb_struct_ref7(obj) VALUE obj; {return RSTRUCT(obj)->ptr[7];} +static VALUE rb_struct_ref8(obj) VALUE obj; {return RSTRUCT(obj)->ptr[8];} +static VALUE rb_struct_ref9(obj) VALUE obj; {return RSTRUCT(obj)->ptr[9];} + +static VALUE (*ref_func[10])() = { + rb_struct_ref0, + rb_struct_ref1, + rb_struct_ref2, + rb_struct_ref3, + rb_struct_ref4, + rb_struct_ref5, + rb_struct_ref6, + rb_struct_ref7, + rb_struct_ref8, + rb_struct_ref9, +}; + +static void +rb_struct_modify(s) + VALUE s; +{ + if (OBJ_FROZEN(s)) rb_error_frozen("Struct"); + if (!OBJ_TAINTED(s) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify Struct"); +} + +static VALUE +rb_struct_set(obj, val) + VALUE obj, val; +{ + VALUE members, slot; + ID id; + long i; + + members = rb_struct_members(obj); + rb_struct_modify(obj); + id = ruby_frame->orig_func; + for (i=0; i<RARRAY(members)->len; i++) { + slot = RARRAY(members)->ptr[i]; + if (rb_id_attrset(SYM2ID(slot)) == id) { + return RSTRUCT(obj)->ptr[i] = val; + } + } + rb_name_error(ruby_frame->last_func, "`%s' is not a struct member", + rb_id2name(id)); + return Qnil; /* not reached */ +} + +static VALUE +make_struct(name, members, klass) + VALUE name, members, klass; +{ + VALUE nstr; + ID id; + long i; + + OBJ_FREEZE(members); + if (NIL_P(name)) { + nstr = rb_class_new(klass); + rb_make_metaclass(nstr, RBASIC(klass)->klass); + rb_class_inherited(klass, nstr); + } + else { + char *cname = StringValuePtr(name); + id = rb_intern(cname); + if (!rb_is_const_id(id)) { + rb_name_error(id, "identifier %s needs to be constant", cname); + } + if (rb_const_defined_at(klass, id)) { + rb_warn("redefining constant Struct::%s", cname); + rb_mod_remove_const(klass, ID2SYM(id)); + } + nstr = rb_define_class_under(klass, rb_id2name(id), klass); + } + rb_iv_set(nstr, "__size__", LONG2NUM(RARRAY(members)->len)); + rb_iv_set(nstr, "__members__", members); + + rb_define_alloc_func(nstr, struct_alloc); + rb_define_singleton_method(nstr, "new", rb_class_new_instance, -1); + rb_define_singleton_method(nstr, "[]", rb_class_new_instance, -1); + rb_define_singleton_method(nstr, "members", rb_struct_s_members_m, 0); + for (i=0; i< RARRAY(members)->len; i++) { + ID id = SYM2ID(RARRAY(members)->ptr[i]); + if (rb_is_local_id(id) || rb_is_const_id(id)) { + if (i<10) { + rb_define_method_id(nstr, id, ref_func[i], 0); + } + else { + rb_define_method_id(nstr, id, rb_struct_ref, 0); + } + rb_define_method_id(nstr, rb_id_attrset(id), rb_struct_set, 1); + } + } + + return nstr; +} + +#ifdef HAVE_STDARG_PROTOTYPES +#include <stdarg.h> +#define va_init_list(a,b) va_start(a,b) +#else +#include <varargs.h> +#define va_init_list(a,b) va_start(a) +#endif + +VALUE +#ifdef HAVE_STDARG_PROTOTYPES +rb_struct_define(const char *name, ...) +#else +rb_struct_define(name, va_alist) + const char *name; + va_dcl +#endif +{ + va_list ar; + VALUE nm, ary; + char *mem; + + if (!name) nm = Qnil; + else nm = rb_str_new2(name); + ary = rb_ary_new(); + + va_init_list(ar, name); + while ((mem = va_arg(ar, char*)) != 0) { + ID slot = rb_intern(mem); + rb_ary_push(ary, ID2SYM(slot)); + } + va_end(ar); + + return make_struct(nm, ary, rb_cStruct); +} + +/* + * call-seq: + * Struct.new( [aString] [, aSym]+> ) => StructClass + * StructClass.new(arg, ...) => obj + * StructClass[arg, ...] => obj + * + * Creates a new class, named by <i>aString</i>, containing accessor + * methods for the given symbols. If the name <i>aString</i> is + * omitted, an anonymous structure class will be created. Otherwise, + * the name of this struct will appear as a constant in class + * <code>Struct</code>, so it must be unique for all + * <code>Struct</code>s in the system and should start with a capital + * letter. Assigning a structure class to a constant effectively gives + * the class the name of the constant. + * + * <code>Struct::new</code> returns a new <code>Class</code> object, + * which can then be used to create specific instances of the new + * structure. The number of actual parameters must be + * less than or equal to the number of attributes defined for this + * class; unset parameters default to \nil{}. Passing too many + * parameters will raise an \E{ArgumentError}. + * + * The remaining methods listed in this section (class and instance) + * are defined for this generated class. + * + * # Create a structure with a name in Struct + * Struct.new("Customer", :name, :address) #=> Struct::Customer + * Struct::Customer.new("Dave", "123 Main") #=> #<Struct::Customer name="Dave", address="123 Main"> + * + * # Create a structure named by its constant + * Customer = Struct.new(:name, :address) #=> Customer + * Customer.new("Dave", "123 Main") #=> #<Customer name="Dave", address="123 Main"> + */ + +static VALUE +rb_struct_s_def(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + VALUE name, rest; + long i; + VALUE st; + ID id; + + rb_scan_args(argc, argv, "1*", &name, &rest); + if (!NIL_P(name) && SYMBOL_P(name)) { + rb_ary_unshift(rest, name); + name = Qnil; + } + for (i=0; i<RARRAY(rest)->len; i++) { + id = rb_to_id(RARRAY(rest)->ptr[i]); + RARRAY(rest)->ptr[i] = ID2SYM(id); + } + st = make_struct(name, rest, klass); + if (rb_block_given_p()) { + rb_mod_module_eval(0, 0, st); + } + + return st; +} + +/* + */ + +static VALUE +rb_struct_initialize(self, values) + VALUE self, values; +{ + VALUE klass = rb_obj_class(self); + VALUE size; + long n; + + rb_struct_modify(self); + size = rb_struct_iv_get(klass, "__size__"); + n = FIX2LONG(size); + if (n < RARRAY(values)->len) { + rb_raise(rb_eArgError, "struct size differs"); + } + MEMCPY(RSTRUCT(self)->ptr, RARRAY(values)->ptr, VALUE, RARRAY(values)->len); + if (n > RARRAY(values)->len) { + rb_mem_clear(RSTRUCT(self)->ptr+RARRAY(values)->len, + n-RARRAY(values)->len); + } + return Qnil; +} + +static VALUE +struct_alloc(klass) + VALUE klass; +{ + VALUE size; + long n; + NEWOBJ(st, struct RStruct); + OBJSETUP(st, klass, T_STRUCT); + + size = rb_struct_iv_get(klass, "__size__"); + n = FIX2LONG(size); + + st->ptr = ALLOC_N(VALUE, n); + rb_mem_clear(st->ptr, n); + st->len = n; + + return (VALUE)st; +} + +VALUE +rb_struct_alloc(klass, values) + VALUE klass, values; +{ + return rb_class_new_instance(RARRAY(values)->len, RARRAY(values)->ptr, klass); +} + +VALUE +#ifdef HAVE_STDARG_PROTOTYPES +rb_struct_new(VALUE klass, ...) +#else +rb_struct_new(klass, va_alist) + VALUE klass; + va_dcl +#endif +{ + VALUE sz, *mem; + long size, i; + va_list args; + + sz = rb_struct_iv_get(klass, "__size__"); + size = FIX2LONG(sz); + mem = ALLOCA_N(VALUE, size); + va_init_list(args, klass); + for (i=0; i<size; i++) { + mem[i] = va_arg(args, VALUE); + } + va_end(args); + + return rb_class_new_instance(size, mem, klass); +} + +/* + * call-seq: + * struct.each {|obj| block } => struct + * + * Calls <i>block</i> once for each instance variable, passing the + * value as a parameter. + * + * Customer = Struct.new(:name, :address, :zip) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) + * joe.each {|x| puts(x) } + * + * <em>produces:</em> + * + * Joe Smith + * 123 Maple, Anytown NC + * 12345 + */ + +static VALUE +rb_struct_each(s) + VALUE s; +{ + long i; + + for (i=0; i<RSTRUCT(s)->len; i++) { + rb_yield(RSTRUCT(s)->ptr[i]); + } + return s; +} + +/* + * call-seq: + * struct.each_pair {|sym, obj| block } => struct + * + * Calls <i>block</i> once for each instance variable, passing the name + * (as a symbol) and the value as parameters. + * + * Customer = Struct.new(:name, :address, :zip) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) + * joe.each_pair {|name, value| puts("#{name} => #{value}") } + * + * <em>produces:</em> + * + * name => Joe Smith + * address => 123 Maple, Anytown NC + * zip => 12345 + */ + +static VALUE +rb_struct_each_pair(s) + VALUE s; +{ + VALUE members; + long i; + + members = rb_struct_members(s); + for (i=0; i<RSTRUCT(s)->len; i++) { + rb_yield_values(2, rb_ary_entry(members, i), RSTRUCT(s)->ptr[i]); + } + return s; +} + +static VALUE +inspect_struct(s) + VALUE s; +{ + char *cname = rb_class2name(rb_obj_class(s)); + VALUE str, members; + long i; + + members = rb_struct_members(s); + str = rb_str_buf_new2("#<struct "); + rb_str_cat2(str, cname); + rb_str_cat2(str, " "); + for (i=0; i<RSTRUCT(s)->len; i++) { + VALUE slot; + ID id; + char *p; + + if (i > 0) { + rb_str_cat2(str, ", "); + } + slot = RARRAY(members)->ptr[i]; + id = SYM2ID(slot); + if (rb_is_local_id(id) || rb_is_const_id(id)) { + p = rb_id2name(id); + rb_str_cat2(str, p); + } + else { + rb_str_append(str, rb_inspect(slot)); + } + rb_str_cat2(str, "="); + rb_str_append(str, rb_inspect(RSTRUCT(s)->ptr[i])); + } + rb_str_cat2(str, ">"); + OBJ_INFECT(str, s); + + return str; +} + +/* + * call-seq: + * struct.to_s => string + * struct.inspect => string + * + * Describe the contents of this struct in a string. + */ + +static VALUE +rb_struct_inspect(s) + VALUE s; +{ + if (rb_inspecting_p(s)) { + char *cname = rb_class2name(rb_obj_class(s)); + size_t len = strlen(cname) + 14; + VALUE str = rb_str_new(0, len); + + snprintf(RSTRING(str)->ptr, len+1, "#<struct %s:...>", cname); + RSTRING(str)->len = strlen(RSTRING(str)->ptr); + return str; + } + return rb_protect_inspect(inspect_struct, s, 0); +} + +/* + * call-seq: + * struct.to_a => array + * struct.values => array + * + * Returns the values for this instance as an array. + * + * Customer = Struct.new(:name, :address, :zip) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) + * joe.to_a[1] #=> "123 Maple, Anytown NC" + */ + +static VALUE +rb_struct_to_a(s) + VALUE s; +{ + return rb_ary_new4(RSTRUCT(s)->len, RSTRUCT(s)->ptr); +} + +/* :nodoc: */ +static VALUE +rb_struct_init_copy(copy, s) + VALUE copy, s; +{ + if (copy == s) return copy; + rb_check_frozen(copy); + if (!rb_obj_is_instance_of(s, rb_obj_class(copy))) { + rb_raise(rb_eTypeError, "wrong argument class"); + } + if (RSTRUCT(copy)->len != RSTRUCT(s)->len) { + rb_raise(rb_eTypeError, "struct size mismatch"); + } + MEMCPY(RSTRUCT(copy)->ptr, RSTRUCT(s)->ptr, VALUE, RSTRUCT(copy)->len); + + return copy; +} + +static VALUE +rb_struct_aref_id(s, id) + VALUE s; + ID id; +{ + VALUE members; + long i, len; + + members = rb_struct_members(s); + len = RARRAY(members)->len; + for (i=0; i<len; i++) { + if (SYM2ID(RARRAY(members)->ptr[i]) == id) { + return RSTRUCT(s)->ptr[i]; + } + } + rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); + return Qnil; /* not reached */ +} + +/* + * call-seq: + * struct[symbol] => anObject + * struct[fixnum] => anObject + * + * Attribute Reference---Returns the value of the instance variable + * named by <i>symbol</i>, or indexed (0..length-1) by + * <i>fixnum</i>. Will raise <code>NameError</code> if the named + * variable does not exist, or <code>IndexError</code> if the index is + * out of range. + * + * Customer = Struct.new(:name, :address, :zip) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) + * + * joe["name"] #=> "Joe Smith" + * joe[:name] #=> "Joe Smith" + * joe[0] #=> "Joe Smith" + */ + +VALUE +rb_struct_aref(s, idx) + VALUE s, idx; +{ + long i; + + if (TYPE(idx) == T_STRING || TYPE(idx) == T_SYMBOL) { + return rb_struct_aref_id(s, rb_to_id(idx)); + } + + i = NUM2LONG(idx); + if (i < 0) i = RSTRUCT(s)->len + i; + if (i < 0) + rb_raise(rb_eIndexError, "offset %ld too small for struct(size:%ld)", + i, RSTRUCT(s)->len); + if (RSTRUCT(s)->len <= i) + rb_raise(rb_eIndexError, "offset %ld too large for struct(size:%ld)", + i, RSTRUCT(s)->len); + return RSTRUCT(s)->ptr[i]; +} + +static VALUE +rb_struct_aset_id(s, id, val) + VALUE s, val; + ID id; +{ + VALUE members; + long i, len; + + members = rb_struct_members(s); + rb_struct_modify(s); + len = RARRAY(members)->len; + if (RSTRUCT(s)->len != RARRAY(members)->len) { + rb_raise(rb_eTypeError, "struct size differs (%d required %d given)", + RARRAY(members)->len, RSTRUCT(s)->len); + } + for (i=0; i<len; i++) { + if (SYM2ID(RARRAY(members)->ptr[i]) == id) { + RSTRUCT(s)->ptr[i] = val; + return val; + } + } + rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); +} + +/* + * call-seq: + * struct[symbol] = obj => obj + * struct[fixnum] = obj => obj + * + * Attribute Assignment---Assigns to the instance variable named by + * <i>symbol</i> or <i>fixnum</i> the value <i>obj</i> and + * returns it. Will raise a <code>NameError</code> if the named + * variable does not exist, or an <code>IndexError</code> if the index + * is out of range. + * + * Customer = Struct.new(:name, :address, :zip) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) + * + * joe["name"] = "Luke" + * joe[:zip] = "90210" + * + * joe.name #=> "Luke" + * joe.zip #=> "90210" + */ + +VALUE +rb_struct_aset(s, idx, val) + VALUE s, idx, val; +{ + long i; + + if (TYPE(idx) == T_STRING || TYPE(idx) == T_SYMBOL) { + return rb_struct_aset_id(s, rb_to_id(idx), val); + } + + i = NUM2LONG(idx); + if (i < 0) i = RSTRUCT(s)->len + i; + if (i < 0) { + rb_raise(rb_eIndexError, "offset %ld too small for struct(size:%ld)", + i, RSTRUCT(s)->len); + } + if (RSTRUCT(s)->len <= i) { + rb_raise(rb_eIndexError, "offset %ld too large for struct(size:%ld)", + i, RSTRUCT(s)->len); + } + rb_struct_modify(s); + return RSTRUCT(s)->ptr[i] = val; +} + +static VALUE struct_entry _((VALUE, long)); +static VALUE +struct_entry(s, n) + VALUE s; + long n; +{ + return rb_struct_aref(s, LONG2NUM(n)); +} + +/* + * call-seq: + * struct.values_at(selector,... ) => an_array + * + * Returns an array containing the elements in + * _self_ corresponding to the given selector(s). The selectors + * may be either integer indices or ranges. + * See also </code>.select<code>. + * + * a = %w{ a b c d e f } + * a.values_at(1, 3, 5) + * a.values_at(1, 3, 5, 7) + * a.values_at(-1, -3, -5, -7) + * a.values_at(1..3, 2...5) + */ + +static VALUE +rb_struct_values_at(argc, argv, s) + int argc; + VALUE *argv; + VALUE s; +{ + return rb_values_at(s, RSTRUCT(s)->len, argc, argv, struct_entry); +} + +/* + * call-seq: + * struct.select {|i| block } => array + * + * Invokes the block passing in successive elements from + * <i>struct</i>, returning an array containing those elements + * for which the block returns a true value (equivalent to + * <code>Enumerable#select</code>). + * + * Lots = Struct.new(:a, :b, :c, :d, :e, :f) + * l = Lots.new(11, 22, 33, 44, 55, 66) + * l.select {|v| (v % 2).zero? } #=> [22, 44, 66] + */ + +static VALUE +rb_struct_select(argc, argv, s) + int argc; + VALUE *argv; + VALUE s; +{ + VALUE result; + long i; + + if (argc > 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); + } + result = rb_ary_new(); + for (i = 0; i < RSTRUCT(s)->len; i++) { + if (RTEST(rb_yield(RSTRUCT(s)->ptr[i]))) { + rb_ary_push(result, RSTRUCT(s)->ptr[i]); + } + } + + return result; +} + +/* + * call-seq: + * struct == other_struct => true or false + * + * Equality---Returns <code>true</code> if <i>other_struct</i> is + * equal to this one: they must be of the same class as generated by + * <code>Struct::new</code>, and the values of all instance variables + * must be equal (according to <code>Object#==</code>). + * + * Customer = Struct.new(:name, :address, :zip) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) + * joejr = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) + * jane = Customer.new("Jane Doe", "456 Elm, Anytown NC", 12345) + * joe == joejr #=> true + * joe == jane #=> false + */ + +static VALUE +rb_struct_equal(s, s2) + VALUE s, s2; +{ + long i; + + if (s == s2) return Qtrue; + if (TYPE(s2) != T_STRUCT) return Qfalse; + if (rb_obj_class(s) != rb_obj_class(s2)) return Qfalse; + if (RSTRUCT(s)->len != RSTRUCT(s2)->len) { + rb_bug("inconsistent struct"); /* should never happen */ + } + + for (i=0; i<RSTRUCT(s)->len; i++) { + if (!rb_equal(RSTRUCT(s)->ptr[i], RSTRUCT(s2)->ptr[i])) return Qfalse; + } + return Qtrue; +} + +/* + * call-seq: + * struct.hash => fixnum + * + * Return a hash value based on this struct's contents. + */ + +static VALUE +rb_struct_hash(s) + VALUE s; +{ + long i, h; + VALUE n; + + h = rb_hash(rb_obj_class(s)); + for (i = 0; i < RSTRUCT(s)->len; i++) { + h = (h << 1) | (h<0 ? 1 : 0); + n = rb_hash(RSTRUCT(s)->ptr[i]); + h ^= NUM2LONG(n); + } + return LONG2FIX(h); +} + +/* + * code-seq: + * struct.eql?(other) => true or false + * + * Two structures are equal if they are the same object, or if all their + * fields are equal (using <code>eql?</code>). + */ + +static VALUE +rb_struct_eql(s, s2) + VALUE s, s2; +{ + long i; + + if (s == s2) return Qtrue; + if (TYPE(s2) != T_STRUCT) return Qfalse; + if (rb_obj_class(s) != rb_obj_class(s2)) return Qfalse; + if (RSTRUCT(s)->len != RSTRUCT(s2)->len) { + rb_bug("inconsistent struct"); /* should never happen */ + } + + for (i=0; i<RSTRUCT(s)->len; i++) { + if (!rb_eql(RSTRUCT(s)->ptr[i], RSTRUCT(s2)->ptr[i])) return Qfalse; + } + return Qtrue; +} + +/* + * call-seq: + * struct.length => fixnum + * struct.size => fixnum + * + * Returns the number of instance variables. + * + * Customer = Struct.new(:name, :address, :zip) + * joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) + * joe.length #=> 3 + */ + +static VALUE +rb_struct_size(s) + VALUE s; +{ + return LONG2FIX(RSTRUCT(s)->len); +} + +/* + * A <code>Struct</code> is a convenient way to bundle a number of + * attributes together, using accessor methods, without having to write + * an explicit class. + * + * The <code>Struct</code> class is a generator of specific classes, + * each one of which is defined to hold a set of variables and their + * accessors. In these examples, we'll call the generated class + * ``<i>Customer</i>Class,'' and we'll show an example instance of that + * class as ``<i>Customer</i>Inst.'' + * + * In the descriptions that follow, the parameter <i>symbol</i> refers + * to a symbol, which is either a quoted string or a + * <code>Symbol</code> (such as <code>:name</code>). + */ +void +Init_Struct() +{ + rb_cStruct = rb_define_class("Struct", rb_cObject); + rb_include_module(rb_cStruct, rb_mEnumerable); + + rb_undef_alloc_func(rb_cStruct); + rb_define_singleton_method(rb_cStruct, "new", rb_struct_s_def, -1); + + rb_define_method(rb_cStruct, "initialize", rb_struct_initialize, -2); + rb_define_method(rb_cStruct, "initialize_copy", rb_struct_init_copy, 1); + + rb_define_method(rb_cStruct, "==", rb_struct_equal, 1); + rb_define_method(rb_cStruct, "eql?", rb_struct_eql, 1); + rb_define_method(rb_cStruct, "hash", rb_struct_hash, 0); + + rb_define_method(rb_cStruct, "to_s", rb_struct_inspect, 0); + rb_define_method(rb_cStruct, "inspect", rb_struct_inspect, 0); + rb_define_method(rb_cStruct, "to_a", rb_struct_to_a, 0); + rb_define_method(rb_cStruct, "values", rb_struct_to_a, 0); + rb_define_method(rb_cStruct, "size", rb_struct_size, 0); + rb_define_method(rb_cStruct, "length", rb_struct_size, 0); + + rb_define_method(rb_cStruct, "each", rb_struct_each, 0); + rb_define_method(rb_cStruct, "each_pair", rb_struct_each_pair, 0); + rb_define_method(rb_cStruct, "[]", rb_struct_aref, 1); + rb_define_method(rb_cStruct, "[]=", rb_struct_aset, 2); + rb_define_method(rb_cStruct, "select", rb_struct_select, -1); + rb_define_method(rb_cStruct, "values_at", rb_struct_values_at, -1); + + rb_define_method(rb_cStruct, "members", rb_struct_members_m, 0); +} +/********************************************************************** + + time.c - + + $Author: shyouhei $ + $Date: 2009-02-02 12:03:25 +0100 (Mon, 02 Feb 2009) $ + created at: Tue Dec 28 14:31:59 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include <sys/types.h> +#include <time.h> + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#include <errno.h> +#include <math.h> + +VALUE rb_cTime; + +struct time_object { + struct timeval tv; + struct tm tm; + int gmt; + int tm_got; +}; + +#define GetTimeval(obj, tobj) \ + Data_Get_Struct(obj, struct time_object, tobj) + +static void time_free _((void *)); +static VALUE time_utc_offset _((VALUE)); + +static void +time_free(tobj) + void *tobj; +{ + if (tobj) free(tobj); +} + +static VALUE time_s_alloc _((VALUE)); +static VALUE +time_s_alloc(klass) + VALUE klass; +{ + VALUE obj; + struct time_object *tobj; + + obj = Data_Make_Struct(klass, struct time_object, 0, time_free, tobj); + tobj->tm_got=0; + tobj->tv.tv_sec = 0; + tobj->tv.tv_usec = 0; + + return obj; +} + +static void +time_modify(time) + VALUE time; +{ + rb_check_frozen(time); + if (!OBJ_TAINTED(time) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify Time"); +} + +/* + * Document-method: now + * + * Synonym for <code>Time.new</code>. Returns a +Time+ object + * initialized tot he current system time. + * + * call-seq: + * Time.new -> time + * + * Returns a <code>Time</code> object initialized to the current system + * time. <b>Note:</b> The object created will be created using the + * resolution available on your system clock, and so may include + * fractional seconds. + * + * a = Time.new #=> Wed Apr 09 08:56:03 CDT 2003 + * b = Time.new #=> Wed Apr 09 08:56:03 CDT 2003 + * a == b #=> false + * "%.6f" % a.to_f #=> "1049896563.230740" + * "%.6f" % b.to_f #=> "1049896563.231466" + * + */ + +static VALUE +time_init(time) + VALUE time; +{ + struct time_object *tobj; + + time_modify(time); + GetTimeval(time, tobj); + tobj->tm_got=0; + tobj->tv.tv_sec = 0; + tobj->tv.tv_usec = 0; + if (gettimeofday(&tobj->tv, 0) < 0) { + rb_sys_fail("gettimeofday"); + } + + return time; +} + +#define NDIV(x,y) (-(-((x)+1)/(y))-1) +#define NMOD(x,y) ((y)-(-((x)+1)%(y))-1) + +static void +time_overflow_p(secp, usecp) + time_t *secp, *usecp; +{ + time_t tmp, sec = *secp, usec = *usecp; + + if (usec >= 1000000) { /* usec positive overflow */ + tmp = sec + usec / 1000000; + usec %= 1000000; + if (sec > 0 && tmp < 0) { + rb_raise(rb_eRangeError, "out of Time range"); + } + sec = tmp; + } + if (usec < 0) { /* usec negative overflow */ + tmp = sec + NDIV(usec,1000000); /* negative div */ + usec = NMOD(usec,1000000); /* negative mod */ + if (sec < 0 && tmp > 0) { + rb_raise(rb_eRangeError, "out of Time range"); + } + sec = tmp; + } +#ifndef NEGATIVE_TIME_T + if (sec < 0 || (sec == 0 && usec < 0)) + rb_raise(rb_eArgError, "time must be positive"); +#endif + *secp = sec; + *usecp = usec; +} + +static VALUE time_new_internal _((VALUE, time_t, time_t)); +static VALUE +time_new_internal(klass, sec, usec) + VALUE klass; + time_t sec, usec; +{ + VALUE time = time_s_alloc(klass); + struct time_object *tobj; + + GetTimeval(time, tobj); + time_overflow_p(&sec, &usec); + tobj->tv.tv_sec = sec; + tobj->tv.tv_usec = usec; + + return time; +} + +VALUE +rb_time_new(sec, usec) + time_t sec, usec; +{ + return time_new_internal(rb_cTime, sec, usec); +} + +static struct timeval +time_timeval(time, interval) + VALUE time; + int interval; +{ + struct timeval t; + char *tstr = interval ? "time interval" : "time"; + +#ifndef NEGATIVE_TIME_T + interval = 1; +#endif + + switch (TYPE(time)) { + case T_FIXNUM: + t.tv_sec = FIX2LONG(time); + if (interval && t.tv_sec < 0) + rb_raise(rb_eArgError, "%s must be positive", tstr); + t.tv_usec = 0; + break; + + case T_FLOAT: + if (interval && RFLOAT(time)->value < 0.0) + rb_raise(rb_eArgError, "%s must be positive", tstr); + else { + double f, d; + + d = modf(RFLOAT(time)->value, &f); + if (d < 0) { + d += 1; + f -= 1; + } + t.tv_sec = (time_t)f; + if (f != t.tv_sec) { + rb_raise(rb_eRangeError, "%f out of Time range", RFLOAT(time)->value); + } + t.tv_usec = (time_t)(d*1e6+0.5); + } + break; + + case T_BIGNUM: + t.tv_sec = NUM2LONG(time); + if (interval && t.tv_sec < 0) + rb_raise(rb_eArgError, "%s must be positive", tstr); + t.tv_usec = 0; + break; + + default: + rb_raise(rb_eTypeError, "can't convert %s into %s", + rb_obj_classname(time), tstr); + break; + } + return t; +} + +struct timeval +rb_time_interval(time) + VALUE time; +{ + return time_timeval(time, Qtrue); +} + +struct timeval +rb_time_timeval(time) + VALUE time; +{ + struct time_object *tobj; + struct timeval t; + + if (TYPE(time) == T_DATA && RDATA(time)->dfree == time_free) { + GetTimeval(time, tobj); + t = tobj->tv; + return t; + } + return time_timeval(time, Qfalse); +} + +/* + * call-seq: + * Time.at( aTime ) => time + * Time.at( seconds [, microseconds] ) => time + * + * Creates a new time object with the value given by <i>aTime</i>, or + * the given number of <i>seconds</i> (and optional + * <i>microseconds</i>) from epoch. A non-portable feature allows the + * offset to be negative on some systems. + * + * Time.at(0) #=> Wed Dec 31 18:00:00 CST 1969 + * Time.at(946702800) #=> Fri Dec 31 23:00:00 CST 1999 + * Time.at(-284061600) #=> Sat Dec 31 00:00:00 CST 1960 + */ + +static VALUE +time_s_at(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + struct timeval tv; + VALUE time, t; + + if (rb_scan_args(argc, argv, "11", &time, &t) == 2) { + tv.tv_sec = NUM2LONG(time); + tv.tv_usec = NUM2LONG(t); + } + else { + tv = rb_time_timeval(time); + } + t = time_new_internal(klass, tv.tv_sec, tv.tv_usec); + if (TYPE(time) == T_DATA && RDATA(time)->dfree == time_free) { + struct time_object *tobj, *tobj2; + + GetTimeval(time, tobj); + GetTimeval(t, tobj2); + tobj2->gmt = tobj->gmt; + } + return t; +} + +static char *months [12] = { + "jan", "feb", "mar", "apr", "may", "jun", + "jul", "aug", "sep", "oct", "nov", "dec", +}; + +static long +obj2long(obj) + VALUE obj; +{ + if (TYPE(obj) == T_STRING) { + obj = rb_str_to_inum(obj, 10, Qfalse); + } + + return NUM2LONG(obj); +} + +static void +time_arg(argc, argv, tm, usec) + int argc; + VALUE *argv; + struct tm *tm; + time_t *usec; +{ + VALUE v[8]; + int i; + long year; + + MEMZERO(tm, struct tm, 1); + *usec = 0; + if (argc == 10) { + v[0] = argv[5]; + v[1] = argv[4]; + v[2] = argv[3]; + v[3] = argv[2]; + v[4] = argv[1]; + v[5] = argv[0]; + v[6] = Qnil; + tm->tm_isdst = RTEST(argv[8]) ? 1 : 0; + } + else { + rb_scan_args(argc, argv, "17", &v[0],&v[1],&v[2],&v[3],&v[4],&v[5],&v[6],&v[7]); + /* v[6] may be usec or zone (parsedate) */ + /* v[7] is wday (parsedate; ignored) */ + tm->tm_wday = -1; + tm->tm_isdst = -1; + } + + year = obj2long(v[0]); + + if (0 <= year && year < 39) { + year += 100; + rb_warning("2 digits year is used"); + } + else if (69 <= year && year < 139) { + rb_warning("2 or 3 digits year is used"); + } + else { + year -= 1900; + } + + tm->tm_year = year; + + if (NIL_P(v[1])) { + tm->tm_mon = 0; + } + else { + VALUE s = rb_check_string_type(v[1]); + if (!NIL_P(s)) { + tm->tm_mon = -1; + for (i=0; i<12; i++) { + if (RSTRING(s)->len == 3 && + strcasecmp(months[i], RSTRING(s)->ptr) == 0) { + tm->tm_mon = i; + break; + } + } + if (tm->tm_mon == -1) { + char c = RSTRING(s)->ptr[0]; + + if ('0' <= c && c <= '9') { + tm->tm_mon = obj2long(s)-1; + } + } + } + else { + tm->tm_mon = obj2long(v[1])-1; + } + } + if (NIL_P(v[2])) { + tm->tm_mday = 1; + } + else { + tm->tm_mday = obj2long(v[2]); + } + tm->tm_hour = NIL_P(v[3])?0:obj2long(v[3]); + tm->tm_min = NIL_P(v[4])?0:obj2long(v[4]); + tm->tm_sec = NIL_P(v[5])?0:obj2long(v[5]); + if (!NIL_P(v[6])) { + if (argc == 8) { + /* v[6] is timezone, but ignored */ + } + else if (argc == 7) { + *usec = obj2long(v[6]); + } + } + + /* value validation */ + if ( + tm->tm_year != year || +#ifndef NEGATIVE_TIME_T + tm->tm_year < 69 || +#endif + tm->tm_mon < 0 || tm->tm_mon > 11 + || tm->tm_mday < 1 || tm->tm_mday > 31 + || tm->tm_hour < 0 || tm->tm_hour > 23 + || tm->tm_min < 0 || tm->tm_min > 59 + || tm->tm_sec < 0 || tm->tm_sec > 60) + rb_raise(rb_eArgError, "argument out of range"); +} + +static VALUE time_gmtime _((VALUE)); +static VALUE time_localtime _((VALUE)); +static VALUE time_get_tm _((VALUE, int)); + +static int +leap_year_p(y) + long y; +{ + return ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0); +} + +#define DIV(n,d) ((n)<0 ? NDIV((n),(d)) : (n)/(d)) + +static time_t +timegm_noleapsecond(tm) + struct tm *tm; +{ + static int common_year_yday_offset[] = { + -1, + -1 + 31, + -1 + 31 + 28, + -1 + 31 + 28 + 31, + -1 + 31 + 28 + 31 + 30, + -1 + 31 + 28 + 31 + 30 + 31, + -1 + 31 + 28 + 31 + 30 + 31 + 30, + -1 + 31 + 28 + 31 + 30 + 31 + 30 + 31, + -1 + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31, + -1 + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30, + -1 + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31, + -1 + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + /* 1 2 3 4 5 6 7 8 9 10 11 */ + }; + static int leap_year_yday_offset[] = { + -1, + -1 + 31, + -1 + 31 + 29, + -1 + 31 + 29 + 31, + -1 + 31 + 29 + 31 + 30, + -1 + 31 + 29 + 31 + 30 + 31, + -1 + 31 + 29 + 31 + 30 + 31 + 30, + -1 + 31 + 29 + 31 + 30 + 31 + 30 + 31, + -1 + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31, + -1 + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30, + -1 + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31, + -1 + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + /* 1 2 3 4 5 6 7 8 9 10 11 */ + }; + + long tm_year = tm->tm_year; + int tm_yday = tm->tm_mday; + if (leap_year_p(tm_year + 1900)) + tm_yday += leap_year_yday_offset[tm->tm_mon]; + else + tm_yday += common_year_yday_offset[tm->tm_mon]; + + /* + * `Seconds Since the Epoch' in SUSv3: + * tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + + * (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - + * ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400 + */ + return tm->tm_sec + tm->tm_min*60 + tm->tm_hour*3600 + + (time_t)(tm_yday + + (tm_year-70)*365 + + DIV(tm_year-69,4) - + DIV(tm_year-1,100) + + DIV(tm_year+299,400))*86400; +} + +static int +tmcmp(a, b) + struct tm *a; + struct tm *b; +{ + if (a->tm_year != b->tm_year) + return a->tm_year < b->tm_year ? -1 : 1; + else if (a->tm_mon != b->tm_mon) + return a->tm_mon < b->tm_mon ? -1 : 1; + else if (a->tm_mday != b->tm_mday) + return a->tm_mday < b->tm_mday ? -1 : 1; + else if (a->tm_hour != b->tm_hour) + return a->tm_hour < b->tm_hour ? -1 : 1; + else if (a->tm_min != b->tm_min) + return a->tm_min < b->tm_min ? -1 : 1; + else if (a->tm_sec != b->tm_sec) + return a->tm_sec < b->tm_sec ? -1 : 1; + else + return 0; +} + +#if SIZEOF_TIME_T == SIZEOF_LONG +typedef unsigned long unsigned_time_t; +#elif SIZEOF_TIME_T == SIZEOF_INT +typedef unsigned int unsigned_time_t; +#elif SIZEOF_TIME_T == SIZEOF_LONG_LONG +typedef unsigned LONG_LONG unsigned_time_t; +#else +# error cannot find integer type which size is same as time_t. +#endif + +static time_t +search_time_t(tptr, utc_p) + struct tm *tptr; + int utc_p; +{ + time_t guess, guess_lo, guess_hi; + struct tm *tm, tm_lo, tm_hi; + int d, have_guess; + int find_dst; + + find_dst = 0 < tptr->tm_isdst; + +#ifdef NEGATIVE_TIME_T + guess_lo = (time_t)~((unsigned_time_t)~(time_t)0 >> 1); +#else + guess_lo = 0; +#endif + guess_hi = ((time_t)-1) < ((time_t)0) ? + (time_t)((unsigned_time_t)~(time_t)0 >> 1) : + ~(time_t)0; + + guess = timegm_noleapsecond(tptr); + tm = (utc_p ? gmtime : localtime)(&guess); + if (tm) { + d = tmcmp(tptr, tm); + if (d == 0) return guess; + if (d < 0) { + guess_hi = guess; + guess -= 24 * 60 * 60; + } + else { + guess_lo = guess; + guess += 24 * 60 * 60; + } + if (guess_lo < guess && guess < guess_hi && + (tm = (utc_p ? gmtime : localtime)(&guess)) != NULL) { + d = tmcmp(tptr, tm); + if (d == 0) return guess; + if (d < 0) + guess_hi = guess; + else + guess_lo = guess; + } + } + + tm = (utc_p ? gmtime : localtime)(&guess_lo); + if (!tm) goto error; + d = tmcmp(tptr, tm); + if (d < 0) goto out_of_range; + if (d == 0) return guess_lo; + tm_lo = *tm; + + tm = (utc_p ? gmtime : localtime)(&guess_hi); + if (!tm) goto error; + d = tmcmp(tptr, tm); + if (d > 0) goto out_of_range; + if (d == 0) return guess_hi; + tm_hi = *tm; + + have_guess = 0; + + while (guess_lo + 1 < guess_hi) { + /* there is a gap between guess_lo and guess_hi. */ + unsigned long range = 0; + if (!have_guess) { + int a, b; + /* + Try precious guess by a linear interpolation at first. + `a' and `b' is a coefficient of guess_lo and guess_hi as: + + guess = (guess_lo * a + guess_hi * b) / (a + b) + + However this causes overflow in most cases, following assignment + is used instead: + + guess = guess_lo / d * a + (guess_lo % d) * a / d + + guess_hi / d * b + (guess_hi % d) * b / d + where d = a + b + + To avoid overflow in this assignment, `d' is restricted to less than + sqrt(2**31). By this restriction and other reasons, the guess is + not accurate and some error is expected. `range' approximates + the maximum error. + + When these parameters are not suitable, i.e. guess is not within + guess_lo and guess_hi, simple guess by binary search is used. + */ + range = 366 * 24 * 60 * 60; + a = (tm_hi.tm_year - tptr->tm_year); + b = (tptr->tm_year - tm_lo.tm_year); + /* 46000 is selected as `some big number less than sqrt(2**31)'. */ + if (a + b <= 46000 / 12) { + range = 31 * 24 * 60 * 60; + a *= 12; + b *= 12; + a += tm_hi.tm_mon - tptr->tm_mon; + b += tptr->tm_mon - tm_lo.tm_mon; + if (a + b <= 46000 / 31) { + range = 24 * 60 * 60; + a *= 31; + b *= 31; + a += tm_hi.tm_mday - tptr->tm_mday; + b += tptr->tm_mday - tm_lo.tm_mday; + if (a + b <= 46000 / 24) { + range = 60 * 60; + a *= 24; + b *= 24; + a += tm_hi.tm_hour - tptr->tm_hour; + b += tptr->tm_hour - tm_lo.tm_hour; + if (a + b <= 46000 / 60) { + range = 60; + a *= 60; + b *= 60; + a += tm_hi.tm_min - tptr->tm_min; + b += tptr->tm_min - tm_lo.tm_min; + if (a + b <= 46000 / 60) { + range = 1; + a *= 60; + b *= 60; + a += tm_hi.tm_sec - tptr->tm_sec; + b += tptr->tm_sec - tm_lo.tm_sec; + } + } + } + } + } + if (a <= 0) a = 1; + if (b <= 0) b = 1; + d = a + b; + /* + Although `/' and `%' may produce unexpected result with negative + argument, it doesn't cause serious problem because there is a + fail safe. + */ + guess = guess_lo / d * a + (guess_lo % d) * a / d + + guess_hi / d * b + (guess_hi % d) * b / d; + have_guess = 1; + } + + if (guess <= guess_lo || guess_hi <= guess) { + /* Precious guess is invalid. try binary search. */ + guess = guess_lo / 2 + guess_hi / 2; + if (guess <= guess_lo) + guess = guess_lo + 1; + else if (guess >= guess_hi) + guess = guess_hi - 1; + range = 0; + } + + tm = (utc_p ? gmtime : localtime)(&guess); + if (!tm) goto error; + have_guess = 0; + + d = tmcmp(tptr, tm); + if (d < 0) { + guess_hi = guess; + tm_hi = *tm; + if (range) { + guess = guess - range; + range = 0; + if (guess_lo < guess && guess < guess_hi) + have_guess = 1; + } + } + else if (d > 0) { + guess_lo = guess; + tm_lo = *tm; + if (range) { + guess = guess + range; + range = 0; + if (guess_lo < guess && guess < guess_hi) + have_guess = 1; + } + } + else { + if (!utc_p) { + /* If localtime is nonmonotonic, another result may exist. */ + time_t guess2; + if (find_dst) { + guess2 = guess - 2 * 60 * 60; + tm = localtime(&guess2); + if (tm) { + if (tptr->tm_hour != (tm->tm_hour + 2) % 24 || + tptr->tm_min != tm->tm_min || + tptr->tm_sec != tm->tm_sec) { + guess2 -= (tm->tm_hour - tptr->tm_hour) * 60 * 60 + + (tm->tm_min - tptr->tm_min) * 60 + + (tm->tm_sec - tptr->tm_sec); + if (tptr->tm_mday != tm->tm_mday) + guess2 += 24 * 60 * 60; + if (guess != guess2) { + tm = localtime(&guess2); + if (tmcmp(tptr, tm) == 0) { + if (guess < guess2) + return guess; + else + return guess2; + } + } + } + } + } + else { + guess2 = guess + 2 * 60 * 60; + tm = localtime(&guess2); + if (tm) { + if ((tptr->tm_hour + 2) % 24 != tm->tm_hour || + tptr->tm_min != tm->tm_min || + tptr->tm_sec != tm->tm_sec) { + guess2 -= (tm->tm_hour - tptr->tm_hour) * 60 * 60 + + (tm->tm_min - tptr->tm_min) * 60 + + (tm->tm_sec - tptr->tm_sec); + if (tptr->tm_mday != tm->tm_mday) + guess2 -= 24 * 60 * 60; + if (guess != guess2) { + tm = localtime(&guess2); + if (tmcmp(tptr, tm) == 0) { + if (guess < guess2) + return guess2; + else + return guess; + } + } + } + } + } + } + return guess; + } + } + /* Given argument has no corresponding time_t. Let's outerpolation. */ + if (tm_lo.tm_year == tptr->tm_year && tm_lo.tm_mon == tptr->tm_mon) { + return guess_lo + + (tptr->tm_mday - tm_lo.tm_mday) * 24 * 60 * 60 + + (tptr->tm_hour - tm_lo.tm_hour) * 60 * 60 + + (tptr->tm_min - tm_lo.tm_min) * 60 + + (tptr->tm_sec - tm_lo.tm_sec); + } + else if (tm_hi.tm_year == tptr->tm_year && tm_hi.tm_mon == tptr->tm_mon) { + return guess_hi + + (tptr->tm_mday - tm_hi.tm_mday) * 24 * 60 * 60 + + (tptr->tm_hour - tm_hi.tm_hour) * 60 * 60 + + (tptr->tm_min - tm_hi.tm_min) * 60 + + (tptr->tm_sec - tm_hi.tm_sec); + } + + out_of_range: + rb_raise(rb_eArgError, "time out of range"); + + error: + rb_raise(rb_eArgError, "gmtime/localtime error"); + return 0; /* not reached */ +} + +static time_t +make_time_t(tptr, utc_p) + struct tm *tptr; + int utc_p; +{ + time_t t; + struct tm *tmp, buf; + buf = *tptr; + if (utc_p) { +#if defined(HAVE_TIMEGM) + if ((t = timegm(&buf)) != -1) + return t; +#ifdef NEGATIVE_TIME_T + if ((tmp = gmtime(&t)) && + tptr->tm_year == tmp->tm_year && + tptr->tm_mon == tmp->tm_mon && + tptr->tm_mday == tmp->tm_mday && + tptr->tm_hour == tmp->tm_hour && + tptr->tm_min == tmp->tm_min && + tptr->tm_sec == tmp->tm_sec) + return t; +#endif +#endif + return search_time_t(&buf, utc_p); + } + else { +#if defined(HAVE_MKTIME) + if ((t = mktime(&buf)) != -1) + return t; +#ifdef NEGATIVE_TIME_T + if ((tmp = localtime(&t)) && + tptr->tm_year == tmp->tm_year && + tptr->tm_mon == tmp->tm_mon && + tptr->tm_mday == tmp->tm_mday && + tptr->tm_hour == tmp->tm_hour && + tptr->tm_min == tmp->tm_min && + tptr->tm_sec == tmp->tm_sec) + return t; +#endif +#endif + return search_time_t(&buf, utc_p); + } +} + +static VALUE +time_utc_or_local(argc, argv, utc_p, klass) + int argc; + VALUE *argv; + int utc_p; + VALUE klass; +{ + struct tm tm; + VALUE time; + time_t usec; + + time_arg(argc, argv, &tm, &usec); + time = time_new_internal(klass, make_time_t(&tm, utc_p), usec); + if (utc_p) return time_gmtime(time); + return time_localtime(time); +} + +/* + * call-seq: + * Time.utc( year [, month, day, hour, min, sec, usec] ) => time + * Time.utc( sec, min, hour, day, month, year, wday, yday, isdst, tz + * ) => time + * Time.gm( year [, month, day, hour, min, sec, usec] ) => time + * Time.gm( sec, min, hour, day, month, year, wday, yday, isdst, tz + * ) => time + * + * Creates a time based on given values, interpreted as UTC (GMT). The + * year must be specified. Other values default to the minimum value + * for that field (and may be <code>nil</code> or omitted). Months may + * be specified by numbers from 1 to 12, or by the three-letter English + * month names. Hours are specified on a 24-hour clock (0..23). Raises + * an <code>ArgumentError</code> if any values are out of range. Will + * also accept ten arguments in the order output by + * <code>Time#to_a</code>. + * + * Time.utc(2000,"jan",1,20,15,1) #=> Sat Jan 01 20:15:01 UTC 2000 + * Time.gm(2000,"jan",1,20,15,1) #=> Sat Jan 01 20:15:01 UTC 2000 + */ +static VALUE +time_s_mkutc(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + return time_utc_or_local(argc, argv, Qtrue, klass); +} + +/* + * call-seq: + * Time.local( year [, month, day, hour, min, sec, usec] ) => time + * Time.local( sec, min, hour, day, month, year, wday, yday, isdst, + * tz ) => time + * Time.mktime( year, month, day, hour, min, sec, usec ) => time + * + * Same as <code>Time::gm</code>, but interprets the values in the + * local time zone. + * + * Time.local(2000,"jan",1,20,15,1) #=> Sat Jan 01 20:15:01 CST 2000 + */ + +static VALUE +time_s_mktime(argc, argv, klass) + int argc; + VALUE *argv; + VALUE klass; +{ + return time_utc_or_local(argc, argv, Qfalse, klass); +} + +/* + * call-seq: + * time.to_i => int + * time.tv_sec => int + * + * Returns the value of <i>time</i> as an integer number of seconds + * since epoch. + * + * t = Time.now + * "%10.5f" % t.to_f #=> "1049896564.17839" + * t.to_i #=> 1049896564 + */ + +static VALUE +time_to_i(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + return LONG2NUM(tobj->tv.tv_sec); +} + +/* + * call-seq: + * time.to_f => float + * + * Returns the value of <i>time</i> as a floating point number of + * seconds since epoch. + * + * t = Time.now + * "%10.5f" % t.to_f #=> "1049896564.13654" + * t.to_i #=> 1049896564 + */ + +static VALUE +time_to_f(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + return rb_float_new((double)tobj->tv.tv_sec+(double)tobj->tv.tv_usec/1e6); +} + +/* + * call-seq: + * time.usec => int + * time.tv_usec => int + * + * Returns just the number of microseconds for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * "%10.6f" % t.to_f #=> "1049896564.259970" + * t.usec #=> 259970 + */ + +static VALUE +time_usec(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + return LONG2NUM(tobj->tv.tv_usec); +} + +/* + * call-seq: + * time <=> other_time => -1, 0, +1 + * time <=> numeric => -1, 0, +1 + * + * Comparison---Compares <i>time</i> with <i>other_time</i> or with + * <i>numeric</i>, which is the number of seconds (possibly + * fractional) since epoch. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t2 = t + 2592000 #=> Fri May 09 08:56:03 CDT 2003 + * t <=> t2 #=> -1 + * t2 <=> t #=> 1 + * t <=> t #=> 0 + */ + +static VALUE +time_cmp(time1, time2) + VALUE time1, time2; +{ + struct time_object *tobj1, *tobj2; + + GetTimeval(time1, tobj1); + if (TYPE(time2) == T_DATA && RDATA(time2)->dfree == time_free) { + GetTimeval(time2, tobj2); + if (tobj1->tv.tv_sec == tobj2->tv.tv_sec) { + if (tobj1->tv.tv_usec == tobj2->tv.tv_usec) return INT2FIX(0); + if (tobj1->tv.tv_usec > tobj2->tv.tv_usec) return INT2FIX(1); + return INT2FIX(-1); + } + if (tobj1->tv.tv_sec > tobj2->tv.tv_sec) return INT2FIX(1); + return INT2FIX(-1); + } + + return Qnil; +} + +/* + * call-seq: + * time.eql?(other_time) + * + * Return <code>true</code> if <i>time</i> and <i>other_time</i> are + * both <code>Time</code> objects with the same seconds and fractional + * seconds. + */ + +static VALUE +time_eql(time1, time2) + VALUE time1, time2; +{ + struct time_object *tobj1, *tobj2; + + GetTimeval(time1, tobj1); + if (TYPE(time2) == T_DATA && RDATA(time2)->dfree == time_free) { + GetTimeval(time2, tobj2); + if (tobj1->tv.tv_sec == tobj2->tv.tv_sec) { + if (tobj1->tv.tv_usec == tobj2->tv.tv_usec) return Qtrue; + } + } + return Qfalse; +} + +/* + * call-seq: + * time.utc? => true or false + * time.gmt? => true or false + * + * Returns <code>true</code> if <i>time</i> represents a time in UTC + * (GMT). + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.utc? #=> false + * t = Time.gm(2000,"jan",1,20,15,1) #=> Sat Jan 01 20:15:01 UTC 2000 + * t.utc? #=> true + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.gmt? #=> false + * t = Time.gm(2000,1,1,20,15,1) #=> Sat Jan 01 20:15:01 UTC 2000 + * t.gmt? #=> true + */ + +static VALUE +time_utc_p(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->gmt) return Qtrue; + return Qfalse; +} + +/* + * call-seq: + * time.hash => fixnum + * + * Return a hash code for this time object. + */ + +static VALUE +time_hash(time) + VALUE time; +{ + struct time_object *tobj; + long hash; + + GetTimeval(time, tobj); + hash = tobj->tv.tv_sec ^ tobj->tv.tv_usec; + return LONG2FIX(hash); +} + +/* :nodoc: */ +static VALUE +time_init_copy(copy, time) + VALUE copy, time; +{ + struct time_object *tobj, *tcopy; + + if (copy == time) return copy; + time_modify(copy); + if (TYPE(time) != T_DATA || RDATA(time)->dfree != time_free) { + rb_raise(rb_eTypeError, "wrong argument type"); + } + GetTimeval(time, tobj); + GetTimeval(copy, tcopy); + MEMCPY(tcopy, tobj, struct time_object, 1); + + return copy; +} + +static VALUE +time_dup(time) + VALUE time; +{ + VALUE dup = time_s_alloc(CLASS_OF(time)); + time_init_copy(dup, time); + return dup; +} + +/* + * call-seq: + * time.localtime => time + * + * Converts <i>time</i> to local time (using the local time zone in + * effect for this process) modifying the receiver. + * + * t = Time.gm(2000, "jan", 1, 20, 15, 1) + * t.gmt? #=> true + * t.localtime #=> Sat Jan 01 14:15:01 CST 2000 + * t.gmt? #=> false + */ + +static VALUE +time_localtime(time) + VALUE time; +{ + struct time_object *tobj; + struct tm *tm_tmp; + time_t t; + + GetTimeval(time, tobj); + if (!tobj->gmt) { + if (tobj->tm_got) + return time; + } + else { + time_modify(time); + } + t = tobj->tv.tv_sec; + tm_tmp = localtime(&t); + if (!tm_tmp) + rb_raise(rb_eArgError, "localtime error"); + tobj->tm = *tm_tmp; + tobj->tm_got = 1; + tobj->gmt = 0; + return time; +} + +/* + * call-seq: + * time.gmtime => time + * time.utc => time + * + * Converts <i>time</i> to UTC (GMT), modifying the receiver. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.gmt? #=> false + * t.gmtime #=> Wed Apr 09 13:56:03 UTC 2003 + * t.gmt? #=> true + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.utc? #=> false + * t.utc #=> Wed Apr 09 13:56:04 UTC 2003 + * t.utc? #=> true + */ + +static VALUE +time_gmtime(time) + VALUE time; +{ + struct time_object *tobj; + struct tm *tm_tmp; + time_t t; + + GetTimeval(time, tobj); + if (tobj->gmt) { + if (tobj->tm_got) + return time; + } + else { + time_modify(time); + } + t = tobj->tv.tv_sec; + tm_tmp = gmtime(&t); + if (!tm_tmp) + rb_raise(rb_eArgError, "gmtime error"); + tobj->tm = *tm_tmp; + tobj->tm_got = 1; + tobj->gmt = 1; + return time; +} + +/* + * call-seq: + * time.getlocal => new_time + * + * Returns a new <code>new_time</code> object representing <i>time</i> in + * local time (using the local time zone in effect for this process). + * + * t = Time.gm(2000,1,1,20,15,1) #=> Sat Jan 01 20:15:01 UTC 2000 + * t.gmt? #=> true + * l = t.getlocal #=> Sat Jan 01 14:15:01 CST 2000 + * l.gmt? #=> false + * t == l #=> true + */ + +static VALUE +time_getlocaltime(time) + VALUE time; +{ + return time_localtime(time_dup(time)); +} + +/* + * call-seq: + * time.getgm => new_time + * time.getutc => new_time + * + * Returns a new <code>new_time</code> object representing <i>time</i> in + * UTC. + * + * t = Time.local(2000,1,1,20,15,1) #=> Sat Jan 01 20:15:01 CST 2000 + * t.gmt? #=> false + * y = t.getgm #=> Sun Jan 02 02:15:01 UTC 2000 + * y.gmt? #=> true + * t == y #=> true + */ + +static VALUE +time_getgmtime(time) + VALUE time; +{ + return time_gmtime(time_dup(time)); +} + +static VALUE +time_get_tm(time, gmt) + VALUE time; + int gmt; +{ + if (gmt) return time_gmtime(time); + return time_localtime(time); +} + +/* + * call-seq: + * time.asctime => string + * time.ctime => string + * + * Returns a canonical string representation of <i>time</i>. + * + * Time.now.asctime #=> "Wed Apr 9 08:56:03 2003" + */ + +static VALUE +time_asctime(time) + VALUE time; +{ + struct time_object *tobj; + char *s; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + s = asctime(&tobj->tm); + if (s[24] == '\n') s[24] = '\0'; + + return rb_str_new2(s); +} + +/* + * call-seq: + * time.inspect => string + * time.to_s => string + * + * Returns a string representing <i>time</i>. Equivalent to calling + * <code>Time#strftime</code> with a format string of ``<code>%a</code> + * <code>%b</code> <code>%d</code> <code>%H:%M:%S</code> + * <code>%Z</code> <code>%Y</code>''. + * + * Time.now.to_s #=> "Wed Apr 09 08:56:04 CDT 2003" + */ + +static VALUE +time_to_s(time) + VALUE time; +{ + struct time_object *tobj; + char buf[128]; + int len; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + if (tobj->gmt == 1) { + len = strftime(buf, 128, "%a %b %d %H:%M:%S UTC %Y", &tobj->tm); + } + else { + time_t off; + char buf2[32]; + char sign = '+'; +#if defined(HAVE_STRUCT_TM_TM_GMTOFF) + off = tobj->tm.tm_gmtoff; +#else + VALUE tmp = time_utc_offset(time); + off = NUM2INT(tmp); +#endif + if (off < 0) { + sign = '-'; + off = -off; + } + sprintf(buf2, "%%a %%b %%d %%H:%%M:%%S %c%02d%02d %%Y", + sign, (int)(off/3600), (int)(off%3600/60)); + len = strftime(buf, 128, buf2, &tobj->tm); + } + return rb_str_new(buf, len); +} + +static VALUE +time_add(tobj, offset, sign) + struct time_object *tobj; + VALUE offset; + int sign; +{ + double v = NUM2DBL(offset); + double f, d; + unsigned_time_t sec_off; + time_t usec_off, sec, usec; + VALUE result; + + if (v < 0) { + v = -v; + sign = -sign; + } + d = modf(v, &f); + sec_off = (unsigned_time_t)f; + if (f != (double)sec_off) + rb_raise(rb_eRangeError, "time %s %f out of Time range", + sign < 0 ? "-" : "+", v); + usec_off = (time_t)(d*1e6+0.5); + + if (sign < 0) { + sec = tobj->tv.tv_sec - sec_off; + usec = tobj->tv.tv_usec - usec_off; + if (sec > tobj->tv.tv_sec) + rb_raise(rb_eRangeError, "time - %f out of Time range", v); + } + else { + sec = tobj->tv.tv_sec + sec_off; + usec = tobj->tv.tv_usec + usec_off; + if (sec < tobj->tv.tv_sec) + rb_raise(rb_eRangeError, "time + %f out of Time range", v); + } + result = rb_time_new(sec, usec); + if (tobj->gmt) { + GetTimeval(result, tobj); + tobj->gmt = 1; + } + return result; +} + +/* + * call-seq: + * time + numeric => time + * + * Addition---Adds some number of seconds (possibly fractional) to + * <i>time</i> and returns that value as a new time. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t + (60 * 60 * 24) #=> Thu Apr 10 08:56:03 CDT 2003 + */ + +static VALUE +time_plus(time1, time2) + VALUE time1, time2; +{ + struct time_object *tobj; + GetTimeval(time1, tobj); + + if (TYPE(time2) == T_DATA && RDATA(time2)->dfree == time_free) { + rb_raise(rb_eTypeError, "time + time?"); + } + return time_add(tobj, time2, 1); +} + +/* + * call-seq: + * time - other_time => float + * time - numeric => time + * + * Difference---Returns a new time that represents the difference + * between two times, or subtracts the given number of seconds in + * <i>numeric</i> from <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t2 = t + 2592000 #=> Fri May 09 08:56:03 CDT 2003 + * t2 - t #=> 2592000.0 + * t2 - 2592000 #=> Wed Apr 09 08:56:03 CDT 2003 + */ + +static VALUE +time_minus(time1, time2) + VALUE time1, time2; +{ + struct time_object *tobj; + + GetTimeval(time1, tobj); + if (TYPE(time2) == T_DATA && RDATA(time2)->dfree == time_free) { + struct time_object *tobj2; + double f; + + GetTimeval(time2, tobj2); + f = (double)tobj->tv.tv_sec - (double)tobj2->tv.tv_sec; + f += ((double)tobj->tv.tv_usec - (double)tobj2->tv.tv_usec)*1e-6; + /* XXX: should check float overflow on 64bit time_t platforms */ + + return rb_float_new(f); + } + return time_add(tobj, time2, -1); +} + +/* + * call-seq: + * time.succ => new_time + * + * Return a new time object, one second later than <code>time</code>. + */ + +static VALUE +time_succ(time) + VALUE time; +{ + struct time_object *tobj; + int gmt; + + GetTimeval(time, tobj); + gmt = tobj->gmt; + time = rb_time_new(tobj->tv.tv_sec + 1, tobj->tv.tv_usec); + GetTimeval(time, tobj); + tobj->gmt = gmt; + return time; +} + +/* + * call-seq: + * time.sec => fixnum + * + * Returns the second of the minute (0..60)<em>[Yes, seconds really can + * range from zero to 60. This allows the system to inject leap seconds + * every now and then to correct for the fact that years are not really + * a convenient number of hours long.]</em> for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.sec #=> 4 + */ + +static VALUE +time_sec(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return INT2FIX(tobj->tm.tm_sec); +} + +/* + * call-seq: + * time.min => fixnum + * + * Returns the minute of the hour (0..59) for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.min #=> 56 + */ + +static VALUE +time_min(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return INT2FIX(tobj->tm.tm_min); +} + +/* + * call-seq: + * time.hour => fixnum + * + * Returns the hour of the day (0..23) for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.hour #=> 8 + */ + +static VALUE +time_hour(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return INT2FIX(tobj->tm.tm_hour); +} + +/* + * call-seq: + * time.day => fixnum + * time.mday => fixnum + * + * Returns the day of the month (1..n) for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.day #=> 9 + * t.mday #=> 9 + */ + +static VALUE +time_mday(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return INT2FIX(tobj->tm.tm_mday); +} + +/* + * call-seq: + * time.mon => fixnum + * time.month => fixnum + * + * Returns the month of the year (1..12) for <i>time</i>. + * + * t = Time.now #=> Wed Apr 09 08:56:03 CDT 2003 + * t.mon #=> 4 + * t.month #=> 4 + */ + +static VALUE +time_mon(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return INT2FIX(tobj->tm.tm_mon+1); +} + +/* + * call-seq: + * time.year => fixnum + * + * Returns the year for <i>time</i> (including the century). + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.year #=> 2003 + */ + +static VALUE +time_year(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return LONG2NUM((long)tobj->tm.tm_year+1900); +} + +/* + * call-seq: + * time.wday => fixnum + * + * Returns an integer representing the day of the week, 0..6, with + * Sunday == 0. + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.wday #=> 3 + */ + +static VALUE +time_wday(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return INT2FIX(tobj->tm.tm_wday); +} + +/* + * call-seq: + * time.yday => fixnum + * + * Returns an integer representing the day of the year, 1..366. + * + * t = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t.yday #=> 99 + */ + +static VALUE +time_yday(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return INT2FIX(tobj->tm.tm_yday+1); +} + +/* + * call-seq: + * time.isdst => true or false + * time.dst? => true or false + * + * Returns <code>true</code> if <i>time</i> occurs during Daylight + * Saving Time in its time zone. + * + * Time.local(2000, 7, 1).isdst #=> true + * Time.local(2000, 1, 1).isdst #=> false + * Time.local(2000, 7, 1).dst? #=> true + * Time.local(2000, 1, 1).dst? #=> false + */ + +static VALUE +time_isdst(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return tobj->tm.tm_isdst?Qtrue:Qfalse; +} + +/* + * call-seq: + * time.zone => string + * + * Returns the name of the time zone used for <i>time</i>. As of Ruby + * 1.8, returns ``UTC'' rather than ``GMT'' for UTC times. + * + * t = Time.gm(2000, "jan", 1, 20, 15, 1) + * t.zone #=> "UTC" + * t = Time.local(2000, "jan", 1, 20, 15, 1) + * t.zone #=> "CST" + */ + +static VALUE +time_zone(time) + VALUE time; +{ + struct time_object *tobj; +#if !defined(HAVE_TM_ZONE) && (!defined(HAVE_TZNAME) || !defined(HAVE_DAYLIGHT)) + char buf[64]; + int len; +#endif + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + + if (tobj->gmt == 1) { + return rb_str_new2("UTC"); + } +#if defined(HAVE_TM_ZONE) + return rb_str_new2(tobj->tm.tm_zone); +#elif defined(HAVE_TZNAME) && defined(HAVE_DAYLIGHT) + return rb_str_new2(tzname[daylight && tobj->tm.tm_isdst]); +#else + len = strftime(buf, 64, "%Z", &tobj->tm); + return rb_str_new(buf, len); +#endif +} + +/* + * call-seq: + * time.gmt_offset => fixnum + * time.gmtoff => fixnum + * time.utc_offset => fixnum + * + * Returns the offset in seconds between the timezone of <i>time</i> + * and UTC. + * + * t = Time.gm(2000,1,1,20,15,1) #=> Sat Jan 01 20:15:01 UTC 2000 + * t.gmt_offset #=> 0 + * l = t.getlocal #=> Sat Jan 01 14:15:01 CST 2000 + * l.gmt_offset #=> -21600 + */ + +static VALUE +time_utc_offset(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + + if (tobj->gmt == 1) { + return INT2FIX(0); + } + else { +#if defined(HAVE_STRUCT_TM_TM_GMTOFF) + return INT2NUM(tobj->tm.tm_gmtoff); +#else + struct tm *u, *l; + time_t t; + long off; + l = &tobj->tm; + t = tobj->tv.tv_sec; + u = gmtime(&t); + if (!u) + rb_raise(rb_eArgError, "gmtime error"); + if (l->tm_year != u->tm_year) + off = l->tm_year < u->tm_year ? -1 : 1; + else if (l->tm_mon != u->tm_mon) + off = l->tm_mon < u->tm_mon ? -1 : 1; + else if (l->tm_mday != u->tm_mday) + off = l->tm_mday < u->tm_mday ? -1 : 1; + else + off = 0; + off = off * 24 + l->tm_hour - u->tm_hour; + off = off * 60 + l->tm_min - u->tm_min; + off = off * 60 + l->tm_sec - u->tm_sec; + return LONG2FIX(off); +#endif + } +} + +/* + * call-seq: + * time.to_a => array + * + * Returns a ten-element <i>array</i> of values for <i>time</i>: + * {<code>[ sec, min, hour, day, month, year, wday, yday, isdst, zone + * ]</code>}. See the individual methods for an explanation of the + * valid ranges of each value. The ten elements can be passed directly + * to <code>Time::utc</code> or <code>Time::local</code> to create a + * new <code>Time</code>. + * + * now = Time.now #=> Wed Apr 09 08:56:04 CDT 2003 + * t = now.to_a #=> [4, 56, 8, 9, 4, 2003, 3, 99, true, "CDT"] + */ + +static VALUE +time_to_a(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + return rb_ary_new3(10, + INT2FIX(tobj->tm.tm_sec), + INT2FIX(tobj->tm.tm_min), + INT2FIX(tobj->tm.tm_hour), + INT2FIX(tobj->tm.tm_mday), + INT2FIX(tobj->tm.tm_mon+1), + LONG2NUM((long)tobj->tm.tm_year+1900), + INT2FIX(tobj->tm.tm_wday), + INT2FIX(tobj->tm.tm_yday+1), + tobj->tm.tm_isdst?Qtrue:Qfalse, + time_zone(time)); +} + +#define SMALLBUF 100 +static int +rb_strftime(buf, format, time) + char **buf; + const char *format; + struct tm *time; +{ + int size, len, flen; + + (*buf)[0] = '\0'; + flen = strlen(format); + if (flen == 0) { + return 0; + } + errno = 0; + len = strftime(*buf, SMALLBUF, format, time); + if (len != 0 || (**buf == '\0' && errno != ERANGE)) return len; + for (size=1024; ; size*=2) { + *buf = xmalloc(size); + (*buf)[0] = '\0'; + len = strftime(*buf, size, format, time); + /* + * buflen can be zero EITHER because there's not enough + * room in the string, or because the control command + * goes to the empty string. Make a reasonable guess that + * if the buffer is 1024 times bigger than the length of the + * format string, it's not failing for lack of room. + */ + if (len > 0 || size >= 1024 * flen) return len; + free(*buf); + } + /* not reached */ +} + +/* + * call-seq: + * time.strftime( string ) => string + * + * Formats <i>time</i> according to the directives in the given format + * string. Any text not listed as a directive will be passed through + * to the output string. + * + * Format meaning: + * %a - The abbreviated weekday name (``Sun'') + * %A - The full weekday name (``Sunday'') + * %b - The abbreviated month name (``Jan'') + * %B - The full month name (``January'') + * %c - The preferred local date and time representation + * %d - Day of the month (01..31) + * %H - Hour of the day, 24-hour clock (00..23) + * %I - Hour of the day, 12-hour clock (01..12) + * %j - Day of the year (001..366) + * %m - Month of the year (01..12) + * %M - Minute of the hour (00..59) + * %p - Meridian indicator (``AM'' or ``PM'') + * %S - Second of the minute (00..60) + * %U - Week number of the current year, + * starting with the first Sunday as the first + * day of the first week (00..53) + * %W - Week number of the current year, + * starting with the first Monday as the first + * day of the first week (00..53) + * %w - Day of the week (Sunday is 0, 0..6) + * %x - Preferred representation for the date alone, no time + * %X - Preferred representation for the time alone, no date + * %y - Year without a century (00..99) + * %Y - Year with century + * %Z - Time zone name + * %% - Literal ``%'' character + * + * t = Time.now + * t.strftime("Printed on %m/%d/%Y") #=> "Printed on 04/09/2003" + * t.strftime("at %I:%M%p") #=> "at 08:56AM" + */ + +static VALUE +time_strftime(time, format) + VALUE time, format; +{ + struct time_object *tobj; + char buffer[SMALLBUF], *buf = buffer; + const char *fmt; + long len; + VALUE str; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + StringValue(format); + format = rb_str_new4(format); + fmt = RSTRING(format)->ptr; + len = RSTRING(format)->len; + if (len == 0) { + rb_warning("strftime called with empty format string"); + } + else if (strlen(fmt) < len) { + /* Ruby string may contain \0's. */ + const char *p = fmt, *pe = fmt + len; + + str = rb_str_new(0, 0); + while (p < pe) { + len = rb_strftime(&buf, p, &tobj->tm); + rb_str_cat(str, buf, len); + p += strlen(p); + if (buf != buffer) { + free(buf); + buf = buffer; + } + for (fmt = p; p < pe && !*p; ++p); + if (p > fmt) rb_str_cat(str, fmt, p - fmt); + } + return str; + } + else { + len = rb_strftime(&buf, RSTRING(format)->ptr, &tobj->tm); + } + str = rb_str_new(buf, len); + if (buf != buffer) free(buf); + return str; +} + +/* + * call-seq: + * Time.times => struct_tms + * + * Deprecated in favor of <code>Process::times</code> + */ + +static VALUE +time_s_times(obj) + VALUE obj; +{ + rb_warn("obsolete method Time::times; use Process::times"); + return rb_proc_times(obj); +} + +/* + * undocumented + */ + +static VALUE +time_mdump(time) + VALUE time; +{ + struct time_object *tobj; + struct tm *tm; + unsigned long p, s; + char buf[8]; + time_t t; + int i; + + GetTimeval(time, tobj); + + t = tobj->tv.tv_sec; + tm = gmtime(&t); + + if ((tm->tm_year & 0xffff) != tm->tm_year) + rb_raise(rb_eArgError, "year too big to marshal"); + + p = 0x1UL << 31 | /* 1 */ + tobj->gmt << 30 | /* 1 */ + tm->tm_year << 14 | /* 16 */ + tm->tm_mon << 10 | /* 4 */ + tm->tm_mday << 5 | /* 5 */ + tm->tm_hour; /* 5 */ + s = tm->tm_min << 26 | /* 6 */ + tm->tm_sec << 20 | /* 6 */ + tobj->tv.tv_usec; /* 20 */ + + for (i=0; i<4; i++) { + buf[i] = p & 0xff; + p = RSHIFT(p, 8); + } + for (i=4; i<8; i++) { + buf[i] = s & 0xff; + s = RSHIFT(s, 8); + } + + return rb_str_new(buf, 8); +} + +/* + * call-seq: + * time._dump => string + * + * Dump _time_ for marshaling. + */ + +static VALUE +time_dump(argc, argv, time) + int argc; + VALUE *argv; + VALUE time; +{ + VALUE str; + + rb_scan_args(argc, argv, "01", 0); + str = time_mdump(time); + if (FL_TEST(time, FL_EXIVAR)) { + rb_copy_generic_ivar(str, time); + FL_SET(str, FL_EXIVAR); + } + + return str; +} + +/* + * undocumented + */ + +static VALUE +time_mload(time, str) + VALUE time, str; +{ + struct time_object *tobj; + unsigned long p, s; + time_t sec, usec; + unsigned char *buf; + struct tm tm; + int i, gmt; + + time_modify(time); + StringValue(str); + buf = (unsigned char *)RSTRING(str)->ptr; + if (RSTRING(str)->len != 8) { + rb_raise(rb_eTypeError, "marshaled time format differ"); + } + + p = s = 0; + for (i=0; i<4; i++) { + p |= buf[i]<<(8*i); + } + for (i=4; i<8; i++) { + s |= buf[i]<<(8*(i-4)); + } + + if ((p & (1UL<<31)) == 0) { + sec = p; + usec = s; + } + else { + p &= ~(1UL<<31); + gmt = (p >> 30) & 0x1; + tm.tm_year = (p >> 14) & 0xffff; + tm.tm_mon = (p >> 10) & 0xf; + tm.tm_mday = (p >> 5) & 0x1f; + tm.tm_hour = p & 0x1f; + tm.tm_min = (s >> 26) & 0x3f; + tm.tm_sec = (s >> 20) & 0x3f; + tm.tm_isdst = 0; + + sec = make_time_t(&tm, Qtrue); + usec = (time_t)(s & 0xfffff); + } + time_overflow_p(&sec, &usec); + + GetTimeval(time, tobj); + tobj->tm_got = 0; + tobj->gmt = gmt; + tobj->tv.tv_sec = sec; + tobj->tv.tv_usec = usec; + return time; +} + +/* + * call-seq: + * Time._load(string) => time + * + * Unmarshal a dumped +Time+ object. + */ + +static VALUE +time_load(klass, str) + VALUE klass, str; +{ + VALUE time = time_s_alloc(klass); + + if (FL_TEST(str, FL_EXIVAR)) { + rb_copy_generic_ivar(time, str); + FL_SET(time, FL_EXIVAR); + } + time_mload(time, str); + return time; +} + +/* + * <code>Time</code> is an abstraction of dates and times. Time is + * stored internally as the number of seconds and microseconds since + * the <em>epoch</em>, January 1, 1970 00:00 UTC. On some operating + * systems, this offset is allowed to be negative. Also see the + * library modules <code>Date</code> and <code>ParseDate</code>. The + * <code>Time</code> class treats GMT (Greenwich Mean Time) and UTC + * (Coordinated Universal Time)<em>[Yes, UTC really does stand for + * Coordinated Universal Time. There was a committee involved.]</em> + * as equivalent. GMT is the older way of referring to these + * baseline times but persists in the names of calls on Posix + * systems. + * + * All times are stored with some number of microseconds. Be aware of + * this fact when comparing times with each other---times that are + * apparently equal when displayed may be different when compared. + */ + +void +Init_Time() +{ + rb_cTime = rb_define_class("Time", rb_cObject); + rb_include_module(rb_cTime, rb_mComparable); + + rb_define_alloc_func(rb_cTime, time_s_alloc); + rb_define_singleton_method(rb_cTime, "now", rb_class_new_instance, -1); + rb_define_singleton_method(rb_cTime, "at", time_s_at, -1); + rb_define_singleton_method(rb_cTime, "utc", time_s_mkutc, -1); + rb_define_singleton_method(rb_cTime, "gm", time_s_mkutc, -1); + rb_define_singleton_method(rb_cTime, "local", time_s_mktime, -1); + rb_define_singleton_method(rb_cTime, "mktime", time_s_mktime, -1); + + rb_define_singleton_method(rb_cTime, "times", time_s_times, 0); + + rb_define_method(rb_cTime, "to_i", time_to_i, 0); + rb_define_method(rb_cTime, "to_f", time_to_f, 0); + rb_define_method(rb_cTime, "<=>", time_cmp, 1); + rb_define_method(rb_cTime, "eql?", time_eql, 1); + rb_define_method(rb_cTime, "hash", time_hash, 0); + rb_define_method(rb_cTime, "initialize", time_init, 0); + rb_define_method(rb_cTime, "initialize_copy", time_init_copy, 1); + + rb_define_method(rb_cTime, "localtime", time_localtime, 0); + rb_define_method(rb_cTime, "gmtime", time_gmtime, 0); + rb_define_method(rb_cTime, "utc", time_gmtime, 0); + rb_define_method(rb_cTime, "getlocal", time_getlocaltime, 0); + rb_define_method(rb_cTime, "getgm", time_getgmtime, 0); + rb_define_method(rb_cTime, "getutc", time_getgmtime, 0); + + rb_define_method(rb_cTime, "ctime", time_asctime, 0); + rb_define_method(rb_cTime, "asctime", time_asctime, 0); + rb_define_method(rb_cTime, "to_s", time_to_s, 0); + rb_define_method(rb_cTime, "inspect", time_to_s, 0); + rb_define_method(rb_cTime, "to_a", time_to_a, 0); + + rb_define_method(rb_cTime, "+", time_plus, 1); + rb_define_method(rb_cTime, "-", time_minus, 1); + + rb_define_method(rb_cTime, "succ", time_succ, 0); + rb_define_method(rb_cTime, "sec", time_sec, 0); + rb_define_method(rb_cTime, "min", time_min, 0); + rb_define_method(rb_cTime, "hour", time_hour, 0); + rb_define_method(rb_cTime, "mday", time_mday, 0); + rb_define_method(rb_cTime, "day", time_mday, 0); + rb_define_method(rb_cTime, "mon", time_mon, 0); + rb_define_method(rb_cTime, "month", time_mon, 0); + rb_define_method(rb_cTime, "year", time_year, 0); + rb_define_method(rb_cTime, "wday", time_wday, 0); + rb_define_method(rb_cTime, "yday", time_yday, 0); + rb_define_method(rb_cTime, "isdst", time_isdst, 0); + rb_define_method(rb_cTime, "dst?", time_isdst, 0); + rb_define_method(rb_cTime, "zone", time_zone, 0); + rb_define_method(rb_cTime, "gmtoff", time_utc_offset, 0); + rb_define_method(rb_cTime, "gmt_offset", time_utc_offset, 0); + rb_define_method(rb_cTime, "utc_offset", time_utc_offset, 0); + + rb_define_method(rb_cTime, "utc?", time_utc_p, 0); + rb_define_method(rb_cTime, "gmt?", time_utc_p, 0); + + rb_define_method(rb_cTime, "tv_sec", time_to_i, 0); + rb_define_method(rb_cTime, "tv_usec", time_usec, 0); + rb_define_method(rb_cTime, "usec", time_usec, 0); + + rb_define_method(rb_cTime, "strftime", time_strftime, 1); + + /* methods for marshaling */ + rb_define_method(rb_cTime, "_dump", time_dump, -1); + rb_define_singleton_method(rb_cTime, "_load", time_load, 1); +#if 0 + /* Time will support marshal_dump and marshal_load in the future (1.9 maybe) */ + rb_define_method(rb_cTime, "marshal_dump", time_mdump, 0); + rb_define_method(rb_cTime, "marshal_load", time_mload, 1); +#endif +} +/********************************************************************** + + util.c - + + $Author: wyhaines $ + $Date: 2009-08-19 15:53:23 +0200 (Wed, 19 Aug 2009) $ + created at: Fri Mar 10 17:22:34 JST 1995 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" + +#include <ctype.h> +#include <stdio.h> +#include <errno.h> +#include <math.h> +#include <float.h> + +#ifdef _WIN32 +#include "missing/file.h" +#endif + +#include "util.h" +#ifndef HAVE_STRING_H +char *strchr _((char*,char)); +#endif + +unsigned long +scan_oct(start, len, retlen) + const char *start; + int len; + int *retlen; +{ + register const char *s = start; + register unsigned long retval = 0; + + while (len-- && *s >= '0' && *s <= '7') { + retval <<= 3; + retval |= *s++ - '0'; + } + *retlen = s - start; + return retval; +} + +unsigned long +scan_hex(start, len, retlen) + const char *start; + int len; + int *retlen; +{ + static char hexdigit[] = "0123456789abcdef0123456789ABCDEF"; + register const char *s = start; + register unsigned long retval = 0; + char *tmp; + + while (len-- && *s && (tmp = strchr(hexdigit, *s))) { + retval <<= 4; + retval |= (tmp - hexdigit) & 15; + s++; + } + *retlen = s - start; + return retval; +} + +#include <sys/types.h> +#include <sys/stat.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#if defined(HAVE_FCNTL_H) +#include <fcntl.h> +#endif + +#ifndef S_ISDIR +# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) +#endif + +#if defined(MSDOS) || defined(__CYGWIN32__) || defined(_WIN32) +/* + * Copyright (c) 1993, Intergraph Corporation + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the perl README file. + * + * Various Unix compatibility functions and NT specific functions. + * + * Some of this code was derived from the MSDOS port(s) and the OS/2 port. + * + */ + + +/* + * Suffix appending for in-place editing under MS-DOS and OS/2 (and now NT!). + * + * Here are the rules: + * + * Style 0: Append the suffix exactly as standard perl would do it. + * If the filesystem groks it, use it. (HPFS will always + * grok it. So will NTFS. FAT will rarely accept it.) + * + * Style 1: The suffix begins with a '.'. The extension is replaced. + * If the name matches the original name, use the fallback method. + * + * Style 2: The suffix is a single character, not a '.'. Try to add the + * suffix to the following places, using the first one that works. + * [1] Append to extension. + * [2] Append to filename, + * [3] Replace end of extension, + * [4] Replace end of filename. + * If the name matches the original name, use the fallback method. + * + * Style 3: Any other case: Ignore the suffix completely and use the + * fallback method. + * + * Fallback method: Change the extension to ".$$$". If that matches the + * original name, then change the extension to ".~~~". + * + * If filename is more than 1000 characters long, we die a horrible + * death. Sorry. + * + * The filename restriction is a cheat so that we can use buf[] to store + * assorted temporary goo. + * + * Examples, assuming style 0 failed. + * + * suffix = ".bak" (style 1) + * foo.bar => foo.bak + * foo.bak => foo.$$$ (fallback) + * foo.$$$ => foo.~~~ (fallback) + * makefile => makefile.bak + * + * suffix = "~" (style 2) + * foo.c => foo.c~ + * foo.c~ => foo.c~~ + * foo.c~~ => foo~.c~~ + * foo~.c~~ => foo~~.c~~ + * foo~~~~~.c~~ => foo~~~~~.$$$ (fallback) + * + * foo.pas => foo~.pas + * makefile => makefile.~ + * longname.fil => longname.fi~ + * longname.fi~ => longnam~.fi~ + * longnam~.fi~ => longnam~.$$$ + * + */ + + +static int valid_filename(char *s); + +static char suffix1[] = ".$$$"; +static char suffix2[] = ".~~~"; + +#define ext (&buf[1000]) + +#define strEQ(s1,s2) (strcmp(s1,s2) == 0) + +void +ruby_add_suffix(str, suffix) + VALUE str; + char *suffix; +{ + int baselen; + int extlen = strlen(suffix); + char *s, *t, *p; + long slen; + char buf[1024]; + + if (RSTRING(str)->len > 1000) + rb_fatal("Cannot do inplace edit on long filename (%ld characters)", + RSTRING(str)->len); + +#if defined(DJGPP) || defined(__CYGWIN32__) || defined(_WIN32) + /* Style 0 */ + slen = RSTRING(str)->len; + rb_str_cat(str, suffix, extlen); +#if defined(DJGPP) + if (_USE_LFN) return; +#else + if (valid_filename(RSTRING(str)->ptr)) return; +#endif + + /* Fooey, style 0 failed. Fix str before continuing. */ + RSTRING(str)->ptr[RSTRING(str)->len = slen] = '\0'; +#endif + + slen = extlen; + t = buf; baselen = 0; s = RSTRING(str)->ptr; + while ((*t = *s) && *s != '.') { + baselen++; + if (*s == '\\' || *s == '/') baselen = 0; + s++; t++; + } + p = t; + + t = ext; extlen = 0; + while (*t++ = *s++) extlen++; + if (extlen == 0) { ext[0] = '.'; ext[1] = 0; extlen++; } + + if (*suffix == '.') { /* Style 1 */ + if (strEQ(ext, suffix)) goto fallback; + strcpy(p, suffix); + } + else if (suffix[1] == '\0') { /* Style 2 */ + if (extlen < 4) { + ext[extlen] = *suffix; + ext[++extlen] = '\0'; + } + else if (baselen < 8) { + *p++ = *suffix; + } + else if (ext[3] != *suffix) { + ext[3] = *suffix; + } + else if (buf[7] != *suffix) { + buf[7] = *suffix; + } + else goto fallback; + strcpy(p, ext); + } + else { /* Style 3: Panic */ +fallback: + (void)memcpy(p, strEQ(ext, suffix1) ? suffix2 : suffix1, 5); + } + rb_str_resize(str, strlen(buf)); + memcpy(RSTRING(str)->ptr, buf, RSTRING(str)->len); +} + +#if defined(__CYGWIN32__) || defined(_WIN32) +static int +valid_filename(char *s) +{ + int fd; + + /* + // if the file exists, then it's a valid filename! + */ + + if (_access(s, 0) == 0) { + return 1; + } + + /* + // It doesn't exist, so see if we can open it. + */ + + if ((fd = _open(s, O_CREAT, 0666)) >= 0) { + _close(fd); + _unlink(s); /* don't leave it laying around */ + return 1; + } + return 0; +} +#endif +#endif + +#if defined __DJGPP__ + +#include <dpmi.h> + +static char dbcs_table[256]; + +int +make_dbcs_table() +{ + __dpmi_regs r; + struct { + unsigned char start; + unsigned char end; + } vec; + int offset; + + memset(&r, 0, sizeof(r)); + r.x.ax = 0x6300; + __dpmi_int(0x21, &r); + offset = r.x.ds * 16 + r.x.si; + + for (;;) { + int i; + dosmemget(offset, sizeof vec, &vec); + if (!vec.start && !vec.end) + break; + for (i = vec.start; i <= vec.end; i++) + dbcs_table[i] = 1; + offset += 2; + } +} + +int +mblen(const char *s, size_t n) +{ + static int need_init = 1; + if (need_init) { + make_dbcs_table(); + need_init = 0; + } + if (s) { + if (n == 0 || *s == 0) + return 0; + else if (!s[1]) + return 1; + return dbcs_table[(unsigned char)*s] + 1; + } + else + return 1; +} + +struct PathList { + struct PathList *next; + char *path; +}; + +struct PathInfo { + struct PathList *head; + int count; +}; + +static int +push_element(const char *path, VALUE vinfo) +{ + struct PathList *p; + struct PathInfo *info = (struct PathInfo *)vinfo; + + p = ALLOC(struct PathList); + MEMZERO(p, struct PathList, 1); + p->path = ruby_strdup(path); + p->next = info->head; + info->head = p; + info->count++; + + return 0; +} + +#include <dirent.h> +int __opendir_flags = __OPENDIR_PRESERVE_CASE; + +char ** +__crt0_glob_function(char *path) +{ + int len = strlen(path); + int i; + char **rv; + char path_buffer[PATH_MAX]; + char *buf = path_buffer; + char *p; + struct PathInfo info; + struct PathList *plist; + + if (PATH_MAX <= len) + buf = ruby_xmalloc(len + 1); + + strncpy(buf, path, len); + buf[len] = '\0'; + + for (p = buf; *p; p += mblen(p, MB_CUR_MAX)) + if (*p == '\\') + *p = '/'; + + info.count = 0; + info.head = 0; + + ruby_glob(buf, 0, push_element, (VALUE)&info); + + if (buf != path_buffer) + ruby_xfree(buf); + + if (info.count == 0) + return 0; + + rv = ruby_xmalloc((info.count + 1) * sizeof (char *)); + + plist = info.head; + i = 0; + while (plist) { + struct PathList *cur; + rv[i] = plist->path; + cur = plist; + plist = plist->next; + ruby_xfree(cur); + i++; + } + rv[i] = 0; + return rv; +} + +#endif + +/* mm.c */ + +#define A ((int*)a) +#define B ((int*)b) +#define C ((int*)c) +#define D ((int*)d) + +#define mmprepare(base, size) do {\ + if (((long)base & (0x3)) == 0)\ + if (size >= 16) mmkind = 1;\ + else mmkind = 0;\ + else mmkind = -1;\ + high = (size & (~0xf));\ + low = (size & 0x0c);\ +} while (0)\ + +#define mmarg mmkind, size, high, low + +static void mmswap_(a, b, mmarg) + register char *a, *b; + int mmarg; +{ + register int s; + if (a == b) return; + if (mmkind >= 0) { + if (mmkind > 0) { + register char *t = a + high; + do { + s = A[0]; A[0] = B[0]; B[0] = s; + s = A[1]; A[1] = B[1]; B[1] = s; + s = A[2]; A[2] = B[2]; B[2] = s; + s = A[3]; A[3] = B[3]; B[3] = s; a += 16; b += 16; + } while (a < t); + } + if (low != 0) { s = A[0]; A[0] = B[0]; B[0] = s; + if (low >= 8) { s = A[1]; A[1] = B[1]; B[1] = s; + if (low == 12) {s = A[2]; A[2] = B[2]; B[2] = s;}}} + } + else { + register char *t = a + size; + do {s = *a; *a++ = *b; *b++ = s;} while (a < t); + } +} +#define mmswap(a,b) mmswap_((a),(b),mmarg) + +static void mmrot3_(a, b, c, mmarg) + register char *a, *b, *c; + int mmarg; +{ + register int s; + if (mmkind >= 0) { + if (mmkind > 0) { + register char *t = a + high; + do { + s = A[0]; A[0] = B[0]; B[0] = C[0]; C[0] = s; + s = A[1]; A[1] = B[1]; B[1] = C[1]; C[1] = s; + s = A[2]; A[2] = B[2]; B[2] = C[2]; C[2] = s; + s = A[3]; A[3] = B[3]; B[3] = C[3]; C[3] = s; a += 16; b += 16; c += 16; + } while (a < t); + } + if (low != 0) { s = A[0]; A[0] = B[0]; B[0] = C[0]; C[0] = s; + if (low >= 8) { s = A[1]; A[1] = B[1]; B[1] = C[1]; C[1] = s; + if (low == 12) {s = A[2]; A[2] = B[2]; B[2] = C[2]; C[2] = s;}}} + } + else { + register char *t = a + size; + do {s = *a; *a++ = *b; *b++ = *c; *c++ = s;} while (a < t); + } +} +#define mmrot3(a,b,c) mmrot3_((a),(b),(c),mmarg) + +/* qs6.c */ +/*****************************************************/ +/* */ +/* qs6 (Quick sort function) */ +/* */ +/* by Tomoyuki Kawamura 1995.4.21 */ +/* kawamura@tokuyama.ac.jp */ +/*****************************************************/ + +typedef struct { char *LL, *RR; } stack_node; /* Stack structure for L,l,R,r */ +#define PUSH(ll,rr) do { top->LL = (ll); top->RR = (rr); ++top; } while (0) /* Push L,l,R,r */ +#define POP(ll,rr) do { --top; ll = top->LL; rr = top->RR; } while (0) /* Pop L,l,R,r */ + +#define med3(a,b,c) ((*cmp)(a,b,d)<0 ? \ + ((*cmp)(b,c,d)<0 ? b : ((*cmp)(a,c,d)<0 ? c : a)) : \ + ((*cmp)(b,c,d)>0 ? b : ((*cmp)(a,c,d)<0 ? a : c))) + +void ruby_qsort (base, nel, size, cmp, d) + void* base; + const int nel; + const int size; + int (*cmp)(); + void *d; +{ + register char *l, *r, *m; /* l,r:left,right group m:median point */ + register int t, eq_l, eq_r; /* eq_l: all items in left group are equal to S */ + char *L = base; /* left end of curren region */ + char *R = (char*)base + size*(nel-1); /* right end of current region */ + int chklim = 63; /* threshold of ordering element check */ + stack_node stack[32], *top = stack; /* 32 is enough for 32bit CPU */ + int mmkind, high, low; + + if (nel <= 1) return; /* need not to sort */ + mmprepare(base, size); + goto start; + + nxt: + if (stack == top) return; /* return if stack is empty */ + POP(L,R); + + for (;;) { + start: + if (L + size == R) { /* 2 elements */ + if ((*cmp)(L,R,d) > 0) mmswap(L,R); goto nxt; + } + + l = L; r = R; + t = (r - l + size) / size; /* number of elements */ + m = l + size * (t >> 1); /* calculate median value */ + + if (t >= 60) { + register char *m1; + register char *m3; + if (t >= 200) { + t = size*(t>>3); /* number of bytes in splitting 8 */ + { + register char *p1 = l + t; + register char *p2 = p1 + t; + register char *p3 = p2 + t; + m1 = med3(p1, p2, p3); + p1 = m + t; + p2 = p1 + t; + p3 = p2 + t; + m3 = med3(p1, p2, p3); + } + } + else { + t = size*(t>>2); /* number of bytes in splitting 4 */ + m1 = l + t; + m3 = m + t; + } + m = med3(m1, m, m3); + } + + if ((t = (*cmp)(l,m,d)) < 0) { /*3-5-?*/ + if ((t = (*cmp)(m,r,d)) < 0) { /*3-5-7*/ + if (chklim && nel >= chklim) { /* check if already ascending order */ + char *p; + chklim = 0; + for (p=l; p<r; p+=size) if ((*cmp)(p,p+size,d) > 0) goto fail; + goto nxt; + } + fail: goto loopA; /*3-5-7*/ + } + if (t > 0) { + if ((*cmp)(l,r,d) <= 0) {mmswap(m,r); goto loopA;} /*3-5-4*/ + mmrot3(r,m,l); goto loopA; /*3-5-2*/ + } + goto loopB; /*3-5-5*/ + } + + if (t > 0) { /*7-5-?*/ + if ((t = (*cmp)(m,r,d)) > 0) { /*7-5-3*/ + if (chklim && nel >= chklim) { /* check if already ascending order */ + char *p; + chklim = 0; + for (p=l; p<r; p+=size) if ((*cmp)(p,p+size,d) < 0) goto fail2; + while (l<r) {mmswap(l,r); l+=size; r-=size;} /* reverse region */ + goto nxt; + } + fail2: mmswap(l,r); goto loopA; /*7-5-3*/ + } + if (t < 0) { + if ((*cmp)(l,r,d) <= 0) {mmswap(l,m); goto loopB;} /*7-5-8*/ + mmrot3(l,m,r); goto loopA; /*7-5-6*/ + } + mmswap(l,r); goto loopA; /*7-5-5*/ + } + + if ((t = (*cmp)(m,r,d)) < 0) {goto loopA;} /*5-5-7*/ + if (t > 0) {mmswap(l,r); goto loopB;} /*5-5-3*/ + + /* determining splitting type in case 5-5-5 */ /*5-5-5*/ + for (;;) { + if ((l += size) == r) goto nxt; /*5-5-5*/ + if (l == m) continue; + if ((t = (*cmp)(l,m,d)) > 0) {mmswap(l,r); l = L; goto loopA;}/*575-5*/ + if (t < 0) {mmswap(L,l); l = L; goto loopB;} /*535-5*/ + } + + loopA: eq_l = 1; eq_r = 1; /* splitting type A */ /* left <= median < right */ + for (;;) { + for (;;) { + if ((l += size) == r) + {l -= size; if (l != m) mmswap(m,l); l -= size; goto fin;} + if (l == m) continue; + if ((t = (*cmp)(l,m,d)) > 0) {eq_r = 0; break;} + if (t < 0) eq_l = 0; + } + for (;;) { + if (l == (r -= size)) + {l -= size; if (l != m) mmswap(m,l); l -= size; goto fin;} + if (r == m) {m = l; break;} + if ((t = (*cmp)(r,m,d)) < 0) {eq_l = 0; break;} + if (t == 0) break; + } + mmswap(l,r); /* swap left and right */ + } + + loopB: eq_l = 1; eq_r = 1; /* splitting type B */ /* left < median <= right */ + for (;;) { + for (;;) { + if (l == (r -= size)) + {r += size; if (r != m) mmswap(r,m); r += size; goto fin;} + if (r == m) continue; + if ((t = (*cmp)(r,m,d)) < 0) {eq_l = 0; break;} + if (t > 0) eq_r = 0; + } + for (;;) { + if ((l += size) == r) + {r += size; if (r != m) mmswap(r,m); r += size; goto fin;} + if (l == m) {m = r; break;} + if ((t = (*cmp)(l,m,d)) > 0) {eq_r = 0; break;} + if (t == 0) break; + } + mmswap(l,r); /* swap left and right */ + } + + fin: + if (eq_l == 0) /* need to sort left side */ + if (eq_r == 0) /* need to sort right side */ + if (l-L < R-r) {PUSH(r,R); R = l;} /* sort left side first */ + else {PUSH(L,l); L = r;} /* sort right side first */ + else R = l; /* need to sort left side only */ + else if (eq_r == 0) L = r; /* need to sort right side only */ + else goto nxt; /* need not to sort both sides */ + } +} + +char * +ruby_strdup(str) + const char *str; +{ + char *tmp; + int len = strlen(str) + 1; + + tmp = xmalloc(len); + memcpy(tmp, str, len); + + return tmp; +} + +char * +ruby_getcwd() +{ +#ifdef HAVE_GETCWD + int size = 200; + char *buf = xmalloc(size); + + while (!getcwd(buf, size)) { + if (errno != ERANGE) { + free(buf); + rb_sys_fail("getcwd"); + } + size *= 2; + buf = xrealloc(buf, size); + } +#else +# ifndef PATH_MAX +# define PATH_MAX 8192 +# endif + char *buf = xmalloc(PATH_MAX+1); + + if (!getwd(buf)) { + free(buf); + rb_sys_fail("getwd"); + } +#endif + return buf; +} + + +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +/* On a machine with IEEE extended-precision registers, it is + * necessary to specify double-precision (53-bit) rounding precision + * before invoking strtod or dtoa. If the machine uses (the equivalent + * of) Intel 80x87 arithmetic, the call + * _control87(PC_53, MCW_PC); + * does this with many compilers. Whether this or another call is + * appropriate depends on the compiler; for this to work, it may be + * necessary to #include "float.h" or another system-dependent header + * file. + */ + +/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. + * + * This strtod returns a nearest machine number to the input decimal + * string (or sets errno to ERANGE). With IEEE arithmetic, ties are + * broken by the IEEE round-even rule. Otherwise ties are broken by + * biased rounding (add half and chop). + * + * Inspired loosely by William D. Clinger's paper "How to Read Floating + * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. + * + * Modifications: + * + * 1. We only require IEEE, IBM, or VAX double-precision + * arithmetic (not IEEE double-extended). + * 2. We get by with floating-point arithmetic in a case that + * Clinger missed -- when we're computing d * 10^n + * for a small integer d and the integer n is not too + * much larger than 22 (the maximum integer k for which + * we can represent 10^k exactly), we may be able to + * compute (d*10^k) * 10^(e-k) with just one roundoff. + * 3. Rather than a bit-at-a-time adjustment of the binary + * result in the hard case, we use floating-point + * arithmetic to determine the adjustment to within + * one bit; only in really hard cases do we need to + * compute a second residual. + * 4. Because of 3., we don't need a large table of powers of 10 + * for ten-to-e (just some small tables, e.g. of 10^k + * for 0 <= k <= 22). + */ + +/* + * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least + * significant byte has the lowest address. + * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most + * significant byte has the lowest address. + * #define Long int on machines with 32-bit ints and 64-bit longs. + * #define IBM for IBM mainframe-style floating-point arithmetic. + * #define VAX for VAX-style floating-point arithmetic (D_floating). + * #define No_leftright to omit left-right logic in fast floating-point + * computation of dtoa. + * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 + * and strtod and dtoa should round accordingly. + * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 + * and Honor_FLT_ROUNDS is not #defined. + * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines + * that use extended-precision instructions to compute rounded + * products and quotients) with IBM. + * #define ROUND_BIASED for IEEE-format with biased rounding. + * #define Inaccurate_Divide for IEEE-format with correctly rounded + * products but inaccurate quotients, e.g., for Intel i860. + * #define NO_LONG_LONG on machines that do not have a "long long" + * integer type (of >= 64 bits). On such machines, you can + * #define Just_16 to store 16 bits per 32-bit Long when doing + * high-precision integer arithmetic. Whether this speeds things + * up or slows things down depends on the machine and the number + * being converted. If long long is available and the name is + * something other than "long long", #define Llong to be the name, + * and if "unsigned Llong" does not work as an unsigned version of + * Llong, #define #ULLong to be the corresponding unsigned type. + * #define KR_headers for old-style C function headers. + * #define Bad_float_h if your system lacks a float.h or if it does not + * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, + * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. + * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) + * if memory is available and otherwise does something you deem + * appropriate. If MALLOC is undefined, malloc will be invoked + * directly -- and assumed always to succeed. + * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making + * memory allocations from a private pool of memory when possible. + * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, + * unless #defined to be a different length. This default length + * suffices to get rid of MALLOC calls except for unusual cases, + * such as decimal-to-binary conversion of a very long string of + * digits. The longest string dtoa can return is about 751 bytes + * long. For conversions by strtod of strings of 800 digits and + * all dtoa conversions in single-threaded executions with 8-byte + * pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte + * pointers, PRIVATE_MEM >= 7112 appears adequate. + * #define INFNAN_CHECK on IEEE systems to cause strtod to check for + * Infinity and NaN (case insensitively). On some systems (e.g., + * some HP systems), it may be necessary to #define NAN_WORD0 + * appropriately -- to the most significant word of a quiet NaN. + * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) + * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, + * strtod also accepts (case insensitively) strings of the form + * NaN(x), where x is a string of hexadecimal digits and spaces; + * if there is only one string of hexadecimal digits, it is taken + * for the 52 fraction bits of the resulting NaN; if there are two + * or more strings of hex digits, the first is for the high 20 bits, + * the second and subsequent for the low 32 bits, with intervening + * white space ignored; but if this results in none of the 52 + * fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0 + * and NAN_WORD1 are used instead. + * #define MULTIPLE_THREADS if the system offers preemptively scheduled + * multiple threads. In this case, you must provide (or suitably + * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed + * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed + * in pow5mult, ensures lazy evaluation of only one copy of high + * powers of 5; omitting this lock would introduce a small + * probability of wasting memory, but would otherwise be harmless.) + * You must also invoke freedtoa(s) to free the value s returned by + * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. + * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that + * avoids underflows on inputs whose result does not underflow. + * If you #define NO_IEEE_Scale on a machine that uses IEEE-format + * floating-point numbers and flushes underflows to zero rather + * than implementing gradual underflow, then you must also #define + * Sudden_Underflow. + * #define YES_ALIAS to permit aliasing certain double values with + * arrays of ULongs. This leads to slightly better code with + * some compilers and was always used prior to 19990916, but it + * is not strictly legal and can cause trouble with aggressively + * optimizing compilers (e.g., gcc 2.95.1 under -O2). + * #define USE_LOCALE to use the current locale's decimal_point value. + * #define SET_INEXACT if IEEE arithmetic is being used and extra + * computation should be done to set the inexact flag when the + * result is inexact and avoid setting inexact when the result + * is exact. In this case, dtoa.c must be compiled in + * an environment, perhaps provided by #include "dtoa.c" in a + * suitable wrapper, that defines two functions, + * int get_inexact(void); + * void clear_inexact(void); + * such that get_inexact() returns a nonzero value if the + * inexact bit is already set, and clear_inexact() sets the + * inexact bit to 0. When SET_INEXACT is #defined, strtod + * also does extra computations to set the underflow and overflow + * flags when appropriate (i.e., when the result is tiny and + * inexact or when it is a numeric value rounded to +-infinity). + * #define NO_ERRNO if strtod should not assign errno = ERANGE when + * the result overflows to +-Infinity or underflows to 0. + */ + +#ifdef WORDS_BIGENDIAN +#define IEEE_BIG_ENDIAN +#else +#define IEEE_LITTLE_ENDIAN +#endif + +#ifdef __vax__ +#define VAX +#undef IEEE_BIG_ENDIAN +#undef IEEE_LITTLE_ENDIAN +#endif + +#if defined(__arm__) && !defined(__VFP_FP__) +#define IEEE_BIG_ENDIAN +#undef IEEE_LITTLE_ENDIAN +#endif + +#undef Long +#undef ULong + +#if SIZEOF_INT == 4 +#define Long int +#define ULong unsigned int +#elif SIZEOF_LONG == 4 +#define Long long int +#define ULong unsigned long int +#endif + +#if HAVE_LONG_LONG +#define Llong LONG_LONG +#endif + +#ifdef DEBUG +#include "stdio.h" +#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} +#endif + +#include "stdlib.h" +#include "string.h" + +#ifdef USE_LOCALE +#include "locale.h" +#endif + +#ifdef MALLOC +extern void *MALLOC(size_t); +#else +#define MALLOC malloc +#endif + +#ifndef Omit_Private_Memory +#ifndef PRIVATE_MEM +#define PRIVATE_MEM 2304 +#endif +#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) +static double private_mem[PRIVATE_mem], *pmem_next = private_mem; +#endif + +#undef IEEE_Arith +#undef Avoid_Underflow +#ifdef IEEE_BIG_ENDIAN +#define IEEE_Arith +#endif +#ifdef IEEE_LITTLE_ENDIAN +#define IEEE_Arith +#endif + +#include "errno.h" + +#ifdef Bad_float_h + +#ifdef IEEE_Arith +#define DBL_DIG 15 +#define DBL_MAX_10_EXP 308 +#define DBL_MAX_EXP 1024 +#define FLT_RADIX 2 +#endif /*IEEE_Arith*/ + +#ifdef IBM +#define DBL_DIG 16 +#define DBL_MAX_10_EXP 75 +#define DBL_MAX_EXP 63 +#define FLT_RADIX 16 +#define DBL_MAX 7.2370055773322621e+75 +#endif + +#ifdef VAX +#define DBL_DIG 16 +#define DBL_MAX_10_EXP 38 +#define DBL_MAX_EXP 127 +#define FLT_RADIX 2 +#define DBL_MAX 1.7014118346046923e+38 +#endif + +#ifndef LONG_MAX +#define LONG_MAX 2147483647 +#endif + +#else /* ifndef Bad_float_h */ +#include "float.h" +#endif /* Bad_float_h */ + +#ifndef __MATH_H__ +#include "math.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + defined(IBM) != 1 +Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be defined. +#endif + +typedef union { double d; ULong L[2]; } U; + +#ifdef YES_ALIAS +#define dval(x) x +#ifdef IEEE_LITTLE_ENDIAN +#define word0(x) ((ULong *)&x)[1] +#define word1(x) ((ULong *)&x)[0] +#else +#define word0(x) ((ULong *)&x)[0] +#define word1(x) ((ULong *)&x)[1] +#endif +#else +#ifdef IEEE_LITTLE_ENDIAN +#define word0(x) ((U*)&x)->L[1] +#define word1(x) ((U*)&x)->L[0] +#else +#define word0(x) ((U*)&x)->L[0] +#define word1(x) ((U*)&x)->L[1] +#endif +#define dval(x) ((U*)&x)->d +#endif + +/* The following definition of Storeinc is appropriate for MIPS processors. + * An alternative that might be better on some machines is + * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) + */ +#if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) + defined(__arm__) +#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ +((unsigned short *)a)[0] = (unsigned short)c, a++) +#else +#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ +((unsigned short *)a)[1] = (unsigned short)c, a++) +#endif + +/* #define P DBL_MANT_DIG */ +/* Ten_pmax = floor(P*log(2)/log(5)) */ +/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ +/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ +/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ + +#ifdef IEEE_Arith +#define Exp_shift 20 +#define Exp_shift1 20 +#define Exp_msk1 0x100000 +#define Exp_msk11 0x100000 +#define Exp_mask 0x7ff00000 +#define P 53 +#define Bias 1023 +#define Emin (-1022) +#define Exp_1 0x3ff00000 +#define Exp_11 0x3ff00000 +#define Ebits 11 +#define Frac_mask 0xfffff +#define Frac_mask1 0xfffff +#define Ten_pmax 22 +#define Bletch 0x10 +#define Bndry_mask 0xfffff +#define Bndry_mask1 0xfffff +#define LSB 1 +#define Sign_bit 0x80000000 +#define Log2P 1 +#define Tiny0 0 +#define Tiny1 1 +#define Quick_max 14 +#define Int_max 14 +#ifndef NO_IEEE_Scale +#define Avoid_Underflow +#ifdef Flush_Denorm /* debugging option */ +#undef Sudden_Underflow +#endif +#endif + +#ifndef Flt_Rounds +#ifdef FLT_ROUNDS +#define Flt_Rounds FLT_ROUNDS +#else +#define Flt_Rounds 1 +#endif +#endif /*Flt_Rounds*/ + +#ifdef Honor_FLT_ROUNDS +#define Rounding rounding +#undef Check_FLT_ROUNDS +#define Check_FLT_ROUNDS +#else +#define Rounding Flt_Rounds +#endif + +#else /* ifndef IEEE_Arith */ +#undef Check_FLT_ROUNDS +#undef Honor_FLT_ROUNDS +#undef SET_INEXACT +#undef Sudden_Underflow +#define Sudden_Underflow +#ifdef IBM +#undef Flt_Rounds +#define Flt_Rounds 0 +#define Exp_shift 24 +#define Exp_shift1 24 +#define Exp_msk1 0x1000000 +#define Exp_msk11 0x1000000 +#define Exp_mask 0x7f000000 +#define P 14 +#define Bias 65 +#define Exp_1 0x41000000 +#define Exp_11 0x41000000 +#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ +#define Frac_mask 0xffffff +#define Frac_mask1 0xffffff +#define Bletch 4 +#define Ten_pmax 22 +#define Bndry_mask 0xefffff +#define Bndry_mask1 0xffffff +#define LSB 1 +#define Sign_bit 0x80000000 +#define Log2P 4 +#define Tiny0 0x100000 +#define Tiny1 0 +#define Quick_max 14 +#define Int_max 15 +#else /* VAX */ +#undef Flt_Rounds +#define Flt_Rounds 1 +#define Exp_shift 23 +#define Exp_shift1 7 +#define Exp_msk1 0x80 +#define Exp_msk11 0x800000 +#define Exp_mask 0x7f80 +#define P 56 +#define Bias 129 +#define Exp_1 0x40800000 +#define Exp_11 0x4080 +#define Ebits 8 +#define Frac_mask 0x7fffff +#define Frac_mask1 0xffff007f +#define Ten_pmax 24 +#define Bletch 2 +#define Bndry_mask 0xffff007f +#define Bndry_mask1 0xffff007f +#define LSB 0x10000 +#define Sign_bit 0x8000 +#define Log2P 1 +#define Tiny0 0x80 +#define Tiny1 0 +#define Quick_max 15 +#define Int_max 15 +#endif /* IBM, VAX */ +#endif /* IEEE_Arith */ + +#ifndef IEEE_Arith +#define ROUND_BIASED +#endif + +#ifdef RND_PRODQUOT +#define rounded_product(a,b) a = rnd_prod(a, b) +#define rounded_quotient(a,b) a = rnd_quot(a, b) +extern double rnd_prod(double, double), rnd_quot(double, double); +#else +#define rounded_product(a,b) a *= b +#define rounded_quotient(a,b) a /= b +#endif + +#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) +#define Big1 0xffffffff + +#ifndef Pack_32 +#define Pack_32 +#endif + +#define FFFFFFFF 0xffffffffUL + +#ifdef NO_LONG_LONG +#undef ULLong +#ifdef Just_16 +#undef Pack_32 +/* When Pack_32 is not defined, we store 16 bits per 32-bit Long. + * This makes some inner loops simpler and sometimes saves work + * during multiplications, but it often seems to make things slightly + * slower. Hence the default is now to store 32 bits per Long. + */ +#endif +#else /* long long available */ +#ifndef Llong +#define Llong long long +#endif +#ifndef ULLong +#define ULLong unsigned Llong +#endif +#endif /* NO_LONG_LONG */ + +#ifndef MULTIPLE_THREADS +#define ACQUIRE_DTOA_LOCK(n) /*nothing*/ +#define FREE_DTOA_LOCK(n) /*nothing*/ +#endif + +#define Kmax 15 + +struct Bigint { + struct Bigint *next; + int k, maxwds, sign, wds; + ULong x[1]; +}; + +typedef struct Bigint Bigint; + +static Bigint *freelist[Kmax+1]; + +static Bigint * +Balloc(int k) +{ + int x; + Bigint *rv; +#ifndef Omit_Private_Memory + unsigned int len; +#endif + + ACQUIRE_DTOA_LOCK(0); + if ((rv = freelist[k]) != 0) { + freelist[k] = rv->next; + } + else { + x = 1 << k; +#ifdef Omit_Private_Memory + rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); +#else + len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) + /sizeof(double); + if (pmem_next - private_mem + len <= PRIVATE_mem) { + rv = (Bigint*)pmem_next; + pmem_next += len; + } + else + rv = (Bigint*)MALLOC(len*sizeof(double)); +#endif + rv->k = k; + rv->maxwds = x; + } + FREE_DTOA_LOCK(0); + rv->sign = rv->wds = 0; + return rv; +} + +static void +Bfree(Bigint *v) +{ + if (v) { + ACQUIRE_DTOA_LOCK(0); + v->next = freelist[v->k]; + freelist[v->k] = v; + FREE_DTOA_LOCK(0); + } +} + +#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ +y->wds*sizeof(Long) + 2*sizeof(int)) + +static Bigint * +multadd(Bigint *b, int m, int a) /* multiply by m and add a */ +{ + int i, wds; +#ifdef ULLong + ULong *x; + ULLong carry, y; +#else + ULong carry, *x, y; +#ifdef Pack_32 + ULong xi, z; +#endif +#endif + Bigint *b1; + + wds = b->wds; + x = b->x; + i = 0; + carry = a; + do { +#ifdef ULLong + y = *x * (ULLong)m + carry; + carry = y >> 32; + *x++ = y & FFFFFFFF; +#else +#ifdef Pack_32 + xi = *x; + y = (xi & 0xffff) * m + carry; + z = (xi >> 16) * m + (y >> 16); + carry = z >> 16; + *x++ = (z << 16) + (y & 0xffff); +#else + y = *x * m + carry; + carry = y >> 16; + *x++ = y & 0xffff; +#endif +#endif + } while (++i < wds); + if (carry) { + if (wds >= b->maxwds) { + b1 = Balloc(b->k+1); + Bcopy(b1, b); + Bfree(b); + b = b1; + } + b->x[wds++] = carry; + b->wds = wds; + } + return b; +} + +static Bigint * +s2b(const char *s, int nd0, int nd, ULong y9) +{ + Bigint *b; + int i, k; + Long x, y; + + x = (nd + 8) / 9; + for (k = 0, y = 1; x > y; y <<= 1, k++) ; +#ifdef Pack_32 + b = Balloc(k); + b->x[0] = y9; + b->wds = 1; +#else + b = Balloc(k+1); + b->x[0] = y9 & 0xffff; + b->wds = (b->x[1] = y9 >> 16) ? 2 : 1; +#endif + + i = 9; + if (9 < nd0) { + s += 9; + do { + b = multadd(b, 10, *s++ - '0'); + } while (++i < nd0); + s++; + } + else + s += 10; + for (; i < nd; i++) + b = multadd(b, 10, *s++ - '0'); + return b; +} + +static int +hi0bits(register ULong x) +{ + register int k = 0; + + if (!(x & 0xffff0000)) { + k = 16; + x <<= 16; + } + if (!(x & 0xff000000)) { + k += 8; + x <<= 8; + } + if (!(x & 0xf0000000)) { + k += 4; + x <<= 4; + } + if (!(x & 0xc0000000)) { + k += 2; + x <<= 2; + } + if (!(x & 0x80000000)) { + k++; + if (!(x & 0x40000000)) + return 32; + } + return k; +} + +static int +lo0bits(ULong *y) +{ + register int k; + register ULong x = *y; + + if (x & 7) { + if (x & 1) + return 0; + if (x & 2) { + *y = x >> 1; + return 1; + } + *y = x >> 2; + return 2; + } + k = 0; + if (!(x & 0xffff)) { + k = 16; + x >>= 16; + } + if (!(x & 0xff)) { + k += 8; + x >>= 8; + } + if (!(x & 0xf)) { + k += 4; + x >>= 4; + } + if (!(x & 0x3)) { + k += 2; + x >>= 2; + } + if (!(x & 1)) { + k++; + x >>= 1; + if (!x) + return 32; + } + *y = x; + return k; +} + +static Bigint * +i2b(int i) +{ + Bigint *b; + + b = Balloc(1); + b->x[0] = i; + b->wds = 1; + return b; +} + +static Bigint * +mult(Bigint *a, Bigint *b) +{ + Bigint *c; + int k, wa, wb, wc; + ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; + ULong y; +#ifdef ULLong + ULLong carry, z; +#else + ULong carry, z; +#ifdef Pack_32 + ULong z2; +#endif +#endif + + if (a->wds < b->wds) { + c = a; + a = b; + b = c; + } + k = a->k; + wa = a->wds; + wb = b->wds; + wc = wa + wb; + if (wc > a->maxwds) + k++; + c = Balloc(k); + for (x = c->x, xa = x + wc; x < xa; x++) + *x = 0; + xa = a->x; + xae = xa + wa; + xb = b->x; + xbe = xb + wb; + xc0 = c->x; +#ifdef ULLong + for (; xb < xbe; xc0++) { + if ((y = *xb++) != 0) { + x = xa; + xc = xc0; + carry = 0; + do { + z = *x++ * (ULLong)y + *xc + carry; + carry = z >> 32; + *xc++ = z & FFFFFFFF; + } while (x < xae); + *xc = carry; + } + } +#else +#ifdef Pack_32 + for (; xb < xbe; xb++, xc0++) { + if (y = *xb & 0xffff) { + x = xa; + xc = xc0; + carry = 0; + do { + z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; + carry = z >> 16; + z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; + carry = z2 >> 16; + Storeinc(xc, z2, z); + } while (x < xae); + *xc = carry; + } + if (y = *xb >> 16) { + x = xa; + xc = xc0; + carry = 0; + z2 = *xc; + do { + z = (*x & 0xffff) * y + (*xc >> 16) + carry; + carry = z >> 16; + Storeinc(xc, z, z2); + z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; + carry = z2 >> 16; + } while (x < xae); + *xc = z2; + } + } +#else + for (; xb < xbe; xc0++) { + if (y = *xb++) { + x = xa; + xc = xc0; + carry = 0; + do { + z = *x++ * y + *xc + carry; + carry = z >> 16; + *xc++ = z & 0xffff; + } while (x < xae); + *xc = carry; + } + } +#endif +#endif + for (xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; + c->wds = wc; + return c; +} + +static Bigint *p5s; + +static Bigint * +pow5mult(Bigint *b, int k) +{ + Bigint *b1, *p5, *p51; + int i; + static int p05[3] = { 5, 25, 125 }; + + if ((i = k & 3) != 0) + b = multadd(b, p05[i-1], 0); + + if (!(k >>= 2)) + return b; + if (!(p5 = p5s)) { + /* first time */ +#ifdef MULTIPLE_THREADS + ACQUIRE_DTOA_LOCK(1); + if (!(p5 = p5s)) { + p5 = p5s = i2b(625); + p5->next = 0; + } + FREE_DTOA_LOCK(1); +#else + p5 = p5s = i2b(625); + p5->next = 0; +#endif + } + for (;;) { + if (k & 1) { + b1 = mult(b, p5); + Bfree(b); + b = b1; + } + if (!(k >>= 1)) + break; + if (!(p51 = p5->next)) { +#ifdef MULTIPLE_THREADS + ACQUIRE_DTOA_LOCK(1); + if (!(p51 = p5->next)) { + p51 = p5->next = mult(p5,p5); + p51->next = 0; + } + FREE_DTOA_LOCK(1); +#else + p51 = p5->next = mult(p5,p5); + p51->next = 0; +#endif + } + p5 = p51; + } + return b; +} + +static Bigint * +lshift(Bigint *b, int k) +{ + int i, k1, n, n1; + Bigint *b1; + ULong *x, *x1, *xe, z; + +#ifdef Pack_32 + n = k >> 5; +#else + n = k >> 4; +#endif + k1 = b->k; + n1 = n + b->wds + 1; + for (i = b->maxwds; n1 > i; i <<= 1) + k1++; + b1 = Balloc(k1); + x1 = b1->x; + for (i = 0; i < n; i++) + *x1++ = 0; + x = b->x; + xe = x + b->wds; +#ifdef Pack_32 + if (k &= 0x1f) { + k1 = 32 - k; + z = 0; + do { + *x1++ = *x << k | z; + z = *x++ >> k1; + } while (x < xe); + if ((*x1 = z) != 0) + ++n1; + } +#else + if (k &= 0xf) { + k1 = 16 - k; + z = 0; + do { + *x1++ = *x << k & 0xffff | z; + z = *x++ >> k1; + } while (x < xe); + if (*x1 = z) + ++n1; + } +#endif + else + do { + *x1++ = *x++; + } while (x < xe); + b1->wds = n1 - 1; + Bfree(b); + return b1; +} + +static int +cmp(Bigint *a, Bigint *b) +{ + ULong *xa, *xa0, *xb, *xb0; + int i, j; + + i = a->wds; + j = b->wds; +#ifdef DEBUG + if (i > 1 && !a->x[i-1]) + Bug("cmp called with a->x[a->wds-1] == 0"); + if (j > 1 && !b->x[j-1]) + Bug("cmp called with b->x[b->wds-1] == 0"); +#endif + if (i -= j) + return i; + xa0 = a->x; + xa = xa0 + j; + xb0 = b->x; + xb = xb0 + j; + for (;;) { + if (*--xa != *--xb) + return *xa < *xb ? -1 : 1; + if (xa <= xa0) + break; + } + return 0; +} + +static Bigint * +diff(Bigint *a, Bigint *b) +{ + Bigint *c; + int i, wa, wb; + ULong *xa, *xae, *xb, *xbe, *xc; +#ifdef ULLong + ULLong borrow, y; +#else + ULong borrow, y; +#ifdef Pack_32 + ULong z; +#endif +#endif + + i = cmp(a,b); + if (!i) { + c = Balloc(0); + c->wds = 1; + c->x[0] = 0; + return c; + } + if (i < 0) { + c = a; + a = b; + b = c; + i = 1; + } + else + i = 0; + c = Balloc(a->k); + c->sign = i; + wa = a->wds; + xa = a->x; + xae = xa + wa; + wb = b->wds; + xb = b->x; + xbe = xb + wb; + xc = c->x; + borrow = 0; +#ifdef ULLong + do { + y = (ULLong)*xa++ - *xb++ - borrow; + borrow = y >> 32 & (ULong)1; + *xc++ = y & FFFFFFFF; + } while (xb < xbe); + while (xa < xae) { + y = *xa++ - borrow; + borrow = y >> 32 & (ULong)1; + *xc++ = y & FFFFFFFF; + } +#else +#ifdef Pack_32 + do { + y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } while (xb < xbe); + while (xa < xae) { + y = (*xa & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } +#else + do { + y = *xa++ - *xb++ - borrow; + borrow = (y & 0x10000) >> 16; + *xc++ = y & 0xffff; + } while (xb < xbe); + while (xa < xae) { + y = *xa++ - borrow; + borrow = (y & 0x10000) >> 16; + *xc++ = y & 0xffff; + } +#endif +#endif + while (!*--xc) + wa--; + c->wds = wa; + return c; +} + +static double +ulp(double x) +{ + register Long L; + double a; + + L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; +#ifndef Avoid_Underflow +#ifndef Sudden_Underflow + if (L > 0) { +#endif +#endif +#ifdef IBM + L |= Exp_msk1 >> 4; +#endif + word0(a) = L; + word1(a) = 0; +#ifndef Avoid_Underflow +#ifndef Sudden_Underflow + } + else { + L = -L >> Exp_shift; + if (L < Exp_shift) { + word0(a) = 0x80000 >> L; + word1(a) = 0; + } + else { + word0(a) = 0; + L -= Exp_shift; + word1(a) = L >= 31 ? 1 : 1 << 31 - L; + } + } +#endif +#endif + return dval(a); +} + +static double +b2d(Bigint *a, int *e) +{ + ULong *xa, *xa0, w, y, z; + int k; + double d; +#ifdef VAX + ULong d0, d1; +#else +#define d0 word0(d) +#define d1 word1(d) +#endif + + xa0 = a->x; + xa = xa0 + a->wds; + y = *--xa; +#ifdef DEBUG + if (!y) Bug("zero y in b2d"); +#endif + k = hi0bits(y); + *e = 32 - k; +#ifdef Pack_32 + if (k < Ebits) { + d0 = Exp_1 | y >> (Ebits - k); + w = xa > xa0 ? *--xa : 0; + d1 = y << ((32-Ebits) + k) | w >> (Ebits - k); + goto ret_d; + } + z = xa > xa0 ? *--xa : 0; + if (k -= Ebits) { + d0 = Exp_1 | y << k | z >> (32 - k); + y = xa > xa0 ? *--xa : 0; + d1 = z << k | y >> (32 - k); + } + else { + d0 = Exp_1 | y; + d1 = z; + } +#else + if (k < Ebits + 16) { + z = xa > xa0 ? *--xa : 0; + d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; + w = xa > xa0 ? *--xa : 0; + y = xa > xa0 ? *--xa : 0; + d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; + goto ret_d; + } + z = xa > xa0 ? *--xa : 0; + w = xa > xa0 ? *--xa : 0; + k -= Ebits + 16; + d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; + y = xa > xa0 ? *--xa : 0; + d1 = w << k + 16 | y << k; +#endif +ret_d: +#ifdef VAX + word0(d) = d0 >> 16 | d0 << 16; + word1(d) = d1 >> 16 | d1 << 16; +#else +#undef d0 +#undef d1 +#endif + return dval(d); +} + +static Bigint * +d2b(double d, int *e, int *bits) +{ + Bigint *b; + int de, k; + ULong *x, y, z; +#ifndef Sudden_Underflow + int i; +#endif +#ifdef VAX + ULong d0, d1; + d0 = word0(d) >> 16 | word0(d) << 16; + d1 = word1(d) >> 16 | word1(d) << 16; +#else +#define d0 word0(d) +#define d1 word1(d) +#endif + +#ifdef Pack_32 + b = Balloc(1); +#else + b = Balloc(2); +#endif + x = b->x; + + z = d0 & Frac_mask; + d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ +#ifdef Sudden_Underflow + de = (int)(d0 >> Exp_shift); +#ifndef IBM + z |= Exp_msk11; +#endif +#else + if ((de = (int)(d0 >> Exp_shift)) != 0) + z |= Exp_msk1; +#endif +#ifdef Pack_32 + if ((y = d1) != 0) { + if ((k = lo0bits(&y)) != 0) { + x[0] = y | z << (32 - k); + z >>= k; + } + else + x[0] = y; +#ifndef Sudden_Underflow + i = +#endif + b->wds = (x[1] = z) ? 2 : 1; + } + else { +#ifdef DEBUG + if (!z) + Bug("Zero passed to d2b"); +#endif + k = lo0bits(&z); + x[0] = z; +#ifndef Sudden_Underflow + i = +#endif + b->wds = 1; + k += 32; + } +#else + if (y = d1) { + if (k = lo0bits(&y)) + if (k >= 16) { + x[0] = y | z << 32 - k & 0xffff; + x[1] = z >> k - 16 & 0xffff; + x[2] = z >> k; + i = 2; + } + else { + x[0] = y & 0xffff; + x[1] = y >> 16 | z << 16 - k & 0xffff; + x[2] = z >> k & 0xffff; + x[3] = z >> k+16; + i = 3; + } + else { + x[0] = y & 0xffff; + x[1] = y >> 16; + x[2] = z & 0xffff; + x[3] = z >> 16; + i = 3; + } + } + else { +#ifdef DEBUG + if (!z) + Bug("Zero passed to d2b"); +#endif + k = lo0bits(&z); + if (k >= 16) { + x[0] = z; + i = 0; + } + else { + x[0] = z & 0xffff; + x[1] = z >> 16; + i = 1; + } + k += 32; + } + while (!x[i]) + --i; + b->wds = i + 1; +#endif +#ifndef Sudden_Underflow + if (de) { +#endif +#ifdef IBM + *e = (de - Bias - (P-1) << 2) + k; + *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask); +#else + *e = de - Bias - (P-1) + k; + *bits = P - k; +#endif +#ifndef Sudden_Underflow + } + else { + *e = de - Bias - (P-1) + 1 + k; +#ifdef Pack_32 + *bits = 32*i - hi0bits(x[i-1]); +#else + *bits = (i+2)*16 - hi0bits(x[i]); +#endif + } +#endif + return b; +} +#undef d0 +#undef d1 + +static double +ratio(Bigint *a, Bigint *b) +{ + double da, db; + int k, ka, kb; + + dval(da) = b2d(a, &ka); + dval(db) = b2d(b, &kb); +#ifdef Pack_32 + k = ka - kb + 32*(a->wds - b->wds); +#else + k = ka - kb + 16*(a->wds - b->wds); +#endif +#ifdef IBM + if (k > 0) { + word0(da) += (k >> 2)*Exp_msk1; + if (k &= 3) + dval(da) *= 1 << k; + } + else { + k = -k; + word0(db) += (k >> 2)*Exp_msk1; + if (k &= 3) + dval(db) *= 1 << k; + } +#else + if (k > 0) + word0(da) += k*Exp_msk1; + else { + k = -k; + word0(db) += k*Exp_msk1; + } +#endif + return dval(da) / dval(db); +} + +static const double +tens[] = { + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + 1e20, 1e21, 1e22 +#ifdef VAX + , 1e23, 1e24 +#endif +}; + +static const double +#ifdef IEEE_Arith +bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; +static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, +#ifdef Avoid_Underflow + 9007199254740992.*9007199254740992.e-256 + /* = 2^106 * 1e-53 */ +#else + 1e-256 +#endif +}; +/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */ +/* flag unnecessarily. It leads to a song and dance at the end of strtod. */ +#define Scale_Bit 0x10 +#define n_bigtens 5 +#else +#ifdef IBM +bigtens[] = { 1e16, 1e32, 1e64 }; +static const double tinytens[] = { 1e-16, 1e-32, 1e-64 }; +#define n_bigtens 3 +#else +bigtens[] = { 1e16, 1e32 }; +static const double tinytens[] = { 1e-16, 1e-32 }; +#define n_bigtens 2 +#endif +#endif + +#ifndef IEEE_Arith +#undef INFNAN_CHECK +#endif + +#ifdef INFNAN_CHECK + +#ifndef NAN_WORD0 +#define NAN_WORD0 0x7ff80000 +#endif + +#ifndef NAN_WORD1 +#define NAN_WORD1 0 +#endif + +static int +match(const char **sp, char *t) +{ + int c, d; + const char *s = *sp; + + while (d = *t++) { + if ((c = *++s) >= 'A' && c <= 'Z') + c += 'a' - 'A'; + if (c != d) + return 0; + } + *sp = s + 1; + return 1; +} + +#ifndef No_Hex_NaN +static void +hexnan(double *rvp, const char **sp) +{ + ULong c, x[2]; + const char *s; + int havedig, udx0, xshift; + + x[0] = x[1] = 0; + havedig = xshift = 0; + udx0 = 1; + s = *sp; + while (c = *(const unsigned char*)++s) { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'a' && c <= 'f') + c += 10 - 'a'; + else if (c >= 'A' && c <= 'F') + c += 10 - 'A'; + else if (c <= ' ') { + if (udx0 && havedig) { + udx0 = 0; + xshift = 1; + } + continue; + } + else if (/*(*/ c == ')' && havedig) { + *sp = s + 1; + break; + } + else + return; /* invalid form: don't change *sp */ + havedig = 1; + if (xshift) { + xshift = 0; + x[0] = x[1]; + x[1] = 0; + } + if (udx0) + x[0] = (x[0] << 4) | (x[1] >> 28); + x[1] = (x[1] << 4) | c; + } + if ((x[0] &= 0xfffff) || x[1]) { + word0(*rvp) = Exp_mask | x[0]; + word1(*rvp) = x[1]; + } +} +#endif /*No_Hex_NaN*/ +#endif /* INFNAN_CHECK */ + +double +ruby_strtod(const char *s00, char **se) +{ +#ifdef Avoid_Underflow + int scale; +#endif + int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, + e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; + const char *s, *s0, *s1; + double aadj, aadj1, adj, rv, rv0; + Long L; + ULong y, z; + Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; +#ifdef SET_INEXACT + int inexact, oldinexact; +#endif +#ifdef Honor_FLT_ROUNDS + int rounding; +#endif +#ifdef USE_LOCALE + const char *s2; +#endif + + sign = nz0 = nz = 0; + dval(rv) = 0.; + for (s = s00;;s++) + switch (*s) { + case '-': + sign = 1; + /* no break */ + case '+': + if (*++s) + goto break2; + /* no break */ + case 0: + goto ret0; + case '\t': + case '\n': + case '\v': + case '\f': + case '\r': + case ' ': + continue; + default: + goto break2; + } +break2: + if (*s == '0') { + nz0 = 1; + while (*++s == '0') ; + if (!*s) + goto ret; + } + s0 = s; + y = z = 0; + for (nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) + if (nd < 9) + y = 10*y + c - '0'; + else if (nd < 16) + z = 10*z + c - '0'; + nd0 = nd; +#ifdef USE_LOCALE + s1 = localeconv()->decimal_point; + if (c == *s1) { + c = '.'; + if (*++s1) { + s2 = s; + for (;;) { + if (*++s2 != *s1) { + c = 0; + break; + } + if (!*++s1) { + s = s2; + break; + } + } + } + } +#endif + if (c == '.') { + if (!ISDIGIT(s[1])) + goto dig_done; + c = *++s; + if (!nd) { + for (; c == '0'; c = *++s) + nz++; + if (c > '0' && c <= '9') { + s0 = s; + nf += nz; + nz = 0; + goto have_dig; + } + goto dig_done; + } + for (; c >= '0' && c <= '9'; c = *++s) { +have_dig: + nz++; + if (c -= '0') { + nf += nz; + for (i = 1; i < nz; i++) + if (nd++ < 9) + y *= 10; + else if (nd <= DBL_DIG + 1) + z *= 10; + if (nd++ < 9) + y = 10*y + c; + else if (nd <= DBL_DIG + 1) + z = 10*z + c; + nz = 0; + } + } + } +dig_done: + e = 0; + if (c == 'e' || c == 'E') { + if (!nd && !nz && !nz0) { + goto ret0; + } + s00 = s; + esign = 0; + switch (c = *++s) { + case '-': + esign = 1; + case '+': + c = *++s; + } + if (c >= '0' && c <= '9') { + while (c == '0') + c = *++s; + if (c > '0' && c <= '9') { + L = c - '0'; + s1 = s; + while ((c = *++s) >= '0' && c <= '9') + L = 10*L + c - '0'; + if (s - s1 > 8 || L > 19999) + /* Avoid confusion from exponents + * so large that e might overflow. + */ + e = 19999; /* safe for 16 bit ints */ + else + e = (int)L; + if (esign) + e = -e; + } + else + e = 0; + } + else + s = s00; + } + if (!nd) { + if (!nz && !nz0) { +#ifdef INFNAN_CHECK + /* Check for Nan and Infinity */ + switch (c) { + case 'i': + case 'I': + if (match(&s,"nf")) { + --s; + if (!match(&s,"inity")) + ++s; + word0(rv) = 0x7ff00000; + word1(rv) = 0; + goto ret; + } + break; + case 'n': + case 'N': + if (match(&s, "an")) { + word0(rv) = NAN_WORD0; + word1(rv) = NAN_WORD1; +#ifndef No_Hex_NaN + if (*s == '(') /*)*/ + hexnan(&rv, &s); +#endif + goto ret; + } + } +#endif /* INFNAN_CHECK */ +ret0: + s = s00; + sign = 0; + } + goto ret; + } + e1 = e -= nf; + + /* Now we have nd0 digits, starting at s0, followed by a + * decimal point, followed by nd-nd0 digits. The number we're + * after is the integer represented by those digits times + * 10**e */ + + if (!nd0) + nd0 = nd; + k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; + dval(rv) = y; + if (k > 9) { +#ifdef SET_INEXACT + if (k > DBL_DIG) + oldinexact = get_inexact(); +#endif + dval(rv) = tens[k - 9] * dval(rv) + z; + } + bd0 = 0; + if (nd <= DBL_DIG +#ifndef RND_PRODQUOT +#ifndef Honor_FLT_ROUNDS + && Flt_Rounds == 1 +#endif +#endif + ) { + if (!e) + goto ret; + if (e > 0) { + if (e <= Ten_pmax) { +#ifdef VAX + goto vax_ovfl_check; +#else +#ifdef Honor_FLT_ROUNDS + /* round correctly FLT_ROUNDS = 2 or 3 */ + if (sign) { + rv = -rv; + sign = 0; + } +#endif + /* rv = */ rounded_product(dval(rv), tens[e]); + goto ret; +#endif + } + i = DBL_DIG - nd; + if (e <= Ten_pmax + i) { + /* A fancier test would sometimes let us do + * this for larger i values. + */ +#ifdef Honor_FLT_ROUNDS + /* round correctly FLT_ROUNDS = 2 or 3 */ + if (sign) { + rv = -rv; + sign = 0; + } +#endif + e -= i; + dval(rv) *= tens[i]; +#ifdef VAX + /* VAX exponent range is so narrow we must + * worry about overflow here... + */ +vax_ovfl_check: + word0(rv) -= P*Exp_msk1; + /* rv = */ rounded_product(dval(rv), tens[e]); + if ((word0(rv) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) + goto ovfl; + word0(rv) += P*Exp_msk1; +#else + /* rv = */ rounded_product(dval(rv), tens[e]); +#endif + goto ret; + } + } +#ifndef Inaccurate_Divide + else if (e >= -Ten_pmax) { +#ifdef Honor_FLT_ROUNDS + /* round correctly FLT_ROUNDS = 2 or 3 */ + if (sign) { + rv = -rv; + sign = 0; + } +#endif + /* rv = */ rounded_quotient(dval(rv), tens[-e]); + goto ret; + } +#endif + } + e1 += nd - k; + +#ifdef IEEE_Arith +#ifdef SET_INEXACT + inexact = 1; + if (k <= DBL_DIG) + oldinexact = get_inexact(); +#endif +#ifdef Avoid_Underflow + scale = 0; +#endif +#ifdef Honor_FLT_ROUNDS + if ((rounding = Flt_Rounds) >= 2) { + if (sign) + rounding = rounding == 2 ? 0 : 2; + else + if (rounding != 2) + rounding = 0; + } +#endif +#endif /*IEEE_Arith*/ + + /* Get starting approximation = rv * 10**e1 */ + + if (e1 > 0) { + if ((i = e1 & 15) != 0) + dval(rv) *= tens[i]; + if (e1 &= ~15) { + if (e1 > DBL_MAX_10_EXP) { +ovfl: +#ifndef NO_ERRNO + errno = ERANGE; +#endif + /* Can't trust HUGE_VAL */ +#ifdef IEEE_Arith +#ifdef Honor_FLT_ROUNDS + switch (rounding) { + case 0: /* toward 0 */ + case 3: /* toward -infinity */ + word0(rv) = Big0; + word1(rv) = Big1; + break; + default: + word0(rv) = Exp_mask; + word1(rv) = 0; + } +#else /*Honor_FLT_ROUNDS*/ + word0(rv) = Exp_mask; + word1(rv) = 0; +#endif /*Honor_FLT_ROUNDS*/ +#ifdef SET_INEXACT + /* set overflow bit */ + dval(rv0) = 1e300; + dval(rv0) *= dval(rv0); +#endif +#else /*IEEE_Arith*/ + word0(rv) = Big0; + word1(rv) = Big1; +#endif /*IEEE_Arith*/ + if (bd0) + goto retfree; + goto ret; + } + e1 >>= 4; + for (j = 0; e1 > 1; j++, e1 >>= 1) + if (e1 & 1) + dval(rv) *= bigtens[j]; + /* The last multiplication could overflow. */ + word0(rv) -= P*Exp_msk1; + dval(rv) *= bigtens[j]; + if ((z = word0(rv) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-P)) + goto ovfl; + if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { + /* set to largest number */ + /* (Can't trust DBL_MAX) */ + word0(rv) = Big0; + word1(rv) = Big1; + } + else + word0(rv) += P*Exp_msk1; + } + } + else if (e1 < 0) { + e1 = -e1; + if ((i = e1 & 15) != 0) + dval(rv) /= tens[i]; + if (e1 >>= 4) { + if (e1 >= 1 << n_bigtens) + goto undfl; +#ifdef Avoid_Underflow + if (e1 & Scale_Bit) + scale = 2*P; + for (j = 0; e1 > 0; j++, e1 >>= 1) + if (e1 & 1) + dval(rv) *= tinytens[j]; + if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask) + >> Exp_shift)) > 0) { + /* scaled rv is denormal; zap j low bits */ + if (j >= 32) { + word1(rv) = 0; + if (j >= 53) + word0(rv) = (P+2)*Exp_msk1; + else + word0(rv) &= 0xffffffff << (j-32); + } + else + word1(rv) &= 0xffffffff << j; + } +#else + for (j = 0; e1 > 1; j++, e1 >>= 1) + if (e1 & 1) + dval(rv) *= tinytens[j]; + /* The last multiplication could underflow. */ + dval(rv0) = dval(rv); + dval(rv) *= tinytens[j]; + if (!dval(rv)) { + dval(rv) = 2.*dval(rv0); + dval(rv) *= tinytens[j]; +#endif + if (!dval(rv)) { +undfl: + dval(rv) = 0.; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + if (bd0) + goto retfree; + goto ret; + } +#ifndef Avoid_Underflow + word0(rv) = Tiny0; + word1(rv) = Tiny1; + /* The refinement below will clean + * this approximation up. + */ + } +#endif + } + } + + /* Now the hard part -- adjusting rv to the correct value.*/ + + /* Put digits into bd: true value = bd * 10^e */ + + bd0 = s2b(s0, nd0, nd, y); + + for (;;) { + bd = Balloc(bd0->k); + Bcopy(bd, bd0); + bb = d2b(dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */ + bs = i2b(1); + + if (e >= 0) { + bb2 = bb5 = 0; + bd2 = bd5 = e; + } + else { + bb2 = bb5 = -e; + bd2 = bd5 = 0; + } + if (bbe >= 0) + bb2 += bbe; + else + bd2 -= bbe; + bs2 = bb2; +#ifdef Honor_FLT_ROUNDS + if (rounding != 1) + bs2++; +#endif +#ifdef Avoid_Underflow + j = bbe - scale; + i = j + bbbits - 1; /* logb(rv) */ + if (i < Emin) /* denormal */ + j += P - Emin; + else + j = P + 1 - bbbits; +#else /*Avoid_Underflow*/ +#ifdef Sudden_Underflow +#ifdef IBM + j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); +#else + j = P + 1 - bbbits; +#endif +#else /*Sudden_Underflow*/ + j = bbe; + i = j + bbbits - 1; /* logb(rv) */ + if (i < Emin) /* denormal */ + j += P - Emin; + else + j = P + 1 - bbbits; +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + bb2 += j; + bd2 += j; +#ifdef Avoid_Underflow + bd2 += scale; +#endif + i = bb2 < bd2 ? bb2 : bd2; + if (i > bs2) + i = bs2; + if (i > 0) { + bb2 -= i; + bd2 -= i; + bs2 -= i; + } + if (bb5 > 0) { + bs = pow5mult(bs, bb5); + bb1 = mult(bs, bb); + Bfree(bb); + bb = bb1; + } + if (bb2 > 0) + bb = lshift(bb, bb2); + if (bd5 > 0) + bd = pow5mult(bd, bd5); + if (bd2 > 0) + bd = lshift(bd, bd2); + if (bs2 > 0) + bs = lshift(bs, bs2); + delta = diff(bb, bd); + dsign = delta->sign; + delta->sign = 0; + i = cmp(delta, bs); +#ifdef Honor_FLT_ROUNDS + if (rounding != 1) { + if (i < 0) { + /* Error is less than an ulp */ + if (!delta->x[0] && delta->wds <= 1) { + /* exact */ +#ifdef SET_INEXACT + inexact = 0; +#endif + break; + } + if (rounding) { + if (dsign) { + adj = 1.; + goto apply_adj; + } + } + else if (!dsign) { + adj = -1.; + if (!word1(rv) + && !(word0(rv) & Frac_mask)) { + y = word0(rv) & Exp_mask; +#ifdef Avoid_Underflow + if (!scale || y > 2*P*Exp_msk1) +#else + if (y) +#endif + { + delta = lshift(delta,Log2P); + if (cmp(delta, bs) <= 0) + adj = -0.5; + } + } +apply_adj: +#ifdef Avoid_Underflow + if (scale && (y = word0(rv) & Exp_mask) + <= 2*P*Exp_msk1) + word0(adj) += (2*P+1)*Exp_msk1 - y; +#else +#ifdef Sudden_Underflow + if ((word0(rv) & Exp_mask) <= + P*Exp_msk1) { + word0(rv) += P*Exp_msk1; + dval(rv) += adj*ulp(dval(rv)); + word0(rv) -= P*Exp_msk1; + } + else +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + dval(rv) += adj*ulp(dval(rv)); + } + break; + } + adj = ratio(delta, bs); + if (adj < 1.) + adj = 1.; + if (adj <= 0x7ffffffe) { + /* adj = rounding ? ceil(adj) : floor(adj); */ + y = adj; + if (y != adj) { + if (!((rounding>>1) ^ dsign)) + y++; + adj = y; + } + } +#ifdef Avoid_Underflow + if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) + word0(adj) += (2*P+1)*Exp_msk1 - y; +#else +#ifdef Sudden_Underflow + if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { + word0(rv) += P*Exp_msk1; + adj *= ulp(dval(rv)); + if (dsign) + dval(rv) += adj; + else + dval(rv) -= adj; + word0(rv) -= P*Exp_msk1; + goto cont; + } +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + adj *= ulp(dval(rv)); + if (dsign) + dval(rv) += adj; + else + dval(rv) -= adj; + goto cont; + } +#endif /*Honor_FLT_ROUNDS*/ + + if (i < 0) { + /* Error is less than half an ulp -- check for + * special case of mantissa a power of two. + */ + if (dsign || word1(rv) || word0(rv) & Bndry_mask +#ifdef IEEE_Arith +#ifdef Avoid_Underflow + || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1 +#else + || (word0(rv) & Exp_mask) <= Exp_msk1 +#endif +#endif + ) { +#ifdef SET_INEXACT + if (!delta->x[0] && delta->wds <= 1) + inexact = 0; +#endif + break; + } + if (!delta->x[0] && delta->wds <= 1) { + /* exact result */ +#ifdef SET_INEXACT + inexact = 0; +#endif + break; + } + delta = lshift(delta,Log2P); + if (cmp(delta, bs) > 0) + goto drop_down; + break; + } + if (i == 0) { + /* exactly half-way between */ + if (dsign) { + if ((word0(rv) & Bndry_mask1) == Bndry_mask1 + && word1(rv) == ( +#ifdef Avoid_Underflow + (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) + ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : +#endif + 0xffffffff)) { + /*boundary case -- increment exponent*/ + word0(rv) = (word0(rv) & Exp_mask) + + Exp_msk1 +#ifdef IBM + | Exp_msk1 >> 4 +#endif + ; + word1(rv) = 0; +#ifdef Avoid_Underflow + dsign = 0; +#endif + break; + } + } + else if (!(word0(rv) & Bndry_mask) && !word1(rv)) { +drop_down: + /* boundary case -- decrement exponent */ +#ifdef Sudden_Underflow /*{{*/ + L = word0(rv) & Exp_mask; +#ifdef IBM + if (L < Exp_msk1) +#else +#ifdef Avoid_Underflow + if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1)) +#else + if (L <= Exp_msk1) +#endif /*Avoid_Underflow*/ +#endif /*IBM*/ + goto undfl; + L -= Exp_msk1; +#else /*Sudden_Underflow}{*/ +#ifdef Avoid_Underflow + if (scale) { + L = word0(rv) & Exp_mask; + if (L <= (2*P+1)*Exp_msk1) { + if (L > (P+2)*Exp_msk1) + /* round even ==> */ + /* accept rv */ + break; + /* rv = smallest denormal */ + goto undfl; + } + } +#endif /*Avoid_Underflow*/ + L = (word0(rv) & Exp_mask) - Exp_msk1; +#endif /*Sudden_Underflow}}*/ + word0(rv) = L | Bndry_mask1; + word1(rv) = 0xffffffff; +#ifdef IBM + goto cont; +#else + break; +#endif + } +#ifndef ROUND_BIASED + if (!(word1(rv) & LSB)) + break; +#endif + if (dsign) + dval(rv) += ulp(dval(rv)); +#ifndef ROUND_BIASED + else { + dval(rv) -= ulp(dval(rv)); +#ifndef Sudden_Underflow + if (!dval(rv)) + goto undfl; +#endif + } +#ifdef Avoid_Underflow + dsign = 1 - dsign; +#endif +#endif + break; + } + if ((aadj = ratio(delta, bs)) <= 2.) { + if (dsign) + aadj = aadj1 = 1.; + else if (word1(rv) || word0(rv) & Bndry_mask) { +#ifndef Sudden_Underflow + if (word1(rv) == Tiny1 && !word0(rv)) + goto undfl; +#endif + aadj = 1.; + aadj1 = -1.; + } + else { + /* special case -- power of FLT_RADIX to be */ + /* rounded down... */ + + if (aadj < 2./FLT_RADIX) + aadj = 1./FLT_RADIX; + else + aadj *= 0.5; + aadj1 = -aadj; + } + } + else { + aadj *= 0.5; + aadj1 = dsign ? aadj : -aadj; +#ifdef Check_FLT_ROUNDS + switch (Rounding) { + case 2: /* towards +infinity */ + aadj1 -= 0.5; + break; + case 0: /* towards 0 */ + case 3: /* towards -infinity */ + aadj1 += 0.5; + } +#else + if (Flt_Rounds == 0) + aadj1 += 0.5; +#endif /*Check_FLT_ROUNDS*/ + } + y = word0(rv) & Exp_mask; + + /* Check for overflow */ + + if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { + dval(rv0) = dval(rv); + word0(rv) -= P*Exp_msk1; + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; + if ((word0(rv) & Exp_mask) >= + Exp_msk1*(DBL_MAX_EXP+Bias-P)) { + if (word0(rv0) == Big0 && word1(rv0) == Big1) + goto ovfl; + word0(rv) = Big0; + word1(rv) = Big1; + goto cont; + } + else + word0(rv) += P*Exp_msk1; + } + else { +#ifdef Avoid_Underflow + if (scale && y <= 2*P*Exp_msk1) { + if (aadj <= 0x7fffffff) { + if ((z = aadj) <= 0) + z = 1; + aadj = z; + aadj1 = dsign ? aadj : -aadj; + } + word0(aadj1) += (2*P+1)*Exp_msk1 - y; + } + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; +#else +#ifdef Sudden_Underflow + if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { + dval(rv0) = dval(rv); + word0(rv) += P*Exp_msk1; + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; +#ifdef IBM + if ((word0(rv) & Exp_mask) < P*Exp_msk1) +#else + if ((word0(rv) & Exp_mask) <= P*Exp_msk1) +#endif + { + if (word0(rv0) == Tiny0 && word1(rv0) == Tiny1) + goto undfl; + word0(rv) = Tiny0; + word1(rv) = Tiny1; + goto cont; + } + else + word0(rv) -= P*Exp_msk1; + } + else { + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; + } +#else /*Sudden_Underflow*/ + /* Compute adj so that the IEEE rounding rules will + * correctly round rv + adj in some half-way cases. + * If rv * ulp(rv) is denormalized (i.e., + * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid + * trouble from bits lost to denormalization; + * example: 1.2e-307 . + */ + if (y <= (P-1)*Exp_msk1 && aadj > 1.) { + aadj1 = (double)(int)(aadj + 0.5); + if (!dsign) + aadj1 = -aadj1; + } + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + } + z = word0(rv) & Exp_mask; +#ifndef SET_INEXACT +#ifdef Avoid_Underflow + if (!scale) +#endif + if (y == z) { + /* Can we stop now? */ + L = (Long)aadj; + aadj -= L; + /* The tolerances below are conservative. */ + if (dsign || word1(rv) || word0(rv) & Bndry_mask) { + if (aadj < .4999999 || aadj > .5000001) + break; + } + else if (aadj < .4999999/FLT_RADIX) + break; + } +#endif +cont: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(delta); + } +#ifdef SET_INEXACT + if (inexact) { + if (!oldinexact) { + word0(rv0) = Exp_1 + (70 << Exp_shift); + word1(rv0) = 0; + dval(rv0) += 1.; + } + } + else if (!oldinexact) + clear_inexact(); +#endif +#ifdef Avoid_Underflow + if (scale) { + word0(rv0) = Exp_1 - 2*P*Exp_msk1; + word1(rv0) = 0; + dval(rv) *= dval(rv0); +#ifndef NO_ERRNO + /* try to avoid the bug of testing an 8087 register value */ + if (word0(rv) == 0 && word1(rv) == 0) + errno = ERANGE; +#endif + } +#endif /* Avoid_Underflow */ +#ifdef SET_INEXACT + if (inexact && !(word0(rv) & Exp_mask)) { + /* set underflow bit */ + dval(rv0) = 1e-300; + dval(rv0) *= dval(rv0); + } +#endif +retfree: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); +ret: + if (se) + *se = (char *)s; + return sign ? -dval(rv) : dval(rv); +} + +static int +quorem(Bigint *b, Bigint *S) +{ + int n; + ULong *bx, *bxe, q, *sx, *sxe; +#ifdef ULLong + ULLong borrow, carry, y, ys; +#else + ULong borrow, carry, y, ys; +#ifdef Pack_32 + ULong si, z, zs; +#endif +#endif + + n = S->wds; +#ifdef DEBUG + /*debug*/ if (b->wds > n) + /*debug*/ Bug("oversize b in quorem"); +#endif + if (b->wds < n) + return 0; + sx = S->x; + sxe = sx + --n; + bx = b->x; + bxe = bx + n; + q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ +#ifdef DEBUG + /*debug*/ if (q > 9) + /*debug*/ Bug("oversized quotient in quorem"); +#endif + if (q) { + borrow = 0; + carry = 0; + do { +#ifdef ULLong + ys = *sx++ * (ULLong)q + carry; + carry = ys >> 32; + y = *bx - (ys & FFFFFFFF) - borrow; + borrow = y >> 32 & (ULong)1; + *bx++ = y & FFFFFFFF; +#else +#ifdef Pack_32 + si = *sx++; + ys = (si & 0xffff) * q + carry; + zs = (si >> 16) * q + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#else + ys = *sx++ * q + carry; + carry = ys >> 16; + y = *bx - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + *bx++ = y & 0xffff; +#endif +#endif + } while (sx <= sxe); + if (!*bxe) { + bx = b->x; + while (--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + if (cmp(b, S) >= 0) { + q++; + borrow = 0; + carry = 0; + bx = b->x; + sx = S->x; + do { +#ifdef ULLong + ys = *sx++ + carry; + carry = ys >> 32; + y = *bx - (ys & FFFFFFFF) - borrow; + borrow = y >> 32 & (ULong)1; + *bx++ = y & FFFFFFFF; +#else +#ifdef Pack_32 + si = *sx++; + ys = (si & 0xffff) + carry; + zs = (si >> 16) + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#else + ys = *sx++ + carry; + carry = ys >> 16; + y = *bx - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + *bx++ = y & 0xffff; +#endif +#endif + } while (sx <= sxe); + bx = b->x; + bxe = bx + n; + if (!*bxe) { + while (--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + return q; +} + +#ifndef MULTIPLE_THREADS +static char *dtoa_result; +#endif + +static char * +rv_alloc(int i) +{ + int j, k, *r; + + j = sizeof(ULong); + for (k = 0; + sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i; + j <<= 1) + k++; + r = (int*)Balloc(k); + *r = k; + return +#ifndef MULTIPLE_THREADS + dtoa_result = +#endif + (char *)(r+1); +} + +static char * +nrv_alloc(char *s, char **rve, int n) +{ + char *rv, *t; + + t = rv = rv_alloc(n); + while ((*t = *s++) != 0) t++; + if (rve) + *rve = t; + return rv; +} + +/* freedtoa(s) must be used to free values s returned by dtoa + * when MULTIPLE_THREADS is #defined. It should be used in all cases, + * but for consistency with earlier versions of dtoa, it is optional + * when MULTIPLE_THREADS is not defined. + */ + +void +freedtoa(char *s) +{ + Bigint *b = (Bigint *)((int *)s - 1); + b->maxwds = 1 << (b->k = *(int*)b); + Bfree(b); +#ifndef MULTIPLE_THREADS + if (s == dtoa_result) + dtoa_result = 0; +#endif +} + +/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. + * + * Inspired by "How to Print Floating-Point Numbers Accurately" by + * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * 1. Rather than iterating, we use a simple numeric overestimate + * to determine k = floor(log10(d)). We scale relevant + * quantities using O(log2(k)) rather than O(k) multiplications. + * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't + * try to generate digits strictly left to right. Instead, we + * compute with fewer bits and propagate the carry if necessary + * when rounding the final digit up. This is often faster. + * 3. Under the assumption that input will be rounded nearest, + * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. + * That is, we allow equality in stopping tests when the + * round-nearest rule will give the same floating-point value + * as would satisfaction of the stopping test with strict + * inequality. + * 4. We remove common factors of powers of 2 from relevant + * quantities. + * 5. When converting floating-point integers less than 1e16, + * we use floating-point arithmetic rather than resorting + * to multiple-precision integers. + * 6. When asked to produce fewer than 15 digits, we first try + * to get by with floating-point arithmetic; we resort to + * multiple-precision integer arithmetic only if we cannot + * guarantee that the floating-point calculation has given + * the correctly rounded result. For k requested digits and + * "uniformly" distributed input, the probability is + * something like 10^(k-15) that we must resort to the Long + * calculation. + */ + +char * +dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) +{ + /* Arguments ndigits, decpt, sign are similar to those + of ecvt and fcvt; trailing zeros are suppressed from + the returned string. If not null, *rve is set to point + to the end of the return value. If d is +-Infinity or NaN, + then *decpt is set to 9999. + + mode: + 0 ==> shortest string that yields d when read in + and rounded to nearest. + 1 ==> like 0, but with Steele & White stopping rule; + e.g. with IEEE P754 arithmetic , mode 0 gives + 1e23 whereas mode 1 gives 9.999999999999999e22. + 2 ==> max(1,ndigits) significant digits. This gives a + return value similar to that of ecvt, except + that trailing zeros are suppressed. + 3 ==> through ndigits past the decimal point. This + gives a return value similar to that from fcvt, + except that trailing zeros are suppressed, and + ndigits can be negative. + 4,5 ==> similar to 2 and 3, respectively, but (in + round-nearest mode) with the tests of mode 0 to + possibly return a shorter string that rounds to d. + With IEEE arithmetic and compilation with + -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same + as modes 2 and 3 when FLT_ROUNDS != 1. + 6-9 ==> Debugging modes similar to mode - 4: don't try + fast floating-point estimate (if applicable). + + Values of mode other than 0-9 are treated as mode 0. + + Sufficient space is allocated to the return value + to hold the suppressed trailing zeros. + */ + + int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, + j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, + spec_case, try_quick; + Long L; +#ifndef Sudden_Underflow + int denorm; + ULong x; +#endif + Bigint *b, *b1, *delta, *mlo, *mhi, *S; + double d2, ds, eps; + char *s, *s0; +#ifdef Honor_FLT_ROUNDS + int rounding; +#endif +#ifdef SET_INEXACT + int inexact, oldinexact; +#endif + +#ifndef MULTIPLE_THREADS + if (dtoa_result) { + freedtoa(dtoa_result); + dtoa_result = 0; + } +#endif + + if (word0(d) & Sign_bit) { + /* set sign for everything, including 0's and NaNs */ + *sign = 1; + word0(d) &= ~Sign_bit; /* clear sign bit */ + } + else + *sign = 0; + +#if defined(IEEE_Arith) + defined(VAX) +#ifdef IEEE_Arith + if ((word0(d) & Exp_mask) == Exp_mask) +#else + if (word0(d) == 0x8000) +#endif + { + /* Infinity or NaN */ + *decpt = 9999; +#ifdef IEEE_Arith + if (!word1(d) && !(word0(d) & 0xfffff)) + return nrv_alloc("Infinity", rve, 8); +#endif + return nrv_alloc("NaN", rve, 3); + } +#endif +#ifdef IBM + dval(d) += 0; /* normalize */ +#endif + if (!dval(d)) { + *decpt = 1; + return nrv_alloc("0", rve, 1); + } + +#ifdef SET_INEXACT + try_quick = oldinexact = get_inexact(); + inexact = 1; +#endif +#ifdef Honor_FLT_ROUNDS + if ((rounding = Flt_Rounds) >= 2) { + if (*sign) + rounding = rounding == 2 ? 0 : 2; + else + if (rounding != 2) + rounding = 0; + } +#endif + + b = d2b(dval(d), &be, &bbits); +#ifdef Sudden_Underflow + i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); +#else + if ((i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) != 0) { +#endif + dval(d2) = dval(d); + word0(d2) &= Frac_mask1; + word0(d2) |= Exp_11; +#ifdef IBM + if (j = 11 - hi0bits(word0(d2) & Frac_mask)) + dval(d2) /= 1 << j; +#endif + + /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 + * log10(x) = log(x) / log(10) + * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) + * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) + * + * This suggests computing an approximation k to log10(d) by + * + * k = (i - Bias)*0.301029995663981 + * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); + * + * We want k to be too large rather than too small. + * The error in the first-order Taylor series approximation + * is in our favor, so we just round up the constant enough + * to compensate for any error in the multiplication of + * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, + * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, + * adding 1e-13 to the constant term more than suffices. + * Hence we adjust the constant term to 0.1760912590558. + * (We could get a more accurate k by invoking log10, + * but this is probably not worthwhile.) + */ + + i -= Bias; +#ifdef IBM + i <<= 2; + i += j; +#endif +#ifndef Sudden_Underflow + denorm = 0; + } + else { + /* d is denormalized */ + + i = bbits + be + (Bias + (P-1) - 1); + x = i > 32 ? word0(d) << (64 - i) | word1(d) >> (i - 32) + : word1(d) << (32 - i); + dval(d2) = x; + word0(d2) -= 31*Exp_msk1; /* adjust exponent */ + i -= (Bias + (P-1) - 1) + 1; + denorm = 1; + } +#endif + ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; + k = (int)ds; + if (ds < 0. && ds != k) + k--; /* want k = floor(ds) */ + k_check = 1; + if (k >= 0 && k <= Ten_pmax) { + if (dval(d) < tens[k]) + k--; + k_check = 0; + } + j = bbits - i - 1; + if (j >= 0) { + b2 = 0; + s2 = j; + } + else { + b2 = -j; + s2 = 0; + } + if (k >= 0) { + b5 = 0; + s5 = k; + s2 += k; + } + else { + b2 -= k; + b5 = -k; + s5 = 0; + } + if (mode < 0 || mode > 9) + mode = 0; + +#ifndef SET_INEXACT +#ifdef Check_FLT_ROUNDS + try_quick = Rounding == 1; +#else + try_quick = 1; +#endif +#endif /*SET_INEXACT*/ + + if (mode > 5) { + mode -= 4; + try_quick = 0; + } + leftright = 1; + ilim = ilim1 = -1; + switch (mode) { + case 0: + case 1: + i = 18; + ndigits = 0; + break; + case 2: + leftright = 0; + /* no break */ + case 4: + if (ndigits <= 0) + ndigits = 1; + ilim = ilim1 = i = ndigits; + break; + case 3: + leftright = 0; + /* no break */ + case 5: + i = ndigits + k + 1; + ilim = i; + ilim1 = i - 1; + if (i <= 0) + i = 1; + } + s = s0 = rv_alloc(i+1); + +#ifdef Honor_FLT_ROUNDS + if (mode > 1 && rounding != 1) + leftright = 0; +#endif + + if (ilim >= 0 && ilim <= Quick_max && try_quick) { + + /* Try to get by with floating-point arithmetic. */ + + i = 0; + dval(d2) = dval(d); + k0 = k; + ilim0 = ilim; + ieps = 2; /* conservative */ + if (k > 0) { + ds = tens[k&0xf]; + j = k >> 4; + if (j & Bletch) { + /* prevent overflows */ + j &= Bletch - 1; + dval(d) /= bigtens[n_bigtens-1]; + ieps++; + } + for (; j; j >>= 1, i++) + if (j & 1) { + ieps++; + ds *= bigtens[i]; + } + dval(d) /= ds; + } + else if ((j1 = -k) != 0) { + dval(d) *= tens[j1 & 0xf]; + for (j = j1 >> 4; j; j >>= 1, i++) + if (j & 1) { + ieps++; + dval(d) *= bigtens[i]; + } + } + if (k_check && dval(d) < 1. && ilim > 0) { + if (ilim1 <= 0) + goto fast_failed; + ilim = ilim1; + k--; + dval(d) *= 10.; + ieps++; + } + dval(eps) = ieps*dval(d) + 7.; + word0(eps) -= (P-1)*Exp_msk1; + if (ilim == 0) { + S = mhi = 0; + dval(d) -= 5.; + if (dval(d) > dval(eps)) + goto one_digit; + if (dval(d) < -dval(eps)) + goto no_digits; + goto fast_failed; + } +#ifndef No_leftright + if (leftright) { + /* Use Steele & White method of only + * generating digits needed. + */ + dval(eps) = 0.5/tens[ilim-1] - dval(eps); + for (i = 0;;) { + L = dval(d); + dval(d) -= L; + *s++ = '0' + (int)L; + if (dval(d) < dval(eps)) + goto ret1; + if (1. - dval(d) < dval(eps)) + goto bump_up; + if (++i >= ilim) + break; + dval(eps) *= 10.; + dval(d) *= 10.; + } + } + else { +#endif + /* Generate ilim digits, then fix them up. */ + dval(eps) *= tens[ilim-1]; + for (i = 1;; i++, dval(d) *= 10.) { + L = (Long)(dval(d)); + if (!(dval(d) -= L)) + ilim = i; + *s++ = '0' + (int)L; + if (i == ilim) { + if (dval(d) > 0.5 + dval(eps)) + goto bump_up; + else if (dval(d) < 0.5 - dval(eps)) { + while (*--s == '0') ; + s++; + goto ret1; + } + break; + } + } +#ifndef No_leftright + } +#endif +fast_failed: + s = s0; + dval(d) = dval(d2); + k = k0; + ilim = ilim0; + } + + /* Do we have a "small" integer? */ + + if (be >= 0 && k <= Int_max) { + /* Yes. */ + ds = tens[k]; + if (ndigits < 0 && ilim <= 0) { + S = mhi = 0; + if (ilim < 0 || dval(d) <= 5*ds) + goto no_digits; + goto one_digit; + } + for (i = 1;; i++, dval(d) *= 10.) { + L = (Long)(dval(d) / ds); + dval(d) -= L*ds; +#ifdef Check_FLT_ROUNDS + /* If FLT_ROUNDS == 2, L will usually be high by 1 */ + if (dval(d) < 0) { + L--; + dval(d) += ds; + } +#endif + *s++ = '0' + (int)L; + if (!dval(d)) { +#ifdef SET_INEXACT + inexact = 0; +#endif + break; + } + if (i == ilim) { +#ifdef Honor_FLT_ROUNDS + if (mode > 1) + switch (rounding) { + case 0: goto ret1; + case 2: goto bump_up; + } +#endif + dval(d) += dval(d); + if (dval(d) > ds || (dval(d) == ds && (L & 1))) { +bump_up: + while (*--s == '9') + if (s == s0) { + k++; + *s = '0'; + break; + } + ++*s++; + } + break; + } + } + goto ret1; + } + + m2 = b2; + m5 = b5; + mhi = mlo = 0; + if (leftright) { + i = +#ifndef Sudden_Underflow + denorm ? be + (Bias + (P-1) - 1 + 1) : +#endif +#ifdef IBM + 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3); +#else + 1 + P - bbits; +#endif + b2 += i; + s2 += i; + mhi = i2b(1); + } + if (m2 > 0 && s2 > 0) { + i = m2 < s2 ? m2 : s2; + b2 -= i; + m2 -= i; + s2 -= i; + } + if (b5 > 0) { + if (leftright) { + if (m5 > 0) { + mhi = pow5mult(mhi, m5); + b1 = mult(mhi, b); + Bfree(b); + b = b1; + } + if ((j = b5 - m5) != 0) + b = pow5mult(b, j); + } + else + b = pow5mult(b, b5); + } + S = i2b(1); + if (s5 > 0) + S = pow5mult(S, s5); + + /* Check for special case that d is a normalized power of 2. */ + + spec_case = 0; + if ((mode < 2 || leftright) +#ifdef Honor_FLT_ROUNDS + && rounding == 1 +#endif + ) { + if (!word1(d) && !(word0(d) & Bndry_mask) +#ifndef Sudden_Underflow + && word0(d) & (Exp_mask & ~Exp_msk1) +#endif + ) { + /* The special case */ + b2 += Log2P; + s2 += Log2P; + spec_case = 1; + } + } + + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + * + * Perhaps we should just compute leading 28 bits of S once + * and for all and pass them and a shift to quorem, so it + * can do shifts and ors to compute the numerator for q. + */ +#ifdef Pack_32 + if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) != 0) + i = 32 - i; +#else + if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf) != 0) + i = 16 - i; +#endif + if (i > 4) { + i -= 4; + b2 += i; + m2 += i; + s2 += i; + } + else if (i < 4) { + i += 28; + b2 += i; + m2 += i; + s2 += i; + } + if (b2 > 0) + b = lshift(b, b2); + if (s2 > 0) + S = lshift(S, s2); + if (k_check) { + if (cmp(b,S) < 0) { + k--; + b = multadd(b, 10, 0); /* we botched the k estimate */ + if (leftright) + mhi = multadd(mhi, 10, 0); + ilim = ilim1; + } + } + if (ilim <= 0 && (mode == 3 || mode == 5)) { + if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { + /* no digits, fcvt style */ +no_digits: + k = -1 - ndigits; + goto ret; + } +one_digit: + *s++ = '1'; + k++; + goto ret; + } + if (leftright) { + if (m2 > 0) + mhi = lshift(mhi, m2); + + /* Compute mlo -- check for special case + * that d is a normalized power of 2. + */ + + mlo = mhi; + if (spec_case) { + mhi = Balloc(mhi->k); + Bcopy(mhi, mlo); + mhi = lshift(mhi, Log2P); + } + + for (i = 1;;i++) { + dig = quorem(b,S) + '0'; + /* Do we yet have the shortest decimal string + * that will round to d? + */ + j = cmp(b, mlo); + delta = diff(S, mhi); + j1 = delta->sign ? 1 : cmp(b, delta); + Bfree(delta); +#ifndef ROUND_BIASED + if (j1 == 0 && mode != 1 && !(word1(d) & 1) +#ifdef Honor_FLT_ROUNDS + && rounding >= 1 +#endif + ) { + if (dig == '9') + goto round_9_up; + if (j > 0) + dig++; +#ifdef SET_INEXACT + else if (!b->x[0] && b->wds <= 1) + inexact = 0; +#endif + *s++ = dig; + goto ret; + } +#endif + if (j < 0 || (j == 0 && mode != 1 +#ifndef ROUND_BIASED + && !(word1(d) & 1) +#endif + )) { + if (!b->x[0] && b->wds <= 1) { +#ifdef SET_INEXACT + inexact = 0; +#endif + goto accept_dig; + } +#ifdef Honor_FLT_ROUNDS + if (mode > 1) + switch (rounding) { + case 0: goto accept_dig; + case 2: goto keep_dig; + } +#endif /*Honor_FLT_ROUNDS*/ + if (j1 > 0) { + b = lshift(b, 1); + j1 = cmp(b, S); + if ((j1 > 0 || (j1 == 0 && (dig & 1))) && dig++ == '9') + goto round_9_up; + } +accept_dig: + *s++ = dig; + goto ret; + } + if (j1 > 0) { +#ifdef Honor_FLT_ROUNDS + if (!rounding) + goto accept_dig; +#endif + if (dig == '9') { /* possible if i == 1 */ +round_9_up: + *s++ = '9'; + goto roundoff; + } + *s++ = dig + 1; + goto ret; + } +#ifdef Honor_FLT_ROUNDS +keep_dig: +#endif + *s++ = dig; + if (i == ilim) + break; + b = multadd(b, 10, 0); + if (mlo == mhi) + mlo = mhi = multadd(mhi, 10, 0); + else { + mlo = multadd(mlo, 10, 0); + mhi = multadd(mhi, 10, 0); + } + } + } + else + for (i = 1;; i++) { + *s++ = dig = quorem(b,S) + '0'; + if (!b->x[0] && b->wds <= 1) { +#ifdef SET_INEXACT + inexact = 0; +#endif + goto ret; + } + if (i >= ilim) + break; + b = multadd(b, 10, 0); + } + + /* Round off last digit */ + +#ifdef Honor_FLT_ROUNDS + switch (rounding) { + case 0: goto trimzeros; + case 2: goto roundoff; + } +#endif + b = lshift(b, 1); + j = cmp(b, S); + if (j > 0 || (j == 0 && (dig & 1))) { + roundoff: + while (*--s == '9') + if (s == s0) { + k++; + *s++ = '1'; + goto ret; + } + ++*s++; + } + else { + while (*--s == '0') ; + s++; + } +ret: + Bfree(S); + if (mhi) { + if (mlo && mlo != mhi) + Bfree(mlo); + Bfree(mhi); + } +ret1: +#ifdef SET_INEXACT + if (inexact) { + if (!oldinexact) { + word0(d) = Exp_1 + (70 << Exp_shift); + word1(d) = 0; + dval(d) += 1.; + } + } + else if (!oldinexact) + clear_inexact(); +#endif + Bfree(b); + *s = 0; + *decpt = k + 1; + if (rve) + *rve = s; + return s0; +} + +void +ruby_each_words(const char *str, void (*func)(const char*, int, void*), void *arg) +{ + const char *end; + int len; + + if (!str) return; + for (; *str; str = end) { + while (ISSPACE(*str) || *str == ',') str++; + if (!*str) break; + end = str; + while (*end && !ISSPACE(*end) && *end != ',') end++; + len = end - str; + (*func)(str, len, arg); + } +} + +#ifdef __cplusplus +} +#endif +/********************************************************************** + + variable.c - + + $Author: shyouhei $ + $Date: 2009-02-02 03:34:12 +0100 (Mon, 02 Feb 2009) $ + created at: Tue Apr 19 23:55:15 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#include "ruby.h" +#include "env.h" +#include "node.h" +#include "st.h" +#include "util.h" + +st_table *rb_global_tbl; +st_table *rb_class_tbl; +static ID autoload, classpath, tmp_classpath; + +void +Init_var_tables() +{ + rb_global_tbl = st_init_numtable(); + rb_class_tbl = st_init_numtable(); + autoload = rb_intern("__autoload__"); + classpath = rb_intern("__classpath__"); + tmp_classpath = rb_intern("__tmp_classpath__"); +} + +struct fc_result { + ID name; + VALUE klass; + VALUE path; + VALUE track; + struct fc_result *prev; +}; + +static VALUE +fc_path(fc, name) + struct fc_result *fc; + ID name; +{ + VALUE path, tmp; + + path = rb_str_new2(rb_id2name(name)); + while (fc) { + if (fc->track == rb_cObject) break; + if (ROBJECT(fc->track)->iv_tbl && + st_lookup(ROBJECT(fc->track)->iv_tbl, classpath, &tmp)) { + tmp = rb_str_dup(tmp); + rb_str_cat2(tmp, "::"); + rb_str_append(tmp, path); + + return tmp; + } + tmp = rb_str_new2(rb_id2name(fc->name)); + rb_str_cat2(tmp, "::"); + rb_str_append(tmp, path); + path = tmp; + fc = fc->prev; + } + return path; +} + +static int +fc_i(key, value, res) + ID key; + VALUE value; + struct fc_result *res; +{ + if (!rb_is_const_id(key)) return ST_CONTINUE; + + if (value == res->klass) { + res->path = fc_path(res, key); + return ST_STOP; + } + switch (TYPE(value)) { + case T_MODULE: + case T_CLASS: + if (!RCLASS(value)->iv_tbl) return ST_CONTINUE; + else { + struct fc_result arg; + struct fc_result *list; + + list = res; + while (list) { + if (list->track == value) return ST_CONTINUE; + list = list->prev; + } + + arg.name = key; + arg.path = 0; + arg.klass = res->klass; + arg.track = value; + arg.prev = res; + st_foreach_safe(RCLASS(value)->iv_tbl, fc_i, (st_data_t)&arg); + if (arg.path) { + res->path = arg.path; + return ST_STOP; + } + } + break; + + default: + break; + } + return ST_CONTINUE; +} + +static VALUE +find_class_path(klass) + VALUE klass; +{ + struct fc_result arg; + + arg.name = 0; + arg.path = 0; + arg.klass = klass; + arg.track = rb_cObject; + arg.prev = 0; + if (RCLASS(rb_cObject)->iv_tbl) { + st_foreach_safe(RCLASS(rb_cObject)->iv_tbl, fc_i, (st_data_t)&arg); + } + if (arg.path == 0) { + st_foreach(rb_class_tbl, fc_i, (st_data_t)&arg); + } + if (arg.path) { + if (!ROBJECT(klass)->iv_tbl) { + ROBJECT(klass)->iv_tbl = st_init_numtable(); + } + st_insert(ROBJECT(klass)->iv_tbl, classpath, arg.path); + st_delete(RCLASS(klass)->iv_tbl, &tmp_classpath, 0); + return arg.path; + } + return Qnil; +} + +static VALUE +classname(klass) + VALUE klass; +{ + VALUE path = Qnil; + + if (!klass) klass = rb_cObject; + if (ROBJECT(klass)->iv_tbl) { + if (!st_lookup(ROBJECT(klass)->iv_tbl, classpath, &path)) { + ID classid = rb_intern("__classid__"); + + if (!st_lookup(ROBJECT(klass)->iv_tbl, classid, &path)) { + return find_class_path(klass); + } + path = rb_str_new2(rb_id2name(SYM2ID(path))); + st_insert(ROBJECT(klass)->iv_tbl, classpath, path); + st_delete(RCLASS(klass)->iv_tbl, (st_data_t*)&classid, 0); + } + if (TYPE(path) != T_STRING) { + rb_bug("class path is not set properly"); + } + return path; + } + return find_class_path(klass); +} + +/* + * call-seq: + * mod.name => string + * + * Returns the name of the module <i>mod</i>. + */ + +VALUE +rb_mod_name(mod) + VALUE mod; +{ + VALUE path = classname(mod); + + if (!NIL_P(path)) return rb_str_dup(path); + return rb_str_new(0,0); +} + +VALUE +rb_class_path(klass) + VALUE klass; +{ + VALUE path = classname(klass); + + if (!NIL_P(path)) return path; + if (RCLASS(klass)->iv_tbl && st_lookup(RCLASS(klass)->iv_tbl, + tmp_classpath, &path)) { + return path; + } + else { + char *s = "Class"; + size_t len; + + if (TYPE(klass) == T_MODULE) { + if (rb_obj_class(klass) == rb_cModule) { + s = "Module"; + } + else { + s = rb_class2name(RBASIC(klass)->klass); + } + } + len = 2 + strlen(s) + 3 + 2 * SIZEOF_LONG + 1; + path = rb_str_new(0, len); + snprintf(RSTRING(path)->ptr, len+1, "#<%s:0x%lx>", s, klass); + RSTRING(path)->len = strlen(RSTRING(path)->ptr); + rb_ivar_set(klass, tmp_classpath, path); + + return path; + } +} + +void +rb_set_class_path(klass, under, name) + VALUE klass, under; + const char *name; +{ + VALUE str; + + if (under == rb_cObject) { + str = rb_str_new2(name); + } + else { + str = rb_str_dup(rb_class_path(under)); + rb_str_cat2(str, "::"); + rb_str_cat2(str, name); + } + rb_ivar_set(klass, classpath, str); +} + +VALUE +rb_path2class(path) + const char *path; +{ + const char *pbeg, *p; + ID id; + VALUE c = rb_cObject; + VALUE str = 0; + + if (path[0] == '#') { + rb_raise(rb_eArgError, "can't retrieve anonymous class %s", path); + } + pbeg = p = path; + while (*p) { + while (*p && *p != ':') p++; + if (str) { + RSTRING(str)->len = 0; + rb_str_cat(str, pbeg, p-pbeg); + } + else { + str = rb_str_new(pbeg, p-pbeg); + } + id = rb_intern(RSTRING(str)->ptr); + if (p[0] == ':') { + if (p[1] != ':') goto undefined_class; + p += 2; + pbeg = p; + } + if (!rb_const_defined(c, id)) { + undefined_class: + rb_raise(rb_eArgError, "undefined class/module %.*s", p-path, path); + } + c = rb_const_get_at(c, id); + switch (TYPE(c)) { + case T_MODULE: + case T_CLASS: + break; + default: + rb_raise(rb_eTypeError, "%s does not refer class/module", path); + } + } + + return c; +} + +void +rb_name_class(klass, id) + VALUE klass; + ID id; +{ + rb_iv_set(klass, "__classid__", ID2SYM(id)); +} + +VALUE +rb_class_name(klass) + VALUE klass; +{ + return rb_class_path(rb_class_real(klass)); +} + +char * +rb_class2name(klass) + VALUE klass; +{ + return RSTRING(rb_class_name(klass))->ptr; +} + +char * +rb_obj_classname(obj) + VALUE obj; +{ + return rb_class2name(CLASS_OF(obj)); +} + +struct trace_var { + int removed; + void (*func)(); + VALUE data; + struct trace_var *next; +}; + +struct global_variable { + int counter; + void *data; + VALUE (*getter)(); + void (*setter)(); + void (*marker)(); + int block_trace; + struct trace_var *trace; +}; + +struct global_entry { + struct global_variable *var; + ID id; +}; + +static VALUE undef_getter(); +static void undef_setter(); +static void undef_marker(); + +static VALUE val_getter(); +static void val_setter(); +static void val_marker(); + +static VALUE var_getter(); +static void var_setter(); +static void var_marker(); + +struct global_entry* +rb_global_entry(id) + ID id; +{ + struct global_entry *entry; + + if (!st_lookup(rb_global_tbl, id, (st_data_t *)&entry)) { + struct global_variable *var; + entry = ALLOC(struct global_entry); + var = ALLOC(struct global_variable); + entry->id = id; + entry->var = var; + var->counter = 1; + var->data = 0; + var->getter = undef_getter; + var->setter = undef_setter; + var->marker = undef_marker; + + var->block_trace = 0; + var->trace = 0; + st_add_direct(rb_global_tbl, id, (st_data_t)entry); + } + return entry; +} + +static VALUE +undef_getter(id) + ID id; +{ + rb_warning("global variable `%s' not initialized", rb_id2name(id)); + + return Qnil; +} + +static void +undef_setter(val, id, data, var) + VALUE val; + ID id; + void *data; + struct global_variable *var; +{ + var->getter = val_getter; + var->setter = val_setter; + var->marker = val_marker; + + var->data = (void*)val; +} + +static void +undef_marker() +{ +} + +static VALUE +val_getter(id, val) + ID id; + VALUE val; +{ + return val; +} + +static void +val_setter(val, id, data, var) + VALUE val; + ID id; + void *data; + struct global_variable *var; +{ + var->data = (void*)val; +} + +static void +val_marker(data) + VALUE data; +{ + if (data) rb_gc_mark_maybe(data); +} + +static VALUE +var_getter(id, var) + ID id; + VALUE *var; +{ + if (!var) return Qnil; + return *var; +} + +static void +var_setter(val, id, var) + VALUE val; + ID id; + VALUE *var; +{ + *var = val; +} + +static void +var_marker(var) + VALUE *var; +{ + if (var) rb_gc_mark_maybe(*var); +} + +static void +readonly_setter(val, id, var) + VALUE val; + ID id; + void *var; +{ + rb_name_error(id, "%s is a read-only variable", rb_id2name(id)); +} + +static int +mark_global_entry(key, entry) + ID key; + struct global_entry *entry; +{ + struct trace_var *trace; + struct global_variable *var = entry->var; + + (*var->marker)(var->data); + trace = var->trace; + while (trace) { + if (trace->data) rb_gc_mark_maybe(trace->data); + trace = trace->next; + } + return ST_CONTINUE; +} + +void +rb_gc_mark_global_tbl() +{ + if (rb_global_tbl) { + st_foreach(rb_global_tbl, mark_global_entry, 0); + } +} + +static ID +global_id(name) + const char *name; +{ + ID id; + + if (name[0] == '$') id = rb_intern(name); + else { + char *buf = ALLOCA_N(char, strlen(name)+2); + buf[0] = '$'; + strcpy(buf+1, name); + id = rb_intern(buf); + } + return id; +} + +void +rb_define_hooked_variable(name, var, getter, setter) + const char *name; + VALUE *var; + VALUE (*getter)(); + void (*setter)(); +{ + struct global_variable *gvar; + ID id = global_id(name); + + gvar = rb_global_entry(id)->var; + gvar->data = (void*)var; + gvar->getter = getter?getter:var_getter; + gvar->setter = setter?setter:var_setter; + gvar->marker = var_marker; +} + +void +rb_define_variable(name, var) + const char *name; + VALUE *var; +{ + rb_define_hooked_variable(name, var, 0, 0); +} + +void +rb_define_readonly_variable(name, var) + const char *name; + VALUE *var; +{ + rb_define_hooked_variable(name, var, 0, readonly_setter); +} + +void +rb_define_virtual_variable(name, getter, setter) + const char *name; + VALUE (*getter)(); + void (*setter)(); +{ + if (!getter) getter = val_getter; + if (!setter) setter = readonly_setter; + rb_define_hooked_variable(name, 0, getter, setter); +} + +static void +rb_trace_eval(cmd, val) + VALUE cmd, val; +{ + rb_eval_cmd(cmd, rb_ary_new3(1, val), 0); +} + +/* + * call-seq: + * trace_var(symbol, cmd ) => nil + * trace_var(symbol) {|val| block } => nil + * + * Controls tracing of assignments to global variables. The parameter + * +symbol_ identifies the variable (as either a string name or a + * symbol identifier). _cmd_ (which may be a string or a + * +Proc+ object) or block is executed whenever the variable + * is assigned. The block or +Proc+ object receives the + * variable's new value as a parameter. Also see + * <code>Kernel::untrace_var</code>. + * + * trace_var :$_, proc {|v| puts "$_ is now '#{v}'" } + * $_ = "hello" + * $_ = ' there' + * + * <em>produces:</em> + * + * $_ is now 'hello' + * $_ is now ' there' + */ + +VALUE +rb_f_trace_var(argc, argv) + int argc; + VALUE *argv; +{ + VALUE var, cmd; + struct global_entry *entry; + struct trace_var *trace; + + rb_secure(4); + if (rb_scan_args(argc, argv, "11", &var, &cmd) == 1) { + cmd = rb_block_proc(); + } + if (NIL_P(cmd)) { + return rb_f_untrace_var(argc, argv); + } + entry = rb_global_entry(rb_to_id(var)); + if (OBJ_TAINTED(cmd)) { + rb_raise(rb_eSecurityError, "Insecure: tainted variable trace"); + } + trace = ALLOC(struct trace_var); + trace->next = entry->var->trace; + trace->func = rb_trace_eval; + trace->data = cmd; + trace->removed = 0; + entry->var->trace = trace; + + return Qnil; +} + +static void +remove_trace(var) + struct global_variable *var; +{ + struct trace_var *trace = var->trace; + struct trace_var t; + struct trace_var *next; + + t.next = trace; + trace = &t; + while (trace->next) { + next = trace->next; + if (next->removed) { + trace->next = next->next; + free(next); + } + else { + trace = next; + } + } + var->trace = t.next; +} + +/* + * call-seq: + * untrace_var(symbol [, cmd] ) => array or nil + * + * Removes tracing for the specified command on the given global + * variable and returns +nil+. If no command is specified, + * removes all tracing for that variable and returns an array + * containing the commands actually removed. + */ + +VALUE +rb_f_untrace_var(argc, argv) + int argc; + VALUE *argv; +{ + VALUE var, cmd; + ID id; + struct global_entry *entry; + struct trace_var *trace; + + rb_secure(4); + rb_scan_args(argc, argv, "11", &var, &cmd); + id = rb_to_id(var); + if (!st_lookup(rb_global_tbl, id, (st_data_t *)&entry)) { + rb_name_error(id, "undefined global variable %s", rb_id2name(id)); + } + + trace = entry->var->trace; + if (NIL_P(cmd)) { + VALUE ary = rb_ary_new(); + + while (trace) { + struct trace_var *next = trace->next; + rb_ary_push(ary, (VALUE)trace->data); + trace->removed = 1; + trace = next; + } + + if (!entry->var->block_trace) remove_trace(entry->var); + return ary; + } + else { + while (trace) { + if (trace->data == cmd) { + trace->removed = 1; + if (!entry->var->block_trace) remove_trace(entry->var); + return rb_ary_new3(1, cmd); + } + trace = trace->next; + } + } + return Qnil; +} + +VALUE +rb_gvar_get(entry) + struct global_entry *entry; +{ + struct global_variable *var = entry->var; + return (*var->getter)(entry->id, var->data, var); +} + +struct trace_data { + struct trace_var *trace; + VALUE val; +}; + +static VALUE +trace_ev(data) + struct trace_data *data; +{ + struct trace_var *trace = data->trace; + + while (trace) { + (*trace->func)(trace->data, data->val); + trace = trace->next; + } + return Qnil; /* not reached */ +} + +static VALUE +trace_en(var) + struct global_variable *var; +{ + var->block_trace = 0; + remove_trace(var); + return Qnil; /* not reached */ +} + +VALUE +rb_gvar_set(entry, val) + struct global_entry *entry; + VALUE val; +{ + struct trace_data trace; + struct global_variable *var = entry->var; + + if (rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't change global variable value"); + (*var->setter)(val, entry->id, var->data, var); + + if (var->trace && !var->block_trace) { + var->block_trace = 1; + trace.trace = var->trace; + trace.val = val; + rb_ensure(trace_ev, (VALUE)&trace, trace_en, (VALUE)var); + } + return val; +} + +VALUE +rb_gv_set(name, val) + const char *name; + VALUE val; +{ + struct global_entry *entry; + + entry = rb_global_entry(global_id(name)); + return rb_gvar_set(entry, val); +} + +VALUE +rb_gv_get(name) + const char *name; +{ + struct global_entry *entry; + + entry = rb_global_entry(global_id(name)); + return rb_gvar_get(entry); +} + +VALUE +rb_gvar_defined(entry) + struct global_entry *entry; +{ + if (entry->var->getter == undef_getter) return Qfalse; + return Qtrue; +} + +static int +gvar_i(key, entry, ary) + ID key; + struct global_entry *entry; + VALUE ary; +{ + rb_ary_push(ary, rb_str_new2(rb_id2name(key))); + return ST_CONTINUE; +} + +/* + * call-seq: + * global_variables => array + * + * Returns an array of the names of global variables. + * + * global_variables.grep /std/ #=> ["$stderr", "$stdout", "$stdin"] + */ + +VALUE +rb_f_global_variables() +{ + VALUE ary = rb_ary_new(); + char buf[4]; + char *s = "&`'+123456789"; + + st_foreach(rb_global_tbl, gvar_i, ary); + if (!NIL_P(rb_backref_get())) { + while (*s) { + sprintf(buf, "$%c", *s++); + rb_ary_push(ary, rb_str_new2(buf)); + } + } + return ary; +} + +void +rb_alias_variable(name1, name2) + ID name1; + ID name2; +{ + struct global_entry *entry1, *entry2; + + if (rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't alias global variable"); + + entry2 = rb_global_entry(name2); + if (!st_lookup(rb_global_tbl, name1, (st_data_t *)&entry1)) { + entry1 = ALLOC(struct global_entry); + entry1->id = name1; + st_add_direct(rb_global_tbl, name1, (st_data_t)entry1); + } + else if (entry1->var != entry2->var) { + struct global_variable *var = entry1->var; + if (var->block_trace) { + rb_raise(rb_eRuntimeError, "can't alias in tracer"); + } + var->counter--; + if (var->counter == 0) { + struct trace_var *trace = var->trace; + while (trace) { + struct trace_var *next = trace->next; + free(trace); + trace = next; + } + free(var); + } + } + else { + return; + } + entry2->var->counter++; + entry1->var = entry2->var; +} + +static int special_generic_ivar = 0; +static st_table *generic_iv_tbl; + +st_table* +rb_generic_ivar_table(obj) + VALUE obj; +{ + st_table *tbl; + + if (!FL_TEST(obj, FL_EXIVAR)) return 0; + if (!generic_iv_tbl) return 0; + if (!st_lookup(generic_iv_tbl, obj, (st_data_t *)&tbl)) return 0; + return tbl; +} + +static VALUE +generic_ivar_get(obj, id, warn) + VALUE obj; + ID id; + int warn; +{ + st_table *tbl; + VALUE val; + + if (generic_iv_tbl) { + if (st_lookup(generic_iv_tbl, obj, (st_data_t *)&tbl)) { + if (st_lookup(tbl, id, &val)) { + return val; + } + } + } + if (warn) { + rb_warning("instance variable %s not initialized", rb_id2name(id)); + } + return Qnil; +} + +static void +generic_ivar_set(obj, id, val) + VALUE obj; + ID id; + VALUE val; +{ + st_table *tbl; + + if (rb_special_const_p(obj)) { + special_generic_ivar = 1; + } + if (!generic_iv_tbl) { + generic_iv_tbl = st_init_numtable(); + } + + if (!st_lookup(generic_iv_tbl, obj, (st_data_t *)&tbl)) { + FL_SET(obj, FL_EXIVAR); + tbl = st_init_numtable(); + st_add_direct(generic_iv_tbl, obj, (st_data_t)tbl); + st_add_direct(tbl, id, val); + return; + } + st_insert(tbl, id, val); +} + +static VALUE +generic_ivar_defined(obj, id) + VALUE obj; + ID id; +{ + st_table *tbl; + VALUE val; + + if (!generic_iv_tbl) return Qfalse; + if (!st_lookup(generic_iv_tbl, obj, (st_data_t *)&tbl)) return Qfalse; + if (st_lookup(tbl, id, &val)) { + return Qtrue; + } + return Qfalse; +} + +static int +generic_ivar_remove(obj, id, valp) + VALUE obj; + ID id; + VALUE *valp; +{ + st_table *tbl; + int status; + + if (!generic_iv_tbl) return 0; + if (!st_lookup(generic_iv_tbl, obj, (st_data_t *)&tbl)) return 0; + status = st_delete(tbl, &id, valp); + if (tbl->num_entries == 0) { + st_delete(generic_iv_tbl, &obj, (st_data_t *)&tbl); + st_free_table(tbl); + } + return status; +} + +void +rb_mark_generic_ivar(obj) + VALUE obj; +{ + st_table *tbl; + + if (!generic_iv_tbl) return; + if (st_lookup(generic_iv_tbl, obj, (st_data_t *)&tbl)) { + rb_mark_tbl(tbl); + } +} + +static int +givar_mark_i(key, value) + ID key; + VALUE value; +{ + rb_gc_mark(value); + return ST_CONTINUE; +} + +static int +givar_i(obj, tbl) + VALUE obj; + st_table *tbl; +{ + if (rb_special_const_p(obj)) { + st_foreach(tbl, givar_mark_i, 0); + } + return ST_CONTINUE; +} + +void +rb_mark_generic_ivar_tbl() +{ + if (!generic_iv_tbl) return; + if (special_generic_ivar == 0) return; + st_foreach_safe(generic_iv_tbl, givar_i, 0); +} + +void +rb_free_generic_ivar(obj) + VALUE obj; +{ + st_table *tbl; + + if (st_delete(generic_iv_tbl, &obj, (st_data_t *)&tbl)) + st_free_table(tbl); +} + +void +rb_copy_generic_ivar(clone, obj) + VALUE clone, obj; +{ + st_table *tbl; + + if (!generic_iv_tbl) return; + if (st_lookup(generic_iv_tbl, obj, (st_data_t *)&tbl)) { + st_table *old; + + if (st_lookup(generic_iv_tbl, clone, (st_data_t *)&old)) { + st_free_table(old); + st_insert(generic_iv_tbl, clone, (st_data_t)st_copy(tbl)); + } + else { + st_add_direct(generic_iv_tbl, clone, (st_data_t)st_copy(tbl)); + } + } +} + +static VALUE +ivar_get(obj, id, warn) + VALUE obj; + ID id; + int warn; +{ + VALUE val; + + switch (TYPE(obj)) { + case T_OBJECT: + case T_CLASS: + case T_MODULE: + if (ROBJECT(obj)->iv_tbl && st_lookup(ROBJECT(obj)->iv_tbl, id, &val)) + return val; + break; + default: + if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) + return generic_ivar_get(obj, id, warn); + break; + } + if (warn) { + rb_warning("instance variable %s not initialized", rb_id2name(id)); + } + return Qnil; +} + +VALUE +rb_ivar_get(obj, id) + VALUE obj; + ID id; +{ + return ivar_get(obj, id, Qtrue); +} + +VALUE +rb_attr_get(obj, id) + VALUE obj; + ID id; +{ + return ivar_get(obj, id, Qfalse); +} + +VALUE +rb_ivar_set(obj, id, val) + VALUE obj; + ID id; + VALUE val; +{ + if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable"); + if (OBJ_FROZEN(obj)) rb_error_frozen("object"); + switch (TYPE(obj)) { + case T_OBJECT: + case T_CLASS: + case T_MODULE: + if (!ROBJECT(obj)->iv_tbl) ROBJECT(obj)->iv_tbl = st_init_numtable(); + st_insert(ROBJECT(obj)->iv_tbl, id, val); + break; + default: + generic_ivar_set(obj, id, val); + break; + } + return val; +} + +VALUE +rb_ivar_defined(obj, id) + VALUE obj; + ID id; +{ + switch (TYPE(obj)) { + case T_OBJECT: + case T_CLASS: + case T_MODULE: + if (ROBJECT(obj)->iv_tbl && st_lookup(ROBJECT(obj)->iv_tbl, id, 0)) + return Qtrue; + break; + default: + if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) + return generic_ivar_defined(obj, id); + break; + } + return Qfalse; +} + +static int +ivar_i(key, entry, ary) + ID key; + struct global_entry *entry; + VALUE ary; +{ + if (rb_is_instance_id(key)) { + rb_ary_push(ary, rb_str_new2(rb_id2name(key))); + } + return ST_CONTINUE; +} + +/* + * call-seq: + * obj.instance_variables => array + * + * Returns an array of instance variable names for the receiver. Note + * that simply defining an accessor does not create the corresponding + * instance variable. + * + * class Fred + * attr_accessor :a1 + * def initialize + * @iv = 3 + * end + * end + * Fred.new.instance_variables #=> ["@iv"] + */ + +VALUE +rb_obj_instance_variables(obj) + VALUE obj; +{ + VALUE ary; + + ary = rb_ary_new(); + switch (TYPE(obj)) { + case T_OBJECT: + case T_CLASS: + case T_MODULE: + if (ROBJECT(obj)->iv_tbl) { + st_foreach_safe(ROBJECT(obj)->iv_tbl, ivar_i, ary); + } + break; + default: + if (!generic_iv_tbl) break; + if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) { + st_table *tbl; + + if (st_lookup(generic_iv_tbl, obj, (st_data_t *)&tbl)) { + st_foreach_safe(tbl, ivar_i, ary); + } + } + break; + } + return ary; +} + +/* + * call-seq: + * obj.remove_instance_variable(symbol) => obj + * + * Removes the named instance variable from <i>obj</i>, returning that + * variable's value. + * + * class Dummy + * attr_reader :var + * def initialize + * @var = 99 + * end + * def remove + * remove_instance_variable(:@var) + * end + * end + * d = Dummy.new + * d.var #=> 99 + * d.remove #=> 99 + * d.var #=> nil + */ + +VALUE +rb_obj_remove_instance_variable(obj, name) + VALUE obj, name; +{ + VALUE val = Qnil; + ID id = rb_to_id(name); + + if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify instance variable"); + if (OBJ_FROZEN(obj)) rb_error_frozen("object"); + if (!rb_is_instance_id(id)) { + rb_name_error(id, "`%s' is not allowed as an instance variable name", rb_id2name(id)); + } + + switch (TYPE(obj)) { + case T_OBJECT: + case T_CLASS: + case T_MODULE: + if (ROBJECT(obj)->iv_tbl && st_delete(ROBJECT(obj)->iv_tbl, (st_data_t*)&id, &val)) { + return val; + } + break; + default: + if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) { + if (generic_ivar_remove(obj, id, &val)) { + return val; + } + } + break; + } + rb_name_error(id, "instance variable %s not defined", rb_id2name(id)); + return Qnil; /* not reached */ +} + +NORETURN(static void uninitialized_constant _((VALUE, ID))); +static void +uninitialized_constant(klass, id) + VALUE klass; + ID id; +{ + if (klass && klass != rb_cObject) + rb_name_error(id, "uninitialized constant %s::%s", + rb_class2name(klass), + rb_id2name(id)); + else { + rb_name_error(id, "uninitialized constant %s", rb_id2name(id)); + } +} + +static VALUE +const_missing(klass, id) + VALUE klass; + ID id; +{ + return rb_funcall(klass, rb_intern("const_missing"), 1, ID2SYM(id)); +} + + +/* + * call-seq: + * mod.const_missing(sym) => obj + * + * Invoked when a reference is made to an undefined constant in + * <i>mod</i>. It is passed a symbol for the undefined constant, and + * returns a value to be used for that constant. The + * following code is a (very bad) example: if reference is made to + * an undefined constant, it attempts to load a file whose name is + * the lowercase version of the constant (thus class <code>Fred</code> is + * assumed to be in file <code>fred.rb</code>). If found, it returns the + * value of the loaded class. It therefore implements a perverse + * kind of autoload facility. + * + * def Object.const_missing(name) + * @looked_for ||= {} + * str_name = name.to_s + * raise "Class not found: #{name}" if @looked_for[str_name] + * @looked_for[str_name] = 1 + * file = str_name.downcase + * require file + * klass = const_get(name) + * return klass if klass + * raise "Class not found: #{name}" + * end + * + */ + +VALUE +rb_mod_const_missing(klass, name) + VALUE klass, name; +{ + ruby_frame = ruby_frame->prev; /* pop frame for "const_missing" */ + uninitialized_constant(klass, rb_to_id(name)); + return Qnil; /* not reached */ +} + +static struct st_table * +check_autoload_table(av) + VALUE av; +{ + Check_Type(av, T_DATA); + if (RDATA(av)->dmark != (RUBY_DATA_FUNC)rb_mark_tbl || + RDATA(av)->dfree != (RUBY_DATA_FUNC)st_free_table) { + rb_raise(rb_eTypeError, "wrong autoload table: %s", RSTRING(rb_inspect(av))->ptr); + } + return (struct st_table *)DATA_PTR(av); +} + +void +rb_autoload(mod, id, file) + VALUE mod; + ID id; + const char *file; +{ + VALUE av, fn; + struct st_table *tbl; + + if (!rb_is_const_id(id)) { + rb_raise(rb_eNameError, "autoload must be constant name", rb_id2name(id)); + } + if (!file || !*file) { + rb_raise(rb_eArgError, "empty file name"); + } + + if ((tbl = RCLASS(mod)->iv_tbl) && st_lookup(tbl, id, &av) && av != Qundef) + return; + + rb_const_set(mod, id, Qundef); + tbl = RCLASS(mod)->iv_tbl; + if (st_lookup(tbl, autoload, &av)) { + tbl = check_autoload_table(av); + } + else { + av = Data_Wrap_Struct(0 , rb_mark_tbl, st_free_table, 0); + st_add_direct(tbl, autoload, av); + DATA_PTR(av) = tbl = st_init_numtable(); + } + fn = rb_str_new2(file); + FL_UNSET(fn, FL_TAINT); + OBJ_FREEZE(fn); + st_insert(tbl, id, (st_data_t)rb_node_newnode(NODE_MEMO, fn, ruby_safe_level, 0)); +} + +static NODE* +autoload_delete(mod, id) + VALUE mod; + ID id; +{ + VALUE val; + st_data_t load = 0; + + st_delete(RCLASS(mod)->iv_tbl, (st_data_t*)&id, 0); + if (st_lookup(RCLASS(mod)->iv_tbl, autoload, &val)) { + struct st_table *tbl = check_autoload_table(val); + + st_delete(tbl, (st_data_t*)&id, &load); + + if (tbl->num_entries == 0) { + id = autoload; + st_delete(RCLASS(mod)->iv_tbl, (st_data_t*)&id, &val); + } + } + + return (NODE *)load; +} + +VALUE +rb_autoload_load(klass, id) + VALUE klass; + ID id; +{ + VALUE file; + NODE *load = autoload_delete(klass, id); + + if (!load || !(file = load->nd_lit) || rb_provided(RSTRING(file)->ptr)) { + return Qfalse; + } + return rb_require_safe(file, load->nd_nth); +} + +static VALUE +autoload_file(mod, id) + VALUE mod; + ID id; +{ + VALUE val, file; + struct st_table *tbl; + st_data_t load; + + if (!st_lookup(RCLASS(mod)->iv_tbl, autoload, &val) || + !(tbl = check_autoload_table(val)) || !st_lookup(tbl, id, &load)) { + return Qnil; + } + file = ((NODE *)load)->nd_lit; + Check_Type(file, T_STRING); + if (!RSTRING(file)->ptr || !*RSTRING(file)->ptr) { + rb_raise(rb_eArgError, "empty file name"); + } + if (!rb_provided(RSTRING(file)->ptr)) { + return file; + } + + /* already loaded but not defined */ + st_delete(tbl, (st_data_t*)&id, 0); + if (!tbl->num_entries) { + id = autoload; + st_delete(RCLASS(mod)->iv_tbl, (st_data_t*)&id, &val); + } + return Qnil; +} + +VALUE +rb_autoload_p(mod, id) + VALUE mod; + ID id; +{ + struct st_table *tbl = RCLASS(mod)->iv_tbl; + VALUE val; + + if (!tbl || !st_lookup(tbl, id, &val) || val != Qundef) { + return Qnil; + } + return autoload_file(mod, id); +} + +static VALUE +rb_const_get_0(klass, id, exclude, recurse) + VALUE klass; + ID id; + int exclude, recurse; +{ + VALUE value, tmp; + int mod_retry = 0; + + tmp = klass; + retry: + while (tmp) { + while (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) { + if (value == Qundef) { + if (!RTEST(rb_autoload_load(tmp, id))) break; + continue; + } + if (exclude && tmp == rb_cObject && klass != rb_cObject) { + rb_warn("toplevel constant %s referenced by %s::%s", + rb_id2name(id), rb_class2name(klass), rb_id2name(id)); + } + return value; + } + if (!recurse && klass != rb_cObject) break; + tmp = RCLASS(tmp)->super; + } + if (!exclude && !mod_retry && BUILTIN_TYPE(klass) == T_MODULE) { + mod_retry = 1; + tmp = rb_cObject; + goto retry; + } + + return const_missing(klass, id); +} + +VALUE +rb_const_get_from(klass, id) + VALUE klass; + ID id; +{ + return rb_const_get_0(klass, id, Qtrue, Qtrue); +} + +VALUE +rb_const_get(klass, id) + VALUE klass; + ID id; +{ + return rb_const_get_0(klass, id, Qfalse, Qtrue); +} + +VALUE +rb_const_get_at(klass, id) + VALUE klass; + ID id; +{ + return rb_const_get_0(klass, id, Qtrue, Qfalse); +} + +/* + * call-seq: + * remove_const(sym) => obj + * + * Removes the definition of the given constant, returning that + * constant's value. Predefined classes and singleton objects (such as + * <i>true</i>) cannot be removed. + */ + +VALUE +rb_mod_remove_const(mod, name) + VALUE mod, name; +{ + ID id = rb_to_id(name); + VALUE val; + + if (!rb_is_const_id(id)) { + rb_name_error(id, "`%s' is not allowed as a constant name", rb_id2name(id)); + } + if (!OBJ_TAINTED(mod) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't remove constant"); + if (OBJ_FROZEN(mod)) rb_error_frozen("class/module"); + + if (RCLASS(mod)->iv_tbl && st_delete(ROBJECT(mod)->iv_tbl, (st_data_t*)&id, &val)) { + if (val == Qundef) { + autoload_delete(mod, id); + val = Qnil; + } + return val; + } + if (rb_const_defined_at(mod, id)) { + rb_name_error(id, "cannot remove %s::%s", + rb_class2name(mod), rb_id2name(id)); + } + rb_name_error(id, "constant %s::%s not defined", + rb_class2name(mod), rb_id2name(id)); + return Qnil; /* not reached */ +} + +static int +sv_i(key, value, tbl) + ID key; + VALUE value; + st_table *tbl; +{ + if (rb_is_const_id(key)) { + if (!st_lookup(tbl, key, 0)) { + st_insert(tbl, key, key); + } + } + return ST_CONTINUE; +} + +void* +rb_mod_const_at(mod, data) + VALUE mod; + void *data; +{ + st_table *tbl = data; + if (!tbl) { + tbl = st_init_numtable(); + } + if (RCLASS(mod)->iv_tbl) { + st_foreach_safe(RCLASS(mod)->iv_tbl, sv_i, (st_data_t)tbl); + } + return tbl; +} + +void* +rb_mod_const_of(mod, data) + VALUE mod; + void *data; +{ + VALUE tmp = mod; + for (;;) { + data = rb_mod_const_at(tmp, data); + tmp = RCLASS(tmp)->super; + if (!tmp) break; + if (tmp == rb_cObject && mod != rb_cObject) break; + } + return data; +} + +static int +list_i(key, value, ary) + ID key, value; + VALUE ary; +{ + rb_ary_push(ary, rb_str_new2(rb_id2name(key))); + return ST_CONTINUE; +} + +VALUE +rb_const_list(data) + void *data; +{ + st_table *tbl = data; + VALUE ary; + + if (!tbl) return rb_ary_new2(0); + ary = rb_ary_new2(tbl->num_entries); + st_foreach(tbl, list_i, ary); + st_free_table(tbl); + + return ary; +} + +/* + * call-seq: + * mod.constants => array + * + * Returns an array of the names of the constants accessible in + * <i>mod</i>. This includes the names of constants in any included + * modules (example at start of section). + */ + +VALUE +rb_mod_constants(mod) + VALUE mod; +{ + return rb_const_list(rb_mod_const_of(mod, 0)); +} + +static int +rb_const_defined_0(klass, id, exclude, recurse) + VALUE klass; + ID id; + int exclude, recurse; +{ + VALUE value, tmp; + int mod_retry = 0; + + tmp = klass; + retry: + while (tmp) { + if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl, id, &value)) { + if (value == Qundef && NIL_P(autoload_file(klass, id))) + return Qfalse; + return Qtrue; + } + if (!recurse && klass != rb_cObject) break; + tmp = RCLASS(tmp)->super; + } + if (!exclude && !mod_retry && BUILTIN_TYPE(klass) == T_MODULE) { + mod_retry = 1; + tmp = rb_cObject; + goto retry; + } + return Qfalse; +} + +int +rb_const_defined_from(klass, id) + VALUE klass; + ID id; +{ + return rb_const_defined_0(klass, id, Qtrue, Qtrue); +} + +int +rb_const_defined(klass, id) + VALUE klass; + ID id; +{ + return rb_const_defined_0(klass, id, Qfalse, Qtrue); +} + +int +rb_const_defined_at(klass, id) + VALUE klass; + ID id; +{ + return rb_const_defined_0(klass, id, Qtrue, Qfalse); +} + +static void +mod_av_set(klass, id, val, isconst) + VALUE klass; + ID id; + VALUE val; + int isconst; +{ + char *dest = isconst ? "constant" : "class variable"; + + if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest); + if (OBJ_FROZEN(klass)) { + if (BUILTIN_TYPE(klass) == T_MODULE) { + rb_error_frozen("module"); + } + else { + rb_error_frozen("class"); + } + } + if (!RCLASS(klass)->iv_tbl) { + RCLASS(klass)->iv_tbl = st_init_numtable(); + } + else if (isconst) { + VALUE value = Qfalse; + + if (st_lookup(RCLASS(klass)->iv_tbl, id, &value)) { + if (value == Qundef) + autoload_delete(klass, id); + else + rb_warn("already initialized %s %s", dest, rb_id2name(id)); + } + } + + st_insert(RCLASS(klass)->iv_tbl, id, val); +} + +void +rb_const_set(klass, id, val) + VALUE klass; + ID id; + VALUE val; +{ + if (NIL_P(klass)) { + rb_raise(rb_eTypeError, "no class/module to define constant %s", + rb_id2name(id)); + } + mod_av_set(klass, id, val, Qtrue); +} + +void +rb_define_const(klass, name, val) + VALUE klass; + const char *name; + VALUE val; +{ + ID id = rb_intern(name); + + if (!rb_is_const_id(id)) { + rb_warn("rb_define_const: invalid name `%s' for constant", name); + } + if (klass == rb_cObject) { + rb_secure(4); + } + rb_const_set(klass, id, val); +} + +void +rb_define_global_const(name, val) + const char *name; + VALUE val; +{ + rb_define_const(rb_cObject, name, val); +} + +static VALUE +original_module(c) + VALUE c; +{ + if (TYPE(c) == T_ICLASS) + return RBASIC(c)->klass; + return c; +} + +static void +cvar_override_check(id, a) + ID id; + VALUE a; +{ + VALUE base = original_module(a); + + a = RCLASS(a)->super; + while (a) { + if (RCLASS(a)->iv_tbl) { + if (st_lookup(RCLASS(a)->iv_tbl,id,0)) { + rb_warning("class variable %s of %s is overridden by %s", + rb_id2name(id), rb_class2name(original_module(a)), + rb_class2name(base)); + } + } + a = RCLASS(a)->super; + } +} + +void +rb_cvar_set(klass, id, val, warn) + VALUE klass; + ID id; + VALUE val; + int warn; +{ + VALUE tmp; + + tmp = klass; + while (tmp) { + if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) { + if (OBJ_FROZEN(tmp)) rb_error_frozen("class/module"); + if (!OBJ_TAINTED(tmp) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't modify class variable"); + if (warn && RTEST(ruby_verbose) && klass != tmp) { + rb_warning("already initialized class variable %s", rb_id2name(id)); + } + st_insert(RCLASS(tmp)->iv_tbl,id,val); + if (RTEST(ruby_verbose)) { + cvar_override_check(id, tmp); + } + return; + } + tmp = RCLASS(tmp)->super; + } + + mod_av_set(klass, id, val, Qfalse); +} + +VALUE +rb_cvar_get(klass, id) + VALUE klass; + ID id; +{ + VALUE value; + VALUE tmp; + + tmp = klass; + while (tmp) { + if (RCLASS(tmp)->iv_tbl) { + if (st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) { + if (RTEST(ruby_verbose)) { + cvar_override_check(id, tmp); + } + return value; + } + } + tmp = RCLASS(tmp)->super; + } + + rb_name_error(id,"uninitialized class variable %s in %s", + rb_id2name(id), rb_class2name(klass)); + return Qnil; /* not reached */ +} + +VALUE +rb_cvar_defined(klass, id) + VALUE klass; + ID id; +{ + VALUE tmp; + + tmp = klass; + while (tmp) { + if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) { + return Qtrue; + } + tmp = RCLASS(tmp)->super; + } + + return Qfalse; +} + +void +rb_cv_set(klass, name, val) + VALUE klass; + const char *name; + VALUE val; +{ + ID id = rb_intern(name); + if (!rb_is_class_id(id)) { + rb_name_error(id, "wrong class variable name %s", name); + } + rb_cvar_set(klass, id, val, Qfalse); +} + +VALUE +rb_cv_get(klass, name) + VALUE klass; + const char *name; +{ + ID id = rb_intern(name); + if (!rb_is_class_id(id)) { + rb_name_error(id, "wrong class variable name %s", name); + } + return rb_cvar_get(klass, id); +} + +void +rb_define_class_variable(klass, name, val) + VALUE klass; + const char *name; + VALUE val; +{ + ID id = rb_intern(name); + + if (!rb_is_class_id(id)) { + rb_name_error(id, "wrong class variable name %s", name); + } + rb_cvar_set(klass, id, val, Qtrue); +} + +static int +cv_i(key, value, ary) + ID key; + VALUE value; + VALUE ary; +{ + if (rb_is_class_id(key)) { + VALUE kval = rb_str_new2(rb_id2name(key)); + if (!rb_ary_includes(ary, kval)) { + rb_ary_push(ary, kval); + } + } + return ST_CONTINUE; +} + +/* + * call-seq: + * mod.class_variables => array + * + * Returns an array of the names of class variables in <i>mod</i> and + * the ancestors of <i>mod</i>. + * + * class One + * @@var1 = 1 + * end + * class Two < One + * @@var2 = 2 + * end + * One.class_variables #=> ["@@var1"] + * Two.class_variables #=> ["@@var2", "@@var1"] + */ + +VALUE +rb_mod_class_variables(obj) + VALUE obj; +{ + VALUE ary = rb_ary_new(); + + for (;;) { + if (RCLASS(obj)->iv_tbl) { + st_foreach_safe(RCLASS(obj)->iv_tbl, cv_i, ary); + } + obj = RCLASS(obj)->super; + if (!obj) break; + } + return ary; +} + +/* + * call-seq: + * remove_class_variable(sym) => obj + * + * Removes the definition of the <i>sym</i>, returning that + * constant's value. + * + * class Dummy + * @@var = 99 + * puts @@var + * remove_class_variable(:@@var) + * puts(defined? @@var) + * end + * + * <em>produces:</em> + * + * 99 + * nil + */ + +VALUE +rb_mod_remove_cvar(mod, name) + VALUE mod, name; +{ + ID id = rb_to_id(name); + VALUE val; + + if (!rb_is_class_id(id)) { + rb_name_error(id, "wrong class variable name %s", rb_id2name(id)); + } + if (!OBJ_TAINTED(mod) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: can't remove class variable"); + if (OBJ_FROZEN(mod)) rb_error_frozen("class/module"); + + if (RCLASS(mod)->iv_tbl && st_delete(ROBJECT(mod)->iv_tbl, (st_data_t*)&id, &val)) { + return val; + } + if (rb_cvar_defined(mod, id)) { + rb_name_error(id, "cannot remove %s for %s", + rb_id2name(id), rb_class2name(mod)); + } + rb_name_error(id, "class variable %s not defined for %s", + rb_id2name(id), rb_class2name(mod)); + return Qnil; /* not reached */ +} + +VALUE +rb_iv_get(obj, name) + VALUE obj; + const char *name; +{ + ID id = rb_intern(name); + + return rb_ivar_get(obj, id); +} + +VALUE +rb_iv_set(obj, name, val) + VALUE obj; + const char *name; + VALUE val; +{ + ID id = rb_intern(name); + + return rb_ivar_set(obj, id, val); +} +/********************************************************************** + + version.c - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Thu Sep 30 20:08:01 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#include "ruby.h" +#include "version.h" +#include <stdio.h> + +const char ruby_version[] = RUBY_VERSION; +const char ruby_release_date[] = RUBY_RELEASE_DATE; +const char ruby_platform[] = RUBY_PLATFORM; +const int ruby_patchlevel = RUBY_PATCHLEVEL; + +void +Init_version() +{ + VALUE v = rb_obj_freeze(rb_str_new2(ruby_version)); + VALUE d = rb_obj_freeze(rb_str_new2(ruby_release_date)); + VALUE p = rb_obj_freeze(rb_str_new2(ruby_platform)); + + rb_define_global_const("RUBY_VERSION", v); + rb_define_global_const("RUBY_RELEASE_DATE", d); + rb_define_global_const("RUBY_PLATFORM", p); + rb_define_global_const("RUBY_PATCHLEVEL", INT2FIX(RUBY_PATCHLEVEL)); + + /* obsolete constants */ + rb_define_global_const("VERSION", v); + rb_define_global_const("RELEASE_DATE", d); + rb_define_global_const("PLATFORM", p); +} + +void +ruby_show_version() +{ + printf("ruby %s (%s patchlevel %d) [%s]\n", RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PATCHLEVEL, RUBY_PLATFORM); + fflush(stdout); +} + +void +ruby_show_copyright() +{ + printf("ruby - Copyright (C) 1993-%d Yukihiro Matsumoto\n", RUBY_RELEASE_YEAR); + exit(0); +} +#define PACKAGE_NAME "" +#define PACKAGE_TARNAME "" +#define PACKAGE_VERSION "" +#define PACKAGE_STRING "" +#define PACKAGE_BUGREPORT "" +#define USE_BUILTIN_FRAME_ADDRESS 1 +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_LONG_LONG 1 +#define HAVE_OFF_T 1 +#define SIZEOF_INT 4 +#define SIZEOF_SHORT 2 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF___INT64 0 +#define SIZEOF_OFF_T 8 +#define SIZEOF_VOIDP 4 +#define SIZEOF_FLOAT 4 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_TIME_T 4 +#define rb_pid_t pid_t +#define rb_gid_t gid_t +#define rb_uid_t uid_t +#define HAVE_PROTOTYPES 1 +#define TOKEN_PASTE(x,y) x##y +#define HAVE_STDARG_PROTOTYPES 1 +#define NORETURN(x) __attribute__ ((noreturn)) x +#define NOINLINE(x) __attribute__ ((noinline)) x +#define HAVE_DECL_SYS_NERR 1 +#define HAVE_LIBDL 1 +#define HAVE_DIRENT_H 1 +#define STDC_HEADERS 1 +#define HAVE_SYS_WAIT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_SYS_FILE_H 1 +#define HAVE_SYS_IOCTL_H 1 +#define HAVE_SYS_SYSCALL_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_SYS_FCNTL_H 1 +#define HAVE_SYS_SELECT_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_SYS_TIMES_H 1 +#define HAVE_SYS_PARAM_H 1 +#define HAVE_PWD_H 1 +#define HAVE_GRP_H 1 +#define HAVE_UTIME_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_SYS_RESOURCE_H 1 +#define HAVE_NETINET_IN_SYSTM_H 1 +#define HAVE_FLOAT_H 1 +#define HAVE_PTHREAD_H 1 +#define HAVE_UCONTEXT_H 1 +#define SIZEOF_RLIM_T 8 +#define HAVE_STRUCT_STAT_ST_BLKSIZE 1 +#define HAVE_ST_BLKSIZE 1 +#define HAVE_STRUCT_STAT_ST_BLOCKS 1 +#define HAVE_ST_BLOCKS 1 +#define HAVE_STRUCT_STAT_ST_RDEV 1 +#define HAVE_ST_RDEV 1 +#define GETGROUPS_T gid_t +#define RETSIGTYPE void +#define HAVE_ALLOCA_H 1 +#define HAVE_ALLOCA 1 +#define HAVE_FSEEKO 1 +#define HAVE_FTELLO 1 +#define HAVE_DUP2 1 +#define HAVE_MEMMOVE 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_STRERROR 1 +#define HAVE_STRFTIME 1 +#define HAVE_STRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOUL 1 +#define HAVE_CRYPT 1 +#define HAVE_FLOCK 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_ISNAN 1 +#define HAVE_FINITE 1 +#define HAVE_ISINF 1 +#define HAVE_HYPOT 1 +#define HAVE_ACOSH 1 +#define HAVE_ERF 1 +#define HAVE_FMOD 1 +#define HAVE_KILLPG 1 +#define HAVE_WAIT4 1 +#define HAVE_WAITPID 1 +#define HAVE_SYSCALL 1 +#define HAVE_CHROOT 1 +#define HAVE_FSYNC 1 +#define HAVE_GETCWD 1 +#define HAVE_TRUNCATE 1 +#define HAVE_FTRUNCATE 1 +#define HAVE_TIMES 1 +#define HAVE_UTIMES 1 +#define HAVE_FCNTL 1 +#define HAVE_LOCKF 1 +#define HAVE_LSTAT 1 +#define HAVE_SYMLINK 1 +#define HAVE_LINK 1 +#define HAVE_READLINK 1 +#define HAVE_SETITIMER 1 +#define HAVE_SETRUID 1 +#define HAVE_SETEUID 1 +#define HAVE_SETREUID 1 +#define HAVE_SETRGID 1 +#define HAVE_SETEGID 1 +#define HAVE_SETREGID 1 +#define HAVE_ISSETUGID 1 +#define HAVE_PAUSE 1 +#define HAVE_LCHOWN 1 +#define HAVE_LCHMOD 1 +#define HAVE_GETPGRP 1 +#define HAVE_SETPGRP 1 +#define HAVE_GETPGID 1 +#define HAVE_SETPGID 1 +#define HAVE_INITGROUPS 1 +#define HAVE_GETGROUPS 1 +#define HAVE_SETGROUPS 1 +#define HAVE_GETPRIORITY 1 +#define HAVE_GETRLIMIT 1 +#define HAVE_SETRLIMIT 1 +#define HAVE_SYSCONF 1 +#define HAVE_DLOPEN 1 +#define HAVE_SIGPROCMASK 1 +#define HAVE_SIGACTION 1 +#define HAVE__SETJMP 1 +#define HAVE_SETSID 1 +#define HAVE_TELLDIR 1 +#define HAVE_SEEKDIR 1 +#define HAVE_FCHMOD 1 +#define HAVE_MKTIME 1 +#define HAVE_TIMEGM 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_COSH 1 +#define HAVE_SINH 1 +#define HAVE_TANH 1 +#define HAVE_ROUND 1 +#define HAVE_SETUID 1 +#define HAVE_SETGID 1 +#define HAVE_SETENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_STRUCT_TM_TM_ZONE 1 +#define HAVE_TM_ZONE 1 +#define HAVE_STRUCT_TM_TM_GMTOFF 1 +#define HAVE_DAYLIGHT 1 +#define HAVE_VAR_TIMEZONE 1 +#define TYPEOF_VAR_TIMEZONE long +#define NEGATIVE_TIME_T 1 +#define POSIX_SIGNAL 1 +#define GETPGRP_VOID 1 +#define SETPGRP_VOID 1 +#define RSHIFT(x,y) ((x)>>(int)y) +#define FILE_COUNT _r +#define FILE_READPTR _p +#define NEED_IO_SEEK_BETWEEN_RW 1 +#define HAVE__SC_CLK_TCK 1 +#define STACK_GROW_DIRECTION -1 +#define DEFAULT_KCODE KCODE_NONE +#define DLEXT_MAXLEN 7 +#define DLEXT ".bundle" +#define RUBY_LIB "/usr/local/lib/ruby/1.8" +#define RUBY_SITE_LIB "/usr/local/lib/ruby/site_ruby" +#define RUBY_SITE_LIB2 "/usr/local/lib/ruby/site_ruby/1.8" +#define RUBY_PLATFORM "i686-darwin9.8.0" +#define RUBY_ARCHLIB "/usr/local/lib/ruby/1.8/i686-darwin9.8.0" +#define RUBY_SITE_ARCHLIB "/usr/local/lib/ruby/site_ruby/1.8/i686-darwin9.8.0" +/************************************************ + + defines.h - + + $Author: shyouhei $ + $Date: 2008-06-15 16:06:16 +0200 (Sun, 15 Jun 2008) $ + created at: Wed May 18 00:21:44 JST 1994 + +************************************************/ +#ifndef DEFINES_H +#define DEFINES_H + +#define RUBY + +#ifdef __cplusplus +# ifndef HAVE_PROTOTYPES +# define HAVE_PROTOTYPES 1 +# endif +# ifndef HAVE_STDARG_PROTOTYPES +# define HAVE_STDARG_PROTOTYPES 1 +# endif +#endif + +#undef _ +#ifdef HAVE_PROTOTYPES +# define _(args) args +#else +# define _(args) () +#endif + +#undef __ +#ifdef HAVE_STDARG_PROTOTYPES +# define __(args) args +#else +# define __(args) () +#endif + +#ifdef __cplusplus +#define ANYARGS ... +#else +#define ANYARGS +#endif + +#define xmalloc ruby_xmalloc +#define xcalloc ruby_xcalloc +#define xrealloc ruby_xrealloc +#define xfree ruby_xfree + +void *xmalloc _((long)); +void *xcalloc _((long,long)); +void *xrealloc _((void*,long)); +void xfree _((void*)); + +#if SIZEOF_LONG_LONG > 0 +# define LONG_LONG long long +#elif SIZEOF___INT64 > 0 +# define HAVE_LONG_LONG 1 +# define LONG_LONG __int64 +# undef SIZEOF_LONG_LONG +# define SIZEOF_LONG_LONG SIZEOF___INT64 +#endif + +#if SIZEOF_INT*2 <= SIZEOF_LONG_LONG +# define BDIGIT unsigned int +# define SIZEOF_BDIGITS SIZEOF_INT +# define BDIGIT_DBL unsigned LONG_LONG +# define BDIGIT_DBL_SIGNED LONG_LONG +#elif SIZEOF_INT*2 <= SIZEOF_LONG +# define BDIGIT unsigned int +# define SIZEOF_BDIGITS SIZEOF_INT +# define BDIGIT_DBL unsigned long +# define BDIGIT_DBL_SIGNED long +#elif SIZEOF_SHORT*2 <= SIZEOF_LONG +# define BDIGIT unsigned short +# define SIZEOF_BDIGITS SIZEOF_SHORT +# define BDIGIT_DBL unsigned long +# define BDIGIT_DBL_SIGNED long +#else +# define BDIGIT unsigned short +# define SIZEOF_BDIGITS (SIZEOF_LONG/2) +# define BDIGIT_DBL unsigned long +# define BDIGIT_DBL_SIGNED long +#endif + +#ifdef __CYGWIN__ +#undef _WIN32 +#endif + +#if defined(MSDOS) || defined(_WIN32) || defined(__human68k__) || defined(__EMX__) +#define DOSISH 1 +#ifndef _WIN32_WCE +# define DOSISH_DRIVE_LETTER +#endif +#endif + +/* define RUBY_USE_EUC/SJIS for default kanji-code */ +#ifndef DEFAULT_KCODE +#if defined(DOSISH) || defined(__CYGWIN__) || defined(__MACOS__) || defined(OS2) +#define DEFAULT_KCODE KCODE_SJIS +#else +#define DEFAULT_KCODE KCODE_EUC +#endif +#endif + +#ifdef __NeXT__ +/* NextStep, OpenStep, Rhapsody */ +#ifndef S_IRUSR +#define S_IRUSR 0000400 /* read permission, owner */ +#endif +#ifndef S_IRGRP +#define S_IRGRP 0000040 /* read permission, group */ +#endif +#ifndef S_IROTH +#define S_IROTH 0000004 /* read permission, other */ +#endif +#ifndef S_IWUSR +#define S_IWUSR 0000200 /* write permission, owner */ +#endif +#ifndef S_IWGRP +#define S_IWGRP 0000020 /* write permission, group */ +#endif +#ifndef S_IWOTH +#define S_IWOTH 0000002 /* write permission, other */ +#endif +#ifndef S_IXUSR +#define S_IXUSR 0000100 /* execute/search permission, owner */ +#endif +#ifndef S_IXGRP +#define S_IXGRP 0000010 /* execute/search permission, group */ +#endif +#ifndef S_IXOTH +#define S_IXOTH 0000001 /* execute/search permission, other */ +#endif +#ifndef S_IRWXU +#define S_IRWXU 0000700 /* read, write, execute permissions, owner */ +#endif +#ifndef S_IRWXG +#define S_IRWXG 0000070 /* read, write, execute permissions, group */ +#endif +#ifndef S_IRWXO +#define S_IRWXO 0000007 /* read, write, execute permissions, other */ +#endif +#ifndef S_ISBLK +#define S_ISBLK(mode) (((mode) & (0170000)) == (0060000)) +#endif +#ifndef S_ISCHR +#define S_ISCHR(mode) (((mode) & (0170000)) == (0020000)) +#endif +#ifndef S_ISDIR +#define S_ISDIR(mode) (((mode) & (0170000)) == (0040000)) +#endif +#ifndef S_ISFIFO +#define S_ISFIFO(mode) (((mode) & (0170000)) == (0010000)) +#endif +#ifndef S_ISREG +#define S_ISREG(mode) (((mode) & (0170000)) == (0100000)) +#endif +/* Do not trust WORDS_BIGENDIAN from configure since -arch compiler flag may + result in a different endian. Instead trust __BIG_ENDIAN__ and + __LITTLE_ENDIAN__ which are set correctly by -arch. */ +#undef WORDS_BIGENDIAN +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN +#endif +#ifndef __APPLE__ +/* NextStep, OpenStep (but not Rhapsody) */ +#ifndef GETPGRP_VOID +#define GETPGRP_VOID 1 +#endif +#ifndef WNOHANG +#define WNOHANG 01 +#endif +#ifndef WUNTRACED +#define WUNTRACED 02 +#endif +#ifndef X_OK +#define X_OK 1 +#endif +#endif /* __APPLE__ */ +#endif /* NeXT */ + +#ifdef _WIN32 +#include "win32/win32.h" +#endif + +#if defined(__VMS) +#include "vms.h" +#endif + +#if defined(__BEOS__) +#include <net/socket.h> /* intern.h needs fd_set definition */ +#endif + +#ifdef RUBY_EXPORT +#undef RUBY_EXTERN +#endif + +#ifndef RUBY_EXTERN +#define RUBY_EXTERN extern +#endif + +#ifndef EXTERN +#define EXTERN RUBY_EXTERN /* deprecated */ +#endif + +#ifndef RUBY_MBCHAR_MAXSIZE +#define RUBY_MBCHAR_MAXSIZE INT_MAX + /* MB_CUR_MAX will not work well in C locale */ +#endif + +#if defined(sparc) || defined(__sparc__) +static inline void +flush_register_windows(void) +{ + asm +#ifdef __GNUC__ + volatile +#endif +# if defined(__sparc_v9__) || defined(__sparcv9) || defined(__arch64__) + ("flushw") +# else + ("ta 0x03") +# endif /* trap always to flush register windows if we are on a Sparc system */ + ; +} +# define FLUSH_REGISTER_WINDOWS flush_register_windows() +#elif defined(__ia64) +void *rb_ia64_bsp(void); +void rb_ia64_flushrs(void); +# define FLUSH_REGISTER_WINDOWS rb_ia64_flushrs() +#else +# define FLUSH_REGISTER_WINDOWS ((void)0) +#endif + +#if defined(DOSISH) +#define PATH_SEP ";" +#elif defined(riscos) +#define PATH_SEP "," +#else +#define PATH_SEP ":" +#endif +#define PATH_SEP_CHAR PATH_SEP[0] + +#if defined(__human68k__) +#define PATH_ENV "path" +#else +#define PATH_ENV "PATH" +#endif + +#if defined(DOSISH) && !defined(__human68k__) && !defined(__EMX__) +#define ENV_IGNORECASE +#endif + +#ifndef CASEFOLD_FILESYSTEM +# if defined DOSISH || defined __VMS +# define CASEFOLD_FILESYSTEM 1 +# else +# define CASEFOLD_FILESYSTEM 0 +# endif +#endif + +#ifndef DLEXT_MAXLEN +#define DLEXT_MAXLEN 4 +#endif + +#ifndef RUBY_PLATFORM +#define RUBY_PLATFORM "unknown-unknown" +#endif + +#endif +/********************************************************************** + + dln.h - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Wed Jan 19 16:53:09 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#ifndef DLN_H +#define DLN_H + +#ifdef __cplusplus +# ifndef HAVE_PROTOTYPES +# define HAVE_PROTOTYPES 1 +# endif +# ifndef HAVE_STDARG_PROTOTYPES +# define HAVE_STDARG_PROTOTYPES 1 +# endif +#endif + +#undef _ +#ifdef HAVE_PROTOTYPES +# define _(args) args +#else +# define _(args) () +#endif + +char *dln_find_exe _((const char*,const char*)); +char *dln_find_file _((const char*,const char*)); + +#ifdef USE_DLN_A_OUT +extern char *dln_argv0; +#endif + +void *dln_load _((const char*)); +#endif +/********************************************************************** + + env.h - + + $Author: knu $ + $Date: 2007-03-03 08:30:46 +0100 (Sat, 03 Mar 2007) $ + created at: Mon Jul 11 11:53:03 JST 1994 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#ifndef ENV_H +#define ENV_H + +extern struct FRAME { + VALUE self; + int argc; + ID last_func; + ID orig_func; + VALUE last_class; + struct FRAME *prev; + struct FRAME *tmp; + struct RNode *node; + int iter; + int flags; + unsigned long uniq; +} *ruby_frame; + +void rb_gc_mark_frame _((struct FRAME *)); + +#define FRAME_DMETH 1 +#define FRAME_FUNC 2 + +extern struct SCOPE { + struct RBasic super; + ID *local_tbl; + VALUE *local_vars; + int flags; +} *ruby_scope; + +#define SCOPE_ALLOCA 0 +#define SCOPE_MALLOC 1 +#define SCOPE_NOSTACK 2 +#define SCOPE_DONT_RECYCLE 4 +#define SCOPE_CLONE 8 + +extern int ruby_in_eval; + +extern VALUE ruby_class; + +struct RVarmap { + struct RBasic super; + ID id; + VALUE val; + struct RVarmap *next; +}; +extern struct RVarmap *ruby_dyna_vars; + +#endif /* ENV_H */ +/********************************************************************** + + intern.h - + + $Author: shyouhei $ + $Date: 2009-01-22 07:18:48 +0100 (Thu, 22 Jan 2009) $ + created at: Thu Jun 10 14:22:17 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +/* + * Functions and variables that are used by more than one source file of + * the kernel. + */ + +#define ID_ALLOCATOR 1 + +/* array.c */ +void rb_mem_clear _((register VALUE*, register long)); +VALUE rb_assoc_new _((VALUE, VALUE)); +VALUE rb_check_array_type _((VALUE)); +VALUE rb_ary_new _((void)); +VALUE rb_ary_new2 _((long)); +VALUE rb_ary_new3 __((long,...)); +VALUE rb_ary_new4 _((long, const VALUE *)); +VALUE rb_ary_freeze _((VALUE)); +VALUE rb_ary_aref _((int, VALUE*, VALUE)); +void rb_ary_store _((VALUE, long, VALUE)); +VALUE rb_ary_dup _((VALUE)); +VALUE rb_ary_to_ary _((VALUE)); +VALUE rb_ary_to_s _((VALUE)); +VALUE rb_ary_push _((VALUE, VALUE)); +VALUE rb_ary_pop _((VALUE)); +VALUE rb_ary_shift _((VALUE)); +VALUE rb_ary_unshift _((VALUE, VALUE)); +VALUE rb_ary_entry _((VALUE, long)); +VALUE rb_ary_each _((VALUE)); +VALUE rb_ary_join _((VALUE, VALUE)); +VALUE rb_ary_print_on _((VALUE, VALUE)); +VALUE rb_ary_reverse _((VALUE)); +VALUE rb_ary_sort _((VALUE)); +VALUE rb_ary_sort_bang _((VALUE)); +VALUE rb_ary_delete _((VALUE, VALUE)); +VALUE rb_ary_delete_at _((VALUE, long)); +VALUE rb_ary_clear _((VALUE)); +VALUE rb_ary_plus _((VALUE, VALUE)); +VALUE rb_ary_concat _((VALUE, VALUE)); +VALUE rb_ary_assoc _((VALUE, VALUE)); +VALUE rb_ary_rassoc _((VALUE, VALUE)); +VALUE rb_ary_includes _((VALUE, VALUE)); +VALUE rb_ary_cmp _((VALUE, VALUE)); +VALUE rb_protect_inspect _((VALUE(*)(ANYARGS),VALUE,VALUE)); +VALUE rb_inspecting_p _((VALUE)); +VALUE rb_check_array_value _((VALUE)); +VALUE rb_values_at _((VALUE, long, int, VALUE*, VALUE(*) _((VALUE,long)))); +/* bignum.c */ +VALUE rb_big_clone _((VALUE)); +void rb_big_2comp _((VALUE)); +VALUE rb_big_norm _((VALUE)); +VALUE rb_uint2big _((unsigned long)); +VALUE rb_int2big _((long)); +VALUE rb_uint2inum _((unsigned long)); +VALUE rb_int2inum _((long)); +VALUE rb_cstr_to_inum _((const char*, int, int)); +VALUE rb_str_to_inum _((VALUE, int, int)); +VALUE rb_cstr2inum _((const char*, int)); +VALUE rb_str2inum _((VALUE, int)); +VALUE rb_big2str _((VALUE, int)); +VALUE rb_big2str0 _((VALUE, int, int)); +long rb_big2long _((VALUE)); +#define rb_big2int(x) rb_big2long(x) +unsigned long rb_big2ulong _((VALUE)); +#define rb_big2uint(x) rb_big2ulong(x) +#if HAVE_LONG_LONG +VALUE rb_ll2inum _((LONG_LONG)); +VALUE rb_ull2inum _((unsigned LONG_LONG)); +LONG_LONG rb_big2ll _((VALUE)); +unsigned LONG_LONG rb_big2ull _((VALUE)); +#endif /* HAVE_LONG_LONG */ +void rb_quad_pack _((char*,VALUE)); +VALUE rb_quad_unpack _((const char*,int)); +VALUE rb_dbl2big _((double)); +double rb_big2dbl _((VALUE)); +VALUE rb_big_plus _((VALUE, VALUE)); +VALUE rb_big_minus _((VALUE, VALUE)); +VALUE rb_big_mul _((VALUE, VALUE)); +VALUE rb_big_divmod _((VALUE, VALUE)); +VALUE rb_big_pow _((VALUE, VALUE)); +VALUE rb_big_and _((VALUE, VALUE)); +VALUE rb_big_or _((VALUE, VALUE)); +VALUE rb_big_xor _((VALUE, VALUE)); +VALUE rb_big_lshift _((VALUE, VALUE)); +VALUE rb_big_rand _((VALUE, double*)); +/* class.c */ +VALUE rb_class_boot _((VALUE)); +VALUE rb_class_new _((VALUE)); +VALUE rb_mod_init_copy _((VALUE, VALUE)); +VALUE rb_class_init_copy _((VALUE, VALUE)); +VALUE rb_singleton_class_clone _((VALUE)); +void rb_singleton_class_attached _((VALUE,VALUE)); +VALUE rb_make_metaclass _((VALUE, VALUE)); +void rb_check_inheritable _((VALUE)); +VALUE rb_class_inherited _((VALUE, VALUE)); +VALUE rb_define_class_id _((ID, VALUE)); +VALUE rb_module_new _((void)); +VALUE rb_define_module_id _((ID)); +VALUE rb_mod_included_modules _((VALUE)); +VALUE rb_mod_include_p _((VALUE, VALUE)); +VALUE rb_mod_ancestors _((VALUE)); +VALUE rb_class_instance_methods _((int, VALUE*, VALUE)); +VALUE rb_class_public_instance_methods _((int, VALUE*, VALUE)); +VALUE rb_class_protected_instance_methods _((int, VALUE*, VALUE)); +VALUE rb_big_rshift(VALUE, VALUE); +VALUE rb_class_private_instance_methods _((int, VALUE*, VALUE)); +VALUE rb_obj_singleton_methods _((int, VALUE*, VALUE)); +void rb_define_method_id _((VALUE, ID, VALUE (*)(ANYARGS), int)); +void rb_frozen_class_p _((VALUE)); +void rb_undef _((VALUE, ID)); +void rb_define_protected_method _((VALUE, const char*, VALUE (*)(ANYARGS), int)); +void rb_define_private_method _((VALUE, const char*, VALUE (*)(ANYARGS), int)); +void rb_define_singleton_method _((VALUE, const char*, VALUE(*)(ANYARGS), int)); +VALUE rb_singleton_class _((VALUE)); +/* compar.c */ +int rb_cmpint _((VALUE, VALUE, VALUE)); +NORETURN(void rb_cmperr _((VALUE, VALUE))); +/* enum.c */ +/* error.c */ +RUBY_EXTERN int ruby_nerrs; +VALUE rb_exc_new _((VALUE, const char*, long)); +VALUE rb_exc_new2 _((VALUE, const char*)); +VALUE rb_exc_new3 _((VALUE, VALUE)); +NORETURN(void rb_loaderror __((const char*, ...))); +NORETURN(void rb_name_error __((ID, const char*, ...))); +NORETURN(void rb_invalid_str _((const char*, const char*))); +void rb_compile_error __((const char*, ...)); +void rb_compile_error_append __((const char*, ...)); +NORETURN(void rb_load_fail _((const char*))); +NORETURN(void rb_error_frozen _((const char*))); +void rb_check_frozen _((VALUE)); +/* eval.c */ +RUBY_EXTERN struct RNode *ruby_current_node; +void ruby_set_current_source _((void)); +NORETURN(void rb_exc_raise _((VALUE))); +NORETURN(void rb_exc_fatal _((VALUE))); +VALUE rb_f_exit _((int,VALUE*)); +VALUE rb_f_abort _((int,VALUE*)); +void rb_remove_method _((VALUE, const char*)); +#define rb_disable_super(klass, name) ((void)0) +#define rb_enable_super(klass, name) ((void)0) +#define HAVE_RB_DEFINE_ALLOC_FUNC 1 +void rb_define_alloc_func _((VALUE, VALUE (*)(VALUE))); +void rb_undef_alloc_func _((VALUE)); +void rb_clear_cache _((void)); +void rb_clear_cache_by_class _((VALUE)); +void rb_alias _((VALUE, ID, ID)); +void rb_attr _((VALUE,ID,int,int,int)); +int rb_method_boundp _((VALUE, ID, int)); +VALUE rb_dvar_defined _((ID)); +VALUE rb_dvar_curr _((ID)); +VALUE rb_dvar_ref _((ID)); +void rb_dvar_asgn _((ID, VALUE)); +void rb_dvar_push _((ID, VALUE)); +VALUE *rb_svar _((int)); +VALUE rb_eval_cmd _((VALUE, VALUE, int)); +int rb_obj_respond_to _((VALUE, ID, int)); +int rb_respond_to _((VALUE, ID)); +void rb_interrupt _((void)); +VALUE rb_apply _((VALUE, ID, VALUE)); +void rb_backtrace _((void)); +ID rb_frame_last_func _((void)); +VALUE rb_obj_instance_eval _((int, VALUE*, VALUE)); +VALUE rb_mod_module_eval _((int, VALUE*, VALUE)); +void rb_load _((VALUE, int)); +void rb_load_protect _((VALUE, int, int*)); +NORETURN(void rb_jump_tag _((int))); +int rb_provided _((const char*)); +void rb_provide _((const char*)); +VALUE rb_f_require _((VALUE, VALUE)); +VALUE rb_require_safe _((VALUE, int)); +void rb_obj_call_init _((VALUE, int, VALUE*)); +VALUE rb_class_new_instance _((int, VALUE*, VALUE)); +VALUE rb_block_proc _((void)); +VALUE rb_f_lambda _((void)); +VALUE rb_proc_new _((VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE)); +VALUE rb_protect _((VALUE (*)(VALUE), VALUE, int*)); +void rb_set_end_proc _((void (*)(VALUE), VALUE)); +void rb_mark_end_proc _((void)); +void rb_exec_end_proc _((void)); +void ruby_finalize _((void)); +NORETURN(void ruby_stop _((int))); +int ruby_cleanup _((int)); +int ruby_exec _((void)); +void rb_gc_mark_threads _((void)); +void rb_thread_start_timer _((void)); +void rb_thread_stop_timer _((void)); +void rb_thread_schedule _((void)); +void rb_thread_wait_fd _((int)); +int rb_thread_fd_writable _((int)); +void rb_thread_fd_close _((int)); +int rb_thread_alone _((void)); +void rb_thread_polling _((void)); +void rb_thread_sleep _((int)); +void rb_thread_sleep_forever _((void)); +VALUE rb_thread_stop _((void)); +VALUE rb_thread_wakeup _((VALUE)); +VALUE rb_thread_wakeup_alive _((VALUE)); +VALUE rb_thread_run _((VALUE)); +VALUE rb_thread_kill _((VALUE)); +VALUE rb_thread_alive_p _((VALUE)); +VALUE rb_thread_create _((VALUE (*)(ANYARGS), void*)); +void rb_thread_interrupt _((void)); +void rb_thread_trap_eval _((VALUE, int, int)); +void rb_thread_signal_raise _((int)); +void rb_thread_signal_exit _((void)); +int rb_thread_select _((int, fd_set *, fd_set *, fd_set *, struct timeval *)); +void rb_thread_wait_for _((struct timeval)); +VALUE rb_thread_current _((void)); +VALUE rb_thread_main _((void)); +VALUE rb_thread_local_aref _((VALUE, ID)); +VALUE rb_thread_local_aset _((VALUE, ID, VALUE)); +void rb_thread_atfork _((void)); +VALUE rb_funcall_rescue __((VALUE, ID, int, ...)); +/* file.c */ +VALUE rb_file_s_expand_path _((int, VALUE *)); +VALUE rb_file_expand_path _((VALUE, VALUE)); +void rb_file_const _((const char*, VALUE)); +int rb_find_file_ext _((VALUE*, const char* const*)); +VALUE rb_find_file _((VALUE)); +char *rb_path_next _((const char *)); +char *rb_path_skip_prefix _((const char *)); +char *rb_path_last_separator _((const char *)); +char *rb_path_end _((const char *)); +VALUE rb_file_directory_p _((VALUE,VALUE)); +/* gc.c */ +NORETURN(void rb_memerror __((void))); +int ruby_stack_check _((void)); +size_t ruby_stack_length _((VALUE**)); +int rb_during_gc _((void)); +char *rb_source_filename _((const char*)); +void rb_gc_mark_locations _((VALUE*, VALUE*)); +void rb_mark_tbl _((struct st_table*)); +void rb_mark_set _((struct st_table*)); +void rb_mark_hash _((struct st_table*)); +void rb_gc_mark_maybe _((VALUE)); +void rb_gc_mark _((VALUE)); +void rb_gc_force_recycle _((VALUE)); +void rb_gc _((void)); +void rb_gc_copy_finalizer _((VALUE,VALUE)); +void rb_gc_finalize_deferred _((void)); +void rb_gc_call_finalizer_at_exit _((void)); +VALUE rb_gc_enable _((void)); +VALUE rb_gc_disable _((void)); +VALUE rb_gc_start _((void)); +/* hash.c */ +void st_foreach_safe _((struct st_table *, int (*)(ANYARGS), unsigned long)); +void rb_hash_foreach _((VALUE, int (*)(ANYARGS), VALUE)); +VALUE rb_hash _((VALUE)); +VALUE rb_hash_new _((void)); +VALUE rb_hash_freeze _((VALUE)); +VALUE rb_hash_aref _((VALUE, VALUE)); +VALUE rb_hash_aset _((VALUE, VALUE, VALUE)); +VALUE rb_hash_delete_if _((VALUE)); +VALUE rb_hash_delete _((VALUE,VALUE)); +int rb_path_check _((char*)); +int rb_env_path_tainted _((void)); +/* io.c */ +#define rb_defout rb_stdout +RUBY_EXTERN VALUE rb_fs; +RUBY_EXTERN VALUE rb_output_fs; +RUBY_EXTERN VALUE rb_rs; +RUBY_EXTERN VALUE rb_default_rs; +RUBY_EXTERN VALUE rb_output_rs; +VALUE rb_io_write _((VALUE, VALUE)); +VALUE rb_io_gets _((VALUE)); +VALUE rb_io_getc _((VALUE)); +VALUE rb_io_ungetc _((VALUE, VALUE)); +VALUE rb_io_close _((VALUE)); +VALUE rb_io_eof _((VALUE)); +VALUE rb_io_binmode _((VALUE)); +VALUE rb_io_addstr _((VALUE, VALUE)); +VALUE rb_io_printf _((int, VALUE*, VALUE)); +VALUE rb_io_print _((int, VALUE*, VALUE)); +VALUE rb_io_puts _((int, VALUE*, VALUE)); +VALUE rb_file_open _((const char*, const char*)); +VALUE rb_gets _((void)); +void rb_write_error _((const char*)); +void rb_write_error2 _((const char*, long)); +/* marshal.c */ +VALUE rb_marshal_dump _((VALUE, VALUE)); +VALUE rb_marshal_load _((VALUE)); +/* numeric.c */ +void rb_num_zerodiv _((void)); +VALUE rb_num_coerce_bin _((VALUE, VALUE)); +VALUE rb_num_coerce_cmp _((VALUE, VALUE)); +VALUE rb_num_coerce_relop _((VALUE, VALUE)); +VALUE rb_float_new _((double)); +VALUE rb_num2fix _((VALUE)); +VALUE rb_fix2str _((VALUE, int)); +VALUE rb_dbl_cmp _((double, double)); +/* object.c */ +int rb_eql _((VALUE, VALUE)); +VALUE rb_any_to_s _((VALUE)); +VALUE rb_inspect _((VALUE)); +VALUE rb_obj_is_instance_of _((VALUE, VALUE)); +VALUE rb_obj_is_kind_of _((VALUE, VALUE)); +VALUE rb_obj_alloc _((VALUE)); +VALUE rb_obj_clone _((VALUE)); +VALUE rb_obj_dup _((VALUE)); +VALUE rb_obj_init_copy _((VALUE,VALUE)); +VALUE rb_obj_taint _((VALUE)); +VALUE rb_obj_tainted _((VALUE)); +VALUE rb_obj_untaint _((VALUE)); +VALUE rb_obj_freeze _((VALUE)); +VALUE rb_obj_id _((VALUE)); +VALUE rb_obj_class _((VALUE)); +VALUE rb_class_real _((VALUE)); +VALUE rb_class_inherited_p _((VALUE, VALUE)); +VALUE rb_convert_type _((VALUE,int,const char*,const char*)); +VALUE rb_check_convert_type _((VALUE,int,const char*,const char*)); +VALUE rb_to_int _((VALUE)); +VALUE rb_Integer _((VALUE)); +VALUE rb_Float _((VALUE)); +VALUE rb_String _((VALUE)); +VALUE rb_Array _((VALUE)); +double rb_cstr_to_dbl _((const char*, int)); +double rb_str_to_dbl _((VALUE, int)); +/* parse.y */ +RUBY_EXTERN int ruby_sourceline; +RUBY_EXTERN char *ruby_sourcefile; +int ruby_yyparse _((void)); +ID rb_id_attrset _((ID)); +void rb_parser_append_print _((void)); +void rb_parser_while_loop _((int, int)); +int ruby_parser_stack_on_heap _((void)); +void rb_gc_mark_parser _((void)); +int rb_is_const_id _((ID)); +int rb_is_instance_id _((ID)); +int rb_is_class_id _((ID)); +int rb_is_local_id _((ID)); +int rb_is_junk_id _((ID)); +int rb_symname_p _((const char*)); +int rb_sym_interned_p _((VALUE)); +VALUE rb_backref_get _((void)); +void rb_backref_set _((VALUE)); +VALUE rb_lastline_get _((void)); +void rb_lastline_set _((VALUE)); +VALUE rb_sym_all_symbols _((void)); +/* process.c */ +int rb_proc_exec _((const char*)); +VALUE rb_f_exec _((int,VALUE*)); +int rb_waitpid _((int,int*,int)); +void rb_syswait _((int)); +VALUE rb_proc_times _((VALUE)); +VALUE rb_detach_process _((int)); +/* range.c */ +VALUE rb_range_new _((VALUE, VALUE, int)); +VALUE rb_range_beg_len _((VALUE, long*, long*, long, int)); +VALUE rb_length_by_each _((VALUE)); +/* re.c */ +int rb_memcmp _((const void*,const void*,long)); +int rb_memcicmp _((const void*,const void*,long)); +long rb_memsearch _((const void*,long,const void*,long)); +VALUE rb_reg_nth_defined _((int, VALUE)); +VALUE rb_reg_nth_match _((int, VALUE)); +VALUE rb_reg_last_match _((VALUE)); +VALUE rb_reg_match_pre _((VALUE)); +VALUE rb_reg_match_post _((VALUE)); +VALUE rb_reg_match_last _((VALUE)); +VALUE rb_reg_new _((const char*, long, int)); +VALUE rb_reg_match _((VALUE, VALUE)); +VALUE rb_reg_match2 _((VALUE)); +int rb_reg_options _((VALUE)); +void rb_set_kcode _((const char*)); +const char* rb_get_kcode _((void)); +void rb_kcode_set_option _((VALUE)); +void rb_kcode_reset_option _((void)); +/* ruby.c */ +RUBY_EXTERN VALUE rb_argv; +RUBY_EXTERN VALUE rb_argv0; +void rb_load_file _((const char*)); +void ruby_script _((const char*)); +void ruby_prog_init _((void)); +void ruby_set_argv _((int, char**)); +void ruby_process_options _((int, char**)); +void ruby_load_script _((void)); +void ruby_init_loadpath _((void)); +void ruby_incpush _((const char*)); +/* signal.c */ +VALUE rb_f_kill _((int, VALUE*)); +void rb_gc_mark_trap_list _((void)); +#ifdef POSIX_SIGNAL +#define posix_signal ruby_posix_signal +void posix_signal _((int, RETSIGTYPE (*)(int))); +#endif +void rb_trap_exit _((void)); +void rb_trap_exec _((void)); +const char *ruby_signal_name _((int)); +void ruby_default_signal _((int)); +/* sprintf.c */ +VALUE rb_f_sprintf _((int, VALUE*)); +VALUE rb_str_format _((int, VALUE*, VALUE)); +/* string.c */ +VALUE rb_str_new _((const char*, long)); +VALUE rb_str_new2 _((const char*)); +VALUE rb_str_new3 _((VALUE)); +VALUE rb_str_new4 _((VALUE)); +VALUE rb_str_new5 _((VALUE, const char*, long)); +VALUE rb_tainted_str_new _((const char*, long)); +VALUE rb_tainted_str_new2 _((const char*)); +VALUE rb_str_buf_new _((long)); +VALUE rb_str_buf_new2 _((const char*)); +VALUE rb_str_buf_append _((VALUE, VALUE)); +VALUE rb_str_buf_cat _((VALUE, const char*, long)); +VALUE rb_str_buf_cat2 _((VALUE, const char*)); +VALUE rb_obj_as_string _((VALUE)); +VALUE rb_check_string_type _((VALUE)); +VALUE rb_str_dup _((VALUE)); +VALUE rb_str_locktmp _((VALUE)); +VALUE rb_str_unlocktmp _((VALUE)); +VALUE rb_str_dup_frozen _((VALUE)); +VALUE rb_str_plus _((VALUE, VALUE)); +VALUE rb_str_times _((VALUE, VALUE)); +VALUE rb_str_substr _((VALUE, long, long)); +void rb_str_modify _((VALUE)); +VALUE rb_str_freeze _((VALUE)); +VALUE rb_str_resize _((VALUE, long)); +VALUE rb_str_cat _((VALUE, const char*, long)); +VALUE rb_str_cat2 _((VALUE, const char*)); +VALUE rb_str_append _((VALUE, VALUE)); +VALUE rb_str_concat _((VALUE, VALUE)); +int rb_str_hash _((VALUE)); +int rb_str_cmp _((VALUE, VALUE)); +VALUE rb_str_upto _((VALUE, VALUE, int)); +void rb_str_update _((VALUE, long, long, VALUE)); +VALUE rb_str_inspect _((VALUE)); +VALUE rb_str_dump _((VALUE)); +VALUE rb_str_split _((VALUE, const char*)); +void rb_str_associate _((VALUE, VALUE)); +VALUE rb_str_associated _((VALUE)); +void rb_str_setter _((VALUE, ID, VALUE*)); +VALUE rb_str_intern _((VALUE)); +/* struct.c */ +VALUE rb_struct_new __((VALUE, ...)); +VALUE rb_struct_define __((const char*, ...)); +VALUE rb_struct_alloc _((VALUE, VALUE)); +VALUE rb_struct_aref _((VALUE, VALUE)); +VALUE rb_struct_aset _((VALUE, VALUE, VALUE)); +VALUE rb_struct_getmember _((VALUE, ID)); +VALUE rb_struct_iv_get _((VALUE, char*)); +VALUE rb_struct_s_members _((VALUE)); +VALUE rb_struct_members _((VALUE)); +/* time.c */ +VALUE rb_time_new _((time_t, time_t)); +/* variable.c */ +VALUE rb_mod_name _((VALUE)); +VALUE rb_class_path _((VALUE)); +void rb_set_class_path _((VALUE, VALUE, const char*)); +VALUE rb_path2class _((const char*)); +void rb_name_class _((VALUE, ID)); +VALUE rb_class_name _((VALUE)); +void rb_autoload _((VALUE, ID, const char*)); +VALUE rb_autoload_load _((VALUE, ID)); +VALUE rb_autoload_p _((VALUE, ID)); +void rb_gc_mark_global_tbl _((void)); +VALUE rb_f_trace_var _((int, VALUE*)); +VALUE rb_f_untrace_var _((int, VALUE*)); +VALUE rb_f_global_variables _((void)); +void rb_alias_variable _((ID, ID)); +struct st_table* rb_generic_ivar_table _((VALUE)); +void rb_copy_generic_ivar _((VALUE,VALUE)); +void rb_mark_generic_ivar _((VALUE)); +void rb_mark_generic_ivar_tbl _((void)); +void rb_free_generic_ivar _((VALUE)); +VALUE rb_ivar_get _((VALUE, ID)); +VALUE rb_ivar_set _((VALUE, ID, VALUE)); +VALUE rb_ivar_defined _((VALUE, ID)); +VALUE rb_iv_set _((VALUE, const char*, VALUE)); +VALUE rb_iv_get _((VALUE, const char*)); +VALUE rb_attr_get _((VALUE, ID)); +VALUE rb_obj_instance_variables _((VALUE)); +VALUE rb_obj_remove_instance_variable _((VALUE, VALUE)); +void *rb_mod_const_at _((VALUE, void*)); +void *rb_mod_const_of _((VALUE, void*)); +VALUE rb_const_list _((void*)); +VALUE rb_mod_constants _((VALUE)); +VALUE rb_mod_remove_const _((VALUE, VALUE)); +int rb_const_defined _((VALUE, ID)); +int rb_const_defined_at _((VALUE, ID)); +int rb_const_defined_from _((VALUE, ID)); +VALUE rb_const_get _((VALUE, ID)); +VALUE rb_const_get_at _((VALUE, ID)); +VALUE rb_const_get_from _((VALUE, ID)); +void rb_const_set _((VALUE, ID, VALUE)); +VALUE rb_mod_constants _((VALUE)); +VALUE rb_mod_const_missing _((VALUE,VALUE)); +VALUE rb_cvar_defined _((VALUE, ID)); +#define RB_CVAR_SET_4ARGS 1 +void rb_cvar_set _((VALUE, ID, VALUE, int)); +VALUE rb_cvar_get _((VALUE, ID)); +void rb_cv_set _((VALUE, const char*, VALUE)); +VALUE rb_cv_get _((VALUE, const char*)); +void rb_define_class_variable _((VALUE, const char*, VALUE)); +VALUE rb_mod_class_variables _((VALUE)); +VALUE rb_mod_remove_cvar _((VALUE, VALUE)); +/* version.c */ +void ruby_show_version _((void)); +void ruby_show_copyright _((void)); +/************************************************ + + missing.h - prototype for *.c in ./missing, and + for missing timeval struct + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Sat May 11 23:46:03 JST 2002 + +************************************************/ + +#ifndef MISSING_H +#define MISSING_H + +#if defined(HAVE_SYS_TIME_H) +# include <sys/time.h> +#elif !defined(_WIN32) +# define time_t long +struct timeval { + time_t tv_sec; /* seconds */ + time_t tv_usec; /* microseconds */ +}; +#endif +#if defined(HAVE_SYS_TYPES_H) +# include <sys/types.h> +#endif + +#ifndef HAVE_ACOSH +extern double acosh _((double)); +extern double asinh _((double)); +extern double atanh _((double)); +#endif + +#ifndef HAVE_CRYPT +extern char *crypt _((char *, char *)); +#endif + +#ifndef HAVE_DUP2 +extern int dup2 _((int, int)); +#endif + +#ifndef HAVE_EACCESS +extern int eaccess _((const char*, int)); +#endif + +#ifndef HAVE_FINITE +extern int finite _((double)); +#endif + +#ifndef HAVE_FLOCK +extern int flock _((int, int)); +#endif + +/* +#ifndef HAVE_FREXP +extern double frexp _((double, int *)); +#endif +*/ + +#ifndef HAVE_HYPOT +extern double hypot _((double, double)); +#endif + +#ifndef HAVE_ERF +extern double erf _((double)); +extern double erfc _((double)); +#endif + +#ifndef HAVE_ISINF +# if defined(HAVE_FINITE) && defined(HAVE_ISNAN) +# define isinf(x) (!finite(x) && !isnan(x)) +# else +extern int isinf _((double)); +# endif +#endif + +#ifndef HAVE_ISNAN +extern int isnan _((double)); +#endif + +/* +#ifndef HAVE_MEMCMP +extern int memcmp _((char *, char *, int)); +#endif +*/ + +#ifndef HAVE_MEMMOVE +extern void *memmove _((void *, void *, int)); +#endif + +/* +#ifndef HAVE_MODF +extern double modf _((double, double *)); +#endif +*/ + +#ifndef HAVE_STRCASECMP +extern int strcasecmp _((char *, char *)); +#endif + +#ifndef HAVE_STRNCASECMP +extern int strncasecmp _((char *, char *, int)); +#endif + +#ifndef HAVE_STRCHR +extern char *strchr _((char *, int)); +extern char *strrchr _((char *, int)); +#endif + +#ifndef HAVE_STRERROR +extern char *strerror _((int)); +#endif + +#ifndef HAVE_STRFTIME +extern size_t strftime _((char *, size_t, const char *, const struct tm *)); +#endif + +#ifndef HAVE_STRSTR +extern char *strstr _((char *, char *)); +#endif + +/* +#ifndef HAVE_STRTOL +extern long strtol _((char *, char **, int)); +#endif +*/ + +#ifndef HAVE_STRTOUL +extern unsigned long strtoul _((char *, char **, int)); +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef HAVE_STDARG_PROTOTYPES +# include <stdarg.h> +# else +# include <varargs.h> +# endif +extern int snprintf __((char *, size_t n, char const *, ...)); +extern int vsnprintf _((char *, size_t n, char const *, va_list)); +#endif + +#endif /* MISSING_H */ +/********************************************************************** + + node.h - + + $Author: wyhaines $ + $Date: 2009-07-09 20:16:38 +0200 (Thu, 09 Jul 2009) $ + created at: Fri May 28 15:14:02 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#ifndef NODE_H +#define NODE_H + +#if defined(__cplusplus) +extern "C" { +#endif + +enum node_type { + NODE_METHOD, + NODE_FBODY, + NODE_CFUNC, + NODE_SCOPE, + NODE_BLOCK, + NODE_IF, + NODE_CASE, + NODE_WHEN, + NODE_OPT_N, + NODE_WHILE, + NODE_UNTIL, + NODE_ITER, + NODE_FOR, + NODE_BREAK, + NODE_NEXT, + NODE_REDO, + NODE_RETRY, + NODE_BEGIN, + NODE_RESCUE, + NODE_RESBODY, + NODE_ENSURE, + NODE_AND, + NODE_OR, + NODE_NOT, + NODE_MASGN, + NODE_LASGN, + NODE_DASGN, + NODE_DASGN_CURR, + NODE_GASGN, + NODE_IASGN, + NODE_CDECL, + NODE_CVASGN, + NODE_CVDECL, + NODE_OP_ASGN1, + NODE_OP_ASGN2, + NODE_OP_ASGN_AND, + NODE_OP_ASGN_OR, + NODE_CALL, + NODE_FCALL, + NODE_VCALL, + NODE_SUPER, + NODE_ZSUPER, + NODE_ARRAY, + NODE_ZARRAY, + NODE_HASH, + NODE_RETURN, + NODE_YIELD, + NODE_LVAR, + NODE_DVAR, + NODE_GVAR, + NODE_IVAR, + NODE_CONST, + NODE_CVAR, + NODE_NTH_REF, + NODE_BACK_REF, + NODE_MATCH, + NODE_MATCH2, + NODE_MATCH3, + NODE_LIT, + NODE_STR, + NODE_DSTR, + NODE_XSTR, + NODE_DXSTR, + NODE_EVSTR, + NODE_DREGX, + NODE_DREGX_ONCE, + NODE_ARGS, + NODE_ARGSCAT, + NODE_ARGSPUSH, + NODE_SPLAT, + NODE_TO_ARY, + NODE_SVALUE, + NODE_BLOCK_ARG, + NODE_BLOCK_PASS, + NODE_DEFN, + NODE_DEFS, + NODE_ALIAS, + NODE_VALIAS, + NODE_UNDEF, + NODE_CLASS, + NODE_MODULE, + NODE_SCLASS, + NODE_COLON2, + NODE_COLON3, + NODE_CREF, + NODE_DOT2, + NODE_DOT3, + NODE_FLIP2, + NODE_FLIP3, + NODE_ATTRSET, + NODE_SELF, + NODE_NIL, + NODE_TRUE, + NODE_FALSE, + NODE_DEFINED, + NODE_NEWLINE, + NODE_POSTEXE, + NODE_ALLOCA, + NODE_DMETHOD, + NODE_BMETHOD, + NODE_MEMO, + NODE_IFUNC, + NODE_DSYM, + NODE_ATTRASGN, + NODE_LAST +}; + +typedef struct RNode { + unsigned long flags; + char *nd_file; + union { + struct RNode *node; + ID id; + VALUE value; + VALUE (*cfunc)(ANYARGS); + ID *tbl; + } u1; + union { + struct RNode *node; + ID id; + long argc; + VALUE value; + } u2; + union { + struct RNode *node; + ID id; + long state; + struct global_entry *entry; + long cnt; + VALUE value; + } u3; +} NODE; + +extern NODE *ruby_cref; +extern NODE *ruby_top_cref; + +#define RNODE(obj) (R_CAST(RNode)(obj)) + +#define nd_type(n) ((int)(((RNODE(n))->flags>>FL_USHIFT)&0xff)) +#define nd_set_type(n,t) \ + RNODE(n)->flags=((RNODE(n)->flags&~FL_UMASK)|(((t)<<FL_USHIFT)&FL_UMASK)) + +#define NODE_LSHIFT (FL_USHIFT+8) +#define NODE_LMASK (((long)1<<(sizeof(NODE*)*CHAR_BIT-NODE_LSHIFT))-1) +#define nd_line(n) ((unsigned int)(((RNODE(n))->flags>>NODE_LSHIFT)&NODE_LMASK)) +#define nd_set_line(n,l) \ + RNODE(n)->flags=((RNODE(n)->flags&~(-1<<NODE_LSHIFT))|(((l)&NODE_LMASK)<<NODE_LSHIFT)) + +#define nd_head u1.node +#define nd_alen u2.argc +#define nd_next u3.node + +#define nd_cond u1.node +#define nd_body u2.node +#define nd_else u3.node + +#define nd_orig u3.value + +#define nd_resq u2.node +#define nd_ensr u3.node + +#define nd_1st u1.node +#define nd_2nd u2.node + +#define nd_stts u1.node + +#define nd_entry u3.entry +#define nd_vid u1.id +#define nd_cflag u2.id +#define nd_cval u3.value + +#define nd_cnt u3.cnt +#define nd_tbl u1.tbl + +#define nd_var u1.node +#define nd_ibdy u2.node +#define nd_iter u3.node + +#define nd_value u2.node +#define nd_aid u3.id + +#define nd_lit u1.value + +#define nd_frml u1.node +#define nd_rest u2.node +#define nd_opt u1.node + +#define nd_recv u1.node +#define nd_mid u2.id +#define nd_args u3.node + +#define nd_noex u1.id +#define nd_defn u3.node + +#define nd_cfnc u1.cfunc +#define nd_argc u2.argc + +#define nd_cpath u1.node +#define nd_super u3.node + +#define nd_modl u1.id +#define nd_clss u1.value + +#define nd_beg u1.node +#define nd_end u2.node +#define nd_state u3.state +#define nd_rval u2.value + +#define nd_nth u2.argc + +#define nd_tag u1.id +#define nd_tval u2.value + +#define NEW_NODE(t,a0,a1,a2) rb_node_newnode((t),(VALUE)(a0),(VALUE)(a1),(VALUE)(a2)) + +#define NEW_METHOD(n,x) NEW_NODE(NODE_METHOD,x,n,0) +#define NEW_FBODY(n,i,o) NEW_NODE(NODE_FBODY,n,i,o) +#define NEW_DEFN(i,a,d,p) NEW_NODE(NODE_DEFN,p,i,NEW_RFUNC(a,d)) +#define NEW_DEFS(r,i,a,d) NEW_NODE(NODE_DEFS,r,i,NEW_RFUNC(a,d)) +#define NEW_CFUNC(f,c) NEW_NODE(NODE_CFUNC,f,c,0) +#define NEW_IFUNC(f,c) NEW_NODE(NODE_IFUNC,f,c,0) +#define NEW_RFUNC(b1,b2) NEW_SCOPE(block_append(b1,b2)) +#define NEW_SCOPE(b) NEW_NODE(NODE_SCOPE,local_tbl(),0,(b)) +#define NEW_BLOCK(a) NEW_NODE(NODE_BLOCK,a,0,0) +#define NEW_IF(c,t,e) NEW_NODE(NODE_IF,c,t,e) +#define NEW_UNLESS(c,t,e) NEW_IF(c,e,t) +#define NEW_CASE(h,b) NEW_NODE(NODE_CASE,h,b,0) +#define NEW_WHEN(c,t,e) NEW_NODE(NODE_WHEN,c,t,e) +#define NEW_OPT_N(b) NEW_NODE(NODE_OPT_N,0,b,0) +#define NEW_WHILE(c,b,n) NEW_NODE(NODE_WHILE,c,b,n) +#define NEW_UNTIL(c,b,n) NEW_NODE(NODE_UNTIL,c,b,n) +#define NEW_FOR(v,i,b) NEW_NODE(NODE_FOR,v,b,i) +#define NEW_ITER(v,i,b) NEW_NODE(NODE_ITER,v,b,i) +#define NEW_BREAK(s) NEW_NODE(NODE_BREAK,s,0,0) +#define NEW_NEXT(s) NEW_NODE(NODE_NEXT,s,0,0) +#define NEW_REDO() NEW_NODE(NODE_REDO,0,0,0) +#define NEW_RETRY() NEW_NODE(NODE_RETRY,0,0,0) +#define NEW_BEGIN(b) NEW_NODE(NODE_BEGIN,0,b,0) +#define NEW_RESCUE(b,res,e) NEW_NODE(NODE_RESCUE,b,res,e) +#define NEW_RESBODY(a,ex,n) NEW_NODE(NODE_RESBODY,n,ex,a) +#define NEW_ENSURE(b,en) NEW_NODE(NODE_ENSURE,b,0,en) +#define NEW_RETURN(s) NEW_NODE(NODE_RETURN,s,0,0) +#define NEW_YIELD(a,s) NEW_NODE(NODE_YIELD,a,0,s) +#define NEW_LIST(a) NEW_ARRAY(a) +#define NEW_ARRAY(a) NEW_NODE(NODE_ARRAY,a,1,0) +#define NEW_ZARRAY() NEW_NODE(NODE_ZARRAY,0,0,0) +#define NEW_HASH(a) NEW_NODE(NODE_HASH,a,0,0) +#define NEW_NOT(a) NEW_NODE(NODE_NOT,0,a,0) +#define NEW_MASGN(l,r) NEW_NODE(NODE_MASGN,l,0,r) +#define NEW_GASGN(v,val) NEW_NODE(NODE_GASGN,v,val,rb_global_entry(v)) +#define NEW_LASGN(v,val) NEW_NODE(NODE_LASGN,v,val,local_cnt(v)) +#define NEW_DASGN(v,val) NEW_NODE(NODE_DASGN,v,val,0) +#define NEW_DASGN_CURR(v,val) NEW_NODE(NODE_DASGN_CURR,v,val,0) +#define NEW_IASGN(v,val) NEW_NODE(NODE_IASGN,v,val,0) +#define NEW_CDECL(v,val,path) NEW_NODE(NODE_CDECL,v,val,path) +#define NEW_CVASGN(v,val) NEW_NODE(NODE_CVASGN,v,val,0) +#define NEW_CVDECL(v,val) NEW_NODE(NODE_CVDECL,v,val,0) +#define NEW_OP_ASGN1(p,id,a) NEW_NODE(NODE_OP_ASGN1,p,id,a) +#define NEW_OP_ASGN2(r,i,o,val) NEW_NODE(NODE_OP_ASGN2,r,val,NEW_OP_ASGN22(i,o)) +#define NEW_OP_ASGN22(i,o) NEW_NODE(NODE_OP_ASGN2,i,o,rb_id_attrset(i)) +#define NEW_OP_ASGN_OR(i,val) NEW_NODE(NODE_OP_ASGN_OR,i,val,0) +#define NEW_OP_ASGN_AND(i,val) NEW_NODE(NODE_OP_ASGN_AND,i,val,0) +#define NEW_GVAR(v) NEW_NODE(NODE_GVAR,v,0,rb_global_entry(v)) +#define NEW_LVAR(v) NEW_NODE(NODE_LVAR,v,0,local_cnt(v)) +#define NEW_DVAR(v) NEW_NODE(NODE_DVAR,v,0,0) +#define NEW_IVAR(v) NEW_NODE(NODE_IVAR,v,0,0) +#define NEW_CONST(v) NEW_NODE(NODE_CONST,v,0,0) +#define NEW_CVAR(v) NEW_NODE(NODE_CVAR,v,0,0) +#define NEW_NTH_REF(n) NEW_NODE(NODE_NTH_REF,0,n,local_cnt('~')) +#define NEW_BACK_REF(n) NEW_NODE(NODE_BACK_REF,0,n,local_cnt('~')) +#define NEW_MATCH(c) NEW_NODE(NODE_MATCH,c,0,0) +#define NEW_MATCH2(n1,n2) NEW_NODE(NODE_MATCH2,n1,n2,0) +#define NEW_MATCH3(r,n2) NEW_NODE(NODE_MATCH3,r,n2,0) +#define NEW_LIT(l) NEW_NODE(NODE_LIT,l,0,0) +#define NEW_STR(s) NEW_NODE(NODE_STR,s,0,0) +#define NEW_DSTR(s) NEW_NODE(NODE_DSTR,s,1,0) +#define NEW_XSTR(s) NEW_NODE(NODE_XSTR,s,0,0) +#define NEW_DXSTR(s) NEW_NODE(NODE_DXSTR,s,0,0) +#define NEW_DSYM(s) NEW_NODE(NODE_DSYM,s,0,0) +#define NEW_EVSTR(n) NEW_NODE(NODE_EVSTR,0,(n),0) +#define NEW_CALL(r,m,a) NEW_NODE(NODE_CALL,r,m,a) +#define NEW_FCALL(m,a) NEW_NODE(NODE_FCALL,0,m,a) +#define NEW_VCALL(m) NEW_NODE(NODE_VCALL,0,m,0) +#define NEW_SUPER(a) NEW_NODE(NODE_SUPER,0,0,a) +#define NEW_ZSUPER() NEW_NODE(NODE_ZSUPER,0,0,0) +#define NEW_ARGS(f,o,r) NEW_NODE(NODE_ARGS,o,r,f) +#define NEW_ARGSCAT(a,b) NEW_NODE(NODE_ARGSCAT,a,b,0) +#define NEW_ARGSPUSH(a,b) NEW_NODE(NODE_ARGSPUSH,a,b,0) +#define NEW_SPLAT(a) NEW_NODE(NODE_SPLAT,a,0,0) +#define NEW_TO_ARY(a) NEW_NODE(NODE_TO_ARY,a,0,0) +#define NEW_SVALUE(a) NEW_NODE(NODE_SVALUE,a,0,0) +#define NEW_BLOCK_ARG(v) NEW_NODE(NODE_BLOCK_ARG,v,0,local_cnt(v)) +#define NEW_BLOCK_PASS(b) NEW_NODE(NODE_BLOCK_PASS,0,b,0) +#define NEW_ALIAS(n,o) NEW_NODE(NODE_ALIAS,n,o,0) +#define NEW_VALIAS(n,o) NEW_NODE(NODE_VALIAS,n,o,0) +#define NEW_UNDEF(i) NEW_NODE(NODE_UNDEF,0,i,0) +#define NEW_CLASS(n,b,s) NEW_NODE(NODE_CLASS,n,NEW_SCOPE(b),(s)) +#define NEW_SCLASS(r,b) NEW_NODE(NODE_SCLASS,r,NEW_SCOPE(b),0) +#define NEW_MODULE(n,b) NEW_NODE(NODE_MODULE,n,NEW_SCOPE(b),0) +#define NEW_COLON2(c,i) NEW_NODE(NODE_COLON2,c,i,0) +#define NEW_COLON3(i) NEW_NODE(NODE_COLON3,0,i,0) +#define NEW_CREF(c,n) NEW_NODE(NODE_CREF,c,0,n) +#define NEW_DOT2(b,e) NEW_NODE(NODE_DOT2,b,e,0) +#define NEW_DOT3(b,e) NEW_NODE(NODE_DOT3,b,e,0) +#define NEW_ATTRSET(a) NEW_NODE(NODE_ATTRSET,a,0,0) +#define NEW_SELF() NEW_NODE(NODE_SELF,0,0,0) +#define NEW_NIL() NEW_NODE(NODE_NIL,0,0,0) +#define NEW_TRUE() NEW_NODE(NODE_TRUE,0,0,0) +#define NEW_FALSE() NEW_NODE(NODE_FALSE,0,0,0) +#define NEW_DEFINED(e) NEW_NODE(NODE_DEFINED,e,0,0) +#define NEW_NEWLINE(n) NEW_NODE(NODE_NEWLINE,0,0,n) +#define NEW_PREEXE(b) NEW_SCOPE(b) +#define NEW_POSTEXE() NEW_NODE(NODE_POSTEXE,0,0,0) +#define NEW_DMETHOD(b) NEW_NODE(NODE_DMETHOD,0,0,b) +#define NEW_BMETHOD(b) NEW_NODE(NODE_BMETHOD,0,0,b) +#define NEW_ATTRASGN(r,m,a) NEW_NODE(NODE_ATTRASGN,r,m,a) + +#define NOEX_PUBLIC 0 +#define NOEX_NOSUPER 1 +#define NOEX_PRIVATE 2 +#define NOEX_PROTECTED 4 +#define NOEX_MASK 6 + +#define NOEX_UNDEF NOEX_NOSUPER + +NODE *rb_compile_cstr _((const char*, const char*, int, int)); +NODE *rb_compile_string _((const char*, VALUE, int)); +NODE *rb_compile_file _((const char*, VALUE, int)); + +void rb_add_method _((VALUE, ID, NODE *, int)); +NODE *rb_node_newnode _((enum node_type,VALUE,VALUE,VALUE)); + +NODE* rb_method_node _((VALUE klass, ID id)); + +struct global_entry *rb_global_entry _((ID)); +VALUE rb_gvar_get _((struct global_entry *)); +VALUE rb_gvar_set _((struct global_entry *, VALUE)); +VALUE rb_gvar_defined _((struct global_entry *)); + +typedef unsigned int rb_event_t; + +#define RUBY_EVENT_NONE 0x00 +#define RUBY_EVENT_LINE 0x01 +#define RUBY_EVENT_CLASS 0x02 +#define RUBY_EVENT_END 0x04 +#define RUBY_EVENT_CALL 0x08 +#define RUBY_EVENT_RETURN 0x10 +#define RUBY_EVENT_C_CALL 0x20 +#define RUBY_EVENT_C_RETURN 0x40 +#define RUBY_EVENT_RAISE 0x80 +#define RUBY_EVENT_ALL 0xff + +typedef void (*rb_event_hook_func_t) _((rb_event_t,NODE*,VALUE,ID,VALUE)); +NODE *rb_copy_node_scope _((NODE *, NODE *)); +void rb_add_event_hook _((rb_event_hook_func_t,rb_event_t)); +int rb_remove_event_hook _((rb_event_hook_func_t)); + +#if defined(HAVE_GETCONTEXT) && defined(HAVE_SETCONTEXT) +#include <ucontext.h> +#define USE_CONTEXT +#endif +#include <setjmp.h> +#include "st.h" + +#ifdef USE_CONTEXT +typedef struct { + ucontext_t context; + volatile int status; +} rb_jmpbuf_t[1]; +#else +typedef jmp_buf rb_jmpbuf_t; +#endif + +enum rb_thread_status { + THREAD_TO_KILL, + THREAD_RUNNABLE, + THREAD_STOPPED, + THREAD_KILLED +}; + +typedef struct rb_thread *rb_thread_t; + +struct rb_thread { + rb_thread_t next, prev; + rb_jmpbuf_t context; +#if (defined _WIN32 && !defined _WIN32_WCE) || defined __CYGWIN__ + unsigned long win32_exception_list; +#endif + + VALUE result; + + size_t stk_len; + size_t stk_max; + VALUE *stk_ptr; + VALUE *stk_pos; +#ifdef __ia64 + size_t bstr_len; + size_t bstr_max; + VALUE *bstr_ptr; + VALUE *bstr_pos; +#endif + + struct FRAME *frame; + struct SCOPE *scope; + struct RVarmap *dyna_vars; + struct BLOCK *block; + struct iter *iter; + struct tag *tag; + VALUE klass; + VALUE wrapper; + NODE *cref; + + int flags; /* misc. states (vmode/rb_trap_immediate/raised) */ + + NODE *node; + + int tracing; + VALUE errinfo; + VALUE last_status; + VALUE last_line; + VALUE last_match; + + int safe; + + enum rb_thread_status status; + int wait_for; + int fd; + fd_set readfds; + fd_set writefds; + fd_set exceptfds; + int select_value; + double delay; + rb_thread_t join; + + int abort; + int priority; + VALUE thgroup; + + struct st_table *locals; + + VALUE thread; + + VALUE sandbox; +}; + +extern VALUE (*ruby_sandbox_save)_((rb_thread_t)); +extern VALUE (*ruby_sandbox_restore)_((rb_thread_t)); +extern rb_thread_t rb_curr_thread; +extern rb_thread_t rb_main_thread; + +enum { + RAISED_EXCEPTION = 0x1000, + RAISED_STACKOVERFLOW = 0x2000, + RAISED_NOMEMORY = 0x4000, + RAISED_MASK = 0xf000 +}; +int rb_thread_set_raised(rb_thread_t th); +int rb_thread_reset_raised(rb_thread_t th); +#define rb_thread_raised_set(th, f) ((th)->flags |= (f)) +#define rb_thread_raised_reset(th, f) ((th)->flags &= ~(f)) +#define rb_thread_raised_p(th, f) (((th)->flags & (f)) != 0) +#define rb_thread_raised_clear(th) (rb_thread_raised_reset(th, RAISED_MASK)) + +#if defined(__cplusplus) +} /* extern "C" { */ +#endif + +#endif +/********************************************************************** + + re.h - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Thu Sep 30 14:18:32 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#ifndef RE_H +#define RE_H + +#include <sys/types.h> +#include <stdio.h> + +#include "regex.h" + +typedef struct re_pattern_buffer Regexp; + +struct RMatch { + struct RBasic basic; + VALUE str; + struct re_registers *regs; +}; + +#define RMATCH(obj) (R_CAST(RMatch)(obj)) + +VALUE rb_reg_regcomp _((VALUE)); +long rb_reg_search _((VALUE, VALUE, long, long)); +VALUE rb_reg_regsub _((VALUE, VALUE, struct re_registers *)); +long rb_reg_adjust_startpos _((VALUE, VALUE, long, long)); +void rb_match_busy _((VALUE)); +VALUE rb_reg_quote _((VALUE)); + +RUBY_EXTERN int ruby_ignorecase; + +int rb_reg_mbclen2 _((unsigned int, VALUE)); +#define mbclen2(c,re) rb_reg_mbclen2((c),(re)) +#endif +/* Definitions for data structures and routines for the regular + expression library, version 0.12. + Copyright (C) 1985,89,90,91,92,93,95,96,97,98 Free Software Foundation, Inc. + + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file LGPL. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ +/* Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto) + Last change: May 21, 1993 by t^2 */ +/* modified for Ruby by matz@netlab.co.jp */ + +#ifndef REGEX_H +#define REGEX_H + +/* symbol mangling for ruby */ +#ifdef RUBY +# define re_adjust_startpos ruby_re_adjust_startpos +# define re_compile_fastmap ruby_re_compile_fastmap +# define re_compile_pattern ruby_re_compile_pattern +# define re_copy_registers ruby_re_copy_registers +# define re_free_pattern ruby_re_free_pattern +# define re_free_registers ruby_re_free_registers +# define re_match ruby_re_match +# define re_mbcinit ruby_re_mbcinit +# define re_search ruby_re_search +# define re_set_casetable ruby_re_set_casetable +# define register_info_type ruby_register_info_type +#endif + +#include <stddef.h> + +/* Define number of parens for which we record the beginnings and ends. + This affects how much space the `struct re_registers' type takes up. */ +#ifndef RE_NREGS +#define RE_NREGS 10 +#endif + +#define BYTEWIDTH 8 + +#define RE_REG_MAX ((1<<BYTEWIDTH)-1) + +/* Maximum number of duplicates an interval can allow. */ +#ifndef RE_DUP_MAX +#define RE_DUP_MAX ((1 << 15) - 1) +#endif + + +/* If this bit is set, then character classes are supported; they are: + [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], + [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. + If not set, then character classes are not supported. */ +#define RE_CHAR_CLASSES (1L << 9) + +/* match will be done case insensetively */ +#define RE_OPTION_IGNORECASE (1L) +/* perl-style extended pattern available */ +#define RE_OPTION_EXTENDED (RE_OPTION_IGNORECASE<<1) +/* newline will be included for . */ +#define RE_OPTION_MULTILINE (RE_OPTION_EXTENDED<<1) +/* ^ and $ ignore newline */ +#define RE_OPTION_SINGLELINE (RE_OPTION_MULTILINE<<1) +/* search for longest match, in accord with POSIX regexp */ +#define RE_OPTION_LONGEST (RE_OPTION_SINGLELINE<<1) + +#define RE_MAY_IGNORECASE (RE_OPTION_LONGEST<<1) +#define RE_OPTIMIZE_ANCHOR (RE_MAY_IGNORECASE<<1) +#define RE_OPTIMIZE_EXACTN (RE_OPTIMIZE_ANCHOR<<1) +#define RE_OPTIMIZE_NO_BM (RE_OPTIMIZE_EXACTN<<1) +#define RE_OPTIMIZE_BMATCH (RE_OPTIMIZE_NO_BM<<1) + +/* For multi-byte char support */ +#define MBCTYPE_ASCII 0 +#define MBCTYPE_EUC 1 +#define MBCTYPE_SJIS 2 +#define MBCTYPE_UTF8 3 + +extern +#if defined _WIN32 && !defined __GNUC__ && !defined RUBY_EXPORT +__declspec(dllimport) +# endif +const unsigned char *re_mbctab; +#if defined(__STDC__) +void re_mbcinit (int); +#else +void re_mbcinit (); +#endif + +#undef ismbchar +#define ismbchar(c) re_mbctab[(unsigned char)(c)] +#define mbclen(c) (re_mbctab[(unsigned char)(c)]+1) + +/* Structure used in re_match() */ + +typedef union +{ + unsigned char *word; + struct { + unsigned is_active : 1; + unsigned matched_something : 1; + } bits; +} register_info_type; + +/* This data structure is used to represent a compiled pattern. */ + +struct re_pattern_buffer + { + char *buffer; /* Space holding the compiled pattern commands. */ + int allocated; /* Size of space that `buffer' points to. */ + int used; /* Length of portion of buffer actually occupied */ + char *fastmap; /* Pointer to fastmap, if any, or zero if none. */ + /* re_search uses the fastmap, if there is one, + to skip over totally implausible characters. */ + char *must; /* Pointer to exact pattern which strings should have + to be matched. */ + int *must_skip; /* Pointer to exact pattern skip table for bm_search */ + long options; /* Flags for options such as extended_pattern. */ + long re_nsub; /* Number of subexpressions found by the compiler. */ + char fastmap_accurate; + /* Set to zero when a new pattern is stored, + set to one when the fastmap is updated from it. */ + char can_be_null; /* Set to one by compiling fastmap + if this pattern might match the null string. + It does not necessarily match the null string + in that case, but if this is zero, it cannot. + 2 as value means can match null string + but at end of range or before a character + listed in the fastmap. */ + + /* stack & working area for re_match() */ + unsigned char **regstart; + unsigned char **regend; + unsigned char **old_regstart; + unsigned char **old_regend; + register_info_type *reg_info; + unsigned char **best_regstart; + unsigned char **best_regend; + }; + +typedef struct re_pattern_buffer regex_t; + +/* Structure to store register contents data in. + + Pass the address of such a structure as an argument to re_match, etc., + if you want this information back. + + For i from 1 to RE_NREGS - 1, start[i] records the starting index in + the string of where the ith subexpression matched, and end[i] records + one after the ending index. start[0] and end[0] are analogous, for + the entire pattern. */ + +struct re_registers + { + int allocated; + int num_regs; + int *beg; + int *end; + }; + +/* Type for byte offsets within the string. POSIX mandates this. */ +typedef size_t regoff_t; + +/* POSIX specification for registers. Aside from the different names than + `re_registers', POSIX uses an array of structures, instead of a + structure of arrays. */ +typedef struct +{ + regoff_t rm_so; /* Byte offset from string's start to substring's start. */ + regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ +} regmatch_t; + +#ifdef __STDC__ + +extern char *re_compile_pattern (const char *, int, struct re_pattern_buffer *); +void re_free_pattern (struct re_pattern_buffer *); +/* Is this really advertised? */ +extern int re_adjust_startpos (struct re_pattern_buffer *, const char*, int, int, int); +extern void re_compile_fastmap (struct re_pattern_buffer *); +extern int re_search (struct re_pattern_buffer *, const char*, int, int, int, + struct re_registers *); +extern int re_match (struct re_pattern_buffer *, const char *, int, int, + struct re_registers *); +extern void re_set_casetable (const char *table); +extern void re_copy_registers (struct re_registers*, struct re_registers*); +extern void re_free_registers (struct re_registers*); + +#ifndef RUBY +/* 4.2 bsd compatibility. */ +extern char *re_comp (const char *); +extern int re_exec (const char *); +#endif + +#else /* !__STDC__ */ + +extern char *re_compile_pattern (); +void re_free_regexp (); +/* Is this really advertised? */ +extern int re_adjust_startpos (); +extern void re_compile_fastmap (); +extern int re_search (); +extern int re_match (); +extern void re_set_casetable (); +extern void re_copy_registers (); +extern void re_free_registers (); + +#endif /* __STDC__ */ + +#endif /* !REGEX_H */ +/********************************************************************** + + ruby.h - + + $Author: shyouhei $ + created at: Thu Jun 10 14:26:32 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + Copyright (C) 2000 Information-technology Promotion Agency, Japan + +**********************************************************************/ + +#ifndef RUBY_H +#define RUBY_H + +#if defined(__cplusplus) +extern "C" { +#if 0 +} /* satisfy cc-mode */ +#endif +#endif + +#include "config.h" +#ifdef RUBY_EXTCONF_H +#include RUBY_EXTCONF_H +#endif + +#define NORETURN_STYLE_NEW 1 +#ifndef NORETURN +# define NORETURN(x) x +#endif +#ifndef NOINLINE +# define NOINLINE(x) x +#endif + +#include "defines.h" + +#ifdef HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#ifdef HAVE_STRING_H +# include <string.h> +#else +# include <strings.h> +#endif + +#ifdef HAVE_INTRINSICS_H +# include <intrinsics.h> +#endif + +#include <stddef.h> +#include <stdio.h> + +/* need to include <ctype.h> to use these macros */ +#ifndef ISPRINT +#define ISASCII(c) isascii((int)(unsigned char)(c)) +#undef ISPRINT +#define ISPRINT(c) (ISASCII(c) && isprint((int)(unsigned char)(c))) +#define ISSPACE(c) (ISASCII(c) && isspace((int)(unsigned char)(c))) +#define ISUPPER(c) (ISASCII(c) && isupper((int)(unsigned char)(c))) +#define ISLOWER(c) (ISASCII(c) && islower((int)(unsigned char)(c))) +#define ISALNUM(c) (ISASCII(c) && isalnum((int)(unsigned char)(c))) +#define ISALPHA(c) (ISASCII(c) && isalpha((int)(unsigned char)(c))) +#define ISDIGIT(c) (ISASCII(c) && isdigit((int)(unsigned char)(c))) +#define ISXDIGIT(c) (ISASCII(c) && isxdigit((int)(unsigned char)(c))) +#endif + +#if defined(HAVE_ALLOCA_H) +#include <alloca.h> +#else +# ifdef _AIX +#pragma alloca +# endif +#endif + +#if defined(__VMS) +# pragma builtins +# define alloca __alloca +#endif + +#if SIZEOF_LONG != SIZEOF_VOIDP +# error ---->> ruby requires sizeof(void*) == sizeof(long) to be compiled. <<---- +#else +typedef unsigned long VALUE; +typedef unsigned long ID; +#endif + +#ifdef __STDC__ +# include <limits.h> +#else +# ifndef LONG_MAX +# ifdef HAVE_LIMITS_H +# include <limits.h> +# else + /* assuming 32bit(2's compliment) long */ +# define LONG_MAX 2147483647 +# endif +# endif +# ifndef LONG_MIN +# define LONG_MIN (-LONG_MAX-1) +# endif +# ifndef CHAR_BIT +# define CHAR_BIT 8 +# endif +#endif + +#ifdef HAVE_LONG_LONG +# ifndef LLONG_MAX +# ifdef LONG_LONG_MAX +# define LLONG_MAX LONG_LONG_MAX +# else +# ifdef _I64_MAX +# define LLONG_MAX _I64_MAX +# else + /* assuming 64bit(2's complement) long long */ +# define LLONG_MAX 9223372036854775807LL +# endif +# endif +# endif +# ifndef LLONG_MIN +# ifdef LONG_LONG_MIN +# define LLONG_MIN LONG_LONG_MIN +# else +# ifdef _I64_MIN +# define LLONG_MIN _I64_MIN +# else +# define LLONG_MIN (-LLONG_MAX-1) +# endif +# endif +# endif +#endif + +#define FIXNUM_MAX (LONG_MAX>>1) +#define FIXNUM_MIN RSHIFT((long)LONG_MIN,1) + +#define FIXNUM_FLAG 0x01 +#define INT2FIX(i) ((VALUE)(((long)(i))<<1 | FIXNUM_FLAG)) +#define LONG2FIX(i) INT2FIX(i) +#define rb_fix_new(v) INT2FIX(v) +VALUE rb_int2inum _((long)); +#define INT2NUM(v) rb_int2inum(v) +#define LONG2NUM(v) INT2NUM(v) +#define rb_int_new(v) rb_int2inum(v) +VALUE rb_uint2inum _((unsigned long)); +#define UINT2NUM(v) rb_uint2inum(v) +#define ULONG2NUM(v) UINT2NUM(v) +#define rb_uint_new(v) rb_uint2inum(v) + +#ifdef HAVE_LONG_LONG +VALUE rb_ll2inum _((LONG_LONG)); +#define LL2NUM(v) rb_ll2inum(v) +VALUE rb_ull2inum _((unsigned LONG_LONG)); +#define ULL2NUM(v) rb_ull2inum(v) +#endif + +#if SIZEOF_OFF_T > SIZEOF_LONG && defined(HAVE_LONG_LONG) +# define OFFT2NUM(v) LL2NUM(v) +#elif SIZEOF_OFF_T == SIZEOF_LONG +# define OFFT2NUM(v) LONG2NUM(v) +#else +# define OFFT2NUM(v) INT2NUM(v) +#endif + +#define FIX2LONG(x) RSHIFT((long)x,1) +#define FIX2ULONG(x) (((unsigned long)(x))>>1) +#define FIXNUM_P(f) (((long)(f))&FIXNUM_FLAG) +#define POSFIXABLE(f) ((f) < FIXNUM_MAX+1) +#define NEGFIXABLE(f) ((f) >= FIXNUM_MIN) +#define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f)) + +#define IMMEDIATE_MASK 0x03 +#define IMMEDIATE_P(x) ((VALUE)(x) & IMMEDIATE_MASK) + +#define SYMBOL_FLAG 0x0e +#define SYMBOL_P(x) (((VALUE)(x)&0xff)==SYMBOL_FLAG) +#define ID2SYM(x) ((VALUE)(((long)(x))<<8|SYMBOL_FLAG)) +#define SYM2ID(x) RSHIFT((unsigned long)x,8) + +/* special contants - i.e. non-zero and non-fixnum constants */ +#define Qfalse ((VALUE)0) +#define Qtrue ((VALUE)2) +#define Qnil ((VALUE)4) +#define Qundef ((VALUE)6) /* undefined value for placeholder */ + +#define RTEST(v) (((VALUE)(v) & ~Qnil) != 0) +#define NIL_P(v) ((VALUE)(v) == Qnil) + +#define CLASS_OF(v) rb_class_of((VALUE)(v)) + +#define T_NONE 0x00 + +#define T_NIL 0x01 +#define T_OBJECT 0x02 +#define T_CLASS 0x03 +#define T_ICLASS 0x04 +#define T_MODULE 0x05 +#define T_FLOAT 0x06 +#define T_STRING 0x07 +#define T_REGEXP 0x08 +#define T_ARRAY 0x09 +#define T_FIXNUM 0x0a +#define T_HASH 0x0b +#define T_STRUCT 0x0c +#define T_BIGNUM 0x0d +#define T_FILE 0x0e + +#define T_TRUE 0x20 +#define T_FALSE 0x21 +#define T_DATA 0x22 +#define T_MATCH 0x23 +#define T_SYMBOL 0x24 + +#define T_BLKTAG 0x3b +#define T_UNDEF 0x3c +#define T_VARMAP 0x3d +#define T_SCOPE 0x3e +#define T_NODE 0x3f + +#define T_MASK 0x3f + +#define BUILTIN_TYPE(x) (((struct RBasic*)(x))->flags & T_MASK) + +#define TYPE(x) rb_type((VALUE)(x)) + +void rb_check_type _((VALUE,int)); +#define Check_Type(v,t) rb_check_type((VALUE)(v),t) + +VALUE rb_str_to_str _((VALUE)); +VALUE rb_string_value _((volatile VALUE*)); +char *rb_string_value_ptr _((volatile VALUE*)); +char *rb_string_value_cstr _((volatile VALUE*)); + +#define StringValue(v) rb_string_value(&(v)) +#define StringValuePtr(v) rb_string_value_ptr(&(v)) +#define StringValueCStr(v) rb_string_value_cstr(&(v)) + +void rb_check_safe_obj _((VALUE)); +void rb_check_safe_str _((VALUE)); +#define SafeStringValue(v) do {\ + StringValue(v);\ + rb_check_safe_obj(v);\ +} while (0) +/* obsolete macro - use SafeStringValue(v) */ +#define Check_SafeStr(v) rb_check_safe_str((VALUE)(v)) + +void rb_secure _((int)); +RUBY_EXTERN int ruby_safe_level; +#define rb_safe_level() (ruby_safe_level) +void rb_set_safe_level _((int)); +void rb_secure_update _((VALUE)); + +long rb_num2long _((VALUE)); +unsigned long rb_num2ulong _((VALUE)); +#define NUM2LONG(x) (FIXNUM_P(x)?FIX2LONG(x):rb_num2long((VALUE)x)) +#define NUM2ULONG(x) rb_num2ulong((VALUE)x) +#if SIZEOF_INT < SIZEOF_LONG +long rb_num2int _((VALUE)); +#define NUM2INT(x) (FIXNUM_P(x)?FIX2INT(x):rb_num2int((VALUE)x)) +long rb_fix2int _((VALUE)); +#define FIX2INT(x) rb_fix2int((VALUE)x) +unsigned long rb_num2uint _((VALUE)); +#define NUM2UINT(x) rb_num2uint(x) +unsigned long rb_fix2uint _((VALUE)); +#define FIX2UINT(x) rb_fix2uint(x) +#else +#define NUM2INT(x) ((int)NUM2LONG(x)) +#define NUM2UINT(x) ((unsigned int)NUM2ULONG(x)) +#define FIX2INT(x) ((int)FIX2LONG(x)) +#define FIX2UINT(x) ((unsigned int)FIX2ULONG(x)) +#endif + +#ifdef HAVE_LONG_LONG +LONG_LONG rb_num2ll _((VALUE)); +unsigned LONG_LONG rb_num2ull _((VALUE)); +# define NUM2LL(x) (FIXNUM_P(x)?FIX2LONG(x):rb_num2ll((VALUE)x)) +# define NUM2ULL(x) rb_num2ull((VALUE)x) +#endif + +#if defined(HAVE_LONG_LONG) && SIZEOF_OFF_T > SIZEOF_LONG +# define NUM2OFFT(x) ((off_t)NUM2LL(x)) +#else +# define NUM2OFFT(x) NUM2LONG(x) +#endif + +double rb_num2dbl _((VALUE)); +#define NUM2DBL(x) rb_num2dbl((VALUE)(x)) + +/* obsolete API - use StringValue() */ +char *rb_str2cstr _((VALUE,long*)); +/* obsolete API - use StringValuePtr() */ +#define STR2CSTR(x) rb_str2cstr((VALUE)(x),0) + +#define NUM2CHR(x) (((TYPE(x) == T_STRING)&&(RSTRING(x)->len>=1))?\ + RSTRING(x)->ptr[0]:(char)(NUM2INT(x)&0xff)) +#define CHR2FIX(x) INT2FIX((long)((x)&0xff)) + +VALUE rb_newobj _((void)); +#define NEWOBJ(obj,type) type *obj = (type*)rb_newobj() +#define OBJSETUP(obj,c,t) do {\ + RBASIC(obj)->flags = (t);\ + RBASIC(obj)->klass = (c);\ + if (rb_safe_level() >= 3) FL_SET(obj, FL_TAINT);\ +} while (0) +#define CLONESETUP(clone,obj) do {\ + OBJSETUP(clone,rb_singleton_class_clone((VALUE)obj),RBASIC(obj)->flags);\ + rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);\ + if (FL_TEST(obj, FL_EXIVAR)) rb_copy_generic_ivar((VALUE)clone,(VALUE)obj);\ +} while (0) +#define DUPSETUP(dup,obj) do {\ + OBJSETUP(dup,rb_obj_class(obj),(RBASIC(obj)->flags)&(T_MASK|FL_EXIVAR|FL_TAINT));\ + if (FL_TEST(obj, FL_EXIVAR)) rb_copy_generic_ivar((VALUE)dup,(VALUE)obj);\ +} while (0) + +struct RBasic { + unsigned long flags; + VALUE klass; +}; + +struct RObject { + struct RBasic basic; + struct st_table *iv_tbl; +}; + +struct RClass { + struct RBasic basic; + struct st_table *iv_tbl; + struct st_table *m_tbl; + VALUE super; +}; + +struct RFloat { + struct RBasic basic; + double value; +}; + +#define ELTS_SHARED FL_USER2 + +struct RString { + struct RBasic basic; + long len; + char *ptr; + union { + long capa; + VALUE shared; + } aux; +}; +#define RSTRING_PTR(s) (RSTRING(s)->ptr) +#define RSTRING_LEN(s) (RSTRING(s)->len) + +struct RArray { + struct RBasic basic; + long len; + union { + long capa; + VALUE shared; + } aux; + VALUE *ptr; +}; +#define RARRAY_PTR(s) (RARRAY(s)->ptr) +#define RARRAY_LEN(s) (RARRAY(s)->len) + +struct RRegexp { + struct RBasic basic; + struct re_pattern_buffer *ptr; + long len; + char *str; +}; + +struct RHash { + struct RBasic basic; + struct st_table *tbl; + int iter_lev; + VALUE ifnone; +}; + +struct RFile { + struct RBasic basic; + struct OpenFile *fptr; +}; + +struct RData { + struct RBasic basic; + void (*dmark) _((void*)); + void (*dfree) _((void*)); + void *data; +}; + +#define DATA_PTR(dta) (RDATA(dta)->data) + +/* +#define RUBY_DATA_FUNC(func) ((void (*)_((void*)))func) +*/ +typedef void (*RUBY_DATA_FUNC) _((void*)); + +VALUE rb_data_object_alloc _((VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC)); + +#define Data_Wrap_Struct(klass,mark,free,sval)\ + rb_data_object_alloc(klass,sval,(RUBY_DATA_FUNC)mark,(RUBY_DATA_FUNC)free) + +#define Data_Make_Struct(klass,type,mark,free,sval) (\ + sval = ALLOC(type),\ + memset(sval, 0, sizeof(type)),\ + Data_Wrap_Struct(klass,mark,free,sval)\ +) + +#define Data_Get_Struct(obj,type,sval) do {\ + Check_Type(obj, T_DATA); \ + sval = (type*)DATA_PTR(obj);\ +} while (0) + +struct RStruct { + struct RBasic basic; + long len; + VALUE *ptr; +}; +#define RSTRUCT_LEN(st) (RSTRUCT(st)->len) +#define RSTRUCT_PTR(st) (RSTRUCT(st)->ptr) + +struct RBignum { + struct RBasic basic; + char sign; + long len; + void *digits; +}; + +#define R_CAST(st) (struct st*) +#define RBASIC(obj) (R_CAST(RBasic)(obj)) +#define ROBJECT(obj) (R_CAST(RObject)(obj)) +#define RCLASS(obj) (R_CAST(RClass)(obj)) +#define RMODULE(obj) RCLASS(obj) +#define RFLOAT(obj) (R_CAST(RFloat)(obj)) +#define RSTRING(obj) (R_CAST(RString)(obj)) +#define RREGEXP(obj) (R_CAST(RRegexp)(obj)) +#define RARRAY(obj) (R_CAST(RArray)(obj)) +#define RHASH(obj) (R_CAST(RHash)(obj)) +#define RDATA(obj) (R_CAST(RData)(obj)) +#define RSTRUCT(obj) (R_CAST(RStruct)(obj)) +#define RBIGNUM(obj) (R_CAST(RBignum)(obj)) +#define RFILE(obj) (R_CAST(RFile)(obj)) + +#define FL_SINGLETON FL_USER0 +#define FL_MARK (1<<6) +#define FL_FINALIZE (1<<7) +#define FL_TAINT (1<<8) +#define FL_EXIVAR (1<<9) +#define FL_FREEZE (1<<10) + +#define FL_USHIFT 11 + +#define FL_USER0 (1<<(FL_USHIFT+0)) +#define FL_USER1 (1<<(FL_USHIFT+1)) +#define FL_USER2 (1<<(FL_USHIFT+2)) +#define FL_USER3 (1<<(FL_USHIFT+3)) +#define FL_USER4 (1<<(FL_USHIFT+4)) +#define FL_USER5 (1<<(FL_USHIFT+5)) +#define FL_USER6 (1<<(FL_USHIFT+6)) +#define FL_USER7 (1<<(FL_USHIFT+7)) + +#define FL_UMASK (0xff<<FL_USHIFT) + +#define SPECIAL_CONST_P(x) (IMMEDIATE_P(x) || !RTEST(x)) + +#define FL_ABLE(x) (!SPECIAL_CONST_P(x)) +#define FL_TEST(x,f) (FL_ABLE(x)?(RBASIC(x)->flags&(f)):0) +#define FL_SET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags |= (f);} while (0) +#define FL_UNSET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags &= ~(f);} while (0) +#define FL_REVERSE(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags ^= (f);} while (0) + +#define OBJ_TAINTED(x) FL_TEST((x), FL_TAINT) +#define OBJ_TAINT(x) FL_SET((x), FL_TAINT) +#define OBJ_INFECT(x,s) do {if (FL_ABLE(x) && FL_ABLE(s)) RBASIC(x)->flags |= RBASIC(s)->flags & FL_TAINT;} while (0) + +#define OBJ_FROZEN(x) FL_TEST((x), FL_FREEZE) +#define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE) + +#define ALLOC_N(type,n) (type*)xmalloc(sizeof(type)*(n)) +#define ALLOC(type) (type*)xmalloc(sizeof(type)) +#define REALLOC_N(var,type,n) (var)=(type*)xrealloc((char*)(var),sizeof(type)*(n)) + +#define ALLOCA_N(type,n) (type*)alloca(sizeof(type)*(n)) + +#define MEMZERO(p,type,n) memset((p), 0, sizeof(type)*(n)) +#define MEMCPY(p1,p2,type,n) memcpy((p1), (p2), sizeof(type)*(n)) +#define MEMMOVE(p1,p2,type,n) memmove((p1), (p2), sizeof(type)*(n)) +#define MEMCMP(p1,p2,type,n) memcmp((p1), (p2), sizeof(type)*(n)) + +void rb_obj_infect _((VALUE,VALUE)); + +typedef int ruby_glob_func(const char*,VALUE); +void rb_glob _((const char*,void(*)(const char*,VALUE),VALUE)); +void rb_globi _((const char*,void(*)(const char*,VALUE),VALUE)); +int ruby_brace_expand _((const char*,int,ruby_glob_func*,VALUE)); +int ruby_brace_glob _((const char*,int,ruby_glob_func*,VALUE)); + +VALUE rb_define_class _((const char*,VALUE)); +VALUE rb_define_module _((const char*)); +VALUE rb_define_class_under _((VALUE, const char*, VALUE)); +VALUE rb_define_module_under _((VALUE, const char*)); + +void rb_include_module _((VALUE,VALUE)); +void rb_extend_object _((VALUE,VALUE)); + +void rb_define_variable _((const char*,VALUE*)); +void rb_define_virtual_variable _((const char*,VALUE(*)(ANYARGS),void(*)(ANYARGS))); +void rb_define_hooked_variable _((const char*,VALUE*,VALUE(*)(ANYARGS),void(*)(ANYARGS))); +int ruby_glob _((const char*,int,int(*)(const char*,VALUE),VALUE)); +int ruby_globi _((const char*,int,int(*)(const char*,VALUE),VALUE)); +void rb_define_readonly_variable _((const char*,VALUE*)); +void rb_define_const _((VALUE,const char*,VALUE)); +void rb_define_global_const _((const char*,VALUE)); + +#define RUBY_METHOD_FUNC(func) ((VALUE (*)(ANYARGS))func) +void rb_define_method _((VALUE,const char*,VALUE(*)(ANYARGS),int)); +void rb_define_module_function _((VALUE,const char*,VALUE(*)(ANYARGS),int)); +void rb_define_global_function _((const char*,VALUE(*)(ANYARGS),int)); + +void rb_undef_method _((VALUE,const char*)); +void rb_define_alias _((VALUE,const char*,const char*)); +void rb_define_attr _((VALUE,const char*,int,int)); + +void rb_global_variable _((VALUE*)); +void rb_gc_register_address _((VALUE*)); +void rb_gc_unregister_address _((VALUE*)); + +ID rb_intern _((const char*)); +char *rb_id2name _((ID)); +ID rb_to_id _((VALUE)); + +char *rb_class2name _((VALUE)); +char *rb_obj_classname _((VALUE)); + +void rb_p _((VALUE)); + +VALUE rb_eval_string _((const char*)); +VALUE rb_eval_string_protect _((const char*, int*)); +VALUE rb_eval_string_wrap _((const char*, int*)); +VALUE rb_funcall __((VALUE, ID, int, ...)); +VALUE rb_funcall2 _((VALUE, ID, int, const VALUE*)); +VALUE rb_funcall3 _((VALUE, ID, int, const VALUE*)); +int rb_scan_args __((int, const VALUE*, const char*, ...)); +VALUE rb_call_super _((int, const VALUE*)); + +VALUE rb_gv_set _((const char*, VALUE)); +VALUE rb_gv_get _((const char*)); +VALUE rb_iv_get _((VALUE, const char*)); +VALUE rb_iv_set _((VALUE, const char*, VALUE)); + +VALUE rb_equal _((VALUE,VALUE)); + +RUBY_EXTERN VALUE ruby_verbose, ruby_debug; + +NORETURN(void rb_raise __((VALUE, const char*, ...))); +NORETURN(void rb_fatal __((const char*, ...))); +NORETURN(void rb_bug __((const char*, ...))); +NORETURN(void rb_sys_fail _((const char*))); +NORETURN(void rb_iter_break _((void))); +NORETURN(void rb_exit _((int))); +NORETURN(void rb_notimplement _((void))); + +void rb_warning __((const char*, ...)); /* reports if `-w' specified */ +void rb_sys_warning __((const char*, ...)); /* reports if `-w' specified */ +void rb_warn __((const char*, ...)); /* reports always */ + +VALUE rb_each _((VALUE)); +VALUE rb_yield _((VALUE)); +VALUE rb_yield_values __((int n, ...)); +VALUE rb_yield_splat _((VALUE)); +int rb_block_given_p _((void)); +void rb_need_block _((void)); +VALUE rb_iterate _((VALUE(*)(VALUE),VALUE,VALUE(*)(ANYARGS),VALUE)); +VALUE rb_rescue _((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE)); +VALUE rb_rescue2 __((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE,...)); +VALUE rb_ensure _((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE)); +VALUE rb_catch _((const char*,VALUE(*)(ANYARGS),VALUE)); +NORETURN(void rb_throw _((const char*,VALUE))); + +VALUE rb_require _((const char*)); + +#ifdef __ia64 +void ruby_init_stack(VALUE*, void*); +#define RUBY_INIT_STACK \ + VALUE variable_in_this_stack_frame; \ + ruby_init_stack(&variable_in_this_stack_frame, rb_ia64_bsp()); +#else +void ruby_init_stack(VALUE*); +#define RUBY_INIT_STACK \ + VALUE variable_in_this_stack_frame; \ + ruby_init_stack(&variable_in_this_stack_frame); +#endif +void ruby_init _((void)); +void ruby_options _((int, char**)); +NORETURN(void ruby_run _((void))); + +RUBY_EXTERN VALUE rb_mKernel; +RUBY_EXTERN VALUE rb_mComparable; +RUBY_EXTERN VALUE rb_mEnumerable; +RUBY_EXTERN VALUE rb_mPrecision; +RUBY_EXTERN VALUE rb_mErrno; +RUBY_EXTERN VALUE rb_mFileTest; +RUBY_EXTERN VALUE rb_mGC; +RUBY_EXTERN VALUE rb_mMath; +RUBY_EXTERN VALUE rb_mProcess; + +RUBY_EXTERN VALUE rb_cObject; +RUBY_EXTERN VALUE rb_cArray; +RUBY_EXTERN VALUE rb_cBignum; +RUBY_EXTERN VALUE rb_cBinding; +RUBY_EXTERN VALUE rb_cClass; +RUBY_EXTERN VALUE rb_cCont; +RUBY_EXTERN VALUE rb_cDir; +RUBY_EXTERN VALUE rb_cData; +RUBY_EXTERN VALUE rb_cFalseClass; +RUBY_EXTERN VALUE rb_cFile; +RUBY_EXTERN VALUE rb_cFixnum; +RUBY_EXTERN VALUE rb_cFloat; +RUBY_EXTERN VALUE rb_cHash; +RUBY_EXTERN VALUE rb_cInteger; +RUBY_EXTERN VALUE rb_cIO; +RUBY_EXTERN VALUE rb_cMatch; +RUBY_EXTERN VALUE rb_cMethod; +RUBY_EXTERN VALUE rb_cModule; +RUBY_EXTERN VALUE rb_cNameErrorMesg; +RUBY_EXTERN VALUE rb_cNilClass; +RUBY_EXTERN VALUE rb_cNumeric; +RUBY_EXTERN VALUE rb_cProc; +RUBY_EXTERN VALUE rb_cRange; +RUBY_EXTERN VALUE rb_cRegexp; +RUBY_EXTERN VALUE rb_cStat; +RUBY_EXTERN VALUE rb_cString; +RUBY_EXTERN VALUE rb_cStruct; +RUBY_EXTERN VALUE rb_cSymbol; +RUBY_EXTERN VALUE rb_cThread; +RUBY_EXTERN VALUE rb_cTime; +RUBY_EXTERN VALUE rb_cTrueClass; +RUBY_EXTERN VALUE rb_cUnboundMethod; + +RUBY_EXTERN VALUE rb_eException; +RUBY_EXTERN VALUE rb_eStandardError; +RUBY_EXTERN VALUE rb_eSystemExit; +RUBY_EXTERN VALUE rb_eInterrupt; +RUBY_EXTERN VALUE rb_eSignal; +RUBY_EXTERN VALUE rb_eFatal; +RUBY_EXTERN VALUE rb_eArgError; +RUBY_EXTERN VALUE rb_eEOFError; +RUBY_EXTERN VALUE rb_eIndexError; +RUBY_EXTERN VALUE rb_eRangeError; +RUBY_EXTERN VALUE rb_eIOError; +RUBY_EXTERN VALUE rb_eRuntimeError; +RUBY_EXTERN VALUE rb_eSecurityError; +RUBY_EXTERN VALUE rb_eSystemCallError; +RUBY_EXTERN VALUE rb_eThreadError; +RUBY_EXTERN VALUE rb_eTypeError; +RUBY_EXTERN VALUE rb_eZeroDivError; +RUBY_EXTERN VALUE rb_eNotImpError; +RUBY_EXTERN VALUE rb_eNoMemError; +RUBY_EXTERN VALUE rb_eNoMethodError; +RUBY_EXTERN VALUE rb_eFloatDomainError; +RUBY_EXTERN VALUE rb_eLocalJumpError; +RUBY_EXTERN VALUE rb_eSysStackError; +RUBY_EXTERN VALUE rb_eRegexpError; + +RUBY_EXTERN VALUE rb_eScriptError; +RUBY_EXTERN VALUE rb_eNameError; +RUBY_EXTERN VALUE rb_eSyntaxError; +RUBY_EXTERN VALUE rb_eLoadError; + +RUBY_EXTERN VALUE rb_stdin, rb_stdout, rb_stderr; +RUBY_EXTERN VALUE ruby_errinfo; + +static inline VALUE +#if defined(HAVE_PROTOTYPES) +rb_class_of(VALUE obj) +#else +rb_class_of(obj) + VALUE obj; +#endif +{ + if (FIXNUM_P(obj)) return rb_cFixnum; + if (obj == Qnil) return rb_cNilClass; + if (obj == Qfalse) return rb_cFalseClass; + if (obj == Qtrue) return rb_cTrueClass; + if (SYMBOL_P(obj)) return rb_cSymbol; + + return RBASIC(obj)->klass; +} + +static inline int +#if defined(HAVE_PROTOTYPES) +rb_type(VALUE obj) +#else +rb_type(obj) + VALUE obj; +#endif +{ + if (FIXNUM_P(obj)) return T_FIXNUM; + if (obj == Qnil) return T_NIL; + if (obj == Qfalse) return T_FALSE; + if (obj == Qtrue) return T_TRUE; + if (obj == Qundef) return T_UNDEF; + if (SYMBOL_P(obj)) return T_SYMBOL; + return BUILTIN_TYPE(obj); +} + +static inline int +#if defined(HAVE_PROTOTYPES) +rb_special_const_p(VALUE obj) +#else +rb_special_const_p(obj) + VALUE obj; +#endif +{ + if (SPECIAL_CONST_P(obj)) return Qtrue; + return Qfalse; +} + +#include "missing.h" +#include "intern.h" + +#if defined(EXTLIB) && defined(USE_DLN_A_OUT) +/* hook for external modules */ +static char *dln_libs_to_be_linked[] = { EXTLIB, 0 }; +#endif + +#if defined(HAVE_LIBPTHREAD) +#ifdef HAVE_PTHREAD_H +#include <pthread.h> +#endif +typedef pthread_t rb_nativethread_t; +# define NATIVETHREAD_CURRENT() pthread_self() +# define NATIVETHREAD_EQUAL(t1,t2) pthread_equal((t1),(t2)) +# define HAVE_NATIVETHREAD + +# define NATIVETHREAD_KILL(th,sig) pthread_kill((th),(sig)) +# define HAVE_NATIVETHREAD_KILL +#elif defined(_WIN32) || defined(_WIN32_WCE) +typedef DWORD rb_nativethread_t; +# define NATIVETHREAD_CURRENT() GetCurrentThreadId() +# define NATIVETHREAD_EQUAL(t1,t2) ((t1) == (t2)) +# define HAVE_NATIVETHREAD +#endif +#ifdef HAVE_NATIVETHREAD +int is_ruby_native_thread _((void)); +#else +#define is_ruby_native_thread() (1) +#endif +#ifdef HAVE_NATIVETHREAD_KILL +void ruby_native_thread_kill _((int)); +#endif + +#if defined(__cplusplus) +#if 0 +{ /* satisfy cc-mode */ +#endif +} /* extern "C" { */ +#endif + +#endif /* ifndef RUBY_H */ +/********************************************************************** + + rubyio.h - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Fri Nov 12 16:47:09 JST 1993 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#ifndef RUBYIO_H +#define RUBYIO_H + +#include <stdio.h> +#include <errno.h> + +#if defined(HAVE_STDIO_EXT_H) +#include <stdio_ext.h> +#endif + +typedef struct OpenFile { + FILE *f; /* stdio ptr for read/write */ + FILE *f2; /* additional ptr for rw pipes */ + int mode; /* mode flags */ + int pid; /* child's pid (for pipes) */ + int lineno; /* number of lines read */ + char *path; /* pathname for file */ + void (*finalize) _((struct OpenFile*,int)); /* finalize proc */ +} OpenFile; + +#define FMODE_READABLE 1 +#define FMODE_WRITABLE 2 +#define FMODE_READWRITE 3 +#define FMODE_APPEND 64 +#define FMODE_CREATE 128 +#define FMODE_BINMODE 4 +#define FMODE_SYNC 8 +#define FMODE_WBUF 16 +#define FMODE_RBUF 32 +#define FMODE_WSPLIT 0x200 +#define FMODE_WSPLIT_INITIALIZED 0x400 + +#define GetOpenFile(obj,fp) rb_io_check_closed((fp) = RFILE(rb_io_taint_check(obj))->fptr) + +#define MakeOpenFile(obj, fp) do {\ + if (RFILE(obj)->fptr) {\ + rb_io_close(obj);\ + free(RFILE(obj)->fptr);\ + RFILE(obj)->fptr = 0;\ + }\ + fp = 0;\ + fp = RFILE(obj)->fptr = ALLOC(OpenFile);\ + fp->f = fp->f2 = NULL;\ + fp->mode = 0;\ + fp->pid = 0;\ + fp->lineno = 0;\ + fp->path = NULL;\ + fp->finalize = 0;\ +} while (0) + +#define GetReadFile(fptr) ((fptr)->f) +#define GetWriteFile(fptr) (((fptr)->f2) ? (fptr)->f2 : (fptr)->f) + +FILE *rb_fopen _((const char*, const char*)); +FILE *rb_fdopen _((int, const char*)); +int rb_getc _((FILE*)); +long rb_io_fread _((char *, long, FILE *)); +long rb_io_fwrite _((const char *, long, FILE *)); +int rb_io_mode_flags _((const char*)); +int rb_io_modenum_flags _((int)); +void rb_io_check_writable _((OpenFile*)); +void rb_io_check_readable _((OpenFile*)); +void rb_io_fptr_finalize _((OpenFile*)); +void rb_io_synchronized _((OpenFile*)); +void rb_io_check_initialized _((OpenFile*)); +void rb_io_check_closed _((OpenFile*)); +int rb_io_wait_readable _((int)); +int rb_io_wait_writable _((int)); +void rb_io_set_nonblock(OpenFile *fptr); + +VALUE rb_io_taint_check _((VALUE)); +NORETURN(void rb_eof_error _((void))); + +void rb_read_check _((FILE*)); +int rb_read_pending _((FILE*)); +#endif +/********************************************************************** + + rubysig.h - + + $Author: shyouhei $ + $Date: 2009-01-05 03:13:40 +0100 (Mon, 05 Jan 2009) $ + created at: Wed Aug 16 01:15:38 JST 1995 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#ifndef SIG_H +#define SIG_H +#include <errno.h> + +#ifdef _WIN32 +typedef LONG rb_atomic_t; + +# define ATOMIC_TEST(var) InterlockedExchange(&(var), 0) +# define ATOMIC_SET(var, val) InterlockedExchange(&(var), (val)) +# define ATOMIC_INC(var) InterlockedIncrement(&(var)) +# define ATOMIC_DEC(var) InterlockedDecrement(&(var)) + +/* Windows doesn't allow interrupt while system calls */ +# define TRAP_BEG do {\ + int saved_errno = 0;\ + rb_atomic_t trap_immediate = ATOMIC_SET(rb_trap_immediate, 1) +# define TRAP_END\ + ATOMIC_SET(rb_trap_immediate, trap_immediate);\ + saved_errno = errno;\ + CHECK_INTS;\ + errno = saved_errno;\ +} while (0) +# define RUBY_CRITICAL(statements) do {\ + rb_w32_enter_critical();\ + statements;\ + rb_w32_leave_critical();\ +} while (0) +#else +typedef int rb_atomic_t; + +# define ATOMIC_TEST(var) ((var) ? ((var) = 0, 1) : 0) +# define ATOMIC_SET(var, val) ((var) = (val)) +# define ATOMIC_INC(var) (++(var)) +# define ATOMIC_DEC(var) (--(var)) + +# define TRAP_BEG do {\ + int saved_errno = 0;\ + int trap_immediate = rb_trap_immediate;\ + rb_trap_immediate = 1 +# define TRAP_END rb_trap_immediate = trap_immediate;\ + saved_errno = errno;\ + CHECK_INTS;\ + errno = saved_errno;\ +} while (0) + +# define RUBY_CRITICAL(statements) do {\ + int trap_immediate = rb_trap_immediate;\ + rb_trap_immediate = 0;\ + statements;\ + rb_trap_immediate = trap_immediate;\ +} while (0) +#endif +RUBY_EXTERN rb_atomic_t rb_trap_immediate; + +RUBY_EXTERN int rb_prohibit_interrupt; +#define DEFER_INTS (rb_prohibit_interrupt++) +#define ALLOW_INTS do {\ + rb_prohibit_interrupt--;\ + CHECK_INTS;\ +} while (0) +#define ENABLE_INTS (rb_prohibit_interrupt--) + +VALUE rb_with_disable_interrupt _((VALUE(*)(ANYARGS),VALUE)); + +RUBY_EXTERN rb_atomic_t rb_trap_pending; +void rb_trap_restore_mask _((void)); + +RUBY_EXTERN int rb_thread_critical; +RUBY_EXTERN int rb_thread_pending; +void rb_thread_schedule _((void)); +#if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE) +# define CHECK_INTS do {\ + if (!(rb_prohibit_interrupt || rb_thread_critical)) {\ + if (rb_thread_pending) rb_thread_schedule();\ + if (rb_trap_pending) rb_trap_exec();\ + }\ +} while (0) +#else +/* pseudo preemptive thread switching */ +RUBY_EXTERN int rb_thread_tick; +#define THREAD_TICK 500 +#define CHECK_INTS do {\ + if (!(rb_prohibit_interrupt || rb_thread_critical)) {\ + if (rb_thread_pending || rb_thread_tick-- <= 0) {\ + rb_thread_tick = THREAD_TICK;\ + rb_thread_schedule();\ + }\ + }\ + if (rb_trap_pending) rb_trap_exec();\ +} while (0) +#endif + +#endif +/* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */ + +/* @(#) st.h 5.1 89/12/14 */ + +#ifndef ST_INCLUDED + +#define ST_INCLUDED + +#if SIZEOF_LONG == SIZEOF_VOIDP +typedef unsigned long st_data_t; +#elif SIZEOF_LONG_LONG == SIZEOF_VOIDP +typedef unsigned LONG_LONG st_data_t; +#else +# error ---->> st.c requires sizeof(void*) == sizeof(long) to be compiled. <<--- +- +#endif +#define ST_DATA_T_DEFINED + +typedef struct st_table st_table; + +struct st_hash_type { + int (*compare)(); + int (*hash)(); +}; + +struct st_table { + struct st_hash_type *type; + int num_bins; + int num_entries; + struct st_table_entry **bins; +}; + +#define st_is_member(table,key) st_lookup(table,key,(st_data_t *)0) + +enum st_retval {ST_CONTINUE, ST_STOP, ST_DELETE, ST_CHECK}; + +#ifndef _ +# define _(args) args +#endif +#ifndef ANYARGS +# ifdef __cplusplus +# define ANYARGS ... +# else +# define ANYARGS +# endif +#endif + +st_table *st_init_table _((struct st_hash_type *)); +st_table *st_init_table_with_size _((struct st_hash_type *, int)); +st_table *st_init_numtable _((void)); +st_table *st_init_numtable_with_size _((int)); +st_table *st_init_strtable _((void)); +st_table *st_init_strtable_with_size _((int)); +int st_delete _((st_table *, st_data_t *, st_data_t *)); +int st_delete_safe _((st_table *, st_data_t *, st_data_t *, st_data_t)); +int st_insert _((st_table *, st_data_t, st_data_t)); +int st_lookup _((st_table *, st_data_t, st_data_t *)); +int st_foreach _((st_table *, int (*)(ANYARGS), st_data_t)); +void st_add_direct _((st_table *, st_data_t, st_data_t)); +void st_free_table _((st_table *)); +void st_cleanup_safe _((st_table *, st_data_t)); +st_table *st_copy _((st_table *)); + +#define ST_NUMCMP ((int (*)()) 0) +#define ST_NUMHASH ((int (*)()) -2) + +#define st_numcmp ST_NUMCMP +#define st_numhash ST_NUMHASH + +int st_strhash(); + +#endif /* ST_INCLUDED */ +/********************************************************************** + + util.h - + + $Author: shyouhei $ + $Date: 2007-02-13 00:01:19 +0100 (Tue, 13 Feb 2007) $ + created at: Thu Mar 9 11:55:53 JST 1995 + + Copyright (C) 1993-2003 Yukihiro Matsumoto + +**********************************************************************/ + +#ifndef UTIL_H +#define UTIL_H + +#ifndef _ +#ifdef __cplusplus +# ifndef HAVE_PROTOTYPES +# define HAVE_PROTOTYPES 1 +# endif +# ifndef HAVE_STDARG_PROTOTYPES +# define HAVE_STDARG_PROTOTYPES 1 +# endif +#endif +#ifdef HAVE_PROTOTYPES +# define _(args) args +#else +# define _(args) () +#endif +#ifdef HAVE_STDARG_PROTOTYPES +# define __(args) args +#else +# define __(args) () +#endif +#endif + +#define scan_oct ruby_scan_oct +unsigned long scan_oct _((const char*, int, int*)); +#define scan_hex ruby_scan_hex +unsigned long scan_hex _((const char*, int, int*)); + +#if defined(MSDOS) || defined(__CYGWIN32__) || defined(_WIN32) +void ruby_add_suffix(); +#endif + +void ruby_qsort _((void*, const int, const int, int (*)(), void*)); +#define qsort(b,n,s,c,d) ruby_qsort(b,n,s,c,d) + +void ruby_setenv _((const char*, const char*)); +void ruby_unsetenv _((const char*)); +#undef setenv +#undef unsetenv +#define setenv(name,val) ruby_setenv(name,val) +#define unsetenv(name,val) ruby_unsetenv(name); + +char *ruby_strdup _((const char*)); +#undef strdup +#define strdup(s) ruby_strdup(s) + +char *ruby_getcwd _((void)); +#define my_getcwd() ruby_getcwd() + +double ruby_strtod _((const char*, char **)); +#undef strtod +#define strtod(s,e) ruby_strtod(s,e) + +#endif /* UTIL_H */ +#define RUBY_VERSION "1.8.6" +#define RUBY_RELEASE_DATE "2009-09-09" +#define RUBY_VERSION_CODE 186 +#define RUBY_RELEASE_CODE 20090909 +#define RUBY_PATCHLEVEL 388 + +#define RUBY_VERSION_MAJOR 1 +#define RUBY_VERSION_MINOR 8 +#define RUBY_VERSION_TEENY 6 +#define RUBY_RELEASE_YEAR 2009 +#define RUBY_RELEASE_MONTH 9 +#define RUBY_RELEASE_DAY 9 + +#ifdef RUBY_EXTERN +RUBY_EXTERN const char ruby_version[]; +RUBY_EXTERN const char ruby_release_date[]; +RUBY_EXTERN const char ruby_platform[]; +RUBY_EXTERN const int ruby_patchlevel; +#endif + diff --git a/test/scanners/c/strange.expected.raydebug b/test/scanners/c/strange.expected.raydebug index 8979a50..27d0fa3 100644 --- a/test/scanners/c/strange.expected.raydebug +++ b/test/scanners/c/strange.expected.raydebug @@ -29,7 +29,7 @@ integer(67)operator(,)integer(9)operator(,)integer(59)operator(,)integer(1)opera integer(28)operator(,)integer(90)operator(,)integer(29)operator(,) integer(71)operator(,)integer(4)operator(,)integer(55)operator(,)integer(9)operator(,)integer(84)operator(,)integer(28)operator(,)integer(82)operator(,)integer(29)operator(,)integer(101)operator(,)integer(5)operator(,) integer(103)operator(,)integer(9)operator(,) integer(98)operator(,)integer(35)operator(,) integer(97)operator(,)integer(1)operator(,)integer(94)operator(,)integer(35)operator(,)integer(93)operator(,)integer(1)operator(,)integer(100)operator(,)integer(35)operator(,)integer(92)operator(,)integer(31)operator(,)integer(99)operator(,)integer(5)operator(,)integer(96)operator(,)integer(39)operator(,)integer(95)operator(,)integer(5)operator(,)integer(102)operator(,)integer(35)operator(};) -pre_type(void) ident(run)operator(()pre_type(int) ident(gun)operator(=)integer(0)operator(\)) operator({) comment(// [gun]=[:GUN1,:GUN2]) +directive(void) ident(run)operator(()pre_type(int) ident(gun)operator(=)integer(0)operator(\)) operator({) comment(// [gun]=[:GUN1,:GUN2]) ident(printf)operator(()string<delimiter(")content(run(\) %i)char(\\n)delimiter(")>operator(,) ident(gun)operator(\);) reserved(switch)operator(()ident(gun)operator(\)) operator({) reserved(case) ident(GUN1) ident(when)operator(()integer(2)operator(\)) |